Meet main where it has moved since this branch was written

The rebase itself is the previous five commits replayed onto main; this is what
they needed once they landed there, kept separate so the replay stays readable.

The shell did not start. A Column in this branch's notification settings menu
assigned its own implicitWidth and implicitHeight, which a Qt 6 positioner
computes and does not let you set. That took out every contract that launches a
shell -- six of the seven failures were this one line, and none of them said so
until the error was read to the bottom. A Column already measures itself from its
children, so the bindings are simply gone.

Three assertions pinned an implementation main has since replaced, and each is
updated to pin the intent rather than the mechanism:

  - The display picker now reads primaryFirstMonitors, which is monitors sorted
    with the primary first. Still populated from what is connected, which is what
    the contract is for; the sorted list is the point, so the picker opens on the
    display somebody is most likely to mean. This branch made that change and
    broke its own contract without noticing.
  - The accent swatches come from the accentName schema rather than
    Object.keys(Theme.accents). Same swatches, same order, one source shared with
    every other enum row.
  - The OSD used to take no pointer input at all. It takes some now, because this
    branch's own design calls for a secondary click on a visible OSD to open its
    settings, and a Wayland input region cannot admit one button and refuse
    another. The rule that survives is that the region stays bounded to the OSD's
    own card: it floats over other windows for a couple of seconds, and a region
    bigger than the card would swallow clicks meant for something underneath.

Theme's accent table moved to ThemeProfiles, which is this branch's point -- a
curated accent and a custom profile become the same kind of record. main had
meanwhile given each accent a `gnome` member, the nearest name in GNOME's fixed
accent-color enum, which is what makes libadwaita applications recolor instead of
staying in GNOME blue. That member moved into the curated table rather than being
dropped, and adwaita-accent-contract now reads it where it lives.

Where main had simply moved further along the same path, main won: the focused
border driven by the chosen accent rather than a hardcoded pair, the gradient
built through the shared serializer rather than a hand-rolled string, the
multi-edge dock geometry. This branch's context menu, keyboard focus and
accessibility work sit on top of those rather than beside them.

Three new contracts arrived carrying .sh and lost it, along with the references
in this branch's own plan.

124 contracts pass.

Claude-Session: https://claude.ai/code/session_01NvgBuSWB5sE43yWmg21ozj
This commit is contained in:
Gabriel Brown
2026-08-20 22:23:27 -04:00
parent ed428e87c4
commit 6016efa436
7 changed files with 49 additions and 25 deletions
@@ -49,7 +49,14 @@ for target in 'Pick primary from screen' 'Pick secondary from screen'; do
|| fail "screen picker action is missing $target"
done
rg -Fq 'model: Object.keys(Theme.accents)' "$settings/AccentPicker.qml" \
# The curated swatches come from the accentName schema rather than from
# Object.keys(Theme.accents): the schema's option order is the palette's order,
# and it is the same source every other enum row reads. What matters here is
# unchanged -- the curated accents are still one click away, ahead of the
# editor.
rg -Fq 'PreferenceSchema.spec("accentName")' "$settings/AccentPicker.qml" \
|| fail 'curated swatches are no longer sourced from the accent schema'
rg -Fq 'model: root.options' "$settings/AccentPicker.qml" \
|| fail 'curated swatches are no longer the fast path'
rg -Fq 'ThemeProfiles.useCuratedAccent(entry.modelData)' "$settings/AccentPicker.qml" \
|| fail 'curated swatches do not select a profile-backed accent'
+5 -1
View File
@@ -54,7 +54,11 @@ rg -Fq 'options: Displays.scalesForMode(' "$page" \
|| fail 'scale choices are not filtered for the active resolution'
rg -Fq 'property string selectedOutput:' "$page" \
|| fail 'connected outputs cannot be selected'
rg -Fq 'options: Displays.monitors.map(' "$page" \
# primaryFirstMonitors is monitors sorted with the primary first, so the
# selector is still populated from what is connected -- which is what this
# protects. Naming the sorted list rather than the raw one is the point: the
# picker should open on the display somebody is most likely to mean.
rg -Fq 'options: Displays.primaryFirstMonitors.map(' "$page" \
|| fail 'the output selector is not populated from connected displays'
rg -Fq 'id: revertVerifyTimer' "$service" \
|| fail 'automatic restoration has no bounded readback verification'
+14 -1
View File
@@ -33,7 +33,20 @@ rg -Fq 'WlrLayershell.namespace: "qs-popover-osd"' "$osd" \
|| fail 'OSD does not use the existing Prism blur namespace'
rg -Fq 'WlrLayershell.keyboardFocus: WlrKeyboardFocus.None' "$osd" \
|| fail 'OSD may steal keyboard focus'
rg -Fq 'mask: Region {}' "$osd" || fail 'OSD may intercept pointer input'
# The OSD used to take no pointer input at all. It now takes some, because a
# secondary click on a visible OSD opens its settings and dismisses it -- and a
# Wayland input region cannot be told to admit one button and not another, so
# the feature is not available without a region.
#
# What still has to hold is that the region is BOUNDED to the OSD's own surface
# rather than the screen. The OSD floats over whatever is underneath for a
# couple of seconds; a region larger than the card would swallow clicks meant
# for a window nobody could see was being covered.
rg -Fq 'mask: Region {' "$osd" || fail 'OSD declares no input region at all'
rg -Fq 'item: inputMask' "$osd" \
|| fail 'the OSD input region is not bound to an item, so it may cover more than the OSD itself'
rg -Fq 'anchors.fill: parent' "$osd" \
|| fail 'the OSD input mask does not track the surface it belongs to'
rg -Fq 'PrismEdge {' "$osd" || fail 'OSD is missing the Prism signature edge'
rg -Fq 'font.features: Theme.tabularFigures' "$osd" \
|| fail 'changing percentages do not use tabular figures'