Hyprlock displaying black screen if monitor is in standby state

Hyprland version
❯ hyprctl version
Hyprland 0.52.1 built from branch v0.52.1 at commit 967c3c7404d4fa00234e29c70df3e263386d2597 clean (version: bump to 0.52.1).
Date: Sun Nov 9 23:31:36 2025
Tag: v0.52.1, commits: 6564

Libraries:
Hyprgraphics: built against 0.3.0, system has 0.3.0
Hyprutils: built against 0.10.2, system has 0.10.2
Hyprcursor: built against 0.1.13, system has 0.1.13
Hyprlang: built against 0.6.3, system has 0.6.6
Aquamarine: built against 0.9.5, system has 0.9.5

no flags were set
Hyprlock version
❯ hyprlock --version
Hyprlock version v0.9.2

Using CachyOS and the zen4/5 optimized packages.

Describe your issue / feature…

Hello friends. First post here though I’ve been a happy Hyprland user for a while.

Inquiry:

I have a 3xMonitor setup. When hyprlock is launched while one of the monitors is in a “soft off” state (like after issuing “hyprctl dispatch dpms off DP-2” [or any monitor]) it displays a black screen. It doesn’t crash or anything and I can unlock it by typing my password though I don’t have any visual feedback. If a monitor is “hard off” (via the power button) it has no trouble. I did notice this output from hyprlock when the problem happens:

