2024-01-08 20:50:29 +01:00

188 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
GAP=""
print_info() {
echo -n "$GAP"
local DESK="$(bspc query --names -D -d focused)"
case $DESK in
1)
DESKICON=""
;;
2)
DESKICON=""
;;
3)
DESKICON=""
;;
4)
DESKICON=""
;;
5)
DESKICON=""
;;
6)
DESKICON=""
;;
7)
DESKICON=""
;;
8)
DESKICON=""
;;
9)
DESKICON=""
;;
*)
DESKICON=""
;;
esac
if [ "$1" = "Empty" ]; then
echo "$DESKICON$(whoami)@$(uname -n) - $(uname -r)"
else
local wid="$1"
# Doesn't always work, so xprop is more realiable here
# WM_CLASS="$(bspc query -T -n "$Node" | jq -r '.client.className')"
local WM_CLASS="$(xprop -id "$wid" WM_CLASS | awk '{print $4}' | tr -d '"')"
local WM_NAME="$(xprop -id $wid _NET_WM_NAME | awk -F '=' '{print $2}' | tr -d '"')"
case "$WM_CLASS" in
'firefox')
echo "$DESKICON${WM_NAME:0:100}";;
'kitty')
echo "$DESKICON${WM_NAME:0:100}";;
'code-oss')
echo "$DESKICON${WM_NAME:0:100}";;
'Audacious')
echo "$DESKICON${WM_NAME:0:100}";;
'io.github.celluloid_player.Celluloid')
echo "$DESKICON${WM_NAME:0:100}";;
'Lutris')
echo "$DESKICON${WM_NAME:0:100}";;
'discord')
echo "$DESKICON${WM_NAME:0:100}";;
'Nemo')
echo "$DESKICON${WM_NAME:0:100}";;
*)
# https://stackoverflow.com/questions/1538676/uppercasing-first-letter-of-words-using-sed
echo "$DESKICON ${WM_NAME:0:100}" | sed -e "s/\b\(.\)/\u\1/g";;
esac
fi
}
exists_fullscreen_node() {
local fullscreen_nodes="$(bspc query -N -n .fullscreen.\!hidden -d "$1")"
if [ -n "$fullscreen_nodes" ]; then
echo '1'
else
echo '0'
fi
}
process_window() {
local desk="$2"
local wid="$1"
local WM_CLASS="$(xprop -id "$wid" WM_CLASS | awk '{print $4}' | tr -d '"')"
# If there is a fullscreen node, don't show anything,
# since we shouldn't see it
if [ "$(exists_fullscreen_node "$desk")" = "1" ]; then
return 0;
fi
print_info "$wid"
}
is_desktop_empty() {
local desk="$1"
local nodes="$(bspc query -N -n .window.\!hidden -d "$desk")"
if [ -n "$nodes" ]; then
echo '0'
else
echo '1'
fi
}
process_desktop() {
local desk="$1"
local is_empty="$(is_desktop_empty "$desk")"
if [ "$is_empty" = "1" ]; then
print_info "Empty"
fi
}
bspc subscribe node_focus | while read -r Event Monitor Desktop Node
do
# For some reason "$Node" and "$Desktop" are not always working
# properly with sticky windows
Node="$(xdotool getactivewindow)"
Desktop="$(bspc query -D -d focused)"
process_window "$Node" "$Desktop"
done &
bspc subscribe node_state | while read -r Event Monitor Desktop Node State Active
do
Node="$(xdotool getactivewindow)"
Desktop="$(bspc query -D -d focused)"
if [ "$State" != "fullscreen" ]; then
continue;
fi
# So, if you will focus on the other windows of the same app,
# which are not fullscreen, you will see icon
if ![ "$Active" = "on" ]; then
process_window "$Node" "$Desktop"
fi
done &
bspc subscribe node_add | while read -r Event Monitor Desktop Ip Node
do
State="$(bspc query -T -n "$Node" | jq -r '.client.state')"
done &
bspc subscribe node_flag | while read -r Event Monitor Desktop Node Flag Active
do
if [ "$Flag" = "hidden" ] && [ "$Desktop" = "$(bspc query -D -d .focused)" ]; then
process_desktop "$Desktop"
fi
done &
bspc subscribe node_remove | while read -r Event Monitor Desktop Node
do
process_desktop "$Desktop"
done &
bspc subscribe desktop_focus | while read -r Event Monitor Desktop
do
if [ "$(exists_fullscreen_node "$Desktop")" = "1" ]; then
continue;
fi
process_desktop "$Desktop"
done