From 813b425117d5a7e4ee99f5ec7a59a4b8fe158fc6 Mon Sep 17 00:00:00 2001 From: LaKato Date: Wed, 12 Mar 2025 16:35:16 -0400 Subject: [PATCH] Revive togglekblayoutandoptions Changes: - Updated for v0.7 - incxkbrules now uses its argument (value to increment by) - A new setxkbrules function has been added - Keyboard groups are no longer looped over because only one is created --- patches/togglekblayoutandoptions/README.md | 9 + .../togglekblayoutandoptions.patch | 160 ++++++++++++++++++ .../togglekblayoutandoptions/README.md | 8 - .../togglekblayoutandoptions.patch | 102 ----------- 4 files changed, 169 insertions(+), 110 deletions(-) create mode 100644 patches/togglekblayoutandoptions/README.md create mode 100644 patches/togglekblayoutandoptions/togglekblayoutandoptions.patch delete mode 100644 stale-patches/togglekblayoutandoptions/README.md delete mode 100644 stale-patches/togglekblayoutandoptions/togglekblayoutandoptions.patch diff --git a/patches/togglekblayoutandoptions/README.md b/patches/togglekblayoutandoptions/README.md new file mode 100644 index 0000000..883dd6d --- /dev/null +++ b/patches/togglekblayoutandoptions/README.md @@ -0,0 +1,9 @@ +### Description +Switch between multiple keyboard layouts, variants, and options at runtime. + +### Download +- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch) + +### Authors +- [LaKato](https://codeberg.org/LaKato) +- [dev-gm](https://codeberg.org/dev-gm) diff --git a/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch b/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch new file mode 100644 index 0000000..dc7fd81 --- /dev/null +++ b/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch @@ -0,0 +1,160 @@ +From 9ee76adc7c6567650e7b34273f953fed03191c05 Mon Sep 17 00:00:00 2001 +From: LaKato +Date: Sat, 8 Mar 2025 12:14:41 -0500 +Subject: [PATCH] Update for v0.7 + +Additional changes: +- incxkbrules now uses its argument +- A new setxkbrules function has been added +- Keyboard groups are no longer looped over because only one is created +--- + config.def.h | 17 +++++++++++------ + dwl.c | 44 +++++++++++++++++++++++++++++++++----------- + 2 files changed, 44 insertions(+), 17 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 22d2171..b3b4699 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -52,12 +52,15 @@ static const MonitorRule monrules[] = { + }; + + /* keyboard */ +-static const struct xkb_rule_names xkb_rules = { +- /* can specify fields: rules, model, layout, variant, options */ +- /* example: +- .options = "ctrl:nocaps", +- */ +- .options = NULL, ++static const struct xkb_rule_names xkb_rules[] = { ++ { ++ .layout = "us", ++ }, ++ /*{ ++ .layout = "us", ++ .variant = "dvp", ++ .options = "compose:102,numpad:shift3,kpdl:semi,keypad:atm,caps:super" ++ }*/ + }; + + static const int repeat_rate = 25; +@@ -148,6 +151,8 @@ static const Key keys[] = { + { 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} }, ++ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_A, incxkbrules, {.i = +1} }, ++ /*{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_E, setxkbrules, {.i = +1} },*/ + TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), + TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), + TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), +diff --git a/dwl.c b/dwl.c +index a2711f6..a2413e9 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -249,6 +249,7 @@ static void arrange(Monitor *m); + static void arrangelayer(Monitor *m, struct wl_list *list, + struct wlr_box *usable_area, int exclusive); + static void arrangelayers(Monitor *m); ++static void assignkeymap(struct wlr_keyboard *keyboard); + static void axisnotify(struct wl_listener *listener, void *data); + static void buttonpress(struct wl_listener *listener, void *data); + static void chvt(const Arg *arg); +@@ -293,6 +294,7 @@ static void fullscreennotify(struct wl_listener *listener, void *data); + static void gpureset(struct wl_listener *listener, void *data); + static void handlesig(int signo); + static void incnmaster(const Arg *arg); ++static void incxkbrules(const Arg *arg); + static void inputdevice(struct wl_listener *listener, void *data); + static int keybinding(uint32_t mods, xkb_keysym_t sym); + static void keypress(struct wl_listener *listener, void *data); +@@ -333,6 +335,7 @@ static void setmon(Client *c, Monitor *m, uint32_t newtags); + static void setpsel(struct wl_listener *listener, void *data); + static void setsel(struct wl_listener *listener, void *data); + static void setup(void); ++static void setxkbrules(const Arg *arg); + static void spawn(const Arg *arg); + static void startdrag(struct wl_listener *listener, void *data); + static void tag(const Arg *arg); +@@ -404,6 +407,7 @@ static struct wl_listener lock_listener = {.notify = locksession}; + + static struct wlr_seat *seat; + static KeyboardGroup *kb_group; ++static unsigned int kblayout = 0; + static unsigned int cursor_mode; + static Client *grabc; + static int grabcx, grabcy; /* client-relative */ +@@ -580,6 +584,20 @@ arrangelayers(Monitor *m) + } + } + ++void ++assignkeymap(struct wlr_keyboard *keyboard) { ++ struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); ++ struct xkb_keymap *keymap = xkb_keymap_new_from_names(context, &xkb_rules[kblayout], ++ XKB_KEYMAP_COMPILE_NO_FLAGS); ++ ++ if (!keymap) ++ die("failed to compile keymap"); ++ ++ wlr_keyboard_set_keymap(keyboard, keymap); ++ xkb_keymap_unref(keymap); ++ xkb_context_unref(context); ++} ++ + void + axisnotify(struct wl_listener *listener, void *data) + { +@@ -885,21 +903,11 @@ KeyboardGroup * + createkeyboardgroup(void) + { + KeyboardGroup *group = ecalloc(1, sizeof(*group)); +- struct xkb_context *context; +- struct xkb_keymap *keymap; + + group->wlr_group = wlr_keyboard_group_create(); + group->wlr_group->data = group; + +- /* Prepare an XKB keymap and assign it to the keyboard group. */ +- context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); +- if (!(keymap = xkb_keymap_new_from_names(context, &xkb_rules, +- XKB_KEYMAP_COMPILE_NO_FLAGS))) +- die("failed to compile keymap"); +- +- wlr_keyboard_set_keymap(&group->wlr_group->keyboard, keymap); +- xkb_keymap_unref(keymap); +- xkb_context_unref(context); ++ assignkeymap(&group->wlr_group->keyboard); + + wlr_keyboard_set_repeat_info(&group->wlr_group->keyboard, repeat_rate, repeat_delay); + +@@ -1524,6 +1532,13 @@ incnmaster(const Arg *arg) + arrange(selmon); + } + ++void ++incxkbrules(const Arg *arg) ++{ ++ kblayout = (kblayout + arg->i) % LENGTH(xkb_rules); ++ assignkeymap(&kb_group->wlr_group->keyboard); ++} ++ + void + inputdevice(struct wl_listener *listener, void *data) + { +@@ -2645,6 +2660,13 @@ setup(void) + #endif + } + ++void ++setxkbrules(const Arg *arg) ++{ ++ kblayout = arg->i; ++ assignkeymap(&kb_group->wlr_group->keyboard); ++} ++ + void + spawn(const Arg *arg) + { +-- +2.48.1 + diff --git a/stale-patches/togglekblayoutandoptions/README.md b/stale-patches/togglekblayoutandoptions/README.md deleted file mode 100644 index 479e555..0000000 --- a/stale-patches/togglekblayoutandoptions/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Switch between multiple keyboard layouts, variants, and options at runtime. - -### Download -- [2024-03-15](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch) - -### Authors -- [dev-gm](https://codeberg.org/dev-gm) diff --git a/stale-patches/togglekblayoutandoptions/togglekblayoutandoptions.patch b/stale-patches/togglekblayoutandoptions/togglekblayoutandoptions.patch deleted file mode 100644 index 4b7da6b..0000000 --- a/stale-patches/togglekblayoutandoptions/togglekblayoutandoptions.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 4ba551f0f3837ccc2241f99665f0566c5af6dab9 Mon Sep 17 00:00:00 2001 -From: Gavin M -Date: Fri, 15 Mar 2024 16:56:53 -0500 -Subject: [PATCH] Togglekblayoutandoptions patch - ---- - config.def.h | 16 ++++++++++------ - dwl.c | 23 ++++++++++++++++++++++- - 2 files changed, 32 insertions(+), 7 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9009517..1583932 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -48,12 +48,15 @@ static const MonitorRule monrules[] = { - }; - - /* keyboard */ --static const struct xkb_rule_names xkb_rules = { -- /* can specify fields: rules, model, layout, variant, options */ -- /* example: -- .options = "ctrl:nocaps", -- */ -- .options = NULL, -+static const struct xkb_rule_names xkb_rules[] = { -+ { -+ .layout = "us" -+ }, -+ /*{ -+ .layout = "us", -+ .variant = "dvp", -+ .options = "compose:102,numpad:shift3,kpdl:semi,keypad:atm,caps:super" -+ }*/ - }; - - static const int repeat_rate = 25; -@@ -143,6 +146,7 @@ static const Key keys[] = { - { 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} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_A, incxkbrules, {.i = +1} }, - TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), - TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), - TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), -diff --git a/dwl.c b/dwl.c -index 5867b0c..ef4e605 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -327,6 +327,7 @@ static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); -+static void incxkbrules(const Arg *arg); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -@@ -395,6 +396,7 @@ static struct wl_listener lock_listener = {.notify = locksession}; - static struct wlr_seat *seat; - static KeyboardGroup kb_group = {0}; - static KeyboardGroup vkb_group = {0}; -+static unsigned int kblayout = 0; - static struct wlr_surface *held_grab; - static unsigned int cursor_mode; - static Client *grabc; -@@ -2470,7 +2472,7 @@ setup(void) - - /* Prepare an XKB keymap and assign it to the keyboard group. */ - context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); -- if (!(keymap = xkb_keymap_new_from_names(context, &xkb_rules, -+ if (!(keymap = xkb_keymap_new_from_names(context, &xkb_rules[kblayout], - XKB_KEYMAP_COMPILE_NO_FLAGS))) - die("failed to compile keymap"); - -@@ -2548,6 +2550,25 @@ startdrag(struct wl_listener *listener, void *data) - LISTEN_STATIC(&drag->icon->events.destroy, destroydragicon); - } - -+void -+incxkbrules(const Arg *arg) -+{ -+ KeyboardGroup *group; -+ struct wlr_keyboard_group *wlr_group; -+ const struct xkb_rule_names newrule = xkb_rules[(kblayout + 1) % LENGTH(xkb_rules)]; -+ -+ wl_list_for_each(group, &kb_group.link, link) { -+ wl_list_for_each(wlr_group, &group->wlr_group->keys, keys) { -+ struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); -+ struct xkb_keymap *keymap = xkb_map_new_from_names(context, &newrule, -+ XKB_KEYMAP_COMPILE_NO_FLAGS); -+ wlr_keyboard_set_keymap(&wlr_group->keyboard, keymap); -+ xkb_keymap_unref(keymap); -+ xkb_context_unref(context); -+ } -+ } -+} -+ - void - tag(const Arg *arg) - { --- -2.44.0 -