[PATCH 05/19] Xephyr: xcb-ify pointer/keyboard grab
Eric Anholt
eric at anholt.net
Mon Aug 26 13:20:49 PDT 2013
From: Julien Cristau <jcristau at debian.org>
Reviewed-by: Mikhail Gusarov <dottedmag at dottedmag.net>
Reviewed-by: Eric Anholt <eric at anholt.net>
Signed-off-by: Julien Cristau <jcristau at debian.org>
---
hw/kdrive/ephyr/hostx.c | 45 ++++++++++++++++++++++++++++++++-------------
1 file changed, 32 insertions(+), 13 deletions(-)
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index 699805b..2ebf978 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -1016,30 +1016,49 @@ hostx_get_event(EphyrHostXEvent * ev)
host_screen_from_window(xev.xexpose.window);
if (grabbed_screen != -1) {
- XUngrabKeyboard(HostX.dpy, CurrentTime);
- XUngrabPointer(HostX.dpy, CurrentTime);
+ xcb_ungrab_keyboard(HostX.conn, XCB_TIME_CURRENT_TIME);
+ xcb_ungrab_pointer(HostX.conn, XCB_TIME_CURRENT_TIME);
grabbed_screen = -1;
hostx_set_win_title(host_screen->info,
"(ctrl+shift grabs mouse and keyboard)");
}
else {
/* Attempt grab */
- if (XGrabKeyboard(HostX.dpy, host_screen->win, True,
- GrabModeAsync,
- GrabModeAsync, CurrentTime) == 0) {
- if (XGrabPointer(HostX.dpy, host_screen->win, True,
- NoEventMask,
- GrabModeAsync,
- GrabModeAsync,
- host_screen->win, None,
- CurrentTime) == 0) {
+ xcb_grab_keyboard_cookie_t kbgrabc =
+ xcb_grab_keyboard(HostX.conn,
+ True,
+ host_screen->win,
+ XCB_TIME_CURRENT_TIME,
+ XCB_GRAB_MODE_ASYNC,
+ XCB_GRAB_MODE_ASYNC);
+ xcb_grab_keyboard_reply_t *kbgrabr;
+ xcb_grab_pointer_cookie_t pgrabc =
+ xcb_grab_pointer(HostX.conn,
+ True,
+ host_screen->win,
+ 0,
+ XCB_GRAB_MODE_ASYNC,
+ XCB_GRAB_MODE_ASYNC,
+ host_screen->win,
+ XCB_NONE,
+ XCB_TIME_CURRENT_TIME);
+ xcb_grab_pointer_reply_t *pgrabr;
+ kbgrabr = xcb_grab_keyboard_reply(HostX.conn, kbgrabc, NULL);
+ if (!kbgrabr || kbgrabr->status != XCB_GRAB_STATUS_SUCCESS) {
+ xcb_discard_reply(HostX.conn, pgrabc.sequence);
+ xcb_ungrab_pointer(HostX.conn, XCB_TIME_CURRENT_TIME);
+ } else {
+ pgrabr = xcb_grab_pointer_reply(HostX.conn, pgrabc, NULL);
+ if (!pgrabr || pgrabr->status != XCB_GRAB_STATUS_SUCCESS)
+ {
+ xcb_ungrab_keyboard(HostX.conn,
+ XCB_TIME_CURRENT_TIME);
+ } else {
grabbed_screen = host_screen->mynum;
hostx_set_win_title
(host_screen->info,
"(ctrl+shift releases mouse and keyboard)");
}
- else /* Failed pointer grabm ungrab keyboard */
- XUngrabKeyboard(HostX.dpy, CurrentTime);
}
}
}
--
1.8.4.rc3
More information about the xorg-devel
mailing list