feat(compositor): implement DRM/KMS rendering path
Add full DRM/KMS backend with libseat session, GBM allocation, EGL
display initialisation, and a GpuManager-driven rendering loop.
- drm_device.rs: type aliases and per-device/per-output state structs
(WeftDrmDevice, WeftOutputSurface, WeftDrmData)
- drm.rs: replace skeleton with complete backend libseat session,
udev device enumeration, libinput event source, connector scanning
via smithay-drm-extras DrmScanner, DrmOutputManager initialisation
per CRTC, VBlank-driven render_output, sd_notify(READY=1)
- state.rs: add drm: Option<WeftDrmData> field; route dmabuf import
through GPU manager when the DRM path is active
- Cargo.toml: add renderer_multi, use_system_lib Smithay features;
add smithay-drm-extras and sd-notify Linux dependencies
render_output submits a clear-colour-only frame to establish
the VBlank pipeline. Surface compositing is wired up in a subsequent commit.
2026-03-10 21:32:21 +00:00
|
|
|
|
#[cfg(target_os = "linux")]
|
|
|
|
|
|
use crate::backend::drm_device::WeftDrmData;
|
feat(compositor): implement weft-shell-protocol server side
Add the WEFT compositor-shell Wayland protocol and wire it into the
compositor state.
Protocol definition:
- protocol/weft-shell-unstable-v1.xml: defines zweft_shell_manager_v1
(global, bound once by servo-shell) and zweft_shell_window_v1
(per-window slot). Requests: destroy, create_window,
update_metadata, set_geometry. Events: configure, focus_changed,
window_closed, presentation_feedback.
Generated code + bindings:
- crates/weft-compositor/src/protocols/mod.rs: uses wayland-scanner
generate_interfaces! inside a __interfaces sub-module and
generate_server_code! at the server module level, following the
wayland-protocols-wlr crate structure. Exports WeftShellState
(holds the GlobalId) and WeftShellWindowData (per-window user data).
Server-side dispatch (state.rs):
- GlobalDispatch<ZweftShellManagerV1, ()>: binds the global, inits
each bound resource with unit user data.
- Dispatch<ZweftShellManagerV1, ()>: handles create_window by
initialising a ZweftShellWindowV1 and sending an initial configure.
- Dispatch<ZweftShellWindowV1, WeftShellWindowData>: handles
update_metadata (stores advisory data) and set_geometry (echoes
compositor-adjusted configure back to client).
WeftCompositorState.weft_shell_state initialised in new() alongside
all other protocol globals.
New direct deps in weft-compositor: wayland-scanner, wayland-server,
wayland-backend, bitflags (all version-matched to Smithay 0.7).
2026-03-11 06:59:56 +00:00
|
|
|
|
use crate::protocols::{
|
|
|
|
|
|
WeftShellState, WeftShellWindowData, ZweftShellManagerV1, ZweftShellWindowV1,
|
|
|
|
|
|
server::{zweft_shell_manager_v1, zweft_shell_window_v1},
|
|
|
|
|
|
};
|
feat(compositor): implement DRM/KMS rendering path
Add full DRM/KMS backend with libseat session, GBM allocation, EGL
display initialisation, and a GpuManager-driven rendering loop.
- drm_device.rs: type aliases and per-device/per-output state structs
(WeftDrmDevice, WeftOutputSurface, WeftDrmData)
- drm.rs: replace skeleton with complete backend libseat session,
udev device enumeration, libinput event source, connector scanning
via smithay-drm-extras DrmScanner, DrmOutputManager initialisation
per CRTC, VBlank-driven render_output, sd_notify(READY=1)
- state.rs: add drm: Option<WeftDrmData> field; route dmabuf import
through GPU manager when the DRM path is active
- Cargo.toml: add renderer_multi, use_system_lib Smithay features;
add smithay-drm-extras and sd-notify Linux dependencies
render_output submits a clear-colour-only frame to establish
the VBlank pipeline. Surface compositing is wired up in a subsequent commit.
2026-03-10 21:32:21 +00:00
|
|
|
|
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
use smithay::{
|
2026-03-10 20:09:54 +00:00
|
|
|
|
backend::{input::TabletToolDescriptor, renderer::utils::on_commit_buffer_handler},
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
delegate_compositor, delegate_cursor_shape, delegate_dmabuf, delegate_input_method_manager,
|
|
|
|
|
|
delegate_layer_shell, delegate_output, delegate_pointer_constraints, delegate_presentation,
|
2026-03-10 20:24:23 +00:00
|
|
|
|
delegate_seat, delegate_shm, delegate_text_input_manager, delegate_xdg_shell,
|
2026-03-10 22:43:43 +00:00
|
|
|
|
desktop::{
|
|
|
|
|
|
LayerSurface as DesktopLayerSurface, PopupKind, PopupManager, Space, Window,
|
|
|
|
|
|
WindowSurfaceType, layer_map_for_output,
|
|
|
|
|
|
},
|
2026-03-10 20:24:23 +00:00
|
|
|
|
input::{Seat, SeatHandler, SeatState, keyboard::XkbConfig, pointer::CursorImageStatus},
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
output::Output,
|
|
|
|
|
|
reexports::{
|
|
|
|
|
|
calloop::{LoopHandle, LoopSignal},
|
|
|
|
|
|
wayland_server::{
|
feat(compositor): implement weft-shell-protocol server side
Add the WEFT compositor-shell Wayland protocol and wire it into the
compositor state.
Protocol definition:
- protocol/weft-shell-unstable-v1.xml: defines zweft_shell_manager_v1
(global, bound once by servo-shell) and zweft_shell_window_v1
(per-window slot). Requests: destroy, create_window,
update_metadata, set_geometry. Events: configure, focus_changed,
window_closed, presentation_feedback.
Generated code + bindings:
- crates/weft-compositor/src/protocols/mod.rs: uses wayland-scanner
generate_interfaces! inside a __interfaces sub-module and
generate_server_code! at the server module level, following the
wayland-protocols-wlr crate structure. Exports WeftShellState
(holds the GlobalId) and WeftShellWindowData (per-window user data).
Server-side dispatch (state.rs):
- GlobalDispatch<ZweftShellManagerV1, ()>: binds the global, inits
each bound resource with unit user data.
- Dispatch<ZweftShellManagerV1, ()>: handles create_window by
initialising a ZweftShellWindowV1 and sending an initial configure.
- Dispatch<ZweftShellWindowV1, WeftShellWindowData>: handles
update_metadata (stores advisory data) and set_geometry (echoes
compositor-adjusted configure back to client).
WeftCompositorState.weft_shell_state initialised in new() alongside
all other protocol globals.
New direct deps in weft-compositor: wayland-scanner, wayland-server,
wayland-backend, bitflags (all version-matched to Smithay 0.7).
2026-03-11 06:59:56 +00:00
|
|
|
|
Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
backend::{ClientData, ClientId, DisconnectReason},
|
2026-03-10 20:23:33 +00:00
|
|
|
|
protocol::{wl_buffer::WlBuffer, wl_output::WlOutput, wl_surface::WlSurface},
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
utils::{Logical, Point, Rectangle},
|
|
|
|
|
|
wayland::{
|
2026-03-10 20:23:33 +00:00
|
|
|
|
buffer::BufferHandler,
|
2026-03-10 20:24:23 +00:00
|
|
|
|
compositor::{CompositorClientState, CompositorHandler, CompositorState},
|
2026-03-10 20:09:54 +00:00
|
|
|
|
cursor_shape::CursorShapeManagerState,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
dmabuf::{DmabufGlobal, DmabufHandler, DmabufState, ImportNotifier},
|
2026-03-10 20:24:23 +00:00
|
|
|
|
input_method::{
|
|
|
|
|
|
InputMethodHandler, InputMethodManagerState, PopupSurface as ImPopupSurface,
|
|
|
|
|
|
},
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
output::OutputManagerState,
|
|
|
|
|
|
pointer_constraints::{PointerConstraintsHandler, PointerConstraintsState},
|
2026-03-10 20:27:02 +00:00
|
|
|
|
presentation::PresentationState,
|
2026-03-10 20:20:28 +00:00
|
|
|
|
seat::WaylandFocus,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
shell::{
|
|
|
|
|
|
wlr_layer::{Layer, LayerSurface, WlrLayerShellHandler, WlrLayerShellState},
|
|
|
|
|
|
xdg::{PopupSurface, PositionerState, ToplevelSurface, XdgShellHandler, XdgShellState},
|
|
|
|
|
|
},
|
|
|
|
|
|
shm::{ShmHandler, ShmState},
|
2026-03-10 20:24:23 +00:00
|
|
|
|
tablet_manager::TabletSeatHandler,
|
2026-03-10 20:20:28 +00:00
|
|
|
|
text_input::TextInputManagerState,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Per-client state that Smithay compositor protocol handlers need.
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
|
|
pub struct WeftClientState {
|
|
|
|
|
|
pub compositor_state: CompositorClientState,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl ClientData for WeftClientState {
|
|
|
|
|
|
fn initialized(&self, _client_id: ClientId) {}
|
|
|
|
|
|
fn disconnected(&self, _client_id: ClientId, _reason: DisconnectReason) {}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-10 22:43:43 +00:00
|
|
|
|
#[allow(dead_code)]
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
pub struct WeftCompositorState {
|
|
|
|
|
|
pub display_handle: DisplayHandle,
|
|
|
|
|
|
pub loop_signal: LoopSignal,
|
|
|
|
|
|
pub loop_handle: LoopHandle<'static, WeftCompositorState>,
|
|
|
|
|
|
|
|
|
|
|
|
// Wayland protocol globals
|
|
|
|
|
|
pub compositor_state: CompositorState,
|
|
|
|
|
|
pub xdg_shell_state: XdgShellState,
|
|
|
|
|
|
pub layer_shell_state: WlrLayerShellState,
|
|
|
|
|
|
pub shm_state: ShmState,
|
|
|
|
|
|
pub dmabuf_state: DmabufState,
|
|
|
|
|
|
pub output_manager_state: OutputManagerState,
|
|
|
|
|
|
pub presentation_state: PresentationState,
|
|
|
|
|
|
pub text_input_state: TextInputManagerState,
|
|
|
|
|
|
pub input_method_state: InputMethodManagerState,
|
|
|
|
|
|
pub pointer_constraints_state: PointerConstraintsState,
|
|
|
|
|
|
pub cursor_shape_state: CursorShapeManagerState,
|
|
|
|
|
|
|
|
|
|
|
|
// Desktop abstraction layer
|
|
|
|
|
|
pub space: Space<Window>,
|
|
|
|
|
|
pub popups: PopupManager,
|
|
|
|
|
|
|
|
|
|
|
|
// Seat and input state
|
|
|
|
|
|
pub seat_state: SeatState<Self>,
|
|
|
|
|
|
pub seat: Seat<Self>,
|
|
|
|
|
|
pub pointer_location: Point<f64, Logical>,
|
|
|
|
|
|
pub cursor_image_status: CursorImageStatus,
|
|
|
|
|
|
|
|
|
|
|
|
// Set by the backend after renderer initialisation when DMA-BUF is supported.
|
|
|
|
|
|
pub dmabuf_global: Option<DmabufGlobal>,
|
|
|
|
|
|
|
|
|
|
|
|
// Set to false when the compositor should exit the event loop.
|
|
|
|
|
|
pub running: bool,
|
feat(compositor): implement DRM/KMS rendering path
Add full DRM/KMS backend with libseat session, GBM allocation, EGL
display initialisation, and a GpuManager-driven rendering loop.
- drm_device.rs: type aliases and per-device/per-output state structs
(WeftDrmDevice, WeftOutputSurface, WeftDrmData)
- drm.rs: replace skeleton with complete backend libseat session,
udev device enumeration, libinput event source, connector scanning
via smithay-drm-extras DrmScanner, DrmOutputManager initialisation
per CRTC, VBlank-driven render_output, sd_notify(READY=1)
- state.rs: add drm: Option<WeftDrmData> field; route dmabuf import
through GPU manager when the DRM path is active
- Cargo.toml: add renderer_multi, use_system_lib Smithay features;
add smithay-drm-extras and sd-notify Linux dependencies
render_output submits a clear-colour-only frame to establish
the VBlank pipeline. Surface compositing is wired up in a subsequent commit.
2026-03-10 21:32:21 +00:00
|
|
|
|
|
feat(compositor): implement weft-shell-protocol server side
Add the WEFT compositor-shell Wayland protocol and wire it into the
compositor state.
Protocol definition:
- protocol/weft-shell-unstable-v1.xml: defines zweft_shell_manager_v1
(global, bound once by servo-shell) and zweft_shell_window_v1
(per-window slot). Requests: destroy, create_window,
update_metadata, set_geometry. Events: configure, focus_changed,
window_closed, presentation_feedback.
Generated code + bindings:
- crates/weft-compositor/src/protocols/mod.rs: uses wayland-scanner
generate_interfaces! inside a __interfaces sub-module and
generate_server_code! at the server module level, following the
wayland-protocols-wlr crate structure. Exports WeftShellState
(holds the GlobalId) and WeftShellWindowData (per-window user data).
Server-side dispatch (state.rs):
- GlobalDispatch<ZweftShellManagerV1, ()>: binds the global, inits
each bound resource with unit user data.
- Dispatch<ZweftShellManagerV1, ()>: handles create_window by
initialising a ZweftShellWindowV1 and sending an initial configure.
- Dispatch<ZweftShellWindowV1, WeftShellWindowData>: handles
update_metadata (stores advisory data) and set_geometry (echoes
compositor-adjusted configure back to client).
WeftCompositorState.weft_shell_state initialised in new() alongside
all other protocol globals.
New direct deps in weft-compositor: wayland-scanner, wayland-server,
wayland-backend, bitflags (all version-matched to Smithay 0.7).
2026-03-11 06:59:56 +00:00
|
|
|
|
// WEFT compositor–shell protocol global.
|
|
|
|
|
|
pub weft_shell_state: WeftShellState,
|
|
|
|
|
|
|
feat(compositor): implement DRM/KMS rendering path
Add full DRM/KMS backend with libseat session, GBM allocation, EGL
display initialisation, and a GpuManager-driven rendering loop.
- drm_device.rs: type aliases and per-device/per-output state structs
(WeftDrmDevice, WeftOutputSurface, WeftDrmData)
- drm.rs: replace skeleton with complete backend libseat session,
udev device enumeration, libinput event source, connector scanning
via smithay-drm-extras DrmScanner, DrmOutputManager initialisation
per CRTC, VBlank-driven render_output, sd_notify(READY=1)
- state.rs: add drm: Option<WeftDrmData> field; route dmabuf import
through GPU manager when the DRM path is active
- Cargo.toml: add renderer_multi, use_system_lib Smithay features;
add smithay-drm-extras and sd-notify Linux dependencies
render_output submits a clear-colour-only frame to establish
the VBlank pipeline. Surface compositing is wired up in a subsequent commit.
2026-03-10 21:32:21 +00:00
|
|
|
|
#[cfg(target_os = "linux")]
|
|
|
|
|
|
pub drm: Option<WeftDrmData>,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl WeftCompositorState {
|
|
|
|
|
|
pub fn new(
|
|
|
|
|
|
display_handle: DisplayHandle,
|
|
|
|
|
|
loop_signal: LoopSignal,
|
|
|
|
|
|
loop_handle: LoopHandle<'static, Self>,
|
|
|
|
|
|
seat_name: String,
|
|
|
|
|
|
) -> Self {
|
|
|
|
|
|
let compositor_state = CompositorState::new::<Self>(&display_handle);
|
|
|
|
|
|
let xdg_shell_state = XdgShellState::new::<Self>(&display_handle);
|
|
|
|
|
|
let layer_shell_state = WlrLayerShellState::new::<Self>(&display_handle);
|
|
|
|
|
|
let shm_state = ShmState::new::<Self>(&display_handle, vec![]);
|
|
|
|
|
|
let dmabuf_state = DmabufState::new();
|
2026-03-10 20:24:23 +00:00
|
|
|
|
let output_manager_state = OutputManagerState::new_with_xdg_output::<Self>(&display_handle);
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
// Clock ID 1 = CLOCK_MONOTONIC
|
|
|
|
|
|
let presentation_state = PresentationState::new::<Self>(&display_handle, 1);
|
|
|
|
|
|
let text_input_state = TextInputManagerState::new::<Self>(&display_handle);
|
|
|
|
|
|
let input_method_state =
|
|
|
|
|
|
InputMethodManagerState::new::<Self, _>(&display_handle, |_client| true);
|
|
|
|
|
|
let pointer_constraints_state = PointerConstraintsState::new::<Self>(&display_handle);
|
|
|
|
|
|
let cursor_shape_state = CursorShapeManagerState::new::<Self>(&display_handle);
|
feat(compositor): implement weft-shell-protocol server side
Add the WEFT compositor-shell Wayland protocol and wire it into the
compositor state.
Protocol definition:
- protocol/weft-shell-unstable-v1.xml: defines zweft_shell_manager_v1
(global, bound once by servo-shell) and zweft_shell_window_v1
(per-window slot). Requests: destroy, create_window,
update_metadata, set_geometry. Events: configure, focus_changed,
window_closed, presentation_feedback.
Generated code + bindings:
- crates/weft-compositor/src/protocols/mod.rs: uses wayland-scanner
generate_interfaces! inside a __interfaces sub-module and
generate_server_code! at the server module level, following the
wayland-protocols-wlr crate structure. Exports WeftShellState
(holds the GlobalId) and WeftShellWindowData (per-window user data).
Server-side dispatch (state.rs):
- GlobalDispatch<ZweftShellManagerV1, ()>: binds the global, inits
each bound resource with unit user data.
- Dispatch<ZweftShellManagerV1, ()>: handles create_window by
initialising a ZweftShellWindowV1 and sending an initial configure.
- Dispatch<ZweftShellWindowV1, WeftShellWindowData>: handles
update_metadata (stores advisory data) and set_geometry (echoes
compositor-adjusted configure back to client).
WeftCompositorState.weft_shell_state initialised in new() alongside
all other protocol globals.
New direct deps in weft-compositor: wayland-scanner, wayland-server,
wayland-backend, bitflags (all version-matched to Smithay 0.7).
2026-03-11 06:59:56 +00:00
|
|
|
|
let weft_shell_state = WeftShellState::new::<Self>(&display_handle);
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
|
|
|
|
|
|
let mut seat_state = SeatState::new();
|
|
|
|
|
|
let mut seat = seat_state.new_wl_seat(&display_handle, seat_name);
|
|
|
|
|
|
seat.add_keyboard(XkbConfig::default(), 200, 25)
|
|
|
|
|
|
.expect("no xkb config errors expected with default config");
|
|
|
|
|
|
seat.add_pointer();
|
|
|
|
|
|
seat.add_touch();
|
|
|
|
|
|
|
|
|
|
|
|
Self {
|
|
|
|
|
|
display_handle,
|
|
|
|
|
|
loop_signal,
|
|
|
|
|
|
loop_handle,
|
|
|
|
|
|
compositor_state,
|
|
|
|
|
|
xdg_shell_state,
|
|
|
|
|
|
layer_shell_state,
|
|
|
|
|
|
shm_state,
|
|
|
|
|
|
dmabuf_state,
|
|
|
|
|
|
output_manager_state,
|
|
|
|
|
|
presentation_state,
|
|
|
|
|
|
text_input_state,
|
|
|
|
|
|
input_method_state,
|
|
|
|
|
|
pointer_constraints_state,
|
|
|
|
|
|
cursor_shape_state,
|
feat(compositor): implement weft-shell-protocol server side
Add the WEFT compositor-shell Wayland protocol and wire it into the
compositor state.
Protocol definition:
- protocol/weft-shell-unstable-v1.xml: defines zweft_shell_manager_v1
(global, bound once by servo-shell) and zweft_shell_window_v1
(per-window slot). Requests: destroy, create_window,
update_metadata, set_geometry. Events: configure, focus_changed,
window_closed, presentation_feedback.
Generated code + bindings:
- crates/weft-compositor/src/protocols/mod.rs: uses wayland-scanner
generate_interfaces! inside a __interfaces sub-module and
generate_server_code! at the server module level, following the
wayland-protocols-wlr crate structure. Exports WeftShellState
(holds the GlobalId) and WeftShellWindowData (per-window user data).
Server-side dispatch (state.rs):
- GlobalDispatch<ZweftShellManagerV1, ()>: binds the global, inits
each bound resource with unit user data.
- Dispatch<ZweftShellManagerV1, ()>: handles create_window by
initialising a ZweftShellWindowV1 and sending an initial configure.
- Dispatch<ZweftShellWindowV1, WeftShellWindowData>: handles
update_metadata (stores advisory data) and set_geometry (echoes
compositor-adjusted configure back to client).
WeftCompositorState.weft_shell_state initialised in new() alongside
all other protocol globals.
New direct deps in weft-compositor: wayland-scanner, wayland-server,
wayland-backend, bitflags (all version-matched to Smithay 0.7).
2026-03-11 06:59:56 +00:00
|
|
|
|
weft_shell_state,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
space: Space::default(),
|
|
|
|
|
|
popups: PopupManager::default(),
|
|
|
|
|
|
seat_state,
|
|
|
|
|
|
seat,
|
|
|
|
|
|
pointer_location: Point::from((0.0_f64, 0.0_f64)),
|
|
|
|
|
|
cursor_image_status: CursorImageStatus::Hidden,
|
|
|
|
|
|
dmabuf_global: None,
|
|
|
|
|
|
running: true,
|
feat(compositor): implement DRM/KMS rendering path
Add full DRM/KMS backend with libseat session, GBM allocation, EGL
display initialisation, and a GpuManager-driven rendering loop.
- drm_device.rs: type aliases and per-device/per-output state structs
(WeftDrmDevice, WeftOutputSurface, WeftDrmData)
- drm.rs: replace skeleton with complete backend libseat session,
udev device enumeration, libinput event source, connector scanning
via smithay-drm-extras DrmScanner, DrmOutputManager initialisation
per CRTC, VBlank-driven render_output, sd_notify(READY=1)
- state.rs: add drm: Option<WeftDrmData> field; route dmabuf import
through GPU manager when the DRM path is active
- Cargo.toml: add renderer_multi, use_system_lib Smithay features;
add smithay-drm-extras and sd-notify Linux dependencies
render_output submits a clear-colour-only frame to establish
the VBlank pipeline. Surface compositing is wired up in a subsequent commit.
2026-03-10 21:32:21 +00:00
|
|
|
|
#[cfg(target_os = "linux")]
|
|
|
|
|
|
drm: None,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// --- CompositorHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl CompositorHandler for WeftCompositorState {
|
|
|
|
|
|
fn compositor_state(&mut self) -> &mut CompositorState {
|
|
|
|
|
|
&mut self.compositor_state
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn client_compositor_state<'a>(&self, client: &'a Client) -> &'a CompositorClientState {
|
|
|
|
|
|
&client
|
|
|
|
|
|
.get_data::<WeftClientState>()
|
|
|
|
|
|
.expect("client must carry WeftClientState")
|
|
|
|
|
|
.compositor_state
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn commit(&mut self, surface: &WlSurface) {
|
|
|
|
|
|
on_commit_buffer_handler::<Self>(surface);
|
|
|
|
|
|
|
|
|
|
|
|
if let Some(window) = self
|
|
|
|
|
|
.space
|
|
|
|
|
|
.elements()
|
2026-03-10 20:28:55 +00:00
|
|
|
|
.find(|w| w.wl_surface().as_deref() == Some(surface))
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
.cloned()
|
|
|
|
|
|
{
|
|
|
|
|
|
window.on_commit();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Re-arrange layer surfaces for any output that contains this surface.
|
|
|
|
|
|
let outputs: Vec<Output> = self
|
|
|
|
|
|
.space
|
|
|
|
|
|
.outputs()
|
|
|
|
|
|
.filter(|o| {
|
|
|
|
|
|
let map = layer_map_for_output(o);
|
|
|
|
|
|
map.layer_for_surface(surface, WindowSurfaceType::ALL)
|
|
|
|
|
|
.is_some()
|
|
|
|
|
|
})
|
|
|
|
|
|
.cloned()
|
|
|
|
|
|
.collect();
|
|
|
|
|
|
for output in outputs {
|
|
|
|
|
|
layer_map_for_output(&output).arrange();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_compositor!(WeftCompositorState);
|
|
|
|
|
|
|
|
|
|
|
|
// --- ShmHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl ShmHandler for WeftCompositorState {
|
|
|
|
|
|
fn shm_state(&self) -> &ShmState {
|
|
|
|
|
|
&self.shm_state
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_shm!(WeftCompositorState);
|
|
|
|
|
|
|
|
|
|
|
|
// --- XdgShellHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl XdgShellHandler for WeftCompositorState {
|
|
|
|
|
|
fn xdg_shell_state(&mut self) -> &mut XdgShellState {
|
|
|
|
|
|
&mut self.xdg_shell_state
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn new_toplevel(&mut self, surface: ToplevelSurface) {
|
|
|
|
|
|
// Send initial configure before wrapping — the toplevel needs a configure to map.
|
|
|
|
|
|
surface.send_configure();
|
|
|
|
|
|
let window = Window::new_wayland_window(surface);
|
|
|
|
|
|
// Map at origin; proper placement policy comes with the shell protocol wave.
|
|
|
|
|
|
self.space.map_element(window, (0, 0), false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn new_popup(&mut self, surface: PopupSurface, positioner: PositionerState) {
|
|
|
|
|
|
surface.with_pending_state(|state| {
|
|
|
|
|
|
state.geometry = positioner.get_geometry();
|
|
|
|
|
|
});
|
|
|
|
|
|
if surface.send_configure().is_ok() {
|
|
|
|
|
|
self.popups.track_popup(PopupKind::Xdg(surface)).ok();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-10 22:43:43 +00:00
|
|
|
|
fn reposition_request(
|
|
|
|
|
|
&mut self,
|
|
|
|
|
|
surface: PopupSurface,
|
|
|
|
|
|
positioner: PositionerState,
|
|
|
|
|
|
token: u32,
|
|
|
|
|
|
) {
|
|
|
|
|
|
surface.with_pending_state(|state| {
|
|
|
|
|
|
state.geometry = positioner.get_geometry();
|
|
|
|
|
|
state.positioner = positioner;
|
|
|
|
|
|
});
|
|
|
|
|
|
surface.send_repositioned(token);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-10 20:24:23 +00:00
|
|
|
|
fn grab(
|
|
|
|
|
|
&mut self,
|
|
|
|
|
|
_surface: PopupSurface,
|
|
|
|
|
|
_seat: smithay::reexports::wayland_server::protocol::wl_seat::WlSeat,
|
|
|
|
|
|
_serial: smithay::utils::Serial,
|
|
|
|
|
|
) {
|
|
|
|
|
|
}
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_xdg_shell!(WeftCompositorState);
|
|
|
|
|
|
|
|
|
|
|
|
// --- WlrLayerShellHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl WlrLayerShellHandler for WeftCompositorState {
|
|
|
|
|
|
fn shell_state(&mut self) -> &mut WlrLayerShellState {
|
|
|
|
|
|
&mut self.layer_shell_state
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn new_layer_surface(
|
|
|
|
|
|
&mut self,
|
|
|
|
|
|
surface: LayerSurface,
|
|
|
|
|
|
_output: Option<WlOutput>,
|
|
|
|
|
|
_layer: Layer,
|
2026-03-10 22:43:43 +00:00
|
|
|
|
namespace: String,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
) {
|
2026-03-10 22:43:43 +00:00
|
|
|
|
let desktop_surface = DesktopLayerSurface::new(surface, namespace);
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
if let Some(output) = self.space.outputs().next().cloned() {
|
|
|
|
|
|
layer_map_for_output(&output)
|
2026-03-10 22:43:43 +00:00
|
|
|
|
.map_layer(&desktop_surface)
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
.expect("layer surface must not already be mapped");
|
|
|
|
|
|
layer_map_for_output(&output).arrange();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_layer_shell!(WeftCompositorState);
|
|
|
|
|
|
|
|
|
|
|
|
// --- SeatHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl SeatHandler for WeftCompositorState {
|
|
|
|
|
|
type KeyboardFocus = WlSurface;
|
|
|
|
|
|
type PointerFocus = WlSurface;
|
|
|
|
|
|
type TouchFocus = WlSurface;
|
|
|
|
|
|
|
|
|
|
|
|
fn seat_state(&mut self) -> &mut SeatState<Self> {
|
|
|
|
|
|
&mut self.seat_state
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn focus_changed(&mut self, _seat: &Seat<Self>, _focused: Option<&WlSurface>) {}
|
|
|
|
|
|
|
|
|
|
|
|
fn cursor_image(&mut self, _seat: &Seat<Self>, image: CursorImageStatus) {
|
|
|
|
|
|
self.cursor_image_status = image;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_seat!(WeftCompositorState);
|
|
|
|
|
|
|
2026-03-10 20:23:33 +00:00
|
|
|
|
// --- BufferHandler (required supertrait for DmabufHandler) ---
|
|
|
|
|
|
|
|
|
|
|
|
impl BufferHandler for WeftCompositorState {
|
|
|
|
|
|
fn buffer_destroyed(&mut self, _buffer: &WlBuffer) {}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
// --- DmabufHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl DmabufHandler for WeftCompositorState {
|
|
|
|
|
|
fn dmabuf_state(&mut self) -> &mut DmabufState {
|
|
|
|
|
|
&mut self.dmabuf_state
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn dmabuf_imported(
|
|
|
|
|
|
&mut self,
|
|
|
|
|
|
_global: &DmabufGlobal,
|
feat(compositor): implement DRM/KMS rendering path
Add full DRM/KMS backend with libseat session, GBM allocation, EGL
display initialisation, and a GpuManager-driven rendering loop.
- drm_device.rs: type aliases and per-device/per-output state structs
(WeftDrmDevice, WeftOutputSurface, WeftDrmData)
- drm.rs: replace skeleton with complete backend libseat session,
udev device enumeration, libinput event source, connector scanning
via smithay-drm-extras DrmScanner, DrmOutputManager initialisation
per CRTC, VBlank-driven render_output, sd_notify(READY=1)
- state.rs: add drm: Option<WeftDrmData> field; route dmabuf import
through GPU manager when the DRM path is active
- Cargo.toml: add renderer_multi, use_system_lib Smithay features;
add smithay-drm-extras and sd-notify Linux dependencies
render_output submits a clear-colour-only frame to establish
the VBlank pipeline. Surface compositing is wired up in a subsequent commit.
2026-03-10 21:32:21 +00:00
|
|
|
|
dmabuf: smithay::backend::allocator::dmabuf::Dmabuf,
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
notifier: ImportNotifier,
|
|
|
|
|
|
) {
|
feat(compositor): implement DRM/KMS rendering path
Add full DRM/KMS backend with libseat session, GBM allocation, EGL
display initialisation, and a GpuManager-driven rendering loop.
- drm_device.rs: type aliases and per-device/per-output state structs
(WeftDrmDevice, WeftOutputSurface, WeftDrmData)
- drm.rs: replace skeleton with complete backend libseat session,
udev device enumeration, libinput event source, connector scanning
via smithay-drm-extras DrmScanner, DrmOutputManager initialisation
per CRTC, VBlank-driven render_output, sd_notify(READY=1)
- state.rs: add drm: Option<WeftDrmData> field; route dmabuf import
through GPU manager when the DRM path is active
- Cargo.toml: add renderer_multi, use_system_lib Smithay features;
add smithay-drm-extras and sd-notify Linux dependencies
render_output submits a clear-colour-only frame to establish
the VBlank pipeline. Surface compositing is wired up in a subsequent commit.
2026-03-10 21:32:21 +00:00
|
|
|
|
#[cfg(target_os = "linux")]
|
|
|
|
|
|
if let Some(drm) = self.drm.as_mut() {
|
|
|
|
|
|
use smithay::backend::renderer::ImportDma;
|
|
|
|
|
|
let node = drm.primary_gpu;
|
|
|
|
|
|
if drm
|
|
|
|
|
|
.gpu_manager
|
|
|
|
|
|
.single_renderer(&node)
|
|
|
|
|
|
.ok()
|
|
|
|
|
|
.and_then(|mut r| r.import_dmabuf(&dmabuf, None).ok())
|
|
|
|
|
|
.is_some()
|
|
|
|
|
|
{
|
|
|
|
|
|
let _ = notifier.successful::<Self>();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
drop(notifier);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_dmabuf!(WeftCompositorState);
|
|
|
|
|
|
|
|
|
|
|
|
// --- OutputHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl smithay::wayland::output::OutputHandler for WeftCompositorState {}
|
|
|
|
|
|
delegate_output!(WeftCompositorState);
|
|
|
|
|
|
|
2026-03-10 20:27:02 +00:00
|
|
|
|
// PresentationState has no handler trait; delegate macro only requires Dispatch bounds.
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
delegate_presentation!(WeftCompositorState);
|
|
|
|
|
|
|
2026-03-10 20:20:28 +00:00
|
|
|
|
// TextInputManagerState has no handler trait; delegate macro only requires SeatHandler.
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
delegate_text_input_manager!(WeftCompositorState);
|
|
|
|
|
|
|
|
|
|
|
|
// --- InputMethodHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl InputMethodHandler for WeftCompositorState {
|
2026-03-10 20:09:54 +00:00
|
|
|
|
fn new_popup(&mut self, _surface: ImPopupSurface) {}
|
|
|
|
|
|
fn dismiss_popup(&mut self, _surface: ImPopupSurface) {}
|
|
|
|
|
|
fn popup_repositioned(&mut self, _surface: ImPopupSurface) {}
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
|
|
|
|
|
|
fn parent_geometry(&self, parent_surface: &WlSurface) -> Rectangle<i32, Logical> {
|
|
|
|
|
|
self.space
|
|
|
|
|
|
.elements()
|
|
|
|
|
|
.find_map(|w: &Window| {
|
2026-03-10 20:28:55 +00:00
|
|
|
|
if w.wl_surface().as_deref() == Some(parent_surface) {
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
Some(w.geometry())
|
|
|
|
|
|
} else {
|
|
|
|
|
|
None
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
.unwrap_or_default()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_input_method_manager!(WeftCompositorState);
|
|
|
|
|
|
|
|
|
|
|
|
// --- PointerConstraintsHandler ---
|
|
|
|
|
|
|
|
|
|
|
|
impl PointerConstraintsHandler for WeftCompositorState {
|
|
|
|
|
|
fn new_constraint(
|
|
|
|
|
|
&mut self,
|
|
|
|
|
|
_surface: &WlSurface,
|
|
|
|
|
|
_pointer: &smithay::input::pointer::PointerHandle<Self>,
|
|
|
|
|
|
) {
|
|
|
|
|
|
}
|
2026-03-10 20:20:28 +00:00
|
|
|
|
|
|
|
|
|
|
fn cursor_position_hint(
|
|
|
|
|
|
&mut self,
|
|
|
|
|
|
_surface: &WlSurface,
|
|
|
|
|
|
_pointer: &smithay::input::pointer::PointerHandle<Self>,
|
|
|
|
|
|
_location: smithay::utils::Point<f64, Logical>,
|
|
|
|
|
|
) {
|
|
|
|
|
|
}
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
delegate_pointer_constraints!(WeftCompositorState);
|
|
|
|
|
|
|
2026-03-10 20:09:54 +00:00
|
|
|
|
// --- TabletSeatHandler (required by delegate_cursor_shape!) ---
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
|
2026-03-10 20:09:54 +00:00
|
|
|
|
impl TabletSeatHandler for WeftCompositorState {
|
|
|
|
|
|
fn tablet_tool_image(&mut self, _tool: &TabletToolDescriptor, image: CursorImageStatus) {
|
|
|
|
|
|
self.cursor_image_status = image;
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-10 20:09:54 +00:00
|
|
|
|
// CursorShapeManagerState has no handler trait; it calls SeatHandler::cursor_image directly.
|
feat(compositor): add weft-compositor crate
- Implement WeftCompositorState with all Wayland protocol globals:
compositor, xdg-shell, layer-shell, shm, dmabuf, output, presentation,
text-input, input-method, pointer-constraints, cursor-shape, seat.
- Implement process_input_event covering keyboard, pointer (relative +
absolute), axis, touch, and all gesture types (swipe, pinch, hold).
- Implement Winit backend with damage-tracked rendering loop and frame
callbacks.
- Add DRM/KMS backend skeleton: libseat session, udev device discovery,
calloop integration (rendering path deferred).
- Add infra/systemd/weft-compositor.service (Type=notify).
- Split CI into cross-platform and linux-only jobs.
- Exclude weft-compositor from Windows check scripts.
2026-03-10 19:56:35 +00:00
|
|
|
|
delegate_cursor_shape!(WeftCompositorState);
|
feat(compositor): implement weft-shell-protocol server side
Add the WEFT compositor-shell Wayland protocol and wire it into the
compositor state.
Protocol definition:
- protocol/weft-shell-unstable-v1.xml: defines zweft_shell_manager_v1
(global, bound once by servo-shell) and zweft_shell_window_v1
(per-window slot). Requests: destroy, create_window,
update_metadata, set_geometry. Events: configure, focus_changed,
window_closed, presentation_feedback.
Generated code + bindings:
- crates/weft-compositor/src/protocols/mod.rs: uses wayland-scanner
generate_interfaces! inside a __interfaces sub-module and
generate_server_code! at the server module level, following the
wayland-protocols-wlr crate structure. Exports WeftShellState
(holds the GlobalId) and WeftShellWindowData (per-window user data).
Server-side dispatch (state.rs):
- GlobalDispatch<ZweftShellManagerV1, ()>: binds the global, inits
each bound resource with unit user data.
- Dispatch<ZweftShellManagerV1, ()>: handles create_window by
initialising a ZweftShellWindowV1 and sending an initial configure.
- Dispatch<ZweftShellWindowV1, WeftShellWindowData>: handles
update_metadata (stores advisory data) and set_geometry (echoes
compositor-adjusted configure back to client).
WeftCompositorState.weft_shell_state initialised in new() alongside
all other protocol globals.
New direct deps in weft-compositor: wayland-scanner, wayland-server,
wayland-backend, bitflags (all version-matched to Smithay 0.7).
2026-03-11 06:59:56 +00:00
|
|
|
|
|
|
|
|
|
|
// --- weft-shell-protocol ---
|
|
|
|
|
|
|
|
|
|
|
|
impl GlobalDispatch<ZweftShellManagerV1, ()> for WeftCompositorState {
|
|
|
|
|
|
fn bind(
|
|
|
|
|
|
_state: &mut Self,
|
|
|
|
|
|
_handle: &DisplayHandle,
|
|
|
|
|
|
_client: &Client,
|
|
|
|
|
|
resource: New<ZweftShellManagerV1>,
|
|
|
|
|
|
_global_data: &(),
|
|
|
|
|
|
data_init: &mut DataInit<'_, Self>,
|
|
|
|
|
|
) {
|
|
|
|
|
|
data_init.init(resource, ());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Dispatch<ZweftShellManagerV1, ()> for WeftCompositorState {
|
|
|
|
|
|
fn request(
|
|
|
|
|
|
_state: &mut Self,
|
|
|
|
|
|
_client: &Client,
|
|
|
|
|
|
_resource: &ZweftShellManagerV1,
|
|
|
|
|
|
request: zweft_shell_manager_v1::Request,
|
|
|
|
|
|
_data: &(),
|
|
|
|
|
|
_dh: &DisplayHandle,
|
|
|
|
|
|
data_init: &mut DataInit<'_, Self>,
|
|
|
|
|
|
) {
|
|
|
|
|
|
match request {
|
|
|
|
|
|
zweft_shell_manager_v1::Request::Destroy => {}
|
|
|
|
|
|
zweft_shell_manager_v1::Request::CreateWindow {
|
|
|
|
|
|
id,
|
|
|
|
|
|
app_id,
|
|
|
|
|
|
title,
|
|
|
|
|
|
role,
|
|
|
|
|
|
x,
|
|
|
|
|
|
y,
|
|
|
|
|
|
width,
|
|
|
|
|
|
height,
|
|
|
|
|
|
} => {
|
|
|
|
|
|
let window = data_init.init(
|
|
|
|
|
|
id,
|
|
|
|
|
|
WeftShellWindowData {
|
|
|
|
|
|
app_id,
|
|
|
|
|
|
title,
|
|
|
|
|
|
role,
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
window.configure(x, y, width, height, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Dispatch<ZweftShellWindowV1, WeftShellWindowData> for WeftCompositorState {
|
|
|
|
|
|
fn request(
|
|
|
|
|
|
_state: &mut Self,
|
|
|
|
|
|
_client: &Client,
|
|
|
|
|
|
resource: &ZweftShellWindowV1,
|
|
|
|
|
|
request: zweft_shell_window_v1::Request,
|
|
|
|
|
|
_data: &WeftShellWindowData,
|
|
|
|
|
|
_dh: &DisplayHandle,
|
|
|
|
|
|
_data_init: &mut DataInit<'_, Self>,
|
|
|
|
|
|
) {
|
|
|
|
|
|
match request {
|
|
|
|
|
|
zweft_shell_window_v1::Request::Destroy => {}
|
|
|
|
|
|
zweft_shell_window_v1::Request::UpdateMetadata { title, role } => {
|
|
|
|
|
|
let _ = (title, role);
|
|
|
|
|
|
}
|
|
|
|
|
|
zweft_shell_window_v1::Request::SetGeometry {
|
|
|
|
|
|
x,
|
|
|
|
|
|
y,
|
|
|
|
|
|
width,
|
|
|
|
|
|
height,
|
|
|
|
|
|
} => {
|
|
|
|
|
|
resource.configure(x, y, width, height, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|