/*
     File:       CursorDevices.h
 
     Contains:   Cursor Devices (mouse/trackball/etc) Interfaces.
 
     Version:    Technology: System 7.5
                 Release:    QuickTime 7.3
 
     Copyright:  (c) 2007 (c) 1993-1999 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 __CURSORDEVICES__
#define __CURSORDEVICES__

#ifndef __MACTYPES__
#include <MacTypes.h>
#endif

#ifndef __MIXEDMODE__
#include <MixedMode.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

/*
                        * * *  I M P O R T A N T  * * * 

            You will need CursorDevicesGlue.o to use CDM from PowerPC


    In order to use the Cursor Devices Manager (CDM) on PowerPC systems, you must 
    link with the file CursorDevicesGlue.o and InterfaceLib 1.1.3.  This is necessary
    because the original MixedMode transition code for CDM in InterfaceLib in ROM
    was wrong.  The code in CursorDevicesGlue.o will check to see if the ROM has
    been fixed and calls through to it if so.  If it detects that the ROM has not
    been fixed, it uses its own implementation of the CDM MixedMode transition 
    routines. 
    
*/

typedef short                           ButtonOpcode;
/* ButtonOpcodes */
enum {
  kButtonNoOp                   = 0,    /* No action for this button */
  kButtonSingleClick            = 1,    /* Normal mouse button */
  kButtonDoubleClick            = 2,    /* Click-release-click when pressed */
  kButtonClickLock              = 3     /* Click on press, release on next press */
};

enum {
  kButtonCustom                 = 6     /* Custom behavior, data = CursorDeviceCustomButtonUPP */
};

/* Device Classes */
enum {
  kDeviceClassAbsolute          = 0,    /* a flat-response device */
  kDeviceClassMouse             = 1,    /* mechanical or optical mouse */
  kDeviceClassTrackball         = 2,    /* trackball */
  kDeviceClassTrackPad          = 3
};

enum {
  kDeviceClass3D                = 6     /* a 3D pointing device */
};

/* Structures used in Cursor Device Manager calls */
struct CursorData {
  struct CursorData * nextCursorData;         /* next in global list */
  Ptr                 displayInfo;            /* unused (reserved for future) */
  Fixed               whereX;                 /* horizontal position */
  Fixed               whereY;                 /* vertical position */
  Point               where;                  /* the pixel position */
  Boolean             isAbs;                  /* has been stuffed with absolute coords */
  UInt8               buttonCount;            /* number of buttons currently pressed */
  long                screenRes;              /* pixels per inch on the current display */
  short               privateFields[22];      /* fields use internally by CDM */
};
typedef struct CursorData               CursorData;
typedef CursorData *                    CursorDataPtr;
struct CursorDevice {
  struct CursorDevice * nextCursorDevice;     /* pointer to next record in linked list */
  CursorData *        whichCursor;            /* pointer to data for target cursor */
  long                refCon;                 /* application-defined */
  long                unused;                 /* reserved for future */
  OSType              devID;                  /* device identifier (from ADB reg 1) */
  Fixed               resolution;             /* units/inch (orig. from ADB reg 1) */
  UInt8               devClass;               /* device class (from ADB reg 1) */
  UInt8               cntButtons;             /* number of buttons (from ADB reg 1) */
  UInt8               filler1;                /* reserved for future */
  UInt8               buttons;                /* state of all buttons */
  UInt8               buttonOp[8];            /* action performed per button */
  unsigned long       buttonTicks[8];         /* ticks when button last went up (for debounce) */
  long                buttonData[8];          /* data for the button operation */
  unsigned long       doubleClickTime;        /* device-specific double click speed */
  Fixed               acceleration;           /* current acceleration */
  short               privateFields[15];      /* fields used internally to CDM */
};
typedef struct CursorDevice             CursorDevice;
typedef CursorDevice *                  CursorDevicePtr;
/* for use with CursorDeviceButtonOp when opcode = kButtonCustom */
typedef CALLBACK_API_REGISTER68K( void , CursorDeviceCustomButtonProcPtr, (CursorDevicePtr ourDevice, short button) );
typedef REGISTER_UPP_TYPE(CursorDeviceCustomButtonProcPtr)      CursorDeviceCustomButtonUPP;
#if CALL_NOT_IN_CARBON
/*
 *  NewCursorDeviceCustomButtonUPP()
 *  
 *  Availability:
 *    Non-Carbon CFM:   available as macro/inline
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( CursorDeviceCustomButtonUPP )
NewCursorDeviceCustomButtonUPP(CursorDeviceCustomButtonProcPtr userRoutine);
#if !OPAQUE_UPP_TYPES
  enum { uppCursorDeviceCustomButtonProcInfo = 0x000ED802 };  /* register no_return_value Func(4_bytes:A2, 2_bytes:D3) */
  #ifdef __cplusplus
    inline DEFINE_API_C(CursorDeviceCustomButtonUPP) NewCursorDeviceCustomButtonUPP(CursorDeviceCustomButtonProcPtr userRoutine) { return (CursorDeviceCustomButtonUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppCursorDeviceCustomButtonProcInfo, GetCurrentArchitecture()); }
  #else
    #define NewCursorDeviceCustomButtonUPP(userRoutine) (CursorDeviceCustomButtonUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppCursorDeviceCustomButtonProcInfo, GetCurrentArchitecture())
  #endif
