window: Move grab op sync handling code out

This removes some duplicate event type checks, and will make
the code cleaner in the future when we want to make the grab_op_event
handler take an XIDeviceEvent directly.

Based on a patch by Owen Taylor <otaylor@fishsoup.net>

https://bugzilla.gnome.org/show_bug.cgi?id=688779
This commit is contained in:
Jasper St. Pierre 2012-11-15 17:18:06 -05:00
parent 6b31bd402a
commit 881d256ce0
4 changed files with 28 additions and 15 deletions

View File

@ -432,6 +432,7 @@ int meta_resize_gravity_from_grab_op (MetaGrabOp op);
gboolean meta_grab_op_is_moving (MetaGrabOp op); gboolean meta_grab_op_is_moving (MetaGrabOp op);
gboolean meta_grab_op_is_resizing (MetaGrabOp op); gboolean meta_grab_op_is_resizing (MetaGrabOp op);
gboolean meta_grab_op_is_mouse (MetaGrabOp op);
void meta_display_devirtualize_modifiers (MetaDisplay *display, void meta_display_devirtualize_modifiers (MetaDisplay *display,
MetaVirtualModifier modifiers, MetaVirtualModifier modifiers,

View File

@ -1295,8 +1295,8 @@ grab_op_is_mouse_only (MetaGrabOp op)
} }
} }
static gboolean gboolean
grab_op_is_mouse (MetaGrabOp op) meta_grab_op_is_mouse (MetaGrabOp op)
{ {
switch (op) switch (op)
{ {
@ -1922,12 +1922,11 @@ event_callback (XEvent *event,
event->type == (display->xsync_event_base + XSyncAlarmNotify) && event->type == (display->xsync_event_base + XSyncAlarmNotify) &&
((XSyncAlarmNotifyEvent*)event)->alarm == display->grab_sync_request_alarm) ((XSyncAlarmNotifyEvent*)event)->alarm == display->grab_sync_request_alarm)
{ {
XSyncValue value = ((XSyncAlarmNotifyEvent*)event)->counter_value;
guint64 new_counter_value;
new_counter_value = XSyncValueLow32 (value) + ((gint64)XSyncValueHigh32 (value) << 32);
meta_window_update_sync_request_counter (display->grab_window, new_counter_value);
filter_out_event = TRUE; /* GTK doesn't want to see this really */ filter_out_event = TRUE; /* GTK doesn't want to see this really */
if (display->grab_op != META_GRAB_OP_NONE &&
display->grab_window != NULL &&
grab_op_is_mouse (display->grab_op))
meta_window_handle_mouse_grab_op_event (display->grab_window, event);
} }
#endif /* HAVE_XSYNC */ #endif /* HAVE_XSYNC */
@ -2026,7 +2025,7 @@ event_callback (XEvent *event,
break; break;
if ((window && if ((window &&
grab_op_is_mouse (display->grab_op) && meta_grab_op_is_mouse (display->grab_op) &&
display->grab_button != (int) event->xbutton.button && display->grab_button != (int) event->xbutton.button &&
display->grab_window == window) || display->grab_window == window) ||
grab_op_is_keyboard (display->grab_op)) grab_op_is_keyboard (display->grab_op))
@ -2221,7 +2220,7 @@ event_callback (XEvent *event,
display->overlay_key_only_pressed = FALSE; display->overlay_key_only_pressed = FALSE;
if (display->grab_window == window && if (display->grab_window == window &&
grab_op_is_mouse (display->grab_op)) meta_grab_op_is_mouse (display->grab_op))
meta_window_handle_mouse_grab_op_event (window, event); meta_window_handle_mouse_grab_op_event (window, event);
break; break;
case MotionNotify: case MotionNotify:
@ -2229,7 +2228,7 @@ event_callback (XEvent *event,
break; break;
if (display->grab_window == window && if (display->grab_window == window &&
grab_op_is_mouse (display->grab_op)) meta_grab_op_is_mouse (display->grab_op))
meta_window_handle_mouse_grab_op_event (window, event); meta_window_handle_mouse_grab_op_event (window, event);
break; break;
case EnterNotify: case EnterNotify:

View File

@ -580,6 +580,11 @@ void meta_window_shove_titlebar_onscreen (MetaWindow *window);
void meta_window_set_gravity (MetaWindow *window, void meta_window_set_gravity (MetaWindow *window,
int gravity); int gravity);
#ifdef HAVE_XSYNC
void meta_window_update_sync_request_counter (MetaWindow *window,
guint64 new_counter_value);
#endif /* HAVE_XSYNC */
void meta_window_handle_mouse_grab_op_event (MetaWindow *window, void meta_window_handle_mouse_grab_op_event (MetaWindow *window,
XEvent *event); XEvent *event);

View File

@ -9225,13 +9225,16 @@ update_tile_mode (MetaWindow *window)
} }
} }
void
meta_window_handle_mouse_grab_op_event (MetaWindow *window,
XEvent *event)
{
#ifdef HAVE_XSYNC #ifdef HAVE_XSYNC
if (event->type == (window->display->xsync_event_base + XSyncAlarmNotify)) void
meta_window_update_sync_request_counter (MetaWindow *window,
guint64 new_counter_value)
{
if (window->display->grab_op != META_GRAB_OP_NONE &&
window == window->display->grab_window &&
meta_grab_op_is_mouse (window->display->grab_op))
{ {
meta_topic (META_DEBUG_RESIZING, meta_topic (META_DEBUG_RESIZING,
"Alarm event received last motion x = %d y = %d\n", "Alarm event received last motion x = %d y = %d\n",
window->display->grab_latest_motion_x, window->display->grab_latest_motion_x,
@ -9276,8 +9279,13 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
break; break;
} }
} }
}
#endif /* HAVE_XSYNC */ #endif /* HAVE_XSYNC */
void
meta_window_handle_mouse_grab_op_event (MetaWindow *window,
XEvent *event)
{
switch (event->type) switch (event->type)
{ {
case ButtonRelease: case ButtonRelease: