mabox-tools/bin/mb-conkypin
2020-02-18 17:24:18 +01:00

219 lines
6.3 KiB
Bash
Executable File

#!/bin/bash
##
# Script to set the position of a moveable Conky
#
# Written by @damo and @johnraff, November 2015
# with major contributions by @xaos52
DIALOG="yad --center --undecorated --borders=20 \
--window-icon=distributor-logo-manjaro"
unset CONKYPATH posX_1 posY_1 posX_2 posY_2 OFFSET_X OFFSET_Y gapX gapY
case $LANG in
pl*)
EXIT="Wyjście:1"
NOT_SELECTED="Nie wybrano Conky\n\nSpróbować jeszcze raz?"
ALIGNMENT_NONE="To conky ma ustawione 'alignment none',\nwięc pozycja jest ustalana przez Menedżer Okien.\n"
CLICK="Kliknij 'Wybierz Conky' aby wybrać conky.\n\nNastępnie użyj kursora 'xwininfo' na wybranym conky\n"
MOVE="Przesuń Conky w docelowe miejsce\n za pomocą Alt+Lewy klawisz myszy.\n\nKliknij 'OK' aby ustalić nową pozycję."
CHOOSE_CONKY="Wybierz Conky:0"
;;
*)
EXIT="Exit:1"
NOT_SELECTED="Selection is not a conky\n\nChoose again?"
ALIGNMENT_NONE="This Conky has 'alignment none'\nso placement is handled by the Window Manager.\n"
CLICK="Click 'Select Conky' to pick a conky.\n\nThen use the 'xwininfo' cursor on the chosen conky\nto record its position."
MOVE="Move the Conky to the desired location\nwith Alt+L-mousebutton Drag.\n\nClick 'OK' to set the new position."
CHOOSE_CONKY="Select Conky:0"
;;
esac
# makes array "config"
parse_conkyfile(){
[[ -f $1 ]] || { echo "$1 nie jest plikiem." >&2;return 1;}
unset config
declare -Ag config
local name value
while read name value
do
[[ $name ]] || continue
[[ $name = TEXT* ]] && break
config["$name"]="$value"
done < <(sed 's/\#.*$//' "$1")
}
# usage: edit_conkyfile file name=value [name2=value2...]
# use absolute path to file
# parse_conkyfile should already have been run
edit_conkyfile() {
[[ "$1" = /* ]] || {
echo "$0: $1 is not an absolute path." >&2
return 1
}
file=$1
shift
local name value
declare -ag sed_args
while [[ $1 ]]; do
unset name value sed_pattern sed_replace
name="${1%%=*}"
value="${1#*=}"
shift
[[ ${config["$name"]+x} ]] || {
echo "$0: config key $name does not exist" >&2
return 1
}
[[ ${config["$name"]//[[:space:]]} = "${value//[[:space:]]}" ]] && continue
(( ${#sed_args[@]} == 0 )) && sed_args=("-ri")
sed_pattern="^ *$name .*$"
grep -q "#conkymove, original value for $name:" "$file" ||
sed_replace="#conkymove, original value for $name: ${config[$name]}\n"
sed_replace+="$name $value"
sed_args+=("-e")
sed_args+=("s/$sed_pattern/$sed_replace/")
done
(( ${#sed_args[@]} )) && sed "${sed_args[@]}" "$file"
}
function getStart(){ # Get initial Conky position
unset CONKYPATH
unset info1
declare -A info1
while read line
do
unset key value
[[ $line =~ Window\ id: ]] && {
ID=${line#*id:}
ID=${ID% \"*}
}
[[ $line != xwininfo:* && $line = *:* ]] && {
key=${line%:*}
value=${line#*:}
info1[$key]=$value
}
done < <(xwininfo)
# info now contains all the output of xwininfo
CMD=$(xprop -id $ID WM_COMMAND | awk -F '", "' '{
cmd=$1
sub(/^.*{ "/,"",cmd)
for (i=1;i<=NF;i++)
if($i ~ /-([a-zA-Z])?c/){
i++
sub(/\" }$/,"",$i)
gsub(/\\\"/,"\"",$i)
print cmd,$i
exit
}
}'
)
if [[ ${CMD%% *} = conky ]];then
echo "Found a conky"
CONKYPATH=${CMD#* }
posX_1=${info1[Absolute upper-left X]}
posY_1=${info1[Absolute upper-left Y]}
else
echo "Selection is not a conky"
$DIALOG --button="OK:0" --button="$EXIT" --text="$NOT_SELECTED"
if (( $? == 1 ));then
echo " Cancelled: exiting..."
exit 0
fi
getStart
fi
}
function getFinish(){ # Get new Conky position
unset info2
declare -A info2
while read line
do
unset key value
[[ $line != xwininfo:* && $line = *:* ]] && {
key=${line%:*}
value=${line#*:}
info2[$key]=$value
}
done < <(xwininfo -id $ID)
posX_2=${info2[Absolute upper-left X]}
posY_2=${info2[Absolute upper-left Y]}
}
function getOffset(){ # parse_conkyfile should already have been run
if [[ ${config[alignment]} = none ]];then # placement managed by Openbox
TXT="$ALIGNMENT_NONE"
$DIALOG --text="$TXT" --button="OK"
echo -e "\nConky has 'alignment none',\nso placement is handled by the Window Manager\nExiting...\n"
exit 0
fi
OFFSET_X=$(( posX_2 - posX_1 ))
OFFSET_Y=$(( posY_2 - posY_1 ))
case ${config[alignment]} in
tr|top_right|mr|middle_right|br|bottom_right|mm|middle_middle|bm|bottom_middle|tm|top_middle)
gapX=$(( ${config[gap_x]} - OFFSET_X ))
;;
tl|top_left|ml|middle_left|bl|bottom_left)
gapX=$(( ${config[gap_x]} + OFFSET_X ))
;;
esac
case ${config[alignment]} in
tr|top_right|tl|top_left|tm|top_middle)
gapY=$(( ${config[gap_y]} + OFFSET_Y ))
;;
br|bottom_right|bl|bottom_left|bm|bottom_middle|mm|middle_middle|ml|middle_left|mr|middle_right)
gapY=$(( ${config[gap_y]} - OFFSET_Y ))
;;
esac
}
## check necessary tools are installed
required_commands=(xwininfo xprop yad) # array, space-separated words
error_exit() {
echo "$0 error: $1" >&2
exit 1
}
missing_commands=()
for i in "${required_commands[@]}"
do
hash $i || missing_commands+=(" $i")
done
[[ ${missing_commands[0]} ]] && error_exit "This script requires the following commands: ${missing_commands[*]}
Please install the packages containing the missing commands
and rerun the script."
$DIALOG --text="$CLICK" \
--button="$CHOOSE_CONKY" --button="$EXIT"
if (( $? == 0 ));then
getStart
else
echo " Cancelled: exiting..."
exit 0
fi
$DIALOG --text="$MOVE" \
--button="OK:0" --button="$EXIT"
if (( $? == 0 ));then
getFinish
else
echo " Cancelled: exiting..."
exit 0
fi
parse_conkyfile "$CONKYPATH"
getOffset
edit_conkyfile "$CONKYPATH" "gap_x"=$gapX "gap_y"=$gapY
exit 0