Skip to content

core: migrate to hyprtoolkit - #288

Merged
vaxerski merged 13 commits into
mainfrom
hyprtoolkit
Dec 4, 2025
Merged

core: migrate to hyprtoolkit#288
vaxerski merged 13 commits into
mainfrom
hyprtoolkit

Conversation

@vaxerski

@vaxerski vaxerski commented Nov 28, 2025

Copy link
Copy Markdown
Member

rewrites everything from scratch with hyprtoolkit.

New config:

wallpaper {
    monitor = ... # wildcard is still empty
    fit_mode = cover # default
    path = ...
}

TODO:

  • ipc
  • testing
  • hyprtoolkit release (requires git)
  • hyprwire release

Wiki: hyprwm/hyprland-wiki#1303

@alba4k

alba4k commented Nov 30, 2025

Copy link
Copy Markdown

THIS THAT DONT WORK

  • pretty sure there's a missing [ before ERR and DEBUG
see image immagine
  • I'm not sure this was intended, but looks like we can't use ~ anymore?

  • Where splash options? (splash works tho)

  • when having hyprpaper running on my laptop and connecting 2 screens I got a wallpaper only on the laptop and the left monitor (arranged eDP-1 DP-5 DP-7). was fine after relaunching

THIS THAT WORK

  • wallpaper on my laptop's 1920x1200 screen
  • wallpaper on 1920x1200 + 2x1920x1080 (ONLY when launching hyprpaper after connecting the two monitors)

WILL TEST LATER

  • 21:9 screen with and without laptop screen on (I have it in zurich and will only be there tomorrow)

@vaxerski

Copy link
Copy Markdown
Member Author

pretty sure there's a missing [ before ERR and DEBUG

No, that's intentional.

I'm not sure this was intended, but looks like we can't use ~ anymore?

oops.

Where splash options? (splash works tho)

they are there I just didnt mention them in the mr

when having hyprpaper running on my laptop and connecting 2 screens I got a wallpaper only on the laptop and the left monitor (arranged eDP-1 DP-5 DP-7). was fine after relaunching

I've noticed some issues there too, I'll check.

@vaxerski

Copy link
Copy Markdown
Member Author

paths fixed. Outputs fixed in hyprtoolkit (git)

@alba4k

alba4k commented Nov 30, 2025

Copy link
Copy Markdown

No, that's intentional.

...but why?

yeah wallpapers appears on both monitors now. Will be in ZH at ~22.00 and check 21:9 there

@vaxerski

Copy link
Copy Markdown
Member Author

zh? enjoy your china trip

@alba4k

alba4k commented Nov 30, 2025

Copy link
Copy Markdown

I'm loving the chicken here yeah

