Global Shortcuts for macOS written in Swift.
- Development with Xcode 16.0+
- Written in Swift 6.0
- Compatible with macOS 13.5+
This library does not collect or track user information, so it does not include a PrivacyInfo.xcprivacy file.
Demo App is in this Project.
- Register a shortcut
Set ⌘ + A shortcut.
letkey=Key.a
letmodifierFlags=ModifierFlags.cmd
letkeyCombo=KeyCombination(key, modifierFlags)letspiceKey=SpiceKey(keyCombo, keyDownHandler:{
// process (key down)
}, keyUpHandler:{
// process (key up)
})
spiceKey.register()Set press both side of ⌘ shortcut.
letflag=ModifierFlag.command
letspiceKey=SpiceKey(flag, bothModifierKeysPressHandler:{
// process (press)
}, releaseKeyHandler:{
// process (release)
})
spiceKey.register()Set long press ⌘ shortcut.
// run after 0.6 sec
letflags=ModifierFlags.cmd
letspiceKey=SpiceKey(flags, interval:0.6, modifierKeysLongPressHandler:{
// process (press)
}, releaseKeyHandler:{
// process (release)
})
spiceKey.register()- Create a Key and a ModifierFlags from NSEvent.
func example(event:NSEvent){letkey=Key(keyCode: event.keyCode)letflags= event.modifierFlags.intersection(.deviceIndependentFlagsMask)letmodifierFlags=ModifierFlags(flags: flags)}- Get a description of the shortcut
letdescription= modifierFlags.string + key.string
// or
letdescription= keyCombination.string- Unregister a shortcut
spiceKey.unregister()- Save shortcut
SpiceKeyData supports NSCoding & Codable.
letkey=Key.a
letflags=ModifierFlags.optCmd
letspiceKey=SpiceKey(...)letspiceKeyData=SpiceKeyData(
_ primaryKey: String,
_ keyCode: CGKeyCode, // key.keyCode
_ control: Bool, // flags.containsControl
_ option: Bool, // flags.containsOption
_ shift: Bool, // flags.containsShift
_ command: Bool, // flags.containsCommand
_ spiceKey: SpiceKey // spiceKey
)
// OR
letspiceKeyData=SpiceKeyData(
_ primaryKey: String,
_ key: Key,
_ modifierFlags: ModifierFlags,
_ spiceKey: SpiceKey
)
// OR
letspiceKeyData=SpiceKeyData(
_ primaryKey: String,
_ keyCombination: KeyCombination,
_ spiceKey: SpiceKey
)
// NSCoding
letdata=try!NSKeyedArchiver.archivedData(
withRootObject: spiceKeyData,
requiringSecureCoding:false)UserDefaults.standard.set(data, forKey:"spiceKeyData")
// Codable
letdata=try!JSONEncoder().encode(spiceKeyData)UserDefaults.standard.set(data, forKey:"spiceKeyData")- Load shortcut
// NSCoding
letdata=UserDefaults.standard.data(forKey:"spiceKeyData")!
letspiceKeyData=try!NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)as!SpiceKeyData
// Codable
letdata=UserDefaults.standard.data(forKey:"spiceKeyData")!
letspiceKeyData=try!JSONDecoder().decode(SpiceKeyData.self, from: data)