100 lines
2.6 KiB
Bash
100 lines
2.6 KiB
Bash
|
#!/bin/bash
|
||
|
# Script to set the monitor brightness
|
||
|
# Creates a notification icon UI
|
||
|
|
||
|
ERR(){ echo "ERROR: $1" 1>&2; }
|
||
|
|
||
|
declare -i DEPCOUNT=0
|
||
|
for DEP in /usr/bin/{xdotool,yad,xrandr};do
|
||
|
[ -x "$DEP" ] || {
|
||
|
ERR "$LINENO Dependency '$DEP' not met."
|
||
|
DEPCOUNT+=1
|
||
|
}
|
||
|
done
|
||
|
|
||
|
[ $DEPCOUNT -eq 0 ] || exit 1
|
||
|
|
||
|
VERSION=`yad --version | awk '{ print $1 }'`
|
||
|
verlte() {
|
||
|
[ "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ]
|
||
|
}
|
||
|
|
||
|
verlt() {
|
||
|
[ "$1" = "$2" ] && return 1 || verlte $1 $2
|
||
|
}
|
||
|
|
||
|
if verlt $VERSION 0.38.2; then
|
||
|
yad --text=" The version of yad installed is too old for to run this program, \n Please upgrade yad to a version higher than 0.38.2 " \
|
||
|
--button="gtk-close"
|
||
|
exit
|
||
|
fi
|
||
|
|
||
|
|
||
|
# Set the icon here
|
||
|
ICON="sunny"
|
||
|
|
||
|
# fifo
|
||
|
export YAD_NOTIF=$(mktemp -u --tmpdir YAD_NOTIF.XXXXXX)
|
||
|
mkfifo "$YAD_NOTIF"
|
||
|
|
||
|
# trap that removes fifo
|
||
|
trap "rm -f $YAD_NOTIF" EXIT
|
||
|
|
||
|
# window class for the list dialog
|
||
|
export CLASS="brightness_001"
|
||
|
|
||
|
yad_scale() {
|
||
|
# Ensures only one instance of this window
|
||
|
# if there is another yad window close any dialog with the mathing class
|
||
|
if [[ $(pgrep -c $(basename $0)) -ne 1 ]]; then
|
||
|
pids="$(xdotool search --class "$CLASS")"
|
||
|
wpid="$(xdotool getwindowfocus)"
|
||
|
|
||
|
for pid in $pids; do
|
||
|
# Compares window class pid with the pid of a window in focus
|
||
|
if [[ "$pid" == "$wpid" ]]; then
|
||
|
xdotool windowunmap $pid
|
||
|
exit 1
|
||
|
fi
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
|
||
|
# detect monitor
|
||
|
MON=$(xrandr -q | grep " connected" | cut -f1 -d ' ')
|
||
|
|
||
|
# find current xrandr brightness value
|
||
|
XR=$(xrandr --verbose | grep -i brightness | cut -f2 -d ' ' | head -n1)
|
||
|
BrCur=`awk "BEGIN {print $XR*100}"` # calculate, so e.g. 0.5 gets 50
|
||
|
BrMax="100"
|
||
|
BrMin="5"
|
||
|
|
||
|
yad --scale --mouse --class="$CLASS" --skip-taskbar --min-value $BrMin --max-value $BrMax \
|
||
|
--value $BrCur --print-partial --undecorated --width 300 \
|
||
|
--on-top --escape-ok --no-buttons --hide-value --close-on-unfocus \
|
||
|
| while read BrNew; do
|
||
|
# division using awk, so xrandr value gets e.g. 0.5 rather than 50
|
||
|
xrandr --output $MON --brightness $(awk "BEGIN {print $BrNew/100}")
|
||
|
done
|
||
|
}
|
||
|
export -f yad_scale
|
||
|
|
||
|
# fuction to set the notification icon
|
||
|
function set_notification_icon() {
|
||
|
echo "icon:$ICON"
|
||
|
echo "tooltip:brighness control"
|
||
|
echo "menu:About!bash -c 'yad --about'!gtk-about||Quit!quit!gtk-quit"
|
||
|
}
|
||
|
|
||
|
exec 3<> $YAD_NOTIF
|
||
|
|
||
|
yad --notification --command="bash -c yad_scale" --listen <&3 & notifpid=$!
|
||
|
|
||
|
# waits until the notification icon is ready
|
||
|
until xdotool getwindowname $(xdotool search --pid "$notifpid" | tail -1) &>/dev/null; do
|
||
|
# sleep until the window opens
|
||
|
sleep 0.5
|
||
|
done
|
||
|
|
||
|
set_notification_icon >&3
|