Fix bug in MacOS implementation

This commit is contained in:
Federico Terzi 2019-09-06 11:04:15 +02:00
parent 3479c9a709
commit ec159129f2

View File

@ -29,18 +29,34 @@ void send_string(const char * string) {
char * stringCopy = strdup(string); char * stringCopy = strdup(string);
dispatch_async(dispatch_get_main_queue(), ^(void) { dispatch_async(dispatch_get_main_queue(), ^(void) {
// Convert the c string to a UniChar array as required by the CGEventKeyboardSetUnicodeString method // Convert the c string to a UniChar array as required by the CGEventKeyboardSetUnicodeString method
NSString *nsString = [NSString stringWithUTF8String:stringCopy]; NSString *nsString = [NSString stringWithUTF8String:stringCopy];CFStringRef cfString = (__bridge CFStringRef) nsString;
CFStringRef cfString = (__bridge CFStringRef) nsString;
std::vector <UniChar> buffer(nsString.length); std::vector <UniChar> buffer(nsString.length);
CFStringGetCharacters(cfString, CFRangeMake(0, nsString.length), buffer.data()); CFStringGetCharacters(cfString, CFRangeMake(0, nsString.length), buffer.data());
free(stringCopy); free(stringCopy);
// Send the event // Send the event
CGEventRef e = CGEventCreateKeyboardEvent(NULL, 0x31, true);
CGEventKeyboardSetUnicodeString(e, buffer.size(), buffer.data()); // Because of a bug ( or undocumented limit ) of the CGEventKeyboardSetUnicodeString method
CGEventPost(kCGHIDEventTap, e); // the string gets truncated after 20 characters, so we need to send multiple events.
CFRelease(e);
int i = 0;
while (i < buffer.size()) {
int chunk_size = 20;
if ((i+chunk_size) > buffer.size()) {
chunk_size = buffer.size() - i;
}
UniChar * offset_buffer = buffer.data() + i;
CGEventRef e = CGEventCreateKeyboardEvent(NULL, 0x31, true);
CGEventKeyboardSetUnicodeString(e, chunk_size, offset_buffer);
CGEventPost(kCGHIDEventTap, e);
CFRelease(e);
usleep(2000);
i += chunk_size;
}
}); });
} }