

|
Volume Number: 14 (1998)
Issue Number: 4
Column Tag: Programmer's Challenge
Apr 98 - Tips & Tidbits
by Steve Sisak
It is easier to quit an app than to close a window because the close window event requires a direct object and a position descriptor to indicate which window. Quitting an app simply requires creating a quit event and sending it. The following code takes a valid target desc (which I'm assuming you already know how to create) and sends a close first window event to the app specified in that target desc.
The code is modified from similar code I used a while back. I may have made some errors in removing stuff or changing identifiers, but it should give you the right idea. Feel free to e-mail any questions about it.
void CloseFrontWindowOfApp( AEAddressDesc * theTargetDescPtr ) { AEDesc frontWindowObjSpecifier; AppleEvent event; AppleEvent reply; OSErr err = noErr; //initialize descriptors event.descriptorType = typeNull; reply.descriptorType = typeNull; frontWindowObjSpecifier.descriptorType = typeNull; event.dataHandle = NULL; reply.dataHandle = NULL; frontWindowObjSpecifier.dataHandle = NULL; //create object spec for front window err = MyCreateFrontWindowObjSpec( &frontWindowObjSpecifier ) ; if ( err ) goto CLEANUP_SetBounds; //create apple event-- not sure if close event is in kAECoreSuite? err = AECreateAppleEvent( kAECoreSuite, kAEClose, theTargetDescPtr, kAutoGenerateReturnID, kAnyTransactionID, &event ); if ( err ) goto CLEANUP_SetBounds; //insert direct object into ae err = AEPutParamDesc( &event, keyDirectObject, &frontWindowObjSpecifier ); if ( err ) goto CLEANUP_SetBounds; //send ae err = AESend( &event, &reply, kAENoReply + kAENeverInteract + kAECanSwitchLayer, kAENormalPriority, kAEDefaultTimeout, kNoIdleProc, kNoFilterProc ); //dispose descriptors CLEANUP_SetBounds:; AEDisposeDesc (&event); AEDisposeDesc (&reply); AEDisposeDesc (&frontWindowObjSpecifier); } //end function OSErr MyCreateFrontWindowObjSpec( AEDesc *frontWindowObjSpec ) { AEDesc emptySpecifier; AEDesc positionDesc; long thePosition; DescType propertyType; OSErr err; //initialize descriptors emptySpecifier.descriptorType = typeNull; positionDesc.descriptorType = typeNull; propertyDesc.descriptorType = typeNull; emptySpecifier.dataHandle = NULL; positionDesc.dataHandle = NULL; propertyDesc.dataHandle = NULL; //create objspecifier for window 1 of null container thePosition = 1; err = AECreateDesc( typeLongInteger, (Ptr)(&thePosition), sizeof( thePosition ), &positionDesc); if ( err ) goto CLEANUP_MyCreateBoundsObjSpec; err = CreateObjSpecifier( cWindow, &emptySpecifier, formAbsolutePosition, &positionDesc, false, frontWindowObjSpec ) ; if ( err ) goto CLEANUP_MyCreateBoundsObjSpec; //dispose descriptors CLEANUP_MyCreateBoundsObjSpec:; AEDisposeDesc (&windowObjSpecifier); AEDisposeDesc (&positionDesc); return err; }
David T. Pierson
dtp@pluto.njcc.com

- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine