changeset 63115:9698305b2fc0

* xdisp.c (note_mode_line_or_margin_highlight): Check the overlapping of re-rendering area to avoid flickering. (note_mouse_highlight): Call clear_mouse_face if PART is not ON_MODE_LINE nor ON_HEADER_LINE.
author Masatake YAMATO <jet@gyve.org>
date Tue, 07 Jun 2005 14:32:23 +0000
parents 6ef9e44e50d7
children 5f15b57e99a6
files src/ChangeLog src/xdisp.c
diffstat 2 files changed, 31 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Jun 07 13:19:25 2005 +0000
+++ b/src/ChangeLog	Tue Jun 07 14:32:23 2005 +0000
@@ -1,3 +1,10 @@
+2005-06-07  Masatake YAMATO  <jet@gyve.org>
+
+	* xdisp.c (note_mode_line_or_margin_highlight): Check
+	the overlapping of re-rendering area to avoid flickering.
+	(note_mouse_highlight): Call clear_mouse_face if PART 
+	is not ON_MODE_LINE nor ON_HEADER_LINE.
+
 2005-06-07  Kim F. Storm  <storm@cua.dk>
 
 	* process.c: Improve commentary for adaptive read buffering.
--- a/src/xdisp.c	Tue Jun 07 13:19:25 2005 +0000
+++ b/src/xdisp.c	Tue Jun 07 14:32:23 2005 +0000
@@ -21491,10 +21491,8 @@
 	  int total_pixel_width;
 	  int ignore;
 
-
-	  if (clear_mouse_face (dpyinfo))
-	    cursor = No_Cursor;
-
+	  int vpos, hpos;
+	  
 	  b = Fprevious_single_property_change (make_number (charpos + 1),
 						Qmouse_face, string, Qnil);
 	  if (NILP (b))
@@ -21537,15 +21535,30 @@
 	  for (tmp_glyph = glyph - gpos; tmp_glyph != glyph; tmp_glyph++)
 	    total_pixel_width += tmp_glyph->pixel_width;
 
-	  dpyinfo->mouse_face_beg_col = (x - gpos);
-	  dpyinfo->mouse_face_beg_row = (area == ON_MODE_LINE
-					 ? (w->current_matrix)->nrows - 1
-					 : 0);
+	  /* Pre calculation of re-rendering position */
+	  vpos = (x - gpos);
+	  hpos = (area == ON_MODE_LINE
+		  ? (w->current_matrix)->nrows - 1
+		  : 0);
+	  
+	  /* If the re-rendering position is included in the last
+	     re-rendering area, we should do nothing. */
+	  if ( window == dpyinfo->mouse_face_window
+	       && dpyinfo->mouse_face_beg_col <= vpos
+	       && vpos < dpyinfo->mouse_face_end_col
+	       && dpyinfo->mouse_face_beg_row == hpos )
+	    return;
+	  
+	  if (clear_mouse_face (dpyinfo))
+	    cursor = No_Cursor;
+	  
+	  dpyinfo->mouse_face_beg_col = vpos;
+	  dpyinfo->mouse_face_beg_row = hpos;
 
 	  dpyinfo->mouse_face_beg_x   = original_x_pixel - (total_pixel_width + dx);
 	  dpyinfo->mouse_face_beg_y   = 0;
 
-	  dpyinfo->mouse_face_end_col = (x - gpos) + gseq_length;
+	  dpyinfo->mouse_face_end_col = vpos + gseq_length;
 	  dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_beg_row;
 
 	  dpyinfo->mouse_face_end_x   = 0;
@@ -21617,7 +21630,8 @@
   /* If we were displaying active text in another window, clear that.
      Also clear if we move out of text area in same window.  */
   if (! EQ (window, dpyinfo->mouse_face_window)
-      || (part != ON_TEXT && !NILP (dpyinfo->mouse_face_window)))
+      || (part != ON_TEXT && part != ON_MODE_LINE && part != ON_HEADER_LINE 
+	  && !NILP (dpyinfo->mouse_face_window)))
     clear_mouse_face (dpyinfo);
 
   /* Not on a window -> return.  */