feat(servo-shell): add servo-shell skeleton, system UI, service unit, and Wayland input audit
Includes winit Wayland input audit for servo-shell integration planning.
New files:
- crates/weft-servo-shell/: new workspace member
- Cargo.toml: anyhow + tracing deps; no servo dep yet (requires git
dependency on github.com/servo/servo with multi-minute build; deferred
until embedder contract is confirmed)
- src/main.rs: reads WAYLAND_DISPLAY and WEFT_SYSTEM_UI_HTML, locates
system-ui.html from packaged path, calls embed_servo() stub that
returns a descriptive error explaining the integration work remaining
- infra/shell/system-ui.html: system UI document per blueprint Section 5
DOM structure (weft-desktop, weft-wallpaper, weft-taskbar, weft-launcher,
weft-notification-center, weft-window); includes clock and launcher toggle
- infra/systemd/servo-shell.service: Requires+After weft-compositor.service,
Type=simple, Restart=on-failure
- docs/architecture/winit-wayland-audit.md: audit of winit 0.30.x Wayland
backend against WEFT input requirements; identifies keyboard shortcut
inhibit gap, touch gesture gap, IME incomplete (zwp_text_input_v3),
frame pacing absent (wp_presentation_time), DMA-BUF unverified;
none block initial integration; all tracked as pre-GA work items
Modified:
- Cargo.toml: add weft-servo-shell to workspace members
- scripts/wsl-check.sh: switch to --workspace for all three gates
2026-03-10 23:34:26 +00:00
|
|
|
[package]
|
|
|
|
|
name = "weft-servo-shell"
|
|
|
|
|
version.workspace = true
|
|
|
|
|
edition.workspace = true
|
|
|
|
|
rust-version.workspace = true
|
|
|
|
|
|
|
|
|
|
[[bin]]
|
|
|
|
|
name = "weft-servo-shell"
|
|
|
|
|
path = "src/main.rs"
|
|
|
|
|
|
2026-03-11 13:52:13 +00:00
|
|
|
[features]
|
2026-03-12 14:16:17 +00:00
|
|
|
# Enable actual Servo rendering. Deps are declared as optional below and only
|
|
|
|
|
# fetched when this feature is active. The Servo monorepo (~1 GB) is not
|
|
|
|
|
# downloaded during a plain `cargo check` or `cargo build` without this feature.
|
|
|
|
|
servo-embed = ["dep:servo", "dep:winit", "dep:softbuffer"]
|
2026-03-11 13:52:13 +00:00
|
|
|
|
feat(servo-shell): add servo-shell skeleton, system UI, service unit, and Wayland input audit
Includes winit Wayland input audit for servo-shell integration planning.
New files:
- crates/weft-servo-shell/: new workspace member
- Cargo.toml: anyhow + tracing deps; no servo dep yet (requires git
dependency on github.com/servo/servo with multi-minute build; deferred
until embedder contract is confirmed)
- src/main.rs: reads WAYLAND_DISPLAY and WEFT_SYSTEM_UI_HTML, locates
system-ui.html from packaged path, calls embed_servo() stub that
returns a descriptive error explaining the integration work remaining
- infra/shell/system-ui.html: system UI document per blueprint Section 5
DOM structure (weft-desktop, weft-wallpaper, weft-taskbar, weft-launcher,
weft-notification-center, weft-window); includes clock and launcher toggle
- infra/systemd/servo-shell.service: Requires+After weft-compositor.service,
Type=simple, Restart=on-failure
- docs/architecture/winit-wayland-audit.md: audit of winit 0.30.x Wayland
backend against WEFT input requirements; identifies keyboard shortcut
inhibit gap, touch gesture gap, IME incomplete (zwp_text_input_v3),
frame pacing absent (wp_presentation_time), DMA-BUF unverified;
none block initial integration; all tracked as pre-GA work items
Modified:
- Cargo.toml: add weft-servo-shell to workspace members
- scripts/wsl-check.sh: switch to --workspace for all three gates
2026-03-10 23:34:26 +00:00
|
|
|
[dependencies]
|
|
|
|
|
anyhow = "1.0"
|
|
|
|
|
tracing = "0.1"
|
|
|
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
2026-03-11 07:05:03 +00:00
|
|
|
wayland-client = "0.31"
|
|
|
|
|
wayland-backend = "0.3"
|
|
|
|
|
wayland-scanner = "0.31"
|
|
|
|
|
bitflags = "2"
|
feat(servo-shell): per-app WebView lifecycle driven by appd events (servo-embed only)
Task 10 -- App WebView lifecycle.
appd_ws module (servo-embed gated):
Background thread connects to the appd WebSocket on startup.
Sends QUERY_RUNNING to receive initial running sessions.
Translates LAUNCH_ACK -> AppdCmd::Launch and APP_STATE stopped
-> AppdCmd::Stop, then wakes the winit event loop via the
shared EventLoopWaker.
embedder changes:
App struct gains app_rx (mpsc receiver), app_webviews
(HashMap<session_id, WebView>), active_session, and a stored
rendering_context used when creating app WebViews later.
create_app_webview(): resolves weft-app://<app_id>/index.html
to a file URL, creates a dedicated UserContentManager with the
weftIpc bridge injected (includes window.weftSessionId), builds
and registers a new WebView.
about_to_wait() drains app_rx: creates WebViews for Launch
commands, removes and clears active_session for Stop commands.
active_webview() returns the active-session WebView when one
exists, falling back to the system-ui WebView. Rendering,
keyboard, and mouse events all route through active_webview().
Resize propagates to both the system WebView and all app WebViews.
run() creates the mpsc channel and spawns the appd listener
before entering the winit event loop.
2026-03-11 16:59:12 +00:00
|
|
|
serde_json = "1"
|
|
|
|
|
tungstenite = "0.24"
|
2026-03-12 14:16:17 +00:00
|
|
|
|
|
|
|
|
[dependencies.servo]
|
|
|
|
|
git = "https://github.com/marcoallegretti/servo"
|
|
|
|
|
branch = "servo-weft"
|
|
|
|
|
optional = true
|
|
|
|
|
default-features = false
|
|
|
|
|
|
|
|
|
|
[dependencies.winit]
|
|
|
|
|
version = "0.30"
|
|
|
|
|
optional = true
|
|
|
|
|
features = ["wayland"]
|
|
|
|
|
|
|
|
|
|
[dependencies.softbuffer]
|
|
|
|
|
version = "0.4"
|
|
|
|
|
optional = true
|