131 lines
4.9 KiB
Bash
Executable File
131 lines
4.9 KiB
Bash
Executable File
#!/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)
|
||
|
||
EXTERNAL=$(echo "$MONITORS" | jq -r '.[] | select(.name != "'$LAPTOP'") | .name' | head -1)
|
||
|
||
# Improved function to get the maximum resolution with highest refresh rate
|
||
get_max_res() {
|
||
local monitor=$1
|
||
|
||
# Get all available modes for the monitor
|
||
local modes=$(echo "$MONITORS" | jq -r ".[] | select(.name == \"$monitor\") | .availableModes[]")
|
||
|
||
if [[ -z "$modes" ]]; then
|
||
echo "preferred"
|
||
return
|
||
fi
|
||
|
||
# Find the mode with the highest resolution and refresh rate
|
||
local max_pixels=0
|
||
local max_refresh=0
|
||
local best_mode="preferred"
|
||
|
||
while IFS= read -r mode; do
|
||
# Extract width, height, and refresh rate
|
||
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//')
|
||
|
||
# Calculate total pixels (width × height) for better comparison
|
||
local pixels=$((width * height))
|
||
|
||
# First prioritize by total pixel count (resolution), then by refresh rate
|
||
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"
|
||
}
|
||
|
||
# Alternative method to get max resolution using hyprctl
|
||
get_max_res_alt() {
|
||
local monitor=$1
|
||
local modes=$(hyprctl monitors -j | jq -r ".[] | select(.name == \"$monitor\") | .availableModes[]")
|
||
|
||
if [[ -z "$modes" ]]; then
|
||
# Try querying wlr-randr directly as a fallback
|
||
if command -v wlr-randr &> /dev/null; then
|
||
modes=$(wlr-randr | grep -A 10 "$monitor" | grep -o '[0-9]\+x[0-9]\+@[0-9.]\+Hz')
|
||
fi
|
||
fi
|
||
|
||
if [[ -z "$modes" ]]; then
|
||
echo "preferred"
|
||
return
|
||
fi
|
||
|
||
# Find highest resolution with best refresh rate
|
||
local best_mode=$(echo "$modes" | sort -nr -k1 -t'x' -k2 -t'@' | head -1)
|
||
echo "$best_mode"
|
||
}
|
||
|
||
# Get resolution for monitors - try both methods
|
||
EXT_RES=$(get_max_res "$EXTERNAL")
|
||
if [[ "$EXT_RES" == "preferred" ]]; then
|
||
EXT_RES=$(get_max_res_alt "$EXTERNAL")
|
||
fi
|
||
|
||
LAPTOP_RES=$(get_max_res "$LAPTOP")
|
||
if [[ "$LAPTOP_RES" == "preferred" ]]; then
|
||
LAPTOP_RES=$(get_max_res_alt "$LAPTOP")
|
||
fi
|
||
|
||
# Case 1: Only laptop
|
||
if [ -z "$EXTERNAL" ]; then
|
||
notify-send -t 3000 "Monitor Setup" "Laptop-only mode\nUsing: $LAPTOP_RES"
|
||
hyprctl keyword monitor "$LAPTOP,$LAPTOP_RES,auto,1"
|
||
|
||
for ws in {1..5}; do
|
||
hyprctl keyword "workspace $ws,monitor:$LAPTOP" >/dev/null 2>&1
|
||
hyprctl dispatch workspace "$ws" >/dev/null 2>&1
|
||
hyprctl dispatch moveworkspacetomonitor "$ws $LAPTOP" 2>/dev/null
|
||
done
|
||
exit 0
|
||
fi
|
||
|
||
# Case 2: External + open lid
|
||
if [ "$LID_STATE" = "open" ]; then
|
||
notify-send -t 3000 "Monitor Setup" "Dual monitor mode (Laptop + External)\nLaptop: $LAPTOP_RES\nExternal: $EXT_RES"
|
||
hyprctl keyword monitor "$LAPTOP,$LAPTOP_RES,auto,1"
|
||
hyprctl keyword monitor "$EXTERNAL,$EXT_RES,auto,1"
|
||
|
||
for ws in {1..3}; do
|
||
hyprctl keyword "workspace $ws,monitor:$LAPTOP" >/dev/null 2>&1
|
||
hyprctl dispatch workspace "$ws" >/dev/null 2>&1
|
||
hyprctl dispatch moveworkspacetomonitor "$ws $LAPTOP" 2>/dev/null
|
||
done
|
||
for ws in {4..5}; do
|
||
hyprctl keyword "workspace $ws,monitor:$EXTERNAL" >/dev/null 2>&1
|
||
hyprctl dispatch workspace "$ws" >/dev/null 2>&1
|
||
hyprctl dispatch moveworkspacetomonitor "$ws $EXTERNAL" 2>/dev/null
|
||
done
|
||
# Case 3: External + closed lid
|
||
else
|
||
notify-send -t 3000 "Monitor Setup" "External monitor only (Lid closed)\nUsing: $EXT_RES"
|
||
hyprctl dispatch dpms off "$LAPTOP"
|
||
hyprctl keyword monitor "$LAPTOP,disable"
|
||
hyprctl keyword monitor "$EXTERNAL,$EXT_RES,0x0,1"
|
||
|
||
for ws in {1..5}; do
|
||
hyprctl keyword "workspace $ws,monitor:$EXTERNAL" >/dev/null 2>&1
|
||
hyprctl dispatch workspace "$ws" >/dev/null 2>&1
|
||
hyprctl dispatch moveworkspacetomonitor "$ws $EXTERNAL" 2>/dev/null
|
||
done
|
||
fi
|
||
|
||
# Debug output - helpful for troubleshooting
|
||
echo "Monitor Configuration:" > /tmp/hypr_monitor_debug.log
|
||
echo "LAPTOP: $LAPTOP with resolution $LAPTOP_RES" >> /tmp/hypr_monitor_debug.log
|
||
echo "EXTERNAL: $EXTERNAL with resolution $EXT_RES" >> /tmp/hypr_monitor_debug.log
|
||
echo "LID_STATE: $LID_STATE" >> /tmp/hypr_monitor_debug.log
|
||
hyprctl monitors >> /tmp/hypr_monitor_debug.log
|
||
|
||
notify-send -t 5000 "Monitor Setup Complete" "Active configuration:\n$(hyprctl monitors | grep -E 'Monitor|workspace|resolution')"
|