• MacTech Network:
  • Tech Support
  • |
  • MacForge.net
  • |
  • Apple News
  • |
  • Register Domains
  • |
  • SSL Certificates
  • |
  • iPod Deals
  • |
  • Mac Deals
  • |
  • Mac Book Shelf

MAC TECH

  • Home
  • Magazine
    • About MacTech in Print
    • Issue Table of Contents
    • Subscribe
    • Risk Free Sample
    • Back Issues
    • MacTech DVD
  • Archives
    • MacTech Print Archives
    • MacMod
    • MacTutor
    • FrameWorks
    • develop
  • Forums
  • News
    • MacTech News
    • MacTech Blog
    • MacTech Reviews and KoolTools
    • Whitepapers, Screencasts, Videos and Books
    • News Scanner
    • Rumors Scanner
    • Documentation Scanner
    • Submit News or PR
    • MacTech News List
  • Store
  • Apple Expo
    • by Category
    • by Company
    • by Product
  • Job Board
  • Editorial
    • Submit News or PR
    • Writer's Kit
    • Editorial Staff
    • Editorial Calendar
  • Advertising
    • Benefits of MacTech
    • Mechanicals and Submission
    • Dates and Deadlines
    • Submit Apple Expo Entry
  • User
    • Register for Ongoing Raffles
    • Register new user
    • Edit User Settings
    • Logout
  • Contact
    • Customer Service
    • Webmaster Feedback
    • Submit News or PR
    • Suggest an article
  • Connect Tools
    • MacTech Live Podcast
    • RSS Feeds
    • Twitter

ADVERTISEMENT

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

 
MacTech Only Search:
Community Search:

 
 
 

 
 
 
 
 
  • SPREAD THE WORD:
  • Slashdot
  • Digg
  • Del.icio.us
  • Reddit
  • Newsvine
  • Generate a short URL for this page:



MacTech Magazine. www.mactech.com
Toll Free 877-MACTECH, Outside US/Canada: 805-494-9797
MacTech is a registered trademark of Xplain Corporation. Xplain, "The journal of Apple technology", Apple Expo, Explain It, MacDev, MacDev-1, THINK Reference, NetProfessional, Apple Expo, MacTech Central, MacTech Domains, MacNews, MacForge, and the MacTutorMan are trademarks or service marks of Xplain Corporation. Sprocket is a registered trademark of eSprocket Corporation. Other trademarks and copyrights appearing in this printing or software remain the property of their respective holders.
All contents are Copyright 1984-2010 by Xplain Corporation. All rights reserved. Theme designed by Icreon.
 
Nov. 20: Take Control of Syncing Data in Sow Leopard' released
Nov. 19: Cocktail 4.5 (Leopard Edition) released
Nov. 19: macProVideo offers new Cubase tutorials
Nov. 18: S Stardom anounces Safe Capsule, a companion piece for Apple's
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live
Nov. 17: Ableton releases Max for Live