#endif

/*
 *  DisposeCursorDeviceCustomButtonUPP()
 *  
 *  Availability:
 *    Non-Carbon CFM:   available as macro/inline
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
DisposeCursorDeviceCustomButtonUPP(CursorDeviceCustomButtonUPP userUPP);
#if !OPAQUE_UPP_TYPES
  #ifdef __cplusplus
      inline DEFINE_API_C(void) DisposeCursorDeviceCustomButtonUPP(CursorDeviceCustomButtonUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); }
  #else
      #define DisposeCursorDeviceCustomButtonUPP(userUPP) DisposeRoutineDescriptor(userUPP)
  #endif
#endif

/*
 *  InvokeCursorDeviceCustomButtonUPP()
 *  
 *  Availability:
 *    Non-Carbon CFM:   available as macro/inline
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
InvokeCursorDeviceCustomButtonUPP(
  CursorDevicePtr              ourDevice,
  short                        button,
  CursorDeviceCustomButtonUPP  userUPP);
#if !OPAQUE_UPP_TYPES && (!TARGET_OS_MAC || !TARGET_CPU_68K || TARGET_RT_MAC_CFM)
  #ifdef __cplusplus
      inline DEFINE_API_C(void) InvokeCursorDeviceCustomButtonUPP(CursorDevicePtr ourDevice, short button, CursorDeviceCustomButtonUPP userUPP) { CALL_TWO_PARAMETER_UPP(userUPP, uppCursorDeviceCustomButtonProcInfo, ourDevice, button); }
  #else
    #define InvokeCursorDeviceCustomButtonUPP(ourDevice, button, userUPP) CALL_TWO_PARAMETER_UPP((userUPP), uppCursorDeviceCustomButtonProcInfo, (ourDevice), (button))
  #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 NewCursorDeviceCustomButtonProc(userRoutine)        NewCursorDeviceCustomButtonUPP(userRoutine)
    #define CallCursorDeviceCustomButtonProc(userRoutine, ourDevice, button) InvokeCursorDeviceCustomButtonUPP(ourDevice, button, userRoutine)
#endif /* CALL_NOT_IN_CARBON */

