changeset 10223:97fc8c6b4a74

(XTupdate_begin): Discard records of prior mouse highlight when frame must be redrawn. (x_make_frame_visible, x_make_frame_invisible) (x_iconify_frame): Give error if frame has explicit_parent. (x_new_font): Don't set window height if frame has explicit_parent. (x_mouse_leave): New function broken out of XTread_socket. When x_focus_event_frame is nonzero, assume that frame gets focus. (XTread_socket): Use x_mouse_leave for LeaveNotify.
author Richard M. Stallman <rms@gnu.org>
date Fri, 23 Dec 1994 05:12:32 +0000
parents 617bee0c64f6
children 8a933302229c
files src/xterm.c
diffstat 1 files changed, 21 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/xterm.c	Fri Dec 23 05:11:11 1994 +0000
+++ b/src/xterm.c	Fri Dec 23 05:12:32 1994 +0000
@@ -291,6 +291,12 @@
     {
       /* Don't do highlighting for mouse motion during the update.  */
       FRAME_X_DISPLAY_INFO (f)->mouse_face_defer = 1;
+
+      /* If the frame needs to be redrawn,
+	 simply forget about any prior mouse highlighting.  */
+      if (! FRAME_GARBAGED_P (f))
+	FRAME_X_DISPLAY_INFO (f)->mouse_face_window = Qnil;
+
       if (!NILP (FRAME_X_DISPLAY_INFO (f)->mouse_face_window))
 	{
 	  int firstline, lastline, i;
@@ -311,10 +317,12 @@
 	    }
 
 	  /* Can we tell that this update does not affect the window
-	     where the mouse highlight is?  If so, no need to turn off.  */
+	     where the mouse highlight is?  If so, no need to turn off.
+	     Likewise, don't do anything if the frame is garbaged;
+	     in that case, the FRAME_CURRENT_GLYPHS that we would use
+	     are all wrong, and we will redisplay that line anyway.  */
 	  if (! (firstline > (XFASTINT (w->top) + window_internal_height (w))
 		 || lastline < XFASTINT (w->top)))
-	    /* Otherwise turn off the mouse highlight now.  */
 	    clear_mouse_face (FRAME_X_DISPLAY_INFO (f));
 	}
     }
@@ -1449,6 +1457,16 @@
   XTframe_rehighlight ();
 }
 
+/* Handle an event saying the mouse has moved out of an Emacs frame.  */
+
+void
+x_mouse_leave ()
+{
+  if (! x_focus_event_frame)
+    x_new_focus_frame (NULL);
+  else
+    x_new_focus_frame (x_focus_event_frame);  /* Was f, but that seems wrong.  */
+}
 
 /* The focus has changed, or we have redirected a frame's focus to
    another frame (this happens when a frame uses a surrogate
@@ -3689,12 +3707,7 @@
 		    clear_mouse_face (dpyinfo);
 
 		  if (event.xcrossing.focus)
-		    {
-		      if (! x_focus_event_frame)
-			x_new_focus_frame (0);
-		      else
-			x_new_focus_frame (f);
-		    }
+		    x_mouse_leave ();
 		  else
 		    {
 		      if (f == x_focus_event_frame)