btw 21:9 seems fine. I got a crash when disconnecting the monitor with shikane running (which is supposed to turn my laptop back on after I disconnect the external monitor, but isn't doing that)

so maybe you can replicate this by disabling the only active monitor? Cause that's pretty muxh what's happeninf

@vaxerski

Copy link
Copy Markdown
Member Author

cant repro, debug stacktrace maybe?

@EvilLary

EvilLary commented Dec 2, 2025

Copy link
Copy Markdown

fit_mode no worky because it's hard coded to cover in UI.cpp:39.

Unplugging a monitor and plugging it back again doesn't create a wallpaper for it. I assume that's because monitor state isn't removed from m_monitorStates on disconnect.

hyprtoolkit built against hyprwm/hyprtoolkit@34a758f

wayland log
[3478297.701] {Default Queue}  -> wl_display#1.get_registry(new id wl_registry#2)
[3478297.735] {Default Queue}  -> wl_display#1.sync(new id wl_callback#3)
[3478297.850] {Display Queue} wl_display#1.delete_id(3)
[3478297.858] {Default Queue} wl_registry#2.global(1, "wl_seat", 9)
[3478297.863] {Default Queue}  -> wl_registry#2.bind(1, "wl_seat", 9, new id [unknown]#4)
[3478297.873] {Default Queue} wl_registry#2.global(2, "wl_data_device_manager", 3)
[3478297.876] {Default Queue} wl_registry#2.global(3, "wl_compositor", 6)
[3478297.879] {Default Queue}  -> wl_registry#2.bind(3, "wl_compositor", 6, new id [unknown]#5)
[3478297.881] {Default Queue} wl_registry#2.global(4, "wl_subcompositor", 1)
[3478297.884] {Default Queue} wl_registry#2.global(5, "wl_shm", 1)
[3478297.886] {Default Queue}  -> wl_registry#2.bind(5, "wl_shm", 1, new id [unknown]#6)
[3478297.889] {Default Queue} wl_registry#2.global(6, "wp_viewporter", 1)
[3478297.891] {Default Queue}  -> wl_registry#2.bind(6, "wp_viewporter", 1, new id [unknown]#7)
[3478297.894] {Default Queue} wl_registry#2.global(7, "wp_tearing_control_manager_v1", 1)
[3478297.896] {Default Queue} wl_registry#2.global(8, "wp_fractional_scale_manager_v1", 1)
[3478297.898] {Default Queue}  -> wl_registry#2.bind(8, "wp_fractional_scale_manager_v1", 1, new id [unknown]#8)
[3478297.902] {Default Queue} wl_registry#2.global(9, "zxdg_output_manager_v1", 3)
[3478297.904] {Default Queue} wl_registry#2.global(10, "wp_cursor_shape_manager_v1", 2)
[3478297.906] {Default Queue}  -> wl_registry#2.bind(10, "wp_cursor_shape_manager_v1", 1, new id [unknown]#9)
[3478297.909] {Default Queue} wl_registry#2.global(11, "zwp_idle_inhibit_manager_v1", 1)
[3478297.911] {Default Queue} wl_registry#2.global(12, "zwp_relative_pointer_manager_v1", 1)
[3478297.913] {Default Queue} wl_registry#2.global(13, "zxdg_decoration_manager_v1", 1)
[3478297.915] {Default Queue} wl_registry#2.global(14, "wp_alpha_modifier_v1", 1)
[3478297.917] {Default Queue} wl_registry#2.global(15, "zwlr_gamma_control_manager_v1", 1)
[3478297.919] {Default Queue} wl_registry#2.global(16, "ext_foreign_toplevel_list_v1", 1)
[3478297.922] {Default Queue} wl_registry#2.global(17, "zwp_pointer_gestures_v1", 3)
[3478297.924] {Default Queue} wl_registry#2.global(18, "zwlr_foreign_toplevel_manager_v1", 3)
[3478297.926] {Default Queue} wl_registry#2.global(19, "zwp_keyboard_shortcuts_inhibit_manager_v1", 1)
[3478297.928] {Default Queue} wl_registry#2.global(20, "zwp_text_input_manager_v1", 1)
[3478297.930] {Default Queue} wl_registry#2.global(21, "zwp_text_input_manager_v3", 1)
[3478297.933] {Default Queue}  -> wl_registry#2.bind(21, "zwp_text_input_manager_v3", 1, new id [unknown]#10)
[3478297.938] {Default Queue} wl_registry#2.global(22, "zwp_pointer_constraints_v1", 1)
[3478297.940] {Default Queue} wl_registry#2.global(23, "zwlr_output_power_manager_v1", 1)
[3478297.942] {Default Queue} wl_registry#2.global(24, "xdg_activation_v1", 1)
[3478297.944] {Default Queue} wl_registry#2.global(25, "ext_idle_notifier_v1", 2)
[3478297.946] {Default Queue} wl_registry#2.global(26, "hyprland_lock_notifier_v1", 1)
[3478297.948] {Default Queue} wl_registry#2.global(27, "ext_session_lock_manager_v1", 1)
[3478297.951] {Default Queue}  -> wl_registry#2.bind(27, "ext_session_lock_manager_v1", 1, new id [unknown]#11)
[3478297.953] {Default Queue} wl_registry#2.global(28, "zwp_input_method_manager_v2", 1)
[3478297.955] {Default Queue} wl_registry#2.global(29, "zwp_virtual_keyboard_manager_v1", 1)
[3478297.957] {Default Queue} wl_registry#2.global(30, "zwlr_virtual_pointer_manager_v1", 2)
[3478297.959] {Default Queue} wl_registry#2.global(31, "zwlr_output_manager_v1", 4)
[3478297.962] {Default Queue} wl_registry#2.global(32, "org_kde_kwin_server_decoration_manager", 1)
[3478297.964] {Default Queue} wl_registry#2.global(33, "hyprland_focus_grab_manager_v1", 1)
[3478297.966] {Default Queue} wl_registry#2.global(34, "zwp_tablet_manager_v2", 1)
[3478297.968] {Default Queue} wl_registry#2.global(35, "zwlr_layer_shell_v1", 5)
[3478297.970] {Default Queue}  -> wl_registry#2.bind(35, "zwlr_layer_shell_v1", 5, new id [unknown]#12)
[3478297.976] {Default Queue} wl_registry#2.global(36, "wp_presentation", 2)
[3478297.979] {Default Queue} wl_registry#2.global(37, "xdg_wm_base", 7)
[3478297.981] {Default Queue}  -> wl_registry#2.bind(37, "xdg_wm_base", 6, new id [unknown]#13)
[3478297.987] {Default Queue} wl_registry#2.global(38, "zwlr_data_control_manager_v1", 2)
[3478297.990] {Default Queue} wl_registry#2.global(39, "zwp_primary_selection_device_manager_v1", 1)
[3478297.992] {Default Queue} wl_registry#2.global(40, "xwayland_shell_v1", 1)
[3478297.994] {Default Queue} wl_registry#2.global(41, "zwlr_screencopy_manager_v1", 3)
[3478297.996] {Default Queue} wl_registry#2.global(42, "hyprland_toplevel_export_manager_v1", 2)
[3478297.999] {Default Queue} wl_registry#2.global(43, "hyprland_toplevel_mapping_manager_v1", 1)
[3478298.001] {Default Queue} wl_registry#2.global(44, "hyprland_global_shortcuts_manager_v1", 1)
[3478298.003] {Default Queue} wl_registry#2.global(45, "xdg_wm_dialog_v1", 1)
[3478298.005] {Default Queue} wl_registry#2.global(46, "wp_single_pixel_buffer_manager_v1", 1)
[3478298.007] {Default Queue} wl_registry#2.global(47, "wp_security_context_manager_v1", 1)
[3478298.009] {Default Queue} wl_registry#2.global(48, "hyprland_ctm_control_manager_v1", 2)
[3478298.011] {Default Queue} wl_registry#2.global(49, "hyprland_surface_manager_v1", 2)
[3478298.014] {Default Queue} wl_registry#2.global(50, "wp_content_type_manager_v1", 1)
[3478298.016] {Default Queue} wl_registry#2.global(51, "xdg_toplevel_tag_manager_v1", 1)
[3478298.018] {Default Queue} wl_registry#2.global(52, "xdg_system_bell_v1", 1)
[3478298.020] {Default Queue} wl_registry#2.global(53, "ext_workspace_manager_v1", 1)
[3478298.022] {Default Queue} wl_registry#2.global(54, "ext_data_control_manager_v1", 1)
[3478298.024] {Default Queue} wl_registry#2.global(55, "wp_pointer_warp_v1", 1)
[3478298.026] {Default Queue} wl_registry#2.global(56, "wp_fifo_manager_v1", 1)
[3478298.028] {Default Queue} wl_registry#2.global(57, "wp_commit_timing_manager_v1", 1)
[3478298.031] {Default Queue} wl_registry#2.global(58, "wp_drm_lease_device_v1", 1)
[3478298.033] {Default Queue} wl_registry#2.global(59, "wp_linux_drm_syncobj_manager_v1", 1)
[3478298.035] {Default Queue}  -> wl_registry#2.bind(59, "wp_linux_drm_syncobj_manager_v1", 1, new id [unknown]#14)
[3478298.038] {Default Queue} wl_registry#2.global(60, "wl_drm", 2)
[3478298.040] {Default Queue} wl_registry#2.global(61, "zwp_linux_dmabuf_v1", 5)
[3478298.042] {Default Queue}  -> wl_registry#2.bind(61, "zwp_linux_dmabuf_v1", 4, new id [unknown]#15)
[3478298.049] {Default Queue}  -> zwp_linux_dmabuf_v1#15.get_default_feedback(new id zwp_linux_dmabuf_feedback_v1#16)
[3478298.053] {Default Queue}  -> wl_display#1.sync(new id wl_callback#17)
[3478298.055] {Default Queue} wl_registry#2.global(66, "wl_output", 4)
[3478298.058] {Default Queue}  -> wl_registry#2.bind(66, "wl_output", 4, new id [unknown]#18)
[3478298.067] {Default Queue}  -> wl_display#1.sync(new id wl_callback#19)
[3478298.069] {Default Queue} wl_callback#3.done(2979)
[3478298.186] {Display Queue} wl_display#1.delete_id(17)
[3478298.191] {Display Queue} wl_display#1.delete_id(19)
[3478298.193] {Default Queue} wl_seat#4.name("Hyprland")
[3478298.195] {Default Queue} wl_seat#4.capabilities(3)
[3478298.198] {Default Queue}  -> wl_seat#4.get_keyboard(new id wl_keyboard#3)
[3478298.204] {Default Queue}  -> wl_seat#4.get_pointer(new id wl_pointer#20)
[3478298.209] {Default Queue}  -> wp_cursor_shape_manager_v1#9.get_pointer(new id wp_cursor_shape_device_v1#21, wl_pointer#20)
[3478298.212] {Default Queue} wl_shm#6.format(0)
[3478298.214] {Default Queue} wl_shm#6.format(1)
[3478298.216] {Default Queue} wl_shm#6.format(875709016)
[3478298.217] {Default Queue} wl_shm#6.format(875708993)
[3478298.219] {Default Queue} wl_shm#6.format(808669784)
[3478298.221] {Default Queue} wl_shm#6.format(808669761)
[3478298.223] {Default Queue} wl_shm#6.format(808665688)
[3478298.225] {Default Queue} wl_shm#6.format(808665665)
[3478298.226] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.format_table(fd 10, 4144)
[3478298.869] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.main_device(array[8])
[3478299.056] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_target_device(array[8])
[3478299.061] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_flags(0)
[3478299.064] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_formats(array[402])
[3478299.066] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_done()
[3478299.068] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.done()
[3478299.071] {Default Queue} wl_callback#17.done(2979)
[3478299.074] {Default Queue} wl_output#18.name("HDMI-A-2")
[3478299.079] {Default Queue} wl_output#18.description("Acer Technologies EK241Y 0460158A3LCJ (HDMI-A-2)")
[3478299.084] {Default Queue} wl_output#18.scale(1)
[3478299.086] {Default Queue} wl_output#18.mode(1, 1920, 1080, 60000)
[3478299.098] {Default Queue} wl_output#18.geometry(0, 0, 530, 300, 0, "Acer Technologies", "EK241Y", 0)
[3478299.105] {Default Queue} wl_output#18.done()
[3478299.110] {Default Queue} wl_callback#19.done(2979)
[3478325.391] {Default Queue}  -> zwp_text_input_manager_v3#10.get_text_input(new id zwp_text_input_v3#19, wl_seat#4)
[3478340.268] {Default Queue}  -> wl_compositor#5.create_surface(new id wl_surface#17)
[3478340.283] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#22)
[3478340.287] {Default Queue}  -> wl_region#22.add(0, 0, 2147483647, 2147483647)
[3478340.289] {Default Queue}  -> wl_surface#17.set_input_region(wl_region#22)
[3478340.292] {Default Queue}  -> wp_fractional_scale_manager_v1#8.get_fractional_scale(new id wp_fractional_scale_v1#23, wl_surface#17)
[3478340.297] {Default Queue}  -> wp_viewporter#7.get_viewport(new id wp_viewport#24, wl_surface#17)
[3478340.300] {Default Queue}  -> wl_region#22.destroy()
[3478340.302] {Default Queue}  -> zwlr_layer_shell_v1#12.get_layer_surface(new id zwlr_layer_surface_v1#25, wl_surface#17, wl_output#18, 0, "hyprtoolkit-app")
[3478340.307] {Default Queue}  -> zwlr_layer_surface_v1#25.set_size(0, 0)
[3478340.309] {Default Queue}  -> zwlr_layer_surface_v1#25.set_anchor(15)
[3478340.311] {Default Queue}  -> zwlr_layer_surface_v1#25.set_exclusive_zone(-1)
[3478340.313] {Default Queue}  -> zwlr_layer_surface_v1#25.set_margin(0, 0, 0, 0)
[3478340.315] {Default Queue}  -> zwlr_layer_surface_v1#25.set_keyboard_interactivity(0)
[3478340.316] {Default Queue}  -> wl_surface#17.commit()
[3478340.391] {Default Queue} wl_keyboard#3.keymap(1, fd 17, 40103)
[3478343.079] {Default Queue} wl_keyboard#3.repeat_info(60, 500)
[3478343.187] {Display Queue} wl_display#1.delete_id(22)
[3478343.192] {Default Queue} zwlr_layer_surface_v1#25.configure(2980, 1920, 1080)
[3478343.202] {Default Queue}  -> zwlr_layer_surface_v1#25.ack_configure(2980)
[3478343.206] {Default Queue}  -> wp_viewport#24.set_destination(1920, 1080)
[3478343.210] {Default Queue}  -> wl_surface#17.set_buffer_scale(1)
[3478343.948] {Default Queue}  -> zwp_linux_dmabuf_v1#15.create_params(new id zwp_linux_buffer_params_v1#22)
[3478343.956] {Default Queue}  -> zwp_linux_buffer_params_v1#22.add(fd 21, 0, 0, 15360, 33554432, 410434307)
[3478343.960] {Default Queue}  -> zwp_linux_buffer_params_v1#22.add(fd 22, 1, 16711680, 2048, 33554432, 410434307)
[3478343.962] {Default Queue}  -> zwp_linux_buffer_params_v1#22.create_immed(new id wl_buffer#26, 1920, 1080, 1211384385, 0)
[3478343.966] {Default Queue}  -> zwp_linux_buffer_params_v1#22.destroy()
[3478343.969] {Default Queue}  -> zwp_linux_dmabuf_v1#15.create_params(new id zwp_linux_buffer_params_v1#27)
[3478343.971] {Default Queue}  -> zwp_linux_buffer_params_v1#27.add(fd 23, 0, 0, 15360, 33554432, 410434307)
[3478343.974] {Default Queue}  -> zwp_linux_buffer_params_v1#27.add(fd 24, 1, 16711680, 2048, 33554432, 410434307)
[3478343.976] {Default Queue}  -> zwp_linux_buffer_params_v1#27.create_immed(new id wl_buffer#28, 1920, 1080, 1211384385, 0)
[3478343.979] {Default Queue}  -> zwp_linux_buffer_params_v1#27.destroy()
[3478343.997] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#29)
[3478344.005] {Default Queue}  -> wl_region#29.add(0, 0, 1920, 1080)
[3478344.008] {Default Queue}  -> wl_surface#17.set_opaque_region(wl_region#29)
[3478344.010] {Default Queue}  -> wl_region#29.destroy()
[3478344.044] {Default Queue}  -> wp_linux_drm_syncobj_manager_v1#14.get_surface(new id wp_linux_drm_syncobj_surface_v1#30, wl_surface#17)
[3478344.055] {Default Queue}  -> wp_linux_drm_syncobj_manager_v1#14.import_timeline(new id wp_linux_drm_syncobj_timeline_v1#31, fd 22)
[3478612.652] {Default Queue}  -> wl_surface#17.frame(new id wl_callback#32)
[3478612.673] {Default Queue}  -> wl_surface#17.damage_buffer(0, 0, 1920, 1080)
[3478612.677] {Default Queue}  -> wp_linux_drm_syncobj_surface_v1#30.set_acquire_point(wp_linux_drm_syncobj_timeline_v1#31, 0, 2)
[3478612.681] {Default Queue}  -> wp_linux_drm_syncobj_surface_v1#30.set_release_point(wp_linux_drm_syncobj_timeline_v1#31, 0, 3)
[3478612.978] {Default Queue}  -> wl_surface#17.attach(wl_buffer#26, 0, 0)
[3478612.988] {Default Queue}  -> wl_surface#17.commit()
[3478631.899] {Display Queue} wl_display#1.delete_id(22)
[3478631.910] {Display Queue} wl_display#1.delete_id(27)
[3478631.913] {Display Queue} wl_display#1.delete_id(29)
[3478631.914] {Display Queue} wl_display#1.delete_id(32)
[3478631.916] {Default Queue} wl_callback#32.done(570567)
[3478631.948] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#32)
[3478631.951] {Default Queue}  -> wl_region#32.add(0, 0, 1920, 1080)
[3478631.973] {Default Queue}  -> wl_surface#17.set_opaque_region(wl_region#32)
[3478631.975] {Default Queue}  -> wl_region#32.destroy()
[3478632.032] {Default Queue}  -> wp_linux_drm_syncobj_manager_v1#14.import_timeline(new id wp_linux_drm_syncobj_timeline_v1#29, fd 23)
[3478632.064] {Default Queue}  -> wl_surface#17.frame(new id wl_callback#27)
[3478632.067] {Default Queue}  -> wl_surface#17.damage_buffer(0, 0, 1920, 1080)
[3478632.087] {Default Queue}  -> wp_linux_drm_syncobj_surface_v1#30.set_acquire_point(wp_linux_drm_syncobj_timeline_v1#29, 0, 2)
[3478632.090] {Default Queue}  -> wp_linux_drm_syncobj_surface_v1#30.set_release_point(wp_linux_drm_syncobj_timeline_v1#29, 0, 3)
[3478634.794] {Default Queue}  -> wl_surface#17.attach(wl_buffer#28, 0, 0)
[3478634.808] {Default Queue}  -> wl_surface#17.commit()
[3478634.812] {Default Queue} wl_surface#17.enter(wl_output#18)
[3478634.816] {Default Queue} wp_fractional_scale_v1#23.preferred_scale(120)
[3478634.846] {Default Queue} wl_surface#17.preferred_buffer_scale(1)
[3478634.850] {Default Queue} wl_surface#17.preferred_buffer_transform(0)
[3478636.664] {Display Queue} wl_display#1.delete_id(32)
[3478636.673] {Default Queue} wl_buffer#26.release()
[3478636.677] {Default Queue} wl_surface#17.preferred_buffer_scale(1)
[3478636.679] {Default Queue} wl_surface#17.preferred_buffer_transform(0)
[3482055.280] {Default Queue} zwlr_layer_surface_v1#25.closed()
[3482055.307] {Default Queue}  -> zwlr_layer_surface_v1#25.destroy()
[3482055.313] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.format_table(fd 23, 4144)
[3482056.190] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.main_device(array[8])
[3482056.374] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_target_device(array[8])
[3482056.380] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_flags(0)
[3482056.384] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_formats(array[402])
[3482056.387] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_done()
[3482056.390] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.done()
[3482056.396] {Default Queue} wl_registry#2.global_remove(66)
[3482056.421] {Default Queue}  -> wp_viewport#24.destroy()
[3482056.428] {Default Queue}  -> wp_fractional_scale_v1#23.destroy()
[3482056.460] {Default Queue}  -> wl_buffer#28.destroy()
[3482056.465] {Default Queue}  -> wp_linux_drm_syncobj_timeline_v1#29.destroy()
[3482056.474] {Default Queue}  -> wl_buffer#26.destroy()
[3482056.478] {Default Queue}  -> wp_linux_drm_syncobj_timeline_v1#31.destroy()
[3482056.483] {Default Queue}  -> wp_linux_drm_syncobj_surface_v1#30.destroy()
[3482056.493] {Default Queue}  -> wl_surface#17.destroy()
[3482056.515] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.format_table(fd 24, 3216)
[3482057.002] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.main_device(array[8])
[3482057.171] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_target_device(array[8])
[3482057.176] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_flags(0)
[3482057.179] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_formats(array[402])
[3482057.182] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_done()
[3482057.185] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.done()
[3482057.319] discarded [unknown]#28.[event 0](0 fd, 8 byte)
[3482057.336] discarded [unknown]#28.[event 0](0 fd, 8 byte)
[3482057.338] discarded [unknown]#28.[event 0](0 fd, 8 byte)
[3482057.340] discarded [unknown]#26.[event 0](0 fd, 8 byte)
[3482057.342] discarded [unknown]#26.[event 0](0 fd, 8 byte)
[3482057.527] {Display Queue} wl_display#1.delete_id(25)
[3482057.537] {Display Queue} wl_display#1.delete_id(24)
[3482057.541] {Display Queue} wl_display#1.delete_id(23)
[3482057.544] {Display Queue} wl_display#1.delete_id(28)
[3482057.547] {Display Queue} wl_display#1.delete_id(29)
[3482057.550] {Display Queue} wl_display#1.delete_id(26)
[3482057.553] {Display Queue} wl_display#1.delete_id(31)
[3482057.556] {Display Queue} wl_display#1.delete_id(30)
[3482057.559] {Display Queue} wl_display#1.delete_id(17)
[3482057.562] {Display Queue} wl_display#1.delete_id(27)
[3484024.567] {Display Queue} wl_display#1.delete_id(18)
[3484024.587] {Default Queue} wl_registry#2.global(67, "wl_output", 4)
[3484024.595] {Default Queue}  -> wl_registry#2.bind(67, "wl_output", 4, new id [unknown]#27)
[3484024.605] {Default Queue}  -> wl_display#1.sync(new id wl_callback#17)
[3484024.608] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.format_table(fd 17, 4144)
[3484025.233] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.main_device(array[8])
[3484025.399] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_target_device(array[8])
[3484025.404] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_flags(0)
[3484025.406] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_formats(array[402])
[3484025.408] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_done()
[3484025.410] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.done()
[3484025.414] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.format_table(fd 18, 4144)
[3484026.019] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.main_device(array[8])
[3484026.228] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_target_device(array[8])
[3484026.233] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_flags(0)
[3484026.236] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_formats(array[402])
[3484026.238] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.tranche_done()
[3484026.239] {Default Queue} zwp_linux_dmabuf_feedback_v1#16.done()
[3484043.201] {Display Queue} wl_display#1.delete_id(17)
[3484043.227] {Default Queue} wl_output#27.name("HDMI-A-2")
[3484043.252] {Default Queue} wl_output#27.description("Acer Technologies EK241Y 0460158A3LCJ (HDMI-A-2)")
[3484043.262] {Default Queue} wl_output#27.scale(1)
[3484043.266] {Default Queue} wl_output#27.mode(1, 1920, 1080, 60000)
[3484043.281] {Default Queue} wl_output#27.geometry(0, 0, 530, 300, 0, "Acer Technologies", "EK241Y", 0)
[3484043.290] {Default Queue} wl_output#27.done()
[3484043.298] {Default Queue} wl_callback#17.done(2987)
hyprpaper log (removed dmabuf format spam)
DEBUG ]: Welcome to hyprpaper!
built from commit 83a7586ad20d263e320ee9418e09fcc65055bf44 (f)
DEBUG ]: Starting the Wayland platform
DEBUG ]: Connected to a wayland compositor: Hyprland
DEBUG ]: Got registry at 0x3971c1d0
DEBUG ]: zwp_linux_dmabuf_v1: Got main device
DEBUG ]: zwp_linux_dmabuf_v1: Got node /dev/dri/renderD128
DEBUG ]: zwp_linux_dmabuf_v1: Got done
DEBUG ]: wayland output 66: name HDMI-A-2
DEBUG ]: wayland output 66: description Acer Technologies EK241Y 0460158A3LCJ (HDMI-A-2)
DEBUG ]: wayland output 66: dimensions [Vector2D: x: 1920, y: 1080]
DEBUG ]: wayland output 66: make Acer Technologies model EK241Y
DEBUG ]: wayland output 66: done
DEBUG ]: zwp_linux_dmabuf_v1: opened node /dev/dri/renderD128 with fd 11
DEBUG ]: Supported EGL global extensions: (16) EGL_EXT_device_base EGL_EXT_device_enumeration EGL_EXT_device_query EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses EGL_EXT_client_extensions EGL_KHR_debug EGL_EXT_platform_device EGL_EXT_explicit_device EGL_EXT_platform_wayland EGL_KHR_platform_wayland EGL_EXT_platform_x11 EGL_KHR_platform_x11 EGL_EXT_platform_xcb EGL_MESA_platform_gbm EGL_KHR_platform_gbm EGL_MESA_platform_surfaceless
DEBUG ]: eglDeviceFromDRMFD: Using device /dev/dri/card1
DEBUG ]: EGL: IMG_context_priority supported, requesting high
DEBUG ]: EGL: EXT_create_context_robustness supported, requesting lose on reset
DEBUG ]: EGL: Got a high priority context
DEBUG ]: DRM syncobj timeline support: yes
DEBUG ]: Found 1 output(s)
DEBUG ]: wayland: configure layer with 1920x1080
DEBUG ]: layer: got fractional scale: 100.0%
DEBUG ]: zwp_linux_dmabuf_v1: Got main device
DEBUG ]: zwp_linux_dmabuf_v1: Got node /dev/dri/renderD128
DEBUG ]: zwp_linux_dmabuf_v1: Got done
DEBUG ]: zwp_linux_dmabuf_v1: Got main device
DEBUG ]: zwp_linux_dmabuf_v1: Got node /dev/dri/renderD128
DEBUG ]: zwp_linux_dmabuf_v1: Got done
DEBUG ]: zwp_linux_dmabuf_v1: Got main device
DEBUG ]: zwp_linux_dmabuf_v1: Got node /dev/dri/renderD128
DEBUG ]: zwp_linux_dmabuf_v1: Got done
DEBUG ]: zwp_linux_dmabuf_v1: Got main device
DEBUG ]: zwp_linux_dmabuf_v1: Got node /dev/dri/renderD128
DEBUG ]: zwp_linux_dmabuf_v1: Got done
DEBUG ]: wayland output 67: name HDMI-A-2
DEBUG ]: wayland output 67: description Acer Technologies EK241Y 0460158A3LCJ (HDMI-A-2)
DEBUG ]: wayland output 67: dimensions [Vector2D: x: 1920, y: 1080]
DEBUG ]: wayland output 67: make Acer Technologies model EK241Y
DEBUG ]: wayland output 67: done

