Push to Talk in i3 WM
I figured out how to unmute microphone when right super key is pressed. I can unmute MS Teams, switch to the different workspace and keep talking with my coworkers. No more switching workspaces to click microphone icon.
Setting this up was a bit more complicated than expected.
Setup
First you have to unhook right super key from Mod4 modifier. It’s not
strictly necessary but using right super as Mod4 will confuse i3, you will
be switching your microphone on and off unexpectedly.
To unhook right super from Mod4 take a look at xmodmap output.
$ xmodmap
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock
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)
As you can see Super_R is binded to Mod4, while Mod3 is unused. I decided
to move Super_R to Mod3 in case I wanted to use it as modifier later on. It
would be enough to unbind Super_R from Mod4 though. In ~/.Xmodmap:
remove Mod4 = Super_R
add Mod3 = Super_R
If you don’t use display manager, remember to load your custom xmodmap in
~/.xinitrc:
xmodmap ~/.Xmodmap
Now we want to disable key repeat for Super_R keycode. This ensures that
while holding Super_R only one KeyPressed event will be emited. To figure
out keycode of Super_R you can use xmodmap -pke | grep Super_R. In my case
it’s 134.
To disable repeating you can use xset -r 134. This sould go to your
~/.xprofile or ~/.xinitrc. I decided to put it in my i3 config though.
exec xset -r 134
The final step is to bind Super_R to mute/unmute command in i3 config:
bindsym Super_R exec pactl set-source-mute @DEFAULT_SOURCE@ 0
bindsym --release Super_R exec pactl set-source-mute @DEFAULT_SOURCE@ 1
You can also add some visual feedback like icon in i3status. I don’t feel
like parsing output of pactl so I went with dunst notification:
bindsym Super_R exec pactl [...] && dunstify -p -a mic -h string:bgcolor:#4361EE -h string:fgcolor:#FFFFFF Microphone > $XDG_RUNTIME_DIR/mic-notif-id
bindsym --release Super_R exec pactl [...] && dunstify -C $(cat $XDG_RUNTIME_DIR/mic-notif-id)