void MacOSKeyboardOStream::sendKeyCode(uint16_t key) { #if __APPLE__ if (ofGetElapsedTimeMillis() < elapsed_time_ + kGracePeriod) { return; } elapsed_time_ = ofGetElapsedTimeMillis(); // Get the process number for the front application. ProcessSerialNumber psn = { 0, kNoProcess }; GetFrontProcess( &psn ); CGEventRef key_down = CGEventCreateKeyboardEvent(NULL, key, true); CGEventRef key_up = CGEventCreateKeyboardEvent(NULL, key, false); CGEventPostToPSN(&psn, key_down); CGEventPostToPSN(&psn, key_up); CFRelease(key_down); CFRelease(key_up); #endif }
void MacOSMouseOStream::doubleClick(pair<uint32_t, uint32_t> mouse, int clickCount) { #if __APPLE__ CGPoint point = CGPointMake(mouse.first, mouse.second); CGEventRef theEvent = CGEventCreateMouseEvent( NULL, kCGEventLeftMouseDown, point, kCGMouseButtonLeft); ProcessSerialNumber psn = { 0, kNoProcess }; GetFrontProcess( &psn ); CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, clickCount); CGEventPostToPSN(&psn, theEvent); CGEventSetType(theEvent, kCGEventLeftMouseUp); CGEventPostToPSN(&psn, theEvent); CGEventSetType(theEvent, kCGEventLeftMouseDown); CGEventPostToPSN(&psn, theEvent); CGEventSetType(theEvent, kCGEventLeftMouseUp); CGEventPostToPSN(&psn, theEvent); CFRelease(theEvent); #endif }
Qt::Native::Status sendNativeKeyEventToProcess_Quartz(const QNativeKeyEvent &event, int pid) { ProcessSerialNumber psn; GetProcessForPID(pid, &psn); CGEventRef e = CGEventCreateKeyboardEvent(0, (uint)event.nativeKeyCode, event.press); setModifiersFromQNativeEvent(e, event); SetFrontProcess(&psn); CGEventPostToPSN(&psn, e); CFRelease(e); return Qt::Native::Success; }
void MacOSKeyboardOStream::sendKey(char c) { #if __APPLE__ if (ofGetElapsedTimeMillis() < elapsed_time_ + kGracePeriod) { return; } elapsed_time_ = ofGetElapsedTimeMillis(); // Get the process number for the front application. ProcessSerialNumber psn = { 0, kNoProcess }; GetFrontProcess( &psn ); UniChar uni_char = c; CGEventRef key_down = CGEventCreateKeyboardEvent(NULL, 0, true); CGEventRef key_up = CGEventCreateKeyboardEvent(NULL, 0, false); CGEventKeyboardSetUnicodeString(key_down, 1, &uni_char); CGEventKeyboardSetUnicodeString(key_up, 1, &uni_char); CGEventPostToPSN(&psn, key_down); CGEventPostToPSN(&psn, key_up); CFRelease(key_down); CFRelease(key_up); #endif }
void KwmEmitKeystrokes(std::string Text) { CFStringRef TextRef = CFStringCreateWithCString(NULL, Text.c_str(), kCFStringEncodingMacRoman); CGEventRef EventKeyDown = CGEventCreateKeyboardEvent(NULL, 0, true); CGEventRef EventKeyUp = CGEventCreateKeyboardEvent(NULL, 0, false); UniChar OutputBuffer; for(std::size_t CharIndex = 0; CharIndex < Text.size(); ++CharIndex) { CFStringGetCharacters(TextRef, CFRangeMake(CharIndex, 1), &OutputBuffer); CGEventSetFlags(EventKeyDown, 0); CGEventKeyboardSetUnicodeString(EventKeyDown, 1, &OutputBuffer); CGEventPostToPSN(&KWMFocus.PSN, EventKeyDown); CGEventSetFlags(EventKeyUp, 0); CGEventKeyboardSetUnicodeString(EventKeyUp, 1, &OutputBuffer); CGEventPostToPSN(&KWMFocus.PSN, EventKeyUp); } CFRelease(EventKeyUp); CFRelease(EventKeyDown); CFRelease(TextRef); }
void MacOSKeyboardOStream::sendString(const std::string& str) { #if __APPLE__ // Get the process number for the front application. ProcessSerialNumber psn = { 0, kNoProcess }; GetFrontProcess( &psn ); UniChar s[str.length()]; for (uint32_t i = 0; i < str.length(); i++) { s[i] = str[i]; } CGEventRef e = CGEventCreateKeyboardEvent(NULL, 0, true); CGEventKeyboardSetUnicodeString(e, str.length(), s); CGEventPostToPSN(&psn, e); CFRelease(e); #endif }
CGEventRef CGEventCallback(CGEventTapProxy Proxy, CGEventType Type, CGEventRef Event, void *Refcon) { switch(Type) { case kCGEventTapDisabledByTimeout: case kCGEventTapDisabledByUserInput: { if(!KWMMach.DisableEventTapInternal) { DEBUG("Restarting Event Tap"); CGEventTapEnable(KWMMach.EventTap, true); } } break; case kCGEventKeyDown: { if(KWMToggles.UseBuiltinHotkeys) { hotkey Eventkey = {}, Hotkey = {}; CreateHotkeyFromCGEvent(Event, &Eventkey); if(HotkeyExists(Eventkey.Mod, Eventkey.Key, &Hotkey, KWMHotkeys.ActiveMode->Name)) { KWMHotkeys.Queue.push(Hotkey); if(!Hotkey.Passthrough) return NULL; } } if(KWMMode.Focus == FocusModeAutofocus && !IsActiveSpaceFloating()) { CGEventSetIntegerValueField(Event, kCGKeyboardEventAutorepeat, 0); CGEventPostToPSN(&KWMFocus.PSN, Event); return NULL; } } break; case kCGEventKeyUp: { if(KWMMode.Focus == FocusModeAutofocus && !IsActiveSpaceFloating()) { CGEventSetIntegerValueField(Event, kCGKeyboardEventAutorepeat, 0); CGEventPostToPSN(&KWMFocus.PSN, Event); return NULL; } } break; case kCGEventMouseMoved: { pthread_mutex_lock(&KWMThread.Lock); if(!IsSpaceTransitionInProgress()) { UpdateActiveScreen(); if(KWMMode.Focus != FocusModeDisabled && KWMMode.Focus != FocusModeStandby && !IsActiveSpaceFloating()) FocusWindowBelowCursor(); } pthread_mutex_unlock(&KWMThread.Lock); } break; default: {} break; } return Event; }