|
|
/*
File: CGRemoteOperation.h Contains: CoreGraphics remote operation Version: QuickTime 7.3 Copyright: (c) 2007 (c) 2000-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 CGREMOTEOPERATION_H_
#define CGREMOTEOPERATION_H_
#ifndef __CGBASE__
#include <CGBase.h>
#endif
#ifndef __CGGEOMETRY__
#include <CGGeometry.h>
#endif
#ifndef __CGERROR__
#include <CGError.h>
#endif
#ifndef __CFDATE__
#include <CFDate.h>
#endif
#ifndef __CFMACHPORT__
#include <CFMachPort.h>
#endif
#if PRAGMA_ONCE
#pragma once
#endif
#ifdef __cplusplus
extern "C" { #endif
#if PRAGMA_IMPORT
#pragma import on
#endif
#if PRAGMA_ENUM_ALWAYSINT
#if defined(__fourbyteints__) && !__fourbyteints__
#define __CGREMOTEOPERATION__RESTORE_TWOBYTEINTS
#pragma fourbyteints on
#endif
#pragma enumsalwaysint on
#elif PRAGMA_ENUM_OPTIONS
#pragma option enum=int
#elif PRAGMA_ENUM_PACK
#if __option(pack_enums)
#define __CGREMOTEOPERATION__RESTORE_PACKED_ENUMS
#pragma options(!pack_enums)
#endif
#endif
typedef CGError CGEventErr; enum { CGEventNoErr = kCGErrorSuccess };
/* Screen refresh or drawing notification */ /*
* Callback function pointer; * Declare your callback function in this form. When an area of the display is * modified or refreshed, your callback function will be invoked with a count * of the number of rectangles in the refreshed areas, and a list of the refreshed * rectangles. The rectangles are in global coordinates. * * Your function should not modify, deallocate or free memory pointed to by rectArray. * * The system continues to accumulate refreshed areas constantly. Whenever new * information is available, your callback function is invoked.The list of rects * passed to the callback function are cleared from the accumulated refreshed area * when the callback is made. * * This callback may be triggered by drawing operations, window movement, and * display reconfiguration. * * Bear in mind that a single rectangle may occupy multiple displays, * either by overlapping the displays, or by residing on coincident displays * when mirroring is active. Use the CGGetDisplaysWithRect() to determine * the displays a rectangle occupies. */ typedef u_int32_t CGRectCount; typedef CALLBACK_API_C( void , CGScreenRefreshCallback )(CGRectCount count, const CGRect *rectArray, void *userParameter); /*
* Register a callback function to be invoked when an area of the display * is refreshed, or modified. The function is invoked on the same thread * of execution that is processing events within your application. * userParameter is passed back with each invocation of the callback function. */ /*
* CGRegisterScreenRefreshCallback() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( void ) CGRegisterScreenRefreshCallback( CGScreenRefreshCallback callback, void * userParameter);
/*
* Remove a previously registered calback function. * Both the function and the userParameter must match the registered entry to be removed. */ /*
* CGUnregisterScreenRefreshCallback() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( void ) CGUnregisterScreenRefreshCallback( CGScreenRefreshCallback callback, void * userParameter);
/*
* In some applications it may be preferable to have a seperate thread wait for screen refresh data. * This function should be called on a thread seperate from the event processing thread. * If screen refresh callback functions are registered, this function should not be used. * The mechanisms are mutually exclusive. * * Deallocate screen refresh rects using CGReleaseScreenRefreshRects(). * * Returns an error code if parameters are invalid or an error occurs in retrieving * dirty screen rects from the server. */ /*
* CGWaitForScreenRefreshRects() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGWaitForScreenRefreshRects( CGRect ** pRectArray, CGRectCount * pCount);
/*
* Deallocate the list of rects recieved from CGWaitForScreenRefreshRects() */ /*
* CGReleaseScreenRefreshRects() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( void ) CGReleaseScreenRefreshRects(CGRect * rectArray);
/*
* Posting events: These functions post events into the system. Use for remote * operation and virtualization. * * Note that remote operation requires a valid connection to the server, which * must be owned by either the root/Administrator user or the logged in console * user. This means that your application must be running as root/Administrator * user or the logged in console user. */
/*
* Synthesize mouse events. * mouseCursorPosition should be the global coordinates the mouse is at for the event. * updateMouseCursor should be TRUE if the on-screen cursor * should be moved to mouseCursorPosition. * * Based on the values entered, the appropriate mouse-down, mouse-up, mouse-move, * or mouse-drag events are generated, by comparing the new state with the current state. * * The current implemementation of the event system supports a maximum of thirty-two buttons. * The buttonCount parameter should be followed by 'buttonCount' boolean_t values * indicating button state. The first value should reflect the state of the primary * button on the mouse. The second value, if any, should reflect the state of the secondary * mouse button (right), if any. A third value woule be the center button, and the remaining * buttons would be in USB device order. */ typedef u_int32_t CGButtonCount; /*
* CGPostMouseEvent() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGPostMouseEvent( CGPoint mouseCursorPosition, boolean_t updateMouseCursorPosition, CGButtonCount buttonCount, boolean_t mouseButtonDown, ...);
/*
* Synthesize scroll wheel events. * * The current implemementation of the event system supports a maximum of three wheels. * * The wheelCount parameter should be followed by 'wheelCount' 32 bit integer values * indicating wheel movements. The first value should reflect the state of the primary * wheel on the mouse. The second value, if any, should reflect the state of a secondary * mouse wheel, if any. * * Wheel movement is represented by small signed integer values, * typically in a range from -10 to +10. Large values may have unexpected results, * depending on the application that processes the event. */ typedef u_int32_t CGWheelCount; /*
* CGPostScrollWheelEvent() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGPostScrollWheelEvent( CGWheelCount wheelCount, int32_t wheel1, ...);
/*
* Synthesize keyboard events. Based on the values entered, * the appropriate key down, key up, and flags changed events are generated. * If keyChar is NUL (0), an apropriate value will be guessed at, based on the * default keymapping. * * All keystrokes needed to generate a character must be entered, including * SHIFT, CONTROL, OPTION, and COMMAND keys. For example, to produce a 'Z', * the SHIFT key must be down, the 'z' key must go down, and then the SHIFT * and 'z' key must be released: * CGPostKeyboardEvent( (CGCharCode)0, (CGKeyCode)56, true ); // shift down
* CGPostKeyboardEvent( (CGCharCode)'Z', (CGKeyCode)6, true ); // 'z' down
* CGPostKeyboardEvent( (CGCharCode)'Z', (CGKeyCode)6, false ); // 'z' up
* CGPostKeyboardEvent( (CGCharCode)0, (CGKeyCode)56, false ); // 'shift up
*/ typedef u_int16_t CGCharCode; typedef u_int16_t CGKeyCode; /*
* CGPostKeyboardEvent() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGPostKeyboardEvent( CGCharCode keyChar, CGKeyCode virtualKey, boolean_t keyDown);
/*
* Warp the mouse cursor to the desired position in global * coordinates without generating events */ /*
* CGWarpMouseCursorPosition() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGWarpMouseCursorPosition(CGPoint newCursorPosition);
/*
* Remote operation may want to inhibit local events (events from * the machine's keyboard and mouse). This may be done either as a * explicit request (tracked per app) or as a short term side effect of * posting an event. * * CGInhibitLocalEvents() is typically used for long term remote operation * of a system, as in automated system testing or telecommuting applications. * Local device state changes are discarded. * * Local event inhibition is turned off if the app that requested it terminates. */ /*
* CGInhibitLocalEvents() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGInhibitLocalEvents(boolean_t doInhibit);
/*
* Set the period of time in seconds that local hardware events (keyboard and mouse) * are supressed after posting an event. Defaults to 0.25 second. */ /*
* CGSetLocalEventsSuppressionInterval() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGSetLocalEventsSuppressionInterval(CFTimeInterval seconds);
/*
* By default, the flags that indicate modifier key state (Command, Alt, Shift, etc.) * from the system's keyboard and from other event sources are ORed together as an event is * posted into the system, and current key and mouse button state is considered in generating new events. * This function allows your application to enable or disable the * merging of event state. When combining is turned off, the event state propagated in the events * posted by your app reflect state built up only by your app. The state within your app's generated * event will not be combined with the system's current state, so the system-wide state reflecting key * and mouse button state will remain unchanged * * When called with doCombineState equal to FALSE, this function initializes local (per application) * state tracking information to a state of all keys, modifiers, and mouse buttons up. * * When called with doCombineState equal to TRUE, the current global state of keys, modifiers, * and mouse buttons are used in generating events. */ /*
* CGEnableEventStateCombining() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.1 and later */ EXTERN_API_C( CGEventErr ) CGEnableEventStateCombining(boolean_t doCombineState);
/*
* By default the system supresses local hardware events from the keyboard and mouse during * a short interval after a synthetic event is posted (see CGSetLocalEventsSuppressionInterval()) * and while a synthetic mouse drag (mouse movement with the left/only mouse button down). * Some classes of applications may want to enable events from some of the local hardware. * For example, an app may want to post only mouse events, and so may wish to permit local * keyboard hardware events to pass through. * * This interface lets an app specify a state (event supression interval, or mouse drag), and * a mask of event categories to be passed through. */ enum CGEventFilterMask { kCGEventFilterMaskPermitLocalMouseEvents = 0x00000001, /* Mouse, scroll wheel */ kCGEventFilterMaskPermitLocalKeyboardEvents = 0x00000002, /* Alphanumeric keys and Command, Option, Control, Shift, AlphaLock */ kCGEventFilterMaskPermitSystemDefinedEvents = 0x00000004, /* Power key, bezel buttons, sticky keys */ kCGEventFilterMaskPermitAllEvents = kCGEventFilterMaskPermitLocalMouseEvents | kCGEventFilterMaskPermitLocalKeyboardEvents | kCGEventFilterMaskPermitSystemDefinedEvents }; typedef enum CGEventFilterMask CGEventFilterMask;
enum CGEventSupressionState { kCGEventSupressionStateSupressionInterval = 0, kCGEventSupressionStateRemoteMouseDrag = 1, kCGNumberOfEventSupressionStates = 2 }; typedef enum CGEventSupressionState CGEventSupressionState;
/*
* CGSetLocalEventsFilterDuringSupressionState() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.1 and later */ EXTERN_API_C( CGEventErr ) CGSetLocalEventsFilterDuringSupressionState( CGEventFilterMask filter, CGEventSupressionState state);
/*
* Helper function to connect or disconnect the mouse and mouse cursor. * CGAssociateMouseAndMouseCursorPosition(false) has the same effect * as the following, without actually modifying the supression interval: * * CGSetLocalEventsSuppressionInterval(MAX_DOUBLE); * CGWarpMouseCursorPosition(currentPosition); * * While disconnected, mouse move and drag events will reflect the current position of * the mouse cursor position, which will not change with mouse movement. Use the * <CoreGraphics/CGDirectDisplay.h> function: * * void CGGetLastMouseDelta( CGMouseDelta * deltaX, CGMouseDelta * deltaY ); * * This will report mouse movement associated with the last mouse move or drag event. * * To update the display cursor position, use the function defined in this module: * * CGEventErr CGWarpMouseCursorPosition( CGPoint newCursorPosition ); */ /*
* CGAssociateMouseAndMouseCursorPosition() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.0 and later */ EXTERN_API_C( CGEventErr ) CGAssociateMouseAndMouseCursorPosition(boolean_t connected);
/*
* Some classes of applications need to detect when the window server process dies, or * is not running. The easiest way to do this is to use a CFMachPortRef. * * If the CoreGraphics window server is not running, this function returns NULL. * If the server is running, a CFMachPortRef is returned. * * A program can register a callback function to use a CFMachPortRef to determine * when the CoreGraphics window server exits: * * static void handleWindowServerDeath( CFMachPortRef port, void *info ) * { * printf( "Window Server port death detected!\n" ); * CFRelease( port ); * exit( 1 ); * } * * static void watchForServerDeath() * { * CFMachPortRef port; * * port = CGWindowServerCFMachPort(); * CFMachPortSetInvalidationCallBack( port, handleWindowServerDeath ); * } * * Note that when the window server exits, there may be a few seconds during which * no window server is running, until the operating system starts a new * window server/loginwindow pair of processes. This function will return NULL * until a new window server is running. * * Multiple calls to this function may return multiple CFMachPortRefs, each referring * to the same Mach port. Multiple callbacks registered on multiple CFMachPortRefs * obtained in this way may fire in a nondetermanistic manner. * * Your program will need to run a CFRunLoop for the port death * callback to function. A program which does not use a CFRunLoop may use * CFMachPortIsValid(CFMachPortRef port) periodically to check if the port is valid. */ /*
* CGWindowServerCFMachPort() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: in version 10.1 and later */ EXTERN_API_C( CFMachPortRef ) CGWindowServerCFMachPort(void);
#if PRAGMA_ENUM_ALWAYSINT
#pragma enumsalwaysint reset
#ifdef __CGREMOTEOPERATION__RESTORE_TWOBYTEINTS
#pragma fourbyteints off
#endif
#elif PRAGMA_ENUM_OPTIONS
#pragma option enum=reset
#elif defined(__CGREMOTEOPERATION__RESTORE_PACKED_ENUMS)
#pragma options(pack_enums)
#endif
#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif
#ifdef __cplusplus
} #endif
#endif /* CGREMOTEOPERATION_H_ */
|