summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/hypr/scripts/raveos-monitor-setup.sh
blob: 2790ee45ec7f1237770712a82dc5e36288e999ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/bash
# raveos-monitor-setup - Auto-detect monitors and generate Hyprland config
# Sets each monitor to max resolution at 60Hz
#
# Usage: raveos-monitor-setup.sh [--hypr-dir PATH]
#   Default hypr dir: ~/.config/hypr

HYPR_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/hypr"

# Parse arguments
while [[ $# -gt 0 ]]; do
    case "$1" in
        --hypr-dir) HYPR_DIR="$2"; shift 2 ;;
        *) shift ;;
    esac
done

MONITORS_CONF="$HYPR_DIR/monitors.conf"
WORKSPACES_CONF="$HYPR_DIR/workspaces.conf"

# Find connected monitors via DRM sysfs
declare -a MON_NAMES
declare -a MON_RESOLUTIONS
declare -a MON_WIDTHS

for card_output in /sys/class/drm/card*-*; do
    [[ ! -d "$card_output" ]] && continue

    status=$(cat "$card_output/status" 2>/dev/null)
    [[ "$status" != "connected" ]] && continue

    # Get output name: card0-DP-1 → DP-1, card1-HDMI-A-1 → HDMI-A-1
    raw_name=$(basename "$card_output")
    name="${raw_name#card*-}"

    # Get available modes (first line = highest resolution)
    modes_file="$card_output/modes"
    if [[ -f "$modes_file" ]]; then
        max_mode=$(head -1 "$modes_file")
        if [[ -n "$max_mode" ]]; then
            # Extract width from resolution (e.g., 2560x1440 → 2560)
            width="${max_mode%%x*}"
            MON_NAMES+=("$name")
            MON_RESOLUTIONS+=("$max_mode")
            MON_WIDTHS+=("$width")
        fi
    fi
done

# If no monitors found, use fallback
if [[ ${#MON_NAMES[@]} -eq 0 ]]; then
    cat > "$MONITORS_CONF" << 'EOF'
# Auto-generated by raveos-monitor-setup
# No monitors detected - using fallback
monitor=,preferred,auto,1
EOF
    cat > "$WORKSPACES_CONF" << 'EOF'
# Auto-generated by raveos-monitor-setup
# No monitors detected
EOF
    echo "No monitors detected, using fallback config"
    exit 0
fi

# Generate monitors.conf
cat > "$MONITORS_CONF" << 'EOF'
# Auto-generated by raveos-monitor-setup
# Run raveos-monitor-setup.sh to reconfigure monitors
EOF

pos_x=0
for ((i=0; i<${#MON_NAMES[@]}; i++)); do
    echo "monitor=${MON_NAMES[$i]}, ${MON_RESOLUTIONS[$i]}@60, ${pos_x}x0, 1" >> "$MONITORS_CONF"
    pos_x=$((pos_x + MON_WIDTHS[i]))
done

# Generate workspaces.conf - distribute 10 workspaces across monitors
cat > "$WORKSPACES_CONF" << 'EOF'
# Auto-generated by raveos-monitor-setup
EOF

num_monitors=${#MON_NAMES[@]}
ws_per_mon=$((10 / num_monitors))
remaining=$((10 % num_monitors))

ws=1
for ((i=0; i<num_monitors; i++)); do
    count=$ws_per_mon
    [[ $i -lt $remaining ]] && ((count++))

    for ((j=0; j<count; j++)); do
        echo "workspace=$ws, monitor:${MON_NAMES[$i]}, persistent:1" >> "$WORKSPACES_CONF"
        ((ws++))
    done
done

echo "Monitor setup complete: ${#MON_NAMES[@]} monitor(s) configured"
for ((i=0; i<${#MON_NAMES[@]}; i++)); do
    echo "  ${MON_NAMES[$i]}: ${MON_RESOLUTIONS[$i]}@60"
done