]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix cursor position in Dired buffers after dired-sort-toggle
authorEli Zaretskii <eliz@gnu.org>
Fri, 2 Jun 2017 09:53:57 +0000 (12:53 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 2 Jun 2017 09:53:57 +0000 (12:53 +0300)
* src/xdisp.c (display_and_set_cursor): Record cursor coordinates
even if the frame is marked as garbaged.  (Bug#27187)

src/xdisp.c

index 53210e5be5b2b1c6a2fe705c1da163a4b8e09140..17a1cae00482d8f0ebf80ff4f69130918b187add 100644 (file)
@@ -28793,7 +28793,6 @@ display_and_set_cursor (struct window *w, bool on,
      be in the midst of changing its size, and x and y may be off the
      window.  */
   if (! FRAME_VISIBLE_P (f)
-      || FRAME_GARBAGED_P (f)
       || vpos >= w->current_matrix->nrows
       || hpos >= w->current_matrix->matrix_w)
     return;
@@ -28811,6 +28810,26 @@ display_and_set_cursor (struct window *w, bool on,
       return;
     }
 
+  /* A frame might be marked garbaged even though its cursor position
+     is correct, and will not change upon subsequent redisplay.  This
+     happens in some rare situations, like toggling the sort order in
+     Dired windows.  We've already established that VPOS is valid, so
+     it shouldn't do any harm to record the cursor position, as we are
+     going to return without acting on it anyway.  Otherwise, expose
+     events might come in and call update_window_cursor, which will
+     blindly use outdated values in w->phys_cursor.  */
+  if (FRAME_GARBAGED_P (f))
+    {
+      if (on)
+       {
+         w->phys_cursor.x = x;
+         w->phys_cursor.y = glyph_row->y;
+         w->phys_cursor.hpos = hpos;
+         w->phys_cursor.vpos = vpos;
+       }
+      return;
+    }
+
   glyph = NULL;
   if (0 <= hpos && hpos < glyph_row->used[TEXT_AREA])
     glyph = glyph_row->glyphs[TEXT_AREA] + hpos;