The lock service arms a 5s blank timer whenever the screen locks, and input at the lock screen re-arms it. Closing the lid sprays pointer noise over the lock surface, so the timer was routinely armed right before suspend, froze mid-countdown, and fired moments after resume -- blanking the freshly woken unlock screen under the user. Guard the timer with a wall-clock check: if far more time elapsed than the interval, the countdown slept through a suspend, so take a fresh run-up instead of blanking. This also blanks the lock screen 5s after an untouched resume. Two accomplices made the flash worse and hid the real bug: - The clamshell watcher's 2s poll fired an unconditional global DPMS enable whenever no external monitor was active, relighting any blank within 2 seconds (lock-screen blanking never stuck on undocked laptops) and racing the resume modeset. Recovery now only wakes displays when it actually re-enables one. - Every keystroke at the lock screen dispatched a redundant DPMS enable via omarchy-system-wake, forcing extra modesets in the fragile just-resumed DRM state. Brightness "on" now skips the dispatch when every active display is already lit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
73 lines
1.9 KiB
Bash
Executable File
73 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Enable, disable, toggle, or recover the internal laptop display
|
|
# omarchy:args=<on|off|toggle|recover>
|
|
|
|
TOGGLE="internal-monitor-disable"
|
|
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.lua"
|
|
MIRROR_TOGGLE="internal-monitor-mirror"
|
|
|
|
# Get internal monitor name dynamically, including disabled outputs.
|
|
INTERNAL=$(hyprctl monitors all -j | jq -r '.[] | select(.name | test("^(eDP|LVDS|DSI)-")).name' | head -n 1)
|
|
|
|
wake() {
|
|
hyprctl dispatch 'hl.dsp.dpms({ action = "enable" })' >/dev/null 2>&1 || true
|
|
}
|
|
|
|
on() {
|
|
if omarchy-hyprland-toggle-enabled $TOGGLE; then
|
|
omarchy-hyprland-toggle $TOGGLE off
|
|
omarchy-notification-send -g "Laptop display enabled"
|
|
fi
|
|
|
|
wake
|
|
}
|
|
|
|
off() {
|
|
if [[ -z $INTERNAL ]]; then
|
|
omarchy-notification-send -g "No laptop display found"
|
|
exit 1
|
|
fi
|
|
|
|
if ! omarchy-hyprland-monitor-external-active; then
|
|
omarchy-notification-send -g "Can't disable the only active display"
|
|
exit 1
|
|
fi
|
|
|
|
if omarchy-hyprland-toggle-disabled $TOGGLE && omarchy-hyprland-toggle-disabled $MIRROR_TOGGLE; then
|
|
printf 'hl.monitor({ output = "%s", disabled = true })\n' "$INTERNAL" >"$TOGGLE_FLAG"
|
|
omarchy-notification-send -g "Laptop display disabled"
|
|
hyprctl reload
|
|
fi
|
|
}
|
|
|
|
recover() {
|
|
# Runs from the clamshell watcher every few seconds, so it must be a no-op
|
|
# unless it actually re-enables a display: an unconditional wake here undoes
|
|
# lock-screen blanking and races the resume modeset into a visible flash.
|
|
omarchy-hyprland-monitor-external-active && return 0
|
|
omarchy-hyprland-toggle-enabled $TOGGLE || return 0
|
|
|
|
omarchy-hyprland-toggle $TOGGLE off
|
|
wake
|
|
}
|
|
|
|
toggle() {
|
|
if omarchy-hyprland-toggle-enabled $TOGGLE; then
|
|
on
|
|
else
|
|
off
|
|
fi
|
|
}
|
|
|
|
case "$1" in
|
|
on) on ;;
|
|
off) off ;;
|
|
toggle) toggle ;;
|
|
recover) recover ;;
|
|
*)
|
|
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|