From 73da4b79e10a6ead90112829bde02f809d530e95 Mon Sep 17 00:00:00 2001 From: Mark Dickie Date: Sun, 19 Oct 2025 12:04:37 +0200 Subject: [PATCH] Add window group script --- bin/window-group.sh | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100755 bin/window-group.sh diff --git a/bin/window-group.sh b/bin/window-group.sh new file mode 100755 index 0000000..33cf670 --- /dev/null +++ b/bin/window-group.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -euo pipefail + +GROUP="" +MODE="class" # or "group", depending on how you group windows + +while getopts "g:m:h" opt; do + case "$opt" in + g) GROUP="$OPTARG" ;; + m) MODE="$OPTARG" ;; + h) + echo "Usage: $0 -g GROUP [-m group|class|title]" + exit 0 + ;; + *) + echo "Usage: $0 -g GROUP [-m group|class|title]" + exit 1 + ;; + esac +done + +if [ -z "$GROUP" ]; then + echo "You must provide a group name with -g" + exit 2 +fi + +command -v hyprctl >/dev/null || { echo "hyprctl not found."; exit 3; } +command -v jq >/dev/null || { echo "jq not found."; exit 3; } +command -v wofi >/dev/null || { echo "wofi not found."; exit 3; } + +# Get window info as JSON +WINDOWS_JSON=$(hyprctl clients -j) + +# Filter by mode +case "$MODE" in + group) + FILTER="select(.group == \"$GROUP\")" + ;; + class) + FILTER="select(.class == \"$GROUP\")" + ;; + title) + FILTER="select(.title | test(\"$GROUP\"))" + ;; + *) + echo "Invalid mode: $MODE" + exit 4 + ;; +esac + +# Build menu list: address::workspace — title +WINDOW_LIST=$(echo "$WINDOWS_JSON" | jq -r " + .[] + | $FILTER + | \"\(.address)::[\(.workspace.name)] \(.class) — \(.title)\" +") + +if [ -z "$WINDOW_LIST" ]; then + echo "No matching windows for '$GROUP' (mode: $MODE)" | wofi --dmenu -p "Hyprland Windows" + exit 0 +fi + +CHOICE=$(printf '%s\n' "$WINDOW_LIST" | wofi --dmenu -p "Windows in $GROUP") + +[ -z "$CHOICE" ] && exit 0 + +ADDR=${CHOICE%%::*} + +# Focus the chosen window +hyprctl dispatch focuswindow address:"$ADDR" -- 2.51.2