macsite.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:65k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _MACINTOSH
  36. #ifndef _MAC_UNIX
  37. #error This is the Macintosh platform specific implementation.
  38. #endif
  39. #endif
  40. #include "hxcom.h"
  41. #include "hxtypes.h"
  42. #include "hxwintyp.h"
  43. #include "hxmap.h"
  44. #include "hxslist.h"
  45. #include "ihxpckts.h"
  46. #include "hxwin.h"
  47. #include "hxengin.h"
  48. #include "hxsite2.h"
  49. #include "chxxtype.h"
  50. #include "hxvctrl.h"
  51. #include "hxvsurf.h"
  52. #include "hxcodec.h"
  53. #include "surface.h"
  54. #include "vidosurf.h"
  55. #include "sitetext.h"
  56. #include "chxpckts.h"
  57. #include "hxevent.h"
  58. #include "bltpatch.h"
  59. #include "hxprefs.h"
  60. #include "hxevent.h"
  61. #include "hxcore.h"
  62. #include "platform/mac/macsite.h"
  63. #include "platform/mac/macsurf.h"
  64. #include "platform/mac/macroot.h"
  65. #ifdef _CARBON
  66. #ifndef _MAC_MACHO
  67. #include <ControlDefinitions.h>
  68. #endif
  69. #endif
  70. #include "platform/mac/hx_moreprocesses.h"
  71. //#include "../dcondev/dcon.h"
  72. #include "basesurf.h"
  73. #include "hxtick.h"
  74. #include "hxvimlog.h"
  75. #include "hxheap.h"
  76. #ifdef _DEBUG
  77. #undef HX_THIS_FILE
  78. static const char HX_THIS_FILE[] = __FILE__;
  79. #endif
  80. #define SCROLL_BAR_WIDTH 16
  81. CHXSimpleList CHXMacSite::zm_ListOfMacSites;
  82. BOOL CHXMacSite::zm_bFullScreenActive = FALSE;
  83. Ptr CHXMacSite::zm_pRememberFullScreenInformation = nil;
  84. extern "C" void MacSiteHandleAllEvents(HXxEvent* pEvent);
  85. /*
  86.  *
  87.  * SetOriginAndMaintainClipRgn is designed to replace
  88.  * SetOrigin(). It will internally call SetOrigin
  89.  * if necessary, and it will also adjust the clip
  90.  * region in order to maintain the parts of the
  91.  * screen that the clip region refers to. This
  92.  * is necessary because, sadly, SetOrigin() in
  93.  * the Mac Toolbox does NOT change the values in
  94.  * the clipRgn so it suddenly refers to a different
  95.  * part of the screen!
  96.  *
  97.  */
  98. void SetOriginAndMaintainClipRgn(short horizOffset, short vertOffset)
  99. {
  100.     // SetOriginMaintainClip, like SetOrigin(), assumes
  101.     // that the port is set correctly.
  102.     GrafPtr curPort;
  103.     ::GetPort( &curPort );
  104.     Rect portBounds;
  105.     
  106. #if defined(_CARBON) || defined(_MAC_UNIX)
  107.     ::GetPortBounds( curPort, &portBounds );
  108. #else
  109.     portBounds = curPort->portRect;
  110. #endif
  111.     if ( ( horizOffset == portBounds.left ) && ( vertOffset == portBounds.top ) )
  112.     {
  113. return; // everything is already (presumably) set up correctly.
  114.     }
  115.     
  116.     RgnHandle clipRgn = ::NewRgn();
  117.     
  118.     ::GetClip( clipRgn );
  119.     
  120.     Rect clipRgnBounds;
  121. #if defined(_CARBON) || defined(_MAC_UNIX)
  122.     ::GetRegionBounds(clipRgn, &clipRgnBounds);
  123. #else
  124.     clipRgnBounds = (**clipRgn).rgnBBox;
  125. #endif
  126.     
  127.     // if the clip region goes too close to -32768 or 32767, we run the
  128.     // risk of rolling over those values when we do an OffsetRgn(). Sadly,
  129.     // OffsetRgn does NOT internally check for rollovers, but blithely
  130.     // slams those rolled-over values into the region, resulting in a
  131.     // meaningless region. To avoid that we're trimming the region to
  132.     // noticeable values. (i.e. if we see regions with a width or height
  133.     // of 44444, we can use that as a magic cookie type signature.)
  134.     if (clipRgnBounds.left < -25252
  135. || clipRgnBounds.top < -25252
  136. || clipRgnBounds.right > 25252
  137. || clipRgnBounds.bottom > 25252
  138. )
  139.     {
  140. RgnHandle soonToBeSectedRgnCopy = ::NewRgn();
  141. ::SetRectRgn( soonToBeSectedRgnCopy, -22222, -22222, 22222, 22222 );
  142. ::SectRgn( clipRgn, soonToBeSectedRgnCopy, clipRgn );
  143. ::DisposeRgn( soonToBeSectedRgnCopy );
  144.     }
  145.     ::OffsetRgn( clipRgn, horizOffset - portBounds.left, vertOffset - portBounds.top );
  146.     
  147.     ::SetOrigin( horizOffset, vertOffset );
  148.     ::SetClip( clipRgn );
  149.     ::DisposeRgn( clipRgn );
  150. }
  151. /************************************************************************
  152.  *  Method:
  153.  *    CHXMacSite constructor
  154.  */
  155. CHXMacSite::CHXMacSite(IUnknown* pContext, IUnknown* pUnkOuter, INT32 lZOrder)
  156.   : CHXBaseSite(pContext, pUnkOuter, lZOrder)
  157.   , m_hHScrollBar(NULL)
  158.   , m_hVScrollBar(NULL)
  159.   , m_ScrollBarActionProc(NULL)
  160.   , m_nHorizPageSize(1)
  161.   , m_nVertPageSize(1)
  162.   , m_bCreatedOSWindow(FALSE)
  163.   , m_pHXxFullScreenWindow(NULL)
  164.   , m_fStretchMultiple(0.0)
  165.   , m_RememberMacPort(nil)
  166.   , m_bInternalResizeOnFullscreen(TRUE)
  167.   , m_pMacSiteRedrawCallback(NULL)
  168. #ifdef THREADS_SUPPORTED
  169. #ifdef USE_CARBON_TIMER
  170. #ifdef _MAC_MACHO
  171.   , m_RedrawCFTimerRef(NULL)
  172. #else
  173.   , m_RedrawCarbonTimerRef(NULL)
  174.   , m_RedrawCarbonTimerUPP(NULL)
  175. #endif
  176. #endif
  177.   , m_pIHXCoreMutex(NULL)
  178.   , m_pClientEngine(NULL)
  179. #endif
  180. {
  181.     m_RememberMacOrigin.h = 0;
  182.     m_RememberMacOrigin.v = 0;
  183.     
  184.     m_MostRecentConvertedMouseLoc.x = 0;
  185.     m_MostRecentConvertedMouseLoc.y = 0;
  186.     
  187.     m_RememberNonFullscreenSize.cx = 0;
  188.     m_RememberNonFullscreenSize.cy = 0;
  189.     m_RememberNonFullscreenPosition.x = 0;
  190.     m_RememberNonFullscreenPosition.y = 0;
  191.     
  192.     IHXPreferences* pPreferences = NULL;
  193.     IHXBuffer* pBuffer = NULL;
  194.     
  195.     if (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences, (void**)&pPreferences))
  196.     {
  197. if (pPreferences->ReadPref("MacFullscreenInternalResize", pBuffer) == HXR_OK)
  198. {
  199.     m_bInternalResizeOnFullscreen = ::atoi((char*)pBuffer->GetBuffer()) == 1;
  200.     HX_RELEASE(pBuffer);
  201. }
  202. HX_RELEASE(pPreferences);
  203.     }
  204.     
  205.     zm_ListOfMacSites.AddTail(this);
  206.     
  207.     m_pMacSiteRedrawCallback = new MacSiteRedrawCallback(this);
  208.     m_pMacSiteRedrawCallback->AddRef();
  209. #ifdef THREADS_SUPPORTED
  210.     // xxxzach - TEMP - installing the event loop timer when running in the embedded player
  211.     // results in a crash when loading a 2nd page. 
  212.     //    appears to call the timer proc after ~CHXMacSite has been called
  213.     // so don't install timer if running as embedded player
  214.     const OSType kPlayerSignature = 'PNst';
  215. #ifdef USE_CARBON_TIMER
  216. #ifdef _MAC_MACHO
  217.     memset(&m_RedrawCFTimerContext, 0, sizeof(CFRunLoopTimerContext));
  218.     
  219.     m_RedrawCFTimerContext.info = (void*)this; // info is what's passed into the timer function
  220.     
  221.     m_RedrawCFTimerRef = ::CFRunLoopTimerCreate(
  222.                 kCFAllocatorDefault,
  223.                 ::CFAbsoluteTimeGetCurrent() + 31536000.0, // a year from now
  224.                 31536000.0, // every year
  225.                 0, //CFOptionFlags
  226.                 0, //CFIndexOrder
  227.                 CHXMacSite::RedrawCFTimer,
  228.                 &m_RedrawCFTimerContext);
  229.     
  230.     ::CFRunLoopAddTimer(
  231.                 ::CFRunLoopGetCurrent(),
  232.                 m_RedrawCFTimerRef,
  233.                 kCFRunLoopCommonModes
  234.                 );
  235. #else
  236.     m_RedrawCarbonTimerUPP = ::NewEventLoopTimerUPP(
  237. (EventLoopTimerProcPtr)CHXMacSite::RedrawCarbonTimer);
  238.     OSStatus osStatus = ::InstallEventLoopTimer(
  239. GetMainEventLoop(), kEventDurationForever, kEventDurationForever,
  240. m_RedrawCarbonTimerUPP, this, &m_RedrawCarbonTimerRef);
  241.     HX_ASSERT(osStatus == noErr);
  242. #endif
  243. #endif
  244.     
  245.     m_pContext->QueryInterface(IID_IHXCoreMutex, (void**)&m_pIHXCoreMutex);
  246.     HX_ASSERT(m_pIHXCoreMutex);
  247.     
  248.     m_pContext->QueryInterface(IID_IHXClientEngine, (void**)&m_pClientEngine);
  249. #endif
  250. }
  251. /************************************************************************
  252.  *  Method:
  253.  *    CHXMacSite destructor
  254.  */
  255. CHXMacSite::~CHXMacSite()
  256. {
  257. #ifdef THREADS_SUPPORTED
  258.     HX_RELEASE(m_pIHXCoreMutex);
  259.     HX_RELEASE(m_pClientEngine);
  260.     
  261. #ifdef USE_CARBON_TIMER
  262. #ifdef _MAC_MACHO
  263.     ::CFRunLoopRemoveTimer(
  264.                 ::CFRunLoopGetCurrent(),
  265.                 m_RedrawCFTimerRef,
  266.                 kCFRunLoopCommonModes
  267.                 );
  268.     
  269.     m_RedrawCFTimerRef = NULL;
  270.     memset(&m_RedrawCFTimerContext, 0, sizeof(CFRunLoopTimerContext));
  271. #else
  272.     ::RemoveEventLoopTimer(m_RedrawCarbonTimerRef);
  273.     m_RedrawCarbonTimerRef = NULL;
  274.     ::DisposeEventLoopTimerUPP(m_RedrawCarbonTimerUPP);
  275.     m_RedrawCarbonTimerUPP = NULL;
  276. #endif
  277. #endif
  278. #endif
  279.     _DestroySliders();
  280.     
  281.     if (m_pMacSiteRedrawCallback &&
  282. m_pMacSiteRedrawCallback->m_ulMacSiteRedrawCallbackPendingID &&
  283. m_pScheduler)
  284.     {
  285. m_pScheduler->Remove(m_pMacSiteRedrawCallback->m_ulMacSiteRedrawCallbackPendingID);
  286. m_pMacSiteRedrawCallback->m_ulMacSiteRedrawCallbackPendingID = 0;
  287.     }
  288.     HX_RELEASE(m_pMacSiteRedrawCallback);
  289.     
  290.     LISTPOSITION pos = zm_ListOfMacSites.Find(this);
  291.     zm_ListOfMacSites.RemoveAt(pos);
  292. }
  293. /************************************************************************
  294.  *  Method:
  295.  *    CHXMacSite::GetWindow
  296.  */
  297. STDMETHODIMP_(HXxWindow*) CHXMacSite::GetWindow() 
  298. {
  299.     if (zm_bFullScreenActive)
  300.     {
  301. if (m_pHXxFullScreenWindow) return m_pHXxFullScreenWindow;
  302. if (m_pParentSite) return m_pParentSite->GetWindow();
  303. HX_ASSERT(!"shouldn't get here");
  304.     }
  305.     return CHXBaseSite::GetWindow();
  306.     if (zm_bFullScreenActive && m_pHXxFullScreenWindow) return m_pHXxFullScreenWindow;
  307.     
  308. return m_pWindow;
  309.     return CHXBaseSite::GetWindow();
  310. }
  311. /************************************************************************
  312.  *  Method:
  313.  *    CHXMacSite::_NeedWindowedSite
  314.  */
  315. void
  316. CHXMacSite::_NeedWindowedSite()
  317. {
  318. }
  319. /************************************************************************
  320.  *  Method:
  321.  *    CHXMacSite::_AttachWindow
  322.  */
  323. void
  324. CHXMacSite::_AttachWindow()
  325. {
  326.     m_pHXxFullScreenWindow = new HXxWindow;
  327.     if (m_pTopLevelSite == this)
  328.     {
  329. Rect r = {0,0,0,0};
  330. m_pHXxFullScreenWindow->window = ::NewCWindow(nil, &r, "p", false, plainDBox, nil, false, 0);
  331. // if we created the mac window we need to update the HXxWindow parameters
  332. // so we're not clipped out later
  333. if (m_bCreatedOSWindow)
  334. {
  335.     HX_ASSERT(m_pWindow);
  336.     
  337.     WindowPtr w = (WindowPtr)m_pWindow->window;
  338.     
  339.     HX_ASSERT(w);
  340.     
  341.     m_pWindow->x = 0;
  342.     m_pWindow->y = 0;
  343.     
  344.     Rect bounds;
  345.     ::GetPortBounds(::GetWindowPort(w), &bounds);
  346.     
  347.     m_pWindow->width = bounds.right-bounds.left;
  348.     m_pWindow->height = bounds.bottom-bounds.top;
  349.     
  350.     m_pWindow->clipRect.left = 0;
  351.     m_pWindow->clipRect.top = 0;
  352.     m_pWindow->clipRect.right = m_pWindow->width;
  353.     m_pWindow->clipRect.bottom = m_pWindow->height;
  354. }
  355.     }
  356.     else
  357.     {
  358. CHXMacSite* pMacParentSite = (CHXMacSite*)m_pParentSite; // XXXbobclark Ewwww! (Can we use RTTI ya think?)
  359. m_pHXxFullScreenWindow->window = pMacParentSite->m_pHXxFullScreenWindow->window;
  360.     }
  361. }
  362. /************************************************************************
  363.  *  Method:
  364.  *    CHXMacSite::_DetachWindow
  365.  */
  366. void
  367. CHXMacSite::_DetachWindow()
  368. {
  369. }
  370. /************************************************************************
  371.  *  Method:
  372.  *    CHXMacSite::_Create
  373.  */
  374. void*
  375. CHXMacSite::_Create(void* ParentWindow, UINT32 style)
  376. {
  377.     if (!ParentWindow)
  378.     {
  379. Rect r = {200,400,40,40};
  380. WindowPtr w = ::NewCWindow(nil, &r, "p", true, documentProc, (WindowPtr)-1L, false, 0);
  381. if (w)
  382. {
  383.     m_bCreatedOSWindow = TRUE;
  384.     return w;
  385. }
  386.     }
  387.     
  388.     m_bCreatedOSWindow = FALSE;
  389.     return ParentWindow;
  390. }
  391. /************************************************************************
  392.  *  Method:
  393.  *    CHXMacSite::_Destroy
  394.  */
  395. void
  396. CHXMacSite::_Destroy(HXxWindow* pWindow)
  397. {
  398.     if (CMacSurface::zm_pOverlaySurface == (CMacSurface*)m_pVideoSurface)
  399.     {
  400. CMacSurface::CleanUpOverlay();
  401. CMacSurface::zm_pOverlaySurface = nil;
  402.     }
  403.     
  404.     if (pWindow && m_bCreatedOSWindow)
  405.     {
  406. WindowPtr w = (WindowPtr)pWindow->window;
  407. if (w)
  408. {
  409.     ::DisposeWindow(w);
  410. }
  411. m_bCreatedOSWindow = FALSE;
  412.     }
  413. }
  414. /************************************************************************
  415.  *  Method:
  416.  *    CHXMacSite::_SetSize
  417.  */
  418. void
  419. CHXMacSite::_SetSize(HXxSize size)
  420. {
  421.     if (m_bCreatedOSWindow && m_pWindow && m_pWindow->window)
  422.     {
  423. WindowPtr w = (WindowPtr)m_pWindow->window;
  424. ::SizeWindow(w, size.cx, size.cy, true);
  425. m_pWindow->x = 0;
  426. m_pWindow->y = 0;
  427. Rect bounds;
  428. ::GetPortBounds(::GetWindowPort(w), &bounds);
  429. m_pWindow->width = bounds.right-bounds.left;
  430. m_pWindow->height = bounds.bottom-bounds.top;
  431. m_pWindow->clipRect.left = 0;
  432. m_pWindow->clipRect.top = 0;
  433. m_pWindow->clipRect.right = m_pWindow->width;
  434. m_pWindow->clipRect.bottom = m_pWindow->height;
  435.     }
  436.     // delete the scroll bars so it recreates them in the right spot
  437.     _DestroySliders();
  438. }
  439. /************************************************************************
  440.  *  Method:
  441.  *    CHXMacSite::_SetPosition
  442.  */
  443. void
  444. CHXMacSite::_SetPosition(HXxPoint position)
  445. {
  446.     if (m_bCreatedOSWindow && m_pWindow && m_pWindow->window)
  447.     {
  448. WindowPtr w = (WindowPtr)m_pWindow->window;
  449. ::MoveWindow(w, position.x, position.y, false);
  450.     }
  451.     else
  452.     {
  453. m_screenOffset = position;
  454.     }
  455.     // delete the scroll bars so it recreates them in the right spot.
  456.     _DestroySliders();
  457. }
  458. /************************************************************************
  459.  *  Method:
  460.  *    CHXMacSite::_DamageRect
  461.  */
  462. void
  463. CHXMacSite::_DamageRect(HXxRect rect)
  464. {
  465. }
  466. /************************************************************************
  467.  *  Method:
  468.  *    CHXMacSite::_DamageRect
  469.  */
  470. void
  471. CHXMacSite::_DamageRegion(HXxRegion rgn)
  472. {
  473. }
  474. /************************************************************************
  475.  *  Method:
  476.  *    CHXMacSite::_ShouldEnterForceRedraw
  477.  */
  478. BOOL
  479. CHXMacSite::_ShouldEnterForceRedraw()
  480. {
  481.     if (InterlockedIncrement(&m_lBltEntryCount) > 1)
  482.     {
  483.         InterlockedDecrement(&m_lBltEntryCount);
  484.         return FALSE; 
  485.     }
  486. #ifdef THREADS_SUPPORTED
  487. #ifdef USE_CARBON_TIMER
  488.     if (!IsMacInCooperativeThread())
  489.     {
  490. // we need to schedule a Carbon Timer callback
  491. // to access ourselves at system time.
  492. // XXXMEH 06/17/2002 - we moved this InterlockDecrement()
  493. // to BEFORE the SetEventLoopTimerNextFireTime(). The reason
  494. // is that sometimes, you actually get an IMMEDIATE callback
  495. // on the main thread before you have decremented m_lBltEntryCount.
  496. // When this happened while the decrement was AFTER SetEventLoopTimerNextFireTime(),
  497. // then the ForceRedraw() would bail out early at the
  498. // if(InterlockedIncrement(&m_lBltEntryCount) > 1) at the
  499. // top of this method and the blt would never happen.
  500.         InterlockedDecrement(&m_lBltEntryCount);
  501. #ifdef _MAC_MACHO
  502. HX_ASSERT(m_RedrawCFTimerRef);
  503.         ::CFRunLoopTimerSetNextFireDate(
  504.                         m_RedrawCFTimerRef,
  505.                         ::CFAbsoluteTimeGetCurrent() // immediately!
  506.                         );
  507. #else
  508. HX_ASSERT(m_RedrawCarbonTimerRef);
  509. ::SetEventLoopTimerNextFireTime(m_RedrawCarbonTimerRef, kEventDurationNoWait);
  510. #endif
  511.         // XXXMEH 06/17/2002 - We USED to decrement m_lBltEntryCount here - 
  512.         // now we have moved it before SetEventLoopTimerNextFireTime()
  513. return FALSE;
  514.     }
  515. #endif
  516. #endif
  517.     HXxWindow* topWindow = GetWindow();
  518.     if (_AtSystemTime() && topWindow && topWindow->window)
  519.     {
  520. ::GetPort(&m_RememberMacPort);
  521. WindowPtr w = (WindowPtr)topWindow->window;
  522. #if defined(_CARBON) || defined(_MAC_UNIX)
  523. ::SetPort( GetWindowPort( w ) );
  524. #else
  525. ::SetPort(w);
  526. #endif
  527. // remember old origin
  528. #if defined(_CARBON) || defined(_MAC_UNIX)
  529. Rect portRect;
  530. GetPortBounds( GetWindowPort( w ), &portRect );
  531. m_RememberMacOrigin.h = portRect.left;
  532. m_RememberMacOrigin.v = portRect.top;
  533. #else
  534. m_RememberMacOrigin.h = w->portRect.left;
  535. m_RememberMacOrigin.v = w->portRect.top;
  536. #endif
  537. // get new origin
  538. HXxPoint offset;
  539. offset.x = 0;
  540. offset.y = 0;
  541. GetMacContentAreaOffset(offset);
  542. // see if the clip region overlaps where we know we're supposed to be.
  543. Rect siteRect = { 0, 0, topWindow->height, topWindow->width };
  544. OffsetRect( &siteRect, topWindow->x, topWindow->y );
  545. BOOL bSiteClippedOutSoRedrawNecessary = FALSE;
  546. RgnHandle clippedSiteRgn = ::NewRgn();
  547. RgnHandle siteRgn = ::NewRgn();
  548. ::RectRgn(siteRgn, &siteRect);
  549. #if defined(_CARBON) || defined(_MAC_UNIX)
  550. RgnHandle clipRgn = ::NewRgn();
  551. ::GetPortClipRegion( GetWindowPort( w ), clipRgn );
  552. ::SectRgn( siteRgn, clipRgn, clippedSiteRgn );
  553. ::DisposeRgn( clipRgn );
  554. #else
  555. ::SectRgn(siteRgn, w->clipRgn, clippedSiteRgn);
  556. #endif
  557. if (::EmptyRgn(clippedSiteRgn))
  558. {
  559.     bSiteClippedOutSoRedrawNecessary = TRUE;
  560. }
  561. DisposeRgn(siteRgn);
  562. DisposeRgn(clippedSiteRgn);
  563. if (bSiteClippedOutSoRedrawNecessary)
  564. {
  565.     // D'oh, doesn't intersect! So let's just draw next time around.
  566.     // we need to schedule a redraw if one ain't there already.
  567.     if (!m_pMacSiteRedrawCallback->m_ulMacSiteRedrawCallbackPendingID
  568. && m_pScheduler)
  569.     {
  570. m_pMacSiteRedrawCallback->m_ulMacSiteRedrawCallbackPendingID =
  571. m_pScheduler->RelativeEnter(m_pMacSiteRedrawCallback, 1);
  572.     }
  573.     goto returnfalse;
  574. }
  575. // set new origin
  576. // xxxbobclark
  577. // Sheesh. OK, so the clip region is relative to the current
  578. // origin, but it is NOT magically shifted when you call
  579. // SetOrigin. So whenever you call SetOrigin, you're also
  580. // "secretly" changing which actual pixels of the window are
  581. // within the clip region.
  582. // That's why this utility function was written
  583. SetOriginAndMaintainClipRgn(-offset.x, -offset.y);
  584.     }
  585.     
  586.     return TRUE;
  587. returnfalse:
  588.     // xxxbobclark I needed to move this code around because CWPro 7's compiler
  589.     // was running out of local variable space. Odd.
  590.     
  591.     ::SetPort(m_RememberMacPort);
  592.     // decrement count since it won't execute ForceRedraw.
  593.     InterlockedDecrement(&m_lBltEntryCount);
  594.     return FALSE;
  595. }
  596. /************************************************************************
  597.  *  Method:
  598.  *    CHXMacSite::_ExitForceRedraw
  599.  */
  600. void
  601. CHXMacSite::_ExitForceRedraw()
  602. {
  603.     HXxWindow* topWindow = GetParentWindow();
  604.     if (_AtSystemTime() && topWindow && topWindow->window)
  605.     {
  606. // restore old origin
  607. SetOriginAndMaintainClipRgn(m_RememberMacOrigin.h, m_RememberMacOrigin.v);
  608. ::SetPort(m_RememberMacPort);
  609. m_RememberMacPort = nil;
  610.     }
  611.     
  612.     InterlockedDecrement(&m_lBltEntryCount);
  613. }
  614. /************************************************************************
  615.  *  Method:
  616.  *    CHXMacSite::_SendOSUpdateMessage
  617.  */
  618. void
  619. CHXMacSite::_SendOSUpdateMessage()
  620. {
  621. #if 0
  622.     ASSERT(GetOSWindow());
  623.     
  624.     if (GetOSWindow())
  625.     {
  626. GrafPtr savePort;
  627. ::GetPort(&savePort);
  628. WindowPtr w = (WindowPtr)GetOSWindow();
  629. ::SetPort(w);
  630. // XXXbobclark
  631. // I still haven't fully grokked how to avoid loops: _HandleOSEvent on an
  632. // update event can call _ForceRedraw(), which in turn calls _SendOSUpdateMessage,
  633. // where InvalRect() can generate an update event.... And we need this to function
  634. // properly, so things like paused movies will redraw if they're obscured then shown.
  635. // ::InvalRect(&w->portRect);
  636. ::SetPort(savePort);
  637.     }
  638. #endif
  639. }
  640. /************************************************************************
  641.  *  Method:
  642.  *    CHXMacSite::_ShowSite
  643.  */
  644. void
  645. CHXMacSite::_ShowSite(BOOL bShow)
  646. {
  647.     if (m_pWindow && m_pWindow->window)
  648.     {
  649. // XXXbobclark I think that the cross-platform stuff should take care of this...
  650.     }
  651. }
  652. /************************************************************************
  653.  *  Method:
  654.  *    CHXMacSite::_AtSystemTime
  655.  */
  656. BOOL
  657. CHXMacSite::_AtSystemTime()
  658. {
  659.     return IsMacInCooperativeThread();
  660. }
  661. /************************************************************************
  662.  *  Method:
  663.  *    CHXMacSite::_EventOccurred
  664.  */
  665. HX_RESULT
  666. CHXMacSite::_EventOccurred(HXxEvent* pEvent)
  667. {
  668.     return HXR_OK;
  669. }
  670. /************************************************************************
  671.  *  Method:
  672.  *    CHXMacSite::_GetDeviceCaps
  673.  */
  674. void
  675. CHXMacSite::_GetDeviceCaps(void* hdc, UINT16& uBytesPerPixel, UINT16& uHorizRes,
  676. UINT16& uVertRes)
  677. {
  678.     static UINT16 sBytesPerPixel = 4;
  679.     static UINT16 sHorizRes = 640;
  680.     static UINT16 sVertRes = 480;
  681.     static BOOL sInited = FALSE;
  682.     
  683.     if (!sInited && _AtSystemTime())
  684.     {
  685. GDHandle mainGD = ::GetMainDevice();
  686. sHorizRes = (**mainGD).gdRect.right - (**mainGD).gdRect.left;
  687. sVertRes = (**mainGD).gdRect.bottom - (**mainGD).gdRect.top;
  688. PixMapHandle pmh = (**mainGD).gdPMap;
  689. if (pmh)
  690. {
  691.     sBytesPerPixel = (**pmh).pixelSize;
  692. }
  693.     }
  694.     
  695.     uBytesPerPixel = sBytesPerPixel;
  696.     uHorizRes = sHorizRes;
  697.     uVertRes = sVertRes;
  698. }
  699. /************************************************************************
  700.  *  Method:
  701.  *    CHXMacSite::_GetWindowRect
  702.  */
  703. void
  704. CHXMacSite::_GetWindowRect(HXxRect* destRect)
  705. {
  706. }
  707. /************************************************************************
  708.  *  Method:
  709.  *    CHXMacSite::_DestroySliders
  710.  */
  711. void
  712. CHXMacSite::_DestroySliders()
  713. {
  714.     if (m_hHScrollBar)
  715.     {
  716. ::DisposeControl(m_hHScrollBar);
  717. m_hHScrollBar = NULL;
  718.     }
  719.     if (m_hVScrollBar)
  720.     {
  721. ::DisposeControl(m_hVScrollBar);
  722. m_hVScrollBar = NULL;
  723.     }
  724. }
  725. /************************************************************************
  726.  *  Method:
  727.  *    CHXMacSite::_HandleOSEvents
  728.  */
  729. BOOL
  730. CHXMacSite::_HandleOSEvents(HXxEvent* pEvent)
  731. {
  732.     BOOL handled = FALSE;
  733.     {
  734. EventRecord* macEvent = (EventRecord*) pEvent->param1;
  735. // if we switch out while in full-screen, unfortunately we need
  736. // to turn off full-screen.
  737. if (zm_bFullScreenActive && macEvent->what == nullEvent)
  738. {
  739.     ProcessSerialNumber currentPSN;
  740.     ProcessSerialNumber frontPSN;
  741.     
  742.     ::GetCurrentProcess(&currentPSN);
  743.     ::GetFrontProcess(&frontPSN);
  744.     
  745.     Boolean bCurrentIsFront = TRUE;
  746.     ::SameProcess(&currentPSN, &frontPSN, &bCurrentIsFront);
  747.     
  748.     if (!bCurrentIsFront)
  749.     {
  750. ExitFullScreen();
  751. HXxWindow* pWindow = GetWindow();
  752. if (pWindow && pWindow->window)
  753. {
  754.     GrafPtr savePort;
  755.     ::GetPort(&savePort);
  756.     WindowPtr w = (WindowPtr)pWindow->window;
  757.     ::SetPort(::GetWindowPort(w));
  758.     Rect windowBounds;
  759.     ::GetPortBounds(::GetWindowPort(w), &windowBounds);
  760.     ::InvalWindowRect(w, &windowBounds);
  761.     ::SetPort(savePort);
  762. }
  763. handled = TRUE;
  764.     }
  765. }
  766. if (macEvent->what == keyDown)
  767. {
  768.     char theKey = macEvent->message & 0x000000ff;
  769.     
  770.     if (CHXMacSite::zm_bFullScreenActive && theKey == 0x1b)
  771.     {
  772. ExitFullScreen();
  773.     }
  774.     else
  775.     {
  776. if (m_pUser)
  777.     m_pUser->HandleEvent(pEvent);
  778. handled = pEvent->handled;
  779.     }
  780. }
  781. if (macEvent->what == updateEvt || macEvent->what == activateEvt)
  782. {
  783.     HX_ASSERT(_AtSystemTime());
  784.     
  785.     WindowPtr w = (WindowPtr)macEvent->message;
  786.     if (w)
  787.     {
  788. if (zm_bFullScreenActive && m_pHXxFullScreenWindow && m_pHXxFullScreenWindow->window
  789. && m_pHXxFullScreenWindow->window == w)
  790. {
  791.     GrafPtr savePort;
  792.     ::GetPort(&savePort);
  793. #if defined(_CARBON) || defined(_MAC_UNIX)
  794.     ::SetPort( GetWindowPort( w ) );
  795. #else
  796.     ::SetPort(w);
  797. #endif
  798.     RGBColor holdRGB;
  799.     RGBColor theRGB = {0x0000, 0x0000, 0x0000};
  800.     ::GetBackColor(&holdRGB);
  801.     ::RGBBackColor(&theRGB);
  802. #if defined(_CARBON) || defined(_MAC_UNIX)
  803.     Rect portRect;
  804.     GetPortBounds( GetWindowPort( w ), &portRect );
  805.     ::EraseRect( &portRect );
  806. #else
  807.     ::EraseRect(&w->portRect);
  808. #endif
  809.     ::RGBBackColor(&holdRGB);
  810.     ::SetPort(savePort);
  811. }
  812. m_pTopLevelSite->RecomputeClip();
  813. // see if overlay is active... if so, then we might just need
  814. // to fill with a color key!
  815. if (CMacSurface::zm_pOverlaySurface)
  816. {
  817.     CMacSurface* pMacSurface = (CMacSurface*)m_pVideoSurface;
  818.     if (pMacSurface == CMacSurface::zm_pOverlaySurface)
  819.     {
  820. // aha! THIS site's surface is in fact the overlay surface.
  821. m_pVideoSurface->FillColorKey();
  822.     }
  823. }
  824. HXxRect siteRectToDamage;
  825. siteRectToDamage.left = 0;
  826. siteRectToDamage.top = 0;
  827. siteRectToDamage.right = m_size.cx;
  828. siteRectToDamage.bottom = m_size.cy;
  829. DamageRect(siteRectToDamage);
  830.          InternalForceRedraw();
  831.     }
  832.     HXxWindow* pWindow = GetWindow();
  833.     if (pWindow && pWindow->window == (WindowPtr)macEvent->message)
  834.     {
  835. // XXXbobclark commented out 'cause it's already done for "honest"
  836. // update events. I don't wanna do this for fake update events.
  837. // m_pTopLevelSite->RecomputeClip();
  838. // ForceRedraw();
  839. if (pEvent->param2 && _AtSystemTime())
  840. {
  841.     // for update events, param2 may contain a RgnHandle into
  842.     // which we add the area that we are handling updates in,
  843.     // so the TLC knows it doesn't have to draw there.
  844.     
  845.     if (m_bBltHasBeenCalled)
  846.     {
  847. if (!m_bThisOrAChildHasBlitted)
  848. {
  849.     CHXMacSite* pMacSite = this;
  850.     while (pMacSite)
  851.     {
  852. pMacSite->m_bThisOrAChildHasBlitted = TRUE;
  853. pMacSite = (CHXMacSite*)pMacSite->m_pParentSite;
  854.     }
  855. }
  856.     }
  857.     
  858.     if (m_bThisOrAChildHasBlitted)
  859.     {
  860. RgnHandle handledRgn = ::NewRgn();
  861. RgnHandle passedInRgn = (RgnHandle)pEvent->param2;
  862. HXxPoint ptSiteOrigin;
  863. GetMacContentAreaOffset(ptSiteOrigin);
  864. Rect myRect = { ptSiteOrigin.y, ptSiteOrigin.x,
  865. ptSiteOrigin.y + m_size.cy,
  866. ptSiteOrigin.x + m_size.cx };
  867. ::RectRgn(handledRgn, &myRect);
  868. ::UnionRgn(passedInRgn, handledRgn, passedInRgn);
  869. ::DisposeRgn(handledRgn);
  870.     }
  871. }
  872.     }
  873.     
  874.     if (m_hHScrollBar || m_hVScrollBar)
  875.     {
  876. Point oldOrigin;
  877. Rect portRect;
  878. GetPortBounds(GetWindowPort(w), &portRect);
  879. oldOrigin.h = portRect.left;
  880. oldOrigin.v = portRect.top;
  881. SetOriginAndMaintainClipRgn(0,0);
  882. if (m_hHScrollBar)
  883. {
  884.     ::Draw1Control(m_hHScrollBar);
  885.     handled = TRUE;
  886. }
  887. if (m_hVScrollBar)
  888. {
  889.     ::Draw1Control(m_hVScrollBar);
  890.     handled = TRUE;
  891. }
  892. SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  893.     }
  894. }
  895. if (macEvent->what == mouseDown || macEvent->what == mouseUp)
  896. {
  897.     WindowPtr w = nil;
  898.     ControlHandle theControl = NULL;
  899.     
  900.     HXxWindow* pWindow = GetWindow();
  901.     
  902.     if (pWindow && pWindow->window)
  903.     {
  904. w = (WindowPtr)pWindow->window;
  905.     }
  906.     
  907.     HX_ASSERT(w);
  908.     
  909.     if (!w) return HXR_FAIL;
  910.     GrafPtr savePort;
  911.     ::GetPort(&savePort);
  912.     ::SetPort(::GetWindowPort(w));
  913.     
  914.     Point oldOrigin;
  915.     Rect portRect;
  916.     ::GetPortBounds(::GetWindowPort(w), &portRect);
  917.     oldOrigin.h = portRect.left;
  918.     oldOrigin.v = portRect.top;
  919.     
  920.     SetOriginAndMaintainClipRgn(0,0); // origin must be at 0,0 for scroll bar maintenence
  921.     
  922.     Point localPt = macEvent->where;
  923.     ::GlobalToLocal(&localPt);
  924.     
  925.     short thePart = 0;
  926.     theControl = ::FindControlUnderMouse(localPt, w, &thePart);
  927.     
  928.     if (theControl && ((theControl == m_hHScrollBar) || (theControl == m_hVScrollBar)))
  929.     {
  930. short trackedPart = ::TrackControl(theControl, localPt, m_ScrollBarActionProc);
  931. long pageSize;
  932. if (theControl == m_hHScrollBar)
  933. {
  934.     pageSize = m_nHorizPageSize;
  935. }
  936. else
  937. {
  938.     pageSize = m_nVertPageSize;
  939. }
  940. switch (trackedPart)
  941. {
  942.     case kControlUpButtonPart:
  943. ::SetControl32BitValue(theControl, ::GetControl32BitValue(theControl)-1);
  944. break;
  945.     case kControlDownButtonPart:
  946. ::SetControl32BitValue(theControl, ::GetControl32BitValue(theControl)+1);
  947. break;
  948.     case kControlPageUpPart:
  949. ::SetControl32BitValue(theControl, ::GetControl32BitValue(theControl)-pageSize);
  950. break;
  951.     case kControlPageDownPart:
  952. ::SetControl32BitValue(theControl, ::GetControl32BitValue(theControl)+pageSize);
  953. break;
  954. }
  955. if (theControl == m_hHScrollBar)
  956. {
  957.     m_XSliderPos = ::GetControl32BitValue(theControl);
  958. }
  959. if (theControl == m_hVScrollBar)
  960. {
  961.     m_YSliderPos = ::GetControl32BitValue(theControl);
  962. }
  963. HXxPoint ptSiteOrigin;
  964. GetMacContentAreaOffset(ptSiteOrigin);
  965. Rect invalRect;
  966. invalRect.left = ptSiteOrigin.x;
  967. invalRect.top = ptSiteOrigin.y;
  968. if (m_hHScrollBar)
  969. {
  970.     Rect controlRect;
  971.     ::GetControlBounds(m_hHScrollBar, &controlRect);
  972.     invalRect.right = controlRect.right;
  973.     invalRect.bottom = controlRect.top;
  974. }
  975. if (m_hVScrollBar)
  976. {
  977.     Rect controlRect;
  978.     ::GetControlBounds(m_hVScrollBar, &controlRect);
  979.     invalRect.right = controlRect.left;
  980.     invalRect.bottom = controlRect.bottom;
  981. }
  982. ::InvalWindowRect(w, &invalRect);
  983. handled = TRUE;
  984.     }
  985.     
  986.     if (!handled)
  987.     {
  988. HXxWindow* pWindow = GetWindow();
  989. if (pWindow && pWindow->window)
  990. {
  991.     // see if it's in this site
  992.     SetOriginAndMaintainClipRgn(-pWindow->x, -pWindow->y);
  993.     Point p = macEvent->where;
  994.     ::GlobalToLocal(&p);
  995.     HXxPoint loc;
  996.     loc.x = p.h;
  997.     loc.y = p.v;
  998.     
  999.     HX_ASSERT(m_RegionForMouse);
  1000.     if (IsPointInClippingRegion(&loc))
  1001.     {
  1002. HXxPoint offset = {0,0};
  1003. GetMacContentAreaOffset(offset);
  1004. // UDrawingUtils::SetOriginAndMaintainClipRgn(-offset.x, -offset.y);
  1005.                         if (m_pUser)
  1006.                         {
  1007. //                            m_pUser->HandleEvent(pEvent);
  1008. //                            handled = pEvent->handled;
  1009.                         }
  1010.     }
  1011.     
  1012.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1013.     
  1014.     ::SetPort(savePort);
  1015. }
  1016.     }
  1017. }
  1018.     }
  1019.     return handled;
  1020. }
  1021. /************************************************************************
  1022.  *  Method:
  1023.  *    CHXMacSite::_HandleAllOSEvents
  1024.  */
  1025. /* static */
  1026. void CHXMacSite::_HandleAllOSEvents(HXxEvent* pEvent)
  1027. {
  1028.     EventRecord* macEvent = (EventRecord*) pEvent->param1;
  1029.     
  1030.     CHXSimpleList::Iterator ndx = zm_ListOfMacSites.Begin();
  1031.     for ( ; ndx != zm_ListOfMacSites.End(); ++ndx)
  1032.     {
  1033. CHXMacSite* pMacSite = (CHXMacSite*)(*ndx);
  1034. HX_ASSERT( pMacSite );
  1035. pMacSite->_HandleOSEvents(pEvent);
  1036.     }
  1037.     
  1038. /*
  1039.     if (gRecentUpdateEvent)
  1040.     {
  1041. EventRecord* macEvent = (EventRecord*)pEvent->param1;
  1042. if (macEvent->what == updateEvt)
  1043. {
  1044.     // XXXbobclark
  1045.     // clearly we're handling the recent update event and since we've
  1046.     // just done it let's clear that puppy out.
  1047.     gRecentUpdateEvent = false;
  1048. }
  1049.     }
  1050. */
  1051. }
  1052. /************************************************************************
  1053.  *  Method:
  1054.  *    CHXMacSite::_ConvertRegionToMacRegion
  1055.  * utility function to convert between the RealNetworks
  1056.  * regions that the site classes use and Mac-specific
  1057.  * RgnHandle's.
  1058.  */
  1059. /* static */
  1060. RgnHandle
  1061. CHXMacSite::_ConvertRegionToMacRegion( HXREGION* pRegion )
  1062. {
  1063.     HX_ASSERT(IsMacInCooperativeThread());
  1064.     if ( !IsMacInCooperativeThread() ) return nil; // Hoo-boy would this ever suck
  1065.     RgnHandle rgn = ::NewRgn();
  1066.     
  1067.     if ( rgn )
  1068.     {
  1069. ::OpenRgn();
  1070. for ( long i = 0; i < pRegion->numRects; i++ )
  1071. {
  1072.     Rect r;
  1073.     r.left = pRegion->rects[i].x1;
  1074.     r.top = pRegion->rects[i].y1;
  1075.     r.right = pRegion->rects[i].x2;
  1076.     r.bottom = pRegion->rects[i].y2;
  1077.     
  1078.     ::FrameRect( &r );
  1079. }
  1080. ::CloseRgn( rgn );
  1081.     }
  1082.     return rgn;
  1083. }
  1084. /************************************************************************
  1085.  *  Method:
  1086.  *    CHXMacSite::_ConvertToHXEvent
  1087.  */
  1088. BOOL
  1089. CHXMacSite::_ConvertToHXEvent( HXxEvent* pEvent )
  1090. {
  1091.     if (pEvent->event == mouseDown || pEvent->event == mouseUp)
  1092.     {
  1093. HXxWindow* pWindow = GetWindow();
  1094. if (pWindow && pWindow->window)
  1095. {
  1096.     GrafPtr savePort;
  1097.     GetPort(&savePort);
  1098.     WindowPtr w = (WindowPtr)pWindow->window;
  1099.     
  1100.     Point oldOrigin;
  1101. #if defined(_CARBON) || defined(_MAC_UNIX)
  1102.     SetPort( GetWindowPort(w) );
  1103.     Rect portRect;
  1104.     GetPortBounds( GetWindowPort(w), &portRect );
  1105.     oldOrigin.h = portRect.left;
  1106.     oldOrigin.v = portRect.top;
  1107. #else
  1108.     SetPort( w );
  1109.     oldOrigin.h = w->portRect.left;
  1110.     oldOrigin.v = w->portRect.top;
  1111. #endif
  1112.     SetOriginAndMaintainClipRgn(-pWindow->x, -pWindow->y);
  1113.     
  1114.     static HXxPoint realPt = {0,0};
  1115.     
  1116.     EventRecord* macEvent = (EventRecord*)pEvent->param1;
  1117.     Point localPoint = macEvent->where;
  1118.     GlobalToLocal( &localPoint );
  1119.     realPt.x = localPoint.h;
  1120.     realPt.y = localPoint.v;
  1121.     UINT32 flags = 0;
  1122.     if (macEvent->modifiers & shiftKey) flags |= HX_SHIFT_KEY;
  1123.     if (macEvent->modifiers & controlKey) flags |= HX_CTRL_KEY;
  1124.     if (macEvent->modifiers & cmdKey) flags |= HX_ALT_COMMAND_KEY;
  1125.     
  1126.     if (flags & HX_CTRL_KEY)
  1127.     {
  1128. pEvent->event = pEvent->event == mouseDown ?
  1129. HX_CONTEXT_BUTTON_DOWN : HX_CONTEXT_BUTTON_UP;
  1130.     }
  1131.     else
  1132.     {
  1133. pEvent->event = pEvent->event == mouseDown ?
  1134. HX_PRIMARY_BUTTON_DOWN : HX_PRIMARY_BUTTON_UP;
  1135.     }
  1136.     pEvent->param1 = (void*)&realPt;
  1137.     pEvent->param2 = (void*)flags;
  1138.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1139.     SetPort(savePort);
  1140.     return FALSE;
  1141. }
  1142.     }
  1143.     if (pEvent->event == nullEvent && _AtSystemTime())
  1144.     {
  1145. EventRecord* macEvent = (EventRecord*)pEvent->param1;
  1146. HXxWindow* pWindow = GetWindow();
  1147. if (pWindow && pWindow->window)
  1148. {
  1149.     WindowPtr w = (WindowPtr)pWindow->window;
  1150.     if (w == ::FrontWindow())
  1151.     {
  1152. GrafPtr savePort;
  1153. ::GetPort(&savePort);
  1154. #if defined(_CARBON) || defined(_MAC_UNIX)
  1155. ::SetPort( GetWindowPort(w) );
  1156. #else
  1157. ::SetPort(w);
  1158. #endif
  1159. Point oldOrigin;
  1160. #if defined(_CARBON) || defined(_MAC_UNIX)
  1161. Rect portRect;
  1162. GetPortBounds( GetWindowPort( w ), &portRect );
  1163. oldOrigin.h = portRect.left;
  1164. oldOrigin.v = portRect.top;
  1165. #else
  1166. oldOrigin.h = w->portRect.left;
  1167. oldOrigin.v = w->portRect.top;
  1168. #endif
  1169. // see if it's in this site
  1170. SetOriginAndMaintainClipRgn(-pWindow->x, -pWindow->y);
  1171. Point p = macEvent->where;
  1172. ::GlobalToLocal(&p);
  1173. HXxPoint loc;
  1174. loc.x = p.h;
  1175. loc.y = p.v;
  1176. HX_ASSERT(m_RegionForMouse);
  1177. if (m_RegionForMouse && IsPointInClippingRegion(&loc))
  1178. {
  1179.     static Point sLastGlobalLocation = {0,0};
  1180.     if (macEvent->where.h != sLastGlobalLocation.h || macEvent->where.v != sLastGlobalLocation.v)
  1181.     {
  1182. sLastGlobalLocation = macEvent->where;
  1183. Point localPt = sLastGlobalLocation;
  1184. ::GlobalToLocal(&localPt);
  1185. m_MostRecentConvertedMouseLoc.x = localPt.h;
  1186. m_MostRecentConvertedMouseLoc.y = localPt.v;
  1187. UINT32 flags = 0;
  1188. if (macEvent->modifiers & shiftKey) flags += HX_SHIFT_KEY;
  1189. if (macEvent->modifiers & controlKey) flags += HX_CTRL_KEY;
  1190. if (macEvent->modifiers & cmdKey) flags += HX_ALT_COMMAND_KEY;
  1191. // don't change the event until we're done looking at it!
  1192. // (the pre-converted version that is.)
  1193. pEvent->event = HX_MOUSE_MOVE;
  1194. pEvent->param1 = (void*)&m_MostRecentConvertedMouseLoc;
  1195. pEvent->param2 = (void*)flags;
  1196. // This will eventually be handled by the base site.
  1197. // It's possible that the base site will need to translate
  1198. // this into HX_MOUSE_ENTER and HX_MOUSE_LEAVE first,
  1199. // though, which is why we don't simply handle it here.
  1200. SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1201.     }
  1202. }
  1203. else
  1204. {
  1205.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1206.     if (m_pTopLevelSite->m_pMouseInSite == this)
  1207.     {
  1208. m_pTopLevelSite->GenerateMouseLeaveMessage();
  1209.     }
  1210. }
  1211. ::SetPort(savePort);
  1212.     }
  1213. }
  1214.     }
  1215.     return FALSE; //pEvent->handled;
  1216. }
  1217. /************************************************************************
  1218.  *  Method:
  1219.  *    CHXMacSite::_GenerateOSEvent
  1220.  */
  1221. void
  1222. CHXMacSite::_GenerateOSEvent(HXxEvent* pEvent, HXxEvent* pEvent2)
  1223. {
  1224. }
  1225. /************************************************************************
  1226.  *  Method:
  1227.  *    CHXMacSite::_GenerateSetCursorEvent
  1228.  */
  1229. void
  1230. CHXMacSite::_GenerateSetCursorEvent()
  1231. {
  1232.     Point oldOrigin;
  1233.     HXxWindow* pWindow = GetWindow();
  1234.     if (!pWindow || !pWindow->window)
  1235.     {
  1236. return;
  1237.     }
  1238.     WindowPtr w = (WindowPtr)pWindow->window;
  1239.     GrafPtr savePort;
  1240.     ::GetPort(&savePort);
  1241. #if defined(_CARBON) || defined(_MAC_UNIX)
  1242.     ::SetPort(::GetWindowPort(w));
  1243. #else
  1244.     ::SetPort(w);
  1245. #endif
  1246. #if defined(_CARBON) || defined(_MAC_UNIX)
  1247.     Rect portRect;
  1248.     GetPortBounds( GetWindowPort( w ), &portRect );
  1249.     oldOrigin.h = portRect.left;
  1250.     oldOrigin.v = portRect.top;
  1251. #else
  1252.     oldOrigin.h = w->portRect.left;
  1253.     oldOrigin.v = w->portRect.top;
  1254. #endif
  1255.     SetOriginAndMaintainClipRgn(-pWindow->x, -pWindow->y);
  1256.     HXxPoint offset = {0,0};
  1257.     GetMacContentAreaOffset(offset);
  1258.     SetOriginAndMaintainClipRgn(-offset.x, -offset.y);
  1259.     
  1260.     Point location;
  1261.     GetMouse(&location);
  1262.     HXxEvent theEvent;
  1263.     memset(&theEvent, 0, sizeof(theEvent));
  1264.     theEvent.event = HX_MOUSE_MOVE;
  1265.     
  1266.     HXxPoint mouseLoc;
  1267.     mouseLoc.x = location.h;
  1268.     mouseLoc.y = location.v;
  1269.     theEvent.param1 = (void*)&mouseLoc;
  1270.     
  1271.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1272.     if (m_pUser)
  1273. m_pUser->HandleEvent(&theEvent);
  1274.     ::SetPort(savePort);
  1275. }
  1276. void
  1277. CHXMacSite::_ScaleFullScreen(HXxWindow* pWindow)
  1278. {
  1279.     if (m_pParentSite != nil)
  1280.     {
  1281. CHXMacSite* pParentSite = (CHXMacSite*)m_pParentSite;
  1282. m_fStretchMultiple = pParentSite->m_fStretchMultiple;
  1283. m_pHXxFullScreenWindow->window = pParentSite->m_pHXxFullScreenWindow->window;
  1284. if (0 /*pParentSite->m_pStatusSite == this*/)
  1285. {
  1286. }
  1287. else
  1288. {
  1289.     if (m_pWindow) pWindow = m_pWindow;
  1290.     
  1291.     m_pHXxFullScreenWindow->x = (long)((double)pWindow->x * m_fStretchMultiple);
  1292.     m_pHXxFullScreenWindow->y = (long)((double)pWindow->y * m_fStretchMultiple);
  1293.     m_pHXxFullScreenWindow->width = (long)((double)pWindow->width * m_fStretchMultiple);
  1294.     m_pHXxFullScreenWindow->height = (long)((double)pWindow->height * m_fStretchMultiple);
  1295.     
  1296.     m_pHXxFullScreenWindow->clipRect.left = (long)((double)pWindow->clipRect.left * m_fStretchMultiple);
  1297.     m_pHXxFullScreenWindow->clipRect.top = (long)((double)pWindow->clipRect.top * m_fStretchMultiple);
  1298.     m_pHXxFullScreenWindow->clipRect.right = (long)((double)pWindow->clipRect.right * m_fStretchMultiple);
  1299.     m_pHXxFullScreenWindow->clipRect.bottom = (long)((double)pWindow->clipRect.bottom * m_fStretchMultiple);
  1300. }
  1301.     }
  1302.     CHXMapPtrToPtr::Iterator i = m_ChildrenMap.Begin();
  1303.     for ( ; i != m_ChildrenMap.End(); ++i)
  1304.     {
  1305. CHXBaseSite* pSite = (CHXBaseSite*) *i;
  1306. CHXMacSite* pMacSite = (CHXMacSite*)pSite;
  1307. pMacSite->_ScaleFullScreen(pWindow);
  1308.     }
  1309. }
  1310. /************************************************************************
  1311.  *  Method:
  1312.  *    CHXMacSite::_EnterFullScreen
  1313.  */
  1314. HX_RESULT
  1315. CHXMacSite::_EnterFullScreen()
  1316. {
  1317.     if (zm_bFullScreenActive)
  1318.     {
  1319. return HXR_UNEXPECTED;
  1320.     }
  1321.     
  1322.     zm_bFullScreenActive = TRUE;
  1323.     
  1324.     if (m_pTopLevelSite == this)
  1325.     {
  1326. short desiredWidth, desiredHeight;
  1327. GDHandle aGD = ::GetMainDevice();
  1328. // Check the UseOverlay preference here, since _OverlayAvailable() doesn't update its
  1329. // value on Preference changes.
  1330. BOOL bDoScreenResSwitch = FALSE;
  1331. IHXPreferences* pPreferences = NULL;
  1332. if (m_pContext && (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences, (void**)&pPreferences)))
  1333. {
  1334.     IHXBuffer* pBuffer = NULL;
  1335.     if (pPreferences->ReadPref("UseOverlay", pBuffer) == HXR_OK)
  1336.     {
  1337. bDoScreenResSwitch = ::atoi((char*)pBuffer->GetBuffer()) != 1;
  1338.     }
  1339.     HX_RELEASE(pBuffer);
  1340. }
  1341. HX_RELEASE(pPreferences);
  1342. if (!bDoScreenResSwitch)
  1343. {
  1344.     // if an overlay exists then let's assume we don't have
  1345.     // to switch resolutions.
  1346.     desiredWidth = (**aGD).gdRect.right - (**aGD).gdRect.left;
  1347.     desiredHeight = (**aGD).gdRect.bottom - (**aGD).gdRect.top;
  1348. }
  1349. else
  1350. {
  1351.     desiredWidth = m_size.cx;
  1352.     desiredHeight = m_size.cy;
  1353. }
  1354. ::BeginFullScreen(
  1355. &zm_pRememberFullScreenInformation,
  1356. ::GetMainDevice(),
  1357. &desiredWidth,
  1358. &desiredHeight,
  1359. nil,
  1360. nil,
  1361. fullScreenAllowEvents );
  1362. _DestroySliders();
  1363. CMacRootSurface::VisRgnChangedCallback();
  1364. GDHandle mainGD = ::GetMainDevice();
  1365. Rect bounds = (**mainGD).gdRect;
  1366. if (m_pHXxFullScreenWindow && m_pHXxFullScreenWindow->window)
  1367. {
  1368.     WindowPtr w = (WindowPtr)m_pHXxFullScreenWindow->window;
  1369.     ::ShowWindow(w);
  1370.     ::SizeWindow(w, bounds.right-bounds.left, bounds.bottom-bounds.top, true);
  1371.     ::MoveWindow(w, bounds.left, bounds.top, true);
  1372.     
  1373.     HXxPoint newPosition;
  1374.     newPosition.x = bounds.left;
  1375.     newPosition.y = bounds.top;
  1376.     
  1377.     HXxSize newSize;
  1378.     newSize.cx = bounds.right-bounds.left;
  1379.     newSize.cy = bounds.bottom-bounds.top;
  1380.     
  1381.     double theXZoomFactor = (double)newSize.cx / (double)m_pWindow->width;
  1382.     double theYZoomFactor = (double)newSize.cy / (double)m_pWindow->height;
  1383.     
  1384.     if (theXZoomFactor < theYZoomFactor)
  1385.     {
  1386. theYZoomFactor = theXZoomFactor;
  1387. newSize.cy = (long)((double)m_pWindow->height * theYZoomFactor);
  1388. newPosition.y += ((bounds.bottom-bounds.top)-newSize.cy)/2;
  1389.     }
  1390.     else
  1391.     {
  1392. theXZoomFactor = theYZoomFactor;
  1393. newSize.cx = (long)((double)m_pWindow->width * theXZoomFactor);
  1394. newPosition.x += ((bounds.right-bounds.left)-newSize.cx)/2;
  1395.     }
  1396.     m_fStretchMultiple = theXZoomFactor;
  1397.     
  1398.     m_pHXxFullScreenWindow->x = newPosition.x;
  1399.     m_pHXxFullScreenWindow->y = newPosition.y;
  1400.     
  1401.     m_pHXxFullScreenWindow->width = newSize.cx;
  1402.     m_pHXxFullScreenWindow->height = newSize.cy;
  1403.     
  1404.     m_pHXxFullScreenWindow->clipRect.left = newPosition.x;
  1405.     m_pHXxFullScreenWindow->clipRect.top = newPosition.y;
  1406.     m_pHXxFullScreenWindow->clipRect.right = newPosition.x + newSize.cx;
  1407.     m_pHXxFullScreenWindow->clipRect.bottom = newPosition.y + newSize.cy;
  1408.     
  1409. #if defined(_CARBON) || defined(_MAC_UNIX)
  1410.     ::SetPort( GetWindowPort( (WindowPtr)m_pHXxFullScreenWindow->window ) );
  1411. #else
  1412.     ::SetPort((WindowPtr)m_pHXxFullScreenWindow->window);
  1413. #endif
  1414.     RGBColor holdRGB;
  1415.     RGBColor theRGB = {0x0000, 0x0000, 0x0000};
  1416.     ::GetBackColor(&holdRGB);
  1417.     ::RGBBackColor(&theRGB);
  1418.     ::EraseRect(&bounds);
  1419.     ::RGBBackColor(&holdRGB);
  1420.     
  1421.     if (m_bInternalResizeOnFullscreen)
  1422.     {
  1423. GetSize(m_RememberNonFullscreenSize);
  1424. GetPosition(m_RememberNonFullscreenPosition);
  1425. m_pTopLevelSite->m_bDisableForceRedraw = TRUE;
  1426. SetSize(newSize);
  1427. m_pTopLevelSite->m_bDisableForceRedraw = FALSE;
  1428. SetPosition(newPosition);
  1429.     }
  1430.     else
  1431.     {
  1432. _ScaleFullScreen(m_pWindow);
  1433.     }
  1434.     SetOriginAndMaintainClipRgn(-m_pHXxFullScreenWindow->x, -m_pHXxFullScreenWindow->y);
  1435. }
  1436. m_bInFullScreen = TRUE;
  1437.     }
  1438.     
  1439.     return HXR_OK;
  1440. }
  1441. /************************************************************************
  1442.  *  Method:
  1443.  *    CHXMacSite::_ExitFullScreen
  1444.  */
  1445. HX_RESULT
  1446. CHXMacSite::_ExitFullScreen()
  1447. {
  1448.     CMacRootSurface::VisRgnChangedCallback();
  1449.     if (m_pTopLevelSite == this)
  1450.     {
  1451. m_bInFullScreen = FALSE;
  1452. _DestroySliders();
  1453. if (m_pHXxFullScreenWindow && m_pHXxFullScreenWindow->window)
  1454. {
  1455.     WindowPtr w = (WindowPtr)m_pHXxFullScreenWindow->window;
  1456.     GrafPtr savePort;
  1457.     ::GetPort(&savePort);
  1458.     ::SetPort(::GetWindowPort(w));
  1459.     // we need to restore the origin for the next time we may
  1460.     // enter fullscreen mode. xxxbobclark
  1461.     SetOriginAndMaintainClipRgn(0,0);
  1462.     ::HideWindow(w);
  1463.     ::SetPort(savePort);
  1464. }
  1465. if (!m_bInternalResizeOnFullscreen)
  1466. {
  1467.     HXxSize fullscreenSize;
  1468.     fullscreenSize.cx = m_pHXxFullScreenWindow->width;
  1469.     fullscreenSize.cy = m_pHXxFullScreenWindow->height;
  1470.     HXxSize nonfullscreenSize;
  1471.     nonfullscreenSize.cx = (long)((double)fullscreenSize.cx / m_fStretchMultiple);
  1472.     nonfullscreenSize.cy = (long)((double)fullscreenSize.cy / m_fStretchMultiple);
  1473.     if (m_pWatcher)
  1474.     {
  1475. HRESULT hres = m_pWatcher->ChangingSize(fullscreenSize, nonfullscreenSize);
  1476.     }
  1477. }
  1478. ::EndFullScreen(zm_pRememberFullScreenInformation, nil);
  1479.     }
  1480.     
  1481.     if (CMacSurface::zm_pOverlaySurface == (CMacSurface*)m_pVideoSurface)
  1482.     {
  1483. CMacSurface::CleanUpOverlay();
  1484. CMacSurface::zm_pOverlaySurface = nil;
  1485.     }
  1486.     zm_bFullScreenActive = FALSE;
  1487.     if (m_pTopLevelSite == this)
  1488.     {
  1489. if (m_bInternalResizeOnFullscreen)
  1490. {
  1491.     m_pTopLevelSite->m_bDisableForceRedraw = TRUE;
  1492.     SetSize(m_RememberNonFullscreenSize);
  1493.     m_pTopLevelSite->m_bDisableForceRedraw = FALSE;
  1494.     SetPosition(m_RememberNonFullscreenPosition);
  1495. }
  1496.     }
  1497.     
  1498.     return HXR_OK;
  1499. }
  1500. /************************************************************************
  1501.  *  Method:
  1502.  *    CHXMacSite::_TestFullScreen
  1503.  */
  1504. HX_RESULT
  1505. CHXMacSite::_TestFullScreen(void* hTestBitmap, const char* pszStatusText)
  1506. {
  1507.     return HXR_OK;
  1508. }
  1509. /************************************************************************
  1510.  *  Method:
  1511.  *    CHXMacSite::_TryCreateXSlider
  1512.  */
  1513. void
  1514. CHXMacSite::_TryCreateXSlider()
  1515. {
  1516.     if (!IsSiteVisible())
  1517.     {
  1518. return;
  1519.     }
  1520.     
  1521.     HXxWindow* pWindow = GetWindow();
  1522.     if (!pWindow || !pWindow->window)
  1523.     {
  1524. return;
  1525.     }
  1526.     
  1527.     WindowPtr w = (WindowPtr)pWindow->window;
  1528.     
  1529.     GrafPtr savePort;
  1530.     ::GetPort(&savePort);
  1531.     ::SetPort(::GetWindowPort(w));
  1532.     
  1533.     Point oldOrigin;
  1534.     Rect portRect;
  1535.     ::GetPortBounds(::GetWindowPort(w), &portRect);
  1536.     oldOrigin.h = portRect.left;
  1537.     oldOrigin.v = portRect.top;
  1538.     
  1539.     SetOriginAndMaintainClipRgn(0,0); // scroll bar maintenance requires origin at 0,0.
  1540.     
  1541.     HXxPoint offset = {0,0};
  1542.     GetMacContentAreaOffset(offset);
  1543.     
  1544.     HXxPoint position;
  1545.     HXxSize size;
  1546.     
  1547.     HX_ASSERT(GetParentSite());
  1548.     
  1549.     if (GetParentSite())
  1550.     {
  1551. GetParentSite()->GetSize(size);
  1552. position.x = 0;
  1553. position.y = 0;
  1554.     }
  1555.     
  1556.     Rect controlRect;
  1557.     controlRect.left = position.x + offset.x;
  1558.     controlRect.top = position.y + offset.y + size.cy - SCROLL_BAR_WIDTH;
  1559.     controlRect.right = controlRect.left + size.cx;
  1560.     controlRect.bottom = controlRect.top + SCROLL_BAR_WIDTH;
  1561.     
  1562.     if (m_hHScrollBar && ::GetControlOwner(m_hHScrollBar) != w)
  1563.     {
  1564. ::DisposeControl(m_hHScrollBar);
  1565. m_hHScrollBar = NULL;
  1566. m_XSliderPos = 0;
  1567.     }
  1568.     
  1569.     if (m_hHScrollBar)
  1570.     {
  1571. // if it already exists, then we may simply need to
  1572. // move it...
  1573. Rect oldControlRect;
  1574. ::GetControlBounds(m_hHScrollBar, &oldControlRect);
  1575. if (!::EqualRect(&oldControlRect, &controlRect))
  1576. {
  1577.     ::SetControlBounds(m_hHScrollBar, &controlRect);
  1578.     ::InvalWindowRect(w, &oldControlRect);
  1579. }
  1580.     }
  1581.     else
  1582.     {
  1583. ::CreateScrollBarControl(w, &controlRect, 0, 0, 2, 1, false, NULL, &m_hHScrollBar);
  1584. ::SetControlReference(m_hHScrollBar, 0);
  1585.     }
  1586.     
  1587.     // invaling the rect seems to ameliorate this problem where extra scrollbars
  1588.     // were being spuriously displayed.
  1589.     ::InvalWindowRect(w, &controlRect);
  1590.     
  1591.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1592.     ::SetPort(savePort);
  1593. }
  1594. /************************************************************************
  1595.  *  Method:
  1596.  *    CHXMacSite::_SetXSliderValues
  1597.  */
  1598. void
  1599. CHXMacSite::_SetXSliderValues(INT32 range, INT32 pageSize)
  1600. {
  1601.     HXxWindow* pWindow = GetWindow();
  1602.     if (!pWindow || !pWindow->window)
  1603.     {
  1604. return;
  1605.     }
  1606.     
  1607.     WindowPtr w = (WindowPtr)pWindow->window;
  1608.     
  1609.     Point oldOrigin;
  1610.     Rect portRect;
  1611.     ::GetPortBounds(::GetWindowPort(w), &portRect);
  1612.     oldOrigin.h = portRect.left;
  1613.     oldOrigin.v = portRect.top;
  1614.     
  1615.     SetOriginAndMaintainClipRgn(0,0);
  1616.     
  1617.     ::SetControl32BitMinimum(m_hHScrollBar, 0);
  1618.     ::SetControl32BitMaximum(m_hHScrollBar, range - pageSize);
  1619.     ::SetControlViewSize(m_hHScrollBar, pageSize);
  1620.     
  1621.     ::SetControl32BitValue(m_hHScrollBar, m_XSliderPos);
  1622.     
  1623.     m_nHorizPageSize = pageSize / 2;
  1624.     
  1625.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1626.     SetMacControlRange(m_hHScrollBar, range);
  1627.     
  1628.     m_nHorizPageSize = pageSize;
  1629. }
  1630. /************************************************************************
  1631.  *  Method:
  1632.  *    CHXMacSite::_TryCreateYSlider
  1633.  */
  1634. void
  1635. CHXMacSite::_TryCreateYSlider()
  1636. {
  1637.     if (!IsSiteVisible())
  1638.     {
  1639. return;
  1640.     }
  1641.     
  1642.     HXxWindow* pWindow = GetWindow();
  1643.     if (!pWindow || !pWindow->window)
  1644.     {
  1645. return;
  1646.     }
  1647.     
  1648.     WindowPtr w = (WindowPtr)pWindow->window;
  1649.     
  1650.     GrafPtr savePort;
  1651.     ::GetPort(&savePort);
  1652.     ::SetPort(::GetWindowPort(w));
  1653.     
  1654.     Point oldOrigin;
  1655.     Rect portRect;
  1656.     ::GetPortBounds(::GetWindowPort(w), &portRect);
  1657.     oldOrigin.h = portRect.left;
  1658.     oldOrigin.v = portRect.top;
  1659.     
  1660.     HXxPoint offset = {0,0};
  1661.     GetMacContentAreaOffset(offset);
  1662.     
  1663.     SetOriginAndMaintainClipRgn(0,0);
  1664.     
  1665.     HXxPoint position;
  1666.     HXxSize size;
  1667.     
  1668.     HX_ASSERT(GetParentSite());
  1669.     
  1670.     if (GetParentSite())
  1671.     {
  1672. GetParentSite()->GetSize(size);
  1673. position.x = 0;
  1674. position.y = 0;
  1675.     }
  1676.     
  1677.     Rect controlRect;
  1678.     controlRect.left = position.x + offset.x + size.cx - SCROLL_BAR_WIDTH;
  1679.     controlRect.top = position.y + offset.y;
  1680.     controlRect.right = controlRect.left + SCROLL_BAR_WIDTH;
  1681.     controlRect.bottom = controlRect.top + size.cy;
  1682.     
  1683.     if (_DoesXSliderExist())
  1684.     {
  1685. controlRect.bottom -= SCROLL_BAR_WIDTH; // ensure that both scroll bars don't overlap at the bottom right corner
  1686.     }
  1687.     
  1688.     if (m_hVScrollBar && ::GetControlOwner(m_hVScrollBar) != w)
  1689.     {
  1690. ::DisposeControl(m_hVScrollBar);
  1691. m_hVScrollBar = NULL;
  1692. m_YSliderPos = 0;
  1693.     }
  1694.     
  1695.     if (m_hVScrollBar)
  1696.     {
  1697. Rect oldControlRect;
  1698. ::GetControlBounds(m_hVScrollBar, &oldControlRect);
  1699. if (!::EqualRect(&oldControlRect, &controlRect))
  1700. {
  1701.     ::SetControlBounds(m_hVScrollBar, &controlRect);
  1702.     ::InvalWindowRect(w, &oldControlRect);
  1703. }
  1704.     }
  1705.     else
  1706.     {
  1707. ::CreateScrollBarControl(w, &controlRect, 0, 0, 2, 1, false, NULL, &m_hVScrollBar);
  1708. ::SetControlReference(m_hVScrollBar, 0);
  1709.     }
  1710.     
  1711.     ::InvalWindowRect(w, &controlRect);
  1712.     
  1713.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1714.     ::SetPort(savePort);
  1715. }
  1716. /************************************************************************
  1717.  *  Method:
  1718.  *    CHXMacSite::_SetYSliderValues
  1719.  */
  1720. void
  1721. CHXMacSite::_SetYSliderValues(INT32 range, INT32 pageSize)
  1722. {
  1723.     HXxWindow* pWindow = GetWindow();
  1724.     if (!pWindow || !pWindow->window)
  1725.     {
  1726. return;
  1727.     }
  1728.     
  1729.     WindowPtr w = (WindowPtr)pWindow->window;
  1730.     
  1731.     Point oldOrigin;
  1732.     Rect portRect;
  1733.     ::GetPortBounds(::GetWindowPort(w), &portRect);
  1734.     oldOrigin.h = portRect.left;
  1735.     oldOrigin.v = portRect.top;
  1736.     
  1737.     SetOriginAndMaintainClipRgn(0,0);
  1738.     
  1739.     ::SetControl32BitMinimum(m_hVScrollBar, 0);
  1740.     ::SetControl32BitMaximum(m_hVScrollBar, range-pageSize);
  1741.     ::SetControlViewSize(m_hVScrollBar, pageSize);
  1742.     
  1743.     ::SetControl32BitValue(m_hVScrollBar, m_YSliderPos);
  1744.     
  1745.     m_nVertPageSize = pageSize / 2;
  1746.     
  1747.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1748. }
  1749. /************************************************************************
  1750.  *  Method:
  1751.  *    CHXMacSite::_GetSystemSizeOfSliders
  1752.  */
  1753. void
  1754. CHXMacSite::_GetSystemSizeOfSliders(INT32* pWidth, INT32* pHeight)
  1755. {
  1756.     if (pWidth) *pWidth = SCROLL_BAR_WIDTH;
  1757.     if (pHeight) *pHeight = SCROLL_BAR_WIDTH;
  1758. }
  1759. /************************************************************************
  1760.  *  Method:
  1761.  *    CHXMacSite::_IsWindowVisible
  1762.  */
  1763. BOOL
  1764. CHXMacSite::_IsWindowVisible()
  1765. {
  1766.     return TRUE;
  1767. }
  1768. /************************************************************************
  1769.  *  Method:
  1770.  *    CHXMacSite::ShowMacControl
  1771.  */
  1772. void
  1773. CHXMacSite::ShowMacControl(ControlHandle theControl, BOOL bShow)
  1774. {
  1775.     if (theControl)
  1776.     {
  1777. if (bShow)
  1778. {
  1779.     ::ShowControl(theControl);
  1780. }
  1781. else
  1782. {
  1783.     ::HideControl(theControl);
  1784. }
  1785.     }
  1786. }
  1787. /************************************************************************
  1788.  *  Method:
  1789.  *    CHXMacSite::SetMacControlRectangle
  1790.  */
  1791. void
  1792. CHXMacSite::SetMacControlRectangle(ControlHandle theControl,
  1793. INT32 left, INT32 top, INT32 right, INT32 bottom )
  1794. {
  1795.     if (theControl)
  1796.     {
  1797. ::SizeControl(theControl, right-left, bottom-top);
  1798. ::MoveControl(theControl, left, top);
  1799.     }
  1800. }
  1801. void
  1802. CHXMacSite::SetMacControlRange(ControlHandle theControl, INT32 controlMax)
  1803. {
  1804.     if (theControl)
  1805.     {
  1806. // XXX bobclark
  1807. // Important note: The MacOS scroll bars only use 16-bit integers,
  1808. // while the Core uses 32-bit integers here. If 16 bits isn't enough,
  1809. // we'll have to do a lot more work by hand, like storing the "real"
  1810. // value in a separate variable, and scaling from 16-bit to 32-bit
  1811. // values whenever the scroll bar's thumb is dragged. For clicking on
  1812. // the scroll bar's arrows or paging around, we could compute that
  1813. // directly using the long but we'd need to scale it back to a short
  1814. // so the scroll bar would correctly reflect its approximation of the
  1815. // value.
  1816. // I don't think this will be an issue, since we're scrolling around
  1817. // a site, and a site that's more than 32000 pixels wide is ludicrous.
  1818. HX_ASSERT(controlMax >= 0 && controlMax < 32000);
  1819. SetControlMinimum(theControl, 0);
  1820. SetControlMaximum(theControl, (short)controlMax);
  1821.     }
  1822. }
  1823. /************************************************************************
  1824.  *  Method:
  1825.  *    CHXMacSite::_ShowXSlider
  1826.  */
  1827. void
  1828. CHXMacSite::_ShowXSlider(BOOL bShow)
  1829. {
  1830.     HXxWindow* pWindow = GetWindow();
  1831.     if (!pWindow || !pWindow->window)
  1832.     {
  1833. return;
  1834.     }
  1835.     WindowPtr w = (WindowPtr)pWindow->window;
  1836.     Point oldOrigin;
  1837.     Rect portRect;
  1838.     ::GetPortBounds( ::GetWindowPort(w), &portRect);
  1839.     oldOrigin.h = portRect.left;
  1840.     oldOrigin.v = portRect.top;
  1841.     
  1842.     SetOriginAndMaintainClipRgn(0,0);
  1843.     
  1844.     ShowMacControl(m_hHScrollBar, bShow);
  1845.     
  1846.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1847. }
  1848. /************************************************************************
  1849.  *  Method:
  1850.  *    CHXMacSite::_MoveXSlider
  1851.  */
  1852. void
  1853. CHXMacSite::_MoveXSlider(INT32 left, INT32 top, INT32 right, INT32 bottom, BOOL bRedraw)
  1854. {
  1855.     // xxxbobclark do nothing right now
  1856. }
  1857. /************************************************************************
  1858.  *  Method:
  1859.  *    CHXMacSite::_ShowYSlider
  1860.  */
  1861. void
  1862. CHXMacSite::_ShowYSlider(BOOL bShow)
  1863. {
  1864.     HXxWindow* pWindow = GetWindow();
  1865.     if (!pWindow || !pWindow->window)
  1866.     {
  1867. return;
  1868.     }
  1869.     WindowPtr w = (WindowPtr)pWindow->window;
  1870.     Point oldOrigin;
  1871.     Rect portRect;
  1872.     ::GetPortBounds(::GetWindowPort(w), &portRect);
  1873.     oldOrigin.h = portRect.left;
  1874.     oldOrigin.v = portRect.top;
  1875.     
  1876.     SetOriginAndMaintainClipRgn(0,0);
  1877.     
  1878.     ShowMacControl(m_hVScrollBar, bShow);
  1879.     
  1880.     SetOriginAndMaintainClipRgn(oldOrigin.h, oldOrigin.v);
  1881. }
  1882. /************************************************************************
  1883.  *  Method:
  1884.  *    CHXMacSite::_MoveYSlider
  1885.  */
  1886. void
  1887. CHXMacSite::_MoveYSlider(INT32 left, INT32 top, INT32 right, INT32 bottom, BOOL bRedraw)
  1888. {
  1889.     // xxxbobclark don't do anything right now
  1890. }
  1891. /************************************************************************
  1892.  *  Method:
  1893.  *    CHXMacSite::_DoesXSliderExist
  1894.  */
  1895. BOOL
  1896. CHXMacSite::_DoesXSliderExist()
  1897. {
  1898.     if (m_hHScrollBar) return TRUE;
  1899.     return FALSE;
  1900. }
  1901. /************************************************************************
  1902.  *  Method:
  1903.  *    CHXMacSite::_GetContainingWindow
  1904.  */
  1905. void*
  1906. CHXMacSite::_GetContainingWindow()
  1907. {
  1908.     if (m_pParentSite) return m_pParentSite->_GetContainingWindow();
  1909.     return NULL;
  1910. }
  1911. /************************************************************************
  1912.  *  Method:
  1913.  *    CHXMacSite::_GetCursorPos
  1914.  */
  1915. void
  1916. CHXMacSite::_GetCursorPos(HXxPoint* pPoint)
  1917. {
  1918.     // this will return in global coordinates. (???)
  1919.     HX_ASSERT(_AtSystemTime());
  1920.     if (!_AtSystemTime()) return;
  1921.     
  1922.     HX_ASSERT(pPoint);
  1923.     if (!pPoint) return;
  1924.     
  1925.     Point pt;
  1926.     ::GetMouse(&pt);
  1927.     // pt is in local coordinates
  1928.     
  1929.     ::LocalToGlobal(&pt);
  1930.     
  1931.     pPoint->x = pt.h;
  1932.     pPoint->y = pt.v;
  1933. }
  1934. /************************************************************************
  1935.  *  Method:
  1936.  *    CHXMacSite::_MapPointToOSWindow
  1937.  */
  1938. void
  1939. CHXMacSite::_MapPointToOSWindow(HXxPoint* pPt, void** pWindowHandle)
  1940. {
  1941. }
  1942. /************************************************************************
  1943.  *  Method:
  1944.  *    CHXMacSite::_GetWindowWithCursor
  1945.  */
  1946. void*
  1947. CHXMacSite::_GetWindowWithCursor()
  1948. {
  1949.     return NULL;
  1950. }
  1951. /************************************************************************
  1952.  *  Method:
  1953.  *    CHXMacSite::_ReInitPrimarySurface
  1954.  */
  1955. void
  1956. CHXMacSite::_ReInitPrimarySurface()
  1957. {
  1958. }
  1959. /************************************************************************
  1960.  *  Method:
  1961.  *    CHXMacSite::_MoveWindow
  1962.  */
  1963. BOOL
  1964. CHXMacSite::_MoveWindow(void* window, INT32 X, INT32 Y, INT32 nWidth, INT32 nHeight, BOOL bRepaint)
  1965. {
  1966.     return TRUE;
  1967. }
  1968. /************************************************************************
  1969.  *  Method:
  1970.  *    CHXMacSite::_UpdateWindow
  1971.  */
  1972. BOOL
  1973. CHXMacSite::_UpdateWindow(void* hWnd)
  1974. {
  1975.     return TRUE;
  1976. }
  1977. /************************************************************************
  1978.  *  Method:
  1979.  *    CHXMacSite::_ShowWindow
  1980.  */
  1981. BOOL
  1982. CHXMacSite::_ShowWindow(void* hWnd, INT32 nCmdShow)
  1983. {
  1984.     return TRUE;
  1985. }
  1986. /************************************************************************
  1987.  *  Method:
  1988.  *    CHXMacSite::_SetWindowPos
  1989.  */
  1990. BOOL
  1991. CHXMacSite::_SetWindowPos(void* hWnd, void* hWndInsertAfter, INT32 X, INT32 Y, INT32 cx, INT32 cy, INT32 uFlags)
  1992. {
  1993.     return TRUE;
  1994. }
  1995. /************************************************************************
  1996.  *  Method:
  1997.  *    CHXMacSite::_SetWindowRgn
  1998.  */
  1999. BOOL
  2000. CHXMacSite::_SetWindowRgn(void* hWnd, HXREGION* hRgn, BOOL bRedraw)
  2001. {
  2002.     return TRUE;
  2003. }
  2004. /************************************************************************
  2005.  *  Method:
  2006.  *    CHXMacSite::_SetFocus
  2007.  */
  2008. void
  2009. CHXMacSite::_SetFocus(void* pWindow)
  2010. {
  2011. }
  2012. /************************************************************************
  2013.  *  Method:
  2014.  *    CHXMacSite::GetMacContentAreaOffset
  2015.  */
  2016. void
  2017. CHXMacSite::GetMacContentAreaOffset(REF(HXxPoint)offset)
  2018. {
  2019.     offset.x = m_topleft.x;
  2020.     offset.y = m_topleft.y;
  2021.     
  2022.     HXxWindow* pWindow = GetWindow();
  2023.     
  2024.     if (pWindow)
  2025.     {
  2026. offset.x += pWindow->x;
  2027. offset.y += pWindow->y;
  2028.     }
  2029.     
  2030.     return;
  2031. }
  2032. #pragma export on
  2033. extern "C" void MacSiteHandleAllEvents(HXxEvent* pEvent)
  2034. {
  2035.     CHXMacSite::_HandleAllOSEvents(pEvent);
  2036. }
  2037. #pragma export off
  2038. /************************************************************************
  2039.  *  Callback implementation
  2040.  */
  2041. /************************************************************************
  2042.  *  Method:
  2043.  *    CHXMacSite::MacSiteRedrawCallback ctor
  2044.  */
  2045. CHXMacSite::MacSiteRedrawCallback::MacSiteRedrawCallback(CHXMacSite* pMacSite)
  2046.  : m_lRefCount(0)
  2047.  , m_ulMacSiteRedrawCallbackPendingID(0)
  2048.  , m_pMacSite(pMacSite)
  2049. {
  2050. }
  2051. /************************************************************************
  2052.  *  Method:
  2053.  *    CHXMacSite::MacSiteRedrawCallback dtor
  2054.  */
  2055. CHXMacSite::MacSiteRedrawCallback::~MacSiteRedrawCallback()
  2056. {
  2057. }
  2058. /************************************************************************
  2059.  *  Method:
  2060.  *    CHXMacSite::MacSiteRedrawCallback::QueryInterface
  2061.  */
  2062. STDMETHODIMP
  2063. CHXMacSite::MacSiteRedrawCallback::QueryInterface(REFIID riid, void** ppvObj)
  2064. {
  2065.     if (IsEqualIID(riid, IID_IHXCallback))
  2066.     {
  2067. AddRef();
  2068. *ppvObj = (IHXCallback*)this;
  2069. return HXR_OK;
  2070.     }
  2071.     else if (IsEqualIID(riid, IID_IUnknown))
  2072.     {
  2073.         AddRef();
  2074.         *ppvObj = this;
  2075.         return HXR_OK;
  2076.     }
  2077.     *ppvObj = NULL;
  2078.     return HXR_NOINTERFACE;
  2079. }
  2080. /************************************************************************
  2081.  *  Method:
  2082.  *    CHXMacSite::MacSiteRedrawCallback::AddRef
  2083.  */
  2084. STDMETHODIMP_(ULONG32)
  2085. CHXMacSite::MacSiteRedrawCallback::AddRef()
  2086. {
  2087.     return InterlockedIncrement( &m_lRefCount );
  2088. }
  2089. /************************************************************************
  2090.  *  Method:
  2091.  *    CHXMacSite::MacSiteRedrawCallback::Release
  2092.  */
  2093. STDMETHODIMP_(ULONG32)
  2094. CHXMacSite::MacSiteRedrawCallback::Release()
  2095. {
  2096.     if ( InterlockedDecrement( &m_lRefCount ) > 0 )
  2097.     {
  2098. return m_lRefCount;
  2099.     }
  2100.     
  2101.     delete this;
  2102.     return 0;
  2103. }
  2104. /************************************************************************
  2105.  *  Method:
  2106.  *    CHXMacSite::MacSiteRedrawCallback::Func
  2107.  */
  2108. STDMETHODIMP
  2109. CHXMacSite::MacSiteRedrawCallback::Func()
  2110. {
  2111.     m_pMacSite->_TLSLock();
  2112.     
  2113.     m_ulMacSiteRedrawCallbackPendingID = NULL;
  2114.     m_pMacSite->ForceRedraw();
  2115.     
  2116.     m_pMacSite->_TLSUnlock();
  2117.     
  2118.     return HXR_OK;
  2119. }
  2120. #ifdef THREADS_SUPPORTED
  2121. #ifdef USE_CARBON_TIMER
  2122. /************************************************************************
  2123.  *  Method:
  2124.  *    CHXMacSite::Redraw(something)Timer
  2125.  */
  2126. /*static*/
  2127. #ifdef _MAC_MACHO
  2128. void CHXMacSite::RedrawCFTimer(CFRunLoopTimerRef, CHXMacSite* pMacSite)
  2129. #else
  2130. void CHXMacSite::RedrawCarbonTimer(EventLoopTimerRef, CHXMacSite* pMacSite)
  2131. #endif
  2132. {
  2133.     // XXXMEH
  2134.     MLOG_BLT(NULL,
  2135.              "%lut----macsite.cpp--- RedrawCarbonTimer()n",
  2136.              HX_GET_BETTERTICKCOUNT());
  2137.     HX_ASSERT( pMacSite );
  2138.     HX_ASSERT(IsMacInCooperativeThread());
  2139.     if (pMacSite->m_pIHXCoreMutex) pMacSite->m_pIHXCoreMutex->LockCoreMutex();
  2140.     
  2141.     // this huge block of code is adapted from the base site's implementation of
  2142.     // InternalScheduleUpgrade, where it needs to match up an IHXPlayer with this
  2143.     // site. In this case, we're protecting ourselves against rug-pulling, i.e.
  2144.     // if a stream has ended and stuff has been deleted, it's still possible (due
  2145.     // to the Carbon Timer's behavior of delaying redraws) that there's a pending
  2146.     // ForceRedraw() that wants to happen. If there's no player for this site, or
  2147.     // if the player is done, then we'll omit the blit.
  2148.     
  2149.     // On a one-gigahertz processor, this checking function is taking
  2150.     // between 20 and 30 microseconds; it may be worthwhile to save the
  2151.     // player in a member variable.
  2152.     
  2153.     bool bPlayerStillRunning = false;
  2154.     
  2155.     IHXPreferences* pPreferences = NULL;
  2156.     IHXBuffer* pBuffer = NULL;
  2157.     
  2158.     IHXClientEngine* pClientEngine = NULL;
  2159.     if (HXR_OK == pMacSite->m_pContext->QueryInterface(IID_IHXClientEngine, (void**)&pClientEngine))
  2160.     {
  2161.         UINT16 nPlayerCount = pClientEngine->GetPlayerCount();
  2162.         IUnknown* pUnknown = NULL;
  2163.         
  2164.         if (nPlayerCount == 1)
  2165.         {
  2166.             // wow, this was easy -- this is the only player then.
  2167.             pClientEngine->GetPlayer(0, pUnknown);
  2168.         }
  2169.         else
  2170.         {
  2171.             IHXSite* pThisSite = NULL;
  2172.             
  2173.             pMacSite->QueryInterface(IID_IHXSite, (void**)&pThisSite);
  2174.             HX_ASSERT(pThisSite);
  2175.             
  2176.             UINT16 index;
  2177.             for (index = 0; index < nPlayerCount; index++)
  2178.             {
  2179.                 IHXSiteManager2* pSiteMgr2 = NULL;
  2180.                 IUnknown* pUnknownPlayer = NULL;
  2181.                 
  2182.                 pClientEngine->GetPlayer(index, pUnknownPlayer);
  2183.                 HX_ASSERT(pUnknownPlayer);
  2184.                 
  2185.                 pUnknownPlayer->QueryInterface(IID_IHXSiteManager2, (void**)&pSiteMgr2);
  2186.                 if (pSiteMgr2)
  2187.                 {
  2188.                     UINT32 nNumSites;
  2189.                     pSiteMgr2->GetNumberOfSites(nNumSites);
  2190.                     UINT32 index2;
  2191.                     for (index2 = 0; index2 < nNumSites; index2++)
  2192.                     {
  2193.                         IHXSite* pIterationSite = NULL;
  2194.                         pSiteMgr2->GetSiteAt(index2, pIterationSite);
  2195.                         if (pThisSite == pIterationSite)
  2196.                         {
  2197.                             // it matches!
  2198.                             HX_ASSERT(pUnknown == NULL);
  2199.                             pUnknown = pUnknownPlayer;
  2200.                             pUnknown->AddRef();
  2201.                         }
  2202.                     }
  2203.                     HX_RELEASE(pSiteMgr2);
  2204.                 }
  2205.                 HX_RELEASE(pUnknownPlayer);
  2206.             }
  2207.             
  2208.             HX_RELEASE(pThisSite);
  2209.         }
  2210.         
  2211.         if (pUnknown)
  2212.         {
  2213.             IHXPlayer* pPlayer;
  2214.             
  2215.             pUnknown->QueryInterface(IID_IHXPlayer, (void**)&pPlayer);
  2216.             if (pPlayer)
  2217.             {
  2218.                 if (!pPlayer->IsDone())
  2219.                 {
  2220.                     bPlayerStillRunning = true;
  2221.                 }
  2222.                 HX_RELEASE(pPlayer);
  2223.             }
  2224.             HX_RELEASE(pUnknown);
  2225.         }
  2226.         
  2227.         HX_RELEASE(pClientEngine);
  2228.     }
  2229.     
  2230.     if (bPlayerStillRunning)
  2231.     {
  2232.         pMacSite->ForceRedraw();
  2233.     }
  2234.     
  2235.     if (pMacSite->m_pIHXCoreMutex) pMacSite->m_pIHXCoreMutex->UnlockCoreMutex();
  2236. }
  2237. #endif
  2238. #endif