dotfiles/.config/polybar/scripts/task_manager

171 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
STATUS_FILE=/dev/shm/polybar_task_manager
BAR_CONFIG_FILE=~/.config/polybar/bar.ini
MODULES_LEFT_FILE=~/.config/polybar/modules-left.ini
REFRESH=1
update_bar_config()
{
base_config=$(grep -e "^modules-left-dynamic *= *" $BAR_CONFIG_FILE | cut -f 3- -d " " )
new_config="taskslabel"
for task in $(seq 1 "$1"); do
cat <<MODULE_TEMPLATE
[module/taskbar$task]
type = custom/ipc
hook-0 = echo ""
hook-1 = ~/.config/polybar/scripts/task_manager --set-task $task
hook-2 = ~/.config/polybar/scripts/task_manager --show-window $task
hook-3 = ~/.config/polybar/scripts/task_manager --close-window $task
click-left = polybar-msg -p %pid% hook taskbar$task 3
click-middle = polybar-msg -p %pid% hook taskbar$task 4
MODULE_TEMPLATE
new_config="$new_config taskbar$task"
done
echo "modules-left = $base_config $new_config" > $MODULES_LEFT_FILE
}
create_module_tasklabel()
{
cat <<TASKLABEL_TEMPLATE
[module/taskslabel]
type = custom/ipc
hook-0 = echo "%{T4}Tasks:%{T-}"
hook-1 = echo ""
click-left = rofi -modi window -show window -theme orange -show-icons -location 1 -yoffset +45 -xoffset +20
TASKLABEL_TEMPLATE
}
get_icon_by_name()
{
name=$(echo "$1" | tr '[:upper:]' '[:lower:]')
declare -A ICON_MAP=(
[tilix]=
[code]=
[firefox]=
[chromium]=
[tor]=
[nextcloud]=
[gnome-calculator]=
[gnome-calendar]=
[gnome-control-center]=
[eog]=
[evince]=
[gimp-210]=
[nautilus]=
[file-roller]=
[keepassxc]=
[steam]=
[skype]=
[slack]=
)
if [ ${ICON_MAP[$name]+_} ]; then
echo "${ICON_MAP[$name]}"
else
echo "$name" | cut -c 1 | tr '[:lower:]' '[:upper:]'
fi
}
show_tasks()
{
max_tasks=$(grep -cE "^\[module/taskbar[0-9]+]" ~/.config/polybar/task_manager.ini)
wmctrl -lx | awk '{if ($2 > -1) print $3,$1}' \
| sed -r 's/([0-9])\.([0-9])/\1\2/g' \
| awk -F'.' '{ print $NF }' \
| tail -"$max_tasks" | sort > $STATUS_FILE.current
diff -q $STATUS_FILE $STATUS_FILE.current > /dev/null 2>&1
if [ $? -ne 1 ]; then
rm -rf $STATUS_FILE.current
return 0
fi
mv $STATUS_FILE.current $STATUS_FILE
num_windows=$(wc -l $STATUS_FILE | cut -f 1 -d " ")
if [ "$num_windows" -eq 0 ]; then
polybar-msg hook taskslabel 2 > /dev/null
else
polybar-msg hook taskslabel 1 > /dev/null
fi
for counter in $(seq 1 "$max_tasks"); do
if [ "$counter" -le "$num_windows" ]; then
polybar-msg hook taskbar"$counter" 2 > /dev/null
else
polybar-msg hook taskbar"$counter" 1 > /dev/null
fi
sleep 0.1
done
}
print_task_name()
{
name=$(sed "${1}q;d" $STATUS_FILE | cut -f 1 -d " " | tr '[:upper:]' '[:lower:]')
icon=$(get_icon_by_name "$name")
if [ -n "$icon" ]; then
name="$name "
fi
#echo "${name^}${icon}"
echo '%{T6}'"$icon"'%{T-}'
}
get_active_window()
{
echo 0x0"$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2 | cut -f 2 -d 'x')"
}
get_task_id()
{
sed "${1}q;d" $STATUS_FILE | cut -f 2 -d " "
}
daemon()
{
while true; do
show_tasks
sleep $REFRESH
done
}
case "$1" in
--daemon)
> /dev/shm/polybar_task_manager
daemon
;;
--generate-config)
create_module_tasklabel > ~/.config/polybar/task_manager.ini
update_bar_config "$2" >> ~/.config/polybar/task_manager.ini
;;
--set-task)
print_task_name "$2"
;;
--show-window)
id=$(get_task_id "$2")
if [ "$id" = "$(get_active_window)" ]; then
xdotool getactivewindow windowminimize
else
wmctrl -ia "$id"
fi
print_task_name "$2"
;;
--close-window)
id=$(get_task_id "$2")
wmctrl -ic "$id"
;;
esac
exit 0