mirror of
https://github.com/brl/mutter.git
synced 2024-11-27 18:40:40 -05:00
window: use input event helper functions in grab operations.
This commit is contained in:
parent
e26bf9dcef
commit
e6d09c9d0b
@ -43,12 +43,17 @@
|
||||
#include <meta/group.h>
|
||||
#include "window-props.h"
|
||||
#include "constraints.h"
|
||||
#include "input-events.h"
|
||||
#include "mutter-enum-types.h"
|
||||
|
||||
#include <X11/Xatom.h>
|
||||
#include <X11/Xlibint.h> /* For display->resource_mask */
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SHAPE
|
||||
#include <X11/extensions/shape.h>
|
||||
#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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user