macsite.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:64k
源码类别:

Symbian

开发平台:

Visual C++

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