Switch motion hint emulation to be serial based.
For backends not supporting serials, just have _gdk_windowing_window_get_next_serial return zero.
This commit is contained in:
		 Alexander Larsson
					Alexander Larsson
				
			
				
					committed by
					
						 Alexander Larsson
						Alexander Larsson
					
				
			
			
				
	
			
			
			 Alexander Larsson
						Alexander Larsson
					
				
			
						parent
						
							19cd4d6af8
						
					
				
				
					commit
					e24c9e291d
				
			| @ -444,6 +444,19 @@ _gdk_get_sm_client_id (void) | |||||||
|   return gdk_sm_client_id; |   return gdk_sm_client_id; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void | ||||||
|  | _gdk_display_enable_motion_hints (GdkDisplay *display) | ||||||
|  | { | ||||||
|  |   gulong next_serial; | ||||||
|  |    | ||||||
|  |   if (display->pointer_info.motion_hint_serial != 0) | ||||||
|  |     { | ||||||
|  |       next_serial = _gdk_windowing_window_get_next_serial (display); | ||||||
|  |       if (next_serial < display->pointer_info.motion_hint_serial) | ||||||
|  | 	display->pointer_info.motion_hint_serial = next_serial; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * gdk_display_get_pointer: |  * gdk_display_get_pointer: | ||||||
|  * @display: a #GdkDisplay |  * @display: a #GdkDisplay | ||||||
|  | |||||||
| @ -83,7 +83,7 @@ typedef struct | |||||||
|   gdouble toplevel_x, toplevel_y;  |   gdouble toplevel_x, toplevel_y;  | ||||||
|   guint32 state; |   guint32 state; | ||||||
|   guint32 button; |   guint32 button; | ||||||
|   gboolean motion_hint_paused; /* TRUE if we've sent a motion to a window with motion hints enabled */ |   gulong motion_hint_serial; /* 0 == didn't deliver hinted motion event */ | ||||||
| } GdkPointerWindowInfo; | } GdkPointerWindowInfo; | ||||||
|  |  | ||||||
| struct _GdkDisplay | struct _GdkDisplay | ||||||
|  | |||||||
| @ -950,7 +950,7 @@ gdk_event_request_motions (const GdkEventMotion *event) | |||||||
|       gdk_device_get_state (event->device, event->window, NULL, NULL); |       gdk_device_get_state (event->device, event->window, NULL, NULL); | ||||||
|        |        | ||||||
|       display = gdk_drawable_get_display (event->window); |       display = gdk_drawable_get_display (event->window); | ||||||
|       display->pointer_info.motion_hint_paused = FALSE; |       _gdk_display_enable_motion_hints (display); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -333,6 +333,7 @@ void     _gdk_windowing_set_default_display     (GdkDisplay *display); | |||||||
| gchar *_gdk_windowing_substitute_screen_number (const gchar *display_name, | gchar *_gdk_windowing_substitute_screen_number (const gchar *display_name, | ||||||
| 					        gint         screen_number); | 					        gint         screen_number); | ||||||
|  |  | ||||||
|  | gulong   _gdk_windowing_window_get_next_serial  (GdkDisplay *display); | ||||||
| void     _gdk_windowing_window_get_offsets      (GdkWindow  *window, | void     _gdk_windowing_window_get_offsets      (GdkWindow  *window, | ||||||
| 						 gint       *x_offset, | 						 gint       *x_offset, | ||||||
| 						 gint       *y_offset); | 						 gint       *y_offset); | ||||||
| @ -357,7 +358,8 @@ GdkWindow* _gdk_windowing_window_at_pointer  (GdkDisplay       *display, | |||||||
| 					      GdkModifierType  *mask); | 					      GdkModifierType  *mask); | ||||||
| void _gdk_windowing_got_event                (GdkDisplay       *display, | void _gdk_windowing_got_event                (GdkDisplay       *display, | ||||||
| 					      GList            *event_link, | 					      GList            *event_link, | ||||||
| 					      GdkEvent         *event); | 					      GdkEvent         *event, | ||||||
|  | 					      gulong            serial); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Return the number of bits-per-pixel for images of the specified depth. */ | /* Return the number of bits-per-pixel for images of the specified depth. */ | ||||||
| @ -486,6 +488,8 @@ void _gdk_display_set_has_keyboard_grab (GdkDisplay *display, | |||||||
| 					 guint32 time); | 					 guint32 time); | ||||||
| void _gdk_display_unset_has_keyboard_grab (GdkDisplay *display, | void _gdk_display_unset_has_keyboard_grab (GdkDisplay *display, | ||||||
| 					   gboolean implicit); | 					   gboolean implicit); | ||||||
|  | void _gdk_display_enable_motion_hints     (GdkDisplay *display); | ||||||
|  |  | ||||||
|  |  | ||||||
| void _gdk_window_invalidate_for_expose (GdkWindow       *window, | void _gdk_window_invalidate_for_expose (GdkWindow       *window, | ||||||
| 					const GdkRegion *region); | 					const GdkRegion *region); | ||||||
|  | |||||||
| @ -5272,7 +5272,7 @@ gdk_window_get_pointer (GdkWindow	  *window, | |||||||
|   if (mask) |   if (mask) | ||||||
|     *mask = tmp_mask; |     *mask = tmp_mask; | ||||||
|  |  | ||||||
|   display->pointer_info.motion_hint_paused = FALSE; |   _gdk_display_enable_motion_hints (display); | ||||||
|    |    | ||||||
|   return child; |   return child; | ||||||
| } | } | ||||||
| @ -5847,7 +5847,7 @@ gdk_window_set_events (GdkWindow       *window, | |||||||
|   display = gdk_drawable_get_display (window); |   display = gdk_drawable_get_display (window); | ||||||
|   if ((private->event_mask & GDK_POINTER_MOTION_HINT_MASK) && |   if ((private->event_mask & GDK_POINTER_MOTION_HINT_MASK) && | ||||||
|       !(event_mask & GDK_POINTER_MOTION_HINT_MASK)) |       !(event_mask & GDK_POINTER_MOTION_HINT_MASK)) | ||||||
|     display->pointer_info.motion_hint_paused = FALSE; |     _gdk_display_enable_motion_hints (display); | ||||||
|    |    | ||||||
|   private->event_mask = event_mask; |   private->event_mask = event_mask; | ||||||
| } | } | ||||||
| @ -8104,7 +8104,7 @@ _gdk_display_set_window_under_pointer (GdkDisplay *display, | |||||||
|   if (window) |   if (window) | ||||||
|     update_cursor (display); |     update_cursor (display); | ||||||
|  |  | ||||||
|   display->pointer_info.motion_hint_paused = FALSE; |   _gdk_display_enable_motion_hints (display); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @ -8215,7 +8215,8 @@ get_event_window (GdkDisplay                 *display, | |||||||
|  |  | ||||||
| static gboolean | static gboolean | ||||||
| proxy_pointer_event (GdkDisplay                 *display, | proxy_pointer_event (GdkDisplay                 *display, | ||||||
| 		     GdkEvent                   *source_event) | 		     GdkEvent                   *source_event, | ||||||
|  | 		     gulong                      serial) | ||||||
| { | { | ||||||
|   GdkWindow *toplevel_window; |   GdkWindow *toplevel_window; | ||||||
|   GdkWindow *pointer_window; |   GdkWindow *pointer_window; | ||||||
| @ -8264,12 +8265,13 @@ proxy_pointer_event (GdkDisplay                 *display, | |||||||
|       if (event_win && |       if (event_win && | ||||||
| 	  (evmask & GDK_POINTER_MOTION_HINT_MASK)) | 	  (evmask & GDK_POINTER_MOTION_HINT_MASK)) | ||||||
| 	{ | 	{ | ||||||
| 	  if (display->pointer_info.motion_hint_paused) | 	  if (display->pointer_info.motion_hint_serial != 0 && | ||||||
|  | 	      serial < display->pointer_info.motion_hint_serial) | ||||||
| 	    event_win = NULL; /* Ignore event */ | 	    event_win = NULL; /* Ignore event */ | ||||||
| 	  else | 	  else | ||||||
| 	    { | 	    { | ||||||
| 	      is_hint = TRUE; | 	      is_hint = TRUE; | ||||||
| 	      display->pointer_info.motion_hint_paused = TRUE; | 	      display->pointer_info.motion_hint_serial = G_MAXULONG; | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
|        |        | ||||||
| @ -8468,7 +8470,8 @@ gdk_window_print_tree (GdkWindow *window, | |||||||
| void | void | ||||||
| _gdk_windowing_got_event (GdkDisplay *display, | _gdk_windowing_got_event (GdkDisplay *display, | ||||||
| 			  GList      *event_link, | 			  GList      *event_link, | ||||||
| 			  GdkEvent   *event) | 			  GdkEvent   *event, | ||||||
|  | 			  gulong      serial) | ||||||
| { | { | ||||||
|   GdkWindow *event_window; |   GdkWindow *event_window; | ||||||
|   GdkWindowObject *event_private; |   GdkWindowObject *event_private; | ||||||
| @ -8569,15 +8572,13 @@ _gdk_windowing_got_event (GdkDisplay *display, | |||||||
|  |  | ||||||
|   if (display->pointer_info.state != old_state || |   if (display->pointer_info.state != old_state || | ||||||
|       display->pointer_info.button != old_button) |       display->pointer_info.button != old_button) | ||||||
|     { |     _gdk_display_enable_motion_hints (display); | ||||||
|       /* Enable motions for the window */ |  | ||||||
|       display->pointer_info.motion_hint_paused = FALSE; |  | ||||||
|     } |  | ||||||
|   |   | ||||||
|   unlink_event = FALSE; |   unlink_event = FALSE; | ||||||
|   if (is_motion_type (event->type)) |   if (is_motion_type (event->type)) | ||||||
|     unlink_event = proxy_pointer_event (display, |     unlink_event = proxy_pointer_event (display, | ||||||
|                                         event); |                                         event, | ||||||
|  | 					serial); | ||||||
|   else if (is_button_type (event->type)) |   else if (is_button_type (event->type)) | ||||||
|     unlink_event = proxy_button_event (event); |     unlink_event = proxy_button_event (event); | ||||||
|  |  | ||||||
|  | |||||||
| @ -444,6 +444,13 @@ process_internal_connection (GIOChannel  *gioc, | |||||||
|   return TRUE; |   return TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | gulong | ||||||
|  | _gdk_windowing_window_get_next_serial (GdkDisplay *display) | ||||||
|  | { | ||||||
|  |   return NextRequest (GDK_DISPLAY_XDISPLAY (display)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static GdkInternalConnection * | static GdkInternalConnection * | ||||||
| gdk_add_connection_handler (Display *display, | gdk_add_connection_handler (Display *display, | ||||||
| 			    guint    fd) | 			    guint    fd) | ||||||
|  | |||||||
| @ -2352,7 +2352,7 @@ _gdk_events_queue (GdkDisplay *display) | |||||||
|       if (gdk_event_translate (display, event, &xevent, FALSE)) |       if (gdk_event_translate (display, event, &xevent, FALSE)) | ||||||
| 	{ | 	{ | ||||||
| 	  ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING; | 	  ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING; | ||||||
|           _gdk_windowing_got_event (display, node, event); |           _gdk_windowing_got_event (display, node, event, xevent.xany.serial); | ||||||
| 	} | 	} | ||||||
|       else |       else | ||||||
| 	{ | 	{ | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user