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

View file

@ -126,11 +126,11 @@ static const char *const autostart[] = {
/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */
#define MODKEY WLR_MODIFIER_ALT
#define TAGKEYS(KEY,SKEY,TAG) \
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} }
{ MODKEY|WLR_MODIFIER_SHIFT, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,KEY,toggletag, {.ui = 1 << TAG} }
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
@ -139,68 +139,51 @@ static const char *const autostart[] = {
static const char *termcmd[] = { "foot", NULL };
static const char *menucmd[] = { "bemenu-run", NULL };
#include "keys.h"
static const Key keys[] = {
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
/* modifier key function argument */
{ MODKEY, XKB_KEY_p, spawn, {.v = menucmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} },
{ MODKEY, XKB_KEY_j, focusstack, {.i = +1} },
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
{ MODKEY, XKB_KEY_i, incnmaster, {.i = +1} },
{ MODKEY, XKB_KEY_d, incnmaster, {.i = -1} },
{ MODKEY, XKB_KEY_h, setmfact, {.f = -0.05} },
{ MODKEY, XKB_KEY_l, setmfact, {.f = +0.05} },
{ MODKEY, XKB_KEY_o, setopacity, {.f = +0.1} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, setopacity, {.f = -0.1} },
{ MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_h, incgaps, {.i = +1 } },
{ MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_l, incgaps, {.i = -1 } },
{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_H, incogaps, {.i = +1 } },
{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_L, incogaps, {.i = -1 } },
{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL, XKB_KEY_h, incigaps, {.i = +1 } },
{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL, XKB_KEY_l, incigaps, {.i = -1 } },
{ MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_0, togglegaps, {0} },
{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_parenright,defaultgaps, {0} },
{ MODKEY, XKB_KEY_y, incihgaps, {.i = +1 } },
{ MODKEY, XKB_KEY_o, incihgaps, {.i = -1 } },
{ MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_y, incivgaps, {.i = +1 } },
{ MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_o, incivgaps, {.i = -1 } },
{ MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_y, incohgaps, {.i = +1 } },
{ MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_o, incohgaps, {.i = -1 } },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Y, incovgaps, {.i = +1 } },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, incovgaps, {.i = -1 } },
{ MODKEY, XKB_KEY_Return, zoom, {0} },
{ MODKEY, XKB_KEY_Tab, view, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} },
{ MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} },
{ MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_comma, cyclelayout, {.i = -1 } },
{ MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_period, cyclelayout, {.i = +1 } },
{ MODKEY, XKB_KEY_space, setlayout, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} },
{ MODKEY, XKB_KEY_e, togglefullscreen, {0} },
{ MODKEY, XKB_KEY_0, view, {.ui = ~0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} },
{ MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} },
TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0),
TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1),
TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2),
TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3),
TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4),
TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5),
TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6),
TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7),
TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8),
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} },
/* modifier key function argument */
{ MODKEY, Key_p, spawn, {.v = menucmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, Key_Return, spawn, {.v = termcmd} },
{ MODKEY, Key_j, focusstack, {.i = +1} },
{ MODKEY, Key_k, focusstack, {.i = -1} },
{ MODKEY, Key_i, incnmaster, {.i = +1} },
{ MODKEY, Key_d, incnmaster, {.i = -1} },
{ MODKEY, Key_h, setmfact, {.f = -0.05} },
{ MODKEY, Key_l, setmfact, {.f = +0.05} },
{ MODKEY, Key_Return, zoom, {0} },
{ MODKEY, Key_Tab, view, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, Key_c, killclient, {0} },
{ MODKEY, Key_o, setopacity, {.f = +0.1} },
{ MODKEY|WLR_MODIFIER_SHIFT, Key_o, setopacity, {.f = -0.1} },
{ MODKEY, Key_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, Key_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, Key_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, Key_space, setlayout, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, Key_space, togglefloating, {0} },
{ MODKEY, Key_e, togglefullscreen, {0} },
{ MODKEY, Key_0, view, {.ui = ~0} },
{ MODKEY|WLR_MODIFIER_SHIFT, Key_0, tag, {.ui = ~0} },
{ MODKEY, Key_comma, focusmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY, Key_period, focusmon, {.i = WLR_DIRECTION_RIGHT} },
{ MODKEY|WLR_MODIFIER_SHIFT, Key_comma, tagmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY|WLR_MODIFIER_SHIFT, Key_period, tagmon, {.i = WLR_DIRECTION_RIGHT} },
TAGKEYS( Key_1, 0),
TAGKEYS( Key_2, 1),
TAGKEYS( Key_3, 2),
TAGKEYS( Key_4, 3),
TAGKEYS( Key_5, 4),
TAGKEYS( Key_6, 5),
TAGKEYS( Key_7, 6),
TAGKEYS( Key_8, 7),
TAGKEYS( Key_9, 8),
{ MODKEY|WLR_MODIFIER_SHIFT, Key_q, quit, {0} },
/* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */
{ WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} },
#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} }
CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
{ WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,Key_BackSpace, quit, {0} },
#define CHVT(KEY,n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT, KEY, chvt, {.ui = (n)} }
CHVT(Key_F1, 1), CHVT(Key_F2, 2), CHVT(Key_F3, 3), CHVT(Key_F4, 4),
CHVT(Key_F5, 5), CHVT(Key_F6, 6), CHVT(Key_F7, 7), CHVT(Key_F8, 8),
CHVT(Key_F9, 9), CHVT(Key_F10, 10), CHVT(Key_F11, 11), CHVT(Key_F12, 12),
};
static const Button buttons[] = {

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;
}

