Xephyr: xcb-ify pointer/keyboard grab

Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net>
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Julien Cristau <jcristau@debian.org>
This commit is contained in:
Julien Cristau 2010-06-20 23:34:39 +01:00 committed by Eric Anholt
parent 1f93e6b350
commit ac2b0348c0

View File

@ -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);
}
}
}