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  }