diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /common/quicktime_win32/CarbonEventsCore.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'common/quicktime_win32/CarbonEventsCore.h')
| -rw-r--r-- | common/quicktime_win32/CarbonEventsCore.h | 2174 |
1 files changed, 2174 insertions, 0 deletions
diff --git a/common/quicktime_win32/CarbonEventsCore.h b/common/quicktime_win32/CarbonEventsCore.h new file mode 100644 index 0000000..e0142b5 --- /dev/null +++ b/common/quicktime_win32/CarbonEventsCore.h @@ -0,0 +1,2174 @@ +/* + File: CarbonEventsCore.h + + Contains: Carbon Event Manager + + Version: QuickTime 7.3 + + Copyright: (c) 2007 (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 __CARBONEVENTSCORE__ +#define __CARBONEVENTSCORE__ + +#ifndef __CFSTRING__ +#include <CFString.h> +#endif + +#ifndef __AEREGISTRY__ +#include <AERegistry.h> +#endif + +#ifndef __AEDATAMODEL__ +#include <AEDataModel.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 + +/*======================================================================================*/ +/* The core data structure of the Carbon Event system */ +/*======================================================================================*/ +typedef struct OpaqueEventRef* EventRef; +/*======================================================================================*/ +/* EVENT COMMON */ +/*======================================================================================*/ + + +/* + * Discussion: + * The following are all errors which can be returned from the + * routines contained in this file. + */ +enum { + + /* + * This is returned from PostEventToQueue if the event in question is + * already in the queue you are posting it to (or any other queue). + */ + eventAlreadyPostedErr = -9860, + + /* + * You are attemtping to modify a target that is currently in use, + * such as when dispatching. + */ + eventTargetBusyErr = -9861, + + /* + * This is obsolete and will be removed. + */ + eventClassInvalidErr = -9862, + + /* + * This is obsolete and will be removed. + */ + eventClassIncorrectErr = -9864, + + /* + * Returned from InstallEventHandler if the handler proc you pass is + * already installed for a given event type you are trying to + * register. + */ + eventHandlerAlreadyInstalledErr = -9866, + + /* + * A generic error. + */ + eventInternalErr = -9868, + + /* + * This is obsolete and will be removed. + */ + eventKindIncorrectErr = -9869, + + /* + * The piece of data you are requesting from an event is not present. + */ + eventParameterNotFoundErr = -9870, + + /* + * This is what you should return from an event handler when your + * handler has received an event it doesn't currently want to (or + * isn't able to) handle. If you handle an event, you should return + * noErr from your event handler. Any return value other than + * eventNotHandledErr will cause event handling to stop; the event + * will not be sent to any other event handler, and the return value + * will be provided to the original caller of SendEventToTarget. + */ + eventNotHandledErr = -9874, + + /* + * The event loop has timed out. This can be returned from calls to + * ReceiveNextEvent or RunCurrentEventLoop. + */ + eventLoopTimedOutErr = -9875, + + /* + * The event loop was quit, probably by a call to QuitEventLoop. This + * can be returned from ReceiveNextEvent or RunCurrentEventLoop. + */ + eventLoopQuitErr = -9876, + + /* + * Returned from RemoveEventFromQueue when trying to remove an event + * that's not in any queue. + */ + eventNotInQueueErr = -9877, + eventHotKeyExistsErr = -9878, + eventHotKeyInvalidErr = -9879 +}; + +/*======================================================================================*/ +/* EVENT CORE */ +/*======================================================================================*/ +/*--------------------------------------------------------------------------------------*/ +/* o Event Flags, options */ +/*--------------------------------------------------------------------------------------*/ + +/* + * EventPriority + * + * Discussion: + * These values define the relative priority of an event, and are + * used when posting events with PostEventToQueue. In general events + * are pulled from the queue in order of first posted to last + * posted. These priorities are a way to alter that when posting + * events. You can post a standard priority event and then a high + * priority event and the high priority event will be pulled from + * the queue first. + */ +typedef SInt16 EventPriority; +enum { + + /* + * Lowest priority. Currently only window update events are posted at + * this priority. + */ + kEventPriorityLow = 0, + + /* + * Normal priority of events. Most events are standard priority. + */ + kEventPriorityStandard = 1, + + /* + * Highest priority. + */ + kEventPriorityHigh = 2 +}; + +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 ((EventTime)1.0) +#define kEventDurationMillisecond ((EventTime)(kEventDurationSecond/1000)) +#define kEventDurationMicrosecond ((EventTime)(kEventDurationSecond/1000000)) +#define kEventDurationNanosecond ((EventTime)(kEventDurationSecond/1000000000)) +#define kEventDurationMinute ((EventTime)(kEventDurationSecond*60)) +#define kEventDurationHour ((EventTime)(kEventDurationMinute*60)) +#define kEventDurationDay ((EventTime)(kEventDurationHour*24)) +#define kEventDurationNoWait ((EventTime)0.0) +#define kEventDurationForever ((EventTime)(-1.0)) + +/* Helpful doodads to convert to and from ticks and event times*/ +#ifdef __cplusplus + inline EventTime TicksToEventTime( UInt32 t ) { return ( (t) / 60.0 ); } + inline UInt32 EventTimeToTicks( EventTime t ) { return (UInt32)( ((t) * 60) + 0.5 ); } +#else + #define TicksToEventTime( t ) ((EventTime)( (t) / 60.0 )) + #define EventTimeToTicks( t ) ((UInt32)( ((t) * 60) + 0.5 )) +#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. */ +/*--------------------------------------------------------------------------------------*/ + +/* + * EventTypeSpec + * + * Discussion: + * This structure is used to specify an event. Typically, a static + * array of EventTypeSpecs are passed into functions such as + * InstallEventHandler, as well as routines such as + * FlushEventsMatchingListFromQueue. + */ +struct EventTypeSpec { + UInt32 eventClass; + UInt32 eventKind; +}; +typedef struct EventTypeSpec EventTypeSpec; +/*A helpful macro for dealing with EventTypeSpecs */ +#define GetEventTypeCount( t ) (sizeof( (t) ) / sizeof( EventTypeSpec )) + +typedef OSType EventParamName; +typedef OSType EventParamType; +/*--------------------------------------------------------------------------------------*/ +/* o EventLoop */ +/*--------------------------------------------------------------------------------------*/ + +/* + * EventLoopRef + * + * Discussion: + * An EventLoopRef represents an 'event loop', which is the + * conceptual entity that you 'run' to fetch events from hardware + * and other sources and also fires timers that might be installed + * with InstallEventLoopTimer. The term 'run' is a bit of a + * misnomer, as the event loop's goal is to stay as blocked as + * possible to minimize CPU usage for the current application. The + * event loop is run implicitly thru APIs like ReceiveNextEvent, + * RunApplicationEventLoop, or even WaitNextEvent. It can also be + * run explicitly thru a call to RunCurrentEventLoop. Each + * preemptive thread can have an event loop. Cooperative threads + * share the main thread's event loop. + */ +typedef struct OpaqueEventLoopRef* EventLoopRef; +/* + * GetCurrentEventLoop() + * + * Discussion: + * Returns the current event loop for the current thread. If the + * current thread is a cooperative thread, the main event loop is + * returned. + * + * Result: + * An event loop reference. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventLoopRef ) +GetCurrentEventLoop(void); + + +/* + * GetMainEventLoop() + * + * Discussion: + * Returns the event loop object for the main application thread. + * + * Result: + * An event loop reference. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventLoopRef ) +GetMainEventLoop(void); + + + +/* + * RunCurrentEventLoop() + * + * Discussion: + * This routine 'runs' the event loop, returning only if aborted or + * the timeout specified is reached. The event loop is mostly + * blocked while in this function, occasionally waking up to fire + * timers or pick up events. The typical use of this function is to + * cause the current thread to wait for some operation to complete, + * most likely on another thread of execution. + * + * Parameters: + * + * inTimeout: + * The time to wait until returning (can be kEventDurationForever). + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +RunCurrentEventLoop(EventTimeout inTimeout); + + +/* + * QuitEventLoop() + * + * Discussion: + * Causes a specific event loop to terminate. Usage of this is + * similar to WakeUpProcess, in that it causes the eventloop + * specified to return immediately (as opposed to timing out). + * Typically this call is used in conjunction with + * RunCurrentEventLoop. + * + * Parameters: + * + * inEventLoop: + * The event loop to terminate. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +QuitEventLoop(EventLoopRef inEventLoop); + + +/* + * GetCFRunLoopFromEventLoop() + * + * Discussion: + * Returns the corresponding CFRunLoopRef for the given EventLoop. + * This is not necessarily a one-to-one mapping, hence the need for + * this function. In Carbon, all cooperative threads use the same + * run loop under the covers, so using CFRunLoopGetCurrent might + * yield the wrong result. In general, you would only need to use + * this function if you wished to add your own sources to the run + * loop. If you don't know what I'm talking about, then you probably + * don't need to use this. + * + * Parameters: + * + * inEventLoop: + * The event loop to get the CFRunLoop for. + * + * Result: + * The CFRunLoopRef for inEventLoop. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available in CarbonLib 1.x, is available on Mac OS X version 10.1 and later + * Mac OS X: in version 10.1 and later + */ +EXTERN_API_C( CFTypeRef ) +GetCFRunLoopFromEventLoop(EventLoopRef inEventLoop); + + +/*--------------------------------------------------------------------------------------*/ +/* o Low-level event fetching */ +/*--------------------------------------------------------------------------------------*/ +/* + * ReceiveNextEvent() + * + * Discussion: + * This routine tries to fetch the next event of a specified type. + * If no events in the event queue match, this routine will run the + * current event loop until an event that matches arrives, or the + * timeout expires. Except for timers firing, your application is + * blocked waiting for events to arrive when inside this function. + * + * Parameters: + * + * inNumTypes: + * The number of event types we are waiting for (0 if any event + * should cause this routine to return). + * + * inList: + * The list of event types we are waiting for (pass NULL if any + * event should cause this routine to return). + * + * inTimeout: + * The time to wait (passing kEventDurationForever is preferred). + * + * inPullEvent: + * Pass true for this parameter to actually remove the next + * matching event from the queue. + * + * outEvent: + * The next event that matches the list passed in. If inPullEvent + * is true, the event is owned by you, and you will need to + * release it when done. + * + * Result: + * A result indicating whether an event was received, the timeout + * expired, or the current event loop was quit. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +ReceiveNextEvent( + UInt32 inNumTypes, + const EventTypeSpec * inList, + EventTimeout inTimeout, + Boolean inPullEvent, + EventRef * outEvent); + + +/*--------------------------------------------------------------------------------------*/ +/* o Core event lifetime APIs */ +/*--------------------------------------------------------------------------------------*/ +typedef UInt32 EventAttributes; +enum { + kEventAttributeNone = 0, + kEventAttributeUserEvent = (1 << 0) +}; + +/* + * [Mac]CreateEvent() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +#if TARGET_OS_MAC + #define MacCreateEvent CreateEvent +#endif +EXTERN_API( OSStatus ) +MacCreateEvent( + CFAllocatorRef inAllocator, /* can be NULL */ + UInt32 inClassID, + UInt32 kind, + EventTime when, + EventAttributes flags, + EventRef * outEvent); + + +/* + * CopyEvent() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventRef ) +CopyEvent(EventRef inOther); + + +/* + * RetainEvent() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventRef ) +RetainEvent(EventRef inEvent); + + +/* + * GetEventRetainCount() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( UInt32 ) +GetEventRetainCount(EventRef inEvent); + + +/* + * ReleaseEvent() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( void ) +ReleaseEvent(EventRef inEvent); + + +/* + * SetEventParameter() + * + * Discussion: + * Sets a piece of data for the given event. + * + * Parameters: + * + * inEvent: + * The event to set the data for. + * + * inName: + * The symbolic name of the parameter. + * + * inType: + * The symbolic type of the parameter. + * + * inSize: + * The size of the parameter data. + * + * inDataPtr: + * The pointer to the parameter data. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +SetEventParameter( + EventRef inEvent, + EventParamName inName, + EventParamType inType, + UInt32 inSize, + const void * inDataPtr); + + + +/* + * GetEventParameter() + * + * Discussion: + * Gets a piece of data from the given event, if it exists. + * + * Parameters: + * + * inEvent: + * The event to get the parameter from. + * + * inName: + * The symbolic name of the parameter. + * + * inDesiredType: + * The desired type of the parameter. At present we do not support + * coercion, so this parameter must be the actual type of data + * stored in the event, or an error will be returned. + * + * outActualType: + * The actual type of the parameter, can be NULL if you are not + * interested in receiving this information. + * + * inBufferSize: + * The size of the output buffer specified by ioBuffer. + * + * outActualSize: + * The actual size of the data, or NULL if you don't want this + * information. + * + * outData: + * The pointer to the buffer which will receive the parameter data. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +GetEventParameter( + EventRef inEvent, + EventParamName inName, + EventParamType inDesiredType, + EventParamType * outActualType, /* can be NULL */ + UInt32 inBufferSize, + UInt32 * outActualSize, /* can be NULL */ + void * outData); + + + +/*--------------------------------------------------------------------------------------*/ +/* o Getters for 'base-class' event info */ +/*--------------------------------------------------------------------------------------*/ +/* + * GetEventClass() + * + * Discussion: + * Returns the class of the given event, such as mouse, keyboard, + * etc. + * + * Parameters: + * + * inEvent: + * The event in question. + * + * Result: + * The class ID of the event. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( UInt32 ) +GetEventClass(EventRef inEvent); + + +/* + * GetEventKind() + * + * Discussion: + * Returns the kind of the given event (mousedown, etc.). Event + * kinds overlap between event classes, e.g. kEventMouseDown and + * kEventAppActivated have the same value (1). The combination of + * class and kind is what determines an event signature. + * + * Parameters: + * + * inEvent: + * The event in question. + * + * Result: + * The kind of the event. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( UInt32 ) +GetEventKind(EventRef inEvent); + + +/* + * GetEventTime() + * + * Discussion: + * Returns the time the event specified occurred, specified in + * EventTime, which is a floating point number representing seconds + * since the last system startup. + * + * Parameters: + * + * inEvent: + * The event in question. + * + * Result: + * The time the event occurred. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventTime ) +GetEventTime(EventRef inEvent); + + +/*--------------------------------------------------------------------------------------*/ +/* o Setters for 'base-class' event info */ +/*--------------------------------------------------------------------------------------*/ + +/* + * SetEventTime() + * + * Discussion: + * This routine allows you to set the time of a given event, if you + * so desire. In general, you would never use this routine, except + * for those special cases where you reuse an event from time to + * time instead of creating a new event each time. + * + * Parameters: + * + * inEvent: + * The event in question. + * + * inTime: + * The new time. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +SetEventTime( + EventRef inEvent, + EventTime inTime); + + +/*--------------------------------------------------------------------------------------*/ +/* o Event Queue routines (posting, finding, flushing) */ +/*--------------------------------------------------------------------------------------*/ + +typedef struct OpaqueEventQueueRef* EventQueueRef; +/* + * GetCurrentEventQueue() + * + * Discussion: + * Returns the current event queue for the current thread. If the + * current thread is a cooperative thread, the main event queue is + * returned. + * + * Result: + * An event queue reference. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventQueueRef ) +GetCurrentEventQueue(void); + + +/* + * GetMainEventQueue() + * + * Discussion: + * Returns the event queue object for the main application thread. + * + * Result: + * An event queue reference. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventQueueRef ) +GetMainEventQueue(void); + + + +/* + * EventComparatorProcPtr + * + * Discussion: + * Type of a callback function used by queue searches. + * + * Parameters: + * + * inEvent: + * The event to compare. + * + * inCompareData: + * The data used to compare the event. + * + * Result: + * A boolean value indicating whether the event matches (true) or + * not (false). + */ +typedef CALLBACK_API( Boolean , EventComparatorProcPtr )(EventRef inEvent, void *inCompareData); +typedef STACK_UPP_TYPE(EventComparatorProcPtr) EventComparatorUPP; +/* + * NewEventComparatorUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( EventComparatorUPP ) +NewEventComparatorUPP(EventComparatorProcPtr userRoutine); +#if !OPAQUE_UPP_TYPES + enum { uppEventComparatorProcInfo = 0x000003D0 }; /* pascal 1_byte Func(4_bytes, 4_bytes) */ + #ifdef __cplusplus + inline DEFINE_API_C(EventComparatorUPP) NewEventComparatorUPP(EventComparatorProcPtr userRoutine) { return (EventComparatorUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventComparatorProcInfo, GetCurrentArchitecture()); } + #else + #define NewEventComparatorUPP(userRoutine) (EventComparatorUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventComparatorProcInfo, GetCurrentArchitecture()) + #endif +#endif + +/* + * DisposeEventComparatorUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( void ) +DisposeEventComparatorUPP(EventComparatorUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(void) DisposeEventComparatorUPP(EventComparatorUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } + #else + #define DisposeEventComparatorUPP(userUPP) DisposeRoutineDescriptor(userUPP) + #endif +#endif + +/* + * InvokeEventComparatorUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( Boolean ) +InvokeEventComparatorUPP( + EventRef inEvent, + void * inCompareData, + EventComparatorUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(Boolean) InvokeEventComparatorUPP(EventRef inEvent, void * inCompareData, EventComparatorUPP userUPP) { return (Boolean)CALL_TWO_PARAMETER_UPP(userUPP, uppEventComparatorProcInfo, inEvent, inCompareData); } + #else + #define InvokeEventComparatorUPP(inEvent, inCompareData, userUPP) (Boolean)CALL_TWO_PARAMETER_UPP((userUPP), uppEventComparatorProcInfo, (inEvent), (inCompareData)) + #endif +#endif + +#if CALL_NOT_IN_CARBON || OLDROUTINENAMES + /* support for pre-Carbon UPP routines: New...Proc and Call...Proc */ + #define NewEventComparatorProc(userRoutine) NewEventComparatorUPP(userRoutine) + #define CallEventComparatorProc(userRoutine, inEvent, inCompareData) InvokeEventComparatorUPP(inEvent, inCompareData, userRoutine) +#endif /* CALL_NOT_IN_CARBON */ + +/* + * PostEventToQueue() + * + * Discussion: + * Posts an event to the queue specified. This automatically wakes + * up the event loop of the thread the queue belongs to. After + * posting the event, you should release the event. The event queue + * retains it. + * + * Parameters: + * + * inQueue: + * The event queue to post the event onto. + * + * inEvent: + * The event to post. + * + * inPriority: + * The priority of the event. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +PostEventToQueue( + EventQueueRef inQueue, + EventRef inEvent, + EventPriority inPriority); + + +/* + * FlushEventsMatchingListFromQueue() + * + * Discussion: + * Flushes events matching a specified list of classes and kinds + * from an event queue. + * + * Parameters: + * + * inQueue: + * The event queue to flush events from. + * + * inNumTypes: + * The number of event kinds to flush. + * + * inList: + * The list of event classes and kinds to flush from the queue. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +FlushEventsMatchingListFromQueue( + EventQueueRef inQueue, + UInt32 inNumTypes, + const EventTypeSpec * inList); + + +/* + * FlushSpecificEventsFromQueue() + * + * Discussion: + * Flushes events that match a comparator function. + * + * Parameters: + * + * inQueue: + * The event queue to flush events from. + * + * inComparator: + * The comparison function to invoke for each event in the queue. + * + * inCompareData: + * The data you wish to pass to your comparison function. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +FlushSpecificEventsFromQueue( + EventQueueRef inQueue, + EventComparatorUPP inComparator, + void * inCompareData); + + +/* + * FlushEventQueue() + * + * Discussion: + * Flushes all events from an event queue. + * + * Parameters: + * + * inQueue: + * The event queue to flush. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +FlushEventQueue(EventQueueRef inQueue); + + +/* + * FindSpecificEventInQueue() + * + * Discussion: + * Returns the first event that matches a comparator function, or + * NULL if no events match. + * + * Parameters: + * + * inQueue: + * The event queue to search. + * + * inComparator: + * The comparison function to invoke for each event in the queue. + * + * inCompareData: + * The data you wish to pass to your comparison function. + * + * Result: + * An event reference. The event is still in the queue when + * FindSpecificEventInQueue returns; you can remove it from the + * queue with RemoveEventFromQueue. The returned event does not need + * to be released by the caller. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventRef ) +FindSpecificEventInQueue( + EventQueueRef inQueue, + EventComparatorUPP inComparator, + void * inCompareData); + + +/* + * GetNumEventsInQueue() + * + * Discussion: + * Returns the number of events in an event queue. + * + * Parameters: + * + * inQueue: + * The event queue to query. + * + * Result: + * The number of items in the queue. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( UInt32 ) +GetNumEventsInQueue(EventQueueRef inQueue); + + +/* + * RemoveEventFromQueue() + * + * Discussion: + * Removes the given event from the queue which it was posted. When + * you call this function, the event ownership is transferred to + * you, the caller, at no charge. You must release the event when + * you are through with it. + * + * Parameters: + * + * inQueue: + * The queue to remove the event from. + * + * inEvent: + * The event to remove. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +RemoveEventFromQueue( + EventQueueRef inQueue, + EventRef inEvent); + + +/* + * IsEventInQueue() + * + * Discussion: + * Returns true if the specified event is posted to a queue. + * + * Parameters: + * + * inQueue: + * The queue to check. + * + * inEvent: + * The event in question. + * + * Result: + * A boolean value. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( Boolean ) +IsEventInQueue( + EventQueueRef inQueue, + EventRef inEvent); + + +/*--------------------------------------------------------------------------------------*/ +/* Queue-synchronized event state */ +/*--------------------------------------------------------------------------------------*/ +/* + * GetCurrentEvent() + * + * Summary: + * Returns the user input event currently being handled. + * + * Discussion: + * When an event with kEventAttributeUserEvent is dispatched by the + * event dispatcher target, it is recorded internally by the Event + * Manager. At any time during the handling of that event, + * GetCurrentEvent may be used to retrieve the original EventRef. + * + * Result: + * The user input (mouse or keyboard) event currently being handled. + * May be NULL if no event is currently being handled, or if the + * current event was not a user input event. The returned event is + * not retained, and its lifetime should be considered to be no + * longer than the current function; if you need to keep the event + * alive past that time, you should retain it. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available in CarbonLib 1.x, is available on Mac OS X version 10.2 and later + * Mac OS X: in version 10.2 and later + */ +EXTERN_API_C( EventRef ) +GetCurrentEvent(void); + + +/* + * GetCurrentEventButtonState() + * + * Summary: + * Returns the current queue-synchronized mouse button state on the + * primary input device. + * + * Discussion: + * At any point in the handling of user input, there are two + * different mouse button states: the queue-synchronized state and + * the hardware state. The hardware state reflects the actual + * current state of the mouse attached to the user's machine. The + * queue-synchronized state reflects the state according to the + * events that have been processed at that point by the application. + * These two states may be different if there are unprocessed events + * in the event queue, or if events are being artificially + * introduced into the event queue from an outside source. + * GetCurrentEventButtonState returns the queue-synchronized button + * state. It is generally better to use this API than to use the + * Button function or the GetCurrentButtonState function (which + * return the hardware state). This gives a more consistent user + * experience when the user input queue is being remoted controlled + * or manipulated via non-hardware event sources such as speech or + * AppleEvents; using GetCurrentEventButtonState is also much faster + * than using Button or GetCurrentButtonState. + * + * Note that GetCurrentEventButtonState only returns a valid button + * state if your application is the active application. If your + * application is not active, then user input events are not flowing + * through the event dispatcher and the queue-synchronized state is + * not updated. + * + * Result: + * The queue-synchronized state of the mouse buttons. Bit zero + * indicates the state of the primary button, bit one the state of + * the secondary button, and so on. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available in CarbonLib 1.x, is available on Mac OS X version 10.2 and later + * Mac OS X: in version 10.2 and later + */ +EXTERN_API_C( UInt32 ) +GetCurrentEventButtonState(void); + + +/* + * GetCurrentEventKeyModifiers() + * + * Summary: + * Returns the current queue-synchronized keyboard modifier state. + * + * Discussion: + * At any point in the handling of user input, there are two + * different keyboard modifier states: the queue-synchronized state + * and the hardware state. The hardware state reflects the actual + * current state of the keyboard attached to the user's machine. The + * queue-synchronized state reflects the state according to the + * events that have been processed at that point by the application. + * These two states may be different if there are unprocessed events + * in the event queue, or if events are being artificially + * introduced into the event queue from an outside source. + * GetCurrentEventKeyModifiers returns the queue-synchronized + * modifier state. It is generally better to use this API than to + * use the GetCurrentKeyModifiers API (which returns the hardware + * state). This gives a more consistent user experience when the + * user input queue is being remoted controlled or manipulated via + * non-hardware event sources such as speech or AppleEvents; using + * GetCurrentEventKeyModifiers is also much faster than using + * EventAvail(0, &eventRecord) or GetCurrentKeyModifiers. + * + * Note that GetCurrentEventKeyModifiers only returns a valid + * modifier state if your application is the active application. If + * your application is not active, then user input events are not + * flowing through the event dispatcher and the queue-synchronized + * state is not updated. + * + * Result: + * The queue-synchronized state of the keyboard modifiers. The + * format of the return value is the same as the modifiers field of + * an EventRecord (but only includes keyboard modifiers and not the + * other modifier flags included in an EventRecord). + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available in CarbonLib 1.x, is available on Mac OS X version 10.2 and later + * Mac OS X: in version 10.2 and later + */ +EXTERN_API_C( UInt32 ) +GetCurrentEventKeyModifiers(void); + + +/*--------------------------------------------------------------------------------------*/ +/* Multiple-button support */ +/*--------------------------------------------------------------------------------------*/ +/* + * GetCurrentButtonState() + * + * Summary: + * Returns the current hardware mouse button state on the primary + * input device. + * + * Discussion: + * In most cases, you should not use GetCurrentButtonState, but + * should use the GetCurrentEventButtonState function instead. + * GetCurrentEventButtonState is much faster than + * GetCurrentButtonState because it returns the locally cached + * button state; GetCurrentButtonState must get the mouse button + * state from the window server, which is slower. Using + * GetCurrentButtonState also can prevent your application from + * being operated by remote posting of events, since the hardware + * input device is not actually changing state in that case. Most + * commonly, you might need to use GetCurrentButtonState when your + * application is not the active application (as determined by the + * Process Manager function GetFrontProcess). In that case, the + * cached button state returned by GetCurrentEventButtonState is not + * valid because mouse button events are not flowing to your + * application, and you must use GetCurrentButtonState to determine + * the current hardware state. + * + * Result: + * The state of the mouse buttons on the mouse hardware. Bit zero + * indicates the state of the primary button, bit one the state of + * the secondary button, and so on. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available in CarbonLib 1.x, is available on Mac OS X version 10.2 and later + * Mac OS X: in version 10.2 and later + */ +EXTERN_API_C( UInt32 ) +GetCurrentButtonState(void); + + +/*--------------------------------------------------------------------------------------*/ +/* o Helpful utilities */ +/*--------------------------------------------------------------------------------------*/ + +/* + * GetCurrentEventTime() + * + * Discussion: + * Returns the current time since last system startup in seconds. + * + * Result: + * EventTime. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( EventTime ) +GetCurrentEventTime(void); + + +/*--------------------------------------------------------------------------------------*/ +/* o Timers */ +/*--------------------------------------------------------------------------------------*/ + +/* + * EventLoopTimerRef + * + * Discussion: + * An EventLoopTimerRef represents what we term a 'timer'. A timer + * is a function that is called either once or at regular intervals. + * It executes at task level and should not be confused with Time + * Manager Tasks or any other interrupt-level callback. This means + * you can call Toolbox routines, allocate memory and draw. When a + * timer 'fires', it calls a callback that you specify when the + * timer is installed. Timers in general have two uses - as a + * timeout mechanism and as a periodic task. An everyday example of + * using a timer for a timeout might be a light that goes out if no + * motion is detected in a room for 5 minutes. For this, you might + * install a timer which will fire in 5 minutes. If motion is + * detected, you would reset the timer fire time and let the clock + * start over. If no motion is detected for the full 5 minutes, the + * timer will fire and you could power off the light. A periodic + * timer is one that fires at regular intervals (say every second or + * so). You might use such a timer to blink the insertion point in + * your editor, etc. One advantage of timers is that you can install + * the timer right from the code that wants the time. For example, + * the standard Toolbox Edit Text control can install a timer to + * blink the cursor when it's active, meaning that IdleControls is a + * no-op for that control and doesn't need to be called. When the + * control is inactive, it removes its timer and doesn't waste CPU + * time in that state. NOTE: Currently, if you do decide to draw + * when your timer is called, be sure to save and restore the + * current port so that calling your timer doesn't inadvertently + * change the port out from under someone. + */ +typedef struct __EventLoopTimer* EventLoopTimerRef; + +/* + * EventLoopTimerProcPtr + * + * Discussion: + * Called when a timer fires. + * + * Parameters: + * + * inTimer: + * The timer that fired. + * + * inUserData: + * The data passed into InstallEventLoopTimer. + */ +typedef CALLBACK_API( void , EventLoopTimerProcPtr )(EventLoopTimerRef inTimer, void *inUserData); + +/* + * Discussion: + * Event Loop Idle Timer Messages + */ +enum { + + /* + * The user has gone idle (not touched an input device) for the + * duration specified in your idle timer. This is the first message + * you will receive. Start your engines! + */ + kEventLoopIdleTimerStarted = 1, + + /* + * If you specified an interval on your idle timer, your idle timer + * proc will be called with this message, letting you know it is + * merely firing at the interval specified. If you did not specify an + * interval, this message is not sent. + */ + kEventLoopIdleTimerIdling = 2, + + /* + * The user is back! Stop everything! This is your cue to stop any + * processing if you need to. + */ + kEventLoopIdleTimerStopped = 3 +}; + +typedef UInt16 EventLoopIdleTimerMessage; + +/* + * EventLoopIdleTimerProcPtr + * + * Discussion: + * Called when an idle timer fires. + * + * Parameters: + * + * inTimer: + * The timer that fired. + * + * inState: + * The current state of the timer. + * + * inUserData: + * The data passed into InstallEventLoopTimer. + */ +typedef CALLBACK_API( void , EventLoopIdleTimerProcPtr )(EventLoopTimerRef inTimer, EventLoopIdleTimerMessage inState, void *inUserData); +typedef STACK_UPP_TYPE(EventLoopTimerProcPtr) EventLoopTimerUPP; +typedef STACK_UPP_TYPE(EventLoopIdleTimerProcPtr) EventLoopIdleTimerUPP; +/* + * NewEventLoopTimerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( EventLoopTimerUPP ) +NewEventLoopTimerUPP(EventLoopTimerProcPtr userRoutine); +#if !OPAQUE_UPP_TYPES + enum { uppEventLoopTimerProcInfo = 0x000003C0 }; /* pascal no_return_value Func(4_bytes, 4_bytes) */ + #ifdef __cplusplus + inline DEFINE_API_C(EventLoopTimerUPP) NewEventLoopTimerUPP(EventLoopTimerProcPtr userRoutine) { return (EventLoopTimerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventLoopTimerProcInfo, GetCurrentArchitecture()); } + #else + #define NewEventLoopTimerUPP(userRoutine) (EventLoopTimerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventLoopTimerProcInfo, GetCurrentArchitecture()) + #endif +#endif + +#if CALL_NOT_IN_CARBON +/* + * NewEventLoopIdleTimerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: not available + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( EventLoopIdleTimerUPP ) +NewEventLoopIdleTimerUPP(EventLoopIdleTimerProcPtr userRoutine); +#if !OPAQUE_UPP_TYPES + enum { uppEventLoopIdleTimerProcInfo = 0x00000EC0 }; /* pascal no_return_value Func(4_bytes, 2_bytes, 4_bytes) */ + #ifdef __cplusplus + inline DEFINE_API_C(EventLoopIdleTimerUPP) NewEventLoopIdleTimerUPP(EventLoopIdleTimerProcPtr userRoutine) { return (EventLoopIdleTimerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventLoopIdleTimerProcInfo, GetCurrentArchitecture()); } + #else + #define NewEventLoopIdleTimerUPP(userRoutine) (EventLoopIdleTimerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventLoopIdleTimerProcInfo, GetCurrentArchitecture()) + #endif +#endif + +#endif /* CALL_NOT_IN_CARBON */ + +/* + * DisposeEventLoopTimerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( void ) +DisposeEventLoopTimerUPP(EventLoopTimerUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(void) DisposeEventLoopTimerUPP(EventLoopTimerUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } + #else + #define DisposeEventLoopTimerUPP(userUPP) DisposeRoutineDescriptor(userUPP) + #endif +#endif + +#if CALL_NOT_IN_CARBON +/* + * DisposeEventLoopIdleTimerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: not available + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( void ) +DisposeEventLoopIdleTimerUPP(EventLoopIdleTimerUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(void) DisposeEventLoopIdleTimerUPP(EventLoopIdleTimerUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } + #else + #define DisposeEventLoopIdleTimerUPP(userUPP) DisposeRoutineDescriptor(userUPP) + #endif +#endif + +#endif /* CALL_NOT_IN_CARBON */ + +/* + * InvokeEventLoopTimerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( void ) +InvokeEventLoopTimerUPP( + EventLoopTimerRef inTimer, + void * inUserData, + EventLoopTimerUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(void) InvokeEventLoopTimerUPP(EventLoopTimerRef inTimer, void * inUserData, EventLoopTimerUPP userUPP) { CALL_TWO_PARAMETER_UPP(userUPP, uppEventLoopTimerProcInfo, inTimer, inUserData); } + #else + #define InvokeEventLoopTimerUPP(inTimer, inUserData, userUPP) CALL_TWO_PARAMETER_UPP((userUPP), uppEventLoopTimerProcInfo, (inTimer), (inUserData)) + #endif +#endif + +#if CALL_NOT_IN_CARBON +/* + * InvokeEventLoopIdleTimerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: not available + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( void ) +InvokeEventLoopIdleTimerUPP( + EventLoopTimerRef inTimer, + EventLoopIdleTimerMessage inState, + void * inUserData, + EventLoopIdleTimerUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(void) InvokeEventLoopIdleTimerUPP(EventLoopTimerRef inTimer, EventLoopIdleTimerMessage inState, void * inUserData, EventLoopIdleTimerUPP userUPP) { CALL_THREE_PARAMETER_UPP(userUPP, uppEventLoopIdleTimerProcInfo, inTimer, inState, inUserData); } + #else + #define InvokeEventLoopIdleTimerUPP(inTimer, inState, inUserData, userUPP) CALL_THREE_PARAMETER_UPP((userUPP), uppEventLoopIdleTimerProcInfo, (inTimer), (inState), (inUserData)) + #endif +#endif + +#endif /* CALL_NOT_IN_CARBON */ + +#if CALL_NOT_IN_CARBON || OLDROUTINENAMES + /* support for pre-Carbon UPP routines: New...Proc and Call...Proc */ + #define NewEventLoopTimerProc(userRoutine) NewEventLoopTimerUPP(userRoutine) + #define NewEventLoopIdleTimerProc(userRoutine) NewEventLoopIdleTimerUPP(userRoutine) + #define CallEventLoopTimerProc(userRoutine, inTimer, inUserData) InvokeEventLoopTimerUPP(inTimer, inUserData, userRoutine) + #define CallEventLoopIdleTimerProc(userRoutine, inTimer, inState, inUserData) InvokeEventLoopIdleTimerUPP(inTimer, inState, inUserData, userRoutine) +#endif /* CALL_NOT_IN_CARBON */ + +/* + * InstallEventLoopTimer() + * + * Discussion: + * Installs a timer onto the event loop specified. The timer can + * either fire once or repeatedly at a specified interval depending + * on the parameters passed to this function. + * + * Parameters: + * + * inEventLoop: + * The event loop to add the timer. + * + * inFireDelay: + * The delay before first firing this timer (can be 0, to request + * that the timer be fired as soon as control returns to your + * event loop). In Mac OS X and CarbonLib 1.5 and later, you may + * pass kEventDurationForever to stop the timer from firing at all + * until SetEventLoopTimerNextFireTime is used to start it; in + * earlier CarbonLibs, to achieve the same effect, just pass zero + * and then immediately call SetEventLoopTimerNextFireTime( timer, + * kEventDurationForever ) before returning control to your event + * loop. + * + * inInterval: + * The timer interval (pass 0 for a one-shot timer, which executes + * once but does not repeat). In Mac OS X and CarbonLib 1.5 and + * later, you may also pass kEventDurationForever to create a + * one-shot timer. + * + * inTimerProc: + * The routine to call when the timer fires. + * + * inTimerData: + * Data to pass to the timer proc when called. + * + * outTimer: + * A reference to the newly installed timer. + * + * Result: + * An operating system status code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +InstallEventLoopTimer( + EventLoopRef inEventLoop, + EventTimerInterval inFireDelay, + EventTimerInterval inInterval, + EventLoopTimerUPP inTimerProc, + void * inTimerData, + EventLoopTimerRef * outTimer); + + +/* + * InstallEventLoopIdleTimer() + * + * Discussion: + * Installs a timer onto the event loop specified. Idle timers are + * only called when there is no user activity occuring in the + * application. This means that the user is not actively + * clicking/typing, and is also not in the middle of tracking a + * control, menu, or window. TrackMouseLocation actually disables + * all idle timers automatically for you. + * + * Parameters: + * + * inEventLoop: + * The event loop to add the timer. + * + * inDelay: + * The delay before firing this timer after a user input event has + * come in. For example, if you want to start your timer 2 seconds + * after the user stops typing, etc. you would pass 2.0 into this + * parameter. Each time the user types a key (or whatever), this + * timer is reset. If we are considered to be idle when an idle + * timer is installed, the first time it fires will be inDelay + * seconds from the time it is installed. So if you installed it + * in the middle of control tracking, say, it wouldn't fire until + * the user stopped tracking. But if you installed it at app + * startup and the user hasn't typed/clicked, it would fire in + * inDelay seconds. + * + * inInterval: + * The timer interval (pass 0 for a one-shot timer, which executes + * once but does not repeat). You may also pass + * kEventDurationForever to create a one-shot timer. + * + * inTimerProc: + * The routine to call when the timer fires. + * + * inTimerData: + * Data to pass to the timer proc when called. + * + * outTimer: + * A reference to the newly installed timer. + * + * Result: + * An operating system status code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +InstallEventLoopIdleTimer( + EventLoopRef inEventLoop, + EventTimerInterval inDelay, + EventTimerInterval inInterval, + EventLoopIdleTimerUPP inTimerProc, + void * inTimerData, + EventLoopTimerRef * outTimer); + + +/* GOING AWAY!!!! DO NOT CALL THIS API!!!!! USE INSTALLEVENTLOOPIDLETIMER ABOVE!!!! */ +/* + * InstallIdleTimer() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +InstallIdleTimer( + EventLoopRef inEventLoop, + EventTimerInterval inDelay, + EventTimerInterval inInterval, + EventLoopTimerUPP inTimerProc, + void * inTimerData, + EventLoopTimerRef * outTimer); + + +/* + * RemoveEventLoopTimer() + * + * Discussion: + * Removes a timer that was previously installed by a call to + * InstallEventLoopTimer. You call this function when you are done + * using a timer. + * + * Parameters: + * + * inTimer: + * The timer to remove. + * + * Result: + * An operating system status code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +RemoveEventLoopTimer(EventLoopTimerRef inTimer); + + +/* + * SetEventLoopTimerNextFireTime() + * + * Discussion: + * This routine is used to 'reset' a timer. It controls the next + * time the timer fires. This will override any interval you might + * have set. For example, if you have a timer that fires every + * second, and you call this function setting the next time to five + * seconds from now, the timer will sleep for five seconds, then + * fire. It will then resume its one-second interval after that. It + * is as if you removed the timer and reinstalled it with a new + * first-fire delay. + * + * Parameters: + * + * inTimer: + * The timer to adjust + * + * inNextFire: + * The interval from the current time to wait until firing the + * timer again. You may pass kEventDurationForever to stop the + * timer from firing at all. + * + * Result: + * An operating system status code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +SetEventLoopTimerNextFireTime( + EventLoopTimerRef inTimer, + EventTimerInterval inNextFire); + + + + +/*======================================================================================*/ +/* EVENT HANDLERS */ +/*======================================================================================*/ + +typedef struct OpaqueEventHandlerRef* EventHandlerRef; +typedef struct OpaqueEventHandlerCallRef* EventHandlerCallRef; + +/*--------------------------------------------------------------------------------------*/ +/* o EventHandler specification */ +/*--------------------------------------------------------------------------------------*/ + +/* + * EventHandlerProcPtr + * + * Discussion: + * Callback for receiving events sent to a target this callback is + * installed on. + * + * Parameters: + * + * inHandlerCallRef: + * A reference to the current handler call chain. This is sent to + * your handler so that you can call CallNextEventHandler if you + * need to. + * + * inEvent: + * The Event. + * + * inUserData: + * The app-specified data you passed in a call to + * InstallEventHandler. + * + * Result: + * An operating system result code. Returning noErr indicates you + * handled the event. Returning eventNotHandledErr indicates you did + * not handle the event and perhaps the toolbox should take other + * action. + */ +typedef CALLBACK_API( OSStatus , EventHandlerProcPtr )(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData); +typedef STACK_UPP_TYPE(EventHandlerProcPtr) EventHandlerUPP; +/* + * NewEventHandlerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( EventHandlerUPP ) +NewEventHandlerUPP(EventHandlerProcPtr userRoutine); +#if !OPAQUE_UPP_TYPES + enum { uppEventHandlerProcInfo = 0x00000FF0 }; /* pascal 4_bytes Func(4_bytes, 4_bytes, 4_bytes) */ + #ifdef __cplusplus + inline DEFINE_API_C(EventHandlerUPP) NewEventHandlerUPP(EventHandlerProcPtr userRoutine) { return (EventHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventHandlerProcInfo, GetCurrentArchitecture()); } + #else + #define NewEventHandlerUPP(userRoutine) (EventHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppEventHandlerProcInfo, GetCurrentArchitecture()) + #endif +#endif + +/* + * DisposeEventHandlerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( void ) +DisposeEventHandlerUPP(EventHandlerUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(void) DisposeEventHandlerUPP(EventHandlerUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } + #else + #define DisposeEventHandlerUPP(userUPP) DisposeRoutineDescriptor(userUPP) + #endif +#endif + +/* + * InvokeEventHandlerUPP() + * + * Availability: + * Non-Carbon CFM: available as macro/inline + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( OSStatus ) +InvokeEventHandlerUPP( + EventHandlerCallRef inHandlerCallRef, + EventRef inEvent, + void * inUserData, + EventHandlerUPP userUPP); +#if !OPAQUE_UPP_TYPES + #ifdef __cplusplus + inline DEFINE_API_C(OSStatus) InvokeEventHandlerUPP(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void * inUserData, EventHandlerUPP userUPP) { return (OSStatus)CALL_THREE_PARAMETER_UPP(userUPP, uppEventHandlerProcInfo, inHandlerCallRef, inEvent, inUserData); } + #else + #define InvokeEventHandlerUPP(inHandlerCallRef, inEvent, inUserData, userUPP) (OSStatus)CALL_THREE_PARAMETER_UPP((userUPP), uppEventHandlerProcInfo, (inHandlerCallRef), (inEvent), (inUserData)) + #endif +#endif + +#if CALL_NOT_IN_CARBON || OLDROUTINENAMES + /* support for pre-Carbon UPP routines: New...Proc and Call...Proc */ + #define NewEventHandlerProc(userRoutine) NewEventHandlerUPP(userRoutine) + #define CallEventHandlerProc(userRoutine, inHandlerCallRef, inEvent, inUserData) InvokeEventHandlerUPP(inHandlerCallRef, inEvent, inUserData, userRoutine) +#endif /* CALL_NOT_IN_CARBON */ + +typedef struct OpaqueEventTargetRef* EventTargetRef; +/*--------------------------------------------------------------------------------------*/ +/* 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). */ +/*--------------------------------------------------------------------------------------*/ +/* + * InstallEventHandler() + * + * Discussion: + * Installs an event handler on a specified target. Your handler + * proc will be called with the events you registered with when an + * event of the corresponding type and class are send to the target + * you are installing your handler on. + * + * Parameters: + * + * inTarget: + * The target to register your handler with. + * + * inHandler: + * A pointer to your handler function. + * + * inNumTypes: + * The number of events you are registering for. + * + * inList: + * A pointer to an array of EventTypeSpec entries representing the + * events you are interested in. + * + * inUserData: + * The value passed in this parameter is passed on to your event + * handler proc when it is called. + * + * outRef: + * Receives an EventHandlerRef, which you can use later to remove + * the handler. You can pass null if you don't want the reference + * - when the target is disposed, the handler will be disposed as + * well. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +InstallEventHandler( + EventTargetRef inTarget, + EventHandlerUPP inHandler, + UInt32 inNumTypes, + const EventTypeSpec * inList, + void * inUserData, + EventHandlerRef * outRef); /* can be NULL */ + + +/* + * InstallStandardEventHandler() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +InstallStandardEventHandler(EventTargetRef inTarget); + + +/* + * RemoveEventHandler() + * + * Discussion: + * Removes an event handler from the target it was bound to. + * + * Parameters: + * + * inHandlerRef: + * The handler ref to remove (returned in a call to + * InstallEventHandler). After you call this function, the handler + * ref is considered to be invalid and can no longer be used. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +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 successfully do so without affecting the base class's reception of its event */ +/* types, yielding eternal bliss. */ +/*--------------------------------------------------------------------------------------*/ + +/* + * AddEventTypesToHandler() + * + * Discussion: + * Adds additional events to an event handler that has already been + * installed. + * + * Parameters: + * + * inHandlerRef: + * The event handler to add the additional events to. + * + * inNumTypes: + * The number of events to add. + * + * inList: + * A pointer to an array of EventTypeSpec entries. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +AddEventTypesToHandler( + EventHandlerRef inHandlerRef, + UInt32 inNumTypes, + const EventTypeSpec * inList); + + +/* + * RemoveEventTypesFromHandler() + * + * Discussion: + * Removes events from an event handler that has already been + * installed. + * + * Parameters: + * + * inHandlerRef: + * The event handler to remove the events from. + * + * inNumTypes: + * The number of events to remove. + * + * inList: + * A pointer to an array of EventTypeSpec entries. + * + * Result: + * An operating system status code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +RemoveEventTypesFromHandler( + EventHandlerRef inHandlerRef, + UInt32 inNumTypes, + const EventTypeSpec * inList); + + +/*--------------------------------------------------------------------------------------*/ +/* o Explicit Propogation */ +/* */ +/* CallNextEventHandler can be used to call thru to all handlers below the current */ +/* handler being called. You pass the EventHandlerCallRef passed to your EventHandler */ +/* into this call so that we know how to properly forward the event. The result of */ +/* this function should normally be the result of your own handler that you called */ +/* this API from. The typical use of this routine would be to allow the toolbox to do */ +/* its standard processing and then follow up with some type of embellishment. */ +/*--------------------------------------------------------------------------------------*/ + +/* + * CallNextEventHandler() + * + * Discussion: + * Calls thru to the event handlers below you in the event handler + * stack of the target to which your handler is bound. You might use + * this to call thru to the default toolbox handling in order to + * post-process the event. You can only call this routine from + * within an event handler. + * + * Parameters: + * + * inCallRef: + * The event handler call ref passed into your event handler. + * + * inEvent: + * The event to pass thru. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +CallNextEventHandler( + EventHandlerCallRef inCallRef, + EventRef inEvent); + + + +/*--------------------------------------------------------------------------------------*/ +/* o Sending Events */ +/*--------------------------------------------------------------------------------------*/ + +/* + * Discussion: + * EventTarget Send Options + */ +enum { + + /* + * The event should be sent to the target given only, and should not + * propagate to any other target. CallNextEventHandler will do + * nothing in a handler which has received an event sent in this + * manner. + */ + kEventTargetDontPropagate = (1 << 0), + + /* + * The event is a notification-style event, and should be received by + * all handlers. The result is usually meaningless when sent in this + * manner, though we do maintain the strongest result code while the + * event falls through each handler. This means that if the first + * handler to receive the event returned noErr, and the next returned + * eventNotHandledErr, the result returned would actually be noErr. + * No handler can stop this event from propagating, i.e. the result + * code does not alter event flow. + */ + kEventTargetSendToAllHandlers = (1 << 1) +}; + +/* + * SendEventToEventTarget() + * + * Discussion: + * Sends an event to the specified event target. + * + * Parameters: + * + * inEvent: + * The event to send. + * + * inTarget: + * The target to send it to. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.1 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( OSStatus ) +SendEventToEventTarget( + EventRef inEvent, + EventTargetRef inTarget); + + +/* + * SendEventToEventTargetWithOptions() + * + * Discussion: + * Sends an event to the specified event target, optionally + * controlling how the event propagates. See the discussion of the + * event send options above for more detail. + * + * Parameters: + * + * inEvent: + * The event to send. + * + * inTarget: + * The target to send it to. + * + * inOptions: + * The options to modify the send behavior. Passing zero for this + * makes it behave just like SendEventToEventTarget. + * + * Result: + * An operating system result code. + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available in CarbonLib 1.x, is available on Mac OS X version 10.2 and later + * Mac OS X: in version 10.2 and later + */ +EXTERN_API_C( OSStatus ) +SendEventToEventTargetWithOptions( + EventRef inEvent, + EventTargetRef inTarget, + OptionBits inOptions); + + + + +#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 /* __CARBONEVENTSCORE__ */ + |