Files
dotfiles/env/.local/scripts/hypr/utils/windows/windowctl-picker

102 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
set -o nounset
set -o pipefail
SCRIPTS=${SCRIPTS:-$HOME/.local/scripts}
THIS_FILE=${BASH_SOURCE[0]}
LOG_LABEL=$(basename "$THIS_FILE")
THIS=${THIS:-$LOG_LABEL}
LOG_FILE=${LOG_FILE:-"$LOG_LABEL.log"}
usage() {
cat <<EOF
Shows a window picker and window details, then prompts for an action that can be
performed on the selected window.
USAGE:
$ $THIS <flags>
FLAGS:
-a | --active: Select action to perform on active window.
-h | --help: Show this page.
EOF
}
# Logging utility function, use in place of echo.
log() {
logging log --source "$THIS_FILE" "$@"
}
handle_selected_value() {
local selection=""
read -r selection
if [[ -z $selection ]]; then
log "No selected value."
return 1
fi
log "Prompting for action, window: '$selection'"
local res=$(echo "$selection" | "$SCRIPTS/hypr/utils/windows/window-action-picker" --show-back)
log "Action callback result: $res"
echo "$res"
}
prompt_for_window_selection() {
local selected_value=$("$SCRIPTS/hypr/utils/windows/window-picker")
local status=$?
if [[ $status -ne 0 ]]; then
exit $status
fi
echo "$selected_value"
}
################################################################################
# MAIN
################################################################################
# Setup logging file and label.
source "$SCRIPTS/hypr/logging"
setup-logging $LOG_FILE $LOG_LABEL
should_quit="0"
address=""
log "Starting $THIS..."
while [[ $# -gt 0 ]]; do
if [[ $1 == "-h" ]] || [[ $1 == "--help" ]]; then
usage && exit 0
elif [[ $1 == "-a" ]] || [[ $1 == "--active" ]]; then
address=$(hyprctl activewindow -j | jq -r '.address')
elif [[ -n $1 ]]; then
address=$1
fi
shift
done
trap 'log "Stoping..."; should_quit="1"' SIGINT
while [[ $should_quit -eq 0 ]]; do
if [[ -n $address ]]; then
res=$(echo $address | handle_selected_value)
else
res=$(prompt_for_window_selection | handle_selected_value)
fi
if [[ ! $res =~ ^back ]]; then
should_quit=1
elif [[ $res == "back:close" ]]; then
sleep 0.3 # allow time for windows close, to prevent showing closed windows.
fi
log "Should quit: $should_quit"
done