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);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user