Merge pull request #206 from rizwankce/feature/toggle-running-hotkey

Add global keyboard shortcut to toggle On/Off
This commit is contained in:
Qiu Yuzhou
2017-01-13 23:33:14 +08:00
committed by GitHub

View File

@ -19,7 +19,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
var editUserRulesWinCtrl: UserRulesController! var editUserRulesWinCtrl: UserRulesController!
var httpPreferencesWinCtrl : HTTPPreferencesWindowController! var httpPreferencesWinCtrl : HTTPPreferencesWindowController!
let keyCode = kVK_ANSI_P let keyCodeP = kVK_ANSI_P
let keyCodeS = kVK_ANSI_S
let modifierKeys = cmdKey+controlKey let modifierKeys = cmdKey+controlKey
var hotKeyRef: EventHotKeyRef? var hotKeyRef: EventHotKeyRef?
@ -238,10 +239,26 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
// MARK: - Hotkey Methods // MARK: - Hotkey Methods
func registerHotkey() -> Void { func registerHotkey() -> Void {
registerEventHotKey(keyCode: UInt32(keyCodeP)) // to toggle PAC and Global Mode
registerEventHotKey(keyCode: UInt32(keyCodeS)) // to toggle SS on or off
registerEventHandler()
}
func registerEventHotKey(keyCode: UInt32) {
var gMyHotKeyID = EventHotKeyID() var gMyHotKeyID = EventHotKeyID()
gMyHotKeyID.signature = OSType(fourCharCodeFrom(string: "sxng")) gMyHotKeyID.signature = OSType(fourCharCodeFrom(string: "sxng"))
gMyHotKeyID.id = UInt32(keyCode) gMyHotKeyID.id = keyCode
// Register hotkey.
RegisterEventHotKey(UInt32(keyCode),
UInt32(modifierKeys),
gMyHotKeyID,
GetApplicationEventTarget(),
0,
&hotKeyRef)
}
func registerEventHandler() {
var eventType = EventTypeSpec() var eventType = EventTypeSpec()
eventType.eventClass = OSType(kEventClassKeyboard) eventType.eventClass = OSType(kEventClassKeyboard)
eventType.eventKind = OSType(kEventHotKeyPressed) eventType.eventKind = OSType(kEventHotKeyPressed)
@ -254,18 +271,39 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
// Extract pointer to `self` from void pointer: // Extract pointer to `self` from void pointer:
let mySelf = Unmanaged<AppDelegate>.fromOpaque(userContext!).takeUnretainedValue() let mySelf = Unmanaged<AppDelegate>.fromOpaque(userContext!).takeUnretainedValue()
switch Globals.proxyType { var hotKeyId = EventHotKeyID()
case .pac: GetEventParameter(theEvent, EventParamName(kEventParamDirectObject), EventParamType(typeEventHotKeyID), nil, MemoryLayout<EventHotKeyID>.size, nil, &hotKeyId)
Globals.proxyType = .global
UserDefaults.standard.setValue("global", forKey: "ShadowsocksRunningMode") if hotKeyId.id == UInt32(mySelf.keyCodeP) {
mySelf.isNameTextField.stringValue = "Gobal Mode" // P key pressed
mySelf.updateRunningModeMenu() switch Globals.proxyType {
mySelf.applyConfig() case .pac:
case .global: Globals.proxyType = .global
Globals.proxyType = .pac UserDefaults.standard.setValue("global", forKey: "ShadowsocksRunningMode")
UserDefaults.standard.setValue("auto", forKey: "ShadowsocksRunningMode") mySelf.isNameTextField.stringValue = "Gobal Mode"
mySelf.isNameTextField.stringValue = "Auto Mode" mySelf.updateRunningModeMenu()
mySelf.updateRunningModeMenu() mySelf.applyConfig()
case .global:
Globals.proxyType = .pac
UserDefaults.standard.setValue("auto", forKey: "ShadowsocksRunningMode")
mySelf.isNameTextField.stringValue = "Auto Mode"
mySelf.updateRunningModeMenu()
mySelf.applyConfig()
}
}
else if hotKeyId.id == UInt32(mySelf.keyCodeS) {
// S key pressed
var isOn = UserDefaults.standard.bool(forKey: "ShadowsocksOn")
isOn = !isOn
if isOn {
mySelf.isNameTextField.stringValue = "Shadowsocks: On".localized
}
else {
mySelf.isNameTextField.stringValue = "Shadowsocks: Off".localized
}
UserDefaults.standard.set(isOn, forKey: "ShadowsocksOn")
mySelf.updateMainMenu()
mySelf.applyConfig() mySelf.applyConfig()
} }
@ -273,16 +311,9 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
return noErr return noErr
}, 1, &eventType, context, nil) }, 1, &eventType, context, nil)
// Register hotkey.
RegisterEventHotKey(UInt32(keyCode),
UInt32(modifierKeys),
gMyHotKeyID,
GetApplicationEventTarget(),
0,
&hotKeyRef)
} }
func fourCharCodeFrom(string: String) -> FourCharCode { func fourCharCodeFrom(string: String) -> FourCharCode {
assert(string.characters.count == 4, "String length must be 4") assert(string.characters.count == 4, "String length must be 4")
var result: FourCharCode = 0 var result: FourCharCode = 0
@ -666,7 +697,7 @@ extension AppDelegate {
} }
func setupHud() -> Void { func setupHud() -> Void {
isNameTextField.stringValue = "Global Mode" isNameTextField.stringValue = "Shadowsocks: Off"
isNameTextField.sizeToFit() isNameTextField.sizeToFit()
var labelFrame: CGRect = isNameTextField.frame var labelFrame: CGRect = isNameTextField.frame