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 2009-01-23 21:07:53 +01:00 committed by Alexander Larsson
parent 19cd4d6af8
commit e24c9e291d
7 changed files with 41 additions and 16 deletions

View File

@ -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

View File

@ -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

View File

@ -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);
} }
} }

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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
{ {