diff --git a/src/core/window.c b/src/core/window.c
index 285782558..d71c31d4a 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -43,12 +43,17 @@
#include
#include "window-props.h"
#include "constraints.h"
+#include "input-events.h"
#include "mutter-enum-types.h"
#include
#include /* For display->resource_mask */
#include
+#ifdef HAVE_XINPUT2
+#include
+#endif
+
#ifdef HAVE_SHAPE
#include
#endif
@@ -8776,7 +8781,10 @@ update_resize (MetaWindow *window,
typedef struct
{
- const XEvent *current_event;
+ guint current_event_type;
+ Window current_event_window;
+ MetaDisplay *display;
+ MetaDevice *device;
int count;
guint32 last_time;
} EventScannerData;
@@ -8787,13 +8795,33 @@ find_last_time_predicate (Display *display,
XPointer arg)
{
EventScannerData *esd = (void*) arg;
+ Window xwindow;
- if (esd->current_event->type == xevent->type &&
- esd->current_event->xany.window == xevent->xany.window)
- {
- esd->count += 1;
- esd->last_time = xevent->xmotion.time;
- }
+#ifdef HAVE_XINPUT2
+ /* We are peeking into events not yet handled by GDK,
+ * Allocate cookie events here so we can handle XI2.
+ *
+ * GDK will handle later these events, and eventually
+ * free the cookie data itself.
+ */
+ XGetEventData (display, &xevent->xcookie);
+#endif
+
+ if (!meta_input_event_is_type (esd->display, xevent,
+ esd->current_event_type))
+ return False;
+
+ xwindow = meta_input_event_get_window (esd->display, xevent);
+
+ if (xwindow == None ||
+ xwindow != esd->current_event_window)
+ return False;
+
+ if (esd->device != meta_input_event_get_device (esd->display, xevent))
+ return False;
+
+ esd->count += 1;
+ esd->last_time = meta_input_event_get_time (esd->display, xevent);
return False;
}
@@ -8809,13 +8837,16 @@ check_use_this_motion_notify (MetaWindow *window,
if (window->display->grab_motion_notify_time != 0)
{
+ Time evtime;
+
+ evtime = meta_input_event_get_time (window->display, event);
+
/* == is really the right test, but I'm all for paranoia */
- if (window->display->grab_motion_notify_time <=
- event->xmotion.time)
+ if (window->display->grab_motion_notify_time <= evtime)
{
meta_topic (META_DEBUG_RESIZING,
"Arrived at event with time %u (waiting for %u), using it\n",
- (unsigned int)event->xmotion.time,
+ (unsigned int) evtime,
window->display->grab_motion_notify_time);
window->display->grab_motion_notify_time = 0;
return TRUE;
@@ -8824,7 +8855,11 @@ check_use_this_motion_notify (MetaWindow *window,
return FALSE; /* haven't reached the saved timestamp yet */
}
- esd.current_event = event;
+ esd.current_event_window = meta_input_event_get_window (window->display,
+ event);
+ esd.device = device;
+ esd.current_event_type = MotionNotify;
+ esd.display = window->display;
esd.count = 0;
esd.last_time = 0;
@@ -8872,6 +8907,10 @@ void
meta_window_handle_mouse_grab_op_event (MetaWindow *window,
XEvent *event)
{
+ gdouble x_root, y_root;
+ guint evtype, state;
+ Window xroot;
+
#ifdef HAVE_XSYNC
if (event->type == (window->display->xsync_event_base + XSyncAlarmNotify))
{
@@ -8921,12 +8960,19 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
}
#endif /* HAVE_XSYNC */
- switch (event->type)
+ if (!meta_input_event_get_type (window->display, event, &evtype) ||
+ !meta_input_event_get_state (window->display, event, &state) ||
+ !meta_input_event_get_coordinates (window->display, event,
+ NULL, NULL, &x_root, &y_root))
+ return;
+
+ xroot = meta_input_event_get_root_window (window->display, event);
+
+ switch (evtype)
{
case ButtonRelease:
meta_display_check_threshold_reached (window->display,
- event->xbutton.x_root,
- event->xbutton.y_root);
+ x_root, y_root);
/* If the user was snap moving then ignore the button release
* because they may have let go of shift before releasing the
* mouse button and they almost certainly do not want a
@@ -8938,17 +8984,17 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
{
if (window->tile_mode != META_TILE_NONE)
meta_window_tile (window);
- else if (event->xbutton.root == window->screen->xroot)
- update_move (window, event->xbutton.state & ShiftMask,
- event->xbutton.x_root, event->xbutton.y_root);
+ else if (xroot == window->screen->xroot)
+ update_move (window,
+ state & ShiftMask,
+ x_root, y_root);
}
else if (meta_grab_op_is_resizing (window->display->grab_op))
{
- if (event->xbutton.root == window->screen->xroot)
+ if (xroot == window->screen->xroot)
update_resize (window,
- event->xbutton.state & ShiftMask,
- event->xbutton.x_root,
- event->xbutton.y_root,
+ state & ShiftMask,
+ x_root, y_root,
TRUE);
if (window->display->compositor)
meta_compositor_set_updates (window->display->compositor, window, TRUE);
@@ -8964,35 +9010,34 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
}
}
- meta_display_end_grab_op (window->display, event->xbutton.time);
+ meta_display_end_grab_op (window->display,
+ meta_input_event_get_time (window->display,
+ event));
break;
case MotionNotify:
meta_display_check_threshold_reached (window->display,
- event->xmotion.x_root,
- event->xmotion.y_root);
+ x_root, y_root);
if (meta_grab_op_is_moving (window->display->grab_op))
{
- if (event->xmotion.root == window->screen->xroot)
+ if (xroot == window->screen->xroot)
{
if (check_use_this_motion_notify (window,
event))
update_move (window,
- event->xmotion.state & ShiftMask,
- event->xmotion.x_root,
- event->xmotion.y_root);
+ state & ShiftMask,
+ x_root, y_root);
}
}
else if (meta_grab_op_is_resizing (window->display->grab_op))
{
- if (event->xmotion.root == window->screen->xroot)
+ if (xroot == window->screen->xroot)
{
if (check_use_this_motion_notify (window,
event))
update_resize (window,
- event->xmotion.state & ShiftMask,
- event->xmotion.x_root,
- event->xmotion.y_root,
+ state & ShiftMask,
+ x_root, y_root,
FALSE);
}
}