From 88bf451cd44d3c9f4f14a16b9fa53f6c131434ce Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Sat, 22 Nov 2025 22:59:15 +0800 Subject: [PATCH] keep xkb progress --- src/CMakeLists.txt | 3 +++ src/wm.h | 5 +++++ src/xkb.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/xkb.h | 4 ++++ 4 files changed, 57 insertions(+) create mode 100644 src/xkb.c create mode 100644 src/xkb.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4e8cf7e..ecb9009 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -32,6 +32,7 @@ add_executable(${APP_NAME} xwindow.c event.c action.c + xkb.c ) # use C23 @@ -50,6 +51,8 @@ pkg_check_modules(deps REQUIRED xcb-randr xcb-xfixes xcb-xinerama + xcb-xkb + xkbcommon-x11 cairo cairo-xcb diff --git a/src/wm.h b/src/wm.h index 784448a..56705d7 100644 --- a/src/wm.h +++ b/src/wm.h @@ -2,6 +2,7 @@ #include #include +#include #include "types.h" @@ -25,6 +26,10 @@ typedef struct wm_t { bool have_xfixes; bool have_xinerama; bool have_randr; + bool have_xkb; + + struct xkb_context *xkb_ctx; + struct xkb_state *xkb_state; color_set_t color_set; } wm_t; diff --git a/src/xkb.c b/src/xkb.c new file mode 100644 index 0000000..b923eb1 --- /dev/null +++ b/src/xkb.c @@ -0,0 +1,45 @@ +#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(); } diff --git a/src/xkb.h b/src/xkb.h new file mode 100644 index 0000000..3341016 --- /dev/null +++ b/src/xkb.h @@ -0,0 +1,4 @@ +#pragma once + +void xkb_init(void); +void xkb_free(void);