mirror of
https://codeberg.org/dwl/dwl.git
synced 2026-04-06 07:15:31 -04:00
allow use keycodes instead keysyms
This commit is contained in:
parent
4b8c1bf31e
commit
9c1bd1e2b4
3 changed files with 296 additions and 63 deletions
32
dwl.c
32
dwl.c
|
|
@ -130,7 +130,7 @@ typedef struct {
|
|||
|
||||
typedef struct {
|
||||
uint32_t mod;
|
||||
xkb_keysym_t keysym;
|
||||
xkb_keycode_t keycode;
|
||||
void (*func)(const Arg *);
|
||||
const Arg arg;
|
||||
} Key;
|
||||
|
|
@ -139,9 +139,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; /* invalid if keycode == 0 */
|
||||
struct wl_event_source *key_repeat_source;
|
||||
|
||||
struct wl_listener modifiers;
|
||||
|
|
@ -263,7 +262,7 @@ static void fullscreennotify(struct wl_listener *listener, void *data);
|
|||
static void handlesig(int signo);
|
||||
static void incnmaster(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);
|
||||
|
|
@ -1390,7 +1389,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
|
||||
|
|
@ -1401,7 +1400,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;
|
||||
}
|
||||
|
|
@ -1412,17 +1411,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);
|
||||
|
|
@ -1433,17 +1427,15 @@ keypress(struct wl_listener *listener, void *data)
|
|||
* attempt to process a compositor keybinding. */
|
||||
if (!locked && !input_inhibit_mgr->active_inhibitor
|
||||
&& 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);
|
||||
}
|
||||
|
||||
|
|
@ -1478,15 +1470,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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue