@@ -21,11 +21,45 @@ type Chord string
2121// shortcut formatting based on the underlying system platform without import cycles.
2222var SystemPlatform string
2323
24+ // KeypadMap maps the keypad versions to standard codes,
25+ // for non-printing characters.
26+ var KeypadMap = map [Codes ]Codes {
27+ CodeKeypadEnter : CodeReturnEnter ,
28+ CodeKeypadFullStop : CodeFullStop ,
29+ CodeKeypadEqualSign : CodeEqualSign ,
30+ }
31+
32+ // KeypadAlts are alternate codes for keypad keys to use when
33+ // the NumLock key is on.
34+ var KeypadAlts = map [Codes ]Codes {
35+ CodeKeypad1 : CodeEnd ,
36+ CodeKeypad2 : CodeDownArrow ,
37+ CodeKeypad3 : CodePageDown ,
38+ CodeKeypad4 : CodeLeftArrow ,
39+ CodeKeypad6 : CodeRightArrow ,
40+ CodeKeypad7 : CodeHome ,
41+ CodeKeypad8 : CodeUpArrow ,
42+ CodeKeypad9 : CodePageUp ,
43+ CodeKeypad0 : CodeInsert ,
44+ CodeKeypadFullStop : CodeDelete ,
45+ }
46+
2447// NewChord returns a string representation of the keyboard event suitable for
2548// keyboard function maps, etc. Printable runes are sent directly, and
2649// non-printable ones are converted to their corresponding code names without
2750// the "Code" prefix.
2851func NewChord (rn rune , code Codes , mods Modifiers ) Chord {
52+ mods .SetFlag (false , CapsLock )
53+ if ! mods .HasFlag (NumLock ) && code >= CodeKeypadNumLock && code < CodeKeypadEqualSign {
54+ if ac , ok := KeypadAlts [code ]; ok {
55+ rn = 0
56+ code = ac
57+ }
58+ }
59+ if ac , ok := KeypadMap [code ]; ok {
60+ code = ac
61+ }
62+ mods .SetFlag (false , NumLock )
2963 modstr := mods .ModifiersString ()
3064 if modstr != "" && code == CodeSpacebar { // modified space is not regular space
3165 return Chord (modstr + "Spacebar" )
0 commit comments