188 lines
4.3 KiB
Bash
Executable File
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
|
|
|