OSType WBProcessGetFrontProcessSignature(void) { ProcessSerialNumber psn; if (noErr == GetFrontProcess(&psn)) { return WBProcessGetSignature(&psn); } return 0; }
void Overlay::toggleShow() { if (g.ocIntercept) { g.ocIntercept->hideGui(); } else { foreach(OverlayClient *oc, qlClients) { if (oc->uiPid) { #if defined(Q_OS_WIN) HWND hwnd = GetForegroundWindow(); DWORD pid = 0; GetWindowThreadProcessId(hwnd, &pid); if (pid != oc->uiPid) continue; #elif defined(Q_OS_MAC) pid_t pid = 0; ProcessSerialNumber psn; GetFrontProcess(&psn); GetProcessPID(&psn, &pid); if (pid != oc->uiPid) continue; #if 0 // Fullscreen only. if (! CGDisplayIsCaptured(CGMainDisplayID())) continue; #endif #endif oc->showGui(); return; } } } }
CFStringRef WBProcessCopyFrontProcessBundleIdentifier(void) { ProcessSerialNumber psn; if (noErr == GetFrontProcess(&psn)) { return WBProcessCopyBundleIdentifier(&psn); } return NULL; }
static AXUIElementRef getFrontMostApp () { pid_t pid; ProcessSerialNumber psn; GetFrontProcess(&psn); GetProcessPID(&psn, &pid); return AXUIElementCreateApplication(pid); }
/* * Like FrontWindow(), but return NULL if we aren't the front process * (i.e. the front window isn't one of ours). */ WindowPtr mac_frontwindow(void) { ProcessSerialNumber frontpsn; ProcessSerialNumber curpsn = { 0, kCurrentProcess }; Boolean result; GetFrontProcess(&frontpsn); if (SameProcess(&frontpsn, &curpsn, &result) == noErr && result) return FrontWindow(); return NULL; }
pid_t getFrontmostPID(void) { pid_t pid; ProcessSerialNumber psn; GetFrontProcess(&psn); GetProcessPID(&psn, &pid); return pid; }
Boolean HelperMacX::isFrontProcess(pid_t pid){ Boolean result; ProcessSerialNumber pidPSN; ProcessSerialNumber frontPSN; OSStatus status = GetProcessForPID(pid, &pidPSN); if (noErr != status) { qWarning("HelperMacX::isFrontProcess: GetProcessForPID error for pid %d: %d", pid, (int)status); return false; } GetFrontProcess(&frontPSN); SameProcess(&pidPSN, &frontPSN, &result); return result; }
/** This chunk of code is heavily based off SDL_macosx.m from SDL. * The CPSEnableForegroundOperation that was here before is private * and should not be used. * Replaced by a call to the 10.3+ TransformProcessType. */ void osx_foreground_hack(void) { #if !defined (CONFIG_MACOSX_FINDER) || !defined (CONFIG_SDL) ProcessSerialNumber myProc, frProc; Boolean sameProc; if (GetFrontProcess(&frProc) == noErr && GetCurrentProcess(&myProc) == noErr) { if (SameProcess(&frProc, &myProc, &sameProc) == noErr && !sameProc) { TransformProcessType(&myProc, kProcessTransformToForegroundApplication); } SetFrontProcess(&myProc); } #endif }
int is_mplayer_front(void) { ProcessSerialNumber myProc, frProc; Boolean sameProc; pid_t parentPID; if (GetFrontProcess(&frProc) == noErr && GetCurrentProcess(&myProc) == noErr && SameProcess(&frProc, &myProc, &sameProc) == noErr) { if (sameProc) return 1; // If MPlayer is running in slave mode, also check parent process. if (slave_mode && GetProcessPID(&frProc, &parentPID) == noErr) return parentPID==getppid(); } return 0; }
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 }
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 }
boolean getyesno(char default_answer) { extern FILE *logfile; short alertid,i,large,err; char dfault[8], ndfault[8]; ProcessSerialNumber psn; if (batchmode) return(default_answer == 'y' ? TRUE : FALSE); if (strlen(Yes_No_Message)<72) large=0; else large=100; strcpy(dfault,default_answer == 'y' ? LANG("y") : LANG("n")); strcpy(ndfault,default_answer == 'n' ? LANG("y") : LANG("n")); for(i=0;i<strlen(Yes_No_Message);i++) if (Yes_No_Message[i]<' ' && Yes_No_Message[i]>=0) Yes_No_Message[i]=' '; /* It's a signed char! */ InitCursor(); alertid=(default_answer == 'n' ? 211+large : 212+large); c2pstr(Yes_No_Message); ParamText((uchar *)Yes_No_Message,(uchar *)"", \ (uchar *)"",(uchar *)""); if (AEProcessing) { if (gHasProcessManager) GetFrontProcess(&psn); if(MyInteractWithUser()) return default_answer; if (gHasProcessManager) SetFrontProcess(&psn); } if (CautionAlert(alertid,nil)==1){ p2cstr((uchar *)Yes_No_Message); fputs(strcat(Yes_No_Message,dfault),stderr); fputc('\n',stderr); fflush(stderr); return(default_answer == 'y' ? TRUE : FALSE); } p2cstr((uchar *)Yes_No_Message); fputs(strcat(Yes_No_Message,ndfault),stderr); fputc('\n',stderr); fflush(stderr); return(default_answer == 'n' ? TRUE : FALSE); }
extern pascal Boolean MoreProcIsProcessAtFront(const ProcessSerialNumber *pPSN) // See comment in header. { OSStatus anErr; ProcessSerialNumber localPSN; ProcessSerialNumber frontPSN; Boolean isSame; if ( pPSN == nil ) { localPSN.highLongOfPSN = 0; localPSN.lowLongOfPSN = kCurrentProcess; } else { localPSN = *pPSN; } anErr = GetFrontProcess(&frontPSN); if (noErr == anErr) { anErr = SameProcess(&localPSN, &frontPSN, &isSame); } MoreAssertQ(noErr == anErr); // If either of the previous return an error, we want to know why. return (noErr == anErr) && isSame; }
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 }
int main(int argc, char **argv) #endif { ll_init_apr(); // Set up llerror logging { LLError::initForApplication("."); LLError::setDefaultLevel(LLError::LEVEL_INFO); // LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG); // LLError::logToFile("slplugin.log"); } #if LL_WINDOWS if( strlen( lpCmdLine ) == 0 ) { LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL; }; U32 port = 0; if(!LLStringUtil::convertToU32(lpCmdLine, port)) { LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL; }; // Insert our exception handler into the system so this plugin doesn't // display a crash message if something bad happens. The host app will // see the missing heartbeat and log appropriately. initExceptionHandler(); #elif LL_DARWIN || LL_LINUX if(argc < 2) { LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL; } U32 port = 0; if(!LLStringUtil::convertToU32(argv[1], port)) { LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL; } // Catch signals that most kinds of crashes will generate, and exit cleanly so the system crash dialog isn't shown. signal(SIGILL, &crash_handler); // illegal instruction # if LL_DARWIN signal(SIGEMT, &crash_handler); // emulate instruction executed # endif // LL_DARWIN signal(SIGFPE, &crash_handler); // floating-point exception signal(SIGBUS, &crash_handler); // bus error signal(SIGSEGV, &crash_handler); // segmentation violation signal(SIGSYS, &crash_handler); // non-existent system call invoked #endif #if LL_DARWIN setupCocoa(); createAutoReleasePool(); #endif LLPluginProcessChild *plugin = new LLPluginProcessChild(); plugin->init(port); #if LL_DARWIN deleteAutoReleasePool(); #endif LLTimer timer; timer.start(); #if LL_WINDOWS checkExceptionHandler(); #endif #if LL_DARWIN // If the plugin opens a new window (such as the Flash plugin's fullscreen player), we may need to bring this plugin process to the foreground. // Use this to track the current frontmost window and bring this process to the front if it changes. WindowRef front_window = NULL; WindowGroupRef layer_group = NULL; int window_hack_state = 0; CreateWindowGroup(kWindowGroupAttrFixedLevel, &layer_group); if(layer_group) { // Start out with a window layer that's way out in front (fixes the problem with the menubar not getting hidden on first switch to fullscreen youtube) SetWindowGroupName(layer_group, CFSTR("SLPlugin Layer")); SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel); } #endif #if LL_DARWIN EventTargetRef event_target = GetEventDispatcherTarget(); #endif while(!plugin->isDone()) { #if LL_DARWIN createAutoReleasePool(); #endif timer.reset(); plugin->idle(); #if LL_DARWIN { // Some plugins (webkit at least) will want an event loop. This qualifies. EventRef event; if(ReceiveNextEvent(0, 0, kEventDurationNoWait, true, &event) == noErr) { SendEventToEventTarget (event, event_target); ReleaseEvent(event); } // Check for a change in this process's frontmost window. if(FrontWindow() != front_window) { ProcessSerialNumber self = { 0, kCurrentProcess }; ProcessSerialNumber parent = { 0, kNoProcess }; ProcessSerialNumber front = { 0, kNoProcess }; Boolean this_is_front_process = false; Boolean parent_is_front_process = false; { // Get this process's parent ProcessInfoRec info; info.processInfoLength = sizeof(ProcessInfoRec); info.processName = NULL; info.processAppSpec = NULL; if(GetProcessInformation( &self, &info ) == noErr) { parent = info.processLauncher; } // and figure out whether this process or its parent are currently frontmost if(GetFrontProcess(&front) == noErr) { (void) SameProcess(&self, &front, &this_is_front_process); (void) SameProcess(&parent, &front, &parent_is_front_process); } } if((FrontWindow() != NULL) && (front_window == NULL)) { // Opening the first window if(window_hack_state == 0) { // Next time through the event loop, lower the window group layer window_hack_state = 1; } if(layer_group) { SetWindowGroup(FrontWindow(), layer_group); } if(parent_is_front_process) { // Bring this process's windows to the front. (void) SetFrontProcess( &self ); } ActivateWindow(FrontWindow(), true); } else if((FrontWindow() == NULL) && (front_window != NULL)) { // Closing the last window if(this_is_front_process) { // Try to bring this process's parent to the front (void) SetFrontProcess(&parent); } } else if(window_hack_state == 1) { if(layer_group) { // Set the window group level back to something less extreme SetWindowGroupLevel(layer_group, kCGNormalWindowLevel); } window_hack_state = 2; } front_window = FrontWindow(); } } #endif F64 elapsed = timer.getElapsedTimeF64(); F64 remaining = plugin->getSleepTime() - elapsed; if(remaining <= 0.0f) { // We've already used our full allotment. // LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, not sleeping" << LL_ENDL; // Still need to service the network... plugin->pump(); } else { // LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL; // timer.reset(); // This also services the network as needed. plugin->sleep(remaining); // LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" << LL_ENDL; } #if LL_WINDOWS // More agressive checking of interfering exception handlers. // Doesn't appear to be required so far - even for plugins // that do crash with a single call to the intercept // exception handler such as QuickTime. //checkExceptionHandler(); #endif #if LL_DARWIN deleteAutoReleasePool(); #endif } delete plugin; ll_cleanup_apr(); return 0; }