[mutter] compositor: Use XInput2 to grab the pointer/keyboard
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] compositor: Use XInput2 to grab the pointer/keyboard
- Date: Thu, 13 Dec 2012 23:19:13 +0000 (UTC)
commit 55251aa986fc034e131dff12f2f7693e9b8d0a2e
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Tue Nov 20 16:59:20 2012 -0500
compositor: Use XInput2 to grab the pointer/keyboard
https://bugzilla.gnome.org/show_bug.cgi?id=688779
src/compositor/compositor.c | 49 +++++++++++++++++++++++++++++-------------
src/core/display.c | 14 ++++--------
src/meta/common.h | 4 +++
3 files changed, 43 insertions(+), 24 deletions(-)
---
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index c6a85aa..e3c90e1 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -358,14 +358,23 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
{
- result = XGrabPointer (xdpy, grab_window,
- False, /* owner_events */
- (ButtonPressMask | ButtonReleaseMask |
- EnterWindowMask | LeaveWindowMask | PointerMotionMask),
- GrabModeAsync, GrabModeAsync,
- None, /* confine to */
+ unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
+ XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
+
+ XISetMask (mask.mask, XI_ButtonPress);
+ XISetMask (mask.mask, XI_ButtonRelease);
+ XISetMask (mask.mask, XI_Enter);
+ XISetMask (mask.mask, XI_Leave);
+ XISetMask (mask.mask, XI_Motion);
+
+ result = XIGrabDevice (xdpy,
+ META_VIRTUAL_CORE_POINTER_ID,
+ grab_window,
+ timestamp,
cursor,
- timestamp);
+ XIGrabModeAsync, XIGrabModeAsync,
+ False, /* owner_events */
+ &mask);
if (result != Success)
goto fail;
@@ -374,10 +383,20 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
{
- result = XGrabKeyboard (xdpy, grab_window,
- False, /* owner_events */
- GrabModeAsync, GrabModeAsync,
- timestamp);
+ unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
+ XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
+
+ XISetMask (mask.mask, XI_KeyPress);
+ XISetMask (mask.mask, XI_KeyRelease);
+
+ result = XIGrabDevice (xdpy,
+ META_VIRTUAL_CORE_KEYBOARD_ID,
+ grab_window,
+ timestamp,
+ None,
+ XIGrabModeAsync, XIGrabModeAsync,
+ False, /* owner_events */
+ &mask);
if (result != Success)
goto fail;
@@ -397,9 +416,9 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
fail:
if (pointer_grabbed)
- XUngrabPointer (xdpy, timestamp);
+ XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
if (keyboard_grabbed)
- XUngrabKeyboard (xdpy, timestamp);
+ XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
return FALSE;
}
@@ -415,8 +434,8 @@ meta_end_modal_for_plugin (MetaScreen *screen,
g_return_if_fail (compositor->modal_plugin == plugin);
- XUngrabPointer (xdpy, timestamp);
- XUngrabKeyboard (xdpy, timestamp);
+ XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
+ XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
display->grab_op = META_GRAB_OP_NONE;
display->grab_window = NULL;
diff --git a/src/core/display.c b/src/core/display.c
index f557ade..a989a05 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -74,10 +74,6 @@
#include <string.h>
#include <unistd.h>
-/* This is set in stone and also hard-coded in GDK. */
-#define VIRTUAL_CORE_POINTER_ID 2
-#define VIRTUAL_CORE_KEYBOARD_ID 3
-
#define GRAB_OP_IS_WINDOW_SWITCH(g) \
(g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL || \
g == META_GRAB_OP_KEYBOARD_TABBING_DOCK || \
@@ -1816,19 +1812,19 @@ get_input_event (MetaDisplay *display,
case XI_Motion:
case XI_ButtonPress:
case XI_ButtonRelease:
- if (((XIDeviceEvent *) input_event)->deviceid == VIRTUAL_CORE_POINTER_ID)
+ if (((XIDeviceEvent *) input_event)->deviceid == META_VIRTUAL_CORE_POINTER_ID)
return input_event;
case XI_KeyPress:
case XI_KeyRelease:
- if (((XIDeviceEvent *) input_event)->deviceid == VIRTUAL_CORE_KEYBOARD_ID)
+ if (((XIDeviceEvent *) input_event)->deviceid == META_VIRTUAL_CORE_KEYBOARD_ID)
return input_event;
case XI_FocusIn:
case XI_FocusOut:
- if (((XIEnterEvent *) input_event)->deviceid == VIRTUAL_CORE_KEYBOARD_ID)
+ if (((XIEnterEvent *) input_event)->deviceid == META_VIRTUAL_CORE_KEYBOARD_ID)
return input_event;
case XI_Enter:
case XI_Leave:
- if (((XIEnterEvent *) input_event)->deviceid == VIRTUAL_CORE_POINTER_ID)
+ if (((XIEnterEvent *) input_event)->deviceid == META_VIRTUAL_CORE_POINTER_ID)
return input_event;
default:
break;
@@ -2877,7 +2873,7 @@ event_callback (XEvent *event,
break;
case XkbNewKeyboardNotify:
case XkbMapNotify:
- if (xkb_ev->device == VIRTUAL_CORE_KEYBOARD_ID)
+ if (xkb_ev->device == META_VIRTUAL_CORE_KEYBOARD_ID)
meta_display_process_mapping_event (display, event);
break;
}
diff --git a/src/meta/common.h b/src/meta/common.h
index f32a0a6..ab54aff 100644
--- a/src/meta/common.h
+++ b/src/meta/common.h
@@ -35,6 +35,10 @@
#include <glib.h>
#include <gtk/gtk.h>
+/* This is set in stone and also hard-coded in GDK. */
+#define META_VIRTUAL_CORE_POINTER_ID 2
+#define META_VIRTUAL_CORE_KEYBOARD_ID 3
+
typedef struct _MetaResizePopup MetaResizePopup;
typedef enum
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]