#!/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 scales: 1 → 1.25 → 1.6 → 2 → 3 → 4 → 1 (or reverse with --reverse) SCALES=(1 1.25 1.6 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]} hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE" # Persist to monitors.conf if the user has a single generic catch-all line # (ignoring disabled monitors), so the scale survives reboots. MONITOR_CONF="$HOME/.config/hypr/monitors.conf" if [[ -f $MONITOR_CONF ]]; then mapfile -t ACTIVE_LINES < <(grep -E '^[[:space:]]*monitor=' "$MONITOR_CONF" | grep -vE 'disable[[:space:]]*$') if [[ ${#ACTIVE_LINES[@]} -eq 1 ]] && [[ "${ACTIVE_LINES[0]}" =~ ^monitor=,preferred,auto, ]]; then sed -i -E "s|^(monitor=,preferred,auto,).*|\\1${NEW_SCALE}|" "$MONITOR_CONF" fi fi notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x"