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  }