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.
-
+1! I bet that a side effect of this (if it is possible) is to not re-awaken the sleeping display, which is something I've wondered about before. – David Oneill Apr 17 '12 at 18:05
-
1I'd like to have this functionality too. Not only for volume, but also for the music control keys (play, pause;next;previous). – jplatte Apr 18 '12 at 20:46
-
As an aside, as I was upgrading I turned my screen down to the lowest setting. Halfway through the install I couldn't turn it back up. Made for an interesting experience.. – Will Richardson May 23 '12 at 10:10
-
I wonder if the media keys could be made into some kind of fake LIRC device, pretending to be a remote control ... At least conceptually it makes sense, right? – taneli May 24 '12 at 12:04
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,485
-
1I just got this working on Ubuntu 18.04. I had to replace the "is locked test" with
gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "true"
based on https://askubuntu.com/a/890802/627247 because I'm not using the gnome-screesaver but after that, no problems at all. – Fabian N. Jul 06 '18 at 02:42 -
I can confirm that it works on Ubuntu 16.04 as well. To avoid confusion, the "is locked test" mentioned by Fabian N. means replacing
gnome-screensaver-command -q | grep "is active"
on lines 160--165 of freekey.py or directly in the configuration file by what he suggests. – Pierre Thalamy Aug 03 '18 at 14:33 -
on my system
171 gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "true" && bash -c 'rhythmbox-client --next'
works perfectly for next song on rhythmbox. I'm still working on previous and other controls but it'll get there. – John Hamilton Feb 05 '19 at 10:22
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