#include "xkb.h" #include #include #include #include #include "utils.h" #include "wm.h" static void xkb_fill_state(void) {} static void xkb_init_keymap(void) { wm.xkb_ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (!wm.xkb_ctx) fatal("Cannot get XKB context"); xkb_fill_state(); } static void xkb_free_keymap(void) { xkb_state_unref(wm.xkb_state); xkb_context_unref(wm.xkb_ctx); } void xkb_init(void) { wm.have_xkb = xkb_x11_setup_xkb_extension( wm.xcb_conn, XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION, XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS, nullptr, nullptr, nullptr, nullptr); if (!wm.have_xkb) { warn("XKB not found or not supported"); xkb_init_keymap(); return; } xcb_discard_reply(wm.xcb_conn, xcb_xkb_per_client_flags( wm.xcb_conn, XCB_XKB_ID_USE_CORE_KBD, XCB_XKB_PER_CLIENT_FLAG_DETECTABLE_AUTO_REPEAT, XCB_XKB_PER_CLIENT_FLAG_DETECTABLE_AUTO_REPEAT, 0, 0, 0) .sequence); xkb_init_keymap(); } void xkb_free(void) { xkb_free_keymap(); }