@vaxerski

vaxerski commented Dec 2, 2025

Copy link
Copy Markdown
Member Author

should be both fixed, pls check

@EvilLary

EvilLary commented Dec 2, 2025

Copy link
Copy Markdown

should be both fixed, pls check

Yep, both work now

@EvilLary

EvilLary commented Dec 2, 2025

Copy link
Copy Markdown

Is it possible to have smoothing as an option or by default since high res images look 'gritty' or grainy with this branch

Hyprpaper with hyprtoolkit image
main branch Hyprpaper image
used wallpaper

philipp-pilz-LmDtHyqCQb0-unsplash

@vaxerski

vaxerski commented Dec 2, 2025

Copy link
Copy Markdown
Member Author

huh, it shouldnt, wut

can you post the images separately github doesnt wanna show em when I click on them

@EvilLary

EvilLary commented Dec 2, 2025

Copy link
Copy Markdown

can you post the images separately github doesnt wanna show em when I click on them

https://postimg.cc/gallery/R30DtcJ

@vaxerski

vaxerski commented Dec 2, 2025

Copy link
Copy Markdown
Member Author

hm, hyprtoolkit does linear sampling, IIRC with hyprpaper on cairo we did "good" aa, but this isn't really something we do in toolkit. To be fair, I barely see the difference in these.

