60 lines
1.5 KiB
Bash
60 lines
1.5 KiB
Bash
#! /usr/bin/env bash
|
|
|
|
# Toggle pinned window, launch if needed
|
|
#?? toggle --type TYPE --expression EXPRESSION --workspace WORKSPACE [COMMAND]
|
|
#!! Regex may need to be double-escaped
|
|
# https://jqlang.github.io/jq/manual/#regular-expressions
|
|
|
|
focus=false
|
|
|
|
while (("$#" > 0)); do
|
|
case "$1" in
|
|
-e | --expression)
|
|
shift
|
|
expression="$1"
|
|
;;
|
|
-f | --focus)
|
|
focus=true
|
|
;;
|
|
-t | --type)
|
|
shift
|
|
type="$1"
|
|
;;
|
|
-w | --workspace)
|
|
shift
|
|
workspace="$1"
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
command="${*}"
|
|
|
|
if [[ "$command" ]]; then
|
|
if ! hyprctl -j clients | jq -re "any(.[].$type | test(\"$expression\"); . == true)"; then
|
|
hyprctl dispatch exec -- "$command" # Launch window
|
|
exit
|
|
fi
|
|
fi
|
|
|
|
current_workspace="$(hyprctl -j clients | jq -r "first(.[] | select(.$type | test(\"$expression\")).workspace.name)")"
|
|
|
|
if [[ "$current_workspace" == "$workspace" ]]; then
|
|
# HACK: Move to current workspace before pinning, otherwise some windows freeze
|
|
# https://github.com/hyprwm/Hyprland/issues/7609
|
|
# https://github.com/hyprwm/Hyprland/issues/7191
|
|
hyprctl dispatch movetoworkspacesilent "0,$type:$expression"
|
|
|
|
hyprctl dispatch pin "$type:$expression" # Pin
|
|
|
|
if "$focus"; then
|
|
hyprctl dispatch focuswindow "$type:$expression" # Focus
|
|
fi
|
|
else
|
|
hyprctl dispatch pin "$type:$expression" # Unpin
|
|
hyprctl dispatch movetoworkspacesilent "$workspace,$type:$expression" # Move to workspace
|
|
fi
|