#!/usr/bin/env bash # Robust Monitor Setup with Workspace Assignments notify-send "Monitor Setup" "Starting configuration..." # ------------------------------------------------------------------- # Phase 1: Reset State # ------------------------------------------------------------------- #hyprctl keyword monitor "" # Clear all monitor rules #hyprctl keyword workspace "" # Clear workspace assignments #sleep 1 # ------------------------------------------------------------------- # Phase 2: Hardware Detection # ------------------------------------------------------------------- MONITORS=$(hyprctl monitors -j all) LAPTOP="eDP-1" LID_STATE=$(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') EXTERNAL_MONITORS=($(echo "$MONITORS" | jq -r '.[] | select(.name != "eDP-1") | .name')) # ------------------------------------------------------------------- # Phase 3: Configuration # ------------------------------------------------------------------- # Case 1: No externals - Laptop only if [ ${#EXTERNAL_MONITORS[@]} -eq 0 ]; then notify-send "Monitor Setup" "Laptop-only mode" hyprctl keyword monitor "$LAPTOP,1920x1200@60,0x0,1.5" sleep 1 # Assign all workspaces to laptop for ws in {1..10}; do hyprctl keyword "workspace $ws, monitor:$LAPTOP" done # Case 2: Any external monitors else # Try to identify known monitors by serial ULTRAWIDE=$(echo "$MONITORS" | jq -r '.[] | select(.serial == "303NTLE84432") | .name') STANDARD=$(echo "$MONITORS" | jq -r '.[] | select(.serial == "H4LN801666") | .name') # Dual monitor setup (known monitors) if [ -n "$ULTRAWIDE" ] && [ -n "$STANDARD" ]; then notify-send "Monitor Setup" "Dual monitor mode (Ultrawide + Standard)" # Configure monitors hyprctl keyword monitor "$ULTRAWIDE,5120x1440@120,0x1440,1" sleep 1 hyprctl keyword monitor "$STANDARD,3440x1440@60,840x0,1" sleep 1 hyprctl dispatch dpms off "$LAPTOP" # Workspace assignments: # 1-4 on Ultrawide, 5-10 on Standard for ws in {1..4}; do hyprctl keyword "workspace $ws, monitor:$ULTRAWIDE" hyprctl dispatch moveworkspacetomonitor "$ws $ULTRAWIDE" done for ws in {5..9}; do hyprctl keyword "workspace $ws, monitor:$STANDARD" hyprctl dispatch moveworkspacetomonitor "$ws $STANDARD" done hyprctl keyword "workspace 10, monitor:$LAPTOP" hyprctl dispatch moveworkspacetomonitor "10 $LAPTOP" # Single external (any monitor) else EXT_MON=${EXTERNAL_MONITORS[0]} notify-send "Monitor Setup" "Single external: $EXT_MON" # Get max resolution MAX_RES=$(echo "$MONITORS" | jq -r ".[] | select(.name == \"$EXT_MON\") | .availableModes[0] | \"\(.width)x\(.height)@\(.refreshRate)\"") # Check lid state if [ "$LID_STATE" == "closed" ]; then # Lid closed - only external monitor notify-send "Monitor Setup" "Lid closed - using external only" hyprctl dispatch dpms off "$LAPTOP" hyprctl keyword monitor "$EXT_MON,$MAX_RES,0x0,1" sleep 1 hyprctl keyword "workspace 10, monitor:$LAPTOP" hyprctl dispatch moveworkspacetomonitor "10 $LAPTOP" # Assign all workspaces to external for ws in {1..9}; do hyprctl keyword "workspace $ws, monitor:$EXT_MON" hyprctl dispatch moveworkspacetomonitor "$ws $EXT_MON" done else # Lid open - both monitors notify-send "Monitor Setup" "Lid open - using laptop + external" hyprctl keyword monitor "$LAPTOP,1920x1200@60,0x0,1.5" sleep 1 hyprctl keyword monitor "$EXT_MON,$MAX_RES,1920x0,1" sleep 1 # Workspace assignments: # 1-4 on laptop, 5-10 on external for ws in {1..4}; do hyprctl keyword "workspace $ws, monitor:$LAPTOP" hyprctl dispatch moveworkspacetomonitor "$ws $LAPTOP" done for ws in {5..10}; do hyprctl keyword "workspace $ws, monitor:$EXT_MON" hyprctl dispatch moveworkspacetomonitor "$ws $EXT_MON" done fi fi fi # ------------------------------------------------------------------- # Finalization # ------------------------------------------------------------------- sleep 1 notify-send "Monitor Setup Complete" "Active configuration:\n$(hyprctl monitors)"