If you are using Hyprland (specially versions 0.54 and newer) with an NVIDIA GPU, you may have experienced that your monitors do not wake up after going to sleep via DPMS.
- Monitors enter DPMS power-off state (e.g. via
hypridle) but do not wake up when a key is pressed or the mouse is moved. - The monitor goes dark but is no longer tracked as connected by the system.
- The session is still running in the background but is not visible, leaving you stuck with a black screen.
A combination of default settings and how NVIDIA drivers handle DRM signals causes this issue:
hyprctl dispatch dpms offis a DRM-level hack, not a proper Wayland protocol call. With NVIDIA GPUs, the driver can interpret the DRM DPMS signal as a physical monitor disconnect rather than a standby request.- In Hyprland,
key_press_enables_dpmsandmouse_move_enables_dpmscontrol whether the compositor itself wakes monitors on input, but both default tofalse. Without these, Hyprland relies entirely onhypridle'son-resumecallback, which fails to execute properly because the monitor is considered disconnected.
The fix is to use wlopm instead, which uses the proper wlr-output-power-management-v1 Wayland protocol to communicate with the compositor correctly, and to explicitly enable DPMS wake on input.
Step 1.
Install wlopm (Wayland Output Power Manager). It does not go through DRM directly and does not confuse NVIDIA drivers into treating the monitor as disconnected.
sudo pacman -S wlopmStep 2.
Edit your Hyprland configuration file (usually ~/.config/hypr/hyprland.conf) and add the following parameters to the misc {} section:
misc {
key_press_enables_dpms = true
mouse_move_enables_dpms = true
}
Step 3.
Edit your hypridle.conf (usually ~/.config/hypr/hypridle.conf) to replace all the hyprctl dispatch dpms commands with wlopm.
# Before
listener {
timeout = 600
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}
# After
listener {
timeout = 600
on-timeout = wlopm --off '*'
on-resume = wlopm --on '*'
}
Note: The * pattern targets all connected outputs, which also fixes multi-monitor inconsistencies where the hyprctl dispatcher sometimes only turns off one monitor.
Step 4.
Reload your Hyprland configuration and restart hypridle for the changes to take effect.
hyprctl reload
pkill hypridle
hypridle &