diff --git a/src/Makefile.am b/src/Makefile.am index 74e8aab..ecc1691 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -168,7 +168,8 @@ wmaker_SOURCES += \ backend/wayland/wl_icccm.c \ backend/wayland/wl_framebuf.c \ backend/wayland/wl_atom.c \ - backend/wayland/wl_signalfd.c + backend/wayland/wl_signalfd.c \ + backend/wayland/wl_xkb.c endif if USE_NESTED_FUNC diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index ce48e65..7d55fc7 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -6203,71 +6203,6 @@ wl_workspace_badge_update(WScreen *scr, WNativeWindow badge_win, RImage *img) wlr_output_schedule_frame(wl_state.output); } -/* ------------------------------------------------------------------ */ -/* XKB */ -/* ------------------------------------------------------------------ */ - -static WKeyCode -wl_keysym_to_keycode(unsigned long keysym) -{ - /* Phase 77: scan the XKB keymap to find the first keycode that produces - * the given keysym at any level/layout. The XKB keycode == - * evdev_scancode + 8, which equals the X11 keycode — so the values stored - * in wKeyBindings are directly compatible. - * Use the real keyboard's keymap if available; fall back to the default - * keymap created at startup (before any real keyboard arrives). */ - struct xkb_keymap *km = wl_state.xkb_keymap; - if (wl_state.keyboard_dev) { - struct wlr_keyboard *kb = wlr_keyboard_from_input_device(wl_state.keyboard_dev); - if (kb && kb->keymap) km = kb->keymap; - } - if (!km) - return 0; - - xkb_keycode_t min_kc = xkb_keymap_min_keycode(km); - xkb_keycode_t max_kc = xkb_keymap_max_keycode(km); - - for (xkb_keycode_t kc = min_kc; kc <= max_kc; kc++) { - xkb_layout_index_t nlayouts = xkb_keymap_num_layouts_for_key(km, kc); - xkb_layout_index_t layout; - for (layout = 0; layout < nlayouts; layout++) { - xkb_level_index_t nlevels = xkb_keymap_num_levels_for_key(km, kc, layout); - xkb_level_index_t level; - for (level = 0; level < nlevels; level++) { - const xkb_keysym_t *syms = NULL; - int n = xkb_keymap_key_get_syms_by_level(km, kc, layout, level, &syms); - int si; - for (si = 0; si < n; si++) { - if (syms[si] == (xkb_keysym_t)keysym) - return (WKeyCode)kc; - } - } - } - } - return 0; -} - -static unsigned long -wl_keysym_from_keycode(unsigned int keycode, unsigned int index) -{ - /* Phase 77: reverse lookup — return the keysym at the given keycode/level. */ - struct xkb_keymap *km = wl_state.xkb_keymap; - if (wl_state.keyboard_dev) { - struct wlr_keyboard *kb = wlr_keyboard_from_input_device(wl_state.keyboard_dev); - if (kb && kb->keymap) km = kb->keymap; - } - if (!km) - return 0; - const xkb_keysym_t *syms = NULL; - int n = xkb_keymap_key_get_syms_by_level(km, (xkb_keycode_t)keycode, - 0, (xkb_level_index_t)index, &syms); - if (n > 0 && syms) - return (unsigned long)syms[0]; - return 0; -} - -static void wl_xkb_lock_group(int group) { (void)group; } -static int wl_xkb_get_group(void) { return 0; } /* ------------------------------------------------------------------ */ /* Extensions / cursors / error handlers */ diff --git a/src/backend/wayland/wl_types.h b/src/backend/wayland/wl_types.h index 8269338..fffa388 100644 --- a/src/backend/wayland/wl_types.h +++ b/src/backend/wayland/wl_types.h @@ -503,3 +503,9 @@ unsigned long wl_atom_intern(const char *name); /* Signalfd module declarations (extracted to wl_signalfd.c) */ int wl_signalfd_handler(int fd, uint32_t mask, void *data); void wl_handle_inotify_events(void); + +/* XKB module declarations (extracted to wl_xkb.c) */ +WKeyCode wl_keysym_to_keycode(unsigned long keysym); +unsigned long wl_keysym_from_keycode(unsigned int keycode, unsigned int index); +void wl_xkb_lock_group(int group); +int wl_xkb_get_group(void); diff --git a/src/backend/wayland/wl_xkb.c b/src/backend/wayland/wl_xkb.c new file mode 100644 index 0000000..041887c --- /dev/null +++ b/src/backend/wayland/wl_xkb.c @@ -0,0 +1,72 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include "wl_types.h" + +/* ------------------------------------------------------------------ */ +/* XKB */ +/* ------------------------------------------------------------------ */ + +WKeyCode +wl_keysym_to_keycode(unsigned long keysym) +{ + /* Phase 77: scan the XKB keymap to find the first keycode that produces + * the given keysym at any level/layout. The XKB keycode == + * evdev_scancode + 8, which equals the X11 keycode — so the values stored + * in wKeyBindings are directly compatible. + * Use the real keyboard's keymap if available; fall back to the default + * keymap created at startup (before any real keyboard arrives). */ + struct xkb_keymap *km = wl_state.xkb_keymap; + if (wl_state.keyboard_dev) { + struct wlr_keyboard *kb = wlr_keyboard_from_input_device(wl_state.keyboard_dev); + if (kb && kb->keymap) km = kb->keymap; + } + if (!km) + return 0; + + xkb_keycode_t min_kc = xkb_keymap_min_keycode(km); + xkb_keycode_t max_kc = xkb_keymap_max_keycode(km); + + for (xkb_keycode_t kc = min_kc; kc <= max_kc; kc++) { + xkb_layout_index_t nlayouts = xkb_keymap_num_layouts_for_key(km, kc); + xkb_layout_index_t layout; + for (layout = 0; layout < nlayouts; layout++) { + xkb_level_index_t nlevels = xkb_keymap_num_levels_for_key(km, kc, layout); + xkb_level_index_t level; + for (level = 0; level < nlevels; level++) { + const xkb_keysym_t *syms = NULL; + int n = xkb_keymap_key_get_syms_by_level(km, kc, layout, level, &syms); + int si; + for (si = 0; si < n; si++) { + if (syms[si] == (xkb_keysym_t)keysym) + return (WKeyCode)kc; + } + } + } + } + return 0; +} + +unsigned long +wl_keysym_from_keycode(unsigned int keycode, unsigned int index) +{ + /* Phase 77: reverse lookup — return the keysym at the given keycode/level. */ + struct xkb_keymap *km = wl_state.xkb_keymap; + if (wl_state.keyboard_dev) { + struct wlr_keyboard *kb = wlr_keyboard_from_input_device(wl_state.keyboard_dev); + if (kb && kb->keymap) km = kb->keymap; + } + if (!km) + return 0; + const xkb_keysym_t *syms = NULL; + int n = xkb_keymap_key_get_syms_by_level(km, (xkb_keycode_t)keycode, + 0, (xkb_level_index_t)index, &syms); + if (n > 0 && syms) + return (unsigned long)syms[0]; + return 0; +} + +void wl_xkb_lock_group(int group) { (void)group; } +int wl_xkb_get_group(void) { return 0; }