Repository navigation
Track the pointer over the notch instead of everywhere - #94
Merged
Merged
Conversation
Pullo listened to every mouse move on the system to notice the pointer reaching the notch, because the panel toggled ignoresMouseEvents and so could not see the pointer itself. The panel now leaves that property alone, so transparent pixels pass clicks through on their own, and a tracking area on the panel reports the pointer only over what is drawn. The global monitor only listens for clicks, plus pointer moves when the notch follows the pointer between displays. Handing key focus back after closing waits for the close animation, so closing by moving the pointer away animates again.
This was referenced Oct 25, 2026
Merged
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Why
Pullo listened to every mouse move on the system (
NSEvent.addGlobalMonitorForEvents([.mouseMoved, ...])) to notice the pointer reaching the notch. It needed that because the panel toggledignoresMouseEvents, and a window with that set can't see the pointer. Once the setter is called, the window also loses per-pixel click-through for good.Boring Notch, Peninsula and DynamicNotchKit don't do this: they leave
ignoresMouseEventsalone, let transparent pixels pass clicks through, and track hover only over what they draw.What
ignoresMouseEvents. Transparent pixels pass clicks to the app behind; the drawn notch, pill, wings and panel receive them.PointerTrackeradds an.activeAlwaystracking area to the panel and reports enter/move/exit. Exit is passed toNotchInteraction.mouseMoved(..., leaving: true), so leaving the drawn shape closes even when the pointer is still inside the old, padded hit rect.leftMouseDown/leftMouseUponly (close on outside click, end of a drag). AmouseMovedmonitor is installed only while Display is set to follow the pointer.orderOut+orderFront) now waits for the close animation. Before, it ran right away and cut the animation when the panel closed by moving the pointer away (the oldignoresMouseEventstoggling happened to drop key focus first and hid this).Measurements
CPU time used by Pullo in 15 s, measured with
pson a MacBook with 2 accounts:Checked by hand: hover opens and closes (with the animation), outside click closes, keyboard focus returns to the previous app after closing, menus and status items beside the notch still work.
Screenshots
No UI change: same look, only how the pointer is detected.
Tests
leavingThePanelClosesItEvenNearItsEdgeleavingTheClosedNotchCancelsTheOpen