mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-01 20:28:16 +02:00
88 lines
2.9 KiB
Bash
Executable File
88 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Show, set, or adjust focused Hyprland monitor scaling
|
|
# omarchy:args=[up|down|1|1.25|1.6|2|3|4]
|
|
# omarchy:examples=omarchy hyprland monitor scaling | omarchy hyprland monitor scaling 1.6 | omarchy hyprland monitor scaling up | omarchy hyprland monitor scaling down
|
|
|
|
SCALES=(1 1.25 1.6 2 3 4)
|
|
|
|
usage() {
|
|
echo "Usage: omarchy-hyprland-monitor-scaling [up|down|1|1.25|1.6|2|3|4]"
|
|
}
|
|
|
|
focused_monitor_scale() {
|
|
hyprctl monitors -j | jq -er '.[] | select(.focused == true) | .scale'
|
|
}
|
|
|
|
set_scale() {
|
|
local new_scale="$1"
|
|
local monitor_info="$(hyprctl monitors -j | jq -e -c '.[] | select(.focused == true)')"
|
|
local active_monitor="$(echo "$monitor_info" | jq -r '.name')"
|
|
local width="$(echo "$monitor_info" | jq -r '.width')"
|
|
local height="$(echo "$monitor_info" | jq -r '.height')"
|
|
local refresh_rate="$(echo "$monitor_info" | jq -r '.refreshRate')"
|
|
local monitor_lua="$HOME/.config/hypr/monitors.lua"
|
|
|
|
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.
|
|
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_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_scale"'")|' \
|
|
"$monitor_lua"
|
|
fi
|
|
}
|
|
|
|
scale_from_current() {
|
|
local direction="${1:-}"
|
|
|
|
# Find the preset closest to the current scale (Hyprland may snap fractional
|
|
# scales to nearby values, so we can't match exactly).
|
|
awk -v direction="$direction" -v list="${SCALES[*]}" '
|
|
NR == 1 { scale = $0; found = 1 }
|
|
END {
|
|
if (!found) exit 1
|
|
|
|
n = split(list, scales, " ")
|
|
best = 1; best_diff = 1e9
|
|
for (i = 1; i <= n; i++) {
|
|
diff = scale - scales[i]; if (diff < 0) diff = -diff
|
|
if (diff < best_diff) { best_diff = diff; best = i }
|
|
}
|
|
|
|
if (direction == "next" && best < n) best++
|
|
else if (direction == "previous" && best > 1) best--
|
|
|
|
print scales[best]
|
|
}'
|
|
}
|
|
|
|
case "${1:-}" in
|
|
"")
|
|
focused_monitor_scale | scale_from_current
|
|
;;
|
|
-h | --help)
|
|
usage
|
|
;;
|
|
up)
|
|
set_scale "$(focused_monitor_scale | scale_from_current next)"
|
|
;;
|
|
down)
|
|
set_scale "$(focused_monitor_scale | scale_from_current previous)"
|
|
;;
|
|
1 | 1.25 | 1.6 | 2 | 3 | 4)
|
|
set_scale "$1"
|
|
;;
|
|
*)
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|