diff options
Diffstat (limited to '_.md')
-rw-r--r-- | _.md | 101 |
1 files changed, 101 insertions, 0 deletions
@@ -0,0 +1,101 @@ +# Sway keysym + +Under the [Sway](https://swaywm.org/) Wayland compositor, we could set +set `xkb_layout` and `xkb_options` for keyboards in order to do weird +key mapping related things. Many people use `caps:ctrl_modifier` and +`caps:escape` in `xkb_options` (see +[xkeyboard-config(7)](https://man.openbsd.org/xkeyboard-config) for +other options) to make Caps Lock function as an extra Ctrl or Esc key. + +If all you want to do is do a relatively common modification like that, +chances are that `xkb_variant` and `xkb_options` already has what you +want, and you should just set that. + +------------------------------------------------------------------------ + +But if what you want isn't covered in the standard XKB files, hear my +story. I personally wanted Caps Lock to function as an additional Shift +key, which isn't covered in `xkb_options`. (`caps:shift` doesn't differ +much from normal Caps Lock, make it confusingly documented and doesn't +make the Caps Lock function as an extra Shift.) + +On X11, I would simply use `xmodmap -e "keysym Caps_Lock = Shift_L"`. +Now my Caps Lock functions as an extra Left Shift. Works just alright. + +But now that I switched to Wayland, Sway in particular, `xmodmap` for +X11 isn't going to work. What I ended up doing was the following: + +**`$HOME/.xkb/symbols/gbcustom`** + + default partial alphanumeric_keys + xkb_symbols "basic" { // leave "basic" in-tact unless you know what you're doing + include "gb" // or whatever base layout you use, most likely "us" + name[Group1] = "English (UK) Customized"; + key <CAPS> { [ Shift_L, Shift_L, Shift_L, Shift_L ] }; + }; + +Note that here, the "`key`" lines are in the form +`key <X> { [ A, B, C, D ] } ;`, where "`X`" is the keycode symbolic name +of the physical key you want to press. In my case, it is `CAPS`. Check +`/usr/share/X11/xkb/symbols/pc` and `/usr/share/X11/xkb/symbols/latin`, +or the relevant files for your keyboard configuration, to look up the +keycode symbolic name from the name you're used to. (Looking up +`Shift_L` in `symbols/pc` gets you to `LFSH`, which is what you would +use in place of "`X`". `A` is triggered when `X` is pressed alone, `B` +when it's pressd with Shift, `C` with AltGr, and `D` with both AltGr and +Shift. + +**`$HOME/.config/sway/config`** + + input "1:1:AT_Translated_Set_2_keyboard" { + xkb_layout "gbcustom" + } + +Of course, replace "`1:1:AT_Translated_Set_2_keyboard`" with your actual +keyboard identifier listed in `swaymsg -t get_inputs`. And reload Sway. + +There might be better ways to do so, but I've got this to work. For +these unusual setups, it is a bit complicated and not as straightforward +as adding a `xmondmap` line to `.xinitrc`. Hopefully things would get +better as Wayland matures. + +[This GitHub issue](https://github.com/swaywm/sway/issues/4250) and +[jman's article on +this](https://www.city17.xyz/keychron/#xkb-here-be-dragons) were +extremely helpful. Thanks to [brocellous](https://sr.ht/~brocellous) for +pointing out the solution involving custom options. + +------------------------------------------------------------------------ + +Another, potentially better method involving defining custom +`xkb_options`, propsed by brocellous: + +**`$HOME/.xkb/symbols/customsymbol`** + + // Remap caps to Shift_L + partial modifier_keys + xkb_symbols "caps_lshift" { + replace key { + type[group1] = "ONE_LEVEL", + symbols[group1] = [ Shift_L ], + actions[group1] = [ SetMods(modifiers=Shift) ] + }; + }; + +**`$HOME/.xkb/rules/evdev`** + + ! option = symbols + custom:caps_lshift = +customsymbol(caps_lshift) + + ! include %S/evdev + +**`$HOME/.config/sway/config`** + + input "1:1:AT_Translated_Set_2_keyboard" { + xkb_layout "gb" + xkb_options "custom:caps_lshift" + } + +- [Home](./) +- Runxi Yu +- <a href="./pubdom.html" rel="license">Public Domain</a> |