github.com/as/shiny@v0.8.2/driver/win32/key.go (about) 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 // +build windows 6 7 package win32 8 9 import ( 10 "fmt" 11 "syscall" 12 "unicode/utf16" 13 14 "github.com/as/shiny/event/key" 15 "github.com/as/shiny/screen" 16 ) 17 18 type Key = key.Event 19 20 var KeyEvent func(hwnd syscall.Handle, e key.Event) 21 var keyboardLayout = GetKeyboardLayout(0) 22 23 func changeLanguage(h syscall.Handle, m uint32, charset, localeID uintptr) { 24 } 25 26 func readRune(vKey uint32, scanCode uint8) rune { 27 var ( 28 keystate [256]byte 29 buf [4]uint16 30 ) 31 if err := GetKeyboardState(&keystate[0]); err != nil { 32 panic(fmt.Sprintf("win32: %v", err)) 33 } 34 ret := ToUnicodeEx(vKey, uint32(scanCode), &keystate[0], &buf[0], int32(len(buf)), 0, keyboardLayout) 35 if ret < 1 { 36 return -1 37 } 38 return utf16.Decode(buf[:ret])[0] 39 } 40 41 func keyModifiers() (m key.Modifiers) { 42 down := func(x int32) bool { 43 // GetKeyState gets the key state at the time of the message, so this is what we want. 44 return GetKeyState(x)&0x80 != 0 45 } 46 47 if down(VkControl) { 48 m |= key.ModControl 49 } 50 if down(VkMenu) { 51 m |= key.ModAlt 52 } 53 if down(VkShift) { 54 m |= key.ModShift 55 } 56 if down(VkLwin) || down(VkRwin) { 57 m |= key.ModMeta 58 } 59 return m 60 } 61 62 type ktab [256]key.Code 63 64 func (k *ktab) sendDown(h syscall.Handle, m uint32, w, l uintptr) uintptr { 65 const prev = 1 << 30 66 dir := key.DirNone 67 if l&prev != prev { 68 dir = key.DirPress 69 } 70 screen.Dev.Key <- key.Event{ 71 Rune: readRune(uint32(w), byte(l>>16)), 72 Code: keytab[byte(w)], 73 Modifiers: keyModifiers(), 74 Direction: dir, 75 } 76 return 0 77 } 78 func (k *ktab) sendUp(h syscall.Handle, m uint32, w, l uintptr) uintptr { 79 screen.Dev.Key <- key.Event{ 80 Rune: readRune(uint32(w), byte(l>>16)), 81 Code: keytab[byte(w)], 82 Modifiers: keyModifiers(), 83 Direction: key.DirRelease, 84 } 85 return 0 86 } 87 88 var keytab = ktab{ 89 0x08: key.CodeDeleteBackspace, 90 0x09: key.CodeTab, 91 0x0D: key.CodeReturnEnter, 92 0x10: key.CodeLeftShift, 93 0x11: key.CodeLeftControl, 94 0x12: key.CodeLeftAlt, 95 0x14: key.CodeCapsLock, 96 0x1B: key.CodeEscape, 97 0x20: key.CodeSpacebar, 98 0x21: key.CodePageUp, 99 0x22: key.CodePageDown, 100 0x23: key.CodeEnd, 101 0x24: key.CodeHome, 102 0x25: key.CodeLeftArrow, 103 0x26: key.CodeUpArrow, 104 0x27: key.CodeRightArrow, 105 0x28: key.CodeDownArrow, 106 0x2E: key.CodeDeleteForward, 107 0x2F: key.CodeHelp, 108 0x30: key.Code0, 109 0x31: key.Code1, 110 0x32: key.Code2, 111 0x33: key.Code3, 112 0x34: key.Code4, 113 0x35: key.Code5, 114 0x36: key.Code6, 115 0x37: key.Code7, 116 0x38: key.Code8, 117 0x39: key.Code9, 118 0x41: key.CodeA, 119 0x42: key.CodeB, 120 0x43: key.CodeC, 121 0x44: key.CodeD, 122 0x45: key.CodeE, 123 0x46: key.CodeF, 124 0x47: key.CodeG, 125 0x48: key.CodeH, 126 0x49: key.CodeI, 127 0x4A: key.CodeJ, 128 0x4B: key.CodeK, 129 0x4C: key.CodeL, 130 0x4D: key.CodeM, 131 0x4E: key.CodeN, 132 0x4F: key.CodeO, 133 0x50: key.CodeP, 134 0x51: key.CodeQ, 135 0x52: key.CodeR, 136 0x53: key.CodeS, 137 0x54: key.CodeT, 138 0x55: key.CodeU, 139 0x56: key.CodeV, 140 0x57: key.CodeW, 141 0x58: key.CodeX, 142 0x59: key.CodeY, 143 0x5A: key.CodeZ, 144 0x5B: key.CodeLeftGUI, 145 0x5C: key.CodeRightGUI, 146 0x60: key.CodeKeypad0, 147 0x61: key.CodeKeypad1, 148 0x62: key.CodeKeypad2, 149 0x63: key.CodeKeypad3, 150 0x64: key.CodeKeypad4, 151 0x65: key.CodeKeypad5, 152 0x66: key.CodeKeypad6, 153 0x67: key.CodeKeypad7, 154 0x68: key.CodeKeypad8, 155 0x69: key.CodeKeypad9, 156 0x6A: key.CodeKeypadAsterisk, 157 0x6B: key.CodeKeypadPlusSign, 158 0x6D: key.CodeKeypadHyphenMinus, 159 0x6E: key.CodeFullStop, 160 0x6F: key.CodeKeypadSlash, 161 0x70: key.CodeF1, 162 0x71: key.CodeF2, 163 0x72: key.CodeF3, 164 0x73: key.CodeF4, 165 0x74: key.CodeF5, 166 0x75: key.CodeF6, 167 0x76: key.CodeF7, 168 0x77: key.CodeF8, 169 0x78: key.CodeF9, 170 0x79: key.CodeF10, 171 0x7A: key.CodeF11, 172 0x7B: key.CodeF12, 173 0x7C: key.CodeF13, 174 0x7D: key.CodeF14, 175 0x7E: key.CodeF15, 176 0x7F: key.CodeF16, 177 0x80: key.CodeF17, 178 0x81: key.CodeF18, 179 0x82: key.CodeF19, 180 0x83: key.CodeF20, 181 0x84: key.CodeF21, 182 0x85: key.CodeF22, 183 0x86: key.CodeF23, 184 0x87: key.CodeF24, 185 0x90: key.CodeKeypadNumLock, 186 0xA0: key.CodeLeftShift, 187 0xA1: key.CodeRightShift, 188 0xA2: key.CodeLeftControl, 189 0xA3: key.CodeRightControl, 190 0xAD: key.CodeMute, 191 0xAE: key.CodeVolumeDown, 192 0xAF: key.CodeVolumeUp, 193 0xBA: key.CodeSemicolon, 194 0xBB: key.CodeEqualSign, 195 0xBC: key.CodeComma, 196 0xBD: key.CodeHyphenMinus, 197 0xBE: key.CodeFullStop, 198 0xBF: key.CodeSlash, 199 0xC0: key.CodeGraveAccent, 200 0xDB: key.CodeLeftSquareBracket, 201 0xDC: key.CodeBackslash, 202 0xDD: key.CodeRightSquareBracket, 203 0xDE: key.CodeApostrophe, 204 0xDF: key.CodeUnknown, 205 }