mobile/event/key/key.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)
}
}