decompose wl_backend.c: extract wl_xkb.c

This commit is contained in:
Window Maker 2026-06-02 11:06:53 +02:00
parent ba7b7de898
commit 0878f6946d
4 changed files with 80 additions and 66 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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);

View File

@ -0,0 +1,72 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <wlr/types/wlr_keyboard.h>
#include <xkbcommon/xkbcommon.h>
#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; }