lazydocker/vendor/github.com/micmonay/keybd_event/keybd_darwin.go
2022-05-14 12:44:00 +10:00

262 lines
5.6 KiB
Go

package keybd_event
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa
#import <Foundation/Foundation.h>
CGEventRef CreateDown(int k){
CGEventRef event = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)k, true);
return event;
}
CGEventRef CreateUp(int k){
CGEventRef event = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)k, false);
return event;
}
void KeyTap(CGEventRef event){
CGEventPost(kCGAnnotatedSessionEventTap, event);
CFRelease(event);
}
void AddActionKey(CGEventFlags type,CGEventRef event){
CGEventSetFlags(event, type);
}
*/
import "C"
import "time"
const (
_AShift = C.kCGEventFlagMaskAlphaShift
_VK_SHIFT = C.kCGEventFlagMaskShift
_VK_CTRL = C.kCGEventFlagMaskControl
_VK_ALT = C.kCGEventFlagMaskAlternate
_VK_CMD = C.kCGEventFlagMaskCommand
_Help = C.kCGEventFlagMaskHelp
_VK_FN = C.kCGEventFlagMaskSecondaryFn
_NumPad = C.kCGEventFlagMaskNumericPad
_Coalesced = C.kCGEventFlagMaskNonCoalesced
_VK_Control = 0x3B
_VK_RightShift = 0x3C
_VK_RightControl = 0x3E
_VK_Command = 0x37
_VK_Shift = 0x38
)
func initKeyBD() error { return nil }
// Press key(s)
func (k *KeyBonding) Press() error {
for _, key := range k.keys {
k.keyPress(key)
}
return nil
}
// Release key(s)
func (k *KeyBonding) Release() error {
for _, key := range k.keys {
k.keyRelease(key)
}
return nil
}
// Launch key bounding
func (k *KeyBonding) Launching() error {
for _, key := range k.keys {
k.tapKey(key)
}
return nil
}
func altgr(event C.CGEventRef) {
alt(event)
}
func shift(event C.CGEventRef) {
C.AddActionKey(_VK_SHIFT, event)
}
func ctrl(event C.CGEventRef) {
C.AddActionKey(_VK_CTRL, event)
}
func alt(event C.CGEventRef) {
C.AddActionKey(_VK_ALT, event)
}
func cmd(event C.CGEventRef) {
C.AddActionKey(_VK_CMD, event)
}
func (k KeyBonding) keyPress(key int) {
downEvent := C.CreateDown(C.int(key))
if k.hasALT {
alt(downEvent)
}
if k.hasCTRL {
ctrl(downEvent)
}
if k.hasSHIFT {
shift(downEvent)
}
if k.hasRCTRL { //not support on mac
ctrl(downEvent)
}
if k.hasRSHIFT { //not support on mac
shift(downEvent)
}
if k.hasALTGR {
altgr(downEvent)
}
if k.hasSuper {
cmd(downEvent)
}
C.KeyTap(downEvent)
}
func (k KeyBonding) keyRelease(key int) {
upEvent := C.CreateUp(C.int(key))
if k.hasALT {
alt(upEvent)
}
if k.hasCTRL {
ctrl(upEvent)
}
if k.hasSHIFT {
shift(upEvent)
}
if k.hasRCTRL { //not support on mac
ctrl(upEvent)
}
if k.hasRSHIFT { //not support on mac
shift(upEvent)
}
if k.hasALTGR {
altgr(upEvent)
}
if k.hasSuper {
cmd(upEvent)
}
C.KeyTap(upEvent)
}
func (k KeyBonding) tapKey(key int) {
k.keyPress(key)
time.Sleep(100 * time.Millisecond) //ignore if speed is most in my test system
k.keyRelease(key)
}
const (
VK_SP1 = 0x0A
VK_SP2 = 0x1B
VK_SP3 = 0x18
VK_SP4 = 0x21
VK_SP5 = 0x1E
VK_SP6 = 0x29
VK_SP7 = 0x27
VK_SP8 = 0x2A
VK_SP9 = 0x2B
VK_SP10 = 0x2F
VK_SP11 = 0x2C
VK_SP12 = 0x32
VK_A = 0x00
VK_S = 0x01
VK_D = 0x02
VK_F = 0x03
VK_H = 0x04
VK_G = 0x05
VK_Z = 0x06
VK_X = 0x07
VK_C = 0x08
VK_V = 0x09
VK_B = 0x0B
VK_Q = 0x0C
VK_W = 0x0D
VK_E = 0x0E
VK_R = 0x0F
VK_Y = 0x10
VK_T = 0x11
VK_1 = 0x12
VK_2 = 0x13
VK_3 = 0x14
VK_4 = 0x15
VK_6 = 0x16
VK_5 = 0x17
VK_EQUAL = 0x18
VK_9 = 0x19
VK_7 = 0x1A
VK_MINUS = 0x1B
VK_8 = 0x1C
VK_0 = 0x1D
VK_RightBracket = 0x1E
VK_O = 0x1F
VK_U = 0x20
VK_LeftBracket = 0x21
VK_I = 0x22
VK_P = 0x23
VK_L = 0x25
VK_J = 0x26
VK_Quote = 0x27
VK_K = 0x28
VK_SEMICOLON = 0x29
VK_BACKSLASH = 0x2A
VK_COMMA = 0x2B
VK_SLASH = 0x2C
VK_N = 0x2D
VK_M = 0x2E
VK_Period = 0x2F
VK_GRAVE = 0x32
VK_KeypadDecimal = 0x41
VK_KeypadMultiply = 0x43
VK_KeypadPlus = 0x45
VK_KeypadClear = 0x47
VK_KeypadDivide = 0x4B
VK_KeypadEnter = 0x4C
VK_KeypadMinus = 0x4E
VK_KeypadEquals = 0x51
VK_Keypad0 = 0x52
VK_Keypad1 = 0x53
VK_Keypad2 = 0x54
VK_Keypad3 = 0x55
VK_Keypad4 = 0x56
VK_Keypad5 = 0x57
VK_Keypad6 = 0x58
VK_Keypad7 = 0x59
VK_Keypad8 = 0x5B
VK_Keypad9 = 0x5C
VK_ENTER = 0x24
VK_TAB = 0x30
VK_SPACE = 0x31
VK_DELETE = 0x33
VK_ESC = 0x35
VK_CAPSLOCK = 0x39
VK_Option = 0x3A
VK_RightOption = 0x3D
VK_Function = 0x3F
VK_F17 = 0x40
VK_VOLUMEUP = 0x48
VK_VOLUMEDOWN = 0x49
VK_MUTE = 0x4A
VK_F18 = 0x4F
VK_F19 = 0x50
VK_F20 = 0x5A
VK_F5 = 0x60
VK_F6 = 0x61
VK_F7 = 0x62
VK_F3 = 0x63
VK_F8 = 0x64
VK_F9 = 0x65
VK_F11 = 0x67
VK_F13 = 0x69
VK_F16 = 0x6A
VK_F14 = 0x6B
VK_F10 = 0x6D
VK_F12 = 0x6F
VK_F15 = 0x71
VK_HELP = 0x72
VK_HOME = 0x73
VK_PAGEUP = 0x74
VK_ForwardDelete = 0x75
VK_F4 = 0x76
VK_END = 0x77
VK_F2 = 0x78
VK_PAGEDOWN = 0x79
VK_F1 = 0x7A
VK_LEFT = 0x7B
VK_RIGHT = 0x7C
VK_DOWN = 0x7D
VK_UP = 0x7E
)