mirror of
https://github.com/go-vgo/robotgo.git
synced 2025-05-31 06:13:55 +00:00
Test utf-8
This commit is contained in:
parent
fbaf36442c
commit
be2888c12d
@ -193,14 +193,15 @@ void tapKey(char c, MMKeyFlags flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
void toggleUniKey(char c, const bool down)
|
|
||||||
{
|
void toggleUnicodeKey(unsigned long ch, const bool down){
|
||||||
/* This function relies on the convenient
|
/* This function relies on the convenient
|
||||||
* CGEventKeyboardSetUnicodeString(), which allows us to not have to
|
* CGEventKeyboardSetUnicodeString(), which allows us to not have to
|
||||||
* convert characters to a keycode, but does not support adding modifier
|
* convert characters to a keycode, but does not support adding modifier
|
||||||
* flags. It is therefore only used in typeString() and typeStringDelayed()
|
* flags. It is therefore only used in typeString() and typeStringDelayed()
|
||||||
* -- if you need modifier keys, use the above functions instead. */
|
* -- if you need modifier keys, use the above functions instead. */
|
||||||
UniChar ch = (UniChar)c; /* Convert to unsigned char */
|
|
||||||
|
// UniChar ch = (UniChar)c; /* Convert to unsigned char */
|
||||||
|
|
||||||
CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL, 0, down);
|
CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL, 0, down);
|
||||||
if (keyEvent == NULL) {
|
if (keyEvent == NULL) {
|
||||||
@ -208,11 +209,33 @@ void toggleUniKey(char c, const bool down)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch);
|
// CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch);
|
||||||
|
|
||||||
|
///////
|
||||||
|
if (ch > 0xFFFF) {
|
||||||
|
// encode to utf-16 if necessary
|
||||||
|
unsigned short surrogates[] = {
|
||||||
|
0xD800 + ((ch - 0x10000) >> 10),
|
||||||
|
0xDC00 + (ch & 0x3FF)
|
||||||
|
};
|
||||||
|
|
||||||
|
// CGEventKeyboardSetUnicodeString(keyEvent, 2, &surrogates);
|
||||||
|
UniChar ach = (UniChar)surrogates;
|
||||||
|
CGEventKeyboardSetUnicodeString(keyEvent, 2, &ach);
|
||||||
|
} else {
|
||||||
|
// CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch);
|
||||||
|
UniChar ach = (UniChar)ch;
|
||||||
|
CGEventKeyboardSetUnicodeString(keyEvent, 1, &ach);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////
|
||||||
CGEventPost(kCGSessionEventTap, keyEvent);
|
CGEventPost(kCGSessionEventTap, keyEvent);
|
||||||
CFRelease(keyEvent);
|
CFRelease(keyEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void toggleUniKey(char c, const bool down){
|
||||||
|
toggleUnicodeKey(c, down);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
#define toggleUniKey(c, down) toggleKey(c, down, MOD_NONE)
|
#define toggleUniKey(c, down) toggleKey(c, down, MOD_NONE)
|
||||||
#endif
|
#endif
|
||||||
@ -223,13 +246,62 @@ static void tapUniKey(char c)
|
|||||||
toggleUniKey(c, false);
|
toggleUniKey(c, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void typeString(const char *str)
|
void typeString(const char *str){
|
||||||
{
|
// while (*str != '\0') {
|
||||||
|
// tapUniKey(*str++);
|
||||||
|
// }
|
||||||
|
|
||||||
|
unsigned short c;
|
||||||
|
unsigned short c1;
|
||||||
|
unsigned short c2;
|
||||||
|
unsigned short c3;
|
||||||
|
unsigned long n;
|
||||||
|
|
||||||
while (*str != '\0') {
|
while (*str != '\0') {
|
||||||
tapUniKey(*str++);
|
c = *str++;
|
||||||
|
|
||||||
|
// warning, the following utf8 decoder
|
||||||
|
// doesn't perform validation
|
||||||
|
if (c <= 0x7F) {
|
||||||
|
// 0xxxxxxx one byte
|
||||||
|
n = c;
|
||||||
|
} else if ((c & 0xE0) == 0xC0) {
|
||||||
|
// 110xxxxx two bytes
|
||||||
|
c1 = (*str++) & 0x3F;
|
||||||
|
n = ((c & 0x1F) << 6) | c1;
|
||||||
|
} else if ((c & 0xF0) == 0xE0) {
|
||||||
|
// 1110xxxx three bytes
|
||||||
|
c1 = (*str++) & 0x3F;
|
||||||
|
c2 = (*str++) & 0x3F;
|
||||||
|
n = ((c & 0x0F) << 12) | (c1 << 6) | c2;
|
||||||
|
} else if ((c & 0xF8) == 0xF0) {
|
||||||
|
// 11110xxx four bytes
|
||||||
|
c1 = (*str++) & 0x3F;
|
||||||
|
c2 = (*str++) & 0x3F;
|
||||||
|
c3 = (*str++) & 0x3F;
|
||||||
|
n = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// printf("n-------------%zd\n", n);
|
||||||
|
|
||||||
|
#if defined(IS_MACOSX)
|
||||||
|
toggleUnicodeKey(n, true);
|
||||||
|
toggleUnicodeKey(n, false);
|
||||||
|
#else
|
||||||
|
toggleUniKey(n, true);
|
||||||
|
toggleUniKey(n, false);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void typeString(const char *str)
|
||||||
|
// {
|
||||||
|
// while (*str != '\0') {
|
||||||
|
// tapUniKey(*str++);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
void typeStringDelayed(const char *str, const unsigned cpm)
|
void typeStringDelayed(const char *str, const unsigned cpm)
|
||||||
{
|
{
|
||||||
/* Characters per second */
|
/* Characters per second */
|
||||||
|
Loading…
Reference in New Issue
Block a user