[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