For some historical, complicated reasons, I am using the key labeled “Ctrl”─right of the space bar─as the modifier for i3. But on a different device and installation, I struggled heavily to do that via xmodmap changes applied when i3 reads the config. I found many reports on the internet where people having tried a similar thing and failed, without any obvious solution.
What I want is that the “right Ctrl” physical key on my keyboard is configured as i3 modifier.
xmodmap -pm initially shows:
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
mod3 is unused, so I can use xmodmap to map mod3 to Control_R:
xmodmap -e "clear control"
xmodmap -e "add control = Control_L"
xmodmap -e "clear mod3"
xmodmap -e "add mod3 = Control_R"
xmodmap -pm now shows:
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3 Control_R (0x69)
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
The only problem is that when I cannot get xmodmap changes to persist when I login (using GDM), and worse, the changes get lost when I e.g. switch my monitor between devices (and the keyboard gets unplugged and plugged i n again). These are the points where a lot of reports are found on the Internet. So the above path is not an attractive option.
What I ultimately resorted to: editing /usr/share/X11/xkb/symbols/pc. This might break during updates. But hey, I’ll have the recipe here on how to fix it.
The original excerpt from /usr/share/X11/xkb/symbols/pc showed Control_R mapped to the Control modifier:
// Beginning of modifier mappings.
modifier_map Shift { Shift_L, Shift_R };
modifier_map Lock { Caps_Lock };
modifier_map Control{ Control_L, Control_R };
modifier_map Mod2 { Num_Lock };
modifier_map Mod4 { Super_L, Super_R };
After my changes, the excerpt from /usr/share/X11/xkb/symbols/pc now shows Control_R mapped to Mod3:
// Beginning of modifier mappings.
modifier_map Shift { Shift_L, Shift_R };
modifier_map Lock { Caps_Lock };
modifier_map Control{ Control_L };
modifier_map Mod2 { Num_Lock };
modifier_map Mod3 { Control_R };
modifier_map Mod4 { Super_L, Super_R };
Now, the right Ctrl key is always mapped to Mod3, regardless of whether an i3 session is running or not. As long as the keyboard layout is built upon /usr/share/X11/xkb/symbols/pc.
This is what I have in my .config/i3/config, telling i3 to use Mod3 as identifier:
set $mod Mod3
exec --no-startup-id i3-sensible-terminal
exec --no-startup-id google-chrome
Finally, so that I can always fiddle with configuration if needed, I have the following in my .config/i3/config:
exec --no-startup-id i3-sensible-terminal
exec --no-startup-id google-chrome
This starts a browser and a terminal at the beginning of the i3 session. Things can go wrong after all.
