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:
parent
1f93e6b350
commit
ac2b0348c0
|
@ -1016,30 +1016,49 @@ hostx_get_event(EphyrHostXEvent * ev)
|
||||||
host_screen_from_window(xev.xexpose.window);
|
host_screen_from_window(xev.xexpose.window);
|
||||||
|
|
||||||
if (grabbed_screen != -1) {
|
if (grabbed_screen != -1) {
|
||||||
XUngrabKeyboard(HostX.dpy, CurrentTime);
|
xcb_ungrab_keyboard(HostX.conn, XCB_TIME_CURRENT_TIME);
|
||||||
XUngrabPointer(HostX.dpy, CurrentTime);
|
xcb_ungrab_pointer(HostX.conn, XCB_TIME_CURRENT_TIME);
|
||||||
grabbed_screen = -1;
|
grabbed_screen = -1;
|
||||||
hostx_set_win_title(host_screen->info,
|
hostx_set_win_title(host_screen->info,
|
||||||
"(ctrl+shift grabs mouse and keyboard)");
|
"(ctrl+shift grabs mouse and keyboard)");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Attempt grab */
|
/* Attempt grab */
|
||||||
if (XGrabKeyboard(HostX.dpy, host_screen->win, True,
|
xcb_grab_keyboard_cookie_t kbgrabc =
|
||||||
GrabModeAsync,
|
xcb_grab_keyboard(HostX.conn,
|
||||||
GrabModeAsync, CurrentTime) == 0) {
|
True,
|
||||||
if (XGrabPointer(HostX.dpy, host_screen->win, True,
|
host_screen->win,
|
||||||
NoEventMask,
|
XCB_TIME_CURRENT_TIME,
|
||||||
GrabModeAsync,
|
XCB_GRAB_MODE_ASYNC,
|
||||||
GrabModeAsync,
|
XCB_GRAB_MODE_ASYNC);
|
||||||
host_screen->win, None,
|
xcb_grab_keyboard_reply_t *kbgrabr;
|
||||||
CurrentTime) == 0) {
|
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;
|
grabbed_screen = host_screen->mynum;
|
||||||
hostx_set_win_title
|
hostx_set_win_title
|
||||||
(host_screen->info,
|
(host_screen->info,
|
||||||
"(ctrl+shift releases mouse and keyboard)");
|
"(ctrl+shift releases mouse and keyboard)");
|
||||||
}
|
}
|
||||||
else /* Failed pointer grabm ungrab keyboard */
|
|
||||||
XUngrabKeyboard(HostX.dpy, CurrentTime);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue