diff options
author | Benjamin Chausse <benjamin@chausse.xyz> | 2024-07-22 23:42:31 -0400 |
---|---|---|
committer | Benjamin Chausse <benjamin@chausse.xyz> | 2024-07-22 23:42:31 -0400 |
commit | 52dbf2ca1507269447c4716502e313788b66135b (patch) | |
tree | b03a8463dc2d4d291d91687a34bd041453ebfb11 | |
parent | bd59573f07f27fff7870a1e1a70e72493bb42453 (diff) |
Implement togglekblayoutandoptions patch
https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/togglekblayoutandoptions
-rw-r--r-- | config.def.h | 16 | ||||
-rw-r--r-- | dwl.c | 23 |
2 files changed, 32 insertions, 7 deletions
diff --git a/config.def.h b/config.def.h index 22d2171..1f00009 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,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), @@ -335,6 +335,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); @@ -404,6 +405,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 */ @@ -890,7 +892,7 @@ createkeyboardgroup(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"); @@ -2667,6 +2669,25 @@ startdrag(struct wl_listener *listener, void *data) } 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) { Client *sel = focustop(selmon); |