state_filtered &= 0xFF;
LOG("(removed upper 8 bits, state = %d)\n", state_filtered);
- /* We need to get the keysym group (There are group 1 to group 4, each holding
- two keysyms (without shift and with shift) using Xkb because X fails to
- provide them reliably (it works in Xephyr, it does not in real X) */
- XkbStateRec state;
- if (XkbGetState(xkbdpy, XkbUseCoreKbd, &state) == Success && (state.group+1) == 2)
- state_filtered |= BIND_MODE_SWITCH;
+ if (xkb_supported) {
+ /* We need to get the keysym group (There are group 1 to group 4, each holding
+ two keysyms (without shift and with shift) using Xkb because X fails to
+ provide them reliably (it works in Xephyr, it does not in real X) */
+ XkbStateRec state;
+ if (XkbGetState(xkbdpy, XkbUseCoreKbd, &state) == Success && (state.group+1) == 2)
+ state_filtered |= BIND_MODE_SWITCH;
+ }
LOG("(checked mode_switch, state %d)\n", state_filtered);
/* The depth of the root screen (used e.g. for creating new pixmaps later) */
uint8_t root_depth;
+/* We hope that XKB is supported and set this to false */
+bool xkb_supported = true;
+
/*
* This callback is only a dummy, see xcb_prepare_cb and xcb_check_cb.
* See also man libev(3): "ev_prepare" and "ev_check" - customise your event loop
int evBase, errBase;
if ((xkbdpy = XkbOpenDisplay(getenv("DISPLAY"), &evBase, &errBase, &major, &minor, &error)) == NULL) {
- fprintf(stderr, "XkbOpenDisplay() failed\n");
- return 1;
+ LOG("ERROR: XkbOpenDisplay() failed, disabling XKB support\n");
+ xkb_supported = false;
}
- if (fcntl(ConnectionNumber(xkbdpy), F_SETFD, FD_CLOEXEC) == -1) {
- fprintf(stderr, "Could not set FD_CLOEXEC on xkbdpy\n");
- return 1;
- }
+ if (xkb_supported) {
+ if (fcntl(ConnectionNumber(xkbdpy), F_SETFD, FD_CLOEXEC) == -1) {
+ fprintf(stderr, "Could not set FD_CLOEXEC on xkbdpy\n");
+ return 1;
+ }
- int i1;
- if (!XkbQueryExtension(xkbdpy,&i1,&evBase,&errBase,&major,&minor)) {
- fprintf(stderr, "XKB not supported by X-server\n");
- return 1;
- }
- /* end of ugliness */
+ int i1;
+ if (!XkbQueryExtension(xkbdpy,&i1,&evBase,&errBase,&major,&minor)) {
+ fprintf(stderr, "XKB not supported by X-server\n");
+ return 1;
+ }
+ /* end of ugliness */
- if (!XkbSelectEvents(xkbdpy, XkbUseCoreKbd, XkbMapNotifyMask, XkbMapNotifyMask)) {
- fprintf(stderr, "Could not set XKB event mask\n");
- return 1;
+ if (!XkbSelectEvents(xkbdpy, XkbUseCoreKbd, XkbMapNotifyMask, XkbMapNotifyMask)) {
+ fprintf(stderr, "Could not set XKB event mask\n");
+ return 1;
+ }
}
/* Initialize event loop using libev */
ev_io_init(xcb_watcher, xcb_got_event, xcb_get_file_descriptor(conn), EV_READ);
ev_io_start(loop, xcb_watcher);
- ev_io_init(xkb, xkb_got_event, ConnectionNumber(xkbdpy), EV_READ);
- ev_io_start(loop, xkb);
+ if (xkb_supported) {
+ ev_io_init(xkb, xkb_got_event, ConnectionNumber(xkbdpy), EV_READ);
+ ev_io_start(loop, xkb);
- /* Flush the buffer so that libev can properly get new events */
- XFlush(xkbdpy);
+ /* Flush the buffer so that libev can properly get new events */
+ XFlush(xkbdpy);
+ }
ev_check_init(xcb_check, xcb_check_cb);
ev_check_start(loop, xcb_check);