Download raw body.
New 'swap-mods' option patch for cwm to swap modifier keys
On Wed 2024.04.10 at 19:13 +0000, ZenitDS wrote:
> Hello,
>
> I believe currently there is no possibility to change the modifier keys used
> for the default keybindings. This means that if you want to use the Mod4 key
> instead of Meta, you must unbind all the respective keys and remap them. With
> this new option you can achieve it in a simple way. Use case for this arrives
> when you want to use the Alt key for your applications, and move the default
> Meta modifier to Mod4 for example.
>
> Example of configuration:
> # Swap Meta with Mod4 and Control with Shift
> swap-mods MC 4S
Something like this has been proposed in the past, but why do this at the
window manager layer and not in your x session (i.e. via xmodmap)?
> Here is the patch:
>
> Index: cwmrc.5
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/cwmrc.5,v
> retrieving revision 1.78
> diff -u -p -r1.78 cwmrc.5
> --- cwmrc.5 20 Jul 2023 14:39:34 -0000 1.78
> +++ cwmrc.5 10 Apr 2024 19:02:53 -0000
> @@ -207,6 +207,16 @@ The default behavior for new windows is
> By enabling sticky group mode,
> .Xr cwm 1
> will assign new windows to the currently selected group.
> +.It Ic swap-mods Ar mods1 mods2
> +Swap modifiers for mouse and keyboard. Modifiers in
> +.Ar mods1
> +are swapped with
> +.Ar mods2
> +in order. The same modifiers are recognised as for
> +.Ar key
> +in
> +.Nm bind-key .
> +.Pp
> .It Ic unbind-key Ar key
> Unbind function bound to
> .Ar key .
> @@ -498,6 +508,9 @@ unbind-key CMS-equal
> # Mouse bindings
> bind-mouse M-2 window-lower
> bind-mouse M-3 window-resize
> +
> +# Swap Meta with Mod4 and Shift with Control
> +swap-mods MS 4C
> .Ed
> .Sh SEE ALSO
> .Xr cwm 1
> Index: conf.c
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/conf.c,v
> retrieving revision 1.256
> diff -u -p -r1.256 conf.c
> --- conf.c 20 Jul 2023 14:39:34 -0000 1.256
> +++ conf.c 10 Apr 2024 19:02:53 -0000
> @@ -665,6 +665,46 @@ conf_unbind_mouse(struct conf *c, struct
> }
> }
>
> +int
> +conf_swap_mods(struct conf *c, const char *mods1, const char *mods2)
> +{
> + struct bind_ctx *bind = NULL;
> + unsigned int i;
> + unsigned int mask1, mask2;
> +
> + if (strlen(mods1) != strlen(mods2))
> + return 0;
> +
> + for (;*mods1; ++mods1, ++mods2) {
> + mask1 = mask2= 0;
> + for (i = 0; i < nitems(bind_mods); ++i) {
> + if (bind_mods[i].ch == *mods1)
> + mask1 = bind_mods[i].mask;
> + if (bind_mods[i].ch == *mods2)
> + mask2 = bind_mods[i].mask;
> + }
> +
> + if (!mask1 || !mask2)
> + return 0;
> +
> + TAILQ_FOREACH(bind, &c->keybindq, entry) {
> + bind->modmask =
> + (bind->modmask & ~(mask1 | mask2)) |
> + ((bind->modmask & mask1) ? mask2 : 0) |
> + ((bind->modmask & mask2) ? mask1 : 0);
> + }
> +
> + TAILQ_FOREACH(bind, &c->mousebindq, entry) {
> + bind->modmask =
> + (bind->modmask & ~(mask1 | mask2)) |
> + ((bind->modmask & mask1) ? mask2 : 0) |
> + ((bind->modmask & mask2) ? mask1 : 0);
> + }
> + }
> +
> + return 1;
> +}
> +
> void
> conf_grab_kbd(Window win)
> {
> Index: calmwm.h
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/calmwm.h,v
> retrieving revision 1.379
> diff -u -p -r1.379 calmwm.h
> --- calmwm.h 20 Jul 2023 14:39:34 -0000 1.379
> +++ calmwm.h 10 Apr 2024 19:02:53 -0000
> @@ -543,6 +543,8 @@ int conf_bind_key(struct conf *, cons
> const char *);
> int conf_bind_mouse(struct conf *, const char *,
> const char *);
> +int conf_swap_mods(struct conf *, const char*,
> + const char *);
> void conf_clear(struct conf *);
> void conf_client(struct client_ctx *);
> void conf_cmd_add(struct conf *, const char *,
> Index: parse.y
> ===================================================================
> RCS file: /cvs/xenocara/app/cwm/parse.y,v
> retrieving revision 1.75
> diff -u -p -r1.75 parse.y
> --- parse.y 24 Dec 2021 16:00:47 -0000 1.75
> +++ parse.y 10 Apr 2024 19:02:53 -0000
> @@ -68,7 +68,7 @@ typedef struct {
>
> %}
>
> -%token BINDKEY UNBINDKEY BINDMOUSE UNBINDMOUSE
> +%token BINDKEY UNBINDKEY BINDMOUSE UNBINDMOUSE SWAPMODS
> %token FONTNAME STICKY GAP
> %token AUTOGROUP COMMAND IGNORE WM
> %token YES NO BORDERWIDTH MOVEAMOUNT HTILE VTILE
> @@ -256,6 +256,16 @@ main : FONTNAME STRING {
> }
> free($2);
> }
> + | SWAPMODS numberstring numberstring {
> + if (!conf_swap_mods(conf, $2, $3)) {
> + yyerror("invalid swap-mods: %s %s", $2, $3);
> + free($2);
> + free($3);
> + YYERROR;
> + }
> + free($2);
> + free($3);
> + }
> ;
>
> color : COLOR colors
> @@ -351,6 +361,7 @@ lookup(char *s)
> { "selfont", FONTSELCOLOR},
> { "snapdist", SNAPDIST},
> { "sticky", STICKY},
> + { "swap-mods", SWAPMODS},
> { "unbind-key", UNBINDKEY},
> { "unbind-mouse", UNBINDMOUSE},
> { "ungroupborder", UNGROUPBORDER},
>
>
New 'swap-mods' option patch for cwm to swap modifier keys