-
Notifications
You must be signed in to change notification settings - Fork 28
Fix focus on target window #162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
chid
wants to merge
2
commits into
pablopunk:main
Choose a base branch
from
chid:codex/fix-window-focus
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+15
−2
Open
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: pablopunk/SwiftShift
Length of output: 2174
Propagate AX focus failures to the caller (don’t mark focused unconditionally).
WindowManager.focus(window:)returnsVoidand ignores the results ofAXUIElementPerformAction/AXUIElementSetAttributeValue(plusapp.activate), whileMouseTrackersetstrackedWindowIsFocused = trueimmediately after the call (MouseTracker.swift:97). If any AX step fails, that flag blocks future focus retries while the window may still be unfocused.Make
focus(window:)return a success indicator (e.g.,Bool/Result) based on the AX return values, and only settrackedWindowIsFocusedinMouseTrackerwhen focus reports success.🤖 Prompt for AI Agents
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there seems to be an issue where other windows that aren't the trackedWindow also get focused, what's the fix for that (we only want to activate the window not the app) - why did the original WindowManager.focus not work?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Length of output: 17437
@chid— good questions, here's the breakdown:Why the original
focus()didn't workThe original was:
Two problems:
kAXRaiseActiononly adjusts z-order — it brings the window visually in front but does not set it as the app's key/focused window.activate()without.activateIgnoringOtherAppsis "polite" — on modern macOS, it won't reliably steal focus away from the currently active app. If SwiftShift itself is the active app (likely during a drag), the target app may simply be ignored.Why other windows get focused in the new code
The ordering is the culprit. The new implementation does:
When
app.activatefires, the system activates the app using its own last-known key window (whichever window that app had focused before). The AX attribute writes to nominate the specifictrackedWindowas focused come after that activation, so there's a race you can't reliably win.The fix: set the target window as focused before activating
Swap the order so the app activates into an already-configured state:
By writing
kAXFocusedWindowAttributeandkAXMainWindowAttributeon the AX app element before callingapp.activate, you pre-configure which window the app should treat as key when it comes to the front, avoiding the race that lets the previously-focused window steal activation.🧬 Code Graph Analysis Results
Relevant snippet(s)
Swift Shift/src/Manager/WindowManager.swiftstatic func focus(window: AXUIElement)static func getCurrentWindow() -> AXUIElement?private static func getTopWindowAtCursorUsingCGWindowList(mouseLocation: NSPoint) -> AXUIElement?private static func getWindow(from element: AXUIElement) -> AXUIElement?Swift Shift/src/Manager/Preferences.swiftstatic func isAppIgnored(_ bundleId: String) -> Bool🧠 Learnings used