Graphics now talks to the compositor directly through wayland-client and xdg-shell instead of GLFW and libdecor. Wayland is the only supported platform for now. Architecture: - WaylandConnection binds the globals (xdg_wm_base, wl_seat, data device, viewporter, fractional scale, cursor shape, text-input-v3, xdg-decoration) and runs a prepared-read poll loop. - WaylandWindow owns the surface and toplevel, applies configures (size, maximized, tiled, activated), fractional scale through a viewport, the window geometry and input region, and starts compositor move and resize. - WaylandSeat handles the pointer (cursor shapes, wheel), the keyboard (xkbcommon keymap, compose, key repeat on a timerfd in the same poll), the clipboard and IME commits. - VulkanContext no longer knows about the windowing system: a VulkanSurfaceSource supplies instance extensions, the surface and the framebuffer extent, and the swapchain switches to premultiplied alpha when the surface supports it. - WindowInputDispatcher feeds EventHandler and input observers; ImGuiPlatform replaces imgui_impl_glfw on top of it, including cursors, clipboard and the IME rectangle. The window draws its own frame. WindowFrame holds the geometry: a transparent shadow margin around the content, rounded corners, an input region and edge hit-testing for resizing. After the UI and ImGui, a separate nanovg pass cuts the corners, strokes the outline and paints the shadow behind the content. Maximized or tiled windows drop the margin; without compositor alpha the window stays opaque and square but still resizes from its edges. Window gains minimize, toggleMaximize, beginMove, beginResize, showWindowMenu, setCursor, clipboard and text input. Applications keep their existing API. Without libdecor, a resize configure reaches the next drawn frame in 1.9 ms median (3.6 ms worst) over a scripted maximize/restore loop; animated frames stay paced at the display refresh and the idle gallery uses about 1% of a core.
31 lines
1.5 KiB
Markdown
31 lines
1.5 KiB
Markdown
# Graphics
|
|
|
|
Native Wayland window, Vulkan presentation, nanovg canvas and ImGui debug UI.
|
|
Wayland is the only supported platform.
|
|
|
|
## Window backend
|
|
|
|
- `WaylandConnection` binds the globals: `xdg_wm_base`, `wl_seat`,
|
|
`wl_data_device_manager`, `wp_viewporter`, `wp_fractional_scale_v1`,
|
|
`wp_cursor_shape_v1`, `zwp_text_input_v3` and `xdg-decoration`.
|
|
- `WaylandWindow` owns the surface and toplevel, applies configures (size,
|
|
maximized, tiled, activated), fractional scale through a viewport, the
|
|
window geometry and input region, and starts compositor move/resize.
|
|
- `WaylandSeat` handles pointer (cursor shapes, wheel), keyboard (xkbcommon
|
|
keymap, compose, key repeat through a timerfd in the same poll), clipboard
|
|
(`text/plain;charset=utf-8`) and IME commits from `text-input-v3`.
|
|
- `WindowFrame` is the pure geometry of the client-side frame: shadow margin,
|
|
content rect, input region and edge hit-testing. It is unit-tested.
|
|
- `WindowInputDispatcher` turns backend input into `EventHandler` events and
|
|
forwards it to observers such as `ImGuiPlatform`, which feeds ImGui IO.
|
|
|
|
## Frame
|
|
|
|
The surface is the content plus a transparent shadow margin. Each frame draws
|
|
the UI in content coordinates, then ImGui, then a separate nanovg pass that
|
|
cuts the rounded corners, strokes the outline and paints the shadow behind the
|
|
content. The swapchain uses premultiplied alpha when the surface supports it.
|
|
|
|
## Tests
|
|
|
|
`TestGraphics` covers frame geometry and key mapping without a display.
|