@EvilLary

EvilLary commented Dec 3, 2025

Copy link
Copy Markdown

I'ven't used hyprtoolkit, but I'm curious why is it needed to have null and background elements instead of just slapping the image & splash onto the root element

@vaxerski

vaxerski commented Dec 3, 2025

Copy link
Copy Markdown
Member Author

null is just for my convenience
background is there so that the wallpapers are always opaque, which allows toolkit to send an opaque region, which allows hyprland to occlude the default background, which saves resources.

@vaxerski

vaxerski commented Dec 3, 2025

Copy link
Copy Markdown
Member Author

IPC re-added, but with hyprwire. This means old hyprctl commands will no longer work. See hyprwm/Hyprland#12537

New syntax:

hyprctl hyprpaper wallpaper [mon], [path], [fit_mode]

fit mode optional.

vaxerski added a commit to hyprwm/hyprland-wiki that referenced this pull request Dec 3, 2025
@nonetrix

nonetrix commented Dec 3, 2025

Copy link
Copy Markdown

Maybe I'm stupid but seems to completely ignore my configs
image

IPC as well

image

@vaxerski

vaxerski commented Dec 3, 2025

Copy link
Copy Markdown
Member Author

your entier family stoobid

firstly its PATH not FILE

secondly ipc requires a full path

