github.com/jmigpin/editor@v1.6.0/driver/windriver/keys.go (about) 1 //go:build windows 2 3 package windriver 4 5 import ( 6 "github.com/jmigpin/editor/util/uiutil/event" 7 ) 8 9 func translateVKeyToEventKeySym(vkey uint32, ru rune) event.KeySym { 10 ks := runeToEventKeySym(ru) 11 if ks == 0 { 12 ks = translateVKeyToEventKeySym2(vkey) 13 } 14 return ks 15 } 16 17 func translateVKeyToEventKeySym2(vkey uint32) event.KeySym { 18 switch vkey { 19 case 0x30: 20 return event.KSym0 21 case 0x31: 22 return event.KSym1 23 case 0x32: 24 return event.KSym2 25 case 0x33: 26 return event.KSym3 27 case 0x34: 28 return event.KSym4 29 case 0x35: 30 return event.KSym5 31 case 0x36: 32 return event.KSym6 33 case 0x37: 34 return event.KSym7 35 case 0x38: 36 return event.KSym8 37 case 0x39: 38 return event.KSym9 39 40 case 0x41: 41 return event.KSymA 42 case 0x42: 43 return event.KSymB 44 case 0x43: 45 return event.KSymC 46 case 0x44: 47 return event.KSymD 48 case 0x45: 49 return event.KSymE 50 case 0x46: 51 return event.KSymF 52 case 0x47: 53 return event.KSymG 54 case 0x48: 55 return event.KSymH 56 case 0x49: 57 return event.KSymI 58 case 0x4A: 59 return event.KSymJ 60 case 0x4B: 61 return event.KSymK 62 case 0x4C: 63 return event.KSymL 64 case 0x4D: 65 return event.KSymM 66 case 0x4E: 67 return event.KSymN 68 case 0x4F: 69 return event.KSymO 70 case 0x50: 71 return event.KSymP 72 case 0x51: 73 return event.KSymQ 74 case 0x52: 75 return event.KSymR 76 case 0x53: 77 return event.KSymS 78 case 0x54: 79 return event.KSymT 80 case 0x55: 81 return event.KSymU 82 case 0x56: 83 return event.KSymV 84 case 0x57: 85 return event.KSymW 86 case 0x58: 87 return event.KSymX 88 case 0x59: 89 return event.KSymY 90 case 0x5A: 91 return event.KSymZ 92 93 case 0x20: 94 return event.KSymSpace 95 case 0x08: // VK_BACK 96 return event.KSymBackspace 97 case 0x0D, 228: // TEST 98 return event.KSymReturn 99 case 0x1B: 100 return event.KSymEscape 101 case 0x24: 102 return event.KSymHome 103 case 0x25: 104 return event.KSymLeft 105 case 0x26: 106 return event.KSymUp 107 case 0x27: 108 return event.KSymRight 109 case 0x28: 110 return event.KSymDown 111 case 0x21: // VK_PRIOR 112 return event.KSymPageUp 113 case 0x22: // VK_NEXT 114 return event.KSymPageDown 115 case 0x23: 116 return event.KSymEnd 117 case 0x2D: 118 return event.KSymInsert 119 case 0xA0: 120 return event.KSymShiftL 121 case 0xA1: 122 return event.KSymShiftR 123 case 0xA2: 124 return event.KSymControlL 125 case 0xA3: 126 return event.KSymControlR 127 case 0xa4: // VK_LMENU 128 return event.KSymAltL 129 case 0xa5: // VK_RMENU 130 return event.KSymAltR 131 case 0x12: // VK_MENU 132 return event.KSymAltGr // 227? 50? 133 case 0x5B: // VK_LWIN: windows key 134 return event.KSymSuperL 135 case 0x5C: // VK_RWIN: windows key 136 return event.KSymSuperR 137 case 0x2E: 138 return event.KSymDelete 139 case 0x09: // VK_TAB 140 return event.KSymTab 141 //case 0x: return event.KSymTabLeft 142 143 case 144: // 0x90: 144 return event.KSymNumLock 145 case 0x14: // VK_CAPITAL 146 return event.KSymCapsLock 147 //case 0x: return event.KSymShiftLock 148 149 //case 0x21: 150 // return event.KSymExclam 151 //case 0x22: 152 // return event.KSymDoubleQuote 153 //case 0x23: 154 // return event.KSymNumberSign 155 //case 0x24: 156 // return event.KSymDollar 157 //case 0x25: 158 // return event.KSymPercent 159 //case 0x26: 160 // return event.KSymAmpersand 161 case 189: // TEST 162 return event.KSymApostrophe 163 //case 0x28: 164 // return event.KSymParentL 165 //case 0x29: 166 // return event.KSymParentR 167 case 0x6a: // VK_MULTIPLY 168 return event.KSymAsterisk 169 case 107, 219: // TEST 170 return event.KSymPlus 171 case 0xbc: // VK_OEM_COMMA 172 return event.KSymComma 173 case 109, 191: // TEST // 0xbd=VK_OEM_MINUS 174 return event.KSymMinus 175 case 110, 108, 190: // TEST // 0xbe=VK_OEM_PERIOD 176 return event.KSymPeriod 177 case 111: // TEST 178 return event.KSymSlash 179 case 192: // TEST 180 return event.KSymBackSlash 181 //case 0x3a: 182 // return event.KSymColon 183 //case 0x3b: 184 // return event.KSymSemicolon 185 case 226: // TEST 186 return event.KSymLess 187 case 146: // TEST 188 return event.KSymEqual 189 //case 0x3e: 190 // return event.KSymGreater 191 //case 0xbf: // VK_OEM_2 192 // return event.KSymQuestion 193 //case 0x40: 194 // return event.KSymAt 195 //case 0x5b: 196 // return event.KSymBracketL 197 //case 0x5d: 198 // return event.KSymBracketR 199 200 //case 0xdd: 201 //return event.KSymGrave 202 case 221: // TEST 203 return event.KSymAcute 204 //case 0x: return event.KSymCircumflex 205 case 220: // TEST 206 return event.KSymTilde 207 //case 0x: return event.KSymCedilla 208 //case 0x: return event.KSymBreve 209 //case 0x: return event.KSymCaron 210 //case 0x: return event.KSymDiaresis 211 //case 0x: return event.KSymRingAbove 212 //case 0x: return event.KSymMacron 213 214 case 0x70: 215 return event.KSymF1 216 case 0x71: 217 return event.KSymF2 218 case 0x72: 219 return event.KSymF3 220 case 0x73: 221 return event.KSymF4 222 case 0x74: 223 return event.KSymF5 224 case 0x75: 225 return event.KSymF6 226 case 0x76: 227 return event.KSymF7 228 case 0x77: 229 return event.KSymF8 230 case 0x78: 231 return event.KSymF9 232 case 0x79: 233 return event.KSymF10 234 case 0x7A: 235 return event.KSymF11 236 case 0x7B: 237 return event.KSymF12 238 239 case 0x60: // VK_NUMPAD0 240 return event.KSymKeypad0 241 case 0x61: 242 return event.KSymKeypad1 243 case 0x62: 244 return event.KSymKeypad2 245 case 0x63: 246 return event.KSymKeypad3 247 case 0x64: 248 return event.KSymKeypad4 249 case 0x65: 250 return event.KSymKeypad5 251 case 0x66: 252 return event.KSymKeypad6 253 case 0x67: 254 return event.KSymKeypad7 255 case 0x68: 256 return event.KSymKeypad8 257 case 0x69: 258 return event.KSymKeypad9 259 //case 0x6A: // VK_MULTIPLY: TODO: keypad? 260 //return event.KSymKeypadMultiply 261 //case 0x6B: 262 // return event.KSymKeypadAdd 263 //case 0x6D: 264 // return event.KSymKeypadSubtract 265 //case 0x6E: 266 // return event.KSymKeypadDecimal 267 //case 0x6F: 268 // return event.KSymKeypadDivide 269 270 case 0xAF: 271 return event.KSymVolumeUp 272 case 0xAE: 273 return event.KSymVolumeDown 274 case 0xAD: 275 return event.KSymMute 276 277 //case 0x: return event.KSymMultiKey 278 //case 0x: return event.KSymMenu 279 } 280 return event.KSymNone 281 } 282 283 func runeToEventKeySym(ru rune) event.KeySym { 284 switch ru { 285 case '`': 286 return event.KSymGrave 287 case '´': 288 return event.KSymAcute 289 case '^': 290 return event.KSymCircumflex 291 case '~': 292 return event.KSymTilde 293 case '¸': 294 return event.KSymCedilla 295 case '˘': 296 return event.KSymBreve 297 case 'ˇ': 298 return event.KSymCaron 299 case '¨': 300 return event.KSymDiaresis 301 case '˚': 302 return event.KSymRingAbove 303 case '¯': 304 return event.KSymMacron 305 } 306 return 0 307 } 308 309 //func eventKeySymToRune(ks event.KeySym) rune { 310 // switch ks { 311 // case event.KSymGrave: 312 // return '`' 313 // //case '´': 314 // // return event.KSymAcute 315 // //case '^': 316 // // return event.KSymCircumflex 317 // //case '~': 318 // // return event.KSymTilde 319 // //case '¸': 320 // // return event.KSymCedilla 321 // //case '˘': 322 // // return event.KSymBreve 323 // //case 'ˇ': 324 // // return event.KSymCaron 325 // //case '¨': 326 // // return event.KSymDiaresis 327 // //case '˚': 328 // // return event.KSymRingAbove 329 // //case '¯': 330 // // return event.KSymMacron 331 // } 332 // return 0 333 //} 334 335 //---------- 336 337 const ( 338 kstateToggleBit = 1 339 kstateDownBit = 1 << (8 - 1) 340 ) 341 342 //---------- 343 344 func translateKStateToEventKeyModifiers(kstate *[256]byte) event.KeyModifiers { 345 type pair struct { 346 a byte 347 b event.KeyModifiers 348 } 349 pairs := []pair{ 350 {_VK_SHIFT, event.ModShift}, 351 {_VK_CONTROL, event.ModCtrl}, 352 {_VK_MENU, event.ModAlt}, 353 } 354 var w event.KeyModifiers 355 for _, p := range pairs { 356 if kstate[p.a]&kstateDownBit != 0 { 357 w |= p.b 358 } 359 } 360 return w 361 } 362 363 func translateKStateToEventMouseButtons(kstate *[256]byte) event.MouseButtons { 364 type pair struct { 365 a byte 366 b event.MouseButton 367 } 368 pairs := []pair{ 369 {_VK_LBUTTON, event.ButtonLeft}, 370 {_VK_MBUTTON, event.ButtonMiddle}, 371 {_VK_RBUTTON, event.ButtonRight}, 372 {_VK_XBUTTON1, event.ButtonBackward}, 373 {_VK_XBUTTON2, event.ButtonForward}, 374 } 375 var w event.MouseButtons 376 for _, p := range pairs { 377 if kstate[p.a]&kstateDownBit != 0 { 378 w |= event.MouseButtons(p.b) 379 } 380 } 381 return w 382 } 383 384 //---------- 385 386 func translateVKeyToEventKeyModifiers(vkey uint32) event.KeyModifiers { 387 type pair struct { 388 a uint32 389 b event.KeyModifiers 390 } 391 pairs := []pair{ 392 {_MK_SHIFT, event.ModShift}, 393 {_MK_CONTROL, event.ModCtrl}, 394 } 395 var w event.KeyModifiers 396 for _, p := range pairs { 397 if vkey&p.a > 0 { 398 w |= p.b 399 } 400 } 401 return w 402 } 403 404 func translateVKeyToEventMouseButtons(vkey uint32) event.MouseButtons { 405 type pair struct { 406 a uint32 407 b event.MouseButton 408 } 409 pairs := []pair{ 410 {_MK_LBUTTON, event.ButtonLeft}, 411 {_MK_MBUTTON, event.ButtonMiddle}, 412 {_MK_RBUTTON, event.ButtonRight}, 413 {_MK_XBUTTON1, event.ButtonBackward}, 414 {_MK_XBUTTON2, event.ButtonForward}, 415 } 416 var w event.MouseButtons 417 for _, p := range pairs { 418 if vkey&p.a > 0 { 419 w |= event.MouseButtons(p.b) 420 } 421 } 422 return w 423 } 424 425 //---------- 426 427 //type KeyData struct { 428 // Count int 429 // ScanCode int 430 // Extended bool 431 // ContextCode bool // always zero for keydown 432 // PreviousStateDown bool 433 // TransitionState bool // always zero for keydown 434 //} 435 436 //func keyData(v uint32) *KeyData { 437 // kd := &KeyData{} 438 // kd.Count = int(v & 0xffff) // bits: 0-15 439 // kd.ScanCode = int((v & 0xff0000) >> 16) // bits: 16-23 440 // kd.Extended = int(v&(1<<24)) != 0 // bits: 24 441 // // bits 25-28 are reserved 442 // kd.ContextCode = int(v&(1<<29)) != 0 443 // kd.PreviousStateDown = int(v&(1<<30)) != 0 444 // kd.TransitionState = int(v&(1<<31)) != 0 445 // return kd 446 //}