Output from hyprlock:
❯ hyprlock
Hyprlock version v0.9.2
[LOG]   | got iface: wl_seat v9
[LOG]    > Bound to wl_seat v9
[LOG]   | got iface: wl_data_device_manager v3
[LOG]   | got iface: wl_compositor v6
[LOG]    > Bound to wl_compositor v6
[LOG]   | got iface: wl_subcompositor v1
[LOG]   | got iface: wl_shm v1
[LOG]    > Bound to wl_shm v1
[LOG]   | got iface: wp_viewporter v1
[LOG]    > Bound to wp_viewporter v1
[LOG]   | got iface: wp_tearing_control_manager_v1 v1
[LOG]   | got iface: wp_fractional_scale_manager_v1 v1
[LOG]    > Bound to wp_fractional_scale_manager_v1 v1
[LOG]   | got iface: zxdg_output_manager_v1 v3
[LOG]   | got iface: wp_cursor_shape_manager_v1 v1
[LOG]    > Bound to wp_cursor_shape_manager_v1 v1
[LOG]   | got iface: zwp_idle_inhibit_manager_v1 v1
[LOG]   | got iface: zwp_relative_pointer_manager_v1 v1
[LOG]   | got iface: zxdg_decoration_manager_v1 v1
[LOG]   | got iface: wp_alpha_modifier_v1 v1
[LOG]   | got iface: zwlr_gamma_control_manager_v1 v1
[LOG]   | got iface: ext_foreign_toplevel_list_v1 v1
[LOG]   | got iface: zwp_pointer_gestures_v1 v3
[LOG]   | got iface: zwlr_foreign_toplevel_manager_v1 v3
[LOG]   | got iface: zwp_keyboard_shortcuts_inhibit_manager_v1 v1
[LOG]   | got iface: zwp_text_input_manager_v1 v1
[LOG]   | got iface: zwp_text_input_manager_v3 v1
[LOG]   | got iface: zwp_pointer_constraints_v1 v1
[LOG]   | got iface: zwlr_output_power_manager_v1 v1
[LOG]   | got iface: xdg_activation_v1 v1
[LOG]   | got iface: ext_idle_notifier_v1 v2
[LOG]   | got iface: hyprland_lock_notifier_v1 v1
[LOG]   | got iface: ext_session_lock_manager_v1 v1
[LOG]    > Bound to ext_session_lock_manager_v1 v1
[LOG]   | got iface: zwp_input_method_manager_v2 v1
[LOG]   | got iface: zwp_virtual_keyboard_manager_v1 v1
[LOG]   | got iface: zwlr_virtual_pointer_manager_v1 v2
[LOG]   | got iface: zwlr_output_manager_v1 v4
[LOG]   | got iface: org_kde_kwin_server_decoration_manager v1
[LOG]   | got iface: hyprland_focus_grab_manager_v1 v1
[LOG]   | got iface: zwp_tablet_manager_v2 v1
[LOG]   | got iface: zwlr_layer_shell_v1 v5
[LOG]   | got iface: wp_presentation v2
[LOG]   | got iface: xdg_wm_base v7
[LOG]   | got iface: zwlr_data_control_manager_v1 v2
[LOG]   | got iface: zwp_primary_selection_device_manager_v1 v1
[LOG]   | got iface: xwayland_shell_v1 v1
[LOG]   | got iface: zwlr_screencopy_manager_v1 v3
[LOG]    > Bound to zwlr_screencopy_manager_v1 v3
[LOG]   | got iface: hyprland_toplevel_export_manager_v1 v2
[LOG]   | got iface: hyprland_toplevel_mapping_manager_v1 v1
[LOG]   | got iface: hyprland_global_shortcuts_manager_v1 v1
[LOG]   | got iface: xdg_wm_dialog_v1 v1
[LOG]   | got iface: wp_single_pixel_buffer_manager_v1 v1
[LOG]   | got iface: wp_security_context_manager_v1 v1
[LOG]   | got iface: hyprland_ctm_control_manager_v1 v2
[LOG]   | got iface: hyprland_surface_manager_v1 v2
[LOG]   | got iface: wp_content_type_manager_v1 v1
[LOG]   | got iface: xdg_toplevel_tag_manager_v1 v1
[LOG]   | got iface: xdg_system_bell_v1 v1
[LOG]   | got iface: ext_workspace_manager_v1 v1
[LOG]   | got iface: ext_data_control_manager_v1 v1
[LOG]   | got iface: wp_pointer_warp_v1 v1
[LOG]   | got iface: wp_fifo_manager_v1 v1
[LOG]   | got iface: wp_commit_timing_manager_v1 v1
[LOG]   | got iface: wp_color_manager_v1 v1
[LOG]   | got iface: wp_drm_lease_device_v1 v1
[LOG]   | got iface: wp_linux_drm_syncobj_manager_v1 v1
[LOG]   | got iface: wl_drm v2
[LOG]   | got iface: zwp_linux_dmabuf_v1 v5
[LOG]    > Bound to zwp_linux_dmabuf_v1 v5
[LOG]   | got iface: wl_output v4
[LOG]    > Bound to wl_output v4
[LOG]   | got iface: wl_output v4
[LOG]    > Bound to wl_output v4
[LOG]   | got iface: wl_output v4
[LOG]    > Bound to wl_output v4
[LOG] Exposed seat name: Hyprland
[LOG] [core] dmabufFeedbackMainDevice
[LOG] output DP-2 name DP-2
[LOG] output 64 description Shenzhen KTC Technology Group H27T27  (DP-2)
[LOG] output 64 make Shenzhen KTC Technology Group model H27T27
[LOG] output 64 done
[LOG] output DP-1 name DP-1
[LOG] output 66 description Microstep MAG 341C OLED  (DP-1)
[LOG] output 66 make Microstep model MAG 341C OLED
[LOG] output 66 done
[LOG] output DP-3 name DP-3
[LOG] output 67 description Shenzhen KTC Technology Group H27T27  (DP-3)
[LOG] output 67 make Shenzhen KTC Technology Group model H27T27
[LOG] output 67 done
[LOG] Running on Hyprland
[LOG] eglQueryDmaBufModifiersEXT found 9 mods
[LOG] [bo] has 1 plane(s)
[LOG] [bo] chose modifier 200000000082305
[LOG] eglQueryDmaBufModifiersEXT found 9 mods
[LOG] [bo] has 1 plane(s)
[LOG] [bo] chose modifier 200000000082305
[LOG] eglQueryDmaBufModifiersEXT found 9 mods
[LOG] [bo] has 1 plane(s)
[LOG] [bo] chose modifier 200000000082305
[LOG] Got dma frame with size [Vector2D: x: 2560, y: 1440]
[LOG] Got dma frame with size [Vector2D: x: 3440, y: 1440]
[WARN] Gathering resources timed out after 2000 milliseconds. Backgrounds may be delayed and render `background:color` at first.
[LOG] Resources gathered after 2005 milliseconds
[LOG] Locking session
[LOG] Starting fade in
[LOG] Got fractional scale: 100.0%
[LOG] configure with serial 178097
[LOG] Configuring surface for logical [Vector2D: x: 2560, y: 1440] and pixel [Vector2D: x: 2560, y: 1440]
[LOG] Got fractional scale: 100.0%
[LOG] configure with serial 178098
[LOG] Configuring surface for logical [Vector2D: x: 3440, y: 1440] and pixel [Vector2D: x: 3440, y: 1440]
[LOG] Got fractional scale: 100.0%
[LOG] configure with serial 178099
[LOG] Configuring surface for logical [Vector2D: x: 2560, y: 1440] and pixel [Vector2D: x: 2560, y: 1440]
[LOG] onLockLocked called
[LOG] Authenticating
[LOG] PAM_PROMPT: Password: 
[LOG] auth: authenticated for hyprlock
[LOG] Unlocking session
[LOG] Unlocked, exiting!
[LOG] Reached the end, exiting