#if CALL_NOT_IN_CARBON
/*
 *  CursorDeviceMove()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceMove(
  CursorDevicePtr   ourDevice,
  long              deltaX,
  long              deltaY)                                   TWOWORDINLINE(0x7000, 0xAADB);


/*
 *  CursorDeviceMoveTo()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceMoveTo(
  CursorDevicePtr   ourDevice,
  long              absX,
  long              absY)                                     TWOWORDINLINE(0x7001, 0xAADB);


/*
 *  CursorDeviceFlush()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceFlush(CursorDevicePtr ourDevice)                  TWOWORDINLINE(0x7002, 0xAADB);


/*
 *  CursorDeviceButtons()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceButtons(
  CursorDevicePtr   ourDevice,
  short             buttons)                                  TWOWORDINLINE(0x7003, 0xAADB);


/*
 *  CursorDeviceButtonDown()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceButtonDown(CursorDevicePtr ourDevice)             TWOWORDINLINE(0x7004, 0xAADB);


/*
 *  CursorDeviceButtonUp()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceButtonUp(CursorDevicePtr ourDevice)               TWOWORDINLINE(0x7005, 0xAADB);


/*
 *  CursorDeviceButtonOp()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceButtonOp(
  CursorDevicePtr   ourDevice,
  short             buttonNumber,
  ButtonOpcode      opcode,
  long              data)                                     TWOWORDINLINE(0x7006, 0xAADB);


/*
 *  CursorDeviceSetButtons()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceSetButtons(
  CursorDevicePtr   ourDevice,
  short             numberOfButtons)                          TWOWORDINLINE(0x7007, 0xAADB);


/*
 *  CursorDeviceSetAcceleration()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceSetAcceleration(
  CursorDevicePtr   ourDevice,
  Fixed             acceleration)                             TWOWORDINLINE(0x7008, 0xAADB);


/*
 *  CursorDeviceDoubleTime()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceDoubleTime(
  CursorDevicePtr   ourDevice,
  long              durationTicks)                            TWOWORDINLINE(0x7009, 0xAADB);


/*
 *  CursorDeviceUnitsPerInch()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceUnitsPerInch(
  CursorDevicePtr   ourDevice,
  Fixed             resolution)                               TWOWORDINLINE(0x700A, 0xAADB);


/*
 *  CursorDeviceNextDevice()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceNextDevice(CursorDevicePtr * ourDevice)           TWOWORDINLINE(0x700B, 0xAADB);


/*
 *  CursorDeviceNewDevice()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceNewDevice(CursorDevicePtr * ourDevice)            TWOWORDINLINE(0x700C, 0xAADB);


/*
 *  CursorDeviceDisposeDevice()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CursorDeviceDisposeDevice(CursorDevicePtr ourDevice)          TWOWORDINLINE(0x700D, 0xAADB);



/*
                       * * *  W A R N I N G  * * * 
                
    The routines CrsrDevMoveTo and CrsrDevNextDevice are no longer needed.
    They were added as a work around until the glue code CursorDevicesGlue.o
    was created.  Please use the functions CursorDeviceMoveTo and
    CursorDeviceNextDevice instead.

*/
#endif  /* CALL_NOT_IN_CARBON */

#if OLDROUTINENAMES
#if CALL_NOT_IN_CARBON
/*
 *  CrsrDevMoveTo()
 *  
 *  Availability:
 *    Non-Carbon CFM:   in InterfaceLib 8.5 and later
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CrsrDevMoveTo(
  CursorDevicePtr   ourDevice,
  long              absX,
  long              absY)                                     TWOWORDINLINE(0x7001, 0xAADB);


/*
 *  CrsrDevNextDevice()
 *  
 *  Availability:
 *    Non-Carbon CFM:   in InterfaceLib 8.5 and later
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API( OSErr )
CrsrDevNextDevice(CursorDevicePtr * ourDevice)                TWOWORDINLINE(0x700B, 0xAADB);


#endif  /* CALL_NOT_IN_CARBON */

#endif  /* OLDROUTINENAMES */



#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 /* __CURSORDEVICES__ */