@vaxerski

vaxerski commented Dec 3, 2025

Copy link
Copy Markdown
Member Author

here it will now resolve in hyprctl check the hyprland mr

@vaxerski

vaxerski commented Dec 3, 2025

Copy link
Copy Markdown
Member Author

anything else outstanding?

@EvilLary

EvilLary commented Dec 4, 2025

Copy link
Copy Markdown

Seg fault in UI.cpp:72 if ipc is disabled

config
$path = /home/spicy/Pictures/Wallpapers/martin-martz-P66DWe8AAbo-unsplash.jpg
# preload = $path
# wallpaper = ,$path
ipc = false
splash = true
wallpaper {
    monitor = 
    fit_mode = cover
    path = $path
}
backtrace
#0  0x000000000044189c in __gnu_cxx::__normal_iterator<Hyprutils::Memory::CSharedPointer<CHyprpaperCoreManagerObject>*, std::vector<Hyprutils::Memory::CSharedPointer<CHyprpaperCoreManagerObject>, std::allocator<Hyprutils::Memory::CSharedPointer<CHyprpaperCoreManagerObject> > > >::__normal_iterator (this=<optimized out>, __i=<error reading variable: Cannot access memory at address 0x30>)
    at /usr/include/c++/15.2.1/bits/stl_iterator.h:1059
