Releases: ShubhamJ010/mission-control-shortcuts
Release list
v0.6.3-beta
- Close All Tabs Removed: The
Cmd+Shift+W/Cmd+swipe-left"Close All Tabs" action is fully removed —GestureAction.closeAllTabs,RoutedAction.closeAllTabs,CloseScope.allTabs, and the.closeAllTabscursor feedback mode (rectangle.badge.xmark) are gone.Cmd+swipe-leftnow defaults to Close Window (.closefeedback), and the ⌘⇧W settings row, config key (mcsc.shortcuts.cmdShiftW.enabled), and itsWindowCloserkeystroke path are deleted. - Tab Shortcuts Now Gate Tab Actions:
ShortcutActionRouterrespectsisTabShortcutsEnabledforCmd+T/Cmd+Shift+T(andCmd+Wclose-tab routing) — disabling the tab-shortcuts toggle no longer leaves tab keystrokes active behind it. - Recorder Enable State:
ShortcutRecorderFieldgained anisEnabledproperty (dims the field, disables record/clear, cancels in-flight recording);WindowShortcutsPanenow disables the tab recorder rows whenever the tab-shortcuts toggle is off, with a regression test covering both directions.
Full Changelog: v0.6.1-beta...v0.6.3-beta
v0.6.2-beta
- Close Family Unified under WindowCloser: All window-close paths (
Cmd+W/ swipe-left / pinch-in / force-quit variants) now route through a singleWindowCloserhelper;Cmd+Shift+Efallback path deprecated and removed. - Mission Control Detector Unification: Detector now uses a single
markActiveentry point with self-correction for the stuck-true state; fixes false-positive active state after rapid space switches. - Lint Fixes:
swiftformatcleanup forunusedArguments,consecutiveSpaces, anddocComments(0 violations).
Full Changelog: v0.6.1-beta...v0.6.2-beta
v0.6.1-beta
- Gesture Settings Pane Rows Implemented: The Gestures settings pane now renders a real row for every
GestureKindinstead of an empty stub — each row contains the primary-action popup (populated with that gesture's natural actions only), an enableNSSwitchaccessory, and a stacked ⌘-variant action popup underneath, all wired to the existingactionChanged/cmdActionChanged/toggleGestureEnabledhandlers and persisted viamcsc.gestures.actions. - Settings Pane Regression Suite: New
Tests/SettingsPaneTests.swiftloads every settings pane for real and asserts the resulting AppKit control hierarchy (row counts per gesture kind, kind coverage/order, popup contents, switch wiring) by reading production state throughMirrorreflection — no test-only hooks. This guards against the bug class introduced in e5375d2, where the pane compiled and tests passed while the Gestures UI silently rendered without rows. - Lint Hardening: Settings pane test suite brought fully under SwiftLint + SwiftFormat CI gates (0 violations).
What's Changed
- feat: implement gesture settings pane rows + SettingsPaneTests suite by @ShubhamJ010 in #11
- chore(release): bump to 0.6.1-beta (9) & changelog by @ShubhamJ010 in #12
Full Changelog: v0.6.0-beta...v0.6.1-beta
v0.6.0-beta
- Desktop-Switch Overlay Flash Fix: Switching desktops (Ctrl+←/→ or three-finger swipe) no longer flashes the Mission Control hover close button or flips the app into a false "Mission Control active" state. The
activeSpaceDidChangeNotificationhandler inMissionControlHoverServicenow recomputes the overlay only while Mission Control is actually open (handleSpaceChange(at:)), instead of unconditionally showing it over whatever window sat under the cursor for one frame. - Overlay Animation Strategy Cleanup: One shared
OverlayAnimationStrategy(zero-overhead CoreAnimation or native SF Symbol Effects) is built once at startup from UserDefaults and injected into every overlay, replacing per-overlayisOptimizedflags.OverlayAnimationFactorydeduplicates translation+scale keyframe groups;NativeSymbolEffectAnimationStrategycollapses the macOS 26 / 14 availability cascades into a single gated helper. - Performance Audit — Hot-Path IPC & Allocations: Systematic audit of the running build (
footprint/heap/vmmap/sample) with five fixes:- Zero AX IPC while typing: every
keyDownpreviously paid anAXUIElementCopyElementAtPositionhit-test (plus title-bar/frontmost reads) before the router discarded it. A cheap allocation-free pre-filter (ShortcutActionRouter.isShortcutCandidate) now rejects plain typing and untracked keys before any Accessibility call. Verified: 1SLWindowListCopyWindowInfoper 5 s idle sample (was 7–9; ~38 in 0.5.0-beta). - Pre-thread-hop frame throttle:
MultitouchFrameGatethrottles non-empty trackpad frames to 30 Hz inside the framework callback, before the array + closure allocation and main-queue hop (previously 60–120 wakeups/s, throttled only after crossing threads). Empty frames bypass the gate so finger-lift is observed instantly. - Cached frontmost-app element:
isFrontmostWindowno longer re-creates itsAXUIElementCreateApplicationup to 30×/s in the title-bar hover path (pid-keyed cache). - Zombie-poll fix:
MissionControlHoverService.deinitnow invalidateswindowFetchTimer— a dealloc withoutstop()previously kept polling windows every 0.5 s forever. - Smaller detection scan: Mission Control window-list copy now uses
.excludeDesktopElements.
- Zero AX IPC while typing: every
- Performance Regression Tests: New
Tests/PerformanceTests.swift— 9 wall-clock budget tests guarding the frame gate (30 Hz cap, concurrency safety, throughput), keystroke pre-filter (correctness + 100k-call budget), MC detection cache short-circuit, and window-list fuzzy-match/sort throughput. Registered inTestRunner.swift. - Title Bar Gestures & Shortcuts Outside Mission Control: New opt-in setting that applies all gestures and Cmd-shortcuts while hovering the title bar of the frontmost window in normal desktop mode. Hover detection is a ~28 pt top-strip geometry check plus an
AccessibilityService.isFrontmostWindow(_:)focused-window check, so only the frontmost window responds. Toggle via Settings → General (isTitleBarActionsOutsideMCEnabled, persisted undermcsc.titleBarActionsOutsideMC.enabled). Both this and the Dock outside-MC toggle now default to off. - Lint & Architecture Hardening: Full SwiftLint + SwiftFormat cleanup (0 warnings) with trailing-comma policies aligned across both tools, CF
unsafeDowncastafter typeid checks, inclusive-language renames, and structural splits to meet size/complexity budgets:ShortcutViewModel(+TargetResolution / +Lifecycle / +EventHandlers),MissionControlHoverService(+Observers / +InputTap / +KeyboardSearch), one file per settings pane, and decomposed router dispatch switches.
What's Changed
- perf: audit fixes for hot-path IPC, allocations, timer lifecycle + performance regression tests by @ShubhamJ010 in #8
- Release v0.6.0-beta by @ShubhamJ010 in #10
Full Changelog: v0.5.2-beta...v0.6.0-beta
v0.5.2-beta
- Make Smaller (−33%) resize action: New gesture action that shrinks the window from its center by ~33% (1/1.33 factor, the inverse of Make Larger) clamped to a 200×100 pt minimum and screen bounds. Available as a selectable action in the gesture settings pop-ups (not bound by default), with app-level parity for Dock targets. Flashes a new
.makeSmallercursor feedback mode (arrow.down.right.and.arrow.up.left, accent palette). AddsMakeSmallerAction(WindowActions/SizeActions.swift:58) andMakeSmallerAppAction(AppActions.swift:134). - Lint & Style Hardening: Fixed all SwiftLint / SwiftFormat violations blocking CI (
empty_count,identifier_name,line_length,cyclomatic_complexity,function_body_length). RenamedCoreDockSendNotification→coreDockSendNotification(@_silgen_namepreserved), table-droveShortcutConfiguration.init, splitShortcutActionRouterinto focused helpers. Auto-formatted 54 files. - Routing Refactor:
ShortcutActionRouterdecomposed from 57 → <25 cyclomatic complexity viaroutePureCmdShortcut,routeShiftTabActions,routeShiftWindowSizeActions,routeShiftDesktopActions. - Cursor Symbol Fix:
spaceRight/spaceLeftnow correctly usearrow.right/left.square.fill(wasarrowshape.*.circle.fill) to match spec and fixCursorFeedbackOverlayTests.
Full Changelog: v0.5.1-beta...v0.5.2-beta
v0.5.1-beta
- Cursor-Flash Symbol Animation Refinements: Polished every cursor feedback flash:
- Close / Force Quit: added a
.bounce.up.byLayerentry effect on top of the hover-style scale-up. - Minimize / Hide: base symbol now morphs from the outline
minus.circle.fill/eye.slash.circle.fillinto their filled counterparts via.replace.downUp.byLayer. - Eject:
eject.fillbase morphs intoeject.circle.fillvia.replace.magic(fallback:.downUp.wholeSymbol). - Tab swipes:
.wiggle.byLayernow plays unconditionally (dropped the pre-macOS 26.bouncefallback) and unused.bounce/.appearcases were removed. - Clipping fix: reduced the flash scale-up from 1.08× → 1.03× so glyphs no longer clip at the panel bounds.
- Close / Force Quit: added a
Full Changelog: v0.5.0-beta...v0.5.1-beta
v0.5.0-beta
v0.5.0-beta — Pinch-Out, Dock Parity & Fuzzy Finder Rollup
Compare: v0.4.0-beta → v0.5.0-beta (13 commits)
Build 6 · MARKETING_VERSION 0.5.0-beta · macOS 15.7+
This release rolls up everything committed since v0.4.0-beta (18 Aug 2026), including the two unreleased features 0.4.1 + 0.4.2.
✨ New since 0.4.0-beta
Pinch-Out Gesture — Fullscreen & Windowing
- New
PinchOutRecognizerextracted fromBasePinchRecognizershared base.pinch-outtoggles fullscreen viakAXZoomButtonAttribute+CoreDockSendNotification("com.apple.expose.awake"),Cmd+pinch-out= New Window (Cmd+N). - Distinct haptic
alignment → levelChange(vslevelChange → levelChangefor pinch-in) and cursor feedbackarrow.down.left.and.arrow.up.right.circle.fill(black/green). - Toggle: menu bar
Pinch In →sibling,ShortcutConfiguration.isPinchOutEnabled.
Dock Parity — Tiling & Fullscreen on Dock Icons
SwipeDown(Fill Screen / Make Larger +33%),TwoFingerDoubleTap(Reasonable 60% / Almost Maximize 90%), andPinch-Out(Fullscreen) now work when pointing at a Dock icon in Mission Control, not just window previews.GestureActionRouterpreviously returned.nonefor Dock on those paths.
Type-to-Select Fuzzy Finder (0.4.2 rollup)
- Just type any app name in Mission Control — stateless
WindowSelectionEngineranks prefix > substring, shoulder-targets 20pt inset, injects.mouseMovedto drive macOS native blue highlight, and activates via 50 ms dwell click. HID key tapMCKeyboardTapService+ Dock pillSearchBarOverlay.
Mounted Volume Auto-Eject (0.4.1 rollup)
Cmd+W/Cmd+Qor pinch-in / swipe-left on ejectable Finder volume window (/VolumesDMG) auto-closes +NSWorkspace.unmountAndEjectDevicewith redeject.circle.fillflash. ToggleAuto-Eject Mounted Volumes.
Other highlights
- Fullscreen Hover Button — 4th mode
arrow.down…circle.fillon hover overlay +MissionControlWindowActions.performFullscreendictionary path. - Tab-Close Fix — recursive AX search (depth 8, skip
AXWebArea) findsAXTabGroupunderAXGroupwrappers (Chrome); fallback focuses hovered window viakAXFocusedAttribute. - Event-Tap Resilience — auto-recreates
CGEventTapon.tapDisabledByTimeout/.tapDisabledByUserInput. - macOS 14+ fallbacks —
.wiggle→.bounce,.magic→.upUpso animations work on 14/15. - MVVM Reorg —
Models/Actions/,Models/Gestures/,Services/*,ViewModels/Routing/,Utilities/; extracted routers &ShortcutConfiguration. - README — 7 → 11 feature bullets (hover buttons, 14-mode cursor feedback + haptics, tiling/tab control, dock-aware targeting).
Commits
8fef232chore(release): bump to 0.5.0-beta (build 6)dc0e56edocs(readme): advertise major featuresf6647b5feat(dock): parity gestures for tiling/fullscreen on Dockc4b2de9feat(gestures): pinch-out for fullscreen / new window and cmd+swipe-right for new tabd2f1257feat(mission-control): type-to-select fuzzy finder (0.4.2)7fbe800feat(volume): mounted volume auto-eject (0.4.1)eeee336docs updatee95398ffix: macOS 14+ symbol effect fallbacksa5c06cbfix(cmdw): recursive AX tab search2a5180dfeat: fullscreen hover + event tap resilienced180874refactor: MVVM folder structure
Full changelog: CHANGELOG.md
MCSC 0.4.0-beta
A lightweight, event-driven Mission Control window-management utility for macOS.
Highlights
- Tab swipe cursor feedback: two-finger swipe-left (close tab), swipe-right (reopen tab), Cmd+swipe-left (close all tabs), and Cmd+swipe-right (new window) now flash at the cursor.
- Maximize, resize, and hide feedback: swipe-down, two-finger double-tap (reasonable / almost-maximize), and hide actions flash distinct accent- and palette-tinted symbols.
- Hover button modifier actions: the Mission Control hover button now supports Close (no modifier), Minimize (Option), and Force Quit (Cmd).
- Extensible feedback overlay: data-driven
CursorFeedbackOverlay.Modewith entry effects and replace transitions.
Documentation
This release ships expanded guides linked from the README:
SHORTCUTS.md,GESTURES.md,MISSION_CONTROL.md,SYMBOLS.md,PERFORMANCE.md,ARCHITECTURE.md
Notes
Inspired by Mission Control Plus and Swish. This is an educational project and is not a full replacement for either app; reaching parity requires crediting the original authors.
MCSC v0.3.1
MCSC v0.3.1
What's New
- Mission Control Hover Action Buttons: Added interactive action overlay button anchored directly to the top-left vertex of window thumbnails in Mission Control.
- Hover over a window preview to display the close button (
xmark.circle.fill). Click to close the window. - Hold
Commandwhile hovering to switch to the minimize button (minus.circle.fill) with smooth symbol content transitions. Click to minimize. - Features symbol animations (
.drawOn.byLayer/.appear.byLayerand.rotate.byLayer) and haptic feedback.
- Hover over a window preview to display the close button (
Fixes & Reliability
- Bug Fix: Fixed application crash when clicking hover action buttons caused by recursive
dispatch_syncexecution on the main queue within the event tap callback. - AX Safety & Fallbacks: Added type-safe AX attribute resolution and fallback application activation + action triggering for non-standard windows.
- Window Cache Management: Window list caching dynamically updates when windows are closed/minimized.
Installation
- Download and unzip
MCSC.zip. - Move
MCSC.appto/Applications. - Launch
MCSCand grant Accessibility permission in System Settings → Privacy & Security → Accessibility.
MCSC v0.2.4-beta
MCSC v0.2.4-beta
Bug-fix and hardening release (Development-signed; for local testing).
Changes since v0.2.3-beta
- fix(multitouch): cancel stale deferred
deviceStopso gesture delivery survives sleep/wake cycles. - fix(accessibility): Dock gesture/shortcut resolution now works for non-native apps (Mac Catalyst / Electron).
isDockItemandgetAppFromDockItemwalk up to the nearestAXDockItemancestor and resolve the running app by bundle identifier (via the Dock item'sAXURL), with a tolerant case/diacritic/whitespace-insensitiveAXTitlefallback. Fixes Cmd+W / swipe / pinch over the Dock icons of apps like WhatsApp (Catalyst) and Beeper (Electron). - diag(accessibility): added a gated Dock-item AX attribute logger, enabled with
MCSC_DOCK_DIAG=1, to verify which resolution path fires.
Notes
- This is a Development-signed build, not notarized — runs on the developer Mac only.
- First launch prompts for Accessibility permission (System Settings → Privacy & Security → Accessibility).