If you’re here, you probably want to know how to configure notifications for volume change actions, just like it is in most of current less-geeky GNU/Linux distributions and window managers.
So if you press the volume up/volume down button, you want to see some notification with a beautiful icon and current volume percentage, like this:
And if you press the mute button you are expecting something comparable to:
A note of introduction
I’m using Arch Linux , Openbox window manager and xfce4-notifyd (though it should work exactly the same with standard notification-deamon, I encourage you to try xfce4-notifyd which is cool and easily configurable thanks to xfce4-notifyd-config) and ALSA.
But most of the following instructions should work also with other distributions (minor changes may be needed), window managers (possibly more changes) or with OSS (lots of changes, I guess).
Our magic script
I’ll give you the whole code first (a bash script) and then try to explain it.
So here’s the code:
#!/bin/bash step=3 if [[ $# -eq 1 ]]; then case $1 in "up") amixer set Master $step+;; "down") amixer set Master $step-;; "toggle") amixer set Master toggle;; *) echo "Invalid option";; esac fi muted=`amixer get Master|tail -n1|sed -E 's/.*\[([a-z]+)\]/\1/'` volume=`amixer get Master|tail -n1|sed -E 's/.*\[([0-9]+)\%\].*/\1/'` if [[ $muted == "off" ]]; then notify-send "Muted" -t 1000 -i notification-audio-volume-muted -h int:value:$volume else notify-send "Volume" -t 500 -i notification-audio-volume-medium -h int:value:$volume fi
The script accepts 3 possible arguments: up (increase volume), down (decrease volume), toggle (mute/unmute). If it’s run without any arguments it just sends the proper notification.
Now more about the most magic lines
Changing volume and muting
These lines (respectively) increase (by
$step), decrease (by
$step) and mute/unmute the Master channel.
amixer set Master $step+ amixer set Master $step- amixer set Master toggle
muted=`amixer get Master|tail -n1|sed -E 's/.*\[([a-z]+)\]/\1/'` volume=`amixer get Master|tail -n1|sed -E 's/.*\[([0-9]+)\%\].*/\1/'`
determines whether the channel is muted and sets the
muted variable to “on” or “off” and sets the
volume variable to the current volume (in percent).
These lines just extract some parts of the
amixer get Master command which output looks similar to this one:
Simple mixer control 'Master',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined penum Playback channels: Mono Limits: Playback 0 - 74 Mono: Playback 30 [41%] [-44.00dB] [on]
If in your case it looks differently, you may need to change these lines a bit.
notify-send "Muted" -t 1000 -i notification-audio-volume-muted -h int:value:$volume
notify-send "Volume" -t 500 -i notification-audio-volume-medium -h int:value:$volume
are responsible for creating the notifications. The -t parameter sets the timeout (in milliseconds), so you may want to change the value according to your own preferences.
Setting key bindings
Put the script in some place listed in your
$PATH. In my case it’s in
(you may want to put it e.g. in /usr/local/bin/ to make it available for all users). Let’s assume you called the script volume-change.sh. Run:
chmod +x /path/to/your/location/volume-change.sh
and test it from the console:
cd /path/to/your/location ./volume-change.sh ./volume-change.sh up ./volume-change.sh down ./volume-change.sh toggle
If it works, please proceed. If it doesn’t, I wish you happy debugging ;)
Now, open ~/.config/openbox/rc.xml in your favorite editor and find the
<!-- Volume control --> <keybind key="XF86AudioRaiseVolume"> <action name="Execute"> <command>volume-change.sh up</command> </action> </keybind> <keybind key="XF86AudioLowerVolume"> <action name="Execute"> <command>volume-change.sh down</command> </action> </keybind> <keybind key="XF86AudioMute"> <action name="Execute"> <command>volume-change.sh toggle</command> </action> </keybind>
And that’s it. Now reconfigure (from the Openbox menu: System -> Reconfigure Openbox) or restart Openbox. Hopefully, from now on, pressing the volume control buttons should display proper notifications on your screen.