Skip to content

Commit

Permalink
Merge pull request quicksilver#719 from freewizard/master
Browse files Browse the repository at this point in the history
invokeService: use Quartz APIs in 10.7+
  • Loading branch information
pjrobertson committed Mar 17, 2012
2 parents d826a2c + 6cc5eee commit 14a3d97
Showing 1 changed file with 35 additions and 21 deletions.
56 changes: 35 additions & 21 deletions Quicksilver/Code-QuickStepCore/QSGlobalSelectionProvider.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ - (void)getSelection:(NSPasteboard *)pboard userData:(NSString *)userData error:
#ifdef DEBUG
if (VERBOSE) NSLog(@"Get Selection: %@ %d", userData, [userData characterAtIndex:0]);
#endif
if(resultPboard)
[resultPboard release];
if(resultPboard)
[resultPboard release];
resultPboard = [pboard retain];
}

Expand All @@ -52,15 +52,11 @@ - (void)performService:(NSPasteboard *)pboard
#endif

- (NSPasteboard *)getSelectionFromFrontApp {

//NSLog(@"GET SEL");
id oldServicesProvider = [[NSApp servicesProvider] retain];
[NSApp setServicesProvider:self];
//[self invokeService];
[NSThread detachNewThreadSelector:@selector(invokeService)
toTarget:self withObject:nil];

// return nil;
NSRunLoop *loop = [NSRunLoop currentRunLoop];
NSDate *date = [NSDate date];
while(!resultPboard && [date timeIntervalSinceNow] >-2) {
Expand All @@ -69,7 +65,7 @@ - (NSPasteboard *)getSelectionFromFrontApp {
}
// NSLog(@"got %@", resultPboard);
[NSApp setServicesProvider:oldServicesProvider];
[oldServicesProvider release];
[oldServicesProvider release];
id result = [resultPboard autorelease];
resultPboard = nil;
return result;
Expand All @@ -83,20 +79,38 @@ - (void)dealloc {

- (void)invokeService {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
pid_t pid = [[[[NSWorkspace sharedWorkspace] activeApplication] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
AXUIElementRef app = AXUIElementCreateApplication (pid);

// NDProcess *proc = [NDProcess frontProcess];

//BOOL carbon = [proc isCarbon];

AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)55, true ); //Command
// if (carbon) AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)56, true ); //Shift
AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)53, true ); //Escape
AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)53, false ); //Escape
// if (carbon) AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)56, false ); //Shift
AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)55, true ); //Command
CFRelease( app );
if ([NSApplication isLion]) {
//AXUIElement* is unable to post keys into sandboxed app since 10.7, use Quartz Event Services instead
pid_t pid = [[[[NSWorkspace sharedWorkspace] activeApplication] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
ProcessSerialNumber psn;
BOOL usePID = GetProcessForPID(pid, &psn) == 0;
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStatePrivate);
CGEventRef keyDown = CGEventCreateKeyboardEvent (source, (CGKeyCode)53, true); //Escape
CGEventSetFlags(keyDown, kCGEventFlagMaskCommand);
if (usePID) {
CGEventPostToPSN(&psn, keyDown);
} else {
CGEventPost(kCGHIDEventTap, keyDown);
}
CGEventRef keyUp = CGEventCreateKeyboardEvent (source, (CGKeyCode)53, false); //Escape
CGEventSetFlags(keyUp, kCGEventFlagMaskCommand);
if (usePID) {
CGEventPostToPSN(&psn, keyUp);
} else {
CGEventPost(kCGHIDEventTap, keyUp);
}
CFRelease(keyDown);
CFRelease(keyUp);
CFRelease(source);
} else {
pid_t pid = [[[[NSWorkspace sharedWorkspace] activeApplication] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
AXUIElementRef app = AXUIElementCreateApplication (pid);
AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)55, true ); //Command
AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)53, true ); //Escape
AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)53, false ); //Escape
AXUIElementPostKeyboardEvent (app, (CGCharCode) 0, (CGKeyCode)55, true ); //Command
CFRelease( app );
}
[pool release];
}

Expand Down

0 comments on commit 14a3d97

Please sign in to comment.