229 lines
4.8 KiB
Go
229 lines
4.8 KiB
Go
|
// 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)
|
||
|
}
|
||
|
}
|