Fix bug #7464 with mouse highlight after "C-x 1".
authorEli Zaretskii <eliz@gnu.org>
Sat, 31 Mar 2012 18:10:34 +0000 (21:10 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 31 Mar 2012 18:10:34 +0000 (21:10 +0300)
 src/window.c (Fdelete_other_windows_internal): Invalidate the row
 and column information about mouse highlight, so that redisplay
 restores it after reallocating the glyph matrices.

src/ChangeLog
src/window.c

index 68f311d..33c93a3 100644 (file)
@@ -1,5 +1,9 @@
 2012-03-31  Eli Zaretskii  <eliz@gnu.org>
 
+       * window.c (Fdelete_other_windows_internal): Invalidate the row
+       and column information about mouse highlight, so that redisplay
+       restores it after reallocating the glyph matrices.  (Bug#7464)
+
        * xdisp.c (set_cursor_from_row): If `cursor' property on a display
        string comes from a `display' text property, use the buffer
        position of that property as if we actually saw that position in
index bcbf0ad..af7968f 100644 (file)
@@ -2565,6 +2565,7 @@ window-start value is reasonable when this function is called.  */)
   Lisp_Object sibling, pwindow, swindow IF_LINT (= Qnil), delta;
   EMACS_INT startpos IF_LINT (= 0);
   int top IF_LINT (= 0), new_top, resize_failed;
+  Mouse_HLInfo *hlinfo;
 
   w = decode_any_window (window);
   XSETWINDOW (window, w);
@@ -2645,6 +2646,20 @@ window-start value is reasonable when this function is called.  */)
     }
 
   BLOCK_INPUT;
+  hlinfo = MOUSE_HL_INFO (f);
+  /* We are going to free the glyph matrices of WINDOW, and with that
+     we might lose any information about glyph rows that have some of
+     their glyphs highlighted in mouse face.  (These rows are marked
+     with a non-zero mouse_face_p flag.)  If WINDOW indeed has some
+     glyphs highlighted in mouse face, signal to frame's up-to-date
+     hook that mouse highlight was overwritten, so that it will
+     arrange for redisplaying the highlight.  */
+  if (EQ (hlinfo->mouse_face_window, window))
+    {
+      hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
+      hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
+      hlinfo->mouse_face_window = Qnil;
+    }
   free_window_matrices (r);
 
   windows_or_buffers_changed++;