Skip to content

Releases: ShubhamJ010/mission-control-shortcuts

v0.6.3-beta

Choose a tag to compare

@github-actions github-actions released this 25 Aug 19:42
  • 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 .closeAllTabs cursor feedback mode (rectangle.badge.xmark) are gone. Cmd+swipe-left now defaults to Close Window (.close feedback), and the ⌘⇧W settings row, config key (mcsc.shortcuts.cmdShiftW.enabled), and its WindowCloser keystroke path are deleted.
  • Tab Shortcuts Now Gate Tab Actions: ShortcutActionRouter respects isTabShortcutsEnabled for Cmd+T / Cmd+Shift+T (and Cmd+W close-tab routing) — disabling the tab-shortcuts toggle no longer leaves tab keystrokes active behind it.
  • Recorder Enable State: ShortcutRecorderField gained an isEnabled property (dims the field, disables record/clear, cancels in-flight recording); WindowShortcutsPane now 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

Choose a tag to compare

@github-actions github-actions released this 24 Aug 22:37
  • Close Family Unified under WindowCloser: All window-close paths (Cmd+W / swipe-left / pinch-in / force-quit variants) now route through a single WindowCloser helper; Cmd+Shift+E fallback path deprecated and removed.
  • Mission Control Detector Unification: Detector now uses a single markActive entry point with self-correction for the stuck-true state; fixes false-positive active state after rapid space switches.
  • Lint Fixes: swiftformat cleanup for unusedArguments, consecutiveSpaces, and docComments (0 violations).

Full Changelog: v0.6.1-beta...v0.6.2-beta

v0.6.1-beta

Choose a tag to compare

@github-actions github-actions released this 23 Aug 21:33
9f819ee
  • Gesture Settings Pane Rows Implemented: The Gestures settings pane now renders a real row for every GestureKind instead of an empty stub — each row contains the primary-action popup (populated with that gesture's natural actions only), an enable NSSwitch accessory, and a stacked ⌘-variant action popup underneath, all wired to the existing actionChanged / cmdActionChanged / toggleGestureEnabled handlers and persisted via mcsc.gestures.actions.
  • Settings Pane Regression Suite: New Tests/SettingsPaneTests.swift loads 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 through Mirror reflection — 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

Choose a tag to compare

@github-actions github-actions released this 23 Aug 19:54
ea091e6
  • 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 activeSpaceDidChangeNotification handler in MissionControlHoverService now 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-overlay isOptimized flags. OverlayAnimationFactory deduplicates translation+scale keyframe groups; NativeSymbolEffectAnimationStrategy collapses 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 keyDown previously paid an AXUIElementCopyElementAtPosition hit-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: 1 SLWindowListCopyWindowInfo per 5 s idle sample (was 7–9; ~38 in 0.5.0-beta).
    • Pre-thread-hop frame throttle: MultitouchFrameGate throttles 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: isFrontmostWindow no longer re-creates its AXUIElementCreateApplication up to 30×/s in the title-bar hover path (pid-keyed cache).
    • Zombie-poll fix: MissionControlHoverService.deinit now invalidates windowFetchTimer — a dealloc without stop() previously kept polling windows every 0.5 s forever.
    • Smaller detection scan: Mission Control window-list copy now uses .excludeDesktopElements.
  • 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 in TestRunner.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 under mcsc.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 unsafeDowncast after 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

Choose a tag to compare

@github-actions github-actions released this 21 Aug 22:17
  • 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 .makeSmaller cursor feedback mode (arrow.down.right.and.arrow.up.left, accent palette). Adds MakeSmallerAction (WindowActions/SizeActions.swift:58) and MakeSmallerAppAction (AppActions.swift:134).
  • Lint & Style Hardening: Fixed all SwiftLint / SwiftFormat violations blocking CI (empty_count, identifier_name, line_length, cyclomatic_complexity, function_body_length). Renamed CoreDockSendNotificationcoreDockSendNotification (@_silgen_name preserved), table-drove ShortcutConfiguration.init, split ShortcutActionRouter into focused helpers. Auto-formatted 54 files.
  • Routing Refactor: ShortcutActionRouter decomposed from 57 → <25 cyclomatic complexity via routePureCmdShortcut, routeShiftTabActions, routeShiftWindowSizeActions, routeShiftDesktopActions.
  • Cursor Symbol Fix: spaceRight / spaceLeft now correctly use arrow.right/left.square.fill (was arrowshape.*.circle.fill) to match spec and fix CursorFeedbackOverlayTests.

Full Changelog: v0.5.1-beta...v0.5.2-beta

v0.5.1-beta

Choose a tag to compare

@github-actions github-actions released this 20 Aug 23:14
  • Cursor-Flash Symbol Animation Refinements: Polished every cursor feedback flash:
    • Close / Force Quit: added a .bounce.up.byLayer entry effect on top of the hover-style scale-up.
    • Minimize / Hide: base symbol now morphs from the outline minus.circle.fill / eye.slash.circle.fill into their filled counterparts via .replace.downUp.byLayer.
    • Eject: eject.fill base morphs into eject.circle.fill via .replace.magic (fallback: .downUp.wholeSymbol).
    • Tab swipes: .wiggle.byLayer now plays unconditionally (dropped the pre-macOS 26 .bounce fallback) and unused .bounce / .appear cases were removed.
    • Clipping fix: reduced the flash scale-up from 1.08× → 1.03× so glyphs no longer clip at the panel bounds.

Full Changelog: v0.5.0-beta...v0.5.1-beta

v0.5.0-beta

v0.5.0-beta Pre-release
Pre-release

Choose a tag to compare

@ShubhamJ010 ShubhamJ010 released this 20 Aug 20:32

v0.5.0-beta — Pinch-Out, Dock Parity & Fuzzy Finder Rollup

Compare: v0.4.0-betav0.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 PinchOutRecognizer extracted from BasePinchRecognizer shared base. pinch-out toggles fullscreen via kAXZoomButtonAttribute + CoreDockSendNotification("com.apple.expose.awake"), Cmd+pinch-out = New Window (Cmd+N).
  • Distinct haptic alignment → levelChange (vs levelChange → levelChange for pinch-in) and cursor feedback arrow.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%), and Pinch-Out (Fullscreen) now work when pointing at a Dock icon in Mission Control, not just window previews. GestureActionRouter previously returned .none for Dock on those paths.

