#!/bin/bash # omarchy:summary=Show or jump to tmux windows waiting for attention # omarchy:args= # omarchy:examples=omarchy tmux alert show | omarchy tmux alert focus set -e # Session names cannot contain colons, and window names can, so they always # come last when parsed. WINDOW_FORMAT='#{window_bell_flag}#{window_activity_flag}#{window_silence_flag}:#{session_name}:#{window_index}:#{window_name}' usage() { echo "Usage: omarchy-tmux-alert " >&2 exit 1 } # Windows tmux has flagged with a bell, activity, or silence alert, which is the # same state that highlights the window in the tmux status bar. alerted_windows() { local flags session index name tmux list-windows -a -F "$WINDOW_FORMAT" 2>/dev/null | while IFS=':' read -r flags session index name; do if [[ $flags == *1* ]]; then printf '%s:%s:%s\n' "$session" "$index" "$name" fi done } show() { local windows=() window session index name description="" readarray -t windows < <(alerted_windows) for window in "${windows[@]}"; do IFS=':' read -r session index name <<<"$window" [[ -n $description ]] && description+=", " description+="$name ($session:$index)" done if [[ ${1:-} == "--json" ]]; then jq -nc --argjson count "${#windows[@]}" --arg tooltip "$description" '{count: $count, tooltip: $tooltip}' elif [[ -n $description ]]; then echo "$description" fi } focus_terminal_window() { local pid=$1 address="" window_pid window_address local -A windows=() while read -r window_pid window_address; do windows[$window_pid]=$window_address done < <(hyprctl clients -j | jq -r '.[] | "\(.pid) \(.address)"') # The tmux client runs somewhere below the terminal that owns the window. while [[ -n $pid ]] && (( pid > 1 )); do if [[ -n ${windows[$pid]:-} ]]; then address=${windows[$pid]} break fi pid=$(awk '/^PPid:/ { print $2 }' "/proc/$pid/status" 2>/dev/null) done [[ -n $address ]] || return 1 hyprctl dispatch "hl.dsp.focus({ window = \"address:$address\" })" >/dev/null 2>&1 || hyprctl dispatch focuswindow "address:$address" >/dev/null } most_recent_client() { tmux list-clients "$@" -F '#{client_activity}:#{client_tty}:#{client_pid}' 2>/dev/null | sort -rn | head -n1 } focus() { local target session index client tty pid target=$(alerted_windows | head -n1) [[ -n $target ]] || return 0 IFS=':' read -r session index _ <<<"$target" client=$(most_recent_client -t "$session") [[ -n $client ]] || client=$(most_recent_client) if [[ -z $client ]]; then tmux select-window -t "$session:$index" exec omarchy-launch-terminal tmux attach -t "$session" fi IFS=':' read -r _ tty pid <<<"$client" tmux switch-client -c "$tty" -t "$session:$index" omarchy-shell -q omarchy.indicators refresh focus_terminal_window "$pid" } case "${1:-}" in show) shift show "$@" ;; focus) focus ;; *) usage ;; esac