2026-03-10 20:20:28 +00:00
|
|
|
use std::{sync::Arc, time::Duration};
|
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::{
|
|
|
|
|
backend::{
|
2026-03-10 20:09:54 +00:00
|
|
|
renderer::{
|
|
|
|
|
damage::OutputDamageTracker, element::surface::WaylandSurfaceRenderElement,
|
|
|
|
|
gles::GlesRenderer,
|
|
|
|
|
},
|
|
|
|
|
winit::{self, WinitEvent},
|
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
|
|
|
output::{Mode as OutputMode, Output, PhysicalProperties, Subpixel},
|
2026-03-10 20:20:28 +00:00
|
|
|
reexports::calloop::{generic::Generic, EventLoop, Interest, Mode, PostAction},
|
2026-03-10 20:09:54 +00:00
|
|
|
utils::{Rectangle, Transform},
|
2026-03-10 20:20:28 +00:00
|
|
|
wayland::socket::ListeningSocketSource,
|
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:20:28 +00:00
|
|
|
use crate::{
|
|
|
|
|
input,
|
|
|
|
|
state::{WeftClientState, WeftCompositorState},
|
|
|
|
|
};
|
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 fn run() -> anyhow::Result<()> {
|
2026-03-10 20:09:54 +00:00
|
|
|
let mut display =
|
|
|
|
|
smithay::reexports::wayland_server::Display::<WeftCompositorState>::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
|
|
|
let display_handle = display.handle();
|
|
|
|
|
|
|
|
|
|
let mut event_loop: EventLoop<'static, WeftCompositorState> = EventLoop::try_new()?;
|
|
|
|
|
let loop_handle = event_loop.handle();
|
|
|
|
|
let loop_signal = event_loop.get_signal();
|
|
|
|
|
|
2026-03-10 20:09:54 +00:00
|
|
|
let (mut backend, winit) = winit::init()
|
|
|
|
|
.map_err(|e| anyhow::anyhow!("winit init failed: {e}"))?;
|
|
|
|
|
|
|
|
|
|
let mode = OutputMode {
|
|
|
|
|
size: backend.window_size(),
|
|
|
|
|
refresh: 60_000,
|
|
|
|
|
};
|
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 output = Output::new(
|
|
|
|
|
"WEFT-winit".to_string(),
|
|
|
|
|
PhysicalProperties {
|
|
|
|
|
size: (0, 0).into(),
|
|
|
|
|
subpixel: Subpixel::Unknown,
|
|
|
|
|
make: "WEFT".to_string(),
|
|
|
|
|
model: "Winit".to_string(),
|
|
|
|
|
},
|
|
|
|
|
);
|
2026-03-10 20:09:54 +00:00
|
|
|
let _global = output.create_global::<WeftCompositorState>(&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
|
|
|
output.change_current_state(
|
2026-03-10 20:09:54 +00:00
|
|
|
Some(mode),
|
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(Transform::Flipped180),
|
|
|
|
|
None,
|
|
|
|
|
Some((0, 0).into()),
|
|
|
|
|
);
|
2026-03-10 20:09:54 +00:00
|
|
|
output.set_preferred(mode);
|
|
|
|
|
|
2026-03-10 20:20:28 +00:00
|
|
|
// Create the listening socket; each connecting client is inserted with
|
|
|
|
|
// default per-client data so CompositorHandler::client_compositor_state works.
|
|
|
|
|
let listening_socket = ListeningSocketSource::new_auto()
|
2026-03-10 20:09:54 +00:00
|
|
|
.map_err(|e| anyhow::anyhow!("Wayland socket creation failed: {e}"))?;
|
2026-03-10 20:20:28 +00:00
|
|
|
let socket_name = listening_socket.socket_name().to_os_string();
|
2026-03-10 20:09:54 +00:00
|
|
|
std::env::set_var("WAYLAND_DISPLAY", &socket_name);
|
|
|
|
|
tracing::info!(?socket_name, "Wayland compositor socket open");
|
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:20:28 +00:00
|
|
|
loop_handle
|
|
|
|
|
.insert_source(listening_socket, |client_stream, _, state| {
|
|
|
|
|
state
|
|
|
|
|
.display_handle
|
|
|
|
|
.insert_client(client_stream, Arc::new(WeftClientState::default()))
|
|
|
|
|
.unwrap();
|
|
|
|
|
})
|
|
|
|
|
.map_err(|e| anyhow::anyhow!("socket source insertion failed: {e}"))?;
|
|
|
|
|
|
|
|
|
|
// Register the display fd so calloop dispatches Wayland client messages when readable.
|
|
|
|
|
loop_handle
|
|
|
|
|
.insert_source(
|
|
|
|
|
Generic::new(display, Interest::READ, Mode::Level),
|
|
|
|
|
|_, display, state| {
|
|
|
|
|
// Safety: the display is owned by this Generic source and is never dropped
|
|
|
|
|
// while the event loop runs.
|
|
|
|
|
unsafe {
|
|
|
|
|
display.get_mut().dispatch_clients(state).unwrap();
|
|
|
|
|
}
|
|
|
|
|
Ok(PostAction::Continue)
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
.map_err(|e| anyhow::anyhow!("display source insertion failed: {e}"))?;
|
|
|
|
|
|
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 state = WeftCompositorState::new(
|
|
|
|
|
display_handle,
|
|
|
|
|
loop_signal,
|
2026-03-10 20:09:54 +00:00
|
|
|
loop_handle.clone(),
|
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
|
|
|
"seat-0".to_string(),
|
|
|
|
|
);
|
|
|
|
|
state.space.map_output(&output, (0, 0));
|
|
|
|
|
|
|
|
|
|
let mut damage_tracker = OutputDamageTracker::from_output(&output);
|
2026-03-10 20:09:54 +00:00
|
|
|
let start_time = std::time::Instant::now();
|
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:20:28 +00:00
|
|
|
// WinitEventLoop implements calloop's EventSource; Winit events arrive
|
|
|
|
|
// through the same dispatch loop as all other compositor sources.
|
2026-03-10 20:09:54 +00:00
|
|
|
loop_handle
|
|
|
|
|
.insert_source(winit, move |event, _, state| match event {
|
|
|
|
|
WinitEvent::Resized { size, .. } => {
|
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 new_mode = OutputMode {
|
|
|
|
|
size,
|
|
|
|
|
refresh: 60_000,
|
|
|
|
|
};
|
2026-03-10 20:09:54 +00:00
|
|
|
output.change_current_state(Some(new_mode), None, None, 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
|
|
|
output.set_preferred(new_mode);
|
2026-03-10 20:09:54 +00:00
|
|
|
state.space.map_output(&output, (0, 0));
|
|
|
|
|
damage_tracker = OutputDamageTracker::from_output(&output);
|
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
|
|
|
}
|
|
|
|
|
WinitEvent::Input(input_event) => {
|
|
|
|
|
input::process_input_event(state, input_event);
|
|
|
|
|
}
|
2026-03-10 20:09:54 +00:00
|
|
|
WinitEvent::Redraw => {
|
|
|
|
|
let size = backend.window_size();
|
|
|
|
|
let full_damage = Rectangle::from_size(size);
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
let (renderer, mut framebuffer) = backend.bind().unwrap();
|
|
|
|
|
smithay::desktop::space::render_output::<
|
|
|
|
|
_,
|
|
|
|
|
WaylandSurfaceRenderElement<GlesRenderer>,
|
|
|
|
|
_,
|
|
|
|
|
_,
|
|
|
|
|
>(
|
|
|
|
|
&output,
|
|
|
|
|
renderer,
|
|
|
|
|
&mut framebuffer,
|
|
|
|
|
1.0,
|
|
|
|
|
0,
|
|
|
|
|
[&state.space],
|
|
|
|
|
&[],
|
|
|
|
|
&mut damage_tracker,
|
|
|
|
|
[0.1_f32, 0.1, 0.1, 1.0],
|
|
|
|
|
)
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
backend.submit(Some(&[full_damage])).unwrap();
|
|
|
|
|
|
|
|
|
|
state.space.elements().for_each(|window| {
|
|
|
|
|
window.send_frame(
|
|
|
|
|
&output,
|
|
|
|
|
start_time.elapsed(),
|
|
|
|
|
Some(Duration::ZERO),
|
|
|
|
|
|_, _| Some(output.clone()),
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
state.space.refresh();
|
|
|
|
|
state.popups.cleanup();
|
|
|
|
|
let _ = state.display_handle.flush_clients();
|
|
|
|
|
|
2026-03-10 20:20:28 +00:00
|
|
|
// Request next redraw to drive continuous rendering.
|
2026-03-10 20:09:54 +00:00
|
|
|
backend.window().request_redraw();
|
|
|
|
|
}
|
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
|
|
|
WinitEvent::CloseRequested => {
|
|
|
|
|
state.running = false;
|
2026-03-10 20:09:54 +00:00
|
|
|
state.loop_signal.stop();
|
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
|
|
|
_ => (),
|
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
|
|
|
.map_err(|e| anyhow::anyhow!("winit source insertion failed: {e}"))?;
|
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:20:28 +00:00
|
|
|
event_loop.run(None, &mut 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
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|