Type-to-Select Fuzzy Finder (0.4.2 rollup)

  • Just type any app name in Mission Control — stateless WindowSelectionEngine ranks prefix > substring, shoulder-targets 20pt inset, injects .mouseMoved to drive macOS native blue highlight, and activates via 50 ms dwell click. HID key tap MCKeyboardTapService + Dock pill SearchBarOverlay.

Mounted Volume Auto-Eject (0.4.1 rollup)

  • Cmd+W / Cmd+Q or pinch-in / swipe-left on ejectable Finder volume window (/Volumes DMG) auto-closes + NSWorkspace.unmountAndEjectDevice with red eject.circle.fill flash. Toggle Auto-Eject Mounted Volumes.

Other highlights

  • Fullscreen Hover Button — 4th mode arrow.down…circle.fill on hover overlay + MissionControlWindowActions.performFullscreen dictionary path.
  • Tab-Close Fix — recursive AX search (depth 8, skip AXWebArea) finds AXTabGroup under AXGroup wrappers (Chrome); fallback focuses hovered window via kAXFocusedAttribute.
  • Event-Tap Resilience — auto-recreates CGEventTap on .tapDisabledByTimeout / .tapDisabledByUserInput.
  • macOS 14+ fallbacks.wiggle.bounce, .magic.upUp so animations work on 14/15.
  • MVVM ReorgModels/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

  • 8fef232 chore(release): bump to 0.5.0-beta (build 6)
  • dc0e56e docs(readme): advertise major features
  • f6647b5 feat(dock): parity gestures for tiling/fullscreen on Dock
  • c4b2de9 feat(gestures): pinch-out for fullscreen / new window and cmd+swipe-right for new tab
  • d2f1257 feat(mission-control): type-to-select fuzzy finder (0.4.2)
  • 7fbe800 feat(volume): mounted volume auto-eject (0.4.1)
  • eeee336 docs update
  • e95398f fix: macOS 14+ symbol effect fallbacks
  • a5c06cb fix(cmdw): recursive AX tab search
  • 2a5180d feat: fullscreen hover + event tap resilience
  • d180874 refactor: MVVM folder structure

Full changelog: CHANGELOG.md

MCSC 0.4.0-beta

Choose a tag to compare

@ShubhamJ010 ShubhamJ010 released this 18 Aug 14:12

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.Mode with 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

Choose a tag to compare

@ShubhamJ010 ShubhamJ010 released this 17 Aug 14:56

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 Command while hovering to switch to the minimize button (minus.circle.fill) with smooth symbol content transitions. Click to minimize.
    • Features symbol animations (.drawOn.byLayer / .appear.byLayer and .rotate.byLayer) and haptic feedback.

Fixes & Reliability

  • Bug Fix: Fixed application crash when clicking hover action buttons caused by recursive dispatch_sync execution 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

  1. Download and unzip MCSC.zip.
  2. Move MCSC.app to /Applications.
  3. Launch MCSC and grant Accessibility permission in System Settings → Privacy & Security → Accessibility.

MCSC v0.2.4-beta

Choose a tag to compare

@ShubhamJ010 ShubhamJ010 released this 12 Jul 15:12

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 deviceStop so gesture delivery survives sleep/wake cycles.
  • fix(accessibility): Dock gesture/shortcut resolution now works for non-native apps (Mac Catalyst / Electron). isDockItem and getAppFromDockItem walk up to the nearest AXDockItem ancestor and resolve the running app by bundle identifier (via the Dock item's AXURL), with a tolerant case/diacritic/whitespace-insensitive AXTitle fallback. 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).