home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / Rotato / Source / InstallCursorHack.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-25  |  4.3 KB  |  172 lines  |  [TEXT/CWIE]

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. #include <DeskBus.h>
  7.  
  8. #include "InstallCursorHack.h"
  9.  
  10.  
  11. #define kPi        3.1415926535898
  12.  
  13.  
  14. // Control Flags....What do you want this hack to do?
  15. #define REVERSE_DIRECTION            0
  16. #define CHANGE_BUTTON_STATE        0
  17.  
  18. #define SWAP_AXIS                    0
  19. #define ROTATE_AXES                1
  20.  
  21. #define kMouseADBAddress            3
  22. #define TwosComplement(n)              ((~(n)) + 1)
  23.  
  24. #define kButtonStateMask                0x80
  25. #define kValueMask                    0x7F
  26.  
  27.  
  28. // Where is this defined??
  29. extern    ADBInitUPP JADBProc : 0x06B8;
  30.  
  31.  
  32. #define kServiceFragmentResourceType        'Smfr'
  33. #define kServiceFragmentResourceID        128
  34.  
  35. /*----------------------------------------------------------------------------
  36.     PrepareServiceFragment 
  37.     
  38. ----------------------------------------------------------------------------*/
  39. OSErr PrepareServiceFragment(TPrefsData *prefsData)
  40. {
  41.     Handle            resHandle = nil;
  42.     CFragConnectionID    connID = 0;
  43.     Str255            errorMsg;
  44.     Ptr                symbolAddr;
  45.     CFragSymbolClass    symbolClass;
  46.     OSErr            err;
  47.     
  48.     // res must be locked, in system heap. We assume this.
  49.     resHandle = GetResource(kServiceFragmentResourceType, kServiceFragmentResourceID);
  50.     if (! resHandle) return resNotFound;
  51.     DetachResource(resHandle);
  52.     
  53.     err = GetMemFragment(*resHandle, GetHandleSize(resHandle), "\pRotato", kReferenceCFrag, &connID, &symbolAddr, errorMsg);
  54.     if (err != noErr) return err;
  55.  
  56.     err = FindSymbol(connID, "\pMyADBInitProc", &symbolAddr, &symbolClass);
  57.     if (err != noErr) return err;
  58.     prefsData->adbInitProc = (ADBInitProcPtr)symbolAddr;
  59.  
  60.     err = FindSymbol(connID, "\pMyInstallServiceRoutines", &symbolAddr, &symbolClass);
  61.     if (err != noErr) return err;
  62.     prefsData->installRoutineProc = (InstallRoutineProcPtr)symbolAddr;
  63.     
  64.     err = FindSymbol(connID, "\pSetupData", &symbolAddr, &symbolClass);
  65.     if (err != noErr) return err;
  66.     prefsData->setupProc = (SetupProcPtr)symbolAddr;
  67.  
  68.     prefsData->serviceFragConnectionID = connID;
  69.     return noErr;
  70. }
  71.  
  72.  
  73. /*----------------------------------------------------------------------------
  74.     RemoveServiceRoutine 
  75.     
  76. ----------------------------------------------------------------------------*/
  77. static void RemoveServiceRoutine(TPrefsData *prefsData)
  78. {
  79.     short            adbcount, adbindex;
  80.     OSErr            err = paramErr;
  81.  
  82.     adbcount = CountADBs();
  83.  
  84.     for (adbindex = 1; adbindex <= adbcount; adbindex++)
  85.     {
  86.         ADBDataBlock    adb_data;
  87.         long            adbaddr = GetIndADB(&adb_data, adbindex);
  88.     
  89.         if ((adb_data.origADBAddr == kMouseADBAddress))
  90.         {
  91.             ADBSetInfoBlock    setADBInfo;
  92.  
  93.             BlockMoveData(&adb_data, &prefsData->mouseADBinfo, sizeof(ADBDataBlock));
  94.  
  95.             setADBInfo.siService = prefsData->oldMouseServiceRoutine;
  96.             setADBInfo.siDataAreaAddr = adb_data.dbDataAreaAddr;
  97.  
  98.             err = SetADBInfo(&setADBInfo, adbaddr);
  99.             break;
  100.         }
  101.     }
  102.  
  103. }
  104.  
  105.  
  106. /*----------------------------------------------------------------------------
  107.     InstallJADBProc 
  108.     
  109.     Install a JADBProc callback for before and after ADBReInit
  110. ----------------------------------------------------------------------------*/
  111. static void InstallJADBProc(TPrefsData *prefsData)
  112. {
  113.     ADBInitUPP ourADBInitProc;
  114.     
  115.     if (prefsData->adbInitProc)
  116.     {
  117.         prefsData->oldADBInitProc = JADBProc;
  118.         ourADBInitProc = NewADBInitProc(prefsData->adbInitProc);
  119.         JADBProc = ourADBInitProc;
  120.     }
  121.     else
  122.     {
  123.         //DebugStr("\pNo service proc");
  124.     }
  125. }
  126.  
  127.  
  128. /*----------------------------------------------------------------------------
  129.     RemoveJADBProc 
  130.     
  131. ----------------------------------------------------------------------------*/
  132. static void RemoveJADBProc(TPrefsData *prefsData)
  133. {
  134.     JADBProc = prefsData->oldADBInitProc;
  135. }
  136.  
  137. #pragma mark -
  138.  
  139. /*----------------------------------------------------------------------------
  140.     InstallCursorHack 
  141.     
  142.     Install the hack.
  143. ----------------------------------------------------------------------------*/
  144. Boolean InstallCursorHack(TPrefsData *prefsData)
  145. {
  146.     Boolean    installedOK;
  147.     
  148.     if (!prefsData->installRoutineProc)
  149.         return false;
  150.  
  151.     installedOK = (*prefsData->installRoutineProc)();
  152.     if (installedOK)
  153.     {
  154.         // Install a JADBProc so we don't go away after a ADBReInit
  155.         InstallJADBProc(prefsData);
  156.     }
  157.     
  158.     return installedOK;
  159. }
  160.  
  161. /*----------------------------------------------------------------------------
  162.     RemoveCursorHack 
  163.     
  164.     Remove the hack.
  165. ----------------------------------------------------------------------------*/
  166. void RemoveCursorHack(TPrefsData *prefsData)
  167. {
  168.     RemoveServiceRoutine(prefsData);
  169.     RemoveJADBProc(prefsData);
  170. }
  171.  
  172.