feat: P3 — WebKit container process pinned to dashboard
Dashward now actually renders content on the dashboard workspace. The container is a separate gjs subprocess (so a WebKit crash can't take down gnome-shell), and the extension pins its window to the dashboard slot via the WindowGuard whitelist. container/src/main.ts: tiny GJS bootstrap that creates a borderless fullscreen Gtk.Window with a WebKit2 WebView and loads dashboard.html from a runtime directory passed in via argv. `GLib.set_prgname` happens before any GTK init so Wayland's xdg-shell app_id matches `top.hangmanlab.dashward.container` -- that's the wm_class fingerprint the extension matches against. extension/src/container-supervisor.ts: spawn the container via Gio.Subprocess; pump its stdout/stderr into journal under `[container stdout|stderr]` tags so we can diagnose WebKit crashes without attaching; watch display::window-created for the app_id match; on arrival, whitelist with WindowGuard before moving to dashboard (so the move's window-added doesn't bounce); make_fullscreen; clear the cached ref on the window's `unmanaged` signal. Dispose SIGTERMs the subprocess. P3 explicitly skips auto-restart / exponential backoff and DBus signaling -- those land in P4. container/runtime/runtime.ts + styles.css: a "Dashward" placeholder card on the 12-column grid so the dashboard workspace is visually distinct from a regular workspace; widget mounting / edit mode is P5+. Verified on the ubuntu2504-test VM: extension enables cleanly, dashboard shows the placeholder, switching to/from dashboard works, ding's window is still ignored. MESA/EGL stderr lines are VM-only software-rendering fallback noise (no virgl). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,16 +1,28 @@
|
||||
:root {
|
||||
--bg: #f5f5f7;
|
||||
--fg: #1c1c1e;
|
||||
--fg-muted: rgba(28, 28, 30, 0.55);
|
||||
--grid-gap: 16px;
|
||||
}
|
||||
|
||||
[data-theme="dark"] {
|
||||
--bg: #0f0f12;
|
||||
--fg: #f0f0f5;
|
||||
--fg-muted: rgba(240, 240, 245, 0.55);
|
||||
}
|
||||
|
||||
html, body { margin: 0; padding: 0; height: 100%; background: var(--bg); color: var(--fg); }
|
||||
body { font-family: ui-sans-serif, system-ui, -apple-system, sans-serif; }
|
||||
html, body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
background: var(--bg);
|
||||
color: var(--fg);
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, 'Inter', sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
#grid {
|
||||
display: grid;
|
||||
@@ -20,3 +32,32 @@ body { font-family: ui-sans-serif, system-ui, -apple-system, sans-serif; }
|
||||
min-height: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.placeholder {
|
||||
grid-column: 1 / -1;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
align-content: center;
|
||||
gap: 12px;
|
||||
min-height: 80vh;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.placeholder h1 {
|
||||
font-size: clamp(3rem, 8vw, 6rem);
|
||||
font-weight: 200;
|
||||
letter-spacing: -0.02em;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.placeholder .hint {
|
||||
font-size: 1.25rem;
|
||||
margin: 0;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.placeholder .meta {
|
||||
font-size: 0.9rem;
|
||||
margin: 0;
|
||||
color: var(--fg-muted);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user