adds F7 screen rotation bind+script

This commit is contained in:
2025-08-21 01:23:58 +02:00
parent e3b628dab1
commit ae154bcaa7
2 changed files with 78 additions and 0 deletions

View File

@ -166,3 +166,6 @@ binds {
# Toggle Waybar
bind = $mainMod, W, exec, killall -SIGUSR1 waybar
# Toggle Monitor Flip
bind = $mainMod, F7, exec, ~/.config/hypr/scripts/rotate_current_screen.sh

View File

@ -0,0 +1,75 @@
#!/usr/bin/env bash
# Rotate the CURRENTLY FOCUSED monitor in 90° steps: 0→90→180→270→0…
set -euo pipefail
notify() {
if command -v notify-send >/dev/null 2>&1; then
notify-send -a "Hyprland" "$1" "${2:-}"
else
[ -n "${2:-}" ] && printf '%s: %s\n' "$1" "$2" >&2 || printf '%s\n' "$1" >&2
fi
}
# Read monitors
MON_JSON="$(hyprctl -j monitors 2>/dev/null || true)"
if [ -z "$MON_JSON" ]; then
notify "Hyprland error" "Couldnt read monitors via hyprctl."
exit 1
fi
# Focused monitor info
if command -v jq >/dev/null 2>&1; then
NAME="$(printf '%s' "$MON_JSON" | jq -r '.[] | select(.focused==true) | .name' | head -n1)"
DESC="$(printf '%s' "$MON_JSON" | jq -r '.[] | select(.focused==true) | .description' | head -n1)"
TFORM="$(printf '%s' "$MON_JSON" | jq -r '.[] | select(.focused==true) | (.transform // 0)' | head -n1)"
else
NAME=""; DESC=""; TFORM=""; FOC=0; GOT=0
while IFS= read -r line || [ -n "$line" ]; do
if [[ $line =~ ^Monitor[[:space:]]+([^[:space:]]+)[[:space:]]+\(ID[[:space:]] ]]; then
if (( FOC==1 )); then GOT=1; break; fi
NAME="${BASH_REMATCH[1]}"; DESC=""; TFORM=""; FOC=0
elif [[ $line =~ ^[[:space:]]*description:[[:space:]]*(.*)$ ]]; then
DESC="${BASH_REMATCH[1]}"
elif [[ $line =~ ^[[:space:]]*transform:[[:space:]]*([0-9]+)$ ]]; then
TFORM="${BASHREMATCH[1]}"
elif [[ $line =~ ^[[:space:]]*focused:[[:space:]]*yes$ ]]; then
FOC=1
elif [[ -z $line ]]; then
if (( FOC==1 )); then GOT=1; break; fi
fi
done < <(hyprctl monitors 2>/dev/null)
if (( GOT==0 && FOC==1 )); then GOT=1; fi
if (( GOT==0 )); then NAME=""; fi
: "${TFORM:=0}"
fi
if [ -z "${NAME:-}" ] || [ "${NAME:-null}" = "null" ]; then
notify "No active monitor to rotate" "Couldnt determine a focused monitor."
exit 1
fi
# Use description if available (most specific), else connector name
if [ -n "${DESC:-}" ] && [ "${DESC:-null}" != "null" ]; then
IDENT="desc:${DESC}"
else
IDENT="${NAME}" # bare connector name; no "name:" prefix
fi
# Base monitor string
BASE="${IDENT}, highres@highrr, auto-right, 1"
# Compute next transform in 90° steps (ignore flipped bit if present)
if ! [[ "${TFORM:-}" =~ ^[0-9]+$ ]]; then TFORM=0; fi
BASE_ROT=$(( TFORM % 4 ))
NEXT=$(( (BASE_ROT + 1) % 4 ))
DEG=$(( NEXT * 90 ))
run_hyprctl() {
if ! OUT="$(hyprctl keyword monitor "$1" 2>&1)"; then
notify "hyprctl failed" "$OUT"
exit 1
fi
}
run_hyprctl "$BASE, transform, $NEXT"
notify "Rotation applied" "${DESC:-$NAME}${DEG}° (transform $NEXT)"