Um tanto vergonhoso, mas como não parecia haver nenhuma solução existente, e como a tarefa parecia relativamente direta, eu escrevi um simples daemon do Python para resolver o problema. Ele usa a API python-xlib para capturar pressionamentos de teclas em todo o sistema e, em seguida, executa comandos personalizados do shell. Ele assume uma configuração básica Debian / Ubuntu, mas provavelmente funcionaria na maioria dos sistemas Linux com alguns ajustes.
No meu caso, as teclas de volume para cima / baixo mapeiam para o código 122/123, então os comandos correspondentes para diminuir ou aumentar o volume somente quando a área de trabalho está bloqueada são:
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%'
Evidentemente, isso é um pouco detalhado. O segundo grep é encontrar a interface de som ativa em sistemas que podem ter vários (por exemplo, meu laptop tem uma interface de mestre e fone de ouvido, permitindo que esses comandos controlem também).
Edit: Isso não funciona mais no Ubuntu 16. Todas as funções do X parecem ficar desativadas, mesmo a partir do terminal, uma vez que a tela bloqueia.