I'm working on hyprland, one thing I am missing from my awesomewm setup is rofi list all running windows. Sometimes I put a browser instance in a different workspace and I cant find it, especially if I've full screened something over top of it.

first pass #

look for brave and go to it or make one


#!/usr/bin/env bash

addr=$(hyprctl clients -j | jq -r \
	'.[] | select(.class == "brave-browser") | .address' | head -n1)

if [ -n "$addr" ]; then
	# Focus the existing browser window
	hyprctl dispatch focuswindow address:$addr
else
	# Launch a new browser window
	brave --password-store=basic &
fi

second pass #

If there are more than one cycle between them.


# Get current window address
current_addr=$(hyprctl activewindow -j | jq -r '.address')

# Get all Brave window addresses
brave_windows=($(hyprctl clients -j | jq -r '.[] | select(.class == "brave-browser") | .address'))

num_windows=${#brave_windows[@]}

if ((num_windows == 0)); then
	# No Brave windows, launch it
	brave --password-store=basic &
	exit
fi

# Find the index of the current window in brave_windows
current_index=-1
for i in "${!brave_windows[@]}"; do
	if [[ "${brave_windows[$i]}" == "$current_addr" ]]; then
		current_index=$i
		break
	fi
done

# If we're already in a Brave window, switch to the next one (wrap around)
if ((current_index != -1)); then
	next_index=$(((current_index + 1) % num_windows))
	hyprctl dispatch focuswindow address:${brave_windows[$next_index]}
else
	# Not currently in a Brave window — focus the first one
	hyprctl dispatch focuswindow address:${brave_windows[0]}
fi

third pass #

Generalize it so that I can make keybindings for any app that I can figure out the classname of and provide a start command.


#!/usr/bin/env bash

set -euo pipefail

# Args
class="${1:-}"
shift
start_command="$*"

if [[ -z "$class" || -z "$start_command" ]]; then
	echo "Usage: $0 <class> <start-command...>"
	exit 1
fi

# Current active window
current_addr=$(hyprctl activewindow -j | jq -r '.address')

# All windows with matching class
matching_windows=($(hyprctl clients -j | jq -r --arg class "$class" '.[] | select(.class == $class) | .address'))

num_windows=${#matching_windows[@]}

if ((num_windows == 0)); then
	# None running — start it
	eval "$start_command" &
	exit
fi

# See if currently focused window is in matching list
current_index=-1
for i in "${!matching_windows[@]}"; do
	if [[ "${matching_windows[$i]}" == "$current_addr" ]]; then
		current_index=$i
		break
	fi
done

# Cycle to next window if already in one
if ((current_index != -1)); then
	next_index=$(((current_index + 1) % num_windows))
	hyprctl dispatch focuswindow address:${matching_windows[$next_index]}
else
	# Not in one — focus first
	hyprctl dispatch focuswindow address:${matching_windows[0]}
fi

finding the classname #


 hyprctl clients -j | jq | grep kitty

    "class": "kitty",
    "initialClass": "kitty",
    "initialTitle": "kitty",