Really having things my way
In yesterday’s post about implementing keyboard shortcuts to control headphone volume, I noted at the end that I wasn’t happy with the look of the passive feedback display that kdialog provided. I am happy to report that I’ve found a solution.
The default volume control feedback (triggered by Fn+F?) is provided by a KDE daemon called kmilo. On a hunch, I poked around the DCOP interface exposed by kmilod and much to my joy, it provides functions called displayProgress and displayText - just what I needed! Herewith, the updated script:
#!/bin/sh
# vol.sh
# by deepak sarda
# public domain
# functions
usage() {
echo "Usage: $0 (less|more|mute)"
}
popup() {
# echo "$*"
# display popup with 1 second delay. Also, background the process so that
# script doesn't block. This lets us invoke the script in quick succession.
kdialog --title "Headphone" --passivepopup "$*" 1 &
}
displayProgress() {
if [ $kmilo ]; then
dcop kded kmilod displayProgress "$1" "$2" &
else
popup "$1 $2%"
fi
}
displayText() {
if [ $kmilo ]; then
dcop kded kmilod displayText "$*" &
else
popup $*
fi
}
currentVol() {
current_vol=`$app absoluteVolume $dev`
return $(($current_vol*100/$max_vol))
}
# Usage check
if [ $# -ne 1 ]; then
usage
exit
fi
kmilo=`dcop kded | grep -m 1 ^kmilod`
if [ ! `dcop | grep -m 1 ^kmix` ]; then
displayText "kmix not found"
exit
fi
app="dcop kmix `dcop kmix | grep ^Mixer`"
dev=2 # The headphone is device index 2 on my system
max_vol=`$app absoluteVolumeMax $dev`
if [ "$1" = "less" ]; then
$app decreaseVolume $dev
currentVol
displayProgress "Headphone Volume" $?
elif [ "$1" = "more" ]; then
$app increaseVolume $dev
currentVol
displayProgress "Headphone Volume" $?
elif [ "$1" = "mute" ]; then
$app toggleMute $dev
if [ `$app mute $dev` = "true" ]; then
displayText "Headphone mute on"
else
displayText "Headphone mute off"
fi
else
usage
fi