54 lines
2.0 KiB
Bash
Executable File
54 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# ~/.config/hypr/scripts/lid_handler.sh
|
|
|
|
# The file that tells Hyprland to keep the lid off during reloads
|
|
LID_STATE_FILE="$HOME/.config/hypr/lid_state.conf"
|
|
|
|
restart_ui() {
|
|
# Spawn in background and detach
|
|
systemctl restart --user waybar hyprpaper
|
|
}
|
|
|
|
if [[ "$1" == "close" ]]; then
|
|
# Check if ANY external monitor is connected and active
|
|
if hyprctl monitors all | grep -qE "Monitor (DP|HDMI|Type-C)-"; then
|
|
|
|
# Prevent laptop screen from turning on during manual config reloads
|
|
echo "monitor=eDP-1, disable" > "$LID_STATE_FILE"
|
|
|
|
# Extract the CURRENT live settings of all external monitors using jq
|
|
# This grabs the active resolution, refresh rate, position, and scale.
|
|
LIVE_MONITORS=$(hyprctl -j monitors | jq -c '.[] | select(.name != "eDP-1")')
|
|
|
|
# 3. Disable the laptop screen
|
|
hyprctl keyword monitor "eDP-1, disable"
|
|
|
|
# 4. Re-apply the live settings to external monitors so they don't reset
|
|
echo "$LIVE_MONITORS" | while read -r mon_json; do
|
|
NAME=$(echo "$mon_json" | jq -r '.name')
|
|
WIDTH=$(echo "$mon_json" | jq -r '.width')
|
|
HEIGHT=$(echo "$mon_json" | jq -r '.height')
|
|
REFRESH=$(echo "$mon_json" | jq -r '.refreshRate')
|
|
X=$(echo "$mon_json" | jq -r '.x')
|
|
Y=$(echo "$mon_json" | jq -r '.y')
|
|
SCALE=$(echo "$mon_json" | jq -r '.scale')
|
|
|
|
# Formats it exactly as Hyprland expects: DP-1, 1920x1080@240, 0x0, 1
|
|
hyprctl keyword monitor "$NAME, ${WIDTH}x${HEIGHT}@${REFRESH}, ${X}x${Y}, $SCALE"
|
|
done
|
|
|
|
# restart ui
|
|
restart_ui
|
|
fi
|
|
|
|
elif [[ "$1" == "open" ]]; then
|
|
# Clear the override file so the laptop screen is allowed to turn on again
|
|
echo "" > "$LID_STATE_FILE"
|
|
|
|
# Let Hyprland reload itself.
|
|
# This automatically re-enables eDP-1 based on your hardcoded hyprland.conf!
|
|
hyprctl reload
|
|
|
|
restart_ui
|
|
fi
|