Skip to content

fix: restore the app on its last workspace without taking focus - #48

Merged
nixfred merged 1 commit into
nixfred:mainfrom
jefehoser:fix-window-workspace-restore
Sep 10, 2026
Merged

nixfred merged 1 commit into
nixfred:mainfrom
jefehoser:fix-window-workspace-restore

Conversation

@jefehoser

Copy link
Copy Markdown
Contributor

Blip's app window is recreated when the shell or plugin bar reloads. Previously it restored visibility and size but appeared on the active workspace, taking focus. This change remembers workspace moves and prepares quiet placement before mapping the replacement window. Closed windows remain closed, and explicit launches remain available.

The restoration rule exists only at runtime and matches a unique temporary window title. No fixed-workspace user configuration is needed. Window identity is scoped to the shell PID; only window metadata is persisted.

Validation: 394 tests pass. An isolated window restored on workspace 4, followed a manual move to workspace 5 on restart without changing the active workspace, and remained closed after closing and restarting. Live shell restart and plugin rescan from workspace 3 restored Blip on workspace 2 without focus or workspace changes.

Remember workspace changes and prepare quiet placement before recreating an open window after shell reloads. Closed windows remain closed; explicit launches remain available. Window matching is scoped to the shell process, and no conversation data is persisted.
@jefehoser
jefehoser requested a review from nixfred as a code owner September 8, 2026 04:43
nixfred added a commit that referenced this pull request Sep 10, 2026
…ad as a failure

PR #43 merged fine but its workflow run is recorded as failed, because the
approval expired before any job started. Zero jobs, no logs, and an annotation
that looks exactly like a test regression to whoever opened the PR.

Verified rather than assumed. The repo's policy is
`{"approval_policy":"first_time_contributors"}`, the cited run
(34064507217, event=pull_request, head duplicate-cards-and-instant-send) is
conclusion=failure, and this is not historical: PR #49 has two runs sitting at
conclusion=action_required right now, which is why it shows "no checks
reported" while #45 through #48 all show a passing test job.

CONTRIBUTING now tells contributors what an expired approval looks like and
that it is not their code, and tells maintainers to approve before merging so
a merged PR carries a real green tick.

Deliberately NOT done, both need the owner's decision:

- Changing the approval policy. Relaxing it means untrusted fork code runs in
  CI on push, which is a security trade-off, not a docs fix.
- Approving the two runs waiting on #49. Same reason: it executes that fork's
  workflow.

No runtime change, which matches the reporter's own framing.

LR-T: issue-44, ci, fork-pr-approval, github-actions
LR-D: blip, ci, docs
LR-K: an-expired-approval-is-not-a-test-failure

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MjLJVjERSup2CMwVehKja7
@nixfred
nixfred merged commit fc782b9 into nixfred:main Sep 10, 2026
1 check passed
nixfred added a commit that referenced this pull request Sep 13, 2026
… entry

Release audit before 2.5.0, same method as 2.4.0: every merge since v2.4.0
checked against Unreleased. Missing and now written: #73 (security code on
wl-copy stdin), #50 (failed send keeps its bubble), #51 (accessible composer,
spelling, arrow keys), #52 (resizable panel + compact header), #53 (Ctrl+1-9
pins, back arrow), #55 + 2197e0d (unnamed groups named after people,
composite avatar), #59/#60/#61 (contact scans, read-only card view, vCard
copy/save), #48 (window restores on its workspace), #36 (no uninvited consent
prompt from blip-check). Attributions checked against gh PR authors: #48 is
@jefehoser; #36 reported by @jacobaross. Skipped as not user-facing: #64
(test isolation), #65 (README line), CONTRIBUTORS docs.

No version bump yet: blip-b2 is landing the avatar-cache fix and #62 for
Fred, and 2.5.0 waits for those.

LR-T: changelog, release-audit, 2.5.0, attribution, backfill
LR-D: blip, docs, release
LR-K: audit-the-release-not-assume-it

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PeUtMhaSaA9aiazebBUMS
nixfred pushed a commit that referenced this pull request Sep 15, 2026
#48 restored the window on shell reload. Idle and display-off remap it
as a new client on the focused workspace, and that remap was then saved
as home. Keep a live-title compositor rule for the last user move; send
a remap back quietly without taking focus. Closed windows stay closed.

Touched: window recreate/restore invariant in CLAUDE.md.
@nixfred

nixfred commented Nov 4, 2026

Copy link
Copy Markdown
Owner

@jefehoser, thank you, and I am sorry this is late. Your two merged pull requests, #40 and #48, never got a comment from me on the PR itself. That is my miss.

#40 made Favorites and the thread list follow Messages for two shapes that used to split. A re-keyed group keeps its pin, and a merged 1:1, a phone SMS row and an email iMessage row under one group, is one thread instead of two with the pin stuck on the stale handle.

#48 restores the app window on its last workspace without taking focus, and you checked it with a live shell restart and plugin rescan from another workspace, not only with tests.

Both fixed things that were wrong quietly, all day long. Thank you, and thank you for the note on #40. It is good to hear.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants