github.com/jmigpin/editor@v1.6.0/driver/xdriver/xinput/keys.go (about) 1 package xinput 2 3 import ( 4 "github.com/BurntSushi/xgb/xproto" 5 "github.com/jmigpin/editor/util/uiutil/event" 6 ) 7 8 // Constants from /usr/include/X11/keysymdef.h 9 func translateXKeysymToEventKeySym(xk xproto.Keysym) event.KeySym { 10 switch xk { 11 case 0x30: 12 return event.KSym0 13 case 0x31: 14 return event.KSym1 15 case 0x32: 16 return event.KSym2 17 case 0x33: 18 return event.KSym3 19 case 0x34: 20 return event.KSym4 21 case 0x35: 22 return event.KSym5 23 case 0x36: 24 return event.KSym6 25 case 0x37: 26 return event.KSym7 27 case 0x38: 28 return event.KSym8 29 case 0x39: 30 return event.KSym9 31 32 case 0x41, 0x61: 33 return event.KSymA 34 case 0x42, 0x62: 35 return event.KSymB 36 case 0x43, 0x63: 37 return event.KSymC 38 case 0x44, 0x64: 39 return event.KSymD 40 case 0x45, 0x65: 41 return event.KSymE 42 case 0x46, 0x66: 43 return event.KSymF 44 case 0x47, 0x67: 45 return event.KSymG 46 case 0x48, 0x68: 47 return event.KSymH 48 case 0x49, 0x69: 49 return event.KSymI 50 case 0x4a, 0x6a: 51 return event.KSymJ 52 case 0x4b, 0x6b: 53 return event.KSymK 54 case 0x4c, 0x6c: 55 return event.KSymL 56 case 0x4d, 0x6d: 57 return event.KSymM 58 case 0x4e, 0x6e: 59 return event.KSymN 60 case 0x4f, 0x6f: 61 return event.KSymO 62 case 0x50, 0x70: 63 return event.KSymP 64 case 0x51, 0x71: 65 return event.KSymQ 66 case 0x52, 0x72: 67 return event.KSymR 68 case 0x53, 0x73: 69 return event.KSymS 70 case 0x54, 0x74: 71 return event.KSymT 72 case 0x55, 0x75: 73 return event.KSymU 74 case 0x56, 0x76: 75 return event.KSymV 76 case 0x57, 0x77: 77 return event.KSymW 78 case 0x58, 0x78: 79 return event.KSymX 80 case 0x59, 0x79: 81 return event.KSymY 82 case 0x5a, 0x7a: 83 return event.KSymZ 84 85 case 0x20: 86 return event.KSymSpace 87 case 0xff08: 88 return event.KSymBackspace 89 case 0xff0d: 90 return event.KSymReturn 91 case 0xff1b: 92 return event.KSymEscape 93 case 0xff50: 94 return event.KSymHome 95 case 0xff51: 96 return event.KSymLeft 97 case 0xff52: 98 return event.KSymUp 99 case 0xff53: 100 return event.KSymRight 101 case 0xff54: 102 return event.KSymDown 103 case 0xff55: 104 return event.KSymPageUp 105 case 0xff56: 106 return event.KSymPageDown 107 case 0xff57: 108 return event.KSymEnd 109 case 0xff63: 110 return event.KSymInsert 111 case 0xffe1: 112 return event.KSymShiftL 113 case 0xffe2: 114 return event.KSymShiftR 115 case 0xffe3: 116 return event.KSymControlL 117 case 0xffe4: 118 return event.KSymControlR 119 case 0xffe9: 120 return event.KSymAltL 121 case 0xffea: 122 return event.KSymAltR 123 case 0xfe03: 124 return event.KSymAltGr // ISOLevel3Shift 125 case 0xffeb: 126 return event.KSymSuperL // windows key 127 case 0xffec: 128 return event.KSymSuperR 129 case 0xffff: 130 return event.KSymDelete 131 case 0xff09: 132 return event.KSymTab 133 case 0xfe20: 134 return event.KSymTabLeft // ISOLeftTab 135 136 case 0xff7f: 137 return event.KSymNumLock 138 case 0xffe5: 139 return event.KSymCapsLock 140 case 0xffe6: 141 return event.KSymShiftLock 142 143 case 0x21: 144 return event.KSymExclam 145 case 0x22: 146 return event.KSymDoubleQuote 147 case 0x23: 148 return event.KSymNumberSign 149 case 0x24: 150 return event.KSymDollar 151 case 0x25: 152 return event.KSymPercent 153 case 0x26: 154 return event.KSymAmpersand 155 case 0x27: 156 return event.KSymApostrophe 157 case 0x28: 158 return event.KSymParentL 159 case 0x29: 160 return event.KSymParentR 161 case 0x2a: 162 return event.KSymAsterisk 163 case 0x2b: 164 return event.KSymPlus 165 case 0x2c: 166 return event.KSymComma 167 case 0x2d: 168 return event.KSymMinus 169 case 0x2e: 170 return event.KSymPeriod 171 case 0x2f: 172 return event.KSymSlash 173 case 0x5c: 174 return event.KSymBackSlash 175 case 0x3a: 176 return event.KSymColon 177 case 0x3b: 178 return event.KSymSemicolon 179 case 0x3c: 180 return event.KSymLess 181 case 0x3d: 182 return event.KSymEqual 183 case 0x3e: 184 return event.KSymGreater 185 case 0x3f: 186 return event.KSymQuestion 187 case 0x40: 188 return event.KSymAt 189 case 0x5b: 190 return event.KSymBracketL 191 case 0x5d: 192 return event.KSymBracketR 193 194 case 0xfe50: 195 return event.KSymGrave 196 case 0xfe51: 197 return event.KSymAcute 198 case 0xfe52: 199 return event.KSymCircumflex 200 case 0xfe53: 201 return event.KSymTilde 202 case 0xfe5b: 203 return event.KSymCedilla 204 case 0xfe55: 205 return event.KSymBreve 206 case 0xfe5a: 207 return event.KSymCaron 208 case 0xfe57: 209 return event.KSymDiaresis 210 case 0xfe58: 211 return event.KSymRingAbove 212 case 0xfe54: 213 return event.KSymMacron 214 215 case 0xffbe: 216 return event.KSymF1 217 case 0xffbf: 218 return event.KSymF2 219 case 0xffc0: 220 return event.KSymF3 221 case 0xffc1: 222 return event.KSymF4 223 case 0xffc2: 224 return event.KSymF5 225 case 0xffc3: 226 return event.KSymF6 227 case 0xffc4: 228 return event.KSymF7 229 case 0xffc5: 230 return event.KSymF8 231 case 0xffc6: 232 return event.KSymF9 233 case 0xffc7: 234 return event.KSymF10 235 case 0xffc8: 236 return event.KSymF11 237 case 0xffc9: 238 return event.KSymF12 239 240 case 0xffb0: 241 return event.KSymKeypad0 242 case 0xffb1: 243 return event.KSymKeypad1 244 case 0xffb2: 245 return event.KSymKeypad2 246 case 0xffb3: 247 return event.KSymKeypad3 248 case 0xffb4: 249 return event.KSymKeypad4 250 case 0xffb5: 251 return event.KSymKeypad5 252 case 0xffb6: 253 return event.KSymKeypad6 254 case 0xffb7: 255 return event.KSymKeypad7 256 case 0xffb8: 257 return event.KSymKeypad8 258 case 0xffb9: 259 return event.KSymKeypad9 260 case 0xffaa: 261 return event.KSymKeypadMultiply 262 case 0xffab: 263 return event.KSymKeypadAdd 264 case 0xffad: 265 return event.KSymKeypadSubtract 266 case 0xffae: 267 return event.KSymKeypadDecimal 268 case 0xffaf: 269 return event.KSymKeypadDivide 270 271 case 0x1008ff13: 272 return event.KSymVolumeUp 273 case 0x1008ff11: 274 return event.KSymVolumeDown 275 case 0x1008ff12: 276 return event.KSymMute 277 278 case 0xff20: 279 return event.KSymMultiKey 280 case 0xff67: 281 return event.KSymMenu 282 } 283 return event.KSymNone 284 } 285 286 //---------- 287 288 func keySymsRune(xks xproto.Keysym, eks event.KeySym) rune { 289 ru := rune(xks) // default direct translation (covers some ascii values) 290 ru2 := eventKeySymRune(eks) 291 if ru2 != 0 { 292 ru = ru2 293 } 294 return ru 295 } 296 297 func eventKeySymRune(eks event.KeySym) rune { 298 switch eks { 299 case event.KSymGrave: 300 return '`' 301 case event.KSymAcute: 302 return '´' 303 case event.KSymCircumflex: 304 return '^' 305 case event.KSymTilde: 306 return '~' 307 case event.KSymCedilla: 308 return '¸' // 0xb8 309 case event.KSymBreve: 310 return '˘' // 0x2d8 311 case event.KSymCaron: 312 return 'ˇ' // 0x2c7 313 case event.KSymDiaresis: 314 return '¨' // 0xa8 315 case event.KSymRingAbove: 316 return '˚' // 0x2da 317 case event.KSymMacron: 318 return '¯' // 0xaf 319 320 case event.KSymKeypad0: 321 return '0' 322 case event.KSymKeypad1: 323 return '1' 324 case event.KSymKeypad2: 325 return '2' 326 case event.KSymKeypad3: 327 return '3' 328 case event.KSymKeypad4: 329 return '4' 330 case event.KSymKeypad5: 331 return '5' 332 case event.KSymKeypad6: 333 return '6' 334 case event.KSymKeypad7: 335 return '7' 336 case event.KSymKeypad8: 337 return '8' 338 case event.KSymKeypad9: 339 return '9' 340 341 case event.KSymKeypadMultiply: 342 return '*' 343 case event.KSymKeypadAdd: 344 return '+' 345 case event.KSymKeypadSubtract: 346 return '-' 347 case event.KSymKeypadDecimal: 348 return '.' 349 case event.KSymKeypadDivide: 350 return '/' 351 } 352 return rune(0) 353 } 354 355 //---------- 356 357 func translateModifiersToEventKeyModifiers(v uint16) event.KeyModifiers { 358 type pair struct { 359 a uint16 360 b event.KeyModifiers 361 } 362 pairs := []pair{ 363 {xproto.KeyButMaskShift, event.ModShift}, 364 {xproto.KeyButMaskControl, event.ModCtrl}, 365 {xproto.KeyButMaskLock, event.ModLock}, 366 {xproto.KeyButMaskMod1, event.Mod1}, 367 {xproto.KeyButMaskMod2, event.Mod2}, 368 {xproto.KeyButMaskMod3, event.Mod3}, 369 {xproto.KeyButMaskMod4, event.Mod4}, 370 {xproto.KeyButMaskMod5, event.Mod5}, 371 } 372 var w event.KeyModifiers 373 for _, p := range pairs { 374 if v&p.a > 0 { 375 w |= p.b 376 } 377 } 378 return w 379 } 380 381 func translateModifiersToEventMouseButtons(v uint16) event.MouseButtons { 382 type pair struct { 383 a uint16 384 b event.MouseButton 385 } 386 pairs := []pair{ 387 {xproto.KeyButMaskButton1, event.ButtonLeft}, 388 {xproto.KeyButMaskButton2, event.ButtonMiddle}, 389 {xproto.KeyButMaskButton3, event.ButtonRight}, 390 {xproto.KeyButMaskButton4, event.ButtonWheelUp}, 391 {xproto.KeyButMaskButton5, event.ButtonWheelDown}, 392 {xproto.KeyButMaskButton5 << 1, event.ButtonWheelLeft}, 393 {xproto.KeyButMaskButton5 << 2, event.ButtonWheelRight}, 394 {xproto.KeyButMaskButton5 << 3, event.ButtonBackward}, 395 // event sends uint16 (no support for forward?) 396 //{xproto.KeyButMaskButton5 << 4, event.ButtonForward}, 397 } 398 var w event.MouseButtons 399 for _, p := range pairs { 400 if v&p.a > 0 { 401 w |= event.MouseButtons(p.b) 402 } 403 } 404 return w 405 } 406 407 func translateButtonToEventButton(xb xproto.Button) event.MouseButton { 408 var b event.MouseButton 409 switch xb { 410 case 1: 411 b = event.ButtonLeft 412 case 2: 413 b = event.ButtonMiddle 414 case 3: 415 b = event.ButtonRight 416 case 4: 417 b = event.ButtonWheelUp 418 case 5: 419 b = event.ButtonWheelDown 420 case 6: 421 b = event.ButtonWheelLeft 422 case 7: 423 b = event.ButtonWheelRight 424 case 8: 425 b = event.ButtonBackward 426 case 9: 427 b = event.ButtonForward 428 } 429 return b 430 }