diff --git a/Lib/Magnet/KeyCombo.swift b/Lib/Magnet/KeyCombo.swift index 6e08fad..c50b4d2 100644 --- a/Lib/Magnet/KeyCombo.swift +++ b/Lib/Magnet/KeyCombo.swift @@ -22,15 +22,27 @@ public final class KeyCombo: NSObject, NSCopying, NSCoding, Codable { guard !doubledModifiers else { return 0 } return Int(key.QWERTYKeyCode) } + /// The QWERTY key equivalent of this key combo's key code. Using a different keyboard layout, this + /// will not match the typed character. Use `keyEquivalent` instead. + public var QWERTYKeyLabel: String { + guard !doubledModifiers else { return "" } + let keyCode = Int(Sauce.shared.keyCode(for: key)) + guard key.isAlphabet else { return Sauce.shared.character(for: keyCode, cocoaModifiers: []) ?? "" } + let modifiers = NSEvent.ModifierFlags(carbonModifiers: self.modifiers).filterNotShiftModifiers() + return Sauce.shared.character(for: keyCode, cocoaModifiers: modifiers) ?? "" + } public var characters: String { guard !doubledModifiers else { return "" } return Sauce.shared.character(for: Int(Sauce.shared.keyCode(for: key)), carbonModifiers: modifiers) ?? "" } + /// Character that would be typed in a text field when the user presses the key. + /// Use this for `NSMenuItem`'s `keyEquivalent` which expects the character and not the QWERTY key code. public var keyEquivalent: String { guard !doubledModifiers else { return "" } - let keyCode = Int(Sauce.shared.keyCode(for: key)) + // Not calling `Sauce.shared.keyCode` skips translation of the current layout + let keyCode = Int(key.QWERTYKeyCode) guard key.isAlphabet else { return Sauce.shared.character(for: keyCode, cocoaModifiers: []) ?? "" } - let modifiers = keyEquivalentModifierMask.filterNotShiftModifiers() + let modifiers = NSEvent.ModifierFlags(carbonModifiers: self.modifiers).filterNotShiftModifiers() return Sauce.shared.character(for: keyCode, cocoaModifiers: modifiers) ?? "" } public var keyEquivalentModifierMask: NSEvent.ModifierFlags { diff --git a/Lib/MagnetTests/KeyComboTests.swift b/Lib/MagnetTests/KeyComboTests.swift index 2c76a70..c1c6677 100644 --- a/Lib/MagnetTests/KeyComboTests.swift +++ b/Lib/MagnetTests/KeyComboTests.swift @@ -93,31 +93,31 @@ final class KeyComboTests: XCTestCase { var keyCombo: KeyCombo? // Command + a keyCombo = KeyCombo(key: .a, cocoaModifiers: [.command]) - XCTAssertEqual(keyCombo?.keyEquivalent, "a") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "a") // Shift + a keyCombo = KeyCombo(key: .a, cocoaModifiers: [.shift]) - XCTAssertEqual(keyCombo?.keyEquivalent, "A") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "A") // Option + a keyCombo = KeyCombo(key: .a, cocoaModifiers: [.option]) - XCTAssertEqual(keyCombo?.keyEquivalent, "a") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "a") // Option + Shift + a keyCombo = KeyCombo(key: .a, cocoaModifiers: [.option, .shift]) - XCTAssertEqual(keyCombo?.keyEquivalent, "A") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "A") // Option + Shift + 1 keyCombo = KeyCombo(key: .one, cocoaModifiers: [.option, .shift]) - XCTAssertEqual(keyCombo?.keyEquivalent, "1") // Option + Shift + Keypad 1 + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "1") keyCombo = KeyCombo(key: .keypadOne, cocoaModifiers: [.option, .shift]) - XCTAssertEqual(keyCombo?.keyEquivalent, "1") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "1") // Option + ; keyCombo = KeyCombo(key: .semicolon, cocoaModifiers: [.option]) - XCTAssertEqual(keyCombo?.keyEquivalent, ";") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, ";") // Shift + F1 keyCombo = KeyCombo(key: .f1, cocoaModifiers: [.shift]) - XCTAssertEqual(keyCombo?.keyEquivalent, "F1") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "F1") // Option double tap keyCombo = KeyCombo(doubledCocoaModifiers: .option) - XCTAssertEqual(keyCombo?.keyEquivalent, "") + XCTAssertEqual(keyCombo?.QWERTYKeyLabel, "") } func testKeyEquivalentModifierMaskString() {