hzhang 948dfb0c57 feat(extension): P2 — WindowGuard Layer 1 (bounce-back)
Replace the WindowGuard stub with the Layer 1 of design §6: any non-
whitelisted window that joins the dashboard workspace is immediately
moved back to the workspace it came from. This single hook catches all
real paths into dashboard -- wmctrl/xdotool moves, super+shift+→
keybind, overview drag-drop, programmatic change_workspace, and initial
window map with _NET_WM_DESKTOP pointing at dashboard.

Implementation:

- Per-window previousWs tracking via WeakMap<Meta.Window, number>,
  updated on each workspace-changed signal whenever the new workspace
  isn't the dashboard. At enable, walk all existing windows and
  pre-populate from their current workspace.
- Bounce target resolution: prefer the recorded workspace; fall back to
  (dashboardIndex - 1), which always exists because WorkspaceWarden
  guarantees dashboard isn't workspace 0.
- Whitelist Set<Meta.Window> with allow()/disallow() so P3's
  ContainerSupervisor can pin the WebKit container without it being
  immediately bounced.
- All signal connections use connectObject/disconnectObject with `this`
  as the tracker, so dispose() unwinds everything in O(1) bookkeeping.
- Override-redirect windows (menus, tooltips) are skipped.

Layers 2 (overview drop refusal), 3 (hide dashboard from switcher
strip), and 4 (Super+Page_Up/Down clamp) are documented in the file
header and deferred to P8/P9 -- they're UX polish that prevents the
*attempt*, while Layer 1 alone meets the P2 acceptance criteria of
"every entry vector bounces".

extension.ts wires WindowGuard up after WorkspaceWarden, in its own
try/catch so a guard init failure leaves the warden disposable.

Build-chain tweak: @girs/gnome-shell augments connectObject onto
GObject.Object via dist/extensions/global.d.ts, but that file isn't
pulled in by `@girs/gnome-shell/ambient`. Adding
`@girs/gnome-shell/extensions/global` to tsconfig "types" loads the
augmentation explicitly.

Verified: `pnpm -r build` and `pnpm -r exec tsc --noEmit` are clean;
extension bundle is 44.8 KB.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 23:12:44 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00

Dashward

A dedicated rightmost workspace for custom widgets on Ubuntu/GNOME, in the spirit of macOS Dashboard.

  • GNOME Shell extension (GJS) creates the dashboard workspace, defends it from regular window incursions, and supervises the container.
  • WebKitGTK container (separate process) renders an HTML page on that workspace.
  • Widget SDK (TypeScript) lets you write widgets as web components.

Status: P0 skeleton. Design lives in UBUNTU-DASHBOARD-SPACE.md (see also ~/arch/UBUNTU-DASHBOARD-SPACE.md locally).

Target

  • Ubuntu 25.04 / GNOME Shell 48 / Wayland.
  • Other distros & versions: post-v1.

Repo layout

sdk/                      TS widget SDK, published as @dashward/widget-sdk
extension/                GNOME Shell extension (GJS, TS-authored)
  src/                    Extension source
  widgets-builtin/        Builtin widgets shipped with the extension
container/                WebKit kiosk process
  src/                    GJS bootstrap
  runtime/                Page-side runtime (host grid, edit mode, widget loader)
widgets/                  Example / 3rd-party widget dev tree
proto/                    Shared DBus XML + TS types
scripts/                  Build & dev helpers

Dev setup

Requires Node ≥ 20 and pnpm ≥ 9. To install pnpm:

npm install -g pnpm

Then:

pnpm install
pnpm build

Testing discipline

All Shell-side iteration happens inside the ubuntu2504-test libvirt VM, never on the host GNOME session — a buggy extension can lock you out of the Wayland session. See the design doc §17 for the dev loop.

License

TBD.

Description
Ubuntu/GNOME dashboard workspace + TS widget SDK (macOS-Dashboard style).
Readme 117 KiB
Languages
TypeScript 90%
CSS 3.3%
JavaScript 2.9%
HTML 2.4%
Shell 1.4%