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  //}