Skip to content

Commit

Permalink
More character support and a few more keys
Browse files Browse the repository at this point in the history
  • Loading branch information
mattmassicotte committed Nov 17, 2021
1 parent 0dea07b commit c55f9d4
Show file tree
Hide file tree
Showing 4 changed files with 205 additions and 3 deletions.
3 changes: 0 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
[![Github CI](https://github.com/ChimeHQ/KeyCodes/workflows/CI/badge.svg)](https://github.com/ChimeHQ/KeyCodes/actions)


# KeyCodes

Versions of `UIKey`, `UIKeyboardHIDUsage`, and `UIKeyModifierFlags` that work with AppKit's `NSEvent`. No need for Carbon.HIToolbox. Aside from being a nicer API to work with, these versions should make it possible to more easily write source-compatible AppKit/UIKit keyboard handling code. Yes, this is basically a gigantic switch statement.

These structures are particularly helpful for writing tests. Constructing `NSEvent` instances by hand is a pain.

⚠️ Not all keycodes are mapped yet. There are a lot.

## Integration

### Swift Package Manager
Expand Down
116 changes: 116 additions & 0 deletions Sources/KeyCodes/Key.swift
Original file line number Diff line number Diff line change
Expand Up @@ -234,54 +234,129 @@ public struct Key {
self.modifierFlags = [.shift]
case "b":
self.keyCode = .keyboardB
case "B":
self.keyCode = .keyboardB
self.modifierFlags = [.shift]
case "c":
self.keyCode = .keyboardC
case "C":
self.keyCode = .keyboardC
self.modifierFlags = [.shift]
case "d":
self.keyCode = .keyboardD
case "D":
self.keyCode = .keyboardD
self.modifierFlags = [.shift]
case "e":
self.keyCode = .keyboardE
case "E":
self.keyCode = .keyboardE
self.modifierFlags = [.shift]
case "f":
self.keyCode = .keyboardF
case "F":
self.keyCode = .keyboardF
self.modifierFlags = [.shift]
case "g":
self.keyCode = .keyboardG
case "G":
self.keyCode = .keyboardG
self.modifierFlags = [.shift]
case "h":
self.keyCode = .keyboardH
case "H":
self.keyCode = .keyboardH
self.modifierFlags = [.shift]
case "i":
self.keyCode = .keyboardI
case "I":
self.keyCode = .keyboardI
self.modifierFlags = [.shift]
case "j":
self.keyCode = .keyboardJ
case "J":
self.keyCode = .keyboardJ
self.modifierFlags = [.shift]
case "k":
self.keyCode = .keyboardK
case "K":
self.keyCode = .keyboardK
self.modifierFlags = [.shift]
case "l":
self.keyCode = .keyboardL
case "L":
self.keyCode = .keyboardL
self.modifierFlags = [.shift]
case "m":
self.keyCode = .keyboardM
case "M":
self.keyCode = .keyboardM
self.modifierFlags = [.shift]
case "n":
self.keyCode = .keyboardN
case "N":
self.keyCode = .keyboardN
self.modifierFlags = [.shift]
case "o":
self.keyCode = .keyboardO
case "O":
self.keyCode = .keyboardO
self.modifierFlags = [.shift]
case "p":
self.keyCode = .keyboardP
case "P":
self.keyCode = .keyboardP
self.modifierFlags = [.shift]
case "q":
self.keyCode = .keyboardQ
case "Q":
self.keyCode = .keyboardQ
self.modifierFlags = [.shift]
case "r":
self.keyCode = .keyboardR
case "R":
self.keyCode = .keyboardR
self.modifierFlags = [.shift]
case "s":
self.keyCode = .keyboardS
case "S":
self.keyCode = .keyboardS
self.modifierFlags = [.shift]
case "t":
self.keyCode = .keyboardT
case "T":
self.keyCode = .keyboardT
self.modifierFlags = [.shift]
case "u":
self.keyCode = .keyboardU
case "U":
self.keyCode = .keyboardU
self.modifierFlags = [.shift]
case "v":
self.keyCode = .keyboardV
case "V":
self.keyCode = .keyboardV
self.modifierFlags = [.shift]
case "w":
self.keyCode = .keyboardW
case "W":
self.keyCode = .keyboardW
self.modifierFlags = [.shift]
case "x":
self.keyCode = .keyboardX
case "X":
self.keyCode = .keyboardX
self.modifierFlags = [.shift]
case "y":
self.keyCode = .keyboardY
case "Y":
self.keyCode = .keyboardY
self.modifierFlags = [.shift]
case "z":
self.keyCode = .keyboardZ
case "Z":
self.keyCode = .keyboardZ
self.modifierFlags = [.shift]

case "1":
self.keyCode = .keyboard1
Expand Down Expand Up @@ -349,6 +424,47 @@ public struct Key {
case ">":
self.keyCode = .keyboardPeriod
self.modifierFlags = [.shift]
case "`":
self.keyCode = .keyboardGraveAccentAndTilde
case "~":
self.keyCode = .keyboardGraveAccentAndTilde
self.modifierFlags = [.shift]
case "=":
self.keyCode = .keyboardEqualSign
case "+":
self.keyCode = .keyboardEqualSign
self.modifierFlags = [.shift]
case "[":
self.keyCode = .keyboardOpenBracket
case "{":
self.keyCode = .keyboardOpenBracket
self.modifierFlags = [.shift]
case "]":
self.keyCode = .keyboardCloseBracket
case "}":
self.keyCode = .keyboardCloseBracket
self.modifierFlags = [.shift]
case "\\":
self.keyCode = .keyboardBackslash
case "|":
self.keyCode = .keyboardBackslash
self.modifierFlags = [.shift]
case ";":
self.keyCode = .keyboardSemicolon
case ":":
self.keyCode = .keyboardSemicolon
self.modifierFlags = [.shift]
case "'":
self.keyCode = .keyboardQuote
case "\"":
self.keyCode = .keyboardQuote
self.modifierFlags = [.shift]
case "/":
self.keyCode = .keyboardSlash
case "?":
self.keyCode = .keyboardSlash
self.modifierFlags = [.shift]

default:
return nil
}
Expand Down
34 changes: 34 additions & 0 deletions Sources/KeyCodes/NSEvent+Key.swift
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,39 @@ extension NSEvent {
return .keyboardSlash
case kVK_ANSI_Period:
return .keyboardPeriod
case kVK_ANSI_Grave:
return .keyboardGraveAccentAndTilde

case kVK_ANSI_KeypadDecimal:
return .keypadPeriod
case kVK_ANSI_KeypadPlus:
return .keypadPlus
case kVK_ANSI_KeypadMinus:
return .keypadHyphen
case kVK_ANSI_KeypadDivide:
return .keypadSlash
case kVK_ANSI_KeypadMultiply:
return .keypadAsterisk
case kVK_ANSI_Keypad0:
return .keypad0
case kVK_ANSI_Keypad1:
return .keypad1
case kVK_ANSI_Keypad2:
return .keypad2
case kVK_ANSI_Keypad3:
return .keypad3
case kVK_ANSI_Keypad4:
return .keypad4
case kVK_ANSI_Keypad5:
return .keypad5
case kVK_ANSI_Keypad6:
return .keypad6
case kVK_ANSI_Keypad7:
return .keypad7
case kVK_ANSI_Keypad8:
return .keypad8
case kVK_ANSI_Keypad9:
return .keypad9

case kVK_F1:
return .keyboardF1
Expand Down Expand Up @@ -207,6 +237,10 @@ extension NSEvent {
return .keyboardDeleteOrBackspace
case kVK_Escape:
return .keyboardEscape
case kVK_VolumeUp:
return .keyboardVolumeUp
case kVK_VolumeDown:
return .keyboardVolumeDown

default:
return nil
Expand Down
55 changes: 55 additions & 0 deletions Tests/KeyCodesTests/KeyCodesTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,60 @@ final class KeyCodesTests: XCTestCase {
func testKeysFromCharacters() throws {
XCTAssertEqual(Key("a"), Key(keyCode: .keyboardA, characters: "a"))
XCTAssertEqual(Key("A"), Key(keyCode: .keyboardA, characters: "A", modifierFlags: [.shift]))
XCTAssertEqual(Key("b"), Key(keyCode: .keyboardB, characters: "b"))
XCTAssertEqual(Key("B"), Key(keyCode: .keyboardB, characters: "B", modifierFlags: [.shift]))
XCTAssertEqual(Key("c"), Key(keyCode: .keyboardC, characters: "c"))
XCTAssertEqual(Key("C"), Key(keyCode: .keyboardC, characters: "C", modifierFlags: [.shift]))
XCTAssertEqual(Key("d"), Key(keyCode: .keyboardD, characters: "d"))
XCTAssertEqual(Key("D"), Key(keyCode: .keyboardD, characters: "D", modifierFlags: [.shift]))
}

func testNumericKeysFromCharacters() throws {
XCTAssertEqual(Key("1"), Key(keyCode: .keyboard1, characters: "1"))
XCTAssertEqual(Key("!"), Key(keyCode: .keyboard1, characters: "!", modifierFlags: [.shift]))
XCTAssertEqual(Key("2"), Key(keyCode: .keyboard2, characters: "2"))
XCTAssertEqual(Key("@"), Key(keyCode: .keyboard2, characters: "@", modifierFlags: [.shift]))
XCTAssertEqual(Key("3"), Key(keyCode: .keyboard3, characters: "3"))
XCTAssertEqual(Key("#"), Key(keyCode: .keyboard3, characters: "#", modifierFlags: [.shift]))
XCTAssertEqual(Key("4"), Key(keyCode: .keyboard4, characters: "4"))
XCTAssertEqual(Key("$"), Key(keyCode: .keyboard4, characters: "$", modifierFlags: [.shift]))
XCTAssertEqual(Key("5"), Key(keyCode: .keyboard5, characters: "5"))
XCTAssertEqual(Key("%"), Key(keyCode: .keyboard5, characters: "%", modifierFlags: [.shift]))
XCTAssertEqual(Key("6"), Key(keyCode: .keyboard6, characters: "6"))
XCTAssertEqual(Key("^"), Key(keyCode: .keyboard6, characters: "^", modifierFlags: [.shift]))
XCTAssertEqual(Key("7"), Key(keyCode: .keyboard7, characters: "7"))
XCTAssertEqual(Key("&"), Key(keyCode: .keyboard7, characters: "&", modifierFlags: [.shift]))
XCTAssertEqual(Key("8"), Key(keyCode: .keyboard8, characters: "8"))
XCTAssertEqual(Key("*"), Key(keyCode: .keyboard8, characters: "*", modifierFlags: [.shift]))
XCTAssertEqual(Key("9"), Key(keyCode: .keyboard9, characters: "9"))
XCTAssertEqual(Key("("), Key(keyCode: .keyboard9, characters: "(", modifierFlags: [.shift]))
XCTAssertEqual(Key("0"), Key(keyCode: .keyboard0, characters: "0"))
XCTAssertEqual(Key(")"), Key(keyCode: .keyboard0, characters: ")", modifierFlags: [.shift]))
}

func testSymbolKeysFromCharacters() throws {
XCTAssertEqual(Key("`"), Key(keyCode: .keyboardGraveAccentAndTilde, characters: "`"))
XCTAssertEqual(Key("~"), Key(keyCode: .keyboardGraveAccentAndTilde, characters: "~", modifierFlags: [.shift]))
XCTAssertEqual(Key("-"), Key(keyCode: .keyboardHyphen, characters: "-"))
XCTAssertEqual(Key("_"), Key(keyCode: .keyboardHyphen, characters: "_", modifierFlags: [.shift]))
XCTAssertEqual(Key("="), Key(keyCode: .keyboardEqualSign, characters: "="))
XCTAssertEqual(Key("+"), Key(keyCode: .keyboardEqualSign, characters: "+", modifierFlags: [.shift]))
XCTAssertEqual(Key("["), Key(keyCode: .keyboardOpenBracket, characters: "["))
XCTAssertEqual(Key("{"), Key(keyCode: .keyboardOpenBracket, characters: "{", modifierFlags: [.shift]))
XCTAssertEqual(Key("]"), Key(keyCode: .keyboardCloseBracket, characters: "]"))
XCTAssertEqual(Key("}"), Key(keyCode: .keyboardCloseBracket, characters: "}", modifierFlags: [.shift]))
XCTAssertEqual(Key("\\"), Key(keyCode: .keyboardBackslash, characters: "\\"))
XCTAssertEqual(Key("|"), Key(keyCode: .keyboardBackslash, characters: "|", modifierFlags: [.shift]))
XCTAssertEqual(Key(";"), Key(keyCode: .keyboardSemicolon, characters: ";"))
XCTAssertEqual(Key(":"), Key(keyCode: .keyboardSemicolon, characters: ":", modifierFlags: [.shift]))
XCTAssertEqual(Key("'"), Key(keyCode: .keyboardQuote, characters: "'"))
XCTAssertEqual(Key("\""), Key(keyCode: .keyboardQuote, characters: "\"", modifierFlags: [.shift]))
XCTAssertEqual(Key(","), Key(keyCode: .keyboardComma, characters: ","))
XCTAssertEqual(Key("<"), Key(keyCode: .keyboardComma, characters: "<", modifierFlags: [.shift]))
XCTAssertEqual(Key("."), Key(keyCode: .keyboardPeriod, characters: "."))
XCTAssertEqual(Key(">"), Key(keyCode: .keyboardPeriod, characters: ">", modifierFlags: [.shift]))
XCTAssertEqual(Key("/"), Key(keyCode: .keyboardSlash, characters: "/"))
XCTAssertEqual(Key("?"), Key(keyCode: .keyboardSlash, characters: "?", modifierFlags: [.shift]))

}
}

0 comments on commit c55f9d4

Please sign in to comment.