mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-01 20:28:16 +02:00
55 lines
2.3 KiB
Bash
Executable File
55 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, 3x, and 4x
|
|
|
|
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
|
|
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
|
|
CURRENT_SCALE=$(echo "$MONITOR_INFO" | jq -r '.scale')
|
|
WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width')
|
|
HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height')
|
|
REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate')
|
|
|
|
# Cycle through monitor/GDK scale pairs: 1 → 1.25 → 1.6 → 2 → 3 → 4 → 1 (or reverse with --reverse)
|
|
SCALES=(1 1.25 1.6 2 3 4)
|
|
GDK_SCALES=(1 1.25 1.75 2 3 4)
|
|
|
|
# Find the index of the scale closest to the current one (Hyprland may
|
|
# snap fractional scales to nearby values, so we can't match exactly)
|
|
CURRENT_IDX=$(awk -v s="$CURRENT_SCALE" -v list="${SCALES[*]}" 'BEGIN {
|
|
n = split(list, arr, " ")
|
|
best = 0; best_diff = 1e9
|
|
for (i = 1; i <= n; i++) {
|
|
d = s - arr[i]; if (d < 0) d = -d
|
|
if (d < best_diff) { best_diff = d; best = i - 1 }
|
|
}
|
|
print best
|
|
}')
|
|
|
|
if [[ $1 == "--reverse" ]]; then
|
|
NEW_IDX=$(( (CURRENT_IDX - 1 + ${#SCALES[@]}) % ${#SCALES[@]} ))
|
|
else
|
|
NEW_IDX=$(( (CURRENT_IDX + 1) % ${#SCALES[@]} ))
|
|
fi
|
|
|
|
NEW_SCALE=${SCALES[$NEW_IDX]}
|
|
NEW_GDK_SCALE=${GDK_SCALES[$NEW_IDX]}
|
|
|
|
hyprctl eval "hl.monitor({ output = \"$ACTIVE_MONITOR\", mode = \"${WIDTH}x${HEIGHT}@${REFRESH_RATE}\", position = \"auto\", scale = $NEW_SCALE })" >/dev/null
|
|
|
|
# Persist to monitors.lua if the user still has Omarchy's generic catch-all
|
|
# defaults, so the scale survives reboots.
|
|
MONITOR_LUA="$HOME/.config/hypr/monitors.lua"
|
|
if [[ -f $MONITOR_LUA ]] && grep -q '^local omarchy_monitor_scale = ' "$MONITOR_LUA"; then
|
|
sed -i -E \
|
|
-e "s|^local omarchy_monitor_scale = .*|local omarchy_monitor_scale = ${NEW_SCALE}|" \
|
|
-e "s|^local omarchy_gdk_scale = .*|local omarchy_gdk_scale = ${NEW_GDK_SCALE}|" \
|
|
"$MONITOR_LUA"
|
|
elif [[ -f $MONITOR_LUA ]] && grep -Eq '^hl\.monitor\(\{ output = "", mode = "preferred", position = "auto", scale = ("auto"|[0-9.]+) \}\)' "$MONITOR_LUA"; then
|
|
sed -i -E \
|
|
-e "s|^(hl\.monitor\(\{ output = \"\", mode = \"preferred\", position = \"auto\", scale = )([^ ]+)( \}\))|\\1${NEW_SCALE}\\3|" \
|
|
-e 's|^hl\.env\("GDK_SCALE", ".*"\)|hl.env("GDK_SCALE", "'"$NEW_GDK_SCALE"'")|' \
|
|
"$MONITOR_LUA"
|
|
fi
|
|
|
|
notify-send -u low " Display scaling set to ${NEW_SCALE}x"
|