topical media & game development

talk show tell print

lib-of-vs-libs-QTDevWin-CIncludes-CarbonEvents.h / h



  /*
       File:       CarbonEvents.h
   
       Contains:   Carbon Event Manager
   
       Version:    Technology: Version 1.0
                   Release:    QuickTime 6.0.2
   
       Copyright:  (c) 1999-2001 by Apple Computer, Inc., all rights reserved.
   
       Bugs?:      For bug reports, consult the following page on
                   the World Wide Web:
   
                       http://developer.apple.com/bugreporter/
   
  */
  ifndef __CARBONEVENTS__
  define __CARBONEVENTS__
  
  ifndef __EVENTS__
  include <Events.h>
  endif
  
  ifndef __MENUS__
  include <Menus.h>
  endif
  
  ifndef __CONTROLS__
  include <Controls.h>
  endif
  
  if PRAGMA_ONCE
  #pragma once
  endif
  
  ifdef __cplusplus
  extern "C" {
  endif
  
  if PRAGMA_IMPORT
  #pragma import on
  endif
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=mac68k
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(push, 2)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack(2)
  endif
  
  /*======================================================================================*/
  /*  EVENT COMMON                                                                        */
  /*======================================================================================*/
  
  enum {
      eventAlreadyPostedErr       = -9860,
      eventClassInvalidErr        = -9862,
      eventClassAlreadyExistsErr  = -9863,
      eventClassIncorrectErr      = -9864,
      eventClassInvalidVersionErr = -9865,
      eventHandlerAlreadyInstalledErr = -9866,
      eventCantInstallHandlerErr  = -9867,
      eventInternalErr            = -9868,
      eventKindIncorrectErr       = -9869,
      eventDataTagNotSupportedErr = -9870,
      eventDataSizeMismatchErr    = -9871
  };
  
  /*======================================================================================*/
  /*  EVENT CORE                                                                          */
  /*======================================================================================*/
  /*--------------------------------------------------------------------------------------*/
  /*  o Event Flags, options                                                              */
  /*--------------------------------------------------------------------------------------*/
  
  typedef SInt16 EventPriority;
  enum {
      kEventPriorityLow           = 0,
      kEventPriorityStandard      = 1,
      kEventPriorityHigh          = 2
  };
  
  typedef UInt32 EventAttributes;
  enum {
      kEventAttributeNone         = 0,
      kEventAttributeUserEvent    = (1 << 0),
      kEventAttributeRouteToUserFocus = (1 << 1)
  };
  
  enum {
      kEventLeaveInQueue          = false,
      kEventRemoveFromQueue       = true
  };
  
  /*--------------------------------------------------------------------------------------*/
  /* o Event Times                                                                        */
  /*                                                                                      */
  /* EventTime is in seconds since boot. Use the constants to make life easy.             */
  /*--------------------------------------------------------------------------------------*/
  typedef double                          EventTime;
  typedef EventTime                       EventTimeout;
  typedef EventTime                       EventTimerInterval;
  
  define kEventDurationSecond            1.0
  define kEventDurationMillisecond       kEventDurationSecond / 1000
  define kEventDurationMicrosecond       kEventDurationSecond / 1000000
  define kEventDurationNanosecond        kEventDurationSecond / 1000000000
  define kEventDurationMinute            kEventDurationSecond * 60
  define kEventDurationHour              kEventDurationMinute * 60
  define kEventDurationDay               kEventDurationHour * 24
  define kEventDurationNoWait            0.0
  define kEventDurationForever           -1.0
  
  /* Helpful doodads to convert from and to ticks from event times*/
  ifdef __cplusplus
      inline EventTime TicksToEventTime( UInt32 t ) { return ( (t) / 60.0 ); }
      inline UInt32 EventTimeToTicks( EventTime t ) { return (UInt32)( (t) * 60 ); }
  else
      #define TicksToEventTime( t )   (EventTime)( (t) / 60.0 )
      #define EventTimeToTicks( t )   (UInt32)( (t) * 60 )
  endif  /* defined(__cplusplus) */
  
  /*--------------------------------------------------------------------------------------*/
  /* EventTypeSpec structure                                                              */
  /*                                                                                      */
  /* This structure is used in many routines to pass a list of event types to a function. */
  /* You typically would declare a const array of these types to pass in.                 */
  /*--------------------------------------------------------------------------------------*/
  
  struct EventTypeSpec {
      UInt32                          eventClass;
      UInt32                          eventKind;
  };
  typedef struct EventTypeSpec            EventTypeSpec;
  
  /* MouseTrackingResults returned from TrackMouse*/
  
  typedef UInt16 MouseTrackingResult;
  enum {
      kMouseTrackingMousePressed  = 1,
      kMouseTrackingMouseReleased = 2,
      kMouseTrackingMouseExited   = 3,
      kMouseTrackingMouseEntered  = 4,
      kMouseTrackingMouseMoved    = 5
  };
  
  typedef struct OpaqueEventRef*          EventRef;
  
  typedef UInt32                          EventClassID;
  typedef UInt32                          EventClass;
  typedef UInt32                          EventType;
  /*--------------------------------------------------------------------------------------*/
  /*    o EventLoop                                                 */
  /*--------------------------------------------------------------------------------------*/
  typedef struct OpaqueEventLoopRef*      EventLoopRef;
  EXTERN_API( EventLoopRef )
  GetCurrentEventLoop             (void);
  
  EXTERN_API( EventLoopRef )
  GetMainEventLoop                (void);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Low-level event blocking                                                          */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( void )
  BlockEventLoop                  (EventTimeout           timeout);
  
  EXTERN_API( void )
  WakeEventLoop                   (void);
  
  EXTERN_API( Boolean )
  BlockUntilNextEvent             (EventTimeout           timeout,
                                   Boolean                pullEvent,
                                   EventRef *             outEvent);
  
  EXTERN_API( Boolean )
  BlockUntilNextEventMatchingList (UInt32                 numTypes,
                                   const EventTypeSpec *  list,
                                   EventTimeout           timeout,
                                   Boolean                pullEvent,
                                   EventRef *             outEvent);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Core event lifetime APIs                                                          */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( EventRef )
  CopyEvent                       (EventRef               inOther);
  
  EXTERN_API( EventRef )
  RetainEvent                     (EventRef               inEvent);
  
  EXTERN_API( UInt32 )
  GetEventRetainCount             (EventRef               inEvent);
  
  EXTERN_API( void )
  ReleaseEvent                    (EventRef               inEvent);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Getters for 'base-class' event info                                               */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( UInt32 )
  GetEventClass                   (EventRef               inEvent);
  
  EXTERN_API( UInt32 )
  GetEventKind                    (EventRef               inEvent);
  
  EXTERN_API( EventAttributes )
  GetEventAttributes              (EventRef               inEvent);
  
  EXTERN_API( EventTime )
  GetEventTime                    (EventRef               inEvent);
  
  EXTERN_API( UInt32 )
  GetEventPriority                (EventRef               inEvent);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Setters for 'base-class' event info                                               */
  /*--------------------------------------------------------------------------------------*/
  EXTERN_API( OSStatus )
  SetEventTime                    (EventRef               inEvent,
                                   EventTime              inTime);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Getting/setting common event data via tags                                        */
  /*                                                                                      */
  /*  NOTE: THIS STUFF IS NOT YET ACTIVE. DO NOT ATTEMPT TO USE IT.                       */
  /*--------------------------------------------------------------------------------------*/
  enum {
      kEventTagKeyModifiers       = FOUR_CHAR_CODE('mods'),       /* UInt32*/
      kEventTagMouseLocation      = FOUR_CHAR_CODE('mloc')        /* Point*/
  };
  
  typedef UInt32                          EventDataTag;
  EXTERN_API( OSStatus )
  GetEventDataByTag               (EventRef               inEvent,
                                   EventDataTag           inKey,
                                   void *                 buffer,
                                   Size                   bufferSize,
                                   Size *                 actualSize) /* can be NULL */;
  
  EXTERN_API( OSStatus )
  SetEventDataByTag               (EventRef               inEvent,
                                   EventDataTag           inKey,
                                   void *                 buffer,
                                   Size                   bufferSize);
  
  /* Common, type-safe wrappers for the above...*/
  
  EXTERN_API( OSStatus )
  GetEventKeyModifiers            (EventRef               inEvent,
                                   UInt32 *               outModifiers);
  
  EXTERN_API( OSStatus )
  SetEventKeyModifiers            (EventRef               inEvent,
                                   UInt32                 inModifiers);
  
  EXTERN_API( OSStatus )
  GetEventMouseLocation           (EventRef               inEvent,
                                   Point *                outMouseLoc);
  
  EXTERN_API( OSStatus )
  SetEventMouseLocation           (EventRef               inEvent,
                                   Point                  inMouseLoc);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Event Queue routines (posting, finding, flushing)                                 */
  /*--------------------------------------------------------------------------------------*/
  
  typedef CALLBACK_API( Boolean , EventComparatorProcPtr )(EventRef inEvent, void *inCompareData);
  typedef STACK_UPP_TYPE(EventComparatorProcPtr)                  EventComparatorUPP;
  if OPAQUE_UPP_TYPES
      EXTERN_API(EventComparatorUPP)
      NewEventComparatorUPP          (EventComparatorProcPtr  userRoutine);
  
      EXTERN_API(void)
      DisposeEventComparatorUPP      (EventComparatorUPP      userUPP);
  
      EXTERN_API(Boolean)
      InvokeEventComparatorUPP       (EventRef                inEvent,
                                      void *                  inCompareData,
                                      EventComparatorUPP      userUPP);
  
  else
      enum { uppEventComparatorProcInfo = 0x000003D0 };               /* pascal 1_byte Func(4_bytes, 4_bytes) */
      #define NewEventComparatorUPP(userRoutine)                      (EventComparatorUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventComparatorProcInfo, GetCurrentArchitecture())
      #define DisposeEventComparatorUPP(userUPP)                      DisposeRoutineDescriptor(userUPP)
      #define InvokeEventComparatorUPP(inEvent, inCompareData, userUPP)  (Boolean)CALL_TWO_PARAMETER_UPP((userUPP), uppEventComparatorProcInfo, (inEvent), (inCompareData))
  endif
  /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
  define NewEventComparatorProc(userRoutine)                     NewEventComparatorUPP(userRoutine)
  define CallEventComparatorProc(userRoutine, inEvent, inCompareData) InvokeEventComparatorUPP(inEvent, inCompareData, userRoutine)
  /*
     PostEventToQueue retains the given event. You would normally release it after calling
     this function.
  */
  EXTERN_API( OSStatus )
  PostEventToQueue                (EventRef               inEvent,
                                   EventPriority          inPriority);
  
  EXTERN_API( Boolean )
  IsEventInQueue                  (EventRef               inEvent);
  
  EXTERN_API( OSStatus )
  FlushEventsMatchingListFromQueue (UInt32                inNumTypes,
                                   const EventTypeSpec *  inList);
  
  EXTERN_API( OSStatus )
  FlushSpecificEventsFromQueue    (EventComparatorUPP     comparator,
                                   void *                 compareData);
  
  EXTERN_API( void )
  FlushEventQueue                 (void);
  
  /*
     Remove EventFromQueue removes the event from the event queue and releases it. If you
     want to keep the event around, you should make sure to copy or retain it.
  */
  
  EXTERN_API( void )
  RemoveEventFromQueue            (EventRef               inEvent);
  
  EXTERN_API( EventRef )
  FindSpecificEventInQueue        (EventComparatorUPP     comparator,
                                   void *                 compareData);
  
  EXTERN_API( UInt32 )
  GetNumEventsInQueue             (void);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Helpful utilities                                                                 */
  /*--------------------------------------------------------------------------------------*/
  EXTERN_API( EventTime )
  GetCurrentEventTime             (void);
  
  EXTERN_API( Boolean )
  IsUserCancelEventRef            (EventRef               event);
  
  EXTERN_API( Boolean )
  CheckEventQueueForUserCancel    (void);
  
  EXTERN_API( OSStatus )
  TrackMouseLocation              (GrafPtr                port, /* can be NULL */
                                   Point *                outPt,
                                   MouseTrackingResult *  result);
  
  EXTERN_API( OSStatus )
  TrackMouseRegion                (GrafPtr                port, /* can be NULL */
                                   RgnHandle              region,
                                   Boolean *              wasInRgn,
                                   MouseTrackingResult *  result);
  
  EXTERN_API( Boolean )
  ConvertEventRefToEventRecord    (EventRef               inEvent,
                                   EventRecord *          outEvent);
  
  EXTERN_API( Boolean )
  IsEventInMask                   (EventRef               inEvent,
                                   EventMask              inMask);
  
  EXTERN_API( EventTime )
  GetLastUserEventTime            (void);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Timers                                                                            */
  /*--------------------------------------------------------------------------------------*/
  /* Timers, the new null processing mechanism.*/
  /* Not just good, but good for ya. */
  
  typedef struct OpaqueEventLoopTimerRef*  EventLoopTimerRef;
  typedef CALLBACK_API( void , EventLoopTimerProcPtr )(EventLoopTimerRef inTimer, void *inUserData);
  typedef STACK_UPP_TYPE(EventLoopTimerProcPtr)                   EventLoopTimerUPP;
  if OPAQUE_UPP_TYPES
      EXTERN_API(EventLoopTimerUPP)
      NewEventLoopTimerUPP           (EventLoopTimerProcPtr   userRoutine);
  
      EXTERN_API(void)
      DisposeEventLoopTimerUPP       (EventLoopTimerUPP       userUPP);
  
      EXTERN_API(void)
      InvokeEventLoopTimerUPP        (EventLoopTimerRef       inTimer,
                                      void *                  inUserData,
                                      EventLoopTimerUPP       userUPP);
  
  else
      enum { uppEventLoopTimerProcInfo = 0x000003C0 };                /* pascal no_return_value Func(4_bytes, 4_bytes) */
      #define NewEventLoopTimerUPP(userRoutine)                       (EventLoopTimerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventLoopTimerProcInfo, GetCurrentArchitecture())
      #define DisposeEventLoopTimerUPP(userUPP)                       DisposeRoutineDescriptor(userUPP)
      #define InvokeEventLoopTimerUPP(inTimer, inUserData, userUPP)   CALL_TWO_PARAMETER_UPP((userUPP), uppEventLoopTimerProcInfo, (inTimer), (inUserData))
  endif
  /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
  define NewEventLoopTimerProc(userRoutine)                      NewEventLoopTimerUPP(userRoutine)
  define CallEventLoopTimerProc(userRoutine, inTimer, inUserData) InvokeEventLoopTimerUPP(inTimer, inUserData, userRoutine)
  EXTERN_API( OSStatus )
  InstallEventLoopTimer           (EventLoopRef           inEventLoop,
                                   EventTimerInterval     inFirstFire,
                                   EventTimerInterval     inInterval,
                                   EventLoopTimerUPP      inTimerProc,
                                   void *                 inUserData,
                                   EventLoopTimerRef *    outRef);
  
  EXTERN_API( OSStatus )
  RemoveEventLoopTimer            (EventLoopTimerRef      inTimer);
  
  EXTERN_API( OSStatus )
  SetEventLoopTimerNextFireTime   (EventLoopTimerRef      inTimer,
                                   EventTimerInterval     nextFire);
  
  /*======================================================================================*/
  /*  EVENT CLASSES                                                                       */
  /*======================================================================================*/
  enum {
      kEventClassMouse            = FOUR_CHAR_CODE('mous'),
      kEventClassKeyboard         = FOUR_CHAR_CODE('keyb'),
      kEventClassTextInput        = FOUR_CHAR_CODE('text'),
      kEventClassApplication      = FOUR_CHAR_CODE('appl'),
      kEventClassEPPC             = FOUR_CHAR_CODE('eppc'),
      kEventClassMenu             = FOUR_CHAR_CODE('menu'),
      kEventClassWindow           = FOUR_CHAR_CODE('wind'),
      kEventClassControl          = FOUR_CHAR_CODE('cntl'),
      kEventClassCommand          = FOUR_CHAR_CODE('cmds')
  };
  
  /* Mouse Events */
  enum {
      kEventLeftMouseDown         = 1,
      kEventLeftMouseUp           = 2,
      kEventRightMouseDown        = 3,
      kEventRightMouseUp          = 4,
      kEventMouseMoved            = 5,
      kEventLeftMouseDragged      = 6,                            /* mouse moved while button down*/
      kEventRightMouseDragged     = 7,
      kEventMouseEntered          = 8,
      kEventMouseExited           = 9,
      kEventMouseWheelMoved       = 10                            /* placeholder. Not yet operational, unlike the new Death Star.*/
  };
  
  enum {
      kEventMouseButtonPrimary    = 0,                            /* only button for a one-button mouse (usually left button for multi-button mouse)*/
      kEventMouseButtonSecondary  = 1,                            /* usually right button for a multi-button mouse*/
      kEventMouseButtonTertiary   = 2                             /* usually middle button for a three-button mouse*/
  };
  
  typedef UInt16                          EventMouseButton;
  enum {
      kEventMouseWheelDirectionUp = 0,
      kEventMouseWheelDirectionDown = 1,
      kEventMouseWheelDirectionLeft = 2,
      kEventMouseWheelDirectionRight = 3
  };
  
  typedef UInt16                          EventMouseWheelDirection;
  /* Keyboard Events */
  enum {
      kEventRawKeyDown            = 1,                            /* hardware-level events*/
      kEventRawKeyRepeat          = 2,
      kEventRawKeyUp              = 3,
      kEventRawKeyModifiersChanged = 4
  };
  
  enum {
      kEventTextInput             = 5                             /* high-level keyboard event (not available yet)*/
  };
  
  /* Application Events */
  enum {
      kEventAppActivated          = 1,                            /* resume, in old parlance*/
      kEventAppDeactivated        = 2,                            /* suspend, in old parlance*/
      kEventAppQuit               = 3,                            /* this app is quitting.*/
      kEventAppLaunchNotification = 4                             /* response to async application launch.*/
  };
  
  /* Apple Events */
  enum {
      kEventHighLevelEvent        = 1
  };
  
  /*
      Window Refresh Events
      
      o kEventWindowUpdate
          low-level update event.  You must call BeginUpdate, call SetPort,
          draw your window content, and then call EndUpdate.
      
      o kEventWindowDrawContent
          sent when the standard window handler sees an update event. 
          BeginUpdate, SetPort, and EndUpdate are called for you; all you do
          is draw.
      
      o kEventWindowDrawStructure
          sent after the window manager has drawn the window frame.  The
          current port is a global port clipped to the window structure
          region, not the window's port.
          
      o kEventWindowEraseContent
          called when the window manager wishes to erase the window
          background (In ShowWindow, for example).  The current port is set
          to the window's port.
          
      o kEventWindowActivate
          window is active now
          
      o kEventWindowDeactivate
          window is inactive now
  */
  enum {
      kEventWindowUpdate          = 1,
      kEventWindowDrawContent     = 2,
      kEventWindowDrawStructure   = 3,
      kEventWindowEraseContent    = 4,
      kEventWindowActivate        = 5,
      kEventWindowDeactivate      = 6
  };
  
  /*
      Window State Change Events
      
      o kEventWindowZOrderChanged
          Sent after the window has changed position relative
          to other windows in the application window list.
      
      o kEventWindowActivationChanged
          Sent after the window has changed activation state
      
      o kEventWindowOriginChange
        kEventWindowSizeChange
          Sent during ResizeWindow/DragWindow, before the window is
          actually modified.  Alter the current bounds in the event to
          change the intended location of the window.  "Origin"
          indicates that the window's place location onscreen is
          different.  "Size" indicates that the window's size has
          changed (the origin may also be different).
      
      o kEventWindowOriginChanged
        kEventWindowSizeChanged
          Sent after the window has been resized or moved.
  */
  
  enum {
      kEventWindowZOrderChanged   = 16,
      kEventWindowActivationChanged = 18,
      kEventWindowOriginChange    = 20,
      kEventWindowOriginChanged   = 21,
      kEventWindowSizeChange      = 22,
      kEventWindowSizeChanged     = 23
  };
  
  /*
      Window Click Events
      
      Low-level events which generate higher-level "action" events.
      Most clients should allow the standard window handler to implement
      these events.
      
      o kEventWindowClickDragRgn
          sent when the mouse is down in the drag region.  Calls DragWindow.
      
      o kEventWindowClickResizeRgn
          sent when the mouse is down in the resize area.  Calls ResizeWindow.
      
      o kEventWindowClickCollapseRgn
          sent when the mouse is down in the collapse widget.  Generates
          kEventWindowExpand or kEventWindowCollapse (whichever is the opposite
          of the window's current collapse state).
      
      o kEventWindowClickCloseRgn
          sent when the mouse is down in the close widget.  Generates
          kEventWindowClose.
      
      o kEventWindowClickZoomRgn
          sent when the mouse is down in the zoom widget.  Generates
          kEventWindowZoom.   
          
      o kEventWindowClickContentRgn
          sent when the mouse is down in the content region.
      
      o kEventWindowClickProxyIconRgn
          sent when the mouse is down in the proxy icon.  Generates proxy
          icon events.
  */
  enum {
      kEventWindowClickDragRgn    = 32,
      kEventWindowClickResizeRgn  = 33,
      kEventWindowClickCollapseRgn = 34,
      kEventWindowClickCloseRgn   = 35,
      kEventWindowClickZoomRgn    = 36,
      kEventWindowClickContentRgn = 37,
      kEventWindowClickProxyIconRgn = 38
  };
  
  /*
      Window Action Events
      
      o kEventWindowCollapse
          If the window is not collapsed, this event is sent by the standard
          window handler after it has received kEventWindowClickCollapseRgn
          and received true from a call to TrackBox.  Standard window handler
          calls CollapseWindow and then sends kEventWindowCollapsed if no
          error is received from CollapseWindow.
      
      o kEventWindowCollapsed
          Notification that the object has successfully collapsed.
      
      o kEventWindowCollapseAll
          Sent by the standard window handler (when the option key is down)
          after it has received kEventWindowClickCollapseRgn and then
          received true from a call to TrackBox.  The standard window
          handler's response is to send each window of the same class as the
          clicked window a kEventWindowCollapse event.
      
      o kEventWindowExpand
          If the window is collapsed, this event is sent by the standard
          window handler after it has received kEventWindowClickCollapseRgn
          and received true from a call to TrackBox.  The standard window
          handler's response is to call CollapseWindow, then send
          kEventWindowExpanded.
      
      o kEventWindowExpanded
          Sent by the standard window handler (when the option key is down)
          after it has received kEventWindowClickCollapseRgn and then
          received true from a call to TrackBox.  The standard window
          handler's response is to send each window of the same class as the
          clicked window a kEventWindowExpand event.
      
      o kEventWindowExpandAll
          Notification that the window has successfully expanded.
      
      o kEventWindowClose
          Sent by the standard window handler after it has received
          kEventWindowClickCloseRgn and successfully called TrackBox.
      
      o kEventWindowClosed
          Dispatched by DisposeWindow before the object is disposed.
      
      o kEventWindowCloseAll
          Sent by the standard window handler (when the option key is down)
          after it has received kEventWindowClickCloseRgn and received true
          from a call to TrackGoAway.  The standard window handler's response
          is to send each window with the same class as the clicked window a
          kEventWindowClose event.
      
      o kEventWindowZoom
          Sent by the standard window handler upon receiving
          kEventWindowClickZoomRgn and then receiving true from a call to
          TrackBox.  The standard window handler's response is to zoom the
          window using the sample code taken from the 8.5 Window Manager
          documentation. Upon successful zoom, kEventWindowZoomed is sent.
      
      o kEventWindowZoomed
          Notification that object has been successfully zoomed.
      
      o kEventWindowZoomAll
          Sent by the standard window handler (when the option key is down)
          after it has received kEventObjectClickZoomRgn and received true
          from a call to TrackBox.  The standard window handler's response is
          to send each window with the same class as the clicked window a
          kEventObjectZoom event and then to reposition all zoomed windows
          using the kWindowCascadeOnParentWindowScreen positioning method.
      
      o kEventWindowContextualMenuSelect
          Sent when either the right mouse button is pressed, or the control
          key is held down and the left mouse button is pressed, or the left
          mouse button is held down for more than 1/4th of a second (and
          nothing else is handling the generated mouse tracking events).  
          The standard window handler ignores this event.
      
      o kEventWindowPathSelect
          Sent when IsWindowPathSelectClick would return true.  Set the
          MenuRef in the event if you wish to customize the menu passed to
          WindowPathSelect.
      
      o kEventWindowGetIdealSize
          Sent by the standard window handler to determine the standard state
          for zooming.
      o kEventWindowGetMinimumSize
          Sent by the standard window handler to determine the minimum size
          of the window (used during window resizing).
      
      o kEventWindowProxyBeginDrag
          Sent before a proxy icon drag; you can attach data to the DragRef
          in the event.
      
      o kEventWindowProxyEndDrag
          Sent after the proxy icon drag is complete, whether successful or
          not.
  */
  enum {
      kEventWindowCollapse        = 66,
      kEventWindowCollapsed       = 67,
      kEventWindowCollapseAll     = 68,
      kEventWindowExpand          = 69,
      kEventWindowExpanded        = 70,
      kEventWindowExpandAll       = 71,
      kEventWindowClose           = 72,
      kEventWindowClosed          = 73,
      kEventWindowCloseAll        = 74,
      kEventWindowZoom            = 75,
      kEventWindowZoomed          = 76,
      kEventWindowZoomAll         = 77,
      kEventWindowContextualMenuSelect = 78,
      kEventWindowPathSelect      = 79,
      kEventWindowGetIdealSize    = 80,
      kEventWindowGetMinimumSize  = 81,
      kEventWindowProxyBeginDrag  = 128,
      kEventWindowProxyEndDrag    = 129
  };
  
  /* Menu Events */
  enum {
      kEventMenuBeginTracking     = 1,
      kEventMenuEndTracking       = 2,
      kEventMenuChangeTrackingMode = 3,
      kEventMenuOpening           = 4,
      kEventMenuClosed            = 5,
      kEventMenuTargetItem        = 6,
      kEventMenuMatchKey          = 7
  };
  
  /* Command-related events */
  enum {
      kEventProcessCommand        = 1
  };
  
  /* Control Events */
  enum {
      kEventControlHit            = 1,
      kEventControlSimulateHit    = 2
  };
  
  /* HI Commands */
  enum {
      kHICommandCancel            = FOUR_CHAR_CODE('not!'),       /* the most important command: cancel the current operation!  sent when the user presses command-period*/
      kHICommandQuit              = FOUR_CHAR_CODE('quit'),
      kHICommandUndo              = FOUR_CHAR_CODE('undo'),
      kHICommandRedo              = FOUR_CHAR_CODE('redo'),
      kHICommandCut               = FOUR_CHAR_CODE('cut '),
      kHICommandCopy              = FOUR_CHAR_CODE('copy'),
      kHICommandPaste             = FOUR_CHAR_CODE('past'),
      kHICommandClear             = FOUR_CHAR_CODE('clea'),
      kHICommandSelectAll         = FOUR_CHAR_CODE('sall')
  };
  
  enum {
      kHICommandFromMenu          = (1L << 0)
  };
  
  struct HICommand {
      UInt32                          attributes;
      UInt32                          commandID;
      struct {
          MenuRef                         menuRef;
          UInt16                          menuItemIndex;
      }                                 menu;
  };
  typedef struct HICommand                HICommand;
  /*--------------------------------------------------------------------------------------*/
  /* Mouse Events                                                                         */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( OSStatus )
  CreateMouseEvent                (UInt32                 kind,
                                   EventTime              when,
                                   Point                  where,
                                   UInt32                 modifiers,
                                   EventRef *             outEvent);
  
  EXTERN_API( OSStatus )
  SetMouseEventMouseLocation      (EventRef               inEvent,
                                   Point                  inPoint);
  
  EXTERN_API( OSStatus )
  SetMouseEventKeyModifiers       (EventRef               inEvent,
                                   UInt32                 inModifiers);
  
  EXTERN_API( OSStatus )
  SetMouseEventClickCount         (EventRef               inEvent,
                                   UInt32                 inCount);
  
  EXTERN_API( OSStatus )
  GetMouseEventMouseLocation      (EventRef               inEvent,
                                   Point *                outPoint);
  
  EXTERN_API( OSStatus )
  GetMouseEventKeyModifiers       (EventRef               inEvent,
                                   UInt32 *               outModifiers);
  
  EXTERN_API( OSStatus )
  GetMouseEventClickCount         (EventRef               inEvent,
                                   UInt32 *               outCount);
  
  /*--------------------------------------------------------------------------------------*/
  /* Keyboard Events                                                                      */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( OSStatus )
  CreateKeyboardEvent             (UInt32                 kind,
                                   EventTime              when,
                                   UInt32                 inKeyChar,
                                   UInt32                 inKeyCode,
                                   UInt32                 inKeyModifiers,
                                   EventRef *             outEvent);
  
  EXTERN_API( OSStatus )
  SetKeyboardEventKeyCode         (EventRef               inEvent,
                                   UInt32                 inKeyCode);
  
  EXTERN_API( OSStatus )
  SetKeyboardEventKeyChar         (EventRef               inEvent,
                                   UInt32                 inKeyChar);
  
  EXTERN_API( OSStatus )
  SetKeyboardEventKeyModifiers    (EventRef               inEvent,
                                   UInt32                 inModifiers);
  
  EXTERN_API( OSStatus )
  GetKeyboardEventKeyCode         (EventRef               inEvent,
                                   UInt32 *               outKeyCode);
  
  EXTERN_API( OSStatus )
  GetKeyboardEventKeyChar         (EventRef               inEvent,
                                   UInt32 *               outKeyChar);
  
  EXTERN_API( OSStatus )
  GetKeyboardEventKeyModifiers    (EventRef               inEvent,
                                   UInt32 *               outModifiers);
  
  /*--------------------------------------------------------------------------------------*/
  /* Window Events                                                                        */
  /*--------------------------------------------------------------------------------------*/
  EXTERN_API( OSStatus )
  CreateWindowEvent               (UInt32                 kind,
                                   EventTime              when,
                                   WindowRef              window,
                                   EventRef *             outEvent);
  
  EXTERN_API( OSStatus )
  SetWindowEventWindowRef         (EventRef               inEvent,
                                   WindowRef              inWindow);
  
  EXTERN_API( OSStatus )
  SetWindowEventKeyModifiers      (EventRef               inEvent,
                                   UInt32                 inModifiers);
  
  EXTERN_API( OSStatus )
  SetWindowEventMouseLocation     (EventRef               inEvent,
                                   Point                  inWhere);
  
  EXTERN_API( OSStatus )
  SetWindowEventWindowSize        (EventRef               inEvent,
                                   Point                  inSize);
  
  EXTERN_API( OSStatus )
  GetWindowEventWindowRef         (EventRef               inEvent,
                                   WindowRef *            outWindow);
  
  EXTERN_API( OSStatus )
  GetWindowEventKeyModifiers      (EventRef               inEvent,
                                   UInt32 *               outModifiers);
  
  EXTERN_API( OSStatus )
  GetWindowEventMouseLocation     (EventRef               inEvent,
                                   Point *                outWhere);
  
  EXTERN_API( OSStatus )
  GetWindowEventWindowSize        (EventRef               inEvent,
                                   Point *                outSize);
  
  /* window proxy events contain dragrefs*/
  EXTERN_API( OSStatus )
  GetWindowEventDragRef           (EventRef               eventRef,
                                   DragRef *              outDrag);
  
  EXTERN_API( OSStatus )
  SetWindowEventDragRef           (EventRef               eventRef,
                                   DragRef                inDrag);
  
  EXTERN_API( OSStatus )
  GetWindowEventMenuRef           (EventRef               eventRef,
                                   MenuRef *              outMenu);
  
  EXTERN_API( OSStatus )
  SetWindowEventMenuRef           (EventRef               eventRef,
                                   MenuRef                inMenu);
  
  /* window bounds-changed events*/
  EXTERN_API( OSStatus )
  GetWindowEventOriginalBounds    (EventRef               eventRef,
                                   Rect *                 outBounds);
  
  EXTERN_API( OSStatus )
  SetWindowEventOriginalBounds    (EventRef               eventRef,
                                   const Rect *           inBounds);
  
  EXTERN_API( OSStatus )
  GetWindowEventPreviousBounds    (EventRef               eventRef,
                                   Rect *                 outBounds);
  
  EXTERN_API( OSStatus )
  SetWindowEventPreviousBounds    (EventRef               eventRef,
                                   const Rect *           inBounds);
  
  EXTERN_API( OSStatus )
  GetWindowEventCurrentBounds     (EventRef               eventRef,
                                   Rect *                 outBounds);
  
  EXTERN_API( OSStatus )
  SetWindowEventCurrentBounds     (EventRef               eventRef,
                                   const Rect *           inBounds);
  
  EXTERN_API( OSStatus )
  GetWindowEventGrafPort          (EventRef               eventRef,
                                   GrafPtr *              outPort);
  
  EXTERN_API( OSStatus )
  SetWindowEventGrafPort          (EventRef               eventRef,
                                   GrafPtr                inPort);
  
  /* window click events each contain a reference to the original mouse down event*/
  EXTERN_API( OSStatus )
  GetWindowEventMouseEvent        (EventRef               eventRef,
                                   EventRef *             outEvent);
  
  EXTERN_API( OSStatus )
  SetWindowEventMouseEvent        (EventRef               eventRef,
                                   EventRef               inEvent);
  
  /*--------------------------------------------------------------------------------------*/
  /* Control Events                                                                       */
  /*--------------------------------------------------------------------------------------*/
  EXTERN_API( OSStatus )
  CreateControlEvent              (UInt32                 kind,
                                   EventTime              when,
                                   ControlRef             control,
                                   EventRef *             outEvent);
  
  EXTERN_API( OSStatus )
  SetControlEventControlRef       (EventRef               inEvent,
                                   ControlRef             inControl);
  
  EXTERN_API( OSStatus )
  SetControlEventControlPartCode  (EventRef               inEvent,
                                   ControlPartCode        inPart);
  
  EXTERN_API( OSStatus )
  SetControlEventKeyModifiers     (EventRef               inEvent,
                                   UInt32                 inModifiers);
  
  EXTERN_API( OSStatus )
  GetControlEventControlRef       (EventRef               inEvent,
                                   ControlRef *           outControl);
  
  EXTERN_API( OSStatus )
  GetControlEventControlPartCode  (EventRef               inEvent,
                                   ControlPartCode *      outPart);
  
  EXTERN_API( OSStatus )
  GetControlEventKeyModifiers     (EventRef               inEvent,
                                   UInt32 *               outModifiers);
  
  /*--------------------------------------------------------------------------------------*/
  /* Menu Events                                                                          */
  /*--------------------------------------------------------------------------------------*/
  EXTERN_API( OSStatus )
  CreateMenuEvent                 (UInt32                 kind,
                                   EventTime              when,
                                   MenuRef                menu,
                                   EventRef *             outEvent);
  
  EXTERN_API( OSStatus )
  SetMenuEventMenuRef             (EventRef               inEvent,
                                   MenuRef                inMenu);
  
  EXTERN_API( OSStatus )
  SetMenuEventTrackingMode        (EventRef               inEvent,
                                   MenuTrackingMode       inMode,
                                   Boolean                setCurrent);
  
  EXTERN_API( OSStatus )
  SetMenuEventFirstTimeOpen       (EventRef               inEvent,
                                   Boolean                inFirstTimeOpen);
  
  EXTERN_API( OSStatus )
  SetMenuEventItemIndex           (EventRef               inEvent,
                                   MenuItemIndex          inItemIndex);
  
  EXTERN_API( OSStatus )
  SetMenuEventCommandID           (EventRef               inEvent,
                                   MenuCommand            inCommand);
  
  EXTERN_API( OSStatus )
  SetMenuEventKeyEvent            (EventRef               inEvent,
                                   EventRef               inKeyEvent);
  
  EXTERN_API( OSStatus )
  SetMenuEventHICommand           (EventRef               inEvent,
                                   const HICommand *      inCommand);
  
  EXTERN_API( OSStatus )
  GetMenuEventMenuRef             (EventRef               inEvent,
                                   MenuRef *              outMenu);
  
  EXTERN_API( OSStatus )
  GetMenuEventTrackingMode        (EventRef               inEvent,
                                   Boolean                getCurrent,
                                   MenuTrackingMode *     outMode);
  
  EXTERN_API( OSStatus )
  GetMenuEventFirstTimeOpen       (EventRef               inEvent,
                                   Boolean *              outFirstTimeOpen);
  
  EXTERN_API( OSStatus )
  GetMenuEventItemIndex           (EventRef               inEvent,
                                   MenuItemIndex *        outItemIndex);
  
  EXTERN_API( OSStatus )
  GetMenuEventCommandID           (EventRef               inEvent,
                                   MenuCommand *          outCommand);
  
  EXTERN_API( OSStatus )
  GetMenuEventKeyEvent            (EventRef               inEvent,
                                   EventRef *             outKeyEvent);
  
  EXTERN_API( OSStatus )
  GetMenuEventHICommand           (EventRef               inEvent,
                                   HICommand *            outCommand);
  
  /*--------------------------------------------------------------------------------------*/
  /* Command Events                                                                       */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( OSStatus )
  CreateCommandEvent              (UInt32                 kind,
                                   EventTime              when,
                                   const HICommand *      inCommand,
                                   EventRef *             outEvent);
  
  EXTERN_API( OSStatus )
  GetCommandEventCommand          (EventRef               inEvent,
                                   HICommand *            outCommand);
  
  /*--------------------------------------------------------------------------------------*/
  /* Miscellany                                                                           */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( OSStatus )
  CreateApplicationEvent          (UInt32                 kind,
                                   EventTime              when,
                                   EventRef *             outEvent);
  
  /*
     This routine is used to get information about an async application launch
     It is only valid on Mac OS X.
  */
  
  EXTERN_API( OSStatus )
  GetApplicationEventLaunchData   (EventRef               event,
                                   OSStatus *             outLaunchErr,
                                   ProcessSerialNumber *  outProcess,
                                   void **                outLaunchRefCon);
  
  /*======================================================================================*/
  /*  EVENT HANDLERS                                                                      */
  /*======================================================================================*/
  
  typedef UInt32 EventHandlerResult;
  enum {
      kEventHandlerHandled        = 0,
      kEventHandlerNotHandled     = 1,
      kEventHandlerPassUpChain    = 2,
      kEventHandlerStopProcessing = 3
  };
  
  enum {
      kEventHandlerStandard       = -1L
  };
  
  typedef struct OpaqueEventHandlerRef*   EventHandlerRef;
  
  /*--------------------------------------------------------------------------------------*/
  /*  o EventHandler specification                                                        */
  /*--------------------------------------------------------------------------------------*/
  
  typedef CALLBACK_API( EventHandlerResult , EventHandlerProcPtr )(EventHandlerRef inHandlerRef, EventRef inEvent, void *userData);
  typedef STACK_UPP_TYPE(EventHandlerProcPtr)                     EventHandlerUPP;
  if OPAQUE_UPP_TYPES
      EXTERN_API(EventHandlerUPP)
      NewEventHandlerUPP             (EventHandlerProcPtr     userRoutine);
  
      EXTERN_API(void)
      DisposeEventHandlerUPP         (EventHandlerUPP         userUPP);
  
      EXTERN_API(EventHandlerResult)
      InvokeEventHandlerUPP          (EventHandlerRef         inHandlerRef,
                                      EventRef                inEvent,
                                      void *                  userData,
                                      EventHandlerUPP         userUPP);
  
  else
      enum { uppEventHandlerProcInfo = 0x00000FF0 };                  /* pascal 4_bytes Func(4_bytes, 4_bytes, 4_bytes) */
      #define NewEventHandlerUPP(userRoutine)                         (EventHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventHandlerProcInfo, GetCurrentArchitecture())
      #define DisposeEventHandlerUPP(userUPP)                         DisposeRoutineDescriptor(userUPP)
      #define InvokeEventHandlerUPP(inHandlerRef, inEvent, userData, userUPP)  (EventHandlerResult)CALL_THREE_PARAMETER_UPP((userUPP), uppEventHandlerProcInfo, (inHandlerRef), (inEvent), (userData))
  endif
  /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
  define NewEventHandlerProc(userRoutine)                        NewEventHandlerUPP(userRoutine)
  define CallEventHandlerProc(userRoutine, inHandlerRef, inEvent, userData) InvokeEventHandlerUPP(inHandlerRef, inEvent, userData, userRoutine)
  /*--------------------------------------------------------------------------------------*/
  /*  o Installing Event Handlers                                                         */
  /*                                                                                      */
  /* Use these routines to install event handlers for a specific toolbox object. You may  */
  /* pass zero for inNumTypes and NULL for inList if you need to be in a situation where  */
  /* you know you will be receiving events, but not exactly which ones at the time you    */
  /* are installing the handler. Later, your application can call the Add/Remove routines */
  /* listed below this section.                                                           */
  /*                                                                                      */
  /* You can only install a specific handler once. The combination of inHandler and       */
  /* inUserData is considered the 'signature' of a handler. Any attempt to install a new  */
  /* handler with the same proc and user data as an already-installed handler will result */
  /* in eventHandlerAlreadyInstalledErr. Installing the same proc and user data on a      */
  /* different object is legal.                                                           */
  /*                                                                                      */
  /* Upon successful completion of this routine, you are returned an EventHandlerRef,     */
  /* which you can use in various other calls, and is passed to your event handler. You   */
  /* use it to extract information about the handler, such as the target (window, etc.)   */
  /* if you have the same handler installed for different objects and need to perform     */
  /* actions on the current target (say, call a window manager function).                 */
  /*--------------------------------------------------------------------------------------*/
  EXTERN_API( OSStatus )
  InstallApplicationEventHandler  (EventHandlerUPP        inHandler,
                                   UInt32                 inNumTypes,
                                   const EventTypeSpec *  inList,
                                   void *                 inUserData,
                                   EventHandlerRef *      outRef);
  
  EXTERN_API( OSStatus )
  InstallWindowEventHandler       (WindowRef              inWindowRef,
                                   EventHandlerUPP        inHandler,
                                   UInt32                 inNumTypes,
                                   const EventTypeSpec *  inList,
                                   void *                 inUserData,
                                   EventHandlerRef *      outRef);
  
  EXTERN_API( OSStatus )
  InstallControlEventHandler      (ControlRef             inControlRef,
                                   EventHandlerUPP        inHandler,
                                   UInt32                 inNumTypes,
                                   const EventTypeSpec *  inList,
                                   void *                 inUserData,
                                   EventHandlerRef *      outRef);
  
  EXTERN_API( OSStatus )
  InstallMenuEventHandler         (MenuRef                inMenuRef,
                                   EventHandlerUPP        inHandler,
                                   UInt32                 inNumTypes,
                                   const EventTypeSpec *  inList,
                                   void *                 inUserData,
                                   EventHandlerRef *      outRef);
  
  EXTERN_API( OSStatus )
  RemoveEventHandler              (EventHandlerRef        inHandlerRef);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Adjusting set of event types after a handler is created                           */
  /*                                                                                      */
  /* After installing a handler with the routine above, you can adjust the event type     */
  /* list telling the toolbox what events to send to that handler by calling the two      */
  /* routines below. If you add an event type twice for the same handler, your handler    */
  /* will only be called once, but it will take two RemoveEventType calls to stop your    */
  /* handler from being called with that event type. In other words, the install count    */
  /* for each event type is maintained by the toolbox. This might allow you, for example  */
  /* to have subclasses of a window object register for types without caring if the base  */
  /* class has already registered for that type. When the subclass removes its types, it  */
  /* can succesfully do so without affecting the base class' reception of its events      */
  /* types, yielding eternal bliss.                                                       */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( OSStatus )
  AddEventTypesToHandler          (EventHandlerRef        inHandlerRef,
                                   UInt32                 inNumTypes,
                                   const EventTypeSpec *  inList);
  
  EXTERN_API( OSStatus )
  RemoveEventTypesFromHandler     (EventHandlerRef        inHandlerRef,
                                   UInt32                 inNumTypes,
                                   const EventTypeSpec *  inList);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Explicit Propogation                                                              */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( EventHandlerResult )
  CallNextEventHandler            (EventHandlerRef        inThisHandler,
                                   EventRef               inEvent);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Getting the target from a handler ref                                             */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( ControlRef )
  GetEventHandlerTargetControl    (EventHandlerRef        inHandler);
  
  EXTERN_API( WindowRef )
  GetEventHandlerTargetWindow     (EventHandlerRef        inHandler);
  
  EXTERN_API( MenuRef )
  GetEventHandlerTargetMenu       (EventHandlerRef        inHandler);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Sending Events                                                                    */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( EventHandlerResult )
  SendEventToApplication          (EventRef               inEvent);
  
  EXTERN_API( EventHandlerResult )
  SendEventToWindow               (EventRef               inEvent,
                                   WindowRef              inWindow);
  
  EXTERN_API( EventHandlerResult )
  SendEventToControl              (EventRef               inEvent,
                                   ControlRef             inControl);
  
  EXTERN_API( EventHandlerResult )
  SendEventToMenu                 (EventRef               inEvent,
                                   MenuRef                inMenu);
  
  EXTERN_API( EventHandlerResult )
  SendEventToUserFocus            (EventRef               inEvent);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Command Routines                                                                  */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( EventHandlerResult )
  ProcessHICommand                (const HICommand *      inCommand);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Event Loop Routines                                                               */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( void )
  RunApplicationEventLoop         (void);
  
  EXTERN_API( void )
  QuitApplicationEventLoop        (void);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o User Focus                                                                        */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( void )
  SetUserFocusWindow              (WindowRef              inWindow);
  
  EXTERN_API( WindowRef )
  GetUserFocusWindow              (void);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Default/Cancel buttons                                                            */
  /*--------------------------------------------------------------------------------------*/
  
  EXTERN_API( OSStatus )
  SetWindowDefaultButton          (WindowRef              inWindow,
                                   ControlRef             inControl) /* can be NULL */;
  
  EXTERN_API( OSStatus )
  SetWindowCancelButton           (WindowRef              inWindow,
                                   ControlRef             inControl) /* can be NULL */;
  
  EXTERN_API( OSStatus )
  GetWindowDefaultButton          (WindowRef              inWindow,
                                   ControlRef *           outControl);
  
  EXTERN_API( OSStatus )
  GetWindowCancelButton           (WindowRef              inWindow,
                                   ControlRef *           outControl);
  
  /*--------------------------------------------------------------------------------------*/
  /*  o Mouse Tracking Areas                                                              */
  /*                                                                                      */
  /*  Mouse tracking areas control the generation of mouse-enter and                      */
  /*  mouse-exit events.  When the user moves the mouse into a tracking                   */
  /*  area, kEventMouseEnter is sent to the window.  When the user moves                  */
  /*  the mouse out of a tracking area, kEventMouseExit is sent.                          */
  /*                                                                                      */
  /*  Mouse tracking regions are uniquely identified within the scope of                  */
  /*  a window by a client signature/MouseTrackingRef pair.  The client                   */
  /*  signature is the usual DTS-registered creator OSType.                               */
  /*                                                                                      */
  /*  Mouse tracking areas can overlap, but are not exclusive.  Mouse                     */
  /*  motion events are generated for each of the tracking areas                          */
  /*  intersected by the mouse.                                                           */
  /*                                                                                      */
  /*  Mouse tracking areas are initially enabled.  You can explicitly                     */
  /*  disable a mouse tracking area to prevent mouse-enter/exit events                    */
  /*  from being generated.                                                               */
  /*                                                                                      */
  /*  Unlike global mouse-moved events, mouse-enter and mouse-exit are                    */
  /*  generated while your app is in the background.  If this is not                      */
  /*  considered desirable, disable the tracking areas while the                          */
  /*  application is in the background.                                                   */
  /*--------------------------------------------------------------------------------------*/
  typedef struct OpaqueMouseTrackingRef*  MouseTrackingRef;
  /*
      Tracking Options
      If locally clipped, the region is expected in local coordinates and
      mouse movement tracking is clipped to the window's content region.
      If globally clipped, the region is expected in global coordinates and
      the tracking area is clipped to  window's structure region.
  */
  
  typedef OptionBits                      MouseTrackingOptions;
  enum {
      kMouseTrackingOptionLocalClip = 0,                          /* specify a region in local coordinates; it will be clipped to the window's content region*/
      kMouseTrackingOptionGlobalClip = 1,                         /* specify a region in global coordinates; it will be clipped to the window's structure region*/
      kMouseTrackingOptionsStandard = kMouseTrackingOptionLocalClip
  };
  
  /* Creation*/
  EXTERN_API( OSStatus )
  CreateMouseTrackingArea         (WindowRef              inWindow,
                                   OSType                 inCreator,
                                   MouseTrackingOptions   inOptions,
                                   RgnHandle              inRegion,
                                   MouseTrackingRef *     outMouseRef);
  
  EXTERN_API( OSStatus )
  RetainMouseTrackingArea         (MouseTrackingRef       inMouseRef);
  
  EXTERN_API( OSStatus )
  ReleaseMouseTrackingArea        (MouseTrackingRef       inMouseRef);
  
  /* Accessors*/
  EXTERN_API( OSStatus )
  SetMouseTrackingAreaRefCon      (MouseTrackingRef       inMouseRef,
                                   UInt32                 refCon);
  
  EXTERN_API( OSStatus )
  GetMouseTrackingAreaRefCon      (MouseTrackingRef       inMouseRef,
                                   UInt32 *               outRefCon);
  
  /* Geometry*/
  EXTERN_API( OSStatus )
  MoveMouseTrackingArea           (MouseTrackingRef       inMouseRef,
                                   SInt16                 deltaH,
                                   SInt16                 deltaV);
  
  EXTERN_API( OSStatus )
  SetMouseTrackingAreaRegion      (MouseTrackingRef       inMouseRef,
                                   RgnHandle              inRegion);
  
  EXTERN_API( OSStatus )
  GetMouseTrackingAreaRegion      (MouseTrackingRef       inMouseRef,
                                   RgnHandle              outRgn);
  
  /* Enable/disable*/
  EXTERN_API( OSStatus )
  SetMouseTrackingAreaEnabled     (MouseTrackingRef       inMouseRef,
                                   Boolean                enabled);
  
  /* Namespace-scoped operations*/
  EXTERN_API( OSStatus )
  ReleaseWindowMouseTrackingAreas (WindowRef              inWindow,
                                   OSType                 creator);
  
  EXTERN_API( OSStatus )
  MoveWindowMouseTrackingAreas    (WindowRef              inWindow,
                                   OSType                 creator,
                                   SInt16                 deltaH,
                                   SInt16                 deltaV);
  
  EXTERN_API( OSStatus )
  SetWindowMouseTrackingAreasEnabled (WindowRef           inWindow,
                                   OSType                 creator,
                                   Boolean                enabled);
  
  /* Mouse event accessor additions*/
  
  /* Mouse-enter and exit events contain the tracking ref for which they are generated.*/
  EXTERN_API( OSStatus )
  SetMouseEventTrackingArea       (EventRef               inEvent,
                                   MouseTrackingRef       inMouseRef);
  
  EXTERN_API( OSStatus )
  GetMouseEventTrackingArea       (EventRef               inEvent,
                                   MouseTrackingRef *     outMouseRef);
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=reset
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(pop)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack()
  endif
  
  ifdef PRAGMA_IMPORT_OFF
  #pragma import off
  #elif PRAGMA_IMPORT
  #pragma import reset
  endif
  
  ifdef __cplusplus
  }
  endif
  
  endif /* __CARBONEVENTS__ */
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.