tl;dr? Scroll to the end.
Monitoring for screen lock/unlock
Adapted from here, this monitors for screen lock/unlock:
#!/bin/bash
watch="type=signal,interface=org.gnome.ScreenSaver"
screen_locked_signal="boolean true"
screen_unlocked_signal="boolean false"
dbus-monitor --session "$watch" | (
while read signal; do
if [[ "$signal" =~ "$screen_locked_signal" ]]; then
echo "Screen Locked"
elif [[ "$signal" =~ "$screen_unlocked_signal" ]]; then
echo "Screen Unlocked"
fi
done)
PulseAudio
You can find out which source and sink are currently being used as follows:
$ pactl info | grep -E 'Default (Source|Sink):'
Default Sink: alsa_output.usb-Logitech_Inc._Logitech_USB_Headset_H340-00.analog-stereo
Default Source: alsa_input.usb-Logitech_Inc._Logitech_USB_Headset_H340-00.analog-stereo
(This is my USB headset)
You can switch source and sink as follows:
$ pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
$ pactl set-default-source alsa_input.pci-0000_00_1b.0.analog-stereo
(Use analogue output and input)
You can get a complete list of sources and sinks with pactl list short sinks
and pactl list short sources
, but there are extra entries in there. It's probably best to switch using the UI tools and then use pactl info
to discover the appropriate ones.
Final script
It results in a script that looks like this:
#!/bin/bash
GNOME
watch="type=signal,interface=org.gnome.ScreenSaver"
XFCE
watch="type='signal',interface='org.xfce.ScreenSaver'"
screen_locked_signal="boolean true"
screen_unlocked_signal="boolean false"
PulseAudio: use pactl
_get_default_sink() {
pactl info | sed -n 's/^Default Sink: (.*)/\1/p'
}
_get_default_source() {
pactl info | sed -n 's/^Default Source: (.*)/\1/p'
}
_set_default_sink() {
pactl set-default-sink "$1"
}
_set_default_source() {
pactl set-default-source "$1"
}
last_sink=$(_get_default_sink)
last_source=$(_get_default_source)
echo "sink is $last_sink; source is $last_source"
Watch for screensaver D-Bus signals
dbus-monitor --session "$watch" | (
while read signal; do
if [[ "$signal" =~ "$screen_locked_signal" ]]; then
# Screen locked: remember the current default sink and source
last_sink=$(_get_default_sink)
last_source=$(_get_default_source)
echo "Screen Locked; sink was $last_sink; source was $last_source"
elif [[ "$signal" =~ "$screen_unlocked_signal" ]]; then
# Screen unlocked: restore the last default sink and source
_set_default_sink "$last_sink"
_set_default_source "$last_source"
echo "Screen Unlocked; sink is $(_get_default_sink); source is $(_get_default_source)"
fi
done)
Automatically starting the script
To ensure that this script runs as soon as you log in, you can use gnome-session-properties
and add a startup application (I called mine "Monitor Screensaver") pointing to the script. It'll create a ~/.config/autostart/monitor-screensaver.desktop
file containing the following:
[Desktop Entry]
Type=Application
Exec=/home/roger/bin/monitor-screensaver
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_GB]=Monitor Screensaver
Name=Monitor Screensaver
Comment[en_GB]=
Comment=