This line particulary:

[WARN] Gathering resources timed out after 2000 milliseconds. Backgrounds may be delayed and render background:color at first.

…doesn’t happen when all the monitors are on and it works fine. So I tried it with no screenshot or image as background and even tried commenting out the background and animation blocks. Nothing seems to change the result.

My config is basically just the sample config:

hyprlock.conf
# sample hyprlock.conf
# for more configuration options, refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock
#
# rendered text in all widgets supports pango markup (e.g. <b> or <i> tags)
# ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#general-remarks
#
# shortcuts to clear password buffer: ESC, Ctrl+U, Ctrl+Backspace
#
# you can get started by copying this config to ~/.config/hypr/hyprlock.conf
#

$font = Monospace

general {
    hide_cursor = false
}

# uncomment to enable fingerprint authentication
# auth {
#     fingerprint {
#         enabled = true
#         ready_message = Scan fingerprint to unlock
#         present_message = Scanning...
#         retry_delay = 250 # in milliseconds
#     }
# }

animations {
    enabled = true
    bezier = linear, 1, 1, 0, 0
    animation = fadeIn, 1, 5, linear
    animation = fadeOut, 1, 5, linear
    animation = inputFieldDots, 1, 2, linear
}

background {
    monitor =
    path = screenshot
    blur_passes = 3
}

input-field {
    monitor =
    size = 20%, 5%
    outline_thickness = 3
    inner_color = rgba(0, 0, 0, 0.0) # no fill

    outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg
    check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg
    fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg

    font_color = rgb(143, 143, 143)
    fade_on_empty = false
    rounding = 15

    font_family = $font
    placeholder_text = Input password...
    fail_text = $PAMFAIL

    # uncomment to use a letter instead of a dot to indicate the typed password
    # dots_text_format = *
    # dots_size = 0.4
    dots_spacing = 0.3

    # uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator)
    # hide_input = true

    position = 0, -20
    halign = center
    valign = center
}

# TIME
label {
    monitor =
    text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution
    font_size = 90
    font_family = $font

    position = -30, 0
    halign = right
    valign = top
}

# DATE
label {
    monitor =
    text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds
    font_size = 25
    font_family = $font

    position = -30, -150
    halign = right
    valign = top
}

The monitor portion of my hyprland.conf is pretty simple:

hyprland.conf
...

monitor = DP-1, [email protected], 840x1440, 1
monitor = DP-2, 2560x1440@100, 0x0, 1
monitor = DP-3, 2560x1440@100, 2560x0, 1

# Electron based apps use X11 as default, auto should detect wayland
env = ELECTRON_OZONE_PLATFORM_HINT, auto

...

Thanks for any insight!

Cheers!