use keycodes instead keysyms

This commit is contained in:
Leonardo Hernández Hernández 2021-06-04 16:51:01 -05:00 committed by Leonardo Hernández Hernández
parent be39a5d7e8
commit c64230b9f6
No known key found for this signature in database
GPG key ID: E538897EE11B9624
3 changed files with 298 additions and 83 deletions

32
dwl.c
View file

@ -142,7 +142,7 @@ typedef struct {
typedef struct {
uint32_t mod;
xkb_keysym_t keysym;
xkb_keycode_t keycode;
void (*func)(const Arg *);
const Arg arg;
} Key;
@ -151,9 +151,8 @@ typedef struct {
struct wl_list link;
struct wlr_keyboard *wlr_keyboard;
int nsyms;
const xkb_keysym_t *keysyms; /* invalid if nsyms == 0 */
uint32_t mods; /* invalid if nsyms == 0 */
xkb_keycode_t keycode;
uint32_t mods;
struct wl_event_source *key_repeat_source;
struct wl_listener modifiers;
@ -313,7 +312,7 @@ static void incogaps(const Arg *arg);
static void incohgaps(const Arg *arg);
static void incovgaps(const Arg *arg);
static void inputdevice(struct wl_listener *listener, void *data);
static int keybinding(uint32_t mods, xkb_keysym_t sym);
static int keybinding(uint32_t mods, xkb_keycode_t keycode);
static void keypress(struct wl_listener *listener, void *data);
static void keypressmod(struct wl_listener *listener, void *data);
static int keyrepeat(void *data);
@ -1851,7 +1850,7 @@ inputdevice(struct wl_listener *listener, void *data)
}
int
keybinding(uint32_t mods, xkb_keysym_t sym)
keybinding(uint32_t mods, xkb_keycode_t keycode)
{
/*
* Here we handle compositor keybindings. This is when the compositor is
@ -1862,7 +1861,7 @@ keybinding(uint32_t mods, xkb_keysym_t sym)
const Key *k;
for (k = keys; k < END(keys); k++) {
if (CLEANMASK(mods) == CLEANMASK(k->mod) &&
sym == k->keysym && k->func) {
keycode == k->keycode && k->func) {
k->func(&k->arg);
handled = 1;
}
@ -1873,17 +1872,12 @@ keybinding(uint32_t mods, xkb_keysym_t sym)
void
keypress(struct wl_listener *listener, void *data)
{
int i;
/* This event is raised when a key is pressed or released. */
Keyboard *kb = wl_container_of(listener, kb, key);
struct wlr_keyboard_key_event *event = data;
/* Translate libinput keycode -> xkbcommon */
uint32_t keycode = event->keycode + 8;
/* Get a list of keysyms based on the keymap for this keyboard */
const xkb_keysym_t *syms;
int nsyms = xkb_state_key_get_syms(
kb->wlr_keyboard->xkb_state, keycode, &syms);
int handled = 0;
uint32_t mods = wlr_keyboard_get_modifiers(kb->wlr_keyboard);
@ -1893,17 +1887,15 @@ keypress(struct wl_listener *listener, void *data)
/* On _press_ if there is no active screen locker,
* attempt to process a compositor keybinding. */
if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED)
for (i = 0; i < nsyms; i++)
handled = keybinding(mods, syms[i]) || handled;
handled = keybinding(mods, keycode);
if (handled && kb->wlr_keyboard->repeat_info.delay > 0) {
kb->mods = mods;
kb->keysyms = syms;
kb->nsyms = nsyms;
kb->keycode = keycode;
wl_event_source_timer_update(kb->key_repeat_source,
kb->wlr_keyboard->repeat_info.delay);
} else {
kb->nsyms = 0;
kb->keycode = 0;
wl_event_source_timer_update(kb->key_repeat_source, 0);
}
@ -1938,15 +1930,13 @@ int
keyrepeat(void *data)
{
Keyboard *kb = data;
int i;
if (!kb->nsyms || kb->wlr_keyboard->repeat_info.rate <= 0)
if (!kb->keycode || kb->wlr_keyboard->repeat_info.rate <= 0)
return 0;
wl_event_source_timer_update(kb->key_repeat_source,
1000 / kb->wlr_keyboard->repeat_info.rate);
for (i = 0; i < kb->nsyms; i++)
keybinding(kb->mods, kb->keysyms[i]);
keybinding(kb->mods, kb->keycode);
return 0;
}