Skip to content

2.11.1: windows from the menu bar come to the front (macOS 14+) - #26

Merged
roypadina merged 5 commits into
mainfrom
fix/forceful-activation
Nov 14, 2026
Merged

roypadina merged 5 commits into
mainfrom
fix/forceful-activation

Conversation

@roypadina

Copy link
Copy Markdown
Owner

Fixed

  • On macOS 14 and later, Settings, About and the Welcome window come to the front instead of opening behind the app you were using.
  • Check for Updates… brings the update window to the front.

How

  • NSApp.activate() is a cooperative request on macOS 14+, and the front app often refuses it for an .accessory app. User-initiated paths now use activate(ignoringOtherApps: true).
  • keepFront: after the .accessory → .regular switch, macOS hands activation back about 0.5 s later. The guard takes it back once within 1.5 s unless the user clicked elsewhere.
  • Sparkle: only a user-initiated check (state.userInitiated) is forceful and guarded. Scheduled reminders stay cooperative.
  • Version 2.11.1, CHANGELOG.

Same fix as PullPing 0.7.0. Release review: APPROVE.

🤖 Generated with Claude Code

roypadina and others added 5 commits November 15, 2026 00:24
On macOS 14+ NSApp.activate() is a cooperative request. From a menu-bar
(.accessory) app the front app often refuses it, so windows opened from
the menu bar could open behind the front app. User-initiated paths now use
activate(ignoringOtherApps:): About, Welcome and Settings.
Not started by a click, so still cooperative: Sparkle update alerts; the history popup stays non-activating.
Same fix as PullPing 0.7.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sparkle: a "Check for Updates..." click (state.userInitiated) now
activates forcefully; scheduled update reminders stay cooperative.
No keepFront here: MaccyPlus windows (About, Welcome, Settings) never switch
the activation policy, which is what triggers the hand-back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A user-initiated update check also switches .accessory -> .regular before
Sparkle shows its window, so macOS can hand activation back ~0.5 s later
(release review). That branch now runs the same one-time keepFront guard,
with no window of ours (nil). keepFront documents its known limit: a
keyboard app switch within the 1.5 s is pulled back once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Release review: on the update-window path (no window of ours), answering the
update alert inside the 1.5 s switches back to .accessory, the app resigns
active, and the guard would re-activate it with no window. The guard now
also requires the .regular policy (window closed or update session over:
stay out).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@roypadina
roypadina merged commit 754fa2f into main Nov 14, 2026
1 check passed
@roypadina
roypadina deleted the fix/forceful-activation branch November 14, 2026 23:59
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.

1 participant