20

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.

Cerin
  • 6,923

2 Answers2

9

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.

Cerin
  • 6,923
0

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

flurl
  • 71