Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2174 lines
70 KiB

/*
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__ */