Disparity between 'caps:hyper' & 'ctrl:swapcaps_hyper'
I may be encountering a disparity between the result of two key behaviour options described in xkeyboard-config(7).
Specifically, I am trying to use the option 'caps:hyper' to effectively get rid of Caps Lock and make it into a new modifier key (Hyper). Setting the option results in Caps Lock inheriting the role of Mod4 from Winkey (both being reported in Emacs as Hyper).
- Super_L (Mod4) -> Super_L (Mod4)
- Caps Lock (Lock) -> Hyper_L (Mod4)
As control, I use 'ctrl:swapcaps_hyper' for comparison. In this case, the result is as expected: Caps Lock becomes Ctrl, Ctrl becomes Hyper (Mod3) and Winkey remains Super (Mod4).
- Super_L (Mod4) -> Super_L (Mod4)
- Caps Lock (Lock) -> Control_L (Control)
- Control_L (Control) -> Hyper_L (Mod3)
Indeed, on my system:
$ awk '/xkb_symbols "hyper"/{c=4}c&&c--' /usr/local/share/X11/xkb/symbols/capslock
xkb_symbols "hyper" {
key <CAPS> { [ Hyper_L ] };
modifier_map Mod4 { <CAPS> };
};
$ awk '/xkb_symbols "swapcaps_hyper"/{c=6}c&&c--' /usr/local/share/X11/xkb/symbols/ctrl
xkb_symbols "swapcaps_hyper" {
replace key <CAPS> { [ Control_L ] };
replace key <LCTL> { [ Hyper_L ] };
modifier_map Control { <CAPS> };
modifier_map Mod3 { <LCTL> };
};
$ awk '/key <SUPR> /{c=5}c&&c--' /usr/local/share/X11/xkb/symbols/pc
key <SUPR> { [ NoSymbol, Super_L ] };
modifier_map Mod4 { <SUPR> };
key <HYPR> { [ NoSymbol, Hyper_L ] };
modifier_map Mod4 { <HYPR> };
So while Hyper and Super are both nominally bound to the same modifier (Mod4), Hyper gets Mod3 reassigned for 'ctrl:swapcaps_hyper', but Mod4 in case of 'caps:hyper'. Not sure why the capslock option uses 'key' and ctrl option 'replace key'.
Some more details:
System
$ uname -rs
FreeBSD 13.0-RELEASE-p11
$ echo "$XDG_SESSION_TYPE"
wayland
$ setxkbmap -query
rules: evdev
model: pc105
layout: us
$ setxkbmap -print
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
Key behaviour under different options (output: 'wev' - wayland's xev)
Option: clean (without options)
- Presses: super, caps
- Emacs reports: physical winkey+z as "s-z", physical caps+z as literal 'z' (caps not being a modifer)
pressing SUPER
[14: wl_keyboard] key: serial: 44; time: 18413921; key: 133; state: 1 (pressed)
sym: Super_L (65515), utf8: ''
[14: wl_keyboard] modifiers: serial: 0; group: 16
depressed: 00000040: Mod4
latched: 00000000
locked: 00000010: Mod2
pressing CAPS
[14: wl_keyboard] key: serial: 48; time: 18414577; key: 66; state: 1 (pressed)
sym: Caps_Lock (65509), utf8: ''
[14: wl_keyboard] modifiers: serial: 0; group: 18
depressed: 00000002: Lock
latched: 00000000
locked: 00000012: Lock Mod2
Option: with caps:hyper
- Presses: super, caps
- Expected results: caps becomes hyper
- Actual results: caps becomes hyper (as Mod4), winkey/super gets recognized as Hyper in Emacs
- Emacs reports: physical winkey+z as "H-z", physical caps+z as "H-z"
pressing SUPER
[14: wl_keyboard] key: serial: 65; time: 19518271; key: 133; state: 1 (pressed)
sym: Super_L (65515), utf8: ''
[14: wl_keyboard] modifiers: serial: 0; group: 16
depressed: 00000040: Mod4
latched: 00000000
locked: 00000010: Mod2
pressing CAPS
[14: wl_keyboard] key: serial: 69; time: 19518743; key: 66; state: 1 (pressed)
sym: Hyper_L (65517), utf8: ''
[14: wl_keyboard] modifiers: serial: 0; group: 16
depressed: 00000040: Mod4
latched: 00000000
locked: 00000010: Mod2
Option: with ctrl:swapcaps_hyper
- Presses: super, caps, ctrl
- Expected results: winkey/super stays unchanged (as Mod4), ctrl becomes hyper (as Mod3?), caps becomes ctrl
- Actual results: as expected
- Emacs reports: physical winkey+z as "s-z", physical ctrl+z as "H-z"; physical caps+z as "C-z"
pressing SUPER
[14: wl_keyboard] key: serial: 716; time: 18994089; key: 133; state: 1 (pressed)
sym: Super_L (65515), utf8: ''
[14: wl_keyboard] modifiers: serial: 0; group: 16
depressed: 00000040: Mod4
latched: 00000000
locked: 00000010: Mod2
pressing CAPS
[14: wl_keyboard] key: serial: 720; time: 18994917; key: 66; state: 1 (pressed)
sym: Control_L (65507), utf8: ''
[14: wl_keyboard] modifiers: serial: 0; group: 16
depressed: 00000004: Control
latched: 00000000
locked: 00000010: Mod2
pressing CTRL
[14: wl_keyboard] key: serial: 724; time: 18996846; key: 37; state: 1 (pressed)
sym: Hyper_L (65517), utf8: ''
[14: wl_keyboard] modifiers: serial: 0; group: 16
depressed: 00000020: Mod3
latched: 00000000
locked: 00000010: Mod2