Is it possible to allow a keyboard's volume keys to continue working when your desktop is locked? Currently, the default behavior disables all special-function keys until the desktop's unlocked. I like to use my PC as a music player and leave it locked when I'm not directly at the console, but I still want to let people to control the volume if a song's too loud.
2 Answers
Somewhat of a shameful plug, but since there didn't seem to be any existing solution, and since the task seemed relatively straight-forward, I wrote a simple Python daemon to fix the problem. It uses the python-xlib API to capture system-wide key presses and then runs custom shell commands. It assumes a basic Debian/Ubuntu setup, but would probably work on most Linux systems with a few tweaks.
For my case, the volume up/down keys map to the code 122/123, so the corresponding commands to lower or raise volume only when the desktop is locked are:
gnome-screensaver-command -q | grep "is active" && bash -c '/usr/bin/pactl -- set-sink-volume `pacmd list-sinks | grep -P -o "(?<=\* index: )[0-9]+"` -10%'
gnome-screensaver-command -q | grep "is active" && bash -c '/usr/bin/pactl -- set-sink-volume `pacmd list-sinks | grep -P -o "(?<=\* index: )[0-9]+"` +10%'
Admittedly, that's a bit verbose. The second grep is to find the active sound interface on systems that might have several (e.g. my laptop has a Master and Headphone interface, allowing these commands to control either).
Edit: This no longer works as of Ubuntu 16. All X functions seem to become disabled, even from the terminal, once the screen locks.
- 6,923
I wrote this script which works for me on Ubuntu 18.04:
#!/bin/bash
EVFILE=/dev/input/event3
USR=flurl
evtest $EVFILE
| grep --line-buffered -E "KEY_MUTE|KEY_VOLUMEDOWN|KEY_VOLUMEUP"
| grep --line-buffered "value 1"
| stdbuf -oL awk -F '[()]' '{print $4}'
| while read KEY; do
if [ "$KEY" = "KEY_MUTE" ]; then
su - $USR -c "amixer -D pulse sset Master +1 toggle"
elif [ "$KEY" = "KEY_VOLUMEUP" ]; then
su - $USR -c "amixer -D pulse sset Master 5%+"
elif [ "$KEY" = "KEY_VOLUMEDOWN" ]; then
su - $USR -c "amixer -D pulse sset Master 5%-"
fi
done
You have to run it as root and adapt the variables EVFILE and USR
- 71