diff --git a/.github/release-notes/v0.1.1-beta.16.2.md b/.github/release-notes/v0.1.1-beta.16.2.md new file mode 100644 index 0000000..944b9e9 --- /dev/null +++ b/.github/release-notes/v0.1.1-beta.16.2.md @@ -0,0 +1,62 @@ +# 0.1.1-beta.16.2 + +Beta.16.2 fixes workspace animation stutter, defers premature centre-layout +changes after reveal/rebuild, and fixes Health and AI collector handling. + +## Fixes + +- Workspaces: the workspace animation stutters since Beta 16 (#73). Paint subtrees are now created only for the active workspace style; the focus animation renders 11–13 real frames per switch again (4–6 in 16.1), style switch cycles are 29–41 % faster and bar switch cycles 11–14 % faster on our fixture. The rest images of all styles stay identical to 16.1 at DPR 1; at DPR 1.6 only glyph rasterisation differs by at most 4/255 on text pixels, and the numbers style now sits at its geometrically correct position (up to 1 physical pixel). +- Centre group: the responsive stage (clock / clock+weather / clock+date+weather) could be decided with a stale host budget right after a bar reveal or a rebuild, briefly showing the date or hiding the weather. The decision is now deferred while the status group's spacing savings are still pending or the host budget is stale. +- Status group: the 1–2-frame undershoot of the status icons right after a bar rebuild (spacing savings applied one frame late) no longer triggers a wrong centre stage. +- Health: `shibumi-health` no longer reports plugins as "modified" because of `__pycache__`/`.pyc` files in the plugin directory (#74). The payload digest now ignores them, like the installer does. +- AI: the agents usage updater waits up to 300 s instead of 120 s for the Omarchy collectors. Large Codex session histories (tens of GB) made the Codex collector exceed 120 s, so the Codex card vanished from the AI panel after 24 h. +- Tests: the notification adapter smoke test no longer races its timer (the test that made one release job red in 16.1). +- Bar: the bar's fallback colours now reference the palette as `Commons.Color`, as Omarchy requires for Qt 6.12, where an unqualified `Color` resolves to the new QtQuick type (basecamp/omarchy #14553). +- Bar: the hidden-bar probe accepts Omarchy's upcoming `bar-hidden` toggle marker next to the current `bar-off` (basecamp/omarchy #14395). + +## Known issues + +- Rings style: right after a bar rebuild (reload, V1/V2 switch, workspace count change) the focus ring can be drawn about 6 px off for a single frame (16 ms); on our fixture this happened in up to every second rebuild in the standard layout and in 1 of 10 in the full layout. It is a build-time animation ordering effect and will be fixed with the host layout redesign in 0.2.0. +- Notch bar at DPR 1.6 with the numbers or kanji style: the centre group can oscillate between two layouts for a while after a layout change. This exists since 16.1 (status spacing feedback) and is also addressed by the 0.2.0 redesign. + +## Compatibility + +The 24-plugin suite and transactional installation model are unchanged, retaining the Omarchy and Omarchy Settings `4.0.4-1`, Omarchy `v4.0.4` source, and Quickshell `0.3.1-1` pins. +Runtime validation used Qt 6.11.2; Qt 6.12 is not yet validated. + +## Install and update + +For a new source installation, use the published release tag: + +```bash +sudo pacman -S --needed python jq curl networkmanager power-profiles-daemon upower xdg-utils libnotify wl-clipboard ttf-material-symbols-variable ttf-jetbrains-mono-nerd-basic noto-fonts-cjk adwaita-fonts +git clone https://github.com/HANCORE-linux/Shibumi-Shell.git +cd Shibumi-Shell +git checkout v0.1.1-beta.16.2 +./scripts/shibumi-suite install --yes +``` + +Update an admitted Beta.16.1 installation from its existing checkout: + +```bash +git fetch --tags +git checkout v0.1.1-beta.16.2 +./scripts/shibumi-suite update --dry-run +./scripts/shibumi-suite update --yes +./scripts/shibumi-suite status +``` + +The exact Beta.16.1 tag (`3b35049`) and release merge (`65c8d8bf`) are admitted +predecessors. Older supported identities retain their exact revision and +payload checks; an arbitrary checkout with the same version is not admitted. +Do not install or update from `main`, or delete lifecycle state to bypass +admission. See the [installation and recovery guide](https://github.com/HANCORE-linux/Shibumi-Shell/blob/v0.1.1-beta.16.2/docs/install.md). +AUR publication remains deferred. + +## Downgrade warning + +**Downgrade:** Beta.15.4 and older cannot read V1 layouts with parked widgets +(`order.parked`). They reset V1 order, roles and splits to defaults; other +settings and V2 stay. `uninstall --keep-settings` does not prevent this. +Back up `~/.config/omarchy/shell.json` and `~/.local/state/shibumi/` before a +downgrade. Details: [Backup before downgrade](https://github.com/HANCORE-linux/Shibumi-Shell/blob/v0.1.1-beta.16.2/docs/install.md#backup-before-downgrade). diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index accdfe9..0e09c06 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -432,7 +432,7 @@ checks pass. - The shared runtime owns one process-singleton `omarchy.bar` visibility-nudge handler, enabled only for the one fully admitted active Shibumi bar. It exposes only `syncHidden`, which asks that owner to re-read - Omarchy's host-owned `bar-off` marker after `omarchy-toggle-bar` changes it; + Omarchy's host-owned `bar-off` or `bar-hidden` marker after `omarchy-toggle-bar` changes it; the directory watcher remains the ordinary update path. Incoming ownership arms only after the bounded host-handler handoff window; changing the host-injected bar identity revokes outgoing ownership synchronously. diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aca984..84c6ed0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [0.1.1-beta.16.2] - 2026-10-08 + +### Fixed + +- Workspaces: the workspace animation stutters since Beta 16 (#73). Paint subtrees are now created only for the active workspace style; the focus animation renders 11–13 real frames per switch again (4–6 in 16.1), style switch cycles are 29–41 % faster and bar switch cycles 11–14 % faster on our fixture. The rest images of all styles stay identical to 16.1 at DPR 1; at DPR 1.6 only glyph rasterisation differs by at most 4/255 on text pixels, and the numbers style now sits at its geometrically correct position (up to 1 physical pixel). +- Centre group: the responsive stage (clock / clock+weather / clock+date+weather) could be decided with a stale host budget right after a bar reveal or a rebuild, briefly showing the date or hiding the weather. The decision is now deferred while the status group's spacing savings are still pending or the host budget is stale. +- Status group: the 1–2-frame undershoot of the status icons right after a bar rebuild (spacing savings applied one frame late) no longer triggers a wrong centre stage. +- Health: `shibumi-health` no longer reports plugins as "modified" because of `__pycache__`/`.pyc` files in the plugin directory (#74). The payload digest now ignores them, like the installer does. +- AI: the agents usage updater waits up to 300 s instead of 120 s for the Omarchy collectors. Large Codex session histories (tens of GB) made the Codex collector exceed 120 s, so the Codex card vanished from the AI panel after 24 h. +- Tests: the notification adapter smoke test no longer races its timer (the test that made one release job red in 16.1). +- Bar: the bar's fallback colours now reference the palette as `Commons.Color`, as Omarchy requires for Qt 6.12, where an unqualified `Color` resolves to the new QtQuick type (basecamp/omarchy #14553). +- Bar: the hidden-bar probe accepts Omarchy's upcoming `bar-hidden` toggle marker next to the current `bar-off` (basecamp/omarchy #14395). + +### Known issues + +- Rings style: right after a bar rebuild (reload, V1/V2 switch, workspace count change) the focus ring can be drawn about 6 px off for a single frame (16 ms); on our fixture this happened in up to every second rebuild in the standard layout and in 1 of 10 in the full layout. It is a build-time animation ordering effect and will be fixed with the host layout redesign in 0.2.0. +- Notch bar at DPR 1.6 with the numbers or kanji style: the centre group can oscillate between two layouts for a while after a layout change. This exists since 16.1 (status spacing feedback) and is also addressed by the 0.2.0 redesign. + ## [0.1.1-beta.16.1] - 2026-10-04 ### Fixed diff --git a/README.md b/README.md index 4cc50ac..4dfbd44 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ process.
[Documentation](docs/README.md) · [Release status](docs/release-readiness.md) -`0.1.1-beta.16.1` is published as a GitHub prerelease. AUR publication is +`0.1.1-beta.16.2` is the target GitHub prerelease. AUR publication is deferred; use the source installation below. See the -[release notes](.github/release-notes/v0.1.1-beta.16.1.md) for changes and the +[release notes](.github/release-notes/v0.1.1-beta.16.2.md) for changes and the downgrade warning. The current pinned host contracts use Omarchy and Omarchy Settings `4.0.4-1` (source tag `v4.0.4`, revision `c668141e`) with Quickshell `0.3.1-1`; the @@ -82,18 +82,18 @@ Install from source using the release tag: sudo pacman -S --needed python jq curl networkmanager power-profiles-daemon upower xdg-utils libnotify wl-clipboard ttf-material-symbols-variable ttf-jetbrains-mono-nerd-basic noto-fonts-cjk adwaita-fonts git clone https://github.com/HANCORE-linux/Shibumi-Shell.git cd Shibumi-Shell -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --yes ``` -Update an admitted Beta.16 source installation to Beta.16.1. +Update an admitted Beta.16.1 source installation to Beta.16.2. Exact predecessor identities, not a version range, govern admission; see the [update guide](docs/install.md#update). ```sh cd Shibumi-Shell git fetch --tags -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite update --dry-run ./scripts/shibumi-suite update --yes ./scripts/shibumi-suite status diff --git a/VERSION b/VERSION index a607da6..b21063e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1-beta.16.1 +0.1.1-beta.16.2 diff --git a/contracts/lifecycle-predecessors-v1.json b/contracts/lifecycle-predecessors-v1.json index d5942ff..6d2c3ea 100644 --- a/contracts/lifecycle-predecessors-v1.json +++ b/contracts/lifecycle-predecessors-v1.json @@ -814,9 +814,72 @@ ], "settingsStorageVersion": 1, "sourceRevisions": [ + "3b35049af69aba57784376e916f50146d61eb411", + "65c8d8bf72a674a35c5bb8ae85d0fff21b4e5cb6", "package:0.1.1-beta.16.1" ], "suiteVersion": "0.1.1-beta.16.1" + }, + { + "id": "public-beta.16.2", + "payloadDigest": "79c61d5e048c669c9eb27ebaad21987327892089daea501d0cf4185150a26f9e", + "pluginDigests": { + "hancore.shibumi.bar": "b8f574eed104997b7904bd034baf302f1a93eefc8b3332cca06e206c6fcc41bb", + "hancore.shibumi.state": "69bb17985086c68054be81f74b8abbcd02d324fca247260ce5ed6322fcccf144", + "hancore.shibumi.control-center": "29111a0b3ebbdc18d289e5b97bf6ad97b6617c78cebf71b33ca01eedfa1bdf87", + "hancore.shibumi.reactor": "38aef7bbc3bf8bd8ff4f7b0110061a04e306afa688fd18726812f6d6200207eb", + "hancore.shibumi.telemetry": "6d29ab5ba1335fb0614c58a0fbf4f2717e6bc6aa99caa98ff7c52e384a0a5615", + "hancore.shibumi.power-state": "dba8c6aaba15308a6c7284297219e075fa53410533bb22fadeb799ee75fd3662", + "hancore.shibumi.workspaces": "ca5b3169cef7622656b0390535f3250642bc7eb9997b4613c137a52f022eec14", + "hancore.shibumi.update-center": "19b4a41ada73950f2c063ad908cb9b9e96ef7308ea4d60b9797585bc0ad817fc", + "hancore.shibumi.status": "8c92ba343f9dc755e1c2ea1a8197063990f7804307688568c1e0b52710deeb07", + "hancore.shibumi.memory": "ee174f02be5fbfdd33b810b696096b29974faa16219af661233998cd90df3225", + "hancore.shibumi.cpu": "b16048781c3c119a8ccac925973c5773fc365c8a474e9f09d043812c6a34b4dc", + "hancore.shibumi.audio": "45630dcf21c2f8a73ac047d89ffe4c306ad2a4ab0903bc532d356db9329634f5", + "hancore.shibumi.ai": "edfe2dc4cc1ecddebdce53db9d9fa5438d8ea013c04b4cd3f75c2e89c18bfb3d", + "hancore.shibumi.center": "d5c276fca3c70753e9dbdac0d9fef02d2985096b8dcbe8347ba95032cc401df8", + "hancore.shibumi.media": "a2593a4744decb5a8dae434947ec9c6db06d5e1db69ad29e53ec356281acbcfe", + "hancore.shibumi.quick-access": "8c84f4b9649335bf4821b7bae646df03af0d0e502e66247d8817c0ffa8267dae", + "hancore.shibumi.network": "9a9b6a03fa0355b455f59bdfc33dfcb71ca252a85466bbce6dd9870af894be1d", + "hancore.shibumi.battery": "0ef080d64443b1c66dcbec3aebdbbc95232de7fd67de3025bf6523b8128c7d8c", + "hancore.shibumi.brightness": "6241f9276fccbae2562399d6ee86b2381760ad8a1a083965a0f8dac3c55b3073", + "hancore.shibumi.power-profile": "be7693c164a25e08f24e4e0d09c84227435bf4d27d9b3213b8c8ad6d7940f371", + "hancore.shibumi.bluetooth": "438a2e0fda3f38958fd8fb584520f6087376bef3a5cc21a26b699514b5791a4a", + "hancore.shibumi.temperature": "61eb68316687e2af5b54157aca7d74b87644384eb820d634969b418fb104cd45", + "hancore.shibumi.gpu": "0b7f29a43e0b9f101b51a028c51867af3dd319323b7e4dba475955af671913ee", + "hancore.shibumi.storage": "3998ef80d5ecf25dd57ebcc3693b49c8f29048b409842d798a1d30bcb567e386" + }, + "pluginIds": [ + "hancore.shibumi.bar", + "hancore.shibumi.state", + "hancore.shibumi.control-center", + "hancore.shibumi.reactor", + "hancore.shibumi.telemetry", + "hancore.shibumi.power-state", + "hancore.shibumi.workspaces", + "hancore.shibumi.update-center", + "hancore.shibumi.status", + "hancore.shibumi.memory", + "hancore.shibumi.cpu", + "hancore.shibumi.audio", + "hancore.shibumi.ai", + "hancore.shibumi.center", + "hancore.shibumi.media", + "hancore.shibumi.quick-access", + "hancore.shibumi.network", + "hancore.shibumi.battery", + "hancore.shibumi.brightness", + "hancore.shibumi.power-profile", + "hancore.shibumi.bluetooth", + "hancore.shibumi.temperature", + "hancore.shibumi.gpu", + "hancore.shibumi.storage" + ], + "settingsStorageVersion": 1, + "sourceRevisions": [ + "package:0.1.1-beta.16.2" + ], + "suiteVersion": "0.1.1-beta.16.2" } ] } diff --git a/contracts/plugin-suite-v1.json b/contracts/plugin-suite-v1.json index 5c6d7b6..ae187a8 100644 --- a/contracts/plugin-suite-v1.json +++ b/contracts/plugin-suite-v1.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "suiteId": "hancore.shibumi", - "suiteVersion": "0.1.1-beta.16.1", + "suiteVersion": "0.1.1-beta.16.2", "settingsStorageVersion": 1, "hostContract": "contracts/host-facade-v1.json", "retiredPlugins": [ diff --git a/docs/architecture/quattro-compatibility.md b/docs/architecture/quattro-compatibility.md index 257f559..d20a2d9 100644 --- a/docs/architecture/quattro-compatibility.md +++ b/docs/architecture/quattro-compatibility.md @@ -8,7 +8,7 @@ by this evidence. ## Current pinned host -Beta.16.1 retains Beta.16's exact official Omarchy 4.0.4 baseline. These pins are not +Beta.16.2 retains Beta.16's exact official Omarchy 4.0.4 baseline. These pins are not physical release acceptance. The historical Beta.13 physical host acceptance below applies to its recorded single-output Omarchy 4.0.3 setup: diff --git a/docs/development/packaging.md b/docs/development/packaging.md index 2fcd71b..701a0d0 100644 --- a/docs/development/packaging.md +++ b/docs/development/packaging.md @@ -1,6 +1,6 @@ # Arch packaging and AUR publication -Status: `0.1.1-beta.16.1` is published as a GitHub prerelease; AUR publication +Status: `0.1.1-beta.16.2` is the target GitHub prerelease; AUR publication is deferred. Shibumi ships one versioned suite containing 24 separately validated Omarchy @@ -74,7 +74,7 @@ and lifecycle code before the user-level update runs, so Beta.12's storage guard cannot reject that package afterward. There is no reverse migration to legacy storage. -The additional [Beta.16.1 downgrade warning and backup requirements](../install.md#backup-before-downgrade) +The additional [Beta.16.2 downgrade warning and backup requirements](../install.md#backup-before-downgrade) apply even to readers using canonical State storage: Beta.15.4 and older cannot preserve a V1 layout containing `order.parked`. `--keep-settings` does not prevent this. Restore the settings with a matching payload. diff --git a/docs/install.md b/docs/install.md index 64f4fc0..42cc209 100644 --- a/docs/install.md +++ b/docs/install.md @@ -6,7 +6,7 @@ Shibumi installs 24 independent plugin roots into Omarchy's normal plugin directory. The repository root is a suite source, not a single installable Omarchy plugin. -`0.1.1-beta.16.1` is published as a GitHub prerelease. AUR publication is +`0.1.1-beta.16.2` is the target GitHub prerelease. AUR publication is deferred; install from the release tag using the source workflow below. Do not install or update from `main`. @@ -51,7 +51,7 @@ For an intentional non-interactive installation: sudo pacman -S --needed python jq curl networkmanager power-profiles-daemon upower xdg-utils libnotify wl-clipboard ttf-material-symbols-variable ttf-jetbrains-mono-nerd-basic noto-fonts-cjk adwaita-fonts git clone https://github.com/HANCORE-linux/Shibumi-Shell.git cd Shibumi-Shell -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --yes ``` @@ -66,7 +66,7 @@ To inspect the transaction before installing: ```bash git clone https://github.com/HANCORE-linux/Shibumi-Shell.git cd Shibumi-Shell -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --dry-run ./scripts/shibumi-suite install ``` @@ -146,14 +146,14 @@ Pacman updating `/usr/share/shibumi-shell` does not silently change a running desktop. The explicit update validates, stages, reloads, and verifies all 24 plugins as one transaction. -To update an admitted Beta.16 source installation to Beta.16.1, use its -trusted checkout. The exact published Beta.16 tag and release merge are +To update an admitted Beta.16.1 source installation to Beta.16.2, use its +trusted checkout. The exact published Beta.16.1 tag and release merge are admitted predecessors: ```bash cd Shibumi-Shell git fetch --tags -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite update --dry-run ./scripts/shibumi-suite update --yes ./scripts/shibumi-suite status @@ -206,7 +206,7 @@ authoritative origin. The old checkout is not deleted or modified. ### Roll back a package version > [!WARNING] -> **Beta.16.1 downgrade warning.** +> **Beta.16.2 downgrade warning.** > Beta.15.4 and older cannot read V1 layouts containing > `order.parked`. They reset V1 order, roles, and splits to defaults; other > settings and V2 remain. `uninstall --keep-settings` does not prevent this. @@ -406,7 +406,7 @@ then install the published tag. For example, only if the recorded revision is ```bash git checkout e92d8ee1ce9821d0b203a9d4d5dd9932d2e460fb ./scripts/shibumi-suite uninstall --keep-settings --yes -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --yes ``` diff --git a/docs/plugins/README.md b/docs/plugins/README.md index 173fd50..dced8e4 100644 --- a/docs/plugins/README.md +++ b/docs/plugins/README.md @@ -2,7 +2,7 @@ Status: reference -Shibumi `0.1.1-beta.16.1` contains 24 independently registered Omarchy plugins. The +Shibumi `0.1.1-beta.16.2` contains 24 independently registered Omarchy plugins. The default suite profile installs all of them as one verified transaction. The authoritative inventory is diff --git a/docs/release-readiness.md b/docs/release-readiness.md index c8ece07..34e3285 100644 --- a/docs/release-readiness.md +++ b/docs/release-readiness.md @@ -1,4 +1,4 @@ -# Shibumi 0.1.1-beta.16.1 release readiness +# Shibumi 0.1.1-beta.16.2 release readiness > **Document status: Revision-bound validation record.** This page separates > recorded product evidence from release, package, and physical acceptance. @@ -6,49 +6,49 @@ ## Candidate and published predecessor -The Beta.16.1 product, expectation, and payload-pin revision is -`9f1fc90c4f9414286969cb039445bb91301701b6` (tree -`0660d7e2cb97c2f8286423d356550c880ef7c6f9`), with 24 plugins and suite payload -digest `46f72fd02b00dbe34326dbbdf6e95556e7e35641a4d597c5281bc2beed94a974`. -The complete source contract and isolated Quattro gate below bind exactly that -revision. This is a pre-checksum readiness snapshot, not final release evidence. -Subsequent readiness, changelog-date, and AUR checksum commits do not change the -plugin-only suite payload, but shipped documentation changes the release archive. -Source review, the complete 14-gate collector, and a byte-identical clean-commit -rebuild must bind the final combined release revision before publication. - -Beta.16 was published on 2026-10-02 as a GitHub prerelease from -`4840482ec0e06a2ebd478120833d4fae1f30889e`. It is the frozen rolling +The Beta.16.2 candidate contains the accepted Core18c delivery, Health cache +exclusion, AI timeout, and separate minimal palette and bar-marker patches. +Its 24-plugin suite payload digest is +`79c61d5e048c669c9eb27ebaad21987327892089daea501d0cf4185150a26f9e`. +This is the preparation snapshot included in the release-identity commit, not +final clean-commit evidence. Source review, the complete contract, isolated +Quattro lifecycle, package rehearsal, full 14-gate collector, and reproducible +archive verification must record their exact final commit externally; no +predecessor gate result transfers to this candidate. + +Beta.16.1 was published on 2026-10-04 as a GitHub prerelease from +`3b35049af69aba57784376e916f50146d61eb411`. It is the frozen rolling predecessor in [`release-predecessor.json`](../tests/fixtures/release-predecessor.json). That exact tag checkout and release merge -`05548c8d9ffdf0d37962d6e423e2a0dc21b8cd91` are admitted by +`65c8d8bf72a674a35c5bb8ae85d0fff21b4e5cb6` are admitted by [`lifecycle-predecessors-v1.json`](../contracts/lifecycle-predecessors-v1.json), -with the unchanged Beta.16 payload digest -`f08b4ec613f248fda62d7dec9865ea46a846fa2e91b2723a186adc0ab0bffc41`. -Older exact identities remain admitted; a version string alone never authorizes -recovery or replacement. AUR publication remains deferred. +with the unchanged Beta.16.1 payload digest +`46f72fd02b00dbe34326dbbdf6e95556e7e35641a4d597c5281bc2beed94a974`. +The downloaded published archive matches all 24 pinned plugin digests; merge +and tag have the same Git tree. Older exact identities remain admitted; a +version string alone never authorizes recovery or replacement. AUR publication +remains deferred. ## Recorded evidence and outstanding gates | Gate | Evidence and boundary | | --- | --- | -| Complete source contract | Passed on `9f1fc90`, exit 0 in 637.634 seconds, complete marker, no retry or timeout. Fresh exact-HEAD source; private staged validation passed separately. | -| Isolated Quattro lifecycle | Passed on the same exact HEAD, exit 0, 32/32 generations in 108.747 seconds; no retry or timeout. | -| Retained runtime paths | Historical Beta.13 → Beta.14.1 package arm (5), fresh checkout (6), Beta.15 (7), Beta.15.2 (7), and rolling frozen Beta.16 → candidate (7). Payload, layout, keep-settings, reinstall, and delayed readbacks passed; owned fixtures were cleaned. | -| Status spacing | Private same-render V1/V2 fit × DPR 1/1.6 × update 13/0 × drawer absent/present: all 16 outer-gap cases match `69ea4da`; inner gaps and count spacing retain `deeca9b`. Neighbors move by whole physical pixels. Bell glyph and point RGBA are exactly translated in all 42 main and supplementary comparisons, including G3 in the V1 center at DPR 1.6. | -| Bluetooth and Update input | `deeca9b`'s any-controller power/display/completion fix and whole-widget Update button are byte-identical. Their controlled QML checks are not physical multi-controller, rfkill, or desktop input acceptance. | -| Diagnostics | Retained fixture diagnostics match the accepted reference, including the known VisualTokens color-assignment warning and six PillSurface teardown TypeErrors; not warning-free. No new diagnostic class or native type/reference/binding error was accepted. | -| Live installation and hardware | Separate reviewer live status-spacing measurement remains outside these private fixtures. Multi-controller/rfkill, persistence, real focus/menu/input, physical multi-output and 1366px acceptance are not supplied here. | -| Release/package verification | At this pre-checksum snapshot, dated changelog, two reproducible archive builds, AUR metadata/checksum commit, clean-HEAD source review and rehearsal, final 14-gate collector, matching rebuild, and publication verification remain pending. Final external evidence must identify their exact combined commit. | - -The historical package arm is not a Beta.16.1 installed-package upgrade proof. +| Complete source contract | Pending exact release-commit evidence at this preparation snapshot. | +| Isolated Quattro lifecycle | Pending exact release-commit evidence, retaining all 32 generations. | +| Retained runtime paths | Historical Beta.13 → Beta.14.1 package arm (5), fresh checkout (6), Beta.15 (7), Beta.15.2 (7), and rolling frozen Beta.16.1 → candidate (7). No arm may be dropped. | +| Core18c image acceptance | Completed in relay round 373: 10,308 first-activation points, plus matrix, edge, raster-phase and named N10 programs; 13 individual first-activation exceptions were expressly accepted. Qualified text-raster differences reach 4/255; this is not a global tolerance or blanket pixel equality. | +| Core18c performance | 440 sessions, 1,200 events, cold/warm N5. All 56 style-switch medians and eight bar-cycle medians improve. Six higher individual bar medians (0.33–7.13 ms, overlapping sample ranges) were accepted. Focus has 11–15 changed buffers over the full event, but 9–13 within 200 ms; the accepted target is the full event. No scanout claim. | +| Separate compatibility patches | Minimal palette and marker patches passed private smokes with Qt 6.11.2. They were not part of the unchanged Core18c image/performance inputs; no Qt 6.12 runtime acceptance. | +| Live installation and hardware | Keep-settings installation and reviewer live acceptance must be recorded separately. Fixtures do not establish physical multi-output, hardware, credential or real desktop input acceptance. | +| Release/package verification | Reproducible archive, checksum agreement, clean-commit gates and rehearsal, independent review, full collector and remote verification remain separate publication requirements. | + +The historical package arm is not a Beta.16.2 installed-package upgrade proof. Private Wayland/Mesa captures are not live GPU, layer-shell, hotplug, or physical -multi-output acceptance. The private V2/DPR1 separator reference is 24/19 free -columns, not the reviewer's 24/20 live reference; equality is claimed only within -the same controlled render, including the notification point and halo in the -last painted pixel. V1 island backgrounds change as their outer margins -are restored: exact bell paint does not mean exact complete slot backgrounds or -whole-bar RGBA. Earlier release passes do not transfer to this candidate. +multi-output acceptance. Earlier release passes do not transfer to this candidate. +The release notes document the accepted Rings early step (raw DPR-1 reload N10: +full 1/10, standard 5/10 sessions, not natural-frequency estimates) and the +existing DPR-1.6 Notch/Numbers/Kanji centre oscillation. Both remain on the +0.2.0 redesign list; the Rings animation-ordering cause is unproved. ## Pinned host contracts @@ -122,7 +122,7 @@ was performed. Each operation needs its own maintainer Go. physical acceptance are not claimed. - **Downgrade:** Beta.15.4 and older cannot read V1 `order.parked`; they reset V1 order, roles, and splits while retaining other settings and V2. - `--keep-settings` does not prevent this. The [release notes](../.github/release-notes/v0.1.1-beta.16.1.md) + `--keep-settings` does not prevent this. The [release notes](../.github/release-notes/v0.1.1-beta.16.2.md) and [backup guide](install.md#backup-before-downgrade) identify the complete settings and recovery evidence to preserve. Restore the settings with a matching payload. @@ -149,4 +149,4 @@ release checklist. Beta.16's published changes and limits remain in its revision `30746f5` passed the complete contract and 32-generation runtime; those fixtures retained known teardown warnings and did not establish blanket hardware acceptance. Earlier readiness snapshots remain in Git history; none -confers acceptance on Beta.16.1. +confers acceptance on Beta.16.2. diff --git a/hancore.shibumi.ai/Service.qml b/hancore.shibumi.ai/Service.qml index fcf145b..5eefc70 100644 --- a/hancore.shibumi.ai/Service.qml +++ b/hancore.shibumi.ai/Service.qml @@ -19,7 +19,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.ai" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.ai/manifest.json b/hancore.shibumi.ai/manifest.json index 1ae0281..20baf83 100644 --- a/hancore.shibumi.ai/manifest.json +++ b/hancore.shibumi.ai/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.ai", "name": "Shibumi AI Usage", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi Claude, Codex, and OpenCode usage presentation.", diff --git a/hancore.shibumi.ai/scripts/agents-update b/hancore.shibumi.ai/scripts/agents-update index 401fd89..4b59964 100755 --- a/hancore.shibumi.ai/scripts/agents-update +++ b/hancore.shibumi.ai/scripts/agents-update @@ -4,7 +4,7 @@ set -euo pipefail omarchy_path=${1:-} shift || true -timeout_seconds=${SHIBUMI_AI_UPDATE_TIMEOUT:-120} +timeout_seconds=${SHIBUMI_AI_UPDATE_TIMEOUT:-300} script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) compat_bin="$script_dir/compat-bin" child_pid="" diff --git a/hancore.shibumi.audio/Service.qml b/hancore.shibumi.audio/Service.qml index a9f559a..96ffd64 100644 --- a/hancore.shibumi.audio/Service.qml +++ b/hancore.shibumi.audio/Service.qml @@ -14,7 +14,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.audio" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.audio/manifest.json b/hancore.shibumi.audio/manifest.json index 9f1ae9d..0ed85aa 100644 --- a/hancore.shibumi.audio/manifest.json +++ b/hancore.shibumi.audio/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.audio", "name": "Shibumi Audio", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi audio presentation over Omarchy's PipeWire owner.", diff --git a/hancore.shibumi.bar/Bar.qml b/hancore.shibumi.bar/Bar.qml index 971639e..eb26a1f 100644 --- a/hancore.shibumi.bar/Bar.qml +++ b/hancore.shibumi.bar/Bar.qml @@ -5,6 +5,7 @@ import Quickshell import Quickshell.Hyprland import Quickshell.Io import qs.Commons +import qs.Commons as Commons import "core" as Core import "core/GroupRegistry.js" as GroupRegistry import "core/PanelRouting.js" as PanelRouting @@ -27,7 +28,7 @@ Item { SuiteRuntime.Provider { id: barRuntimeProvider pluginId: "hancore.shibumi.bar" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: suiteHostShell.host manifest: root.manifest @@ -178,10 +179,10 @@ Item { } readonly property string styleId: styleRegistry.resolvedId readonly property var availableStyleIds: styleRegistry.availableIds - property color foreground: styleReady ? activeStyle.foreground : Color.bar.text - property color barForeground: styleReady ? activeStyle.barForeground : Color.bar.text - property color background: styleReady ? activeStyle.background : Color.bar.background - property color urgent: styleReady ? activeStyle.urgent : Color.bar.active + property color foreground: styleReady ? activeStyle.foreground : Commons.Color.bar.text + property color barForeground: styleReady ? activeStyle.barForeground : Commons.Color.bar.text + property color background: styleReady ? activeStyle.background : Commons.Color.bar.background + property color urgent: styleReady ? activeStyle.urgent : Commons.Color.bar.active property string fontFamily: styleReady ? activeStyle.fontFamily : Style.font.family readonly property bool injectionComplete: omarchyPath !== "" && shell !== null @@ -3616,7 +3617,7 @@ Item { Process { id: barHiddenProbe running: root.hostReady - command: ["bash", "-lc", "[[ -f $HOME/.local/state/omarchy/toggles/bar-off ]] && echo yes || echo no"] + command: ["bash", "-lc", "[[ -f $HOME/.local/state/omarchy/toggles/bar-off || -f $HOME/.local/state/omarchy/toggles/bar-hidden ]] && echo yes || echo no"] stdout: SplitParser { onRead: line => { root.barToggledOff = String(line).trim() === "yes" diff --git a/hancore.shibumi.bar/core/GroupSlot.qml b/hancore.shibumi.bar/core/GroupSlot.qml index c901133..a98e3c4 100644 --- a/hancore.shibumi.bar/core/GroupSlot.qml +++ b/hancore.shibumi.bar/core/GroupSlot.qml @@ -11,6 +11,7 @@ Item { required property string groupId property string screenName: "" property real availableWidth: 0 + property bool layoutBusy: false readonly property var stateService: bar && bar.shell && typeof bar.shell.serviceFor === "function" ? bar.shell.serviceFor("hancore.shibumi.state") : null @@ -108,6 +109,8 @@ Item { // that same selection and can oscillate for width-reactive providers. readonly property bool hasLoadedWidgets: contentItem ? contentItem.hasLoadedWidgets === true : false + readonly property bool savingsPending: contentItem && "savingsPending" in contentItem + ? contentItem.savingsPending : false readonly property real spacingRecovery: contentItem && "spacingRecovery" in contentItem ? contentItem.spacingRecovery : 0 readonly property bool hasContent: implicitWidth > 0.5 && implicitHeight > 0.5 @@ -228,6 +231,15 @@ Item { readonly property bool hasLoadedWidgets: root ? root.anyLoadedWidget(moduleRepeater) : false + readonly property bool savingsPending: { + void(moduleRow.children) + for (let i = 0; i < moduleRepeater.count; i++) { + const slot = moduleRepeater.itemAt(i) + const item = slot && slot.activeItemVisible ? slot.activeItem : null + if (item && "savingsPending" in item && item.savingsPending) return true + } + return false + } readonly property real spacingRecovery: { void(moduleRow.implicitWidth) let total = 0 @@ -286,6 +298,7 @@ Item { availableWidth: root.availableWidth > 0 ? Math.max(1, root.availableWidth - horizontalRoot.siblingWidth(index)) : 0 horizontalHostHeight: root.v2Shell ? 0 : root.v1SlotHeight + layoutBusy: root.layoutBusy } } } @@ -319,6 +332,7 @@ Item { region: root.groupId screenName: root.screenName availableWidth: root.availableWidth + layoutBusy: root.layoutBusy } } } diff --git a/hancore.shibumi.bar/core/WidgetSlot.qml b/hancore.shibumi.bar/core/WidgetSlot.qml index 16920c3..3b977e8 100644 --- a/hancore.shibumi.bar/core/WidgetSlot.qml +++ b/hancore.shibumi.bar/core/WidgetSlot.qml @@ -12,6 +12,7 @@ Item { property string region: "" property string screenName: "" property real availableWidth: 0 + property bool layoutBusy: false // The original V1 composes 28px widget roots inside a 32px slot row. // Keep this opt-in so direct/V2/vertical hosts retain provider geometry. property real horizontalHostHeight: 0 @@ -223,6 +224,7 @@ Item { } onSlotCompleteChanged: requestLoaderSourceSync() onAvailableWidthChanged: injectProperties() + onLayoutBusyChanged: injectLayoutBusy() onActiveItemChanged: { // A binding notification for the resident item can arrive after onLoaded. // Replacement/teardown revokes it, but a successor submission completed by @@ -613,6 +615,8 @@ Item { if (_barConnectionRevoked) return _barConnectionRevoked = true const target = activeItem + if (target && "responsiveWidthProvider" in target) target.responsiveWidthProvider = null + if (target && "layoutBusy" in target) target.layoutBusy = false if (target && "bar" in target) target.bar = null } @@ -621,6 +625,26 @@ Item { injectProperties() } + function currentResponsiveWidth() { + if (_barConnectionRevoked) return availableWidth + let siblings = 0 + for (let owner = parent; owner; owner = owner.parent) { + if (typeof owner.siblingWidth === "function" && "index" in root) + siblings = owner.siblingWidth(root.index) + if (typeof owner.currentAvailableWidthForGroup === "function") { + const budget = owner.currentAvailableWidthForGroup(region) + return budget > 0 ? Math.max(1, budget - siblings) : 0 + } + } + return availableWidth + } + + function injectLayoutBusy() { + const target = activeItem + if (target && !_barConnectionRevoked && "layoutBusy" in target) + target.layoutBusy = layoutBusy + } + function injectProperties() { const target = activeItem if (!target || _barConnectionRevoked) return @@ -629,6 +653,9 @@ Item { if ("hostGroupId" in target) target.hostGroupId = region if ("settings" in target) target.settings = moduleSettings if ("availableWidth" in target) target.availableWidth = availableWidth + if ("responsiveWidthProvider" in target) + target.responsiveWidthProvider = currentResponsiveWidth + injectLayoutBusy() } TransformWatcher { diff --git a/hancore.shibumi.bar/manifest.json b/hancore.shibumi.bar/manifest.json index 88247d4..5594ae0 100644 --- a/hancore.shibumi.bar/manifest.json +++ b/hancore.shibumi.bar/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.bar", "name": "Shibumi Bar", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "The Shibumi full-bar host for Omarchy Shell.", diff --git a/hancore.shibumi.bar/styles/shibumi/BarSurface.qml b/hancore.shibumi.bar/styles/shibumi/BarSurface.qml index 3c3c5fd..271cbea 100644 --- a/hancore.shibumi.bar/styles/shibumi/BarSurface.qml +++ b/hancore.shibumi.bar/styles/shibumi/BarSurface.qml @@ -127,6 +127,14 @@ Item { ResponsiveLayout.centerAvailableWidth(compactShell, width, frameInset, shellContentInset, leftRegion.width, rightRegion.width, centerGap, measuredCenterSpan, centerExtras.width) + // Read by responsive decisions without advancing positioned geometry + // or the legacy budget's notification/animation path. + readonly property real currentCenterAvailableWidth: compactShell + ? centerAvailableWidth : Math.max(0, + responsiveCapacity - 2 * shellContentInset + - leftGroups.width - leftExtras.width + - rightExtras.width - rightGroups.width - 2 * centerGap + - centerExtras.width) property int narrowStage: 0 readonly property real sideMargin: shellX + shellContentInset readonly property real responsiveSideInset: shellContentInset @@ -429,6 +437,9 @@ Item { visibilityStage: horizontalSurface.narrowStage // The widget API uses zero for an unconstrained width. availableWidth: Math.max(1, horizontalSurface.centerAvailableWidth) + restageAvailableWidth: Math.max(1, horizontalSurface.currentCenterAvailableWidth) + layoutBusy: leftGroups.savingsPending || centerGroups.savingsPending + || rightGroups.savingsPending } Core.BarSection { diff --git a/hancore.shibumi.bar/styles/shibumi/GroupSection.qml b/hancore.shibumi.bar/styles/shibumi/GroupSection.qml index bd77f63..19c473e 100644 --- a/hancore.shibumi.bar/styles/shibumi/GroupSection.qml +++ b/hancore.shibumi.bar/styles/shibumi/GroupSection.qml @@ -13,6 +13,8 @@ Item { property string screenName: "" property var layoutSession: null property real availableWidth: 0 + property bool layoutBusy: false + property real restageAvailableWidth: availableWidth property int visibilityStage: 0 readonly property bool editing: layoutSession && layoutSession.editing readonly property bool v2Mode: bar.layoutController @@ -62,6 +64,8 @@ Item { readonly property var stateConfig: stateService && stateService.config ? stateService.config : ({}) readonly property var contentItem: content.item + readonly property bool savingsPending: contentItem && "savingsPending" in contentItem + ? contentItem.savingsPending : false readonly property real spacingRecovery: contentItem && "spacingRecovery" in contentItem ? contentItem.spacingRecovery : 0 readonly property var groupGeometry: contentItem && contentItem.groupGeometry @@ -227,6 +231,12 @@ Item { return ResponsiveLayout.groupVisibleAtStage(groupId, stage) } + function currentAvailableWidthForGroup(groupId) { + return contentItem && typeof contentItem.groupAvailableWidth === "function" + ? contentItem.groupAvailableWidth(groups.indexOf(groupId), restageAvailableWidth) + : availableWidth + } + function budgetWidthForStage(stage) { var index = Math.max(0, Math.min(3, Number(stage) || 0)) return Math.max(0, Number(stageBudgetWidths[index]) || 0) @@ -367,10 +377,11 @@ Item { } return widths } - function groupAvailableWidth(index) { + function groupAvailableWidth(index, budget) { if (!root) return 0 - if (root.v2Mode || root.region !== "center" || root.availableWidth <= 0) - return root.availableWidth + const available = budget === undefined ? root.availableWidth : budget + if (root.v2Mode || root.region !== "center" || available <= 0) + return available // Prefer G8 only while its enabled, stage-shown widgets are loaded. // Otherwise the first loaded center occupant owns the remainder. // Readiness, not hasContent/width, chooses the owner: its own budget @@ -392,9 +403,17 @@ Item { if (cell.separated) siblings += root.splitGrow } // Zero is the host widget API's unconstrained sentinel. - return Math.max(1, root.availableWidth - siblings) + return Math.max(1, available - siblings) } + readonly property bool savingsPending: { + void(horizontalRow.children) + for (let i = 0; i < horizontalRepeater.count; i++) { + const cell = horizontalRepeater.itemAt(i) + if (cell && cell.contentShown && cell.savingsPending) return true + } + return false + } readonly property real spacingRecovery: { if (!root) return 0 void(root.groups) @@ -547,6 +566,7 @@ Item { ? emptySlotTarget.width : groupHasContent ? groupSlot.minimumResponsiveWidth : measuredMinimumGroupWidth readonly property real spacingRecovery: groupSlot.spacingRecovery + readonly property bool savingsPending: groupSlot.savingsPending readonly property real contentLeft: targetVisual.x readonly property real contentRight: targetVisual.x + targetVisual.width readonly property real visualRightEdge: groupSlot.x + groupSlot.width @@ -717,6 +737,7 @@ Item { bar: horizontalCell.lifecycleBar groupId: horizontalCell.modelData screenName: root ? root.screenName : "" + layoutBusy: root ? root.layoutBusy : false availableWidth: horizontalRow ? horizontalRow.groupAvailableWidth(horizontalCell.index) : 0 enabled: root ? !root.slotEditing : false @@ -1037,6 +1058,7 @@ Item { groupId: verticalCell.modelData screenName: root ? root.screenName : "" availableWidth: root ? root.availableWidth : 0 + layoutBusy: root ? root.layoutBusy : false y: verticalCell.leadingGap } } diff --git a/hancore.shibumi.battery/manifest.json b/hancore.shibumi.battery/manifest.json index 553c9c6..8be442c 100644 --- a/hancore.shibumi.battery/manifest.json +++ b/hancore.shibumi.battery/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.battery", "name": "Shibumi Battery", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi battery status and detailed battery panel.", diff --git a/hancore.shibumi.bluetooth/Service.qml b/hancore.shibumi.bluetooth/Service.qml index bd206c3..ed0f2eb 100644 --- a/hancore.shibumi.bluetooth/Service.qml +++ b/hancore.shibumi.bluetooth/Service.qml @@ -15,7 +15,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.bluetooth" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.bluetooth/manifest.json b/hancore.shibumi.bluetooth/manifest.json index e6f52f0..5320694 100644 --- a/hancore.shibumi.bluetooth/manifest.json +++ b/hancore.shibumi.bluetooth/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.bluetooth", "name": "Shibumi Bluetooth", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi Bluetooth presentation with a native BlueZ and audio backend.", diff --git a/hancore.shibumi.brightness/Service.qml b/hancore.shibumi.brightness/Service.qml index 667b781..3f384a7 100644 --- a/hancore.shibumi.brightness/Service.qml +++ b/hancore.shibumi.brightness/Service.qml @@ -13,7 +13,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.brightness" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.brightness/manifest.json b/hancore.shibumi.brightness/manifest.json index 52f801c..2318fb1 100644 --- a/hancore.shibumi.brightness/manifest.json +++ b/hancore.shibumi.brightness/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.brightness", "name": "Shibumi Brightness", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi brightness and display presentation over Omarchy's monitor owner.", diff --git a/hancore.shibumi.center/BarWidget.qml b/hancore.shibumi.center/BarWidget.qml index 2e53d59..23efd2a 100644 --- a/hancore.shibumi.center/BarWidget.qml +++ b/hancore.shibumi.center/BarWidget.qml @@ -15,6 +15,8 @@ Ui.Panel { Presentation.HostTokens { id: hostTokens; bar: root.bar } property url calendarSource: Qt.resolvedUrl("CalendarPanel.qml") property real availableWidth: 0 + property var responsiveWidthProvider: null + property bool layoutBusy: false // Start conservatively when the widget is recreated after a provider // switch. Starting at the widest stage can make the outer bar hide G9/G10 // before this widget receives its real center budget, creating a coupled @@ -157,6 +159,14 @@ Ui.Panel { } function updateStage() { + // Defer while reservations or pending savings make layout provisional; + // never replace the legacy decision value or its animation history. + if ((typeof responsiveWidthProvider === "function" + && responsiveWidthProvider() < availableWidth - 0.000001) + || layoutBusy) { + restageTimer.restart() + return + } stage = CenterLayout.nextStage(stage, availableWidth, needNormal, needCompact, centered) } diff --git a/hancore.shibumi.center/Service.qml b/hancore.shibumi.center/Service.qml index b010832..599434b 100644 --- a/hancore.shibumi.center/Service.qml +++ b/hancore.shibumi.center/Service.qml @@ -10,7 +10,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.center" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.center/manifest.json b/hancore.shibumi.center/manifest.json index eb287cc..f6d060f 100644 --- a/hancore.shibumi.center/manifest.json +++ b/hancore.shibumi.center/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.center", "name": "Shibumi Center", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi clock, calendar, weather, status, and update center.", diff --git a/hancore.shibumi.control-center/PluginUpdateService.qml b/hancore.shibumi.control-center/PluginUpdateService.qml index abf88d2..4fa2dbc 100644 --- a/hancore.shibumi.control-center/PluginUpdateService.qml +++ b/hancore.shibumi.control-center/PluginUpdateService.qml @@ -20,7 +20,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.control-center" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.control-center/manager/shibumi-health b/hancore.shibumi.control-center/manager/shibumi-health index ab285c0..677b757 100755 --- a/hancore.shibumi.control-center/manager/shibumi-health +++ b/hancore.shibumi.control-center/manager/shibumi-health @@ -212,7 +212,9 @@ def payload_digest(directory: Path) -> str: directory.rglob("*"), key=lambda item: item.relative_to(directory).as_posix() ): relative = path.relative_to(directory).as_posix() - if relative == MANAGED_MARKER: + if (relative == MANAGED_MARKER + or "__pycache__" in Path(relative).parts + or path.suffix in {".pyc", ".pyo"}): continue metadata = path.lstat() if path.is_symlink(): diff --git a/hancore.shibumi.control-center/manifest.json b/hancore.shibumi.control-center/manifest.json index d3f97a3..41b8f6b 100644 --- a/hancore.shibumi.control-center/manifest.json +++ b/hancore.shibumi.control-center/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.control-center", "name": "Shibumi Control Center", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi G1 presentation and bar configuration panel.", diff --git a/hancore.shibumi.cpu/Service.qml b/hancore.shibumi.cpu/Service.qml index 9afd6df..9fa31ba 100644 --- a/hancore.shibumi.cpu/Service.qml +++ b/hancore.shibumi.cpu/Service.qml @@ -13,7 +13,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.cpu" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.cpu/manifest.json b/hancore.shibumi.cpu/manifest.json index ed5d387..a5161b2 100644 --- a/hancore.shibumi.cpu/manifest.json +++ b/hancore.shibumi.cpu/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.cpu", "name": "Shibumi CPU", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi CPU widget, GPU sampler, and detailed usage panel.", diff --git a/hancore.shibumi.gpu/manifest.json b/hancore.shibumi.gpu/manifest.json index 6ae26bb..3fd6043 100644 --- a/hancore.shibumi.gpu/manifest.json +++ b/hancore.shibumi.gpu/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.gpu", "name": "Shibumi GPU", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Lazy GPU load, hardware, driver, temperature, and VRAM widget.", diff --git a/hancore.shibumi.media/Service.qml b/hancore.shibumi.media/Service.qml index 525c8b5..7f87597 100644 --- a/hancore.shibumi.media/Service.qml +++ b/hancore.shibumi.media/Service.qml @@ -18,7 +18,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.media" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.media/manifest.json b/hancore.shibumi.media/manifest.json index dc45ff1..ab08101 100644 --- a/hancore.shibumi.media/manifest.json +++ b/hancore.shibumi.media/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.media", "name": "Shibumi Media", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi media controls over Omarchy's MPRIS service.", diff --git a/hancore.shibumi.memory/manifest.json b/hancore.shibumi.memory/manifest.json index bb02043..dbf3c35 100644 --- a/hancore.shibumi.memory/manifest.json +++ b/hancore.shibumi.memory/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.memory", "name": "Shibumi Memory", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi memory widget and detailed memory panel.", diff --git a/hancore.shibumi.network/Service.qml b/hancore.shibumi.network/Service.qml index 5d7af9b..02ec198 100644 --- a/hancore.shibumi.network/Service.qml +++ b/hancore.shibumi.network/Service.qml @@ -15,7 +15,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.network" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.network/manifest.json b/hancore.shibumi.network/manifest.json index 5635a96..7681f19 100644 --- a/hancore.shibumi.network/manifest.json +++ b/hancore.shibumi.network/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.network", "name": "Shibumi Network", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Native Shibumi NetworkManager ownership, telemetry, actions, QR, and speed testing.", diff --git a/hancore.shibumi.power-profile/manifest.json b/hancore.shibumi.power-profile/manifest.json index d53796e..9302b0e 100644 --- a/hancore.shibumi.power-profile/manifest.json +++ b/hancore.shibumi.power-profile/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.power-profile", "name": "Shibumi Power Profile", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi power-profile status and profile selector.", diff --git a/hancore.shibumi.power-state/Service.qml b/hancore.shibumi.power-state/Service.qml index a787714..f1982ec 100644 --- a/hancore.shibumi.power-state/Service.qml +++ b/hancore.shibumi.power-state/Service.qml @@ -23,7 +23,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.power-state" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.power-state/manifest.json b/hancore.shibumi.power-state/manifest.json index 8ab5b05..0f7314d 100644 --- a/hancore.shibumi.power-state/manifest.json +++ b/hancore.shibumi.power-state/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.power-state", "name": "Shibumi Power State", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shared battery and power-profile state for Shibumi widgets.", diff --git a/hancore.shibumi.quick-access/Service.qml b/hancore.shibumi.quick-access/Service.qml index 9c7e3f5..7456506 100644 --- a/hancore.shibumi.quick-access/Service.qml +++ b/hancore.shibumi.quick-access/Service.qml @@ -18,7 +18,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.quick-access" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.quick-access/manifest.json b/hancore.shibumi.quick-access/manifest.json index 4f554c4..82bd680 100644 --- a/hancore.shibumi.quick-access/manifest.json +++ b/hancore.shibumi.quick-access/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.quick-access", "name": "Shibumi Quick Access", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi idle inhibitor and theme, wallpaper, screenshot, and video pickers.", diff --git a/hancore.shibumi.reactor/Service.qml b/hancore.shibumi.reactor/Service.qml index 26cfd6a..26f4554 100644 --- a/hancore.shibumi.reactor/Service.qml +++ b/hancore.shibumi.reactor/Service.qml @@ -18,7 +18,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.reactor" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.reactor/manifest.json b/hancore.shibumi.reactor/manifest.json index 6d5fa81..2ca159c 100644 --- a/hancore.shibumi.reactor/manifest.json +++ b/hancore.shibumi.reactor/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.reactor", "name": "Shibumi Reactor", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi event and quote Reactor service for compatible bar styles.", diff --git a/hancore.shibumi.state/Service.qml b/hancore.shibumi.state/Service.qml index bb16892..936fdf1 100644 --- a/hancore.shibumi.state/Service.qml +++ b/hancore.shibumi.state/Service.qml @@ -16,7 +16,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.state/manifest.json b/hancore.shibumi.state/manifest.json index 4429365..ceb07a5 100644 --- a/hancore.shibumi.state/manifest.json +++ b/hancore.shibumi.state/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.state", "name": "Shibumi State", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Normalized Shibumi configuration and theme palette state.", diff --git a/hancore.shibumi.state/runtime/Runtime.qml b/hancore.shibumi.state/runtime/Runtime.qml index 02af8e6..452b37f 100644 --- a/hancore.shibumi.state/runtime/Runtime.qml +++ b/hancore.shibumi.state/runtime/Runtime.qml @@ -10,7 +10,7 @@ QtObject { id: runtime readonly property int contractVersion: 1 - readonly property string suiteVersion: "0.1.1-beta.16.1" + readonly property string suiteVersion: "0.1.1-beta.16.2" readonly property var providerIds: [ "hancore.shibumi.state", "hancore.shibumi.control-center", "hancore.shibumi.reactor", "hancore.shibumi.telemetry", diff --git a/hancore.shibumi.status/BarWidget.qml b/hancore.shibumi.status/BarWidget.qml index 88ad46e..8745941 100644 --- a/hancore.shibumi.status/BarWidget.qml +++ b/hancore.shibumi.status/BarWidget.qml @@ -119,6 +119,7 @@ Item { : Math.round(Commons.Style.space(3) * statusPlacement.dpr) : Math.floor(directContraction / 2)) / statusPlacement.dpr property real spacingSavings: 0 + property bool savingsPending: false property bool spacingActive: false // Settle after layout: binding width directly to snapped ink feeds the // parent's new position back into its own reservation. @@ -126,9 +127,14 @@ Item { if (!root || !spacingActive) return const saved = Math.max(0, updateShift - bellShift) if (Math.abs(spacingSavings - saved) > 1e-7) spacingSavings = saved + savingsPending = false } - onUpdateShiftChanged: Qt.callLater(syncSpacingSavings) - onBellShiftChanged: Qt.callLater(syncSpacingSavings) + function scheduleSpacingSavings() { + savingsPending = true + Qt.callLater(syncSpacingSavings) + } + onUpdateShiftChanged: scheduleSpacingSavings() + onBellShiftChanged: scheduleSpacingSavings() readonly property int presentedCount: fullMode ? (updatePresented ? 1 : 0) + (trayPresented ? 1 : 0) + (notificationPresented ? 1 : 0) @@ -497,12 +503,13 @@ Item { Component.onCompleted: { spacingActive = true - Qt.callLater(syncSpacingSavings) + scheduleSpacingSavings() lifecycleBar = bar scheduleChildSync() } Component.onDestruction: { spacingActive = false + savingsPending = false close() const dyingBar = bar || lifecycleBar if (dyingBar && "tearingDown" in dyingBar diff --git a/hancore.shibumi.status/Service.qml b/hancore.shibumi.status/Service.qml index 1188a1f..5d9e712 100644 --- a/hancore.shibumi.status/Service.qml +++ b/hancore.shibumi.status/Service.qml @@ -16,7 +16,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.status" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.status/manifest.json b/hancore.shibumi.status/manifest.json index 56ec825..e43f4fa 100644 --- a/hancore.shibumi.status/manifest.json +++ b/hancore.shibumi.status/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.status", "name": "Shibumi Status", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi tray and notification composition with shared desktop status state.", diff --git a/hancore.shibumi.storage/Service.qml b/hancore.shibumi.storage/Service.qml index bcc8e49..23ead1a 100644 --- a/hancore.shibumi.storage/Service.qml +++ b/hancore.shibumi.storage/Service.qml @@ -13,7 +13,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.storage" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.storage/manifest.json b/hancore.shibumi.storage/manifest.json index a8da307..7131374 100644 --- a/hancore.shibumi.storage/manifest.json +++ b/hancore.shibumi.storage/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.storage", "name": "Shibumi Storage", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Read-only root usage and physical drive inventory.", diff --git a/hancore.shibumi.telemetry/Service.qml b/hancore.shibumi.telemetry/Service.qml index 807a6e7..80b0bed 100644 --- a/hancore.shibumi.telemetry/Service.qml +++ b/hancore.shibumi.telemetry/Service.qml @@ -15,7 +15,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.telemetry" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.telemetry/manifest.json b/hancore.shibumi.telemetry/manifest.json index 4ab3418..fae30ed 100644 --- a/hancore.shibumi.telemetry/manifest.json +++ b/hancore.shibumi.telemetry/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.telemetry", "name": "Shibumi Telemetry", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Demand-driven CPU and memory telemetry shared by Shibumi widgets.", diff --git a/hancore.shibumi.temperature/manifest.json b/hancore.shibumi.temperature/manifest.json index e4ead09..dfdad1c 100644 --- a/hancore.shibumi.temperature/manifest.json +++ b/hancore.shibumi.temperature/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.temperature", "name": "Shibumi Temperature", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Demand-driven hardware temperature widget and sensor panel.", diff --git a/hancore.shibumi.update-center/Service.qml b/hancore.shibumi.update-center/Service.qml index 2a106d9..0eaac8f 100644 --- a/hancore.shibumi.update-center/Service.qml +++ b/hancore.shibumi.update-center/Service.qml @@ -12,7 +12,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.update-center" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.update-center/manifest.json b/hancore.shibumi.update-center/manifest.json index 320f8d5..7a6a85c 100644 --- a/hancore.shibumi.update-center/manifest.json +++ b/hancore.shibumi.update-center/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.update-center", "name": "Shibumi Update Center", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Safe repository package and user theme update status for Shibumi.", diff --git a/hancore.shibumi.workspaces/BarWidget.qml b/hancore.shibumi.workspaces/BarWidget.qml index 63e9f3c..e3b9224 100644 --- a/hancore.shibumi.workspaces/BarWidget.qml +++ b/hancore.shibumi.workspaces/BarWidget.qml @@ -14,6 +14,10 @@ Ui.Panel { manageIpc: false Presentation.HostTokens { id: hostTokens; bar: root.bar; serviceShell: suiteShell } SuiteRuntime.HostShell { id: suiteShell; host: root.bar ? root.bar.shell : null } + // Preserve the eager renderer's initial logical width while WidgetSlot + // injects its host. Paint creation must not choose another width history. + property string initialRenderStyle: renderStyle + property bool paintReady: false property url panelSource: Qt.resolvedUrl("WorkspacePanel.qml") property var workspaceService: suiteShell.serviceFor("hancore.shibumi.workspaces") readonly property var stateService: suiteShell.serviceFor("hancore.shibumi.state") @@ -258,7 +262,11 @@ Ui.Panel { onOpenedChanged: syncPanelLoader() onFocusedWorkspaceIdChanged: observePacmanFocus() onRenderStyleChanged: resetPacmanTravel() - Component.onCompleted: pacmanLastFocusedWorkspaceId = focusedWorkspaceId + Component.onCompleted: { + initialRenderStyle = renderStyle + pacmanLastFocusedWorkspaceId = focusedWorkspaceId + Qt.callLater(function() { root.paintReady = true }) + } Item { id: workspaceSurface @@ -294,8 +302,10 @@ Ui.Panel { id: frameMotion z: 0 visible: root.renderStyle === "rings" && root.frameTarget !== null + // Use resident animated cell geometry and the logical frame size. x: workspaceRow.x + (root.frameTarget ? root.frameTarget.x : 0) - + (root.frameTarget ? (root.frameTarget.width - width) / 2 : 0) + + (root.frameTarget ? (root.frameTarget.implicitWidth + - Commons.Style.space(18)) / 2 : 0) anchors.verticalCenter: parent.verticalCenter width: Commons.Style.space(18) height: width @@ -304,7 +314,10 @@ Ui.Panel { NumberAnimation { duration: 190; easing.type: Easing.OutCubic } } - Shape { + Loader { + anchors.fill: parent + active: root.renderStyle === "rings" + sourceComponent: Component { Shape { id: frameShape anchors.fill: parent antialiasing: true @@ -357,6 +370,8 @@ Ui.Panel { controlY: 0.5 } } + } + } } } @@ -380,14 +395,45 @@ Ui.Panel { readonly property bool empty: !focused && !occupied readonly property int numberWidth: Commons.Style.space(20) - implicitWidth: root.renderStyle === "numbers" ? Commons.Style.space(22) - : root.renderStyle === "kanji" ? Commons.Style.space(22) - : root.renderStyle === "magic" + // Paint is disposable; focus/hover animation history belongs to the cell. + property real defaultHaloWidth: Commons.Style.space(focused ? 34 : 16) + property real defaultMarkerWidth: Commons.Style.space(focused ? 26 : 8) + property alias magicColor: colorState.magicColor + property alias kanjiColor: colorState.kanjiColor + property real ringOpacity: cellPointer.containsMouse ? 1 + : focused ? 1 : occupied ? 0.64 : 0.24 + property real auroraWidth: Commons.Style.space(focused ? 32 : 10) + property real auroraMarkerWidth: Commons.Style.space(focused ? 28 : occupied ? 6 : 4) + property real auroraMarkerHeight: Commons.Style.space(focused ? 3 : occupied ? 6 : 4) + property real auroraOpacity: cellPointer.containsMouse ? 1 + : focused ? 0.92 : occupied ? 0.62 : 0.18 + Behavior on defaultHaloWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on defaultMarkerWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Item { + id: colorState + property color magicColor: Qt.rgba(root.widgetInk.r, root.widgetInk.g, + root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + property color kanjiColor: Qt.rgba(root.widgetInk.r, root.widgetInk.g, + root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + Behavior on magicColor { ColorAnimation { duration: 200 } } + Behavior on kanjiColor { ColorAnimation { duration: 200 } } + } + Behavior on ringOpacity { NumberAnimation { duration: 160; easing.type: Easing.OutCubic } } + Behavior on auroraWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on auroraMarkerWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on auroraMarkerHeight { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on auroraOpacity { NumberAnimation { duration: 160; easing.type: Easing.OutCubic } } + + readonly property string geometryStyle: root.paintReady + ? root.renderStyle : root.initialRenderStyle + implicitWidth: geometryStyle === "numbers" ? Commons.Style.space(22) + : geometryStyle === "kanji" ? Commons.Style.space(22) + : geometryStyle === "magic" ? Commons.Style.space(focused ? 20 : 18) - : root.renderStyle === "rings" ? Commons.Style.space(20) - : root.renderStyle === "aurora" + : geometryStyle === "rings" ? Commons.Style.space(20) + : geometryStyle === "aurora" ? Commons.Style.space(focused ? 34 : 12) - : root.renderStyle === "pacman" + : geometryStyle === "pacman" ? Commons.Style.space(22) : Commons.Style.space(focused ? 32 : 16) implicitHeight: workspaceSurface.height @@ -397,6 +443,12 @@ Ui.Panel { } Behavior on scale { NumberAnimation { duration: 120 } } + // Keep the cell and pointer resident; load only the selected paint. + Loader { + anchors.fill: parent + active: root.renderStyle === "default" + sourceComponent: Component { Item { + anchors.fill: parent Rectangle { id: defaultHalo Presentation.BarInk { id: haloInk; target: defaultHalo } @@ -406,13 +458,12 @@ Ui.Panel { } visible: root.renderStyle === "default" anchors.centerIn: parent - width: Commons.Style.space(cell.focused ? 34 : 16) + width: cell.defaultHaloWidth height: Commons.Style.space(16) radius: height / 2 color: Qt.rgba(root.widgetInk.r, root.widgetInk.g, root.widgetInk.b, cell.focused ? 0.20 : cell.occupied ? 0.18 : 0.06) - Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } } Rectangle { @@ -424,21 +475,32 @@ Ui.Panel { } visible: root.renderStyle === "default" anchors.centerIn: parent - width: Commons.Style.space(cell.focused ? 26 : 8) + width: cell.defaultMarkerWidth height: Commons.Style.space(8) radius: height / 2 color: cell.focused || cell.occupied ? root.widgetInk : Qt.rgba(root.widgetInk.r, root.widgetInk.g, root.widgetInk.b, 0.25) - Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } } + } } + } + + Loader { + anchors.fill: parent + active: root.renderStyle === "numbers" + sourceComponent: Component { Item { + anchors.fill: parent Rectangle { id: numberMarker Presentation.BarInk { id: numberInk; target: numberMarker } - readonly property real inkOffsetX: numberInk.enabled ? numberInk.snapX(0) : 0 + property alias inkOffsetX: numberTranslation.x readonly property real inkOffsetY: numberInk.enabled ? numberInk.rectangleY(height) : 0 - transform: Translate { x: numberMarker.inkOffsetX; y: numberMarker.inkOffsetY } + transform: Translate { + id: numberTranslation + x: numberInk.enabled ? numberInk.snapX(0) : 0 + y: numberMarker.inkOffsetY + } visible: root.renderStyle === "numbers" anchors.centerIn: parent width: cell.numberWidth @@ -464,6 +526,14 @@ Ui.Panel { } } + } } + } + + Loader { + anchors.fill: parent + active: root.renderStyle === "magic" + sourceComponent: Component { Item { + anchors.fill: parent Presentation.IconText { barText: true wholeInk: true @@ -471,15 +541,20 @@ Ui.Panel { anchors.centerIn: parent anchors.verticalCenterOffset: cell.focused ? 0 : 1 text: cell.focused ? "✦" : cell.occupied ? "✧" : "·" - color: Qt.rgba(root.widgetInk.r, root.widgetInk.g, - root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + color: cell.magicColor font.family: "Adwaita Mono" font.pixelSize: Commons.Style.space(cell.focused ? 22 : 18) renderType: Text.NativeRendering + } - Behavior on color { ColorAnimation { duration: 200 } } + } } } + Loader { + anchors.fill: parent + active: root.renderStyle === "kanji" + sourceComponent: Component { Item { + anchors.fill: parent Presentation.IconText { barText: true wholeInk: true @@ -490,45 +565,49 @@ Ui.Panel { ? ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"][cell.modelData - 1] : String(cell.modelData) - color: Qt.rgba(root.widgetInk.r, root.widgetInk.g, - root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + color: cell.kanjiColor font.family: "Noto Sans CJK JP" font.pixelSize: Commons.Style.space(cell.focused ? 15 : 13) font.weight: Font.Normal renderType: Text.NativeRendering + } - Behavior on color { ColorAnimation { duration: 200 } } + } } } + Loader { + anchors.fill: parent + active: root.renderStyle === "rings" + sourceComponent: Component { Item { + anchors.fill: parent Presentation.IconText { barText: true visible: root.renderStyle === "rings" anchors.centerIn: parent text: cell.modelData color: root.widgetInk - opacity: cellPointer.containsMouse ? 1 - : cell.focused ? 1 : cell.occupied ? 0.64 : 0.24 + opacity: cell.ringOpacity font.family: root.bar ? root.bar.fontFamily : Commons.Style.font.family font.pixelSize: Commons.Style.space(12) font.weight: Font.Normal font.hintingPreference: Font.PreferNoHinting renderType: Text.QtRendering + } - Behavior on opacity { - NumberAnimation { duration: 160; easing.type: Easing.OutCubic } - } + } } } + Loader { + anchors.fill: parent + active: root.renderStyle === "aurora" + sourceComponent: Component { Item { + anchors.fill: parent Item { visible: root.renderStyle === "aurora" anchors.centerIn: parent - width: Commons.Style.space(cell.focused ? 32 : 10) + width: cell.auroraWidth height: Commons.Style.space(16) - Behavior on width { - NumberAnimation { duration: 200; easing.type: Easing.OutCubic } - } - Rectangle { id: auroraMarker Presentation.BarInk { id: auroraInk; target: auroraMarker } @@ -537,28 +616,23 @@ Ui.Panel { y: auroraInk.enabled ? auroraInk.rectangleY(auroraMarker.height) : 0 } anchors.centerIn: parent - width: Commons.Style.space( - cell.focused ? 28 : cell.occupied ? 6 : 4) - height: Commons.Style.space( - cell.focused ? 3 : cell.occupied ? 6 : 4) + width: cell.auroraMarkerWidth + height: cell.auroraMarkerHeight radius: height / 2 color: root.widgetInk - opacity: cellPointer.containsMouse ? 1 - : cell.focused ? 0.92 : cell.occupied ? 0.62 : 0.18 + opacity: cell.auroraOpacity antialiasing: true - - Behavior on width { - NumberAnimation { duration: 200; easing.type: Easing.OutCubic } - } - Behavior on height { - NumberAnimation { duration: 200; easing.type: Easing.OutCubic } - } - Behavior on opacity { - NumberAnimation { duration: 160; easing.type: Easing.OutCubic } - } } } + } } + } + + Loader { + anchors.fill: parent + active: root.renderStyle === "pacman" && root.paintReady + sourceComponent: Component { Item { + anchors.fill: parent Presentation.PacmanWorkspaceMarker { visible: root.renderStyle === "pacman" anchors.centerIn: parent @@ -576,6 +650,9 @@ Ui.Panel { hoverColor: root.pacmanHoverColor } + } } + } + MouseArea { id: cellPointer anchors.fill: parent @@ -612,7 +689,10 @@ Ui.Panel { width: Commons.Style.space(22) height: Commons.Style.space(18) - Item { + Loader { + anchors.fill: parent + active: root.renderStyle === "pacman" + sourceComponent: Component { Item { id: pacmanRunnerVisual anchors.fill: parent transform: Scale { @@ -661,6 +741,8 @@ Ui.Panel { context.fill() } } + } + } } } } diff --git a/hancore.shibumi.workspaces/WorkspaceService.qml b/hancore.shibumi.workspaces/WorkspaceService.qml index 4ec8f38..0bca213 100644 --- a/hancore.shibumi.workspaces/WorkspaceService.qml +++ b/hancore.shibumi.workspaces/WorkspaceService.qml @@ -14,7 +14,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.workspaces" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.workspaces/manifest.json b/hancore.shibumi.workspaces/manifest.json index 7f40b6f..8f3ae14 100644 --- a/hancore.shibumi.workspaces/manifest.json +++ b/hancore.shibumi.workspaces/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.workspaces", "name": "Shibumi Workspaces", - "version": "0.1.1-beta.16.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shared Hyprland workspace state with the Shibumi workspace presentation.", diff --git a/packaging/aur/.SRCINFO b/packaging/aur/.SRCINFO index 5c97fc3..6a89906 100644 --- a/packaging/aur/.SRCINFO +++ b/packaging/aur/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = shibumi-shell pkgdesc = Transactional Shibumi desktop shell plugins for Omarchy Quattro - pkgver = 0.1.1beta.16.1 + pkgver = 0.1.1beta.16.2 pkgrel = 1 url = https://github.com/HANCORE-linux/Shibumi-Shell arch = any @@ -30,7 +30,7 @@ pkgbase = shibumi-shell optdepends = btop: battery panel system monitor action optdepends = nvidia-utils: NVIDIA GPU telemetry optdepends = git: source-checkout diagnostics and migration - source = shibumi-shell-0.1.1-beta.16.1.tar.gz::https://github.com/HANCORE-linux/Shibumi-Shell/releases/download/v0.1.1-beta.16.1/shibumi-shell-0.1.1-beta.16.1.tar.gz - sha256sums = 8209b53464b5deeb4025c9ab45038946d2e5a794ae7f368da8bee679fed2f30d + source = shibumi-shell-0.1.1-beta.16.2.tar.gz::https://github.com/HANCORE-linux/Shibumi-Shell/releases/download/v0.1.1-beta.16.2/shibumi-shell-0.1.1-beta.16.2.tar.gz + sha256sums = b98012b096aaee52f036a14d547fb54a5ffd4b7720acb8b5a3b1fd45c3409d62 pkgname = shibumi-shell diff --git a/packaging/aur/PKGBUILD b/packaging/aur/PKGBUILD index e5640b7..6daade5 100644 --- a/packaging/aur/PKGBUILD +++ b/packaging/aur/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: HANCORE Linux