245 lines
7.6 KiB
Plaintext
245 lines
7.6 KiB
Plaintext
|
#!/bin/bash
|
||
|
#
|
||
|
# bl-tint2-manager: a BunsenLabs tint2 selection and switcher script
|
||
|
# Copyright (C) 2015-2019 damo <damo@bunsenlabs.org>
|
||
|
# 2019-2020 John Crawley <john@bunsenlabs.org>
|
||
|
# Ported to Mabox by napcok <napcok@gmail.com>, August 2020
|
||
|
#
|
||
|
# This program is free software: you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation, either version 3 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
#
|
||
|
########################################################################
|
||
|
#
|
||
|
# Tint2 config files must be in $TINT2PATH
|
||
|
#
|
||
|
# When the dialog opens, any running tint2s will be checkmarked.
|
||
|
#
|
||
|
# Click "Apply" and all running tint2s are stopped,
|
||
|
# and all checkmarked tint2s are started.
|
||
|
#
|
||
|
# To stop a tint2 just uncheck it, and "Apply".
|
||
|
#
|
||
|
# Running tint2s are saved to a session file, and can be run with
|
||
|
# the "tint2-session" script. To start them at login, add the
|
||
|
# following line to autostart:
|
||
|
#
|
||
|
# mb-tint2-session
|
||
|
#
|
||
|
########################################################################
|
||
|
|
||
|
TINT2PATH="$HOME/.config/tint2"
|
||
|
TINT2DEFAULT="$TINT2PATH/tint2rc" # tint2 will create this if it doesn't exist
|
||
|
SESSIONFILE="$TINT2PATH/tint2-sessionfile"
|
||
|
USAGE='mb-tint2-manager is a tint2 selection and switcher script
|
||
|
which uses yad to generate a graphical user interface.
|
||
|
|
||
|
Usage: mb-tint2-manager
|
||
|
or: mb-tint2-manager -h|--help
|
||
|
|
||
|
Optional arguments:
|
||
|
-h | --help Show this message (no other options are supported at this time)
|
||
|
|
||
|
Use:
|
||
|
With no command option the script runs the gui
|
||
|
|
||
|
Tint2 config files must be in HOME/.config/tint2/
|
||
|
|
||
|
When the dialog opens, any running tint2s will be checkmarked.
|
||
|
|
||
|
Click "Apply" or "OK" and all running tint2s are stopped,
|
||
|
and all checkmarked tint2s are started.
|
||
|
|
||
|
To stop a tint2 just uncheck it, and click "Apply" or "OK".
|
||
|
|
||
|
Click "Apply" to return to the dialog after applying changes,
|
||
|
click "OK" to close the window after applying changes,
|
||
|
click "Close" to close the window without applying any more changes.
|
||
|
|
||
|
Running tint2s are saved to a session file, and can be run with
|
||
|
the "tint2-session" script. To start them at login, add the
|
||
|
following line to autostart:
|
||
|
|
||
|
mb-tint2-session
|
||
|
'
|
||
|
|
||
|
### DIALOG VARIABLES
|
||
|
DLGDEC="yad --center --borders=20 "
|
||
|
WINICON="--window-icon=distributor-logo-mabox --image=tint2conf"
|
||
|
case $LANG in
|
||
|
pl*)
|
||
|
TITLE="Menedżer paneli Tint2"
|
||
|
OK="--button=OK:2"
|
||
|
APPLY="--button=Zastosuj:0"
|
||
|
CANCEL="--button=Anuluj:1"
|
||
|
CLOSE="--button=Zamknij:1"
|
||
|
SELECT_TINT="Wybierz Tint2 z listy, po kliknięcu <b>Zastosuj</b> wszystkie zaznaczone zostaną uruchomione."
|
||
|
SELECT="Wybór"
|
||
|
TINT_CONF_FILE="plik konfiguracji tint2"
|
||
|
;;
|
||
|
*)
|
||
|
TITLE="Tint2 Panels Manager"
|
||
|
OK="--button=OK:2"
|
||
|
APPLY="--button=Apply:0"
|
||
|
CANCEL="--button=Cancel:1"
|
||
|
CLOSE="--button=Close:1"
|
||
|
SELECT_TINT="Select Tint2s from the list. Click <b>Apply</b> to start all selected."
|
||
|
SELECT="Select"
|
||
|
TINT_CONF_FILE="tint2 Name"
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
########################################################################
|
||
|
|
||
|
getRunning(){
|
||
|
local pid cmd args TPATH
|
||
|
while read -r pid cmd args; do
|
||
|
TPATH=${args#-c } # tint2 will start even without -c before filepath
|
||
|
if [[ -z $TPATH ]]; then
|
||
|
TPATH=$TINT2DEFAULT
|
||
|
elif [[ $TPATH != "$HOME"/* ]]; then
|
||
|
TPATH="$HOME/$TPATH"
|
||
|
fi
|
||
|
[[ -f $TPATH ]] || {
|
||
|
echo "$0: pgrep tint2 parsing failed: $TPATH not a file" >&2
|
||
|
continue
|
||
|
}
|
||
|
runningTints+=("$TPATH")
|
||
|
done < <(pgrep -ax tint2)
|
||
|
}
|
||
|
|
||
|
# $1 holds full path to config file
|
||
|
# return 0 if a running tint2 is using that file
|
||
|
isRunning(){
|
||
|
local file=$1
|
||
|
for running in "${runningTints[@]}"
|
||
|
do
|
||
|
[[ $running = "$file" ]] && return 0
|
||
|
done
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
fillArrays(){
|
||
|
num="$1"
|
||
|
tintsPath[$num]="$2" # full filepath to the tint2
|
||
|
tintsArr[$num]="$3" # displayed name
|
||
|
# see if config file matches one of the running tints
|
||
|
if isRunning "$2";then
|
||
|
checkArr[$num]="TRUE" # make checkmark in dialog
|
||
|
else
|
||
|
checkArr[$num]="FALSE"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
findTint(){
|
||
|
# search dirs for tint2 config files
|
||
|
local file num display
|
||
|
num=0
|
||
|
shopt -s globstar
|
||
|
#for file in "$TINT2PATH"/**;do
|
||
|
for file in $(find $TINT2PATH -type f -name *tint2rc);do
|
||
|
[[ -f $file ]] || continue
|
||
|
[[ $file = *~ ]] && continue # ignore backups
|
||
|
grep -q "panel_monitor" "$file" || continue # not a tint2rc file
|
||
|
display=${file#$TINT2PATH/}
|
||
|
fillArrays $num "$file" "$display"
|
||
|
num=$((num+1))
|
||
|
done
|
||
|
shopt -u globstar
|
||
|
}
|
||
|
|
||
|
loadDialog() {
|
||
|
local RET retval i pid cmd name file display
|
||
|
declare -a retTint
|
||
|
## Populate dialog from array, get return value(s)
|
||
|
RET=$($DLGDEC $WINICON --list --title="$TITLE" \
|
||
|
--text="$SELECT_TINT" \
|
||
|
--checklist --width=400 --height=500 \
|
||
|
--column="$SELECT" --column="$TINT_CONF_FILE" "${LISTTINT[@]}" --separator=":" \
|
||
|
$APPLY $CLOSE \
|
||
|
)
|
||
|
# For OK button, add to last line of yad command:
|
||
|
# $APPLY $OK $CLOSE \
|
||
|
|
||
|
retval=$?
|
||
|
if (( retval == 1 )); then # close button pressed
|
||
|
exit 0
|
||
|
fi
|
||
|
:> "$SESSIONFILE" # Create new session file
|
||
|
|
||
|
# loop through returned choices, add to array
|
||
|
i=0
|
||
|
OIFS=$IFS # copy original IFS
|
||
|
IFS=":" # separator is ":" in returned choices
|
||
|
for name in $RET; do
|
||
|
retTint[$i]=$name
|
||
|
i=$((i+1))
|
||
|
done
|
||
|
IFS=$OIFS # reset IFS
|
||
|
|
||
|
# kill all tint2s
|
||
|
pgrep -a tint2 | while read -r pid cmd; do
|
||
|
if [[ ${cmd%% *} = tint2 ]]; then
|
||
|
kill "$pid"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
for name in "${retTint[@]}";do # loop through checkmarked tint2 names
|
||
|
for ((j=0; j<${#tintsPath[*]}; j++));do # traverse through elements
|
||
|
file=${tintsPath[j]}
|
||
|
display=${tintsArr[j]}
|
||
|
# see if it matches the returned name
|
||
|
if [[ $display = "$name" ]];then
|
||
|
echo "$file" >> "$SESSIONFILE"
|
||
|
set -m # enable job control so forked tint2 is immune to signals
|
||
|
# start the tint2 (adjust the sleep time if required)
|
||
|
tint2 -c "$file" >/dev/null 2>&1 &
|
||
|
disown
|
||
|
set +m
|
||
|
sleep 1s
|
||
|
fi
|
||
|
done
|
||
|
done
|
||
|
# if there is an $OK button that returns 2, it will apply changes and exit
|
||
|
(( retval == 2 )) && exit 0
|
||
|
}
|
||
|
|
||
|
# get any commandline arguments
|
||
|
if ! (( $# == 0 ));then
|
||
|
for arg in "$@";do
|
||
|
if [[ $1 = "-h" ]] || [[ $1 = "--help" ]];then
|
||
|
echo -e "$USAGE"
|
||
|
exit 0
|
||
|
else
|
||
|
echo -e "\tERROR: sorry I don't understand \"${arg}\""
|
||
|
echo -e "$USAGE"
|
||
|
exit 1
|
||
|
fi
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
while true;do
|
||
|
runningTints=()
|
||
|
# get tint2 directories in .tint2, add to array
|
||
|
getRunning
|
||
|
findTint
|
||
|
|
||
|
LISTTINT=()
|
||
|
# loop through arrays, and build list text for yad dialog
|
||
|
for ((j=0; j<${#tintsArr[*]}; j++));do
|
||
|
LISTTINT+=("${checkArr[j]}" "${tintsArr[j]}")
|
||
|
done
|
||
|
loadDialog #"$LISTTINT" now a global array
|
||
|
done
|
||
|
|
||
|
exit 0
|