Mission Wheel is a small macOS utility that maps a horizontal mouse wheel to the trackpad-style Mission Control gestures:
- Wheel right/up: Mission Control
- Wheel left/down: Application Windows / App Expose for the frontmost app
- After Mission Control opens, the next horizontal wheel tick in either direction selects the hovered window
- Left-click or Escape clears that pending wheel-selection state
It was built and tested for the ProtoArc EM11 Pro vertical mouse. That mouse has a side horizontal scroll wheel whose physical motion maps naturally to the macOS trackpad gesture mental model: up for Mission Control, down for Application Windows.
Mission Wheel may also work with other mice that expose a horizontal wheel to macOS as standard horizontal scroll events. It does not try to identify mouse hardware.
Mission Wheel is not affiliated with ProtoArc or Apple.
- macOS 13 or later
- Swift toolchain / Xcode command line tools for building from source
- Accessibility permission for the installed app
Recommended once, before installing:
scripts/create-signing-identity.shThat creates a local self-signed code-signing identity named Mission Wheel Signing. The installer auto-detects it so macOS can keep the Accessibility approval across rebuilds. macOS may show one-time keychain or trust prompts while creating the identity, and codesign may ask for keychain access the first time it signs the app.
scripts/install.shThe installer builds a release binary, creates an agent-style app bundle, signs it, registers a LaunchAgent, and starts it:
~/Applications/Mission Wheel.app
~/Library/LaunchAgents/com.danielbriskin.mission-wheel.plist
The app has no Dock icon or menu bar item.
On first install, macOS may prompt for Accessibility permission. If it does not, open:
System Settings > Privacy & Security > Accessibility
Enable Mission Wheel. The LaunchAgent waits for the grant and should begin reacting shortly afterward; no manual kickstart is needed just to finish the permission step.
Check status:
launchctl print gui/$UID/com.danielbriskin.mission-wheel | grep 'state ='If your mouse reports the horizontal wheel directions in the opposite order:
SWAP_DIRECTIONS=1 scripts/install.shTo tune the suppression window for repeated scroll ticks:
COOLDOWN_MS=300 scripts/install.shTo leave specific frontmost apps alone:
EXCLUDE_BUNDLE_IDS=com.apple.Terminal,com.apple.finder scripts/install.shTo sign with a specific code signing identity instead of the auto-detected Mission Wheel Signing identity:
CODESIGN_IDENTITY="Developer ID Application: Your Name" scripts/install.shIf no identity is provided or auto-detected, the installer falls back to ad-hoc signing.
If Mission Wheel appears in Accessibility but does not react, check the LaunchAgent state and logs:
launchctl print gui/$UID/com.danielbriskin.mission-wheel | grep 'state ='Installed logs:
~/Library/Logs/mission-wheel.log
~/Library/Logs/mission-wheel.err.log
For ad-hoc signed installs only: if Mission Wheel appears in Accessibility but does not react after a rebuild, macOS may be holding a stale approval for the previous code hash:
tccutil reset Accessibility com.danielbriskin.mission-wheel
scripts/install.shThen enable Mission Wheel again in Accessibility. To avoid this after the first approval, create the stable local signing identity with scripts/create-signing-identity.sh and reinstall.
Useful diagnostics:
swift run mission-wheel check
swift run mission-wheel --help
swift run mission-wheel listen
swift run -c release mission-wheel trigger-application-windows
swift run -c release mission-wheel trigger-mission-control
swift run -c release mission-wheel run --debug
swift run -c release mission-wheel run --exclude-bundle-id com.apple.TerminalRuntime run options include --cooldown-ms <ms>, --swap-directions, --exclude-bundle-id <id> (repeatable, comma-separated accepted), and --debug.
scripts/uninstall.shswift test
swift build -c releaseMIT