[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Logout w/o alert panel
Nicholas,
The keys are two. First, to use AppleEvent directly instead of
AppleScript. AS seems to be crippled due to serve user safely. Second,
prior to quit loginwindow, quit Terminal and Finder. They persist when
they receive kAEQuitApplication event.
Sending AppleEvent, here's a sample code:
#import <Carbon/Carbon.h>
- (void)getProcessSerialNumber:(ProcessSerialNumber *)psn
forApplicationName:(NSString *)name
{
ProcessInfoRec pir;
char processName[100];
const char *cName = [name cString];
psn->highLongOfPSN = kNoProcess;
psn->lowLongOfPSN = kNoProcess;
pir.processInfoLength = sizeof(ProcessInfoRec);
pir.processName = processName;
pir.processAppSpec = NULL;
while ( GetNextProcess( psn ) == noErr ) {
GetProcessInformation( psn, &pir );
if ( strncmp( &pir.processName[1], cName, pir.processName[0] ) ==
0 )
break;
}
}
- (void)sendAppleEventClass:(DescType)eventClass
eventID:(DescType)eventID toApplicationNamed:(NSString *)name
{
OSErr err;
ProcessSerialNumber psn;
AEAddressDesc address;
AppleEvent ae, reply;
[self getProcessSerialNumber:&psn forApplicationName:name];
//NSLog( @"psn:%d %d", psn.highLongOfPSN, psn.lowLongOfPSN );
err = AECreateDesc( typeProcessSerialNumber, &psn,
sizeof(ProcessSerialNumber), &address );
//NSLog( @"AECreateDesc:%d", err );
err = AECreateAppleEvent( eventClass, eventID, &address,
kAutoGenerateReturnID, kAnyTransactionID, &ae );
//NSLog( @"AECreateAppleEvent:%d", err );
err = AESend( &ae, &reply, kAENoReply, kAENormalPriority, 1000,
NULL, NULL);
//NSLog( @"AESend:%d", err );
}
[self sendAppleEventClass:kCoreEventClass eventID:kAEQuitAll
toApplicationNamed:@"loginwindow"];
> I just tried the same thing a few hours ago... did your method
really
> do it gracefully, prompting each app to quit separately? I tried
> sending a quit apple event to loginwindow (osascript -e 'tell
> application "loginwindow" to quit') and it quit everything but did
not
> log me out, and eventually the Finder relaunched. Weird.
---
[objC retain];
Tetuya TAKEO
ttakeo@xxxxxxxxxxx