Releases: selimacerbas/FocusMode.spoon
v0.3.1
Fix: mouseDim performance
hs.window.orderedWindows() was being called on every mouse move (~12x/sec when mouseDim = true), hammering the macOS accessibility framework and causing system-wide slowdown.
Now caches the window frame under the cursor and only re-queries when the mouse actually crosses to a different window — eliminates 90%+ of expensive AX calls.
v0.3.0
What's New
Per-Window Focus (Fixes #2)
New setting perWindowFocus. When true, only the single focused window is undimmed — not all windows of the same app. Useful when you have multiple Ghostty, Firefox, or terminal windows and want to dim the unfocused ones. Toggleable from the FM menubar menu.
spoon.FocusMode.perWindowFocus = trueFade Transitions (Fixes #1)
New setting fadeOutDuration. Departing windows smoothly fade back into the dim instead of disappearing instantly. Uses destinationOut alpha animation at 30fps.
spoon.FocusMode.fadeOutDuration = 0.3 -- seconds (default)
spoon.FocusMode.fadeOutDuration = 0 -- instant, like v0.2Delayed Dim (Fixes #3)
New setting dimDelay. A grace period before fading starts — switching back to a window within this time gives instant undim. Great for shuffling windows without visual noise.
spoon.FocusMode.dimDelay = 1.0 -- 1 second grace before dimmingOther Improvements
- Window deduplication guard prevents duplicate holes when mouse hovers focused app
- Space switch and screenshot suspend cleanly clear fade state (no ghost holes)
- New menubar toggle for per-window focus mode
v0.2.0
What's New
- Space-aware redraw: Immediate redraw when switching Spaces — no more stale overlay holes from the previous space
- Optimized redraw: Canvas elements reused in-place instead of remove-all/reinsert-all on every frame
- Dynamic menubar tooltip: Shows "paused (screenshot)" during screenshot suspend
- Screenshot awareness: Overlays automatically hide during ⌘⇧3/4/5/6 screenshots
- Backward-compat fix:
mouseUndimconfig key now correctly overridesmouseDimdefault
PaperWM Integration
_suspendFor(seconds)method documented for use in PaperWM wrapperseventSettleDelaydebounce handles rapid tiling events smoothly