Summary
After upgrading aquamarine 0.10.0 → 0.11.0, an idle-driven DPMS off/on cycle (e.g. hypridle running hyprctl dispatch "dpms off" on idle and dpms on on resume) intermittently leaves the eDP panel with backlight powered on but no scanout. Hyprland reports dpmsStatus: 1, the dispatch returns ok, but aquamarine emits no further commits. Once wedged, only restarting Hyprland recovers — hyprctl reload, additional DPMS cycles, and explicit hl.monitor({disabled=true}) then disabled=false all return ok but produce zero new aquamarine output and do not recover the panel.
The bug is probabilistic — about 15–20% per cycle. Manual back-to-back hyprctl dispatch dpms off/on cycles (without going through the wayland idle protocol path) do not reproduce it.
Possibly related to #293 (same backlight-on/no-scanout symptom, same aquamarine 0.11.0 regression, same restart-only recovery), but the trigger is different (idle-driven DPMS, not explicit monitor disable/re-enable).
System
- aquamarine: 0.11.0-2 (broken). 0.10.0-4 was fine (cannot use the package directly with Hyprland 0.55 due to soname bump 9 → 10)
- Hyprland: 0.55.0-4
- Kernel: 7.0.5.arch1-1
- Distro: Arch Linux
- GPU: AMD Radeon 780M iGPU (amdgpu)
- Panel: eDP-1, Thermotrex TL140ADXP22-0, 2880x1800@60Hz, scale 2.0
- Idle daemon:
hypridle (latest)
- Reproduced on a second machine: AMD Ryzen 9 9950X desktop (different amdgpu, no VRR, no eDP) — same wedge symptom following the same idle-driven DPMS pattern
Note on kernel upgrade: the kernel was upgraded in the same window as aquamarine (linux 6.19.10 → 7.0.5 on the laptop, 6.19.12 → 7.0.5 on the desktop). I have not isolated kernel from aquamarine as the regression source — both changed at the same time, and downgrading aquamarine alone is blocked by the soname bump (0.10.0 provides libaquamarine.so=9, Hyprland 0.55 requires =10). The match with #293's symptom signature (which was reproduced on multiple kernels including 7.0.3 and 6.18.26 LTS) makes aquamarine the prime suspect, but I cannot rule out the kernel.
Steps to reproduce
- Single eDP output (no external monitors, no VRR — VRR is not required).
- Run
hypridle with this listener (any short timeout works; 5s for fast iteration):
listener {
timeout = 5
on-timeout = hyprctl dispatch "dpms off"
on-resume = hyprctl dispatch "dpms on"
}
- Stop touching input devices for
timeout seconds → hypridle fires dpms off, panel goes off (correctly).
- Wiggle mouse → hypridle fires
dpms on. Most cycles work normally; ~1 in 5 leaves the panel wedged: backlight on, no image, hyprctl monitors reports dpmsStatus: 1, dispatch returned ok.
- Once wedged, no further activity in
hyprland.log from aquamarine. Only hyprctl dispatch exit (Hyprland restart) recovers.
In four runs (timeouts 15s, 15s, 5s, 60s), the wedge appeared at cycles 5, 5, 9, 3 respectively — average ~5.5, consistent with ~15–20% per-cycle probability. The off-time per cycle and Hyprland uptime do not predict the wedge — only the cumulative number of Idled → dpms off → Resumed → dpms on event pairs does.
Aquamarine log at the wedge
The last lines from hyprland.log immediately before the panel wedges:
DEBUG from aquamarine ]: drm: Disabling output eDP-1
DEBUG from aquamarine ]: drm: Modesetting eDP-1 with 2880x1800@60.00Hz
After this, no further aquamarine entries are written even though subsequent dispatches (including hl.monitor({disabled=true/false}) re-enable, hyprctl reload, additional DPMS cycles, mouse input) all return ok from the IPC. Frame submission to the CRTC stops entirely.
Hypridle cycle log (60s test, wedge on cycle 3)
[01:24:53] idle: dpms off
[01:25:34] cycle 1: dispatching dpms on (off duration 41s — worked)
[01:26:34] idle: dpms off
[01:27:14] cycle 2: dispatching dpms on (off duration 39s — worked)
[01:28:15] idle: dpms off
[01:28:40] cycle 3: dispatching dpms on (off duration 25s — wedged)
What does not recover the wedged state
All return ok from the IPC, all produce zero new aquamarine log lines, none restore scanout:
- Another
dpms off → dpms on cycle
hyprctl reload
hl.monitor({output="eDP-1", disabled=true}) then disabled=false, mode="preferred", position="auto", scale=2
- VT switch + return
Only hyprctl dispatch exit (full Hyprland restart) recovers.
What does NOT trigger the wedge
- Manual back-to-back
hyprctl dispatch "dpms off" / dpms on calls with 5s gaps — multiple cycles, no wedge in any test
- A single isolated hypridle-driven cycle (very low probability — happens occasionally per the per-cycle probability)
The wayland idle protocol path (Idled event in compositor before dpms-off) appears necessary for the bug to manifest, suggesting interaction between the compositor's idle state and aquamarine's output re-enable bookkeeping.
Possible relation to #293
Same aquamarine 0.11.0 regression, same backlight-on/no-scanout symptom, same restart-only recovery, same Modesetting … with WIDTHxHEIGHT@RATE log signature with no commits afterwards. Different trigger (idle-DPMS vs explicit monitor disable/re-enable). May or may not share root cause — happy to test patches against either path.
Summary
After upgrading aquamarine 0.10.0 → 0.11.0, an idle-driven DPMS off/on cycle (e.g.
hypridlerunninghyprctl dispatch "dpms off"on idle anddpms onon resume) intermittently leaves the eDP panel with backlight powered on but no scanout. Hyprland reportsdpmsStatus: 1, the dispatch returnsok, but aquamarine emits no further commits. Once wedged, only restarting Hyprland recovers —hyprctl reload, additional DPMS cycles, and explicithl.monitor({disabled=true})thendisabled=falseall returnokbut produce zero new aquamarine output and do not recover the panel.The bug is probabilistic — about 15–20% per cycle. Manual back-to-back
hyprctl dispatch dpms off/oncycles (without going through the wayland idle protocol path) do not reproduce it.Possibly related to #293 (same backlight-on/no-scanout symptom, same aquamarine 0.11.0 regression, same restart-only recovery), but the trigger is different (idle-driven DPMS, not explicit monitor disable/re-enable).
System
hypridle(latest)Note on kernel upgrade: the kernel was upgraded in the same window as aquamarine (linux 6.19.10 → 7.0.5 on the laptop, 6.19.12 → 7.0.5 on the desktop). I have not isolated kernel from aquamarine as the regression source — both changed at the same time, and downgrading aquamarine alone is blocked by the soname bump (0.10.0 provides
libaquamarine.so=9, Hyprland 0.55 requires=10). The match with #293's symptom signature (which was reproduced on multiple kernels including 7.0.3 and 6.18.26 LTS) makes aquamarine the prime suspect, but I cannot rule out the kernel.Steps to reproduce
hypridlewith this listener (any short timeout works; 5s for fast iteration):timeoutseconds → hypridle firesdpms off, panel goes off (correctly).dpms on. Most cycles work normally; ~1 in 5 leaves the panel wedged: backlight on, no image,hyprctl monitorsreportsdpmsStatus: 1, dispatch returnedok.hyprland.logfrom aquamarine. Onlyhyprctl dispatch exit(Hyprland restart) recovers.In four runs (timeouts 15s, 15s, 5s, 60s), the wedge appeared at cycles 5, 5, 9, 3 respectively — average ~5.5, consistent with ~15–20% per-cycle probability. The off-time per cycle and Hyprland uptime do not predict the wedge — only the cumulative number of
Idled → dpms off → Resumed → dpms onevent pairs does.Aquamarine log at the wedge
The last lines from
hyprland.logimmediately before the panel wedges:After this, no further aquamarine entries are written even though subsequent dispatches (including
hl.monitor({disabled=true/false})re-enable,hyprctl reload, additional DPMS cycles, mouse input) all returnokfrom the IPC. Frame submission to the CRTC stops entirely.Hypridle cycle log (60s test, wedge on cycle 3)
What does not recover the wedged state
All return
okfrom the IPC, all produce zero new aquamarine log lines, none restore scanout:dpms off→dpms oncyclehyprctl reloadhl.monitor({output="eDP-1", disabled=true})thendisabled=false, mode="preferred", position="auto", scale=2Only
hyprctl dispatch exit(full Hyprland restart) recovers.What does NOT trigger the wedge
hyprctl dispatch "dpms off"/dpms oncalls with 5s gaps — multiple cycles, no wedge in any testThe wayland idle protocol path (
Idledevent in compositor before dpms-off) appears necessary for the bug to manifest, suggesting interaction between the compositor's idle state and aquamarine's output re-enable bookkeeping.Possible relation to #293
Same aquamarine 0.11.0 regression, same backlight-on/no-scanout symptom, same restart-only recovery, same
Modesetting … with WIDTHxHEIGHT@RATElog signature with no commits afterwards. Different trigger (idle-DPMS vs explicit monitor disable/re-enable). May or may not share root cause — happy to test patches against either path.