Max 5 API Reference
00001 // mouse.c -- mouse moving code 00002 00003 void MoveMouseTo(Point *pt); 00004 void MoveToCenter(Rect *b); 00005 00006 enum // old low memory globals for old systems 00007 { 00008 CrsrNew = 0x8CE, 00009 CrsrCouple = 0x8CF, 00010 MTemp = 0x828, 00011 RawMouse = 0x82C, 00012 jCrsrTask = 0x8EE, 00013 _CrsrDevDispatch = 0xAADB 00014 }; 00015 00016 #ifdef powerc 00017 UniversalProcPtr jCrsrTaskUPP = 0; 00018 #define crsrProcInfo kPascalStackBased 00019 00020 static pascal void CallCrsr() 00021 { 00022 if (jCrsrTaskUPP == NULL) 00023 jCrsrTaskUPP = NewRoutineDescriptor(*(ProcPtr *)jCrsrTask, crsrProcInfo, kM68kISA); 00024 CallUniversalProc(jCrsrTaskUPP, crsrProcInfo); 00025 } 00026 #else 00027 00028 static pascal void asm CallCrsr() // = {0x2078, 0x08EE, 0x4E90}; 00029 { 00030 MOVE.L D3,-(A7) 00031 MOVE.L jCrsrTask,A0 00032 JSR (A0) 00033 MOVE.L (A7)+,D3 00034 RTS 00035 } 00036 00037 #endif 00038 00039 void MoveMouseTo(Point *pt) 00040 { 00041 #if 0 00042 if (TrapAvailable((short)_CrsrDevDispatch)) { 00043 // If we get here we have the CDM 00044 CrsrDev *firstMouse; 00045 00046 firstMouse = nil; // start at head of cursor dev list 00047 CrsrDevNextDevice(&firstMouse); // get the next cursor device 00048 // Call CDM to move the mouse 00049 CrsrDevMoveTo(firstMouse, (long)pt->h, (long)pt->v); 00050 } else { 00051 #endif 00052 static short phase = 1; 00053 // No CDM so we use the low memory globals 00054 00055 *(Boolean *)CrsrCouple = FALSE; 00056 ((Point *)RawMouse)->h = pt->h + phase; 00057 ((Point *)RawMouse)->v = pt->v + phase; 00058 *(Point *)MTemp = *(Point *)RawMouse; 00059 phase = -phase; 00060 *(Ptr)CrsrNew = 0xFF; 00061 *(Ptr)CrsrCouple = 0xFF; 00062 CallCrsr(); // must call jCrsrTask to update system 00063 #if 0 00064 } 00065 #endif 00066 } 00067 00068 void MoveToCenter(Rect *b) 00069 { 00070 Point p; 00071 00072 p.h = (b->right - b->left)>>1; 00073 p.v = (b->bottom - b->top)>>1; 00074 MoveMouseTo(&p); 00075 } 00076 00077
Copyright © 2008, Cycling '74