242
keys.h Normal file
View file

@ -0,0 +1,242 @@
/* You can use the macros within this file
* instead of search the keycodes yourself
* with wev or something like that
* Also probably you search this:
* Key_XF86AudioMute
* Key_XF86AudioLowerVolume
* Key_XF86AudioRaiseVolume
* Key_XF86MonBrightnessDown
* Key_XF86MonBrightnessUp
*/
#define Key_Escape 9
#define Key_1 10
#define Key_2 11
#define Key_3 12
#define Key_4 13
#define Key_5 14
#define Key_6 15
#define Key_7 16
#define Key_8 17
#define Key_9 18
#define Key_0 19
#define Key_minus 20
#define Key_equal 21
#define Key_BackSpace 22
#define Key_Tab 23
#define Key_q 24
#define Key_w 25
#define Key_e 26
#define Key_r 27
#define Key_t 28
#define Key_y 29
#define Key_u 30
#define Key_i 31
#define Key_o 32
#define Key_p 33
#define Key_bracketleft 34
#define Key_bracketright 35
#define Key_Return 36
#define Key_Control_L 37
#define Key_a 38
#define Key_s 39
#define Key_d 40
#define Key_f 41
#define Key_g 42
#define Key_h 43
#define Key_j 44
#define Key_k 45
#define Key_l 46
#define Key_semicolon 47
#define Key_apostrophe 48
#define Key_grave 49
#define Key_Shift_L 50
#define Key_backslash 51
#define Key_z 52
#define Key_x 53
#define Key_c 54
#define Key_v 55
#define Key_b 56
#define Key_n 57
#define Key_m 58
#define Key_comma 59
#define Key_period 60
#define Key_slash 61
#define Key_Shift_R 62
#define Key_KP_Multiply 63
#define Key_Alt_L 64
#define Key_space 65
#define Key_Caps_Lock 66
#define Key_F1 67
#define Key_F2 68
#define Key_F3 69
#define Key_F4 70
#define Key_F5 71
#define Key_F6 72
#define Key_F7 73
#define Key_F8 74
#define Key_F9 75
#define Key_F10 76
#define Key_Num_Lock 77
#define Key_Scroll_Lock 78
#define Key_KP_Home 79
#define Key_KP_7 Key_KP_Home
#define Key_KP_Up 80
#define Key_KP_8 Key_KP_Up
#define Key_KP_Prior 81
#define Key_KP_9 Key_KP_Prior
#define Key_KP_Subtract 82
#define Key_KP_Left 83
#define Key_KP_4 Key_KP_Left
#define Key_KP_Begin 84
#define Key_KP_5 Key_KP_Begin
#define Key_KP_Right 85
#define Key_KP_6 Key_KP_Right
#define Key_KP_Add 86
#define Key_KP_End 87
#define Key_KP_1 Key_KP_End
#define Key_KP_Down 88
#define Key_KP_2 Key_KP_Down
#define Key_KP_Next 89
#define Key_KP_3 Key_KP_Next
#define Key_KP_Insert 90
#define Key_KP_0 Key_KP_Insert
#define Key_KP_Delete 91
#define Key_KP_Period Key_KP_Insert
#define Key_ISO_Level3_Shift 92
#define Key_less 94
#define Key_F11 95
#define Key_F12 96
#define Key_Katakana 98
#define Key_Hiragana 99
#define Key_Henkan_Mode 100
#define Key_Hiragana_Katakana 101
#define Key_Muhenkan 102
#define Key_KP_Enter 104
#define Key_Control_R 105
#define Key_KP_Divide 106
#define Key_Print 107
#define Key_Alt_R 108
#define Key_Linefeed 109
#define Key_Home 110
#define Key_Up 111
#define Key_Prior 112
#define Key_Left 113
#define Key_Right 114
#define Key_End 115
#define Key_Down 116
#define Key_Next 117
#define Key_Insert 118
#define Key_Delete 119
#define Key_XF86AudioMute 121
#define Key_XF86AudioLowerVolume 122
#define Key_XF86AudioRaiseVolume 123
#define Key_XF86PowerOff 124
#define Key_KP_Equal 125
#define Key_plusminus 126
#define Key_Pause 127
#define Key_XF86LaunchA 128
#define Key_KP_Decimal 129
#define Key_Hangul 130
#define Key_Hangul_Hanja 131
#define Key_Super_L 133
#define Key_Super_R 134
#define Key_Menu 135
#define Key_Cancel 136
#define Key_Redo 137
#define Key_SunProps 138
#define Key_Undo 139
#define Key_SunFront 140
#define Key_XF86Copy 141
#define Key_XF86Open 142
#define Key_XF86Paste 143
#define Key_Find 144
#define Key_XF86Cut 145
#define Key_Help 146
#define Key_XF86MenuKB 147
#define Key_XF86Calculator 148
#define Key_XF86Sleep 150
#define Key_XF86WakeUp 151
#define Key_XF86Explorer 152
#define Key_XF86Send 153
#define Key_XF86Xfer 155
#define Key_XF86Launch1 156
#define Key_XF86Launch2 157
#define Key_XF86WWW 158
#define Key_XF86DOS 159
#define Key_XF86ScreenSaver 160
#define Key_XF86RotateWindows 161
#define Key_XF86TaskPane 162
#define Key_XF86Mail 163
#define Key_XF86Favorites 164
#define Key_XF86MyComputer 165
#define Key_XF86Back 166
#define Key_XF86Forward 167
#define Key_XF86Eject1 169
#define Key_XF86Eject2 170
#define Key_XF86AudioNext 171
#define Key_XF86AudioPlay 172
#define Key_XF86AudioPrev 173
#define Key_XF86AudioStop 174
#define Key_XF86AudioRecord 175
#define Key_XF86AudioRewind 176
#define Key_XF86Phone 177
#define Key_XF86Tools 179
#define Key_XF86HomePage 180
#define Key_XF86Reload 181
#define Key_XF86Close 182
#define Key_XF86ScrollUp 185
#define Key_XF86ScrollDown 186
#define Key_parenleft 187
#define Key_parenright 188
#define Key_XF86New 189
#define Key_Redo2 190
#define Key_XF86Tools2 191
#define Key_XF86Launch5 192
#define Key_XF86Launch6 193
#define Key_XF86Launch7 194
#define Key_XF86Launch8 195
#define Key_XF86Launch9 196
#define Key_XF86AudioMicMute 198
#define Key_XF86TouchpadToggle 199
#define Key_XF86TouchpadOn 200
#define Key_XF86TouchpadOff 201
#define Key_Mode_switch 203
#define Key_XF86AudioPlay2 208
#define Key_XF86AudioPause 209
#define Key_XF86Launch3 210
#define Key_XF86Launch4 211
#define Key_XF86LaunchB 212
#define Key_XF86Suspend 213
#define Key_XF86Close2 214
#define Key_XF86AudioPlay3 215
#define Key_XF86AudioForward 216
#define Key_Print2 218
#define Key_XF86WebCam 220
#define Key_XF86AudioPreset 221
#define Key_XF86Mail2 223
#define Key_XF86Messenger 224
#define Key_XF86Search 225
#define Key_XF86Go 226
#define Key_XF86Finance 227
#define Key_XF86Game 228
#define Key_XF86Shop 229
#define Key_Cancel2 231
#define Key_XF86MonBrightnessDown 232
#define Key_XF86MonBrightnessUp 233
#define Key_XF86AudioMedia 234
#define Key_XF86Display 235
#define Key_XF86KbdLightOnOff 236
#define Key_XF86KbdBrightnessDown 237
#define Key_XF86KbdBrightnessUp 238
#define Key_XF86Send2 239
#define Key_XF86Reply 240
#define Key_XF86MailForward 241
#define Key_XF86Save 242
#define Key_XF86Documents 243
#define Key_XF86Battery 244
#define Key_XF86Bluetooth 245
#define Key_XF86WLAN 246
#define Key_XF86MonBrightnessCycle 251
#define Key_XF86WWAN 254
#define Key_XF86RFKill 255