With this small bash script you can show a nice progress bar on the screen when changing the volume in a TV-like fashion.
The script uses
osd_cat provided by the
xosd package under
Arch Linux (Please refer to your system specific package manager for install this package under other distributions).
In order to make this script work with Openbox you will have to edit the Openbox configuration file
rc.xml file normally placed under
/home/<user>/.config/openbox/rc.xml. I will show how I did it later on this post.
OSD Bash Script
A few function definitions make the main part simpler. They are mainly responsible of increasing/decreasing the volume and showing the on-screen message.
There are also some constants responsible for placing the message on a certain screen position, setting the font, etc.
test.sh
1 #!/bin/bash
2
3
4
5 # constants
6 FONT='-*-fixed-*-*-*-*-100-*-*-*-*-*-*-*'
7 COLOR="green"
8 DELAY=4
9 POS="bottom"
10 ALIGN="center"
11 BARMOD="percentage"
12 VOLTXT="Volume"
13 VOLMUTEDTXT="Muted"
14 VOLSTEP=2
15
16
17
18 # kills an existing osd_cat process
19 # needed when holding down a key to force repaint of the onscreen message
20 preKill() {
21 killall osd_cat
22 }
23
24 # gets the actual volume value
25 getVol() {
26 VOL="$(amixer sget Master | grep "Mono:" | awk '{ print $4 }' | sed -e 's/\[//' -
e 's/\]//' -e 's/\%//')"
27 }
28
29 # gets the actual volume value and prints is on the screen
30 # with a percent bar + a percent number
31 showVol() {
32 getVol
33 if [[ $VOL == 0 ]]; then
34 osd_cat --pos="$POS" --align="$ALIGN" --delay="$DELAY" --colour="$COLOR" --
font="$FONT" --barmode="$BARMOD" --text="$VOLMUTEDTXT $VOL%" --
percentage="$VOL"
35 else
36 osd_cat --pos="$POS" --align="$ALIGN" --delay="$DELAY" --colour="$COLOR" --
font="$FONT" --barmode="$BARMOD" --text="$VOLTXT $VOL%" --
percentage="$VOL"
37 fi
38 }
39
40 # reises the master channel by "VOLSTEP"
41 volUp() {
42 amixer sset Master "$VOLSTEP+"
43 }
44
45 # decreases the master channel by "VOLSTEP"
46 volDown() {
47 amixer sset Master "$VOLSTEP-"
48 }
49
50 # mutes the master channel
51 volMute() {
52 amixer sset Master 0
53 }
54
55
56 # main part
57 preKill
58
59 case "$1" in
60 "volup")
61 volUp
62 showVol
63 ;;
64 "voldown")
65 volDown
66 showVol
67 ;;
68 "mute")
69 volMute
70 showVol
71 ;;
72 *)
73 ;;
74 esac
Openbox rc.xml File
The rc.xml file has a keyboard section where custom keyboard shortcuts can be defined.
x.xml
1 <keybind key="W-KP_Add">
2 <action name="execute">
3 <execute>/home/adrian/scripts/osd.sh volup</execute>
4 </action>
5 </keybind>
6 <keybind key="W-KP_Subtract">
7 <action name="execute">
8 <execute>/home/adrian/scripts/osd.sh voldown</execute>
9 </action>
10 </keybind>
11 <keybind key="W-m">
12 <action name="execute">
13 <execute>/home/adrian/scripts/osd.sh mute</execute>
14 </action>
15 </keybind>
Riitek Micro Keyboard
Besides the keyboard shortcuts, I wanted to use my
Riitek Micro Keyboard RT-MWK03. When pressing the Vulume Up/Down/Mute key combination on the keyboard an X event is generated on the X server.
These X events can be used in the rc.xml file just the same way as any other keyboard shortcut. I used
Xev to find out what events are generated when pressing the volume key combinations.
y.xml
1 <keybind key="XF86AudioRaiseVolume">
2 <action name="execute">
3 <execute>/home/adrian/scripts/osd.sh volup</execute>
4 </action>
5 </keybind>
6 <keybind key="XF86AudioLowerVolume">
7 <action name="execute">
8 <execute>/home/adrian/scripts/osd.sh voldown</execute>
9 </action>
10 </keybind>
11 <keybind key="XF86AudioMute">
12 <action name="execute">
13 <execute>/home/adrian/scripts/osd.sh mute</execute>
14 </action>
15 </keybind>
Screenshots
|
Openbox OSD Script Volume 59% |
|
Openbox OSD Script Muted Volume |