Fix floating: use xdg-terminal-exec --app-id + class-matched rules

The window never floated because install hardcoded `ghostty --class=monitor-tui`.
Ghostty rejects app-ids that aren't valid GTK IDs (no dot) and silently falls
back to class com.mitchellh.ghostty, so the `match:class monitor-tui` rule never
matched and the window tiled.

Switch to the Omarchy convention used by NoCoder/omagrab: launch via
`xdg-terminal-exec --app-id=monitor-tui` (terminal-agnostic; the default kitty
accepts any class) and match the rules on class instead of title:

  windowrule = float on,  match:class ^(monitor-tui)$
  windowrule = center on, match:class ^(monitor-tui)$
  windowrule = size 800 600, match:class ^(monitor-tui)$
  windowrule = pin on,    match:class ^(monitor-tui)$

Drop the per-terminal ghostty/kitty/alacritty/foot detection and broaden the
uninstall cleanup to remove every legacy form (title rules + old paths).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
28allday 2026-06-08 15:22:19 +01:00
parent 7083aee5dc
commit 2f77222816

View file

@ -1080,35 +1080,27 @@ install_setup() {
script_path="$INSTALL_PATH" script_path="$INSTALL_PATH"
fi fi
# Detect preferred terminal (use --title for window rules matching) # Launch via xdg-terminal-exec with a dedicated app-id so Hyprland can match
local terminal_cmd="" # and float the window by class. This is the Omarchy way (terminal-agnostic):
if command -v ghostty >/dev/null 2>&1; then # do NOT hardcode `ghostty --class=...`, because ghostty rejects app-ids that
terminal_cmd="ghostty --title='Monitor Settings' -e" # aren't valid GTK IDs (no dot) and silently falls back to com.mitchellh.ghostty,
elif command -v kitty >/dev/null 2>&1; then # so the float rule never matches.
terminal_cmd="kitty --title='Monitor Settings' -e" local launch_cmd="xdg-terminal-exec --app-id=monitor-tui -e"
elif command -v alacritty >/dev/null 2>&1; then
terminal_cmd="alacritty --title='Monitor Settings' -e"
elif command -v foot >/dev/null 2>&1; then
terminal_cmd="foot --title='Monitor Settings' --"
else
u_echo "${RED}No supported terminal found (ghostty, kitty, alacritty, foot)${NC}"
return 1
fi
# Add keybinding and window rules if not already present # Add keybinding and window rules if not already present
if [ -f "$BINDINGS_FILE" ]; then if [ -f "$BINDINGS_FILE" ]; then
if ! grep -q "monitor-tui" "$BINDINGS_FILE"; then if ! grep -q "monitor-tui" "$BINDINGS_FILE"; then
u_echo "${YELLOW}Adding keybinding (Super+Alt+M) to $BINDINGS_FILE${NC}" u_echo "${YELLOW}Adding keybinding (Super+Alt+M) to $BINDINGS_FILE${NC}"
# Add window rules AND keybinding to bindings.conf (match on title) # Add window rules AND keybinding to bindings.conf (match on class)
{ {
echo "" echo ""
echo "# Monitor Configuration TUI" echo "# Monitor Configuration TUI"
echo "windowrule = match:title Monitor Settings, float on" echo "windowrule = float on, match:class ^(monitor-tui)$"
echo "windowrule = match:title Monitor Settings, size 800 600" echo "windowrule = center on, match:class ^(monitor-tui)$"
echo "windowrule = match:title Monitor Settings, center on" echo "windowrule = size 800 600, match:class ^(monitor-tui)$"
echo "windowrule = match:title Monitor Settings, pin on" echo "windowrule = pin on, match:class ^(monitor-tui)$"
echo "bindd = SUPER ALT, M, Monitor Settings, exec, $terminal_cmd \"$script_path\"" echo "bindd = SUPER ALT, M, Monitor Settings, exec, $launch_cmd \"$script_path\""
echo "# End Monitor Configuration TUI" echo "# End Monitor Configuration TUI"
} >> "$BINDINGS_FILE" } >> "$BINDINGS_FILE"
u_echo "${GREEN}Keybinding and window rules added!${NC}" u_echo "${GREEN}Keybinding and window rules added!${NC}"
@ -1150,11 +1142,11 @@ install_setup() {
# Add binding and window rules dynamically (avoid full reload which breaks multi-monitor workspace switching) # Add binding and window rules dynamically (avoid full reload which breaks multi-monitor workspace switching)
# Unbind first to prevent duplicate bindings, then add fresh # Unbind first to prevent duplicate bindings, then add fresh
hyprctl keyword unbind "SUPER ALT, M" >/dev/null 2>&1 hyprctl keyword unbind "SUPER ALT, M" >/dev/null 2>&1
hyprctl keyword windowrule "match:title Monitor Settings, float on" >/dev/null 2>&1 hyprctl keyword windowrule "float on, match:class ^(monitor-tui)$" >/dev/null 2>&1
hyprctl keyword windowrule "match:title Monitor Settings, size 800 600" >/dev/null 2>&1 hyprctl keyword windowrule "center on, match:class ^(monitor-tui)$" >/dev/null 2>&1
hyprctl keyword windowrule "match:title Monitor Settings, center on" >/dev/null 2>&1 hyprctl keyword windowrule "size 800 600, match:class ^(monitor-tui)$" >/dev/null 2>&1
hyprctl keyword windowrule "match:title Monitor Settings, pin on" >/dev/null 2>&1 hyprctl keyword windowrule "pin on, match:class ^(monitor-tui)$" >/dev/null 2>&1
hyprctl keyword bindd "SUPER ALT, M, Monitor Settings, exec, $terminal_cmd \"$script_path\"" >/dev/null 2>&1 hyprctl keyword bindd "SUPER ALT, M, Monitor Settings, exec, $launch_cmd \"$script_path\"" >/dev/null 2>&1
echo "" echo ""
u_echo "${GREEN}Press Super+Alt+M to open this TUI.${NC}" u_echo "${GREEN}Press Super+Alt+M to open this TUI.${NC}"
else else
@ -1179,11 +1171,12 @@ uninstall() {
if [ -f "$BINDINGS_FILE" ]; then if [ -f "$BINDINGS_FILE" ]; then
# Primary cleanup: remove the marked block # Primary cleanup: remove the marked block
sed -i '/# Monitor Configuration TUI/,/# End Monitor Configuration TUI/d' "$BINDINGS_FILE" sed -i '/# Monitor Configuration TUI/,/# End Monitor Configuration TUI/d' "$BINDINGS_FILE"
# Fallback: remove any remaining monitor-tui.sh references only # Fallbacks if the marked block was manually edited. Covers every form
sed -i '/monitor-tui\.sh/d' "$BINDINGS_FILE" # this tool has ever written: bindd line, class rules, old Downloads
# Fallback: remove exact title match rules (be specific to avoid collateral damage) # path, and the legacy title-based rules.
sed -i '/monitor-tui/d' "$BINDINGS_FILE"
sed -i '/title:\^Monitor Settings\$/d' "$BINDINGS_FILE" sed -i '/title:\^Monitor Settings\$/d' "$BINDINGS_FILE"
sed -i '/match:title Monitor Settings/d' "$BINDINGS_FILE" sed -i '/match:title \^\?Monitor Settings\$\?/d' "$BINDINGS_FILE"
c_echo "${GREEN}Keybinding and window rules removed.${NC}" c_echo "${GREEN}Keybinding and window rules removed.${NC}"
fi fi