fix(wayland): open windows on compositors without xdg-decoration, viewporter or fractional scale
Window - The constructor made a fractional scale, a toplevel decoration and a viewport from Device::fractionalScaleManager, Device::manager and Device::wpViewporter without looking at them. Device::handle_global binds those globals only when the compositor advertises them, and Initialize requires only wl_shm, wl_compositor and xdg_wm_base, so on a compositor without one of the three (GNOME's Mutter has no xdg-decoration) the constructor handed libwayland a null proxy and crashed before the window existed (#162). Each object is now made only when its global is there, which Resize and the destructor already assumed. - The fractional scale needs the viewporter too: the preferred scale is applied through the viewport, which shows the buffer's physical pixels at width/scale x height/scale. A surface without a viewport is as large as its buffer, so there the scale stays 1, which keeps pointer and touch positions, configure sizes and the text-input caret, all converted by it, in physical pixels; the compositor scales the window up on a HiDPI output. A scale that changes after the constructor is still applied only by the next resize, which is #165. - Without xdg-decoration the window has no title bar, since the library draws no client-side decorations. Device - The optional globals say they are optional, and that a request on a null proxy crashes. Tests - WindowOptionalGlobals: hides xdg-decoration, wp_viewporter and wp_fractional_scale_v1 from the Window one at a time and all at once, by nulling the Device statics after Initialize, and renders, resizes and closes a window each time without a protocol error. Before the fix it crashed on the window without xdg-decoration. A global the compositor does not offer is reported as a SKIP line, since the path that uses it goes untested there. README - Which Wayland protocols the window needs, and what it does without the optional ones. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
6e94cc6209
commit
670df31cc6
5 changed files with 184 additions and 7 deletions
|
|
@ -85,7 +85,13 @@ shaded through an intersection shader with an any-hit cut-out.
|
|||
framing, input events. Pick a backend at build time via the target
|
||||
triple. The DOM backend routes every dynamic symbol through
|
||||
[additional/dom-env.js](additional/dom-env.js) and
|
||||
[additional/dom-webgpu.js](additional/dom-webgpu.js).
|
||||
[additional/dom-webgpu.js](additional/dom-webgpu.js). On Wayland the
|
||||
window needs `wl_compositor`, `wl_shm` and `xdg_wm_base`, and uses
|
||||
`xdg-decoration`, `wp_viewporter` and `wp_fractional_scale_v1` where the
|
||||
compositor has them. Without xdg-decoration (GNOME) the window has no
|
||||
title bar, as the library draws no client-side decorations; when either
|
||||
of the other two is missing it draws at scale 1, and the compositor
|
||||
scales it up on a HiDPI output.
|
||||
- **Device** *(Vulkan only)* — single-instance bring-up targeting
|
||||
`VK_EXT_descriptor_heap`; pipelines are created with
|
||||
`VK_PIPELINE_CREATE_2_DESCRIPTOR_HEAP_BIT_EXT` so there are no
|
||||
|
|
|
|||
Loading…
Reference in a new issue