twitchapon-anim

Basic Twitchapon Receiver/Visuals
git clone git://bsandro.tech/twitchapon-anim
Log | Files | Refs | README | LICENSE

key.go (6873B)


      1 // Copyright 2015 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 //go:generate stringer -type=Code
      6 
      7 // Package key defines an event for physical keyboard keys.
      8 //
      9 // On-screen software keyboards do not send key events.
     10 //
     11 // See the golang.org/x/mobile/app package for details on the event model.
     12 package key
     13 
     14 import (
     15 	"fmt"
     16 	"strings"
     17 )
     18 
     19 // Event is a key event.
     20 type Event struct {
     21 	// Rune is the meaning of the key event as determined by the
     22 	// operating system. The mapping is determined by system-dependent
     23 	// current layout, modifiers, lock-states, etc.
     24 	//
     25 	// If non-negative, it is a Unicode codepoint: pressing the 'a' key
     26 	// generates different Runes 'a' or 'A' (but the same Code) depending on
     27 	// the state of the shift key.
     28 	//
     29 	// If -1, the key does not generate a Unicode codepoint. To distinguish
     30 	// them, look at Code.
     31 	Rune rune
     32 
     33 	// Code is the identity of the physical key relative to a notional
     34 	// "standard" keyboard, independent of current layout, modifiers,
     35 	// lock-states, etc
     36 	//
     37 	// For standard key codes, its value matches USB HID key codes.
     38 	// Compare its value to uint32-typed constants in this package, such
     39 	// as CodeLeftShift and CodeEscape.
     40 	//
     41 	// Pressing the regular '2' key and number-pad '2' key (with Num-Lock)
     42 	// generate different Codes (but the same Rune).
     43 	Code Code
     44 
     45 	// Modifiers is a bitmask representing a set of modifier keys: ModShift,
     46 	// ModAlt, etc.
     47 	Modifiers Modifiers
     48 
     49 	// Direction is the direction of the key event: DirPress, DirRelease,
     50 	// or DirNone (for key repeats).
     51 	Direction Direction
     52 
     53 	// TODO: add a Device ID, for multiple input devices?
     54 	// TODO: add a time.Time?
     55 }
     56 
     57 func (e Event) String() string {
     58 	if e.Rune >= 0 {
     59 		return fmt.Sprintf("key.Event{%q (%v), %v, %v}", e.Rune, e.Code, e.Modifiers, e.Direction)
     60 	}
     61 	return fmt.Sprintf("key.Event{(%v), %v, %v}", e.Code, e.Modifiers, e.Direction)
     62 }
     63 
     64 // Direction is the direction of the key event.
     65 type Direction uint8
     66 
     67 const (
     68 	DirNone    Direction = 0
     69 	DirPress   Direction = 1
     70 	DirRelease Direction = 2
     71 )
     72 
     73 // Modifiers is a bitmask representing a set of modifier keys.
     74 type Modifiers uint32
     75 
     76 const (
     77 	ModShift   Modifiers = 1 << 0
     78 	ModControl Modifiers = 1 << 1
     79 	ModAlt     Modifiers = 1 << 2
     80 	ModMeta    Modifiers = 1 << 3 // called "Command" on OS X
     81 )
     82 
     83 // Code is the identity of a key relative to a notional "standard" keyboard.
     84 type Code uint32
     85 
     86 // Physical key codes.
     87 //
     88 // For standard key codes, its value matches USB HID key codes.
     89 // TODO: add missing codes.
     90 const (
     91 	CodeUnknown Code = 0
     92 
     93 	CodeA Code = 4
     94 	CodeB Code = 5
     95 	CodeC Code = 6
     96 	CodeD Code = 7
     97 	CodeE Code = 8
     98 	CodeF Code = 9
     99 	CodeG Code = 10
    100 	CodeH Code = 11
    101 	CodeI Code = 12
    102 	CodeJ Code = 13
    103 	CodeK Code = 14
    104 	CodeL Code = 15
    105 	CodeM Code = 16
    106 	CodeN Code = 17
    107 	CodeO Code = 18
    108 	CodeP Code = 19
    109 	CodeQ Code = 20
    110 	CodeR Code = 21
    111 	CodeS Code = 22
    112 	CodeT Code = 23
    113 	CodeU Code = 24
    114 	CodeV Code = 25
    115 	CodeW Code = 26
    116 	CodeX Code = 27
    117 	CodeY Code = 28
    118 	CodeZ Code = 29
    119 
    120 	Code1 Code = 30
    121 	Code2 Code = 31
    122 	Code3 Code = 32
    123 	Code4 Code = 33
    124 	Code5 Code = 34
    125 	Code6 Code = 35
    126 	Code7 Code = 36
    127 	Code8 Code = 37
    128 	Code9 Code = 38
    129 	Code0 Code = 39
    130 
    131 	CodeReturnEnter        Code = 40
    132 	CodeEscape             Code = 41
    133 	CodeDeleteBackspace    Code = 42
    134 	CodeTab                Code = 43
    135 	CodeSpacebar           Code = 44
    136 	CodeHyphenMinus        Code = 45 // -
    137 	CodeEqualSign          Code = 46 // =
    138 	CodeLeftSquareBracket  Code = 47 // [
    139 	CodeRightSquareBracket Code = 48 // ]
    140 	CodeBackslash          Code = 49 // \
    141 	CodeSemicolon          Code = 51 // ;
    142 	CodeApostrophe         Code = 52 // '
    143 	CodeGraveAccent        Code = 53 // `
    144 	CodeComma              Code = 54 // ,
    145 	CodeFullStop           Code = 55 // .
    146 	CodeSlash              Code = 56 // /
    147 	CodeCapsLock           Code = 57
    148 
    149 	CodeF1  Code = 58
    150 	CodeF2  Code = 59
    151 	CodeF3  Code = 60
    152 	CodeF4  Code = 61
    153 	CodeF5  Code = 62
    154 	CodeF6  Code = 63
    155 	CodeF7  Code = 64
    156 	CodeF8  Code = 65
    157 	CodeF9  Code = 66
    158 	CodeF10 Code = 67
    159 	CodeF11 Code = 68
    160 	CodeF12 Code = 69
    161 
    162 	CodePause         Code = 72
    163 	CodeInsert        Code = 73
    164 	CodeHome          Code = 74
    165 	CodePageUp        Code = 75
    166 	CodeDeleteForward Code = 76
    167 	CodeEnd           Code = 77
    168 	CodePageDown      Code = 78
    169 
    170 	CodeRightArrow Code = 79
    171 	CodeLeftArrow  Code = 80
    172 	CodeDownArrow  Code = 81
    173 	CodeUpArrow    Code = 82
    174 
    175 	CodeKeypadNumLock     Code = 83
    176 	CodeKeypadSlash       Code = 84 // /
    177 	CodeKeypadAsterisk    Code = 85 // *
    178 	CodeKeypadHyphenMinus Code = 86 // -
    179 	CodeKeypadPlusSign    Code = 87 // +
    180 	CodeKeypadEnter       Code = 88
    181 	CodeKeypad1           Code = 89
    182 	CodeKeypad2           Code = 90
    183 	CodeKeypad3           Code = 91
    184 	CodeKeypad4           Code = 92
    185 	CodeKeypad5           Code = 93
    186 	CodeKeypad6           Code = 94
    187 	CodeKeypad7           Code = 95
    188 	CodeKeypad8           Code = 96
    189 	CodeKeypad9           Code = 97
    190 	CodeKeypad0           Code = 98
    191 	CodeKeypadFullStop    Code = 99  // .
    192 	CodeKeypadEqualSign   Code = 103 // =
    193 
    194 	CodeF13 Code = 104
    195 	CodeF14 Code = 105
    196 	CodeF15 Code = 106
    197 	CodeF16 Code = 107
    198 	CodeF17 Code = 108
    199 	CodeF18 Code = 109
    200 	CodeF19 Code = 110
    201 	CodeF20 Code = 111
    202 	CodeF21 Code = 112
    203 	CodeF22 Code = 113
    204 	CodeF23 Code = 114
    205 	CodeF24 Code = 115
    206 
    207 	CodeHelp Code = 117
    208 
    209 	CodeMute       Code = 127
    210 	CodeVolumeUp   Code = 128
    211 	CodeVolumeDown Code = 129
    212 
    213 	CodeLeftControl  Code = 224
    214 	CodeLeftShift    Code = 225
    215 	CodeLeftAlt      Code = 226
    216 	CodeLeftGUI      Code = 227
    217 	CodeRightControl Code = 228
    218 	CodeRightShift   Code = 229
    219 	CodeRightAlt     Code = 230
    220 	CodeRightGUI     Code = 231
    221 
    222 	// The following codes are not part of the standard USB HID Usage IDs for
    223 	// keyboards. See http://www.usb.org/developers/hidpage/Hut1_12v2.pdf
    224 	//
    225 	// Usage IDs are uint16s, so these non-standard values start at 0x10000.
    226 
    227 	// CodeCompose is the Code for a compose key, sometimes called a multi key,
    228 	// used to input non-ASCII characters such as ñ being composed of n and ~.
    229 	//
    230 	// See https://en.wikipedia.org/wiki/Compose_key
    231 	CodeCompose Code = 0x10000
    232 )
    233 
    234 // TODO: Given we use runes outside the unicode space, should we provide a
    235 // printing function? Related: it's a little unfortunate that printing a
    236 // key.Event with %v gives not very readable output like:
    237 //	{100 7 key.Modifiers() Press}
    238 
    239 var mods = [...]struct {
    240 	m Modifiers
    241 	s string
    242 }{
    243 	{ModShift, "Shift"},
    244 	{ModControl, "Control"},
    245 	{ModAlt, "Alt"},
    246 	{ModMeta, "Meta"},
    247 }
    248 
    249 func (m Modifiers) String() string {
    250 	var match []string
    251 	for _, mod := range mods {
    252 		if mod.m&m != 0 {
    253 			match = append(match, mod.s)
    254 		}
    255 	}
    256 	return "key.Modifiers(" + strings.Join(match, "|") + ")"
    257 }
    258 
    259 func (d Direction) String() string {
    260 	switch d {
    261 	case DirNone:
    262 		return "None"
    263 	case DirPress:
    264 		return "Press"
    265 	case DirRelease:
    266 		return "Release"
    267 	default:
    268 		return fmt.Sprintf("key.Direction(%d)", d)
    269 	}
    270 }