#!/bin/bash # ~/.config/hypr/scripts/monitor_setup.sh notify-send -t 3000 "Monitor Setup" "Detecting display configuration..." LAPTOP="eDP-1" LID_STATE=$(grep -q "open" /proc/acpi/button/lid/LID/state && echo "open" || echo "closed") MONITORS=$(hyprctl monitors -j) if [[ $(echo "$MONITORS" | jq 'length') -eq 0 ]]; then notify-send "Monitor Error" "No monitors detected." exit 1 fi EXTERNAL=$(echo "$MONITORS" | jq -r '.[] | select(.name != "'$LAPTOP'") | .name' | head -1) get_capped_res() { local monitor=$1 local modes=$(echo "$MONITORS" | jq -r ".[] | select(.name == \"$monitor\") | .availableModes[]?") if [[ -z "$modes" ]]; then echo "preferred" return fi local max_pixels=0 local max_refresh=0 local best_mode="preferred" while IFS= read -r mode; do local width=$(echo "$mode" | awk -F'@' '{print $1}' | awk -F'x' '{print $1}') local height=$(echo "$mode" | awk -F'@' '{print $1}' | awk -F'x' '{print $2}') local refresh=$(echo "$mode" | awk -F'@' '{print $2}' | sed 's/Hz//') if (( $(echo "$refresh > 120.1" | bc -l) )); then continue fi local pixels=$((width * height)) if [[ $pixels -gt $max_pixels || ($pixels -eq $max_pixels && $(echo "$refresh > $max_refresh" | bc -l) -eq 1) ]]; then max_pixels=$pixels max_refresh=$refresh best_mode="${width}x${height}@${refresh}" fi done <<< "$modes" echo "$best_mode" } EXT_RES=$(get_capped_res "$EXTERNAL") LAPTOP_RES=$(get_capped_res "$LAPTOP") # Case 1: Laptop Only if [ -z "$EXTERNAL" ]; then notify-send -t 7000 "Monitor Setup" "Laptop Mode: $LAPTOP_RES" hyprctl --batch \ "eval 'hl.monitor({ output = \"$LAPTOP\", mode = \"$LAPTOP_RES\", position = \"auto\", scale = 1 })' ; \ eval 'hl.dsp.workspace_move_to_monitor(1, \"$LAPTOP\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(2, \"$LAPTOP\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(3, \"$LAPTOP\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(4, \"$LAPTOP\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(5, \"$LAPTOP\")'" exit 0 fi # Case 2: External + Open Lid if [ "$LID_STATE" = "open" ]; then notify-send -t 7000 "Monitor Setup" "Dual Mode\nExternal: $EXT_RES" hyprctl --batch \ "eval 'hl.monitor({ output = \"$LAPTOP\", mode = \"$LAPTOP_RES\", position = \"0x0\", scale = 1 })' ; \ eval 'hl.monitor({ output = \"$EXTERNAL\", mode = \"$EXT_RES\", position = \"auto\", scale = 1 })' ; \ eval 'hl.dsp.workspace_move_to_monitor(1, \"$EXTERNAL\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(2, \"$EXTERNAL\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(3, \"$LAPTOP\")'" # Case 3: External Only (Clamshell) else notify-send -t 3000 "Monitor Setup" "Clamshell Mode\nExternal: $EXT_RES" hyprctl --batch \ "eval 'hl.monitor({ output = \"$EXTERNAL\", mode = \"$EXT_RES\", position = \"0x0\", scale = 1 })' ; \ eval 'hl.dsp.dpms(\"off\", \"$LAPTOP\")' ; eval 'hl.monitor({ output = \"$LAPTOP\", disabled = true })' ; \ eval 'hl.dsp.workspace_move_to_monitor(1, \"$EXTERNAL\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(2, \"$EXTERNAL\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(3, \"$EXTERNAL\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(4, \"$EXTERNAL\")' ; \ eval 'hl.dsp.workspace_move_to_monitor(5, \"$EXTERNAL\")'" fi hyprctl eval 'hl.dsp.focus({ workspace = "1" })'