home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Mac OS X Throbber / Source / MultiMonitorController.cp < prev    next >
Encoding:
Text File  |  2000-06-24  |  4.0 KB  |  166 lines

  1. #include "MultiMonitorController.h"
  2.  
  3. #include <LowMem.h>
  4. #include <string.h>
  5.  
  6. MultiMonitorController *        MultiMonitorController::sMMController = NULL;
  7. TMTask                            MultiMonitorController::sTimerTask;
  8. TimerUPP                        MultiMonitorController::sTimerRoutineDescriptor = NewTimerProc(MultiMonitorController::CursorTimer);
  9.  
  10. // Do it 60fps
  11. const UInt32                    kScreenMillisecondUpdate = 1000 / 60;
  12.  
  13. // ---------------------------------------------------------------------------
  14. //    • MultiMonitorController
  15. // ---------------------------------------------------------------------------
  16.  
  17. MultiMonitorController::MultiMonitorController()
  18. {
  19.     sMMController = this;
  20.     mCapturedDevice = NULL;
  21.     
  22.     memset(mVirtualDevices, 0, sizeof(mVirtualDevices));
  23.  
  24.     mCapturedDevice = NEW CapturedGDevice();
  25.         
  26.     for (UInt32 monitor = 0; monitor < kMultiMonitorCount; monitor++)
  27.         mVirtualDevices[monitor] = NEW VirtualGDevice();
  28. }
  29.         
  30.  
  31. // ---------------------------------------------------------------------------
  32. //    • ~MultiMonitorController
  33. // ---------------------------------------------------------------------------
  34.  
  35. MultiMonitorController::~MultiMonitorController()
  36. {
  37.     sMMController = NULL;
  38.  
  39.     if (mCapturedDevice != NULL)
  40.     {    
  41.         mCapturedDevice->UncaptureDevice();
  42.         delete mCapturedDevice;
  43.         mCapturedDevice = NULL;
  44.     }
  45.  
  46.     for (UInt32 monitor = 0; monitor < kMultiMonitorCount; monitor++)
  47.     {
  48.         delete mVirtualDevices[monitor];
  49.         mVirtualDevices[monitor] = NULL;
  50.     }
  51. }
  52.  
  53.  
  54. // ---------------------------------------------------------------------------
  55. //    • Enable
  56. // ---------------------------------------------------------------------------
  57.  
  58. void
  59. MultiMonitorController::Enable()
  60. {
  61.     mCapturedDevice->CaptureDevice(
  62.             ::GetMainDevice(),
  63.             mVirtualDevices,
  64.             kMultiMonitorCount);
  65.  
  66.     SetEffectsType(kEffectsTypeNormal);
  67.  
  68.     memset(&sTimerTask, 0, sizeof(sTimerTask));    
  69.     sTimerTask.tmAddr = MultiMonitorController::sTimerRoutineDescriptor;
  70.  
  71.     ::InsTime((QElemPtr)&sTimerTask);
  72.     ::PrimeTime((QElemPtr)&sTimerTask, kScreenMillisecondUpdate);
  73. }
  74.  
  75.  
  76. // ---------------------------------------------------------------------------
  77. //    • Disable
  78. // ---------------------------------------------------------------------------
  79.  
  80. void
  81. MultiMonitorController::Disable()
  82. {
  83.     ::RmvTime((QElemPtr)&sTimerTask);
  84.  
  85.     mCapturedDevice->UncaptureDevice();
  86. }
  87.  
  88.  
  89. // ---------------------------------------------------------------------------
  90. //    • CursorTimer
  91. // ---------------------------------------------------------------------------
  92.  
  93. void
  94. MultiMonitorController::CursorTimer(
  95.     TMTaskPtr                 inTimerTaskPtr)
  96. {
  97.     // Call through to jCrsrTask to keep the mouse alive
  98.     if (!LMGetCrsrBusy())
  99.         CallUniversalProc(*(UniversalProcPtr *)0x08EE, 0);
  100.  
  101.     // Just update the captured screen
  102.     MultiMonitorController::GetInstance().mCapturedDevice->UpdateCapturedScreen();
  103.     
  104.     ::PrimeTime((QElemPtr)inTimerTaskPtr, kScreenMillisecondUpdate);
  105. }
  106.  
  107.  
  108. // ---------------------------------------------------------------------------
  109. //    • SetEffectsType
  110. // ---------------------------------------------------------------------------
  111.  
  112. void
  113. MultiMonitorController::SetEffectsType(
  114.     MultiMonitorEffectT        inEffect)
  115. {
  116.     if (mEffectType != inEffect)
  117.     {
  118.         GraphicBlendEffect *        blendEffect = NULL;
  119.         
  120.         switch (inEffect)
  121.         {
  122.             case kEffectsTypeNormal:
  123.                 blendEffect = NEW SimpleBlendEffect();
  124.                 break;
  125.             
  126.             case kEffectsTypeThrob:
  127.                 blendEffect = NEW ThrobEffect();
  128.                 break;
  129.             
  130.             case kEffectsTypeDontThrob:
  131.                 blendEffect = NEW DontThrobEffect();
  132.                 break;
  133.         }
  134.         
  135.         if (blendEffect != NULL)
  136.         {
  137.             if (blendEffect->Initialize())
  138.             {
  139.                 mCapturedDevice->SetGraphicBlendEffect(blendEffect);
  140.             }
  141.             else
  142.             {
  143.                 // fix me - report error to user
  144.                 delete blendEffect;
  145.             }
  146.         }
  147.         
  148.         mEffectType = inEffect;
  149.     }
  150. }
  151.  
  152.  
  153. // ---------------------------------------------------------------------------
  154. //    • SetEffectsValue
  155. // ---------------------------------------------------------------------------
  156.  
  157. void
  158. MultiMonitorController::SetEffectsValue(
  159.     UInt32                    inValueIndex,
  160.     double                    inValue)
  161. {
  162.     mCapturedDevice->SetGraphicBlendValue(inValueIndex, inValue);
  163. }
  164.  
  165.  
  166.