From 67e8918365587ed48756a706e157e4a676e9c5b8 Mon Sep 17 00:00:00 2001 From: vCaesar Date: Sun, 13 Nov 2016 23:46:33 +0800 Subject: [PATCH] Update KeyToggle & KeyTap --- key/goKey.h | 59 ++++++++++++++++++++++++++++++++++++++++++++++++----- robotgo.go | 56 ++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 99 insertions(+), 16 deletions(-) diff --git a/key/goKey.h b/key/goKey.h index ee70127..2dadd59 100644 --- a/key/goKey.h +++ b/key/goKey.h @@ -163,18 +163,32 @@ int CheckKeyFlags(char* f, MMKeyFlags* flags) return 0; } -// //If it's not an array, it should be a single string value. +int GetFlagsFromValue(char* value[], MMKeyFlags* flags){ + if (!flags) {return -1;} -char* aKeyTap(char *k,char *akey){ + for (int i = 0; i <2; i++){ + MMKeyFlags f = MOD_NONE; + const int rv = CheckKeyFlags(value[i], &f); + if (rv) return rv; + + *flags = (MMKeyFlags)(*flags | f); + } + return 0; + // return CheckKeyFlags(fstr, flags); +} + +// If it's not an array, it should be a single string value. + +char* aKeyTap(char *k,char *akey,char *akeyt){ MMKeyFlags flags = (MMKeyFlags) MOD_NONE; // MMKeyFlags flags = 0; MMKeyCode key; // char *k; // k = *kstr; - if (strcmp(akey, "null") != 0){ - switch (CheckKeyFlags(akey,&flags)){ + if (strcmp(akeyt, "null") == 0){ + switch (CheckKeyFlags(akey,&flags)){ case -1: return "Null pointer in key flag."; break; @@ -182,6 +196,17 @@ char* aKeyTap(char *k,char *akey){ return "Invalid key flag specified."; break; } + }else{ + char* akeyarr[2] = {akey,akeyt}; + switch(GetFlagsFromValue(akeyarr,&flags)){ + case -1: + return "Null pointer in key flag."; + break; + case -2: + return "Invalid key flag specified."; + break; + } + } } switch(CheckKeyCodes(k, &key)){ @@ -199,7 +224,7 @@ char* aKeyTap(char *k,char *akey){ return "0"; } -char* aKeyToggle(char *k,char *d){ +char* aKeyToggle(char *k,char *d,char *akey,char *akeyt){ MMKeyFlags flags = (MMKeyFlags) MOD_NONE; MMKeyCode key; @@ -219,6 +244,30 @@ char* aKeyToggle(char *k,char *d){ } } + if (strcmp(akey, "null") != 0){ + if (strcmp(akeyt, "null") == 0){ + switch (CheckKeyFlags(akey,&flags)){ + case -1: + return "Null pointer in key flag."; + break; + case -2: + return "Invalid key flag specified."; + break; + } + }else{ + char* akeyarr[2] = {akey,akeyt}; + switch (GetFlagsFromValue(akeyarr, &flags)) + { + case -1: + return "Null pointer in key flag."; + break; + case -2: + return "Invalid key flag specified."; + break; + } + } + } + switch(CheckKeyCodes(k, &key)){ case -1: return "Null pointer in key code."; diff --git a/robotgo.go b/robotgo.go index 6b30577..a54b10c 100644 --- a/robotgo.go +++ b/robotgo.go @@ -278,9 +278,24 @@ func Try(fun func(), handler func(interface{})) { } func KeyTap(args ...string) { + // func KeyTap(args ...interface{}) { var akey string + var akeyt string + // var ckeyarr []*C.char + // var keyarr []string + Try(func() { akey = args[1] + // for i, _ := range keyarr { + // ckeyarr = append(ckeyarr, (*C.char)(unsafe.Pointer(C.CString(keyarr[i])))) + // } + Try(func() { + akeyt = args[2] + }, func(e interface{}) { + // Println("err:::", e) + akeyt = "null" + }) + }, func(e interface{}) { // Println("err:::", e) akey = "null" @@ -288,31 +303,50 @@ func KeyTap(args ...string) { zkey := C.CString(args[0]) amod := C.CString(akey) - // defer func() { - C.aKeyTap(zkey, amod) - // }() + amodt := C.CString(akeyt) + + C.aKeyTap(zkey, amod, amodt) defer C.free(unsafe.Pointer(zkey)) defer C.free(unsafe.Pointer(amod)) + defer C.free(unsafe.Pointer(amodt)) } func KeyToggle(args ...string) { - var akey string + var adown string + var amkey string + var amkeyt string Try(func() { - akey = args[1] + adown = args[1] + Try(func() { + amkey = args[2] + Try(func() { + amkeyt = args[3] + }, func(e interface{}) { + // Println("err:::", e) + amkeyt = "null" + }) + }, func(e interface{}) { + // Println("err:::", e) + amkey = "null" + }) }, func(e interface{}) { // Println("err:::", e) - akey = "null" + adown = "null" }) - zkey := C.CString(args[0]) - amod := C.CString(akey) + ckey := C.CString(args[0]) + cadown := C.CString(adown) + camkey := C.CString(amkey) + camkeyt := C.CString(amkeyt) // defer func() { - str := C.aKeyToggle(zkey, amod) + str := C.aKeyToggle(ckey, cadown, camkey, camkeyt) Println(str) // }() - defer C.free(unsafe.Pointer(zkey)) - defer C.free(unsafe.Pointer(amod)) + defer C.free(unsafe.Pointer(ckey)) + defer C.free(unsafe.Pointer(cadown)) + defer C.free(unsafe.Pointer(camkey)) + defer C.free(unsafe.Pointer(camkeyt)) } func TypeString(x string) {