Add the "improved-workspace-indicator" GNOME extension

This commit is contained in:
Alexander Hess 2026-10-20 15:41:58 +02:00
commit a15f027b91
Signed by: alexander
GPG key ID: B46EDB4DFC26805D
7 changed files with 134 additions and 5 deletions

View file

@ -3,7 +3,7 @@
# This file's name matches the CLI convention in ~/.local/bin
# pylint: disable=invalid-name
# Templates for six consumers live here
# Templates for seven consumers live here
# => Length of file is managable
# pylint: disable=too-many-lines
@ -884,6 +884,41 @@ def render_rofi(colors: dict[str, str]) -> str:
""")
def render_workspace_indicator(colors: dict[str, str]) -> str:
"""Render ~/.config/improved-workspace-indicator/stylesheet.css."""
return textwrap.dedent(f"""\
/* Written by ~/.local/bin/color-palette */
/* accent={colors['_accent']} scheme={colors['_scheme']} */
.panel-workspace-indicator {{
padding: 0 2px;
border: 0;
background-color: transparent;
}}
.panel-workspace-indicator-box {{
padding: 0;
}}
.panel-workspace-indicator {{
padding: 1px 8px;
margin: 0 3px;
border: 0;
border-radius: 8px;
font-size: 10pt;
font-weight: 600;
color: {colors['chrome-quiet']};
background-color: {colors['surface-dim']};
}}
.panel-workspace-indicator.workspace-indicator-active {{
font-weight: 700;
color: {colors['text']};
background-color: {colors['accent']};
}}
""")
def show_colors(colors: dict[str, str]) -> None:
"""Print all derived colors of this run for debugging."""
print(
@ -997,6 +1032,10 @@ def write_consumers(colors: dict[str, str]) -> int:
content=render_rofi(colors),
target=config_home / "rofi" / "colors.rasi",
),
write_file(
content=render_workspace_indicator(colors),
target=config_home / "improved-workspace-indicator" / "stylesheet.css",
),
)
return 0 if all(results) else 1

View file

@ -48,5 +48,12 @@ if gnome-extensions list --enabled 2>/dev/null | grep -qxF "forge@jmmaranan.com"
gsettings set $Forge window-gap-size "uint32 $_gap"
fi
# The "workspace indicator" extension only re-reads its stylesheet on a restart
_iwi=improved-workspace-indicator@michaelaquilina.github.io
if gnome-extensions list --enabled 2>/dev/null | grep -qxF "$_iwi"; then
gnome-extensions disable "$_iwi"
gnome-extensions enable "$_iwi"
fi
echo "Switched the color theme to $new_theme"

View file

@ -118,6 +118,16 @@ fi
# improved-workspace-indicator's `enable()` unloads every other extension's
# stylesheet before loading its own (e.g., forge's focus rings vanish)
# => Drop that loop in the installed extension
IWI_JS="$XDG_DATA_HOME/gnome-shell/extensions/improved-workspace-indicator@michaelaquilina.github.io/extension.js"
if [ -w "$IWI_JS" ]; then
sed -i '/this\.themesLoaded = this\.themeContext/,/^ }$/d' "$IWI_JS"
fi
echo "Import GNOME extensions' schemas"
SCHEMAS="$HOME/.local/bin/gnome-shell-extensions-schemas-import"

View file

@ -0,0 +1,38 @@
#!/bin/sh
# Jump to the first empty workspace
#
# Triggered by <Super>n
# as defined in [org/gnome/settings-daemon/plugins/media-keys]
# in ~/.config/gnome-settings/key-bindings.ini
#
# Note: This assumes that only the main monitor has workspaces enabled
# (see ~/.local/bin/move-window-to-empty-workspace)
set -eu
occupied=$(wmctrl -l) || exit 1 # fail safe
occupied=$(echo "$occupied" | awk '{print $2}' | sort -u)
total=$(wmctrl -d | wc -l)
# 0-based index for the first workspace
i=0
while [ "$i" -lt "$total" ]; do
if ! echo "$occupied" | grep -qx "$i"; then
exec wmctrl -s "$i"
fi
i=$((i + 1))
done
command -v notify-send >/dev/null \
&& notify-send 'Workspaces' 'No empty workspace available'
exit 1