Merge pull request #206 from rizwankce/feature/toggle-running-hotkey
Add global keyboard shortcut to toggle On/Off
This commit is contained in:
@ -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
|
||||||
|
Reference in New Issue
Block a user