From af002c541f66758562b5a082b8290bf622390ff8 Mon Sep 17 00:00:00 2001 From: Shimpei Otsubo Date: Sun, 23 Aug 2020 12:17:10 +0900 Subject: [PATCH 1/4] Simplify --- KeyType/Key/KeyCombination.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/KeyType/Key/KeyCombination.swift b/KeyType/Key/KeyCombination.swift index a94afd6..badc0de 100644 --- a/KeyType/Key/KeyCombination.swift +++ b/KeyType/Key/KeyCombination.swift @@ -52,12 +52,8 @@ class KeyCombination { return addMask(.maskAlternate) } - private func setModeExAddition() { - addToWithFlag = false - } - var without: KeyCombination { - setModeExAddition() + addToWithFlag = false return self } From 0afa9c97af0a9b0e4cbd281fb84d64872c7694dc Mon Sep 17 00:00:00 2001 From: Shimpei Otsubo Date: Sun, 23 Aug 2020 12:36:02 +0900 Subject: [PATCH 2/4] Refactor to write simpler --- KeyType/Collection/Custom.swift | 2 +- KeyType/Collection/Emacs.swift | 19 ++++++------ KeyType/Collection/KanaEisu.swift | 4 +-- KeyType/Key/Key.swift | 12 ++++---- KeyType/Key/KeyCombination.swift | 48 ++++++++++++++++++------------- KeyType/Key/Remap.swift | 7 ++++- KeyType/KeyEventWatcher.swift | 2 +- 7 files changed, 53 insertions(+), 41 deletions(-) diff --git a/KeyType/Collection/Custom.swift b/KeyType/Collection/Custom.swift index f283964..3d04630 100644 --- a/KeyType/Collection/Custom.swift +++ b/KeyType/Collection/Custom.swift @@ -12,7 +12,7 @@ let Custom = [ // To launch Alfred faster Remap(Key.shiftR.without.shift, to: Key.SPACE.with.option), // Left to 'a' becomes escape - Remap(Key.ctrlR.without.ctrl, to: Key.ESCAPE.alone), + Remap(Key.ctrlR.without.ctrl, to: Key.ESCAPE), // To launch OmniFocus faster Remap(Key.shiftL.without.shift, to: Key.SPACE.with.shift.command.option), ] diff --git a/KeyType/Collection/Emacs.swift b/KeyType/Collection/Emacs.swift index 97b8970..56a074e 100644 --- a/KeyType/Collection/Emacs.swift +++ b/KeyType/Collection/Emacs.swift @@ -8,13 +8,12 @@ import Foundation -let Emacs = [ - [Key.ctrlL.without.ctrl, Key.ESCAPE.alone], - [Key.J.with.ctrl, Key.RETURN.alone], - [Key.M.with.ctrl, Key.RETURN.alone], - [Key.F.with.ctrl, Key.RIGHT_ARROW.alone], - [Key.B.with.ctrl, Key.LEFT_ARROW.alone], - [Key.N.with.ctrl, Key.DOWN_ARROW.alone], - [Key.P.with.ctrl, Key.UP_ARROW.alone], - [Key.H.with.ctrl, Key.DELETE.alone], -].map { Remap($0[0], to: $0[1]) } +let EmacsLike = [ + Remap(Key.J.with.ctrl, to: .returnKey), + Remap(Key.M.with.ctrl, to: .returnKey), + Remap(Key.F.with.ctrl, to: .rightArrow), + Remap(Key.B.with.ctrl, to: .leftArrow), + Remap(Key.N.with.ctrl, to: .downArrow), + Remap(Key.P.with.ctrl, to: .upArrow), + Remap(Key.H.with.ctrl, to: .delete), +] diff --git a/KeyType/Collection/KanaEisu.swift b/KeyType/Collection/KanaEisu.swift index 661f4ae..d7f0167 100644 --- a/KeyType/Collection/KanaEisu.swift +++ b/KeyType/Collection/KanaEisu.swift @@ -9,6 +9,6 @@ import Foundation let KanaEisu: KeyMapCollection = [ - Remap(Key.commandL.without.command, to: Key.EISU.alone), - Remap(Key.commandR.without.command, to: Key.KANA.alone), + Remap(Key.commandL.without.command, to: Key.EISU), + Remap(Key.commandR.without.command, to: Key.KANA), ] diff --git a/KeyType/Key/Key.swift b/KeyType/Key/Key.swift index 58bcd4d..1894e0f 100644 --- a/KeyType/Key/Key.swift +++ b/KeyType/Key/Key.swift @@ -45,7 +45,7 @@ enum Key: UInt16 { case SQUARE_BRA = 33 case I = 34 case P = 35 - case RETURN = 36 + case returnKey = 36 case L = 37 case J = 38 case QUOTE = 39 @@ -60,7 +60,7 @@ enum Key: UInt16 { case TAB = 48 case SPACE = 49 case BACKQUOTE = 50 - case DELETE = 51 + case delete = 51 case ENTER_POWERBOOK = 52 case ESCAPE = 53 case commandR = 54 @@ -123,10 +123,10 @@ enum Key: UInt16 { case F2 = 120 case PG_DOWN = 121 case F1 = 122 - case LEFT_ARROW = 123 - case RIGHT_ARROW = 124 - case DOWN_ARROW = 125 - case UP_ARROW = 126 + case leftArrow = 123 + case rightArrow = 124 + case downArrow = 125 + case upArrow = 126 case PC_POWER = 127 case GERMAN_PC_LESS_THAN = 128 case DASHBOARD = 130 diff --git a/KeyType/Key/KeyCombination.swift b/KeyType/Key/KeyCombination.swift index badc0de..58f4709 100644 --- a/KeyType/Key/KeyCombination.swift +++ b/KeyType/Key/KeyCombination.swift @@ -10,7 +10,7 @@ import Cocoa class KeyCombination { let keyCode: CGKeyCode - var flags = CGEventFlags() + private(set) var withFlags = CGEventFlags() private var withoutFlags = CGEventFlags() private var addToWithFlag = true @@ -20,7 +20,7 @@ class KeyCombination { init(fromEvent: CGEvent) { keyCode = fromEvent.keyCode - flags = fromEvent.flags + withFlags = fromEvent.flags } init(_ key: Key) { @@ -29,7 +29,7 @@ class KeyCombination { private func addMask(_ mask: CGEventFlags) -> KeyCombination { if addToWithFlag { - flags.insert(mask) + withFlags.insert(mask) } else { withoutFlags.insert(mask) } @@ -57,33 +57,23 @@ class KeyCombination { return self } + var with: KeyCombination { + addToWithFlag = true + return self + } + var label: String { guard let key = Key(rawValue: keyCode) else { return flagString } return flagString + String(describing: key) } - private var flagString: String { - var flagString = "" - if has(modifier: .maskSecondaryFn) { flagString += "(fn)" } - if has(modifier: .maskAlphaShift) { flagString += "⇪" } - if has(modifier: .maskCommand) { flagString += "⌘" } - if has(modifier: .maskShift) { flagString += "⇧" } - if has(modifier: .maskControl) { flagString += "⌃" } - if has(modifier: .maskAlternate) { flagString += "⌥" } - return flagString - } - - private func has(modifier key: CGEventFlags) -> Bool { - return flags.contains(key) - } - func postEvent() { let loc = CGEventTapLocation.cghidEventTap let keyDownEvent = CGEvent(keyboardEventSource: nil, virtualKey: keyCode, keyDown: true)! let keyUpEvent = CGEvent(keyboardEventSource: nil, virtualKey: keyCode, keyDown: false)! - keyDownEvent.flags = flags + keyDownEvent.flags = withFlags keyUpEvent.flags = CGEventFlags() keyDownEvent.post(tap: loc) @@ -99,6 +89,24 @@ class KeyCombination { if cmb.has(modifier: .maskSecondaryFn), !has(modifier: .maskSecondaryFn) { return false } if cmb.has(modifier: .maskAlphaShift), !has(modifier: .maskAlphaShift) { return false } - return mapping.hasAnyModToAvoid(flags) + return mapping.hasAnyModToAvoid(withFlags) + } +} + +// Debug +extension KeyCombination { + private var flagString: String { + var flagString = "" + if has(modifier: .maskSecondaryFn) { flagString += "(fn)" } + if has(modifier: .maskAlphaShift) { flagString += "⇪" } + if has(modifier: .maskCommand) { flagString += "⌘" } + if has(modifier: .maskShift) { flagString += "⇧" } + if has(modifier: .maskControl) { flagString += "⌃" } + if has(modifier: .maskAlternate) { flagString += "⌥" } + return flagString + } + + private func has(modifier key: CGEventFlags) -> Bool { + return withFlags.contains(key) } } diff --git a/KeyType/Key/Remap.swift b/KeyType/Key/Remap.swift index 9466b35..0e7d31b 100644 --- a/KeyType/Key/Remap.swift +++ b/KeyType/Key/Remap.swift @@ -18,8 +18,13 @@ class Remap: NSObject { self.output = output } + init(_ from: KeyCombination, to output: Key) { + input = from + self.output = output.alone + } + func renderEventFlag(for event: CGEvent) -> CGEventFlags { - let rawValue = (event.flags.rawValue & ~input.flags.rawValue) | output.flags.rawValue + let rawValue = (event.flags.rawValue & ~input.withFlags.rawValue) | output.withFlags.rawValue return CGEventFlags(rawValue: rawValue) } diff --git a/KeyType/KeyEventWatcher.swift b/KeyType/KeyEventWatcher.swift index 726815e..970be1a 100644 --- a/KeyType/KeyEventWatcher.swift +++ b/KeyType/KeyEventWatcher.swift @@ -11,7 +11,7 @@ import Cocoa class KeyEventWatcher { private var keyCode: CGKeyCode? private let bundleId = Bundle.main.infoDictionary?["CFBundleIdentifier"] as? String - private let config = EventConverter(LRDvorak + KanaEisu + Emacs + Custom) + private let config = EventConverter(LRDvorak + KanaEisu + EmacsLike + Custom) private var eventMaskToWatch: CGEventMask { let eventTypeList: [CGEventType] = [ From 3dca5187a7bf4e0a92269489adb281c1934f1850 Mon Sep 17 00:00:00 2001 From: Shimpei Otsubo Date: Sun, 23 Aug 2020 16:14:36 +0900 Subject: [PATCH 3/4] Refactor --- KeyType/EventConverter.swift | 2 +- KeyType/Key/KeyCombination.swift | 31 +++++++++++++------------- KeyType/Key/Remap.swift | 4 ---- KeyTypeTests/KeyCombinationTests.swift | 4 ++++ 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/KeyType/EventConverter.swift b/KeyType/EventConverter.swift index bf631b8..575991b 100644 --- a/KeyType/EventConverter.swift +++ b/KeyType/EventConverter.swift @@ -35,7 +35,7 @@ class EventConverter { } for remap in candidateRemaps { - if eventKeyCombination.isCompatible(with: remap) { + if eventKeyCombination.isCompatible(with: remap.input) { event.keyCode = remap.outputKeyCode event.flags = remap.renderEventFlag(for: event) return event diff --git a/KeyType/Key/KeyCombination.swift b/KeyType/Key/KeyCombination.swift index 58f4709..4a0d9cf 100644 --- a/KeyType/Key/KeyCombination.swift +++ b/KeyType/Key/KeyCombination.swift @@ -14,10 +14,6 @@ class KeyCombination { private var withoutFlags = CGEventFlags() private var addToWithFlag = true - var withoutModifier: CGEventFlags { - return withoutFlags - } - init(fromEvent: CGEvent) { keyCode = fromEvent.keyCode withFlags = fromEvent.flags @@ -62,11 +58,6 @@ class KeyCombination { return self } - var label: String { - guard let key = Key(rawValue: keyCode) else { return flagString } - return flagString + String(describing: key) - } - func postEvent() { let loc = CGEventTapLocation.cghidEventTap @@ -80,8 +71,7 @@ class KeyCombination { keyUpEvent.post(tap: loc) } - func isCompatible(with mapping: Remap) -> Bool { - let cmb = mapping.input + func isCompatible(with cmb: KeyCombination) -> Bool { if cmb.has(modifier: .maskCommand), !has(modifier: .maskCommand) { return false } if cmb.has(modifier: .maskShift), !has(modifier: .maskShift) { return false } if cmb.has(modifier: .maskControl), !has(modifier: .maskControl) { return false } @@ -89,12 +79,25 @@ class KeyCombination { if cmb.has(modifier: .maskSecondaryFn), !has(modifier: .maskSecondaryFn) { return false } if cmb.has(modifier: .maskAlphaShift), !has(modifier: .maskAlphaShift) { return false } - return mapping.hasAnyModToAvoid(withFlags) + return cmb.hasAnyModToAvoid(withFlags) + } + + private func hasAnyModToAvoid(_ flags: CGEventFlags) -> Bool { + return flags.rawValue & withoutFlags.rawValue == 0 + } + + private func has(modifier key: CGEventFlags) -> Bool { + return withFlags.contains(key) } } // Debug extension KeyCombination { + var label: String { + guard let key = Key(rawValue: keyCode) else { return flagString } + return flagString + String(describing: key) + } + private var flagString: String { var flagString = "" if has(modifier: .maskSecondaryFn) { flagString += "(fn)" } @@ -105,8 +108,4 @@ extension KeyCombination { if has(modifier: .maskAlternate) { flagString += "⌥" } return flagString } - - private func has(modifier key: CGEventFlags) -> Bool { - return withFlags.contains(key) - } } diff --git a/KeyType/Key/Remap.swift b/KeyType/Key/Remap.swift index 0e7d31b..772a48b 100644 --- a/KeyType/Key/Remap.swift +++ b/KeyType/Key/Remap.swift @@ -27,8 +27,4 @@ class Remap: NSObject { let rawValue = (event.flags.rawValue & ~input.withFlags.rawValue) | output.withFlags.rawValue return CGEventFlags(rawValue: rawValue) } - - func hasAnyModToAvoid(_ flags: CGEventFlags) -> Bool { - return flags.rawValue & input.withoutModifier.rawValue == 0 - } } diff --git a/KeyTypeTests/KeyCombinationTests.swift b/KeyTypeTests/KeyCombinationTests.swift index 780ea5d..32c1d77 100644 --- a/KeyTypeTests/KeyCombinationTests.swift +++ b/KeyTypeTests/KeyCombinationTests.swift @@ -18,6 +18,10 @@ class KeyCombinationTests: XCTestCase { XCTAssert(convert(KanaEisu, key: Key.commandR)?.keyCode == Key.KANA.rawValue) } + func testChain() { + XCTAssertFalse(Key.commandR.without.command.withFlags.contains(.maskCommand)) + } + private func convert(_ collection: KeyMapCollection, key: Key) -> CGEvent? { let converter = EventConverter(collection) let event = CGEvent( From fd62ebe604f5809b7cfae54f2c2556bb8a8e44f0 Mon Sep 17 00:00:00 2001 From: Shimpei Otsubo Date: Sun, 23 Aug 2020 17:15:47 +0900 Subject: [PATCH 4/4] Rename --- KeyType/EventConverter.swift | 2 +- KeyType/Key/KeyCombination.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/KeyType/EventConverter.swift b/KeyType/EventConverter.swift index 575991b..3fb6a17 100644 --- a/KeyType/EventConverter.swift +++ b/KeyType/EventConverter.swift @@ -35,7 +35,7 @@ class EventConverter { } for remap in candidateRemaps { - if eventKeyCombination.isCompatible(with: remap.input) { + if eventKeyCombination.canTrigger(remap.input) { event.keyCode = remap.outputKeyCode event.flags = remap.renderEventFlag(for: event) return event diff --git a/KeyType/Key/KeyCombination.swift b/KeyType/Key/KeyCombination.swift index 4a0d9cf..aba238e 100644 --- a/KeyType/Key/KeyCombination.swift +++ b/KeyType/Key/KeyCombination.swift @@ -71,7 +71,7 @@ class KeyCombination { keyUpEvent.post(tap: loc) } - func isCompatible(with cmb: KeyCombination) -> Bool { + func canTrigger(_ cmb: KeyCombination) -> Bool { if cmb.has(modifier: .maskCommand), !has(modifier: .maskCommand) { return false } if cmb.has(modifier: .maskShift), !has(modifier: .maskShift) { return false } if cmb.has(modifier: .maskControl), !has(modifier: .maskControl) { return false } @@ -85,7 +85,7 @@ class KeyCombination { private func hasAnyModToAvoid(_ flags: CGEventFlags) -> Bool { return flags.rawValue & withoutFlags.rawValue == 0 } - + private func has(modifier key: CGEventFlags) -> Bool { return withFlags.contains(key) }