Recently, I discovered the i3 key mode feature. Immediately, I configured two scenarios for better i3 control: management of music/video and (external) screens.
The configuration for either scenario is straight forward. Here is my config for the management of music and video:
set $mode_playerctl "playerctl: [p]lay/[p]ause [n]ext [b]ack"
bindsym $mod+m mode $mode_playerctl
mode $mode_playerctl {
bindsym p exec playerctl play-pause; mode "default"
bindsym n exec playerctl next; mode "default"
bindsym b exec playerctl previous; mode "default"
bindsym Return mode "default"
bindsym Escape mode "default"
}
As any i3 user realizes quickly, the number of shortcuts to configure with any keyboard comes with a finite number of possibilities. To tackle this problem, i3 implemented key modes. Key modes can be compared to submenus. Once a key combination is pressed, a submenu is created/opened. This creates a new context, allowing you to map keys freely and independently from any other mappings. In the example above $mod+m
opens such a menu. It then allows me to press the keys p
, n
or b
to play/pause, or jump to previous or next music/video accordingly.
More information about playerctl can be found here: https://github.com/acrisci/playerctl.
Here is what the menu looks like, based on the above config:
The second menu allows me to control my external screens:
set $mode_xrandr "xrandr: [a]uto [h]ome (dock) [i]ntegrated, move workspace [u]p, [d]own, [l]eft, [r]ight"
bindsym $mod+p mode $mode_xrandr
mode $mode_xrandr {
bindsym a exec xrandr --auto; mode "default"
bindsym h exec /home/$USER/.screenlayout/home-dockingstation.sh; mode "default"
bindsym i exec /home/$USER/.screenlayout/laptop.sh; mode "default"
bindsym u move workspace to output up; mode "default"
bindsym d move workspace to output down; mode "default"
bindsym l move workspace to output left; mode "default"
bindsym r move workspace to output right; mode "default"
bindsym Return mode "default"
bindsym Escape mode "default"
}
The use of screenlayout configurations has been documented here (my-linux-desktop, chapter “External screens”)