#1  std::vector<Hyprutils::Memory::CSharedPointer<CHyprpaperCoreManagerObject>, std::allocator<Hyprutils::Memory::CSharedPointer<CHyprpaperCoreManagerObject> > >::begin (this=0x30)
    at /usr/include/c++/15.2.1/bits/stl_vector.h:999
#2  0x000000000043c63f in IPC::CSocket::onNewDisplay (this=0x0, sv="HDMI-A-2") at /home/spicy/git/hyprpaper/src/ipc/IPC.cpp:138
        m = @0x1d8247d0: {impl_ = 0x1cb20530, m_data = 0x1cb19bd0}
#3  0x0000000000449b69 in CUI::registerOutput (this=0x1caa25e0, mon=...) at /home/spicy/git/hyprpaper/src/ui/UI.cpp:72
#4  0x0000000000449eaa in CUI::run (this=0x1caa25e0) at /home/spicy/git/hyprpaper/src/ui/UI.cpp:94
        m = @0x1d8247d0: {impl_ = 0x1cb20530, m_data = 0x1cb19bd0}
        PENABLEIPC = {p_ = 0x1ca82e70}
        MONITORS = std::vector of length 1, capacity 1 = {{impl_ = 0x1cb20530, m_data = 0x1cb19bd0}}
