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
|