hzhang 5b871b8ecb fix(extension): WindowGuard skips desktop-icons-ng; harden warden ordering
P2 went onto the VM and the dashboard workspace appeared, but switching
to it auto-bounced back to the previous workspace. Diagnostic build
showed every `window-added` on dashboard was firing for a window with
title `@!0,0;BDHF`, wm_class=gjs, type=NORMAL, sticky=false. That's the
desktop-icons-ng (ding) extension's per-monitor desktop window: it runs
as a separate gjs process, so it masquerades as a generic NORMAL window
and the original DESKTOP/DOCK/SPLASHSCREEN filter missed it. WindowGuard
was un-sticking it on every workspace switch, which caused mutter to
flip the active workspace away from dashboard.

WindowGuard.shouldSkip now also returns true for `is_skip_taskbar()`
windows. That's the load-bearing check for ding, and a sensible general
rule: skip-taskbar windows are owner-managed (PiP, helper utilities,
backgrounded ding desktops) and shouldn't be dragged around by us.
The DESKTOP/DOCK/SPLASHSCREEN check stays for extensions that do label
themselves correctly.

While re-deploying, also harden the WorkspaceWarden enable() ordering.
The original sequence relied on mutter not reacting to the
`dynamic-workspaces=false` flip before our `append_new_workspace` call
landed -- but with default gsettings (num-workspaces=4), a faster
reaction would expand the count to 4 and leave us with ghost workspaces.
Reorder to: write num-workspaces=current first, then flip dynamic, then
append, then update num-workspaces. The race is now closed regardless of
mutter timing.

Verified on ubuntu2504-test VM: dashboard workspace switchable,
ding silently ignored, real-window bounces still log on Super+Shift+End.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 00:06:49 +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%