// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package key defines an event for physical keyboard keys. // // On-screen software keyboards do not send key events. // // See the golang.org/x/mobile/app package for details on the event model. package key import ( "fmt" "strings" ) // Event is a key event. type Event struct { // Rune is the meaning of the key event as determined by the // operating system. The mapping is determined by system-dependent // current layout, modifiers, lock-states, etc. // // If non-negative, it is a Unicode codepoint: pressing the 'a' key // generates different Runes 'a' or 'A' (but the same Code) depending on // the state of the shift key. // // If -1, the key does not generate a Unicode codepoint. To distinguish // them, look at Code. Rune rune // Code is the identity of the physical key relative to a notional // "standard" keyboard, independent of current layout, modifiers, // lock-states, etc // // For standard key codes, its value matches USB HID key codes. // Compare its value to uint32-typed constants in this package, such // as CodeLeftShift and CodeEscape. // TODO(crawshaw): define "type Code uint32" // // Pressing the regular '2' key and number-pad '2' key (with Num-Lock) // generate different Codes (but the same Rune). Code uint32 // Modifiers is a bitmask representing a set of modifier keys: ModShift, // ModAlt, etc. Modifiers Modifiers // Direction is the direction of the key event: DirPress, DirRelease, // or DirNone (for key repeats). Direction Direction // TODO: add a Device ID, for multiple input devices? // TODO: add a time.Time? } // Direction is the direction of the key event. type Direction uint8 const ( DirNone Direction = 0 DirPress Direction = 1 DirRelease Direction = 2 ) // Modifiers is a bitmask representing a set of modifier keys. type Modifiers uint32 const ( ModShift Modifiers = 1 << 0 ModControl Modifiers = 1 << 1 ModAlt Modifiers = 1 << 2 ModMeta Modifiers = 1 << 3 // called "Command" on OS X ) // Physical key codes. // // For standard key codes, its value matches USB HID key codes. // TODO: add missing codes. const ( CodeA = 4 CodeB = 5 CodeC = 6 CodeD = 7 CodeE = 8 CodeF = 9 CodeG = 10 CodeH = 11 CodeI = 12 CodeJ = 13 CodeK = 14 CodeL = 15 CodeM = 16 CodeN = 17 CodeO = 18 CodeP = 19 CodeQ = 20 CodeR = 21 CodeS = 22 CodeT = 23 CodeU = 24 CodeV = 25 CodeW = 26 CodeX = 27 CodeY = 28 CodeZ = 29 Code1 = 30 Code2 = 31 Code3 = 32 Code4 = 33 Code5 = 34 Code6 = 35 Code7 = 36 Code8 = 37 Code9 = 38 Code0 = 39 CodeReturn = 40 CodeEscape = 41 CodeBackspace = 42 CodeTab = 43 CodeF1 = 58 CodeF2 = 59 CodeF3 = 60 CodeF4 = 61 CodeF5 = 62 CodeF6 = 63 CodeF7 = 64 CodeF8 = 65 CodeF9 = 66 CodeF10 = 67 CodeF11 = 68 CodeF12 = 69 CodePageUp = 75 CodePageDown = 78 CodeRightArrow = 79 CodeLeftArrow = 80 CodeDownArrow = 81 CodeUpArrow = 82 CodeKeypadNumLockAndClear = 83 CodeKeypadSlash = 84 CodeKeypadAsterisk = 85 CodeKeypadMinus = 86 CodeKeypadPlus = 87 CodeKeypadEnter = 88 CodeKeypad1 = 89 CodeKeypad2 = 90 CodeKeypad3 = 91 CodeKeypad4 = 92 CodeKeypad5 = 93 CodeKeypad6 = 94 CodeKeypad7 = 95 CodeKeypad8 = 96 CodeKeypad9 = 97 CodeKeypad0 = 98 CodeKeypadFullStop = 99 CodeKeypadEqualSign = 103 CodeF13 = 104 CodeF14 = 105 CodeF15 = 106 CodeF16 = 107 CodeF17 = 108 CodeF18 = 109 CodeF19 = 110 CodeF20 = 111 CodeF21 = 112 CodeF22 = 113 CodeF23 = 114 CodeF24 = 115 CodeHelp = 117 CodeMute = 127 CodeVolumeUp = 128 CodeVolumeDown = 129 CodeLeftControl = 224 CodeLeftShift = 225 CodeLeftAlt = 226 CodeLeftMeta = 227 CodeRightControl = 228 CodeRightShift = 229 CodeRightAlt = 230 CodeRightMeta = 231 ) // TODO: Given we use runes outside the unicode space, should we provide a // printing function? Related: it's a little unfortunate that printing a // key.Event with %v gives not very readable output like: // {100 7 key.Modifiers() Press} var mods = [...]struct { m Modifiers s string }{ {ModShift, "Shift"}, {ModControl, "Control"}, {ModAlt, "Alt"}, {ModMeta, "Meta"}, } func (m Modifiers) String() string { var match []string for _, mod := range mods { if mod.m&m != 0 { match = append(match, mod.s) } } return "key.Modifiers(" + strings.Join(match, "|") + ")" } func (d Direction) String() string { switch d { case DirNone: return "None" case DirPress: return "Press" case DirRelease: return "Release" default: return fmt.Sprintf("key.Direction(%d)", d) } }