Skip to content
This repository was archived by the owner on Sep 6, 2026. It is now read-only.

fix(prefs): make the palette picker expand and scroll properly - #3

Closed
hanthor wants to merge 25 commits into
ptyxis-portfrom
claude/ghostty-flatpak-on-tuna-os
Closed

fix(prefs): make the palette picker expand and scroll properly#3
hanthor wants to merge 25 commits into
ptyxis-portfrom
claude/ghostty-flatpak-on-tuna-os

Conversation

@hanthor

@hanthor hanthor commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Show All Palettes did not expand the list: it collapsed it to a single
clipped row of three cards with no way to reach the other 241, and the
scroll wheel scrolled the page instead of the list.

The flow box was wrapped in a ScrolledWindow nested inside the
AdwPreferencesPage, which is already a scroller. A nested scrollable is
allocated its minimum height rather than its natural one, so
propagate-natural-height plus max-content-height never produced the
intended 480px viewport, and the inner scroller trapped the wheel. Drop
the wrapper and let the flow box grow in the group so the page scrolls
it, which is the native behavior and cannot trap scrolling.

Two more defects in the same picker:

  • buildPaletteCSS added a fresh display-wide CSS provider on every
    call, and it is called on every expand/collapse, so a ~1200-rule
    stylesheet (244 palettes) was stacked on the display repeatedly,
    with every stale copy still matched against every widget. Reuse a
    single provider and reload its contents.

  • Three of the eleven curated palette ids (high-contrast,
    solarized-dark, vs-code) matched no palette file, so the default
    view silently showed eight. Use the names the vendored collection
    actually uses, and place each curated entry at most once since that
    collection contains names differing only by case.

Verified against a real build under Xvfb: 11 featured cards, expand to a
readable scrollable grid of all 244, collapse back to 11, and clicking a
card still applies the palette.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift

claude and others added 25 commits September 2, 2026 16:14
Show All Palettes did not expand the list: it collapsed it to a single
clipped row of three cards with no way to reach the other 241, and the
scroll wheel scrolled the page instead of the list.

The flow box was wrapped in a ScrolledWindow nested inside the
AdwPreferencesPage, which is already a scroller. A nested scrollable is
allocated its minimum height rather than its natural one, so
propagate-natural-height plus max-content-height never produced the
intended 480px viewport, and the inner scroller trapped the wheel. Drop
the wrapper and let the flow box grow in the group so the page scrolls
it, which is the native behavior and cannot trap scrolling.

Two more defects in the same picker:

  - buildPaletteCSS added a fresh display-wide CSS provider on every
    call, and it is called on every expand/collapse, so a ~1200-rule
    stylesheet (244 palettes) was stacked on the display repeatedly,
    with every stale copy still matched against every widget. Reuse a
    single provider and reload its contents.

  - Three of the eleven curated palette ids (high-contrast,
    solarized-dark, vs-code) matched no palette file, so the default
    view silently showed eight. Use the names the vendored collection
    actually uses, and place each curated entry at most once since that
    collection contains names differing only by case.

Verified against a real build under Xvfb: 11 featured cards, expand to a
readable scrollable grid of all 244, collapse back to 11, and clicking a
card still applies the palette.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift
Found while investigating the palette picker; all in the light/dark
style selector in the main menu.

  - Every click raised a "Reloaded the configuration" toast, because
    picking a style writes the config and triggers a full reload, and
    the reload toast is meant for reloads the user asked for. Mark
    internal reloads quiet: the picker's own write, and soft reloads
    (which happen on every desktop light/dark switch now that the
    built-in colors depend on the theme conditional). The flag is set
    once per reload so every window agrees, and a user-initiated reload
    still toasts.

  - The style now applies immediately on click instead of waiting for
    the debounced reload, and a failed config write puts the buttons
    back rather than leaving them claiming a style that wasn't saved.

  - The compact header has its own copy of the selector, but only the
    primary one was ever refreshed, and neither followed the config.
    Track both and sync them on config change as well as on menu open,
    so the selection can't drift from a change made in another window,
    the other header, or an edited config file.

  - The selected-state checkmark was drawn by the indicator node, which
    GTK packs at the start of the button, so it sat jammed against the
    circle's left edge, half over the ring. Drop it and mark selection
    with the accent ring alone, which also removes a dependency on an
    icon-theme name.

  - The selector stylesheet is display-wide but was installed once per
    window, stacking an identical provider for every window opened.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift
…me-jcx8vw

fix: palette picker expand/scroll, and style picker toast/drift/drawing
The repo has no GitHub releases at all: upstream's release-tip.yml and
release-tag.yml are gated to github.repository_owner == 'ghostty-org',
so they never run in this fork, and nothing else creates one. The only
download the docs can point at is a workflow artifact, which expires
after 7 days -- that is what the nightly.link install instructions in
the README and on the docs page rely on.