#5  0x0000000000445fac in main (argc=1, argv=0x7ffc72bcb788, envp=0x7ffc72bcb798) at /home/spicy/git/hyprpaper/src/main.cpp:37
        parser = {m_impl = {impl_ = 0x1cab16f0}}

@vaxerski

vaxerski commented Dec 4, 2025

Copy link
Copy Markdown
Member Author

thanks fixed

@EvilLary

EvilLary commented Dec 4, 2025

Copy link
Copy Markdown

I think this is more of of a hyprwire issue but If I send at least two valid request at the same time, hyprpaper will exit with an out of range error.

hyprctl hyprpaper wallpaper 'WAYLAND-1, [wallpaper path]' & hyprctl hyprpaper wallpaper ', [wallpaper path]'
backtrace
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
        tid = <optimized out>
        ret = 0
        pd = <optimized out>
        old_mask = {__val = {1}}
        ret = <optimized out>
#1  0x00007fb5702989d3 in __pthread_kill_internal (threadid=<optimized out>, signo=6) at pthread_kill.c:89
#2  0x00007fb57023e3a0 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
        ret = <optimized out>
#3  0x00007fb57022557a in __GI_abort () at abort.c:77
        act = {__sigaction_handler = {sa_handler = 0x7fff1067e680, sa_sigaction = 0x7fff1067e680}, sa_mask = {__val = {140417247529334, 10, 140417249089184, 140733468632720, 140417247533729, 140733468632768, 1, 140733468632768, 140417247535040, 1, 140417249088736, 782594616, 140417249088736, 140733468632816, 140417247517328, 782594616}}, sa_flags = 1886064309, sa_restorer = 0x7fff1067e6f0}
#4  0x00007fb570697bf6 in __gnu_cxx::__verbose_terminate_handler () at /usr/src/debug/gcc/gcc/libstdc++-v3/libsupc++/vterminate.cc:95
        terminating = true
        t = <optimized out>
#5  0x00007fb5706b1eba in __cxxabiv1::__terminate (handler=<optimized out>) at /usr/src/debug/gcc/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:48
#6  0x00007fb5706975d9 in std::terminate () at /usr/src/debug/gcc/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:58
#7  0x00007fb5706b2176 in __cxxabiv1::__cxa_throw (obj=<optimized out>, tinfo=0x7fb570884d78 <typeinfo for std::out_of_range>, dest=0x7fb5706c9d00 <std::out_of_range::~out_of_range()>)
    at /usr/src/debug/gcc/gcc/libstdc++-v3/libsupc++/eh_throw.cc:98
        globals = <optimized out>
        header = 0x2e82df10
#8  0x00007fb57069bf2a in std::__throw_out_of_range_fmt (__fmt=__fmt@entry=0x7fb570a57500 "vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)")
    at /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/functexcept.cc:101
        __len = 73
        __alloca_size = 585
        __s = 0x7fff1067e790 "vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)"
        __ap = {{gp_offset = 24, fp_offset = 48, overflow_arg_area = 0x7fff1067eaf0, reg_save_area = 0x7fff1067ea10}}
#9  0x00007fb570a2eaee in std::vector<Hyprutils::Memory::CSharedPointer<Hyprwire::CServerClient>, std::allocator<Hyprutils::Memory::CSharedPointer<Hyprwire::CServerClient> > >::_M_range_check
    (this=<optimized out>, __n=1) at /usr/include/c++/15.2.1/bits/stl_vector.h:1293
#10 std::vector<Hyprutils::Memory::CSharedPointer<Hyprwire::CServerClient>, std::allocator<Hyprutils::Memory::CSharedPointer<Hyprwire::CServerClient> > >::at (this=0x2dcae6e0, __n=1)
    at /usr/include/c++/15.2.1/bits/stl_vector.h:1315
#11 Hyprwire::CServerSocket::dispatchExistingConnections (this=0x2dcae690) at /usr/src/debug/hyprwire-git/hyprwire/src/core/server/ServerSocket.cpp:196
        i = 3
        hadAny = <optimized out>
#12 0x00007fb570a523a2 in Hyprwire::CServerSocket::dispatchPending (this=<optimized out>) at /usr/src/debug/hyprwire-git/hyprwire/src/core/server/ServerSocket.cpp:104
#13 0x00007fb570a523e9 in Hyprwire::CServerSocket::dispatchEvents (this=0x2dcae690, block=false) at /usr/src/debug/hyprwire-git/hyprwire/src/core/server/ServerSocket.cpp:111
#14 0x000000000043c08a in operator() (__closure=0x2e5265a8) at /home/spicy/git/hyprpaper/src/ipc/IPC.cpp:134
#15 0x000000000043fbb2 in std::__invoke_impl<void, IPC::CSocket::CSocket()::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/15.2.1/bits/invoke.h:63
#16 0x000000000043f228 in std::__invoke_r<void, IPC::CSocket::CSocket()::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/15.2.1/bits/invoke.h:113
#17 0x000000000043ded5 in std::_Function_handler<void(), IPC::CSocket::CSocket()::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/15.2.1/bits/std_function.h:292
#18 0x00007fb570adcf18 in std::function<void()>::operator() (this=0x2e5265a8) at /usr/include/c++/15.2.1/bits/std_function.h:593
#19 Hyprtoolkit::CBackend::enterLoop (this=0x2d766020) at /usr/src/debug/hyprtoolkit-git/hyprtoolkit/src/core/Backend.cpp:456
        uf = @0x2e5265a0: {fdOwned = {m_fd = -1}, fd = 20, callback = {<std::_Maybe_unary_or_binary_function<void>> = {<No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x2dcae270, _M_const_object = 0x2dcae270, _M_function_pointer = 0x2dcae270, _M_member_pointer = (void (std::_Undefined_class::*)(class std::_Undefined_class * const)) 0x2dcae270}, _M_pod_data = "p\342\312-", '\000' <repeats 11 times>}, _M_manager = 0x43ded8 <std::_Function_handler<void(), IPC::CSocket::CSocket()::<lambda()> >::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation)>}, _M_invoker = 0x43deb0 <std::_Function_handler<void(), IPC::CSocket::CSocket()::<lambda()> >::_M_invoke(const std::_Any_data &)>}, needsDispatch = false, removeOnFire = false}
        passed = Python Exception <class 'gdb.error'>: value has been optimized out

        expiredFds = Python Exception <class 'gdb.error'>: value has been optimized out

        lk = {_M_device = 0x2d7660d8, _M_owns = true}
        lg = {_M_device = @0x2d766100}
        timerscpy = std::vector of length 0, capacity 0
        idlesCpy = Python Exception <class 'gdb.error'>: value has been optimized out

        pollThr = {_M_id = {_M_thread = 140416682817216}}
        timersThr = {_M_id = {_M_thread = 140416674424512}}
        idleThr = {_M_id = {_M_thread = 140416666031808}}
#20 0x000000000044a107 in CUI::run (this=0x2d765bf0) at /home/spicy/git/hyprpaper/src/ui/UI.cpp:108
        PENABLEIPC = {p_ = 0x2d739e70}
        MONITORS = std::vector of length 1, capacity 1 = {{impl_ = 0x2d7d8070, m_data = 0x2d7d5cd0}}
#21 0x0000000000445fac in main (argc=1, argv=0x7fff1067f108, envp=0x7fff1067f118) at /home/spicy/git/hyprpaper/src/main.cpp:37
        parser = {m_impl = {impl_ = 0x2d7686f0}}

@vaxerski

vaxerski commented Dec 4, 2025

Copy link
Copy Markdown
Member Author

I'll check it

@vaxerski

vaxerski commented Dec 4, 2025

Copy link
Copy Markdown
Member Author

fixed in wire :)

@EvilLary

EvilLary commented Dec 4, 2025

Copy link
Copy Markdown

Thanks! these are all issues I could find, good luck with the release

@vaxerski

vaxerski commented Dec 4, 2025

Copy link
Copy Markdown
Member Author

thanks!

@vaxerski
vaxerski merged commit 1d8df14 into main Dec 4, 2025
2 checks passed
vaxerski added a commit to hyprwm/hyprland-wiki that referenced this pull request Dec 4, 2025
@fxzzi

fxzzi commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

errrrr, did we lose hyprctl hyprpaper listloaded

image also some sort of vram leak when i was spamming through wallpapers

@vaxerski

Copy link
Copy Markdown
Member Author

errrrr, did we lose hyprctl hyprpaper listloaded

yues

also some sort of vram leak when i was spamming through wallpapers

its fixed on git (toolkit)

@AndrewGraber

Copy link
Copy Markdown

Are you planning a release for this now that it's been merged, or wanting to re-implement preloading and the related IPC commands first? I'm pretty new to the hypr ecosystem but I'd be willing to give it a go

I'm running the git packages on Arch - I usually use waypaper as a frontend and to automate cycling through wallpapers to recreate the Windows slideshow option. I've submitted a PR that will allow it to work with hyprpaper-git without breaking support for the current version of Hyprpaper.

@fxzzi

fxzzi commented Dec 26, 2025

Copy link
Copy Markdown
Contributor

vaxry is probably waiting to drop hyprland 0.53 first before a hyprpaper release, due to the ipc changes

@vaxerski

Copy link
Copy Markdown
Member Author

yes. I don't want hyprctl hyprpaper to break

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants