38 lines
1.8 KiB
Markdown
38 lines
1.8 KiB
Markdown
# Capswitch Design
|
|
|
|
Capswitch is a small native macOS menu-bar application for a user who wants physical Caps Lock to cycle keyboard layouts without the stock input-source shortcut HUD or animation.
|
|
|
|
## Intent
|
|
|
|
On a plain Caps gesture, suppress the system Caps Lock event and switch to the next enabled keyboard input source on Caps release. Reserve Caps+Option for the real Caps Lock behavior.
|
|
|
|
## Goals
|
|
|
|
- Global Caps interception through Accessibility-authorized CGEventTap.
|
|
- Plain Caps switches once on release.
|
|
- Caps+Option toggles real Caps Lock in either key order.
|
|
- Input sources are selected directly through Carbon TIS APIs.
|
|
- Menu-bar indicator shows the current input source and permission state.
|
|
- Build and bundle from Taskfile/CLI on macOS without an Xcode project.
|
|
|
|
## Non-goals
|
|
|
|
- Replacing or modifying macOS input-source configuration.
|
|
- Supporting App Store sandbox or notarized distribution in the MVP.
|
|
- Implementing a full preferences window.
|
|
- Supporting arbitrary remapping beyond Caps and Caps+Option.
|
|
|
|
## Interaction Contract
|
|
|
|
The event tap suppresses Caps down/up events. It records whether Option was already down or became active while Caps is held. On Caps release, no Option seen selects the next source; any Option seen schedules a synthetic clean Caps down/up. If Option remains held, the synthetic Caps event is posted when Option is released.
|
|
|
|
## Platform Contract
|
|
|
|
- Swift 5-compatible source targeting macOS 14.0+.
|
|
- AppKit status item, CoreGraphics event tap, ApplicationServices Accessibility check, Carbon TIS input source APIs.
|
|
- Stable bundle identifier \`dev.local.Capswitch\`.
|
|
- \`LSUIElement=true\` so the app has no Dock icon.
|
|
|
|
## Verification
|
|
|
|
Linux may run only platform-independent/static checks because the remote host has no Swift/macOS SDK. The authoritative build and XCTest run are on macOS 14.8.9 with Command Line Tools installed.
|