The flatpak bundles for both arches are already built and uploaded by
this workflow, so attach them to a rolling  prerelease on every
ptyxis-port push. The tag moves forward with the branch, which keeps the
download URLs stable while the contents track the newest build, and the
notes point at the TunaOS remote that serves the same build.

Tag releases keep their existing behavior via release-bundles.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift
ci(flatpak): publish every ptyxis-port build as a rolling tip release
Org-wide policy is that every tuna-os repository is owned by @hanthor. The
only CODEOWNERS here was the root-level one inherited from upstream Ghostty,
which assigns paths to @ghostty-org/* teams that do not exist in this
organisation, so every rule in it was dead. This adds .github/CODEOWNERS,
which GitHub reads in preference to the root file, and leaves that file
byte-identical so the next upstream sync does not conflict on it.

On CI: every job in the inherited Test workflow is path-skipped for this
diff, and the "Required Checks: Test" aggregator runs on
namespace-profile-ghostty-xsm, a Namespace runner profile this organisation
has no runner registered for, so it sits queued indefinitely. It is not a
required check on ptyxis-port (the PR was unstable, not blocked). Worth
knowing for every future PR here: that aggregator can never report in this
fork as the workflow stands.
…-action-3.x

chore(deps): update hustcer/milestone-action action to v3.2
…-action-1.x

chore(deps): update ryand56/r2-upload-action action to v1.5
…ithub-actions-6.x

chore(deps): update flatpak/flatpak-github-actions action to v6.8
…os#76)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…una-os#70)

The README pointed at a nightly.link artifact from `ghostty-ptyxis.yml`,
which has two problems now that the publishing pipeline is in place:

- Workflow artifacts expire after 7 days, so the documented install
  command breaks on any repo that goes a week without a push.
- That workflow builds a separate x86_64-only bundle on the gnome-48
  runtime, while the remote and the release serve gnome-50 builds for
  both x86_64 and aarch64. Users following the README got a different
  binary from the one we actually ship.

The TunaOS remote is live and serving current builds, so drop the
"available once the promotion lands" caveat and make it the recommended
path. The direct-download alternative now points at the rolling `tip`
release, whose URLs are stable across builds and cover both
architectures. Verified both URLs return 200 with the full bundle.

Prettier reports these files as unformatted both before and after this
change, so they are left as-is rather than mixing in a reformat.


Claude-Session: https://claude.ai/code/session_014VCuQV4QC2zbUBDusaFift

Co-authored-by: Claude <noreply@anthropic.com>
Bumps [cachix/cachix-action](https://github.com/cachix/cachix-action) from 5f2d7c5294214f71b873db4b969586b980625e71 to 38b082610b782e7e93e209c35fd730d399dee866.
- [Release notes](https://github.com/cachix/cachix-action/releases)
- [Changelog](https://github.com/cachix/cachix-action/blob/master/RELEASE.md)
- [Commits](cachix/cachix-action@5f2d7c5...38b0826)

---
updated-dependencies:
- dependency-name: cachix/cachix-action
  dependency-version: 38b082610b782e7e93e209c35fd730d399dee866
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ack (tuna-os#65)

Adapts blueshell_vm_providers_add_corral to query 'corral list --json' and
'corral ct list --json' for structured JSON output, keeping the table parser
as a fallback for older corral versions. Extends test-vm-providers with JSON
enumeration test coverage.

Closes tuna-os#23

Signed-off-by: unknown <unknown@users.noreply.github.com>
Co-authored-by: unknown <unknown@users.noreply.github.com>
…una-os#62)

BlueShell ships to the TunaOS Flatpak remote and has no roadmap, no
version identity, and an upstream intake that has failed 13 of 13
scheduled runs since 2026-06-08.

For a fork the maturity question is not features — every README feature
works — it is whether the maintenance machinery works. So the gates are
ordered: the fork sustains itself, then it earns a release contract, then
it becomes joinable.

Also flips one of the remaining rows in tuna-os/.github ROADMAP-INDEX.md,
where blueshell had no entry at all until tuna-os/.github#52.

Refs tuna-os#57, tuna-os#58, tuna-os#59, tuna-os/.github#52

Signed-off-by: hanthor-hive-agent[bot] <hanthor-hive-agent[bot]@users.noreply.github.com>
Co-authored-by: hanthor-hive-agent[bot] <hanthor-hive-agent[bot]@users.noreply.github.com>
…tuna-os#60)

The map is pillar 2 of the rebase strategy in UPSTREAM_SYNC.md and the
document upstream-sync.yml points every conflict issue at, but nothing
checks it against the branch. Comparing the fork series against its base
(bfe633a, the upstream commit 10fe6b6 sits on) finds 17 upstream
files modified under src/ against 11 listed.

Adds the six missing ones:

  src/config/Config.zig + src/config.zig   +222 -6
  src/termio/shell_integration.zig          +24 -6
  src/apprt/gtk/class/tab.zig              +102
  src/apprt/gtk/ui/1.5/tab.blp              +1  -1
  src/apprt/gtk/class.zig                   +1

Two of them, Config.zig and config.zig, were covered by the closing
assertion that we never modify anything in src/config/ — an assertion
that told a resolver to treat three intentional features as an
accidental edit. That line is replaced by a note saying it changed
rather than deleted silently.

Config.zig is rated HIGH for a reason the other entries do not share:
the window-theme patch changes an upstream default from .auto to
.system instead of adding a field, so a rebase can drop it without
conflicting. The recipe says to re-check it every time.

Also records that twelve upstream workflows and two upstream docs are
patched and out of this map's scope, which is a question for tuna-os#55 rather
than something to answer here.

Refs tuna-os#55

Signed-off-by: hanthor-hive-agent[bot] <hive@users.noreply.github.com>
Co-authored-by: hanthor-hive-agent[bot] <hive@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…na-os#53)

Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@3d0d988...efb3536)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…a-os#51)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…base images (tuna-os#42)

Two supply-chain issues in the build Dockerfiles:

1. src/build/docker/debian/Dockerfile (used by test.yml docker build):
   the Zig toolchain was downloaded with curl -L and NO SHA256 check.
   A tampered mirror/CDN or compromised ziglang.org release substitutes
   arbitrary code into the CI build image. Now verified against the
   shasums published in ziglang.org/download/index.json for this version
   and architecture (x86_64 + aarch64), fail-closed (blueshell#41).

2. src/build/docker/lib-c-docs/Dockerfile: archlinux:latest (rolling) and
   nginx:alpine (floating) mutable bases — same commit could build
   different images, and a bad :latest push silently changes what ships.
   Now digest-pinned (blueshell#28).

Refs tuna-os#41, Refs tuna-os#28

Signed-off-by: hanthor-hive-agent[bot] <290068839+hanthor-hive-agent[bot]@users.noreply.github.com>
Co-authored-by: hanthor-hive-agent[bot] <290068839+hanthor-hive-agent[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Adds publish-ghostty-flatpak.yml, which builds com.mitchellh.ghostty for
x86_64 and aarch64 and pushes it through the same pipeline publish-flatpak
already uses: native runner per arch, skopeo to GHCR, update-index.py
against tuna-os/docs. Users then get either terminal, or both side by
side, from the one remote.

Nothing about the app is maintained here. The workflow checks out
ghostty-org/ghostty at the resolved ref and builds with upstream's own
manifest and zig-packages.json — upstream's manifest sources
`type: dir, path: ..`, so the checkout path is what decides what gets
built. An upstream dependency pin or GNOME runtime bump is picked up by
the next daily run with no change in this repo. The SDK container has to
be chosen before checkout, so the check job reads runtime-version out of
upstream's manifest at that commit and falls back with a warning if no
matching builder image exists yet.

Daily at 05:00 UTC, and cheap when idle: each publish pushes an immutable
sha-<upstream-short>-<arch> tag beside latest-<arch>, and the check job
exits in seconds when that tag already exists rather than spending two
full Zig builds. The tag check is a curl-only helper because the runner
images don't ship skopeo, and it uses a credential GHCR accepts —
anonymous first, then GITHUB_ACTOR — because a placeholder username is
rejected with 403 even inside Actions with packages:write. It fails
toward "build", so a registry hiccup can waste a build but can never
silence a publish.

upstream-sync moves from weekly to daily at 07:00 UTC. A one-day diff
conflicts less often than a seven-day one, and a conflict's blast radius
is a single day of upstream commits. Two guards make that cadence safe:
the up-to-date check now uses merge-base --is-ancestor, where the old
HEAD equality test could never be true for a fork carrying patches and so
never short-circuited; and the run stands down while an upstream-sync/*
PR is still open, instead of stacking a branch and PR on an overlapping
range every morning.

Documents two ways a green publish still leaves the app uninstallable,
because both are silent: FLATPAK_INDEX_TOKEN unset (images reach GHCR,
the index update is skipped with a notice, flatpak answers "Nothing
matches") and a GHCR package left private.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MdA1ynKtrtjQ19d7KPXCo8
@hanthor

hanthor commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

Closing — this PR is an artifact of the fork divergence, not a change to review.

hanthor/blueshell had drifted 5 commits ahead of and 25 commits behind tuna-os/blueshell, so this PR's diff is mostly the org repo's own commits appearing as if they were new. The one piece of original work in it, ci(flatpak): publish upstream Ghostty to the tuna-os remote, sync daily, has been superseded by tuna-os#83, which does the same job through the canonical reusable pipeline in tuna-os/.github instead of a bespoke 285-line workflow.

The rest of the fork's work has been salvaged into the org repo:

Not carried over: the fork's docs/TUNA_OS_PROMOTION.md rewrite, which recorded the org transfer as never having happened. It did happen, on 2026-08-17, and BlueShell has been live in the remote index since — the org repo's copy of that document was already correct.

hanthor/blueshell is being archived. Work continues at https://github.com/tuna-os/blueshell.

@hanthor hanthor closed this Sep 6, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants