Closed matejdro closed 2 months ago
I've just tested with Hyprland 0.41.2 and dbe57ab3fbbdce315961d78b3fcd3cac0ab34bf0 and I've been able to reproduce indeed.
The issue is that the compositor reports a 1x scaling with the fractional-scale-v1 interface at first. It does report the correct value afterwards though — after pressing a key the blurriness is gone for me.
...
[2443324.788] {Default Queue} -> wp_fractional_scale_manager_v1#8.get_fractional_scale(new id wp_fractional_scale_v1#18, wl_surface#15)
[2443324.795] {Default Queue} -> wp_viewporter#7.get_viewport(new id wp_viewport#19, wl_surface#15)
[2443324.800] {Default Queue} -> wl_surface#15.commit()
[2443325.065] {Default Queue} wp_fractional_scale_v1#18.preferred_scale(120)
[2443325.077] {Default Queue} zwlr_layer_surface_v1#17.configure(92, 1920, 1080)
...
[2443373.538] {Default Queue} wl_surface#15.enter(wl_output#13)
[2443373.541] {Default Queue} wl_keyboard#16.enter(95, wl_surface#15, array[0])
[2443373.545] {Default Queue} wl_keyboard#16.modifiers(96, 0, 0, 0, 0)
[2443373.554] {Default Queue} wp_fractional_scale_v1#18.preferred_scale(240)
[2443394.740] {Default Queue} wl_keyboard#16.key(98, 379192, 28, 0)
[2444563.314] {Default Queue} wl_keyboard#16.key(99, 380369, 58, 1)
On Sway it does report the correct value the first time.
[2984381.529] {Default Queue} -> wp_fractional_scale_manager_v1#9.get_fractional_scale(new id wp_fractional_scale_v1#18, wl_surface#15)
[2984381.534] {Default Queue} -> wp_viewporter#8.get_viewport(new id wp_viewport#19, wl_surface#15)
[2984381.537] {Default Queue} -> wl_surface#15.commit()
[2984381.757] {Default Queue} wl_surface#15.enter(wl_output#13)
[2984381.768] {Default Queue} wp_fractional_scale_v1#18.preferred_scale(240)
[2984381.772] {Default Queue} zwlr_layer_surface_v1#17.configure(4543, 1920, 1080)
[2984381.779] {Default Queue} -> zwlr_layer_surface_v1#17.ack_configure(4543)
[2984381.885] {Default Queue} -> wl_shm#4.create_pool(new id wl_shm_pool#20, fd 5, 33177600)
I've also checked with another Wayland program that uses the same interfaces, Fuzzel, and it does the same thing where it gets a 1x scaling then 2x, the right value. The difference is that it manages to get the correct value before the first user input.
By the looks of it, Hyprland is probably not behaving correctly.
Thanks, will make a ticket for Hyprland.
However, shouldn't this program also scale? Like, larger font and less cells on scaled display? Or is that purely config based?
The number of cells is constant once the screen size allows to fit the maximum of 512 or less (83 as these are the number of possibilities with three character labels and there are other constraints to make a grid) of them. The text size is also proportional to the cell size after its minimum size limit is reached. This is why the unscaled version looks the same but sharp if that makes sense.
If run with a much smaller resolution — where it can't fit the maximum number of cells — it should display less cells on the scaled version as you are suggesting.
Hm, how did you get the logs for fractional sceling?
I tried WAYLAND_DEBUG=1 wl-kbptr
, but for some reason, I don't get any preferred_scale
lines. Only line related to the fraction scaling is the init one (wl_registry
).
I assume you are running the here latest release (v0.2.1) which doesn't have fractional scaling implemented.
The way scaling is implemented is a bit different but it suffers from the same issue. Instead, of the surface receiving an event with the scaling factor, an enter
event is sent to the surface with the output it's displayed on. From the output we can determine the scaling factor to use.
On Sway, the enter
event right is received right after the surface is committed:
[3658310.983] {Default Queue} -> wl_compositor#5.create_surface(new id wl_surface#11)
[3658310.987] {Default Queue} -> zwlr_layer_shell_v1#7.get_layer_surface(new id zwlr_layer_surface_v1#13, wl_surface#11, nil, 3, "wl-kbptr")
[3658310.993] {Default Queue} -> zwlr_layer_surface_v1#13.set_anchor(15)
[3658310.995] {Default Queue} -> zwlr_layer_surface_v1#13.set_keyboard_interactivity(1)
[3658310.998] {Default Queue} -> wl_surface#11.commit() 📍
[3658311.112] {Default Queue} wl_surface#11.enter(wl_output#10) 👈
[3658311.117] {Default Queue} zwlr_layer_surface_v1#13.configure(374, 960, 540)
[3658311.120] {Default Queue} -> zwlr_layer_surface_v1#13.ack_configure(374)
[3658311.173] {Default Queue} -> wl_shm#4.create_pool(new id wl_shm_pool#14, fd 5, 8294400)
[3658311.178] {Default Queue} -> wl_shm_pool#14.create_buffer(new id wl_buffer#15, 0, 1920, 1080, 7680, 0)
[3658311.182] {Default Queue} -> wl_shm_pool#14.destroy()
[3658337.753] {Default Queue} -> wl_surface#11.set_buffer_scale(2) 🟢
[3658337.767] {Default Queue} -> wl_surface#11.attach(wl_buffer#15, 0, 0)
[3658337.771] {Default Queue} -> wl_surface#11.damage(0, 0, 960, 540)
[3658337.774] {Default Queue} -> wl_surface#11.commit()
However, on Hyprland, we get the enter
event only after the surface has been displayed on the screen:
[3403146.805] {Default Queue} -> wl_compositor#5.create_surface(new id wl_surface#11)
[3403146.810] {Default Queue} -> zwlr_layer_shell_v1#9.get_layer_surface(new id zwlr_layer_surface_v1#13, wl_surface#11, nil, 3, "wl-kbptr")
[3403146.817] {Default Queue} -> zwlr_layer_surface_v1#13.set_anchor(15)
[3403146.820] {Default Queue} -> zwlr_layer_surface_v1#13.set_keyboard_interactivity(1)
[3403146.823] {Default Queue} -> wl_surface#11.commit() 📍
[3403147.063] {Default Queue} zwlr_layer_surface_v1#13.configure(576, 960, 540)
[3403147.069] {Default Queue} -> zwlr_layer_surface_v1#13.ack_configure(576)
[3403147.141] {Default Queue} -> wl_shm#6.create_pool(new id wl_shm_pool#14, fd 5, 2073600)
[3403147.147] {Default Queue} -> wl_shm_pool#14.create_buffer(new id wl_buffer#15, 0, 960, 540, 3840, 0)
[3403147.156] {Default Queue} -> wl_shm_pool#14.destroy()
[3403168.404] {Default Queue} -> wl_surface#11.set_buffer_scale(1) 🔴
[3403168.417] {Default Queue} -> wl_surface#11.attach(wl_buffer#15, 0, 0)
[3403168.421] {Default Queue} -> wl_surface#11.damage(0, 0, 960, 540)
[3403168.424] {Default Queue} -> wl_surface#11.commit()
[3403171.678] {Display Queue} wl_display#1.delete_id(14)
[3403171.690] {Default Queue} wl_buffer#15.release()
[3403171.694] {Default Queue} wl_surface#11.enter(wl_output#10) 👈
[3403171.700] {Default Queue} wl_keyboard#12.enter(579, wl_surface#11, array[0])
[3403171.707] {Default Queue} wl_keyboard#12.modifiers(580, 0, 0, 0, 0)
[3403222.854] {Default Queue} wl_keyboard#12.key(582, 178515, 28, 0)
[3404574.476] {Default Queue} wl_keyboard#12.key(583, 179866, 37, 1)
[3404574.556] {Default Queue} -> wl_buffer#15.destroy()
[3404574.937] {Default Queue} -> wl_shm#6.create_pool(new id wl_shm_pool#14, fd 6, 8294400)
[3404574.962] {Default Queue} -> wl_shm_pool#14.create_buffer(new id wl_buffer#16, 0, 1920, 1080, 7680, 0)
[3404574.977] {Default Queue} -> wl_shm_pool#14.destroy()
[3404584.560] {Default Queue} -> wl_surface#11.set_buffer_scale(2) 🟢
[3404584.571] {Default Queue} -> wl_surface#11.attach(wl_buffer#16, 0, 0)
[3404584.576] {Default Queue} -> wl_surface#11.damage(0, 0, 960, 540)
[3404584.580] {Default Queue} -> wl_surface#11.commit()
Thank you! I have managed to get the logs with the git version and have created a Hyprland issue (linked above this comment).
Hyprland author said that this is still within the spec of the protocol, so it should be fixed by the program: https://github.com/hyprwm/Hyprland/issues/6869#issuecomment-2227325669
I've just pushed 666d85d3ed2e0cfe4aa95a31c055d569d6931d4c which should re-render when it receives a new scaling factor. Please tell me if this works on your machine.
Can confirm that this works! Thanks!
It appears that wl-kbptr does not properly support display scaling.
wl-kbptr on 200% scaling:
(click on the image as both images look the same when shrinked down here)
wl-kbptr on no scaling:
note that the only thing scaling does is make the fonts blurrier.
This is with