Skip to content

Minor improvements#3091

Merged
pjrobertson merged 26 commits intomainfrom
pjrobertson/optimisations
Feb 7, 2026
Merged

Minor improvements#3091
pjrobertson merged 26 commits intomainfrom
pjrobertson/optimisations

Conversation

@pjrobertson
Copy link
Member

@pjrobertson pjrobertson commented Jan 30, 2026

  • Slightly optimises the insertSpace behaviour - to not resolve the dObject unless it's actually needed
  • Resolve indirect objects on a background thread - avoids a potential deadlock (as can be seen from the attached spindump)
  • Updates Bezel interface to use autolayout + tweak some spacing
  • Fix up sporadic behaviour sometimes opening the prefs pane
  • Fix a crash when copy/pasting an NSColor
  • Perform more fuzzy searching for plugin names
  • Fix bezel interface auto layout issues
  • Set up ability to add additional search context to objects (that you …
  • Extract text from image objects to allow searching for text in images
  • Open plugin docs on the web (if they exist there)
  • Filter out non-bundle appls
  • Score 3rd pane objects when displaying
  • Fix using backspace in the aSelector
  • Fix issue when using ⌘⇧ combination with an action that has k…
  • Update plugin changelog text color for dark mode
  • Make ⌘F focus search bars in prefs
  • Update donate URL to latest page
  • Make sure trigger hot keys are cleared when deleting with backspace i…

Process:          Quicksilver [23437] [unique pid 221922]
UUID:             577480C6-8468-36EC-9A4B-EA5CE75D152A
Path:             /Applications/Quicksilver.app/Contents/MacOS/Quicksilver
Identifier:       com.blacktree.Quicksilver
Version:          2.5.4 (4048)
Team ID:          ATVCND8EAP
Is First Party:   No
Beta Identifier:  FB743F9B-292C-560E-895D-3162DFCB0DA3
Shared Cache:     4C1223E5-CACE-3982-A003-6110A7A8A25C slid base address 0x190f40000, slide 0x10f40000 (System Primary)
Architecture:     arm64
Parent:           launchd [1]
UID:              501
Footprint:        109.64 MB
Time Since Fork:  457s
Num samples:      1000 (1-1000)
CPU Time:         0.013s (18.8M cycles, 19.7M instructions, 0.95c/i)
Num threads:      9
Note:             3 idle work queue threads omitted

  Thread 0x1d762d    DispatchQueue "com.apple.root.user-interactive-qos"(19)    1000 samples (1-1000)    priority 46 (base 46)
  1000  start + 6076 (dyld + 27544) [0x191012b98]
    1000  NSApplicationMain + 880 (AppKit + 17116) [0x19538b2dc]
      1000  -[NSApplication run] + 520 (AppKit + 187404) [0x1953b4c0c]
        1000  -[NSApplication _handleEvent:] + 60 (AppKit + 6124588) [0x19595e42c]
          1000  ??? (Quicksilver + 6304) [0x100c918a0]
            1000  -[NSApplication(NSEventRouting) sendEvent:] + 2364 (AppKit + 10324508) [0x195d5fa1c]
              1000  -[QSWindow sendEvent:] + 408 (QSEffects + 11156) [0x100ceeb94]
                1000  -[NSWindow(NSEventRouting) sendEvent:] + 288 (AppKit + 1444000) [0x1954e78a0]
                  1000  -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 300 (AppKit + 1444756) [0x1954e7b94]
                    1000  -[QSSearchObjectView keyDown:] + 1012 (QSInterface + 107188) [0x100f962b4]
                      1000  -[NSView interpretKeyEvents:] + 156 (AppKit + 1961368) [0x195565d98]
                        1000  -[NSTextInputContext _handleEvent:allowingSyntheticEvent:] + 132 (AppKit + 1961792) [0x195565f40]
                          1000  -[NSTextInputContext _handleEvent:options:allowingSyntheticEvent:completionHandler:] + 1460 (AppKit + 1963316) [0x195566534]
                            1000  -[NSTextInputContext tryTSMProcessRawKeyEvent_orSubstitution:dispatchCondition:setupForDispatch:furtherCondition:doubleSpaceSubstitutionCondition:doubleSpaceSubstitutionWork:dispatchTSMWork:continuation:] + 336 (AppKit + 1964824) [0x195566b18]
                              1000  __204-[NSTextInputContext tryTSMProcessRawKeyEvent_orSubstitution:dispatchCondition:setupForDispatch:furtherCondition:doubleSpaceSubstitutionCondition:doubleSpaceSubstitutionWork:dispatchTSMWork:continuation:]_block_invoke.691 + 180 (AppKit + 13559060) [0x196075514]
                                1000  __84-[NSTextInputContext _handleEvent:options:allowingSyntheticEvent:completionHandler:]_block_invoke_3.708 + 148 (AppKit + 13559880) [0x196075848]
                                  1000  TSMProcessRawKeyEventWithOptionsAndCompletionHandler + 2712 (HIToolbox + 1314576) [0x19cfbcf10]
                                    1000  __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke + 344 (HIToolbox + 1315796) [0x19cfbd3d4]
                                      1000  __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_2 + 352 (HIToolbox + 1316440) [0x19cfbd658]
                                        1000  __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_3 + 352 (HIToolbox + 1317084) [0x19cfbd8dc]
                                          1000  __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_4 + 408 (HIToolbox + 1317668) [0x19cfbdb24]
                                            1000  __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_5 + 312 (HIToolbox + 1318004) [0x19cfbdc74]
                                              1000  TSMKeyEvent_WithCompletionHandler + 616 (HIToolbox + 1276176) [0x19cfb3910]
                                                1000  __utDeliverTSMEvent_WithCompletionHandler_block_invoke + 284 (HIToolbox + 1293592) [0x19cfb7d18]
                                                  1000  __utDeliverTSMEvent_WithCompletionHandler_block_invoke_2 + 220 (HIToolbox + 1294084) [0x19cfb7f04]
                                                    1000  SendUnicodeTextAEToUnicodeDoc_WithCompletionHandler + 312 (HIToolbox + 1278216) [0x19cfb4108]
                                                      1000  SendFilterTextEvent_WithCompletionHandler + 260 (HIToolbox + 1290148) [0x19cfb6fa4]
                                                        1000  SendTSMEvent_WithCompletionHandler + 520 (HIToolbox + 1289444) [0x19cfb6ce4]
                                                          1000  __SendFilterTextEvent_WithCompletionHandler_block_invoke + 236 (HIToolbox + 1291832) [0x19cfb7638]
                                                            1000  __SendUnicodeTextAEToUnicodeDoc_WithCompletionHandler_block_invoke + 300 (HIToolbox + 1290520) [0x19cfb7118]
                                                              1000  SendTSMEvent_WithCompletionHandler + 432 (HIToolbox + 1289356) [0x19cfb6c8c]
                                                                1000  SendEventToEventTargetWithOptions + 44 (HIToolbox + 2405136) [0x19d0c7310]
                                                                  1000  SendEventToEventTargetInternal(OpaqueEventRef*, OpaqueEventTargetRef*, HandlerCallRec*) + 316 (HIToolbox + 818500) [0x19cf43d44]
                                                                    1000  DispatchEventToHandlers(EventTargetRec*, OpaqueEventRef*, HandlerCallRec*) + 1244 (HIToolbox + 749272) [0x19cf32ed8]
                                                                      1000  _NSTSMEventHandler + 324 (AppKit + 1969536) [0x195567d80]
                                                                        1000  -[NSTextInputContext handleTSMEvent:completionHandler:] + 3184 (AppKit + 1972828) [0x195568a5c]
                                                                          1000  -[NSTextInputContext tryHandleTSMEvent_HasMarkedText_withDispatchCondition:dispatchWork:continuation:] + 148 (AppKit + 1974484) [0x1955690d4]
                                                                            1000  __55-[NSTextInputContext handleTSMEvent:completionHandler:]_block_invoke_2 + 100 (AppKit + 1974664) [0x195569188]
                                                                              1000  __55-[NSTextInputContext handleTSMEvent:completionHandler:]_block_invoke.188 + 2032 (AppKit + 13539940) [0x196070a64]
                                                                                1000  -[NSTextInputContext tryHandleTSMEvent_insertFixLenText_withContext:dispatchCondition:setupForDispatch:nestedWorkaroundCondition:nestedWorkaroundDispatchWork:loopCondition:dispatchWorkEach:afterEachInsertText:continuation:] + 364 (AppKit + 1975696) [0x195569590]
                                                                                  1000  -[NSTextInputContext do_HandleTSMEvent_insertFixLenTextLoop:whileCondition:dispatchWorkEach:afterEachInsertText:continuation:] + 152 (AppKit + 1976084) [0x195569714]
                                                                                    1000  __55-[NSTextInputContext handleTSMEvent:completionHandler:]_block_invoke_2.215 + 112 (AppKit + 13542032) [0x196071290]
                                                                                      1000  -[NSTextInputContext(NSInputContext_WithCompletion) insertText:replacementRange:completionHandler:] + 224 (AppKit + 1976320) [0x195569800]
                                                                                        1000  +[NSInputAnalytics(TrackedActionsManager) allowActionTrackingAnalyticsWithName:forAction:] + 164 (AppKit + 6371576) [0x19599a8f8]
                                                                                          1000  -[QSSearchObjectView insertText:replacementRange:] + 128 (QSInterface + 114436) [0x100f97f04]
                                                                                            1000  -[QSSearchObjectView partialStringChanged] + 308 (QSInterface + 103912) [0x100f955e8]
                                                                                              1000  -[QSSearchObjectView performSearch:] + 228 (QSInterface + 102224) [0x100f94f50]
                                                                                                1000  -[QSSearchObjectView performSearchFor:from:] + 504 (QSInterface + 102788) [0x100f95184]
                                                                                                  1000  -[QSSearchObjectView selectIndex:] + 344 (QSInterface + 98408) [0x100f94068]
                                                                                                    1000  -[QSSearchObjectView selectObjectValue:] + 256 (QSInterface + 97596) [0x100f93d3c]
                                                                                                      1000  -[NSNotificationCenter postNotificationName:object:userInfo:] + 88 (Foundation + 38528) [0x192a1c680]
                                                                                                        1000  _CFXNotificationPost + 740 (CoreFoundation + 264376) [0x1914628b8]
                                                                                                          1000  _CFXRegistrationPost + 436 (CoreFoundation + 1051244) [0x191522a6c]
                                                                                                            1000  ___CFXRegistrationPost_block_invoke + 92 (CoreFoundation + 1051432) [0x191522b28]
                                                                                                              1000  __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 148 (CoreFoundation + 463980) [0x19149346c]
                                                                                                                1000  -[QSInterfaceController searchObjectChanged:] + 384 (QSInterface + 42048) [0x100f86440]
                                                                                                                  1000  -[QSInterfaceController updateIndirectObjects] + 220 (QSInterface + 40456) [0x100f85e08]
                                                                                                                    1000  ??? (Core Support + 13588) [0x110463514]
                                                                                                                      1000  __NSArrayGetIndexesPassingTest + 992 (CoreFoundation + 539588) [0x1914a5bc4]
                                                                                                                        1000  dispatch_apply + 96 (libdispatch.dylib + 89908) [0x19120ff34]
                                                                                                                          1000  _dispatch_apply_with_attr_f + 1312 (libdispatch.dylib + 89516) [0x19120fdac]
                                                                                                                            1000  _dispatch_apply_invoke_and_wait + 204 (libdispatch.dylib + 93200) [0x191210c10]
                                                                                                                              1000  _dispatch_once_wait + 60 (libdispatch.dylib + 15384) [0x1911fdc18]
                                                                                                                                1000  _dispatch_once_wait.cold.1 + 148 (libdispatch.dylib + 223680) [0x1912309c0]
                                                                                                                                  1000  __ulock_wait + 8 (libsystem_kernel.dylib + 10680) [0x1913739b8]
                                                                                                                                   *1000  ??? (kernel.release.t6041 + 6330920) [0xfffffe0008d7da28] (blocked by turnstile with priority 47 waiting for Quicksilver [23437] [unique pid 221922] thread 0x1dbba2)

  Thread 0x1dbba2    DispatchQueue "com.apple.root.user-interactive-qos"(19)    1000 samples (1-1000)    priority 47 (base 47)
  1000  start_wqthread + 8 (libsystem_pthread.dylib + 7028) [0x1913aeb74]
    1000  _pthread_wqthread + 232 (libsystem_pthread.dylib + 11816) [0x1913afe28]
      1000  _dispatch_worker_thread2 + 156 (libdispatch.dylib + 83412) [0x19120e5d4]
        1000  _dispatch_root_queue_drain + 736 (libdispatch.dylib + 81828) [0x19120dfa4]
          1000  <deduplicated_symbol> + 32 (libdispatch.dylib + 230544) [0x191232490]
            1000  _dispatch_client_callout + 16 (libdispatch.dylib + 112732) [0x19121585c]
              1000  _dispatch_apply_invoke + 252 (libdispatch.dylib + 87888) [0x19120f750]
                1000  _dispatch_once_callout + 32 (libdispatch.dylib + 18984) [0x1911fea28]
                  1000  _dispatch_client_callout + 16 (libdispatch.dylib + 112732) [0x19121585c]
                    1000  _dispatch_apply_invoke3 + 336 (libdispatch.dylib + 91664) [0x191210610]
                      1000  _dispatch_client_callout2 + 16 (libdispatch.dylib + 112756) [0x191215874]
                        1000  ____NSArrayGetIndexesPassingTest_block_invoke + 100 (CoreFoundation + 1380916) [0x191573234]
                          1000  __NSArrayChunkIterate + 396 (CoreFoundation + 851992) [0x1914f2018]
                            1000  __NSARRAY_IS_CALLING_OUT_TO_A_BOOL_BLOCK__ + 24 (CoreFoundation + 539716) [0x1914a5c44]
                              1000  ??? (Core Support + 29984) [0x110467520]
                                1000  -[QSObject(FileHandling) resolvedAliasObject] + 28 (QSCore + 117324) [0x100d4ca4c]
                                  1000  -[QSObject(FileHandling) isAlias] + 20 (QSCore + 118008) [0x100d4ccf8]
                                    1000  -[QSObject(FileHandling) infoRecord] + 68 (QSCore + 115836) [0x100d4c47c]
                                      1000  -[QSObject(FileHandling) loadInfoRecord] + 40 (QSCore + 115976) [0x100d4c508]
                                        1000  -[QSBasicObject(FileHandling) validSingleFilePath] + 20 (QSCore + 120764) [0x100d4d7bc]
                                          1000  -[QSBasicObject(FileHandling) singleFilePath] + 32 (QSCore + 120636) [0x100d4d73c]
                                            1000  -[QSObject objectForType:] + 52 (QSCore + 91040) [0x100d463a0]
                                              1000  -[QSProxyObject _safeObjectForType:] + 76 (QSCore + 230672) [0x100d68510]
                                                1000  -[QSProxyObject proxyObject] + 92 (QSCore + 228700) [0x100d67d5c]
                                                  1000  -[QSGlobalSelectionProvider currentSelection] + 556 (QSCore + 60204) [0x100d3eb2c]
                                                    1000  -[QSTemporaryServiceProvider getSelectionFromFrontApp] + 172 (QSCore + 58856) [0x100d3e5e8]
                                                      1000  _dispatch_sync_f_slow + 148 (libdispatch.dylib + 71232) [0x19120b640]
                                                        1000  __DISPATCH_WAIT_FOR_QUEUE__ + 368 (libdispatch.dylib + 72328) [0x19120ba88]
                                                          1000  _dispatch_thread_event_wait_slow + 56 (libdispatch.dylib + 15068) [0x1911fdadc]
                                                            1000  __ulock_wait + 8 (libsystem_kernel.dylib + 10680) [0x1913739b8]
                                                             *1000  ??? (kernel.release.t6041 + 6330920) [0xfffffe0008d7da28]

@pjrobertson pjrobertson requested a review from Copilot February 2, 2026 20:10
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR includes minor optimizations and fixes to improve performance and resolve a deadlock issue in Quicksilver's interface handling.

Changes:

  • Optimizes insertSpace to defer object resolution until needed
  • Moves indirect object resolution to a background thread to prevent deadlock
  • Updates Bezel interface to use autolayout with adjusted spacing

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
QSBezelInterfaceController.m Moves standardRect calculation after autolayout and updates window sizing logic to use autolayout-computed positions
QSBezelInterface.xib Enables autolayout with constraints for UI elements and updates spacing constants
QSMainMenuPrefPane.xib Updates Interface Builder versions and screen resolution metadata
QSSearchObjectView.m Optimizes insertSpace to defer object resolution and adds autolayout constraints for text editor
QSSearchObjectView.h Adds textEditorConstraints property for managing autolayout
QSInterfaceController.m Changes showMainWindow to use sync dispatch and moves indirect object resolution to background thread
QSPaths.h Updates help search URL format
QSLibrarian.h Fixes syntax error in import statement
QSPreferencesController.m Fixes sporadic preferences pane opening behavior

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

Copilot AI commented Feb 2, 2026

@pjrobertson I've opened a new pull request, #3092, to work on those changes. Once the pull request is ready, I'll request review from you.

pjrobertson and others added 18 commits February 2, 2026 20:14
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
[WIP] WIP Address feedback from PR #3091 for minor improvements
Allows searching 'mail' to return 'E-Mail Support'
…might not want to show to the user

E.g. text extracted from images
If this prooves to be too problematic then we can revert back
Previously, it would search in the whole QSLib, whereas it should only search actions
…QSObjectDefaultAction set

Objects that have 'kQSObjectDefaultAction' set return an array of [DefaultAction, [All Actions]] for the valid list of actions
This would break when using ⌘⇧<letter> combinations, that would try to iterate over all items in the outer array and fail on [All Actions] - since it's an array not an object
The correct fix is to return the [All Actions] array alone if the length of the array is 2 and the 2nd item is an array.
@pjrobertson pjrobertson merged commit aa9082b into main Feb 7, 2026
2 checks passed
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