home *** CD-ROM | disk | FTP | other *** search
- /*
- WASTE Demo Project:
- Events Handling
-
- Copyright © 1993-1995 Marco Piovanelli
- All Rights Reserved
-
- C port by John C. Daub
- */
-
- #ifndef __APPLEEVENTS__
- #include <AppleEvents.h>
- #endif
-
- #ifndef __AEREGISTRY__
- #include <AERegistry.h>
- #endif
-
- #ifndef __DISKINIT__
- #include <DiskInit.h>
- #endif
-
- #ifndef __TEXTSERVICES__
- #include <TextServices.h>
- #endif
-
-
- #ifndef __WEDEMOAPP__
- #include "WEDemoIntf.h"
- #endif
-
- // some global definitions...
-
- unsigned long gSleepTime; // sleep time for WaitNextEvent()
- RgnHandle gMouseRgn; // mouse region for WaitNextEvent()
-
-
-
- void AdjustCursor( Point mouseLoc, RgnHandle mouseRgn )
- {
- WindowRef window;
-
- // by default, set mouseRgn to the whole QuickDraw coordinate plane,
- // so that we never get mouse moved events
-
- SetRectRgn( mouseRgn, -SHRT_MAX, -SHRT_MAX, SHRT_MAX, SHRT_MAX );
-
- // give text services a chance to set the cursor shape
-
- if ( gHasTextServices )
- {
- if ( SetTSMCursor( mouseLoc ) )
- return;
- }
-
- // if there is a window open, give WEAdjustCursor an opportunity to set the cursor
- // WEAdjustCursor intersects mouseRgn (if supplied) with a region within which
- // the cursor is to retain its shape
- // (if the cursor is outside the view region, this is subtracted from mouseRgn )
-
- window = FrontWindow();
-
- if ( window != NULL )
- if ( WEAdjustCursor( mouseLoc, mouseRgn, GetWindowWE(window) ) )
- return;
-
- // set the cursor to the arrow cursor
-
- SetCursor( &qd.arrow );
-
- return;
- }
-
-
- void DoMouseDown( const EventRecord *event )
- {
- WindowRef window;
- short partCode;
-
- // find out where this click when down in
-
- partCode = FindWindow( event->where, &window );
-
- // dispatch on partCode
-
- switch ( partCode )
- {
- case inMenuBar:
- PrepareMenus();
- DoMenuChoice( MenuSelect( event->where ) );
- break;
-
- case inSysWindow:
- // ??? shouldn't SystemClick be defined as
- // SystemClick(const EventRecord *, WindowRef) ???
- SystemClick( event, (WindowPtr) window );
- break;
-
- case inContent:
- if ( DoContent( event->where, event, window ) )
- SelectWindow( window );
- break;
-
- case inDrag:
- DoDrag( event->where, window );
- break;
-
- case inGrow:
- DoGrow( event->where, window );
- break;
-
- case inGoAway:
- if ( TrackGoAway( window, event->where ) )
- if ( DoClose( closingWindow, savingAsk, window ) != noErr )
- ; // insert error handling
- break;
-
- case inZoomIn:
- case inZoomOut:
- if ( TrackBox( window, event->where, partCode ) )
- DoZoom( partCode, window );
- break;
-
- default: // unnecessary, but to keep with the original code.
- ; // do nothing
-
- } // end: switch (partCode)
-
-
- return;
- }
-
-
- void DoKeyDown( const EventRecord *event )
- {
- char key;
- Boolean isCmdKey;
-
- // extract character code from event message
-
- key = BAND( event->message, charCodeMask );
-
- // is this a command+key combo?
-
- isCmdKey = ( BAND( event->modifiers, cmdKey ) != 0 );
-
- // map function keys to the equivalent command+key combos
- // note that all fuction keys generate the same code, i.e. 0x10
-
- if ( key == 0x10 )
- {
- isCmdKey = true;
-
- switch( BSR( BAND( event->message, keyCodeMask ), 8 ) )
- {
- case keyF1:
- key = 'z';
- break;
-
- case keyF2:
- key = 'x';
- break;
-
- case keyF3:
- key = 'c';
- break;
-
- case keyF4:
- key = 'v';
- break;
-
- default:
- key = 0;
-
- }// end switch BSR( BAND( event->message, keyCodeMask), 8 )
-
- } // end if ( key == 0x10 )
-
- // command + printable character combos are routed to MenuKey()
-
- if ( isCmdKey && (key >= 0x32 ) )
- {
- PrepareMenus();
- DoMenuChoice( MenuKey(key) );
- }
- else
- {
- DoKey( key, event );
- }
-
- return;
- }
-
-
- void DoDiskEvent( const EventRecord *event )
- {
- Point dialogCorner;
- OSErr err;
-
- if ( BSR( event->message, 16) != noErr )
- {
- SetPt( &dialogCorner, 112, 80 );
- err = DIBadMount( dialogCorner, event->message );
- }
-
- return;
- }
-
-
- void DoOSEvent( const EventRecord *event )
- {
- short osMessage;
- WindowRef window;
-
- // extract the OS message field from the event record
-
- osMessage = BSR( BAND( event->message, osEvtMessageMask), 24 );
-
- // dispatch on osMessage
-
- switch( osMessage )
- {
- case suspendResumeMessage:
- {
- window = FrontWindow();
-
- if ( window != NULL )
- DoActivate( BAND(event->message, resumeFlag) != 0, window );
- }
- break;
-
- case mouseMovedMessage:
- ; // nothing
- break;
- }
-
- return;
- }
-
-
- void DoHighLevelEvent( const EventRecord *event )
- {
- if ( AEProcessAppleEvent( event ) != noErr )
- ; // error handling
-
- return;
- }
-
-
- void DoNullEvent( const EventRecord *event )
- {
- #pragma unused (event)
-
- WindowRef window;
-
- window = FrontWindow();
-
- if ( window != NULL )
- WEIdle( &gSleepTime, GetWindowWE(window) );
- else
- gSleepTime = LONG_MAX;
-
- return;
- }
-
-
- void DoWindowEvent( const EventRecord *event )
- {
- WindowRef window;
-
- // the message field of the event record contains the window reference
-
- window = (WindowRef) event->message;
-
- // make sure this window is an application window; check the windowKind field
-
- if ( GetWindowKind( window ) != userKind )
- return;
-
- switch ( event->what )
- {
- case updateEvt:
- DoUpdate( window );
- break;
-
- case activateEvt:
- DoActivate( BAND( event->modifiers, activeFlag) != 0, window );
- break;
- }
-
- return;
- }
-
-
- void ProcessEvent( void )
- {
- EventRecord event;
- Boolean gotEvent;
-
- gotEvent = WaitNextEvent( everyEvent, &event, gSleepTime, gMouseRgn );
-
- // give text services a chance to intercept this event
-
- if ( gHasTextServices )
- if ( TSMEvent( &event ) )
- ;
-
- // adjust cursor shape and set mouse region
- // (we assume event.where is the current mouse position in global coordinates
- // if event.what <= osEvt; high-level events store the event ID there)
-
- if ( event.what <= osEvt )
- AdjustCursor( event.where, gMouseRgn );
-
- // dispatch on event.what
-
- switch( event.what )
- {
- case nullEvent:
- DoNullEvent( &event );
- break;
-
- case mouseDown:
- DoMouseDown( &event);
- break;
-
- case keyDown:
- case autoKey:
- DoKeyDown( &event );
- break;
-
- case updateEvt:
- case activateEvt:
- DoWindowEvent( &event );
- break;
-
- case diskEvt:
- DoDiskEvent( &event );
- break;
-
- case osEvt:
- DoOSEvent( &event );
- break;
-
- case kHighLevelEvent:
- DoHighLevelEvent( &event );
- break;
-
- default:
- ; // ignore other events
- }
-
- if ( gotEvent )
- gSleepTime = 0; // force early idle after non-idle event
-
- return;
- }
-
-
- OSErr GotRequiredParams( const AppleEvent *ae )
- {
- OSErr err;
- DescType returnedType;
- Size actualSize;
-
- err = AEGetAttributePtr( ae, keyMissedKeywordAttr, typeWildCard, &returnedType, NULL, 0, &actualSize );
-
- if ( err == errAEDescNotFound)
- return( noErr );
-
- if ( err == noErr )
- return( errAEParamMissed );
-
- return( err );
- }
-
-
- static pascal OSErr HandleOpenDocument( const AppleEvent *ae, AppleEvent *reply, long refCon )
- {
- #pragma unused ( reply, refCon )
- AEDescList docList;
- AEKeyword keyWord;
- DescType returnedType;
- Size actualSize;
- long numberOfDocuments, i;
- FSSpec fileSpec;
- OSErr err;
-
-
- err = noErr;
-
- // extract direct parameter from the AppleEVent
-
- err = AEGetParamDesc( ae, keyDirectObject, typeAEList, &docList );
- if ( err != noErr )
- {
- AEDisposeDesc( &docList );
- return err;
- }
-
- // perform the recommended check for additional required parameters
-
- err = GotRequiredParams( ae );
- if ( err != noErr )
- {
- AEDisposeDesc( &docList );
- return err;
- }
-
- // count the items in the list of aliases
-
- err = AECountItems( &docList, &numberOfDocuments );
- if ( err != noErr )
- {
- AEDisposeDesc( &docList );
- return err;
- }
-
- for ( i = 1; i <= numberOfDocuments; i++ )
- {
- // coerce the nth alias to a file system specification record
-
- err = AEGetNthPtr( &docList, i, typeFSS, &keyWord, &returnedType, (Ptr)&fileSpec, sizeof( fileSpec ), &actualSize );
-
- if ( err != noErr )
- {
- AEDisposeDesc( &docList );
- return err;
- }
-
- // open the specified file
-
- err = CreateWindow( &fileSpec );
- if ( err != noErr )
- {
- AEDisposeDesc( &docList );
- return err;
- }
- }
-
- // dispose of the alias list
-
- err = AEDisposeDesc( &docList );
- if ( err != noErr )
- {
- AEDisposeDesc( &docList );
- return err;
- }
-
- return err;
- }
-
-
- static pascal OSErr HandleOpenApplication( const AppleEvent *ae, AppleEvent *reply, long refCon )
- {
- #pragma unused ( reply, refCon )
- OSErr err;
-
- // perform the recommended check for additional required parameters
-
- err = GotRequiredParams( ae );
- if ( err != noErr )
- return err;
-
- // create a new window from scratch
-
- err = CreateWindow( NULL );
-
- return err;
- }
-
- static pascal OSErr HandleQuitApplication( const AppleEvent *ae, AppleEvent *reply, long refCon )
- {
- #pragma unused (reply, refCon)
-
- AEKeyword optKey;
- DescType actualType;
- Size actualSize;
- SavingOption saving;
- OSErr err;
-
- // default saving option is savingAsk;
-
- saving = savingAsk;
-
- // extract optional save options
-
- err = AEGetParamPtr( ae, keyAESaveOptions, typeEnumerated, &actualType, &optKey, sizeof( optKey ), &actualSize );
- if ( err == noErr )
- {
- if ( optKey == kAEYes )
- saving = savingYes;
- else if (optKey == kAENo )
- saving = savingNo;
- else if ( optKey != kAEAsk )
- {
- err = paramErr; // for want of a better code
- return err;
- }
- }
-
- // perform the recommended check for additional required parameters
-
- err = GotRequiredParams( ae );
-
- if ( err != noErr )
- return err;
-
- // actually do the quit stuff
-
- err = DoQuit( saving );
-
- return err;
- }
-
-
- OSErr InitializeEvents( void )
- {
- OSErr err;
-
- err = noErr;
-
- // allocate space for the mouse region
-
- gMouseRgn = NewRgn();
-
- // install AppleEvent handlers for the Required Suite
-
- err = AEInstallEventHandler( kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc( HandleOpenApplication ), 0, false );
- if ( err != noErr )
- return err;
-
- err = AEInstallEventHandler( kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc( HandleOpenDocument ), kDoOpen, false );
- if ( err != noErr )
- return err;
-
- err = AEInstallEventHandler( kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc( HandleOpenDocument ), kDoPrint, false );
- if ( err != noErr )
- return err;
-
- err = AEInstallEventHandler( kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc( HandleQuitApplication ), 0, false );
- if ( err != noErr )
- return err;
-
- // install Apple event handlers for a subset of the Core suite
-
- err = InstallCoreHandlers();
- if ( err != noErr )
- return err;
-
- // install Apple event handlers for inline input
-
- err = WEInstallTSMHandlers();
- if ( err != noErr )
- return err;
-
- return err;
- }