decompose wl_backend.c: extract wl_xkb.c
This commit is contained in:
parent
ba7b7de898
commit
0878f6946d
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
Loading…
Reference in New Issue