[chainkeys] cancel the chain - fix issue #69

This commit is contained in:
Ben Collerson 2024-05-20 10:01:42 +10:00
parent b4f093c9cb
commit 670f010ccc
2 changed files with 24 additions and 79 deletions

View File

@ -1,12 +1,15 @@
### Description ### Description
Implements chained keybindings (like the dwm [keychain](https://dwm.suckless.org/patches/keychain/) patch). Implements chained keybindings (like the dwm
[keychain](https://dwm.suckless.org/patches/keychain/) patch).
Bindings can share a leading chain key. This chain key will be triggered when Mod+chain is pressed. A subsequent keypress will be matched against bindings for that chain key. If it is configured the action will be triggered, otherwise the keypress will be ignored.
Bindings can share a leading chain key. This chain key will be triggered when
Mod+chain is pressed. A subsequent keypress will be matched against bindings
for that chain key. If it is configured the action will be triggered, otherwise
the keypress will be ignored.
### Download ### Download
- [git branch](https://codeberg.org/bencc/dwl/src/branch/chainkeys) - [git branch](https://codeberg.org/bencc/dwl/src/branch/chainkeys)
- [2024-01-17](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/chainkeys/chainkeys.patch) - [2024-05-20](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/chainkeys/chainkeys.patch)
### Authors ### Authors
- [Ben Collerson](https://codeberg.org/bencc) - [Ben Collerson](https://codeberg.org/bencc)

View File

@ -1,15 +1,15 @@
From 8cad102fd59463e8a2238845399dcaa1f759508c Mon Sep 17 00:00:00 2001 From 226e204ec7fb6d6840a984ef8e8ec1d2514e985f Mon Sep 17 00:00:00 2001
From: Ben Collerson <benc@benc.cc> From: Ben Collerson <benc@benc.cc>
Date: Tue, 2 Jan 2024 10:33:59 +1000 Date: Tue, 2 Jan 2024 10:33:59 +1000
Subject: [PATCH 1/2] chainkeys Subject: [PATCH] chainkeys
--- ---
config.def.h | 62 ++++++++++++++++++++++++++-------------------------- config.def.h | 62 ++++++++++++++++++++++++++--------------------------
dwl.c | 22 ++++++++++++++++++- dwl.c | 23 ++++++++++++++++++-
2 files changed, 52 insertions(+), 32 deletions(-) 2 files changed, 53 insertions(+), 32 deletions(-)
diff --git a/config.def.h b/config.def.h diff --git a/config.def.h b/config.def.h
index 9009517..f4b7b2a 100644 index 8f498d2f..1c182547 100644
--- a/config.def.h --- a/config.def.h
+++ b/config.def.h +++ b/config.def.h
@@ -105,10 +105,10 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA @@ -105,10 +105,10 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA
@ -27,7 +27,7 @@ index 9009517..f4b7b2a 100644
/* helper for spawning shell commands in the pre dwm-5.0 fashion */ /* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
@@ -119,30 +119,30 @@ static const char *menucmd[] = { "bemenu-run", NULL }; @@ -119,30 +119,30 @@ static const char *menucmd[] = { "wmenu-run", NULL };
static const Key keys[] = { static const Key keys[] = {
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
@ -62,8 +62,8 @@ index 9009517..f4b7b2a 100644
+ { MODKEY, -1, XKB_KEY_k, focusstack, {.i = -1} }, + { MODKEY, -1, XKB_KEY_k, focusstack, {.i = -1} },
+ { MODKEY, -1, XKB_KEY_i, incnmaster, {.i = +1} }, + { MODKEY, -1, XKB_KEY_i, incnmaster, {.i = +1} },
+ { MODKEY, -1, XKB_KEY_d, incnmaster, {.i = -1} }, + { MODKEY, -1, XKB_KEY_d, incnmaster, {.i = -1} },
+ { MODKEY, -1, XKB_KEY_h, setmfact, {.f = -0.05} }, + { MODKEY, -1, XKB_KEY_h, setmfact, {.f = -0.05f} },
+ { MODKEY, -1, XKB_KEY_l, setmfact, {.f = +0.05} }, + { MODKEY, -1, XKB_KEY_l, setmfact, {.f = +0.05f} },
+ { MODKEY, -1, XKB_KEY_Return, zoom, {0} }, + { MODKEY, -1, XKB_KEY_Return, zoom, {0} },
+ { MODKEY, -1, XKB_KEY_Tab, view, {0} }, + { MODKEY, -1, XKB_KEY_Tab, view, {0} },
+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_C, killclient, {0} }, + { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_C, killclient, {0} },
@ -101,26 +101,26 @@ index 9009517..f4b7b2a 100644
CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
}; };
diff --git a/dwl.c b/dwl.c diff --git a/dwl.c b/dwl.c
index f25ac2f..8ffad73 100644 index bf763dfc..05e667f8 100644
--- a/dwl.c --- a/dwl.c
+++ b/dwl.c +++ b/dwl.c
@@ -139,6 +139,7 @@ typedef struct { @@ -143,6 +143,7 @@ typedef struct {
typedef struct { typedef struct {
uint32_t mod; uint32_t mod;
+ xkb_keysym_t chain; + int chain;
xkb_keysym_t keysym; xkb_keysym_t keysym;
void (*func)(const Arg *); void (*func)(const Arg *);
const Arg arg; const Arg arg;
@@ -338,6 +339,7 @@ static const char broken[] = "broken"; @@ -353,6 +354,7 @@ static const char broken[] = "broken";
static pid_t child_pid = -1; static pid_t child_pid = -1;
static int locked; static int locked;
static void *exclusive_focus; static void *exclusive_focus;
+static xkb_keysym_t chainkey = -1; +static int chainkey = -1;
static struct wl_display *dpy; static struct wl_display *dpy;
static struct wlr_backend *backend; static struct wlr_backend *backend;
static struct wlr_scene *scene; static struct wlr_scene *scene;
@@ -1363,10 +1365,28 @@ keybinding(uint32_t mods, xkb_keysym_t sym) @@ -1438,11 +1440,30 @@ keybinding(uint32_t mods, xkb_keysym_t sym)
const Key *k; const Key *k;
for (k = keys; k < END(keys); k++) { for (k = keys; k < END(keys); k++) {
if (CLEANMASK(mods) == CLEANMASK(k->mod) if (CLEANMASK(mods) == CLEANMASK(k->mod)
@ -141,75 +141,17 @@ index f25ac2f..8ffad73 100644
+ return 1; + return 1;
+ } + }
+ else if (CLEANMASK(mods) == CLEANMASK(k->mod) + else if (CLEANMASK(mods) == CLEANMASK(k->mod)
+ && k->chain == sym + && k->chain == (int)sym
+ && chainkey == -1 + && chainkey == -1
+ && k->func) { + && k->func) {
+ chainkey = sym; + chainkey = sym;
+ return 1; + return 1;
+ } + }
} }
+ chainkey = -1;
return 0; return 0;
} }
--
2.43.0
From 0b11cce166dc0daabe305622d593532407a178ed Mon Sep 17 00:00:00 2001
From: Ben Collerson <benc@benc.cc>
Date: Tue, 2 Jan 2024 10:33:59 +1000
Subject: [PATCH 2/2] fix types - signed ints should be signed.
---
config.def.h | 4 ++--
dwl.c | 6 +++---
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/config.def.h b/config.def.h
index f4b7b2a..ac70906 100644
--- a/config.def.h
+++ b/config.def.h
@@ -126,8 +126,8 @@ static const Key keys[] = {
{ MODKEY, -1, XKB_KEY_k, focusstack, {.i = -1} },
{ MODKEY, -1, XKB_KEY_i, incnmaster, {.i = +1} },
{ MODKEY, -1, XKB_KEY_d, incnmaster, {.i = -1} },
- { MODKEY, -1, XKB_KEY_h, setmfact, {.f = -0.05} },
- { MODKEY, -1, XKB_KEY_l, setmfact, {.f = +0.05} },
+ { MODKEY, -1, XKB_KEY_h, setmfact, {.f = -0.05f} },
+ { MODKEY, -1, XKB_KEY_l, setmfact, {.f = +0.05f} },
{ MODKEY, -1, XKB_KEY_Return, zoom, {0} },
{ MODKEY, -1, XKB_KEY_Tab, view, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_C, killclient, {0} },
diff --git a/dwl.c b/dwl.c
index 8ffad73..cbb9cbf 100644
--- a/dwl.c
+++ b/dwl.c
@@ -139,7 +139,7 @@ typedef struct {
typedef struct {
uint32_t mod;
- xkb_keysym_t chain;
+ int chain;
xkb_keysym_t keysym;
void (*func)(const Arg *);
const Arg arg;
@@ -339,7 +339,7 @@ static const char broken[] = "broken";
static pid_t child_pid = -1;
static int locked;
static void *exclusive_focus;
-static xkb_keysym_t chainkey = -1;
+static int chainkey = -1;
static struct wl_display *dpy;
static struct wlr_backend *backend;
static struct wlr_scene *scene;
@@ -1381,7 +1381,7 @@ keybinding(uint32_t mods, xkb_keysym_t sym)
return 1;
}
else if (CLEANMASK(mods) == CLEANMASK(k->mod)
- && k->chain == sym
+ && k->chain == (int)sym
&& chainkey == -1
&& k->func) {
chainkey = sym;
-- --
2.43.0 2.43.0