i3-input: Bugfix: repeatedly grab the keyboard if it does not succeed
This should fix ticket #175
This commit is contained in:
parent
3cfe1b35e0
commit
5dd5956241
|
@ -306,11 +306,33 @@ int main(int argc, char *argv[]) {
|
||||||
xcb_create_pixmap(conn, root_screen->root_depth, pixmap, win, 500, font_height + 8);
|
xcb_create_pixmap(conn, root_screen->root_depth, pixmap, win, 500, font_height + 8);
|
||||||
xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
|
xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
|
||||||
|
|
||||||
|
/* Set input focus (we have override_redirect=1, so the wm will not do
|
||||||
|
* this for us) */
|
||||||
|
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, win, XCB_CURRENT_TIME);
|
||||||
|
|
||||||
/* Create graphics context */
|
/* Create graphics context */
|
||||||
xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font_id);
|
xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font_id);
|
||||||
|
|
||||||
/* Grab the keyboard to get all input */
|
/* Grab the keyboard to get all input */
|
||||||
xcb_grab_keyboard(conn, false, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
|
xcb_flush(conn);
|
||||||
|
|
||||||
|
/* Try (repeatedly, if necessary) to grab the keyboard. We might not
|
||||||
|
* get the keyboard at the first attempt because of the keybinding
|
||||||
|
* still being active when started via a wm’s keybinding. */
|
||||||
|
xcb_grab_keyboard_cookie_t cookie;
|
||||||
|
xcb_grab_keyboard_reply_t *reply = NULL;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
while ((reply == NULL || reply->status != XCB_GRAB_STATUS_SUCCESS) && (count++ < 500)) {
|
||||||
|
cookie = xcb_grab_keyboard(conn, false, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
|
||||||
|
reply = xcb_grab_keyboard_reply(conn, cookie, NULL);
|
||||||
|
usleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reply->status != XCB_GRAB_STATUS_SUCCESS) {
|
||||||
|
fprintf(stderr, "Could not grab keyboard, status = %d\n", reply->status);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue