[PATCH 04/19] Xephyr: xcb-ify pointer/keyboard grab
Julien Cristau
jcristau at debian.org
Wed Oct 20 10:11:46 PDT 2010
Reviewed-by: Mikhail Gusarov <dottedmag at dottedmag.net>
Signed-off-by: Julien Cristau <jcristau at debian.org>
---
hw/kdrive/ephyr/hostx.c | 51 +++++++++++++++++++++++++++++++---------------
1 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index f0ca6f0..44a9df4 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -1067,8 +1067,8 @@ hostx_get_event(EphyrHostXEvent *ev)
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)");
@@ -1076,25 +1076,42 @@ hostx_get_event(EphyrHostXEvent *ev)
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.7.1
More information about the xorg-devel
mailing list