#!/usr/bin/env bash STATUS_FILE=/dev/shm/polybar_task_manager REFRESH=2 MAX_TASKS=10 get_icon_by_name() { name=$(echo "$1" | tr '[:upper:]' '[:lower:]') declare -A ICON_MAP=( [tilix]= [code]= [firefox]= [chromium]= [nautilus]= [gnome-calculator]= [gnome-calendar]= [eog]= [keepassxc]= ) if [ ${ICON_MAP[$name]+_} ]; then echo "${ICON_MAP[$name]}" fi } show_tasks() { wmctrl -lx | awk '{if ($2 > -1) print $3,$1}' \ | 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 counter=1 num_windows=$(wc -l $STATUS_FILE | cut -f 1 -d " ") while [ $counter -le "$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 counter=$((counter+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 printf "%s%s" "${name^}" "$icon" } 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 ;; --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