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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: basesite.cpp,v 1.20.4.2 2004/07/09 01:59:28 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. #include <stdlib.h> //for atof
  50. #include "hxcom.h"
  51. #include "hxtypes.h"
  52. #include "hxwintyp.h"
  53. #include "ihxpckts.h"
  54. #include "hxwin.h"
  55. #include "hxengin.h"
  56. #include "hxsite2.h"
  57. #include "hxevent.h"
  58. #include "hxcomm.h"
  59. #include "hxassert.h"
  60. #include "hxthread.h"
  61. #include "hxvsurf.h"
  62. #include "basesite.h"
  63. #include "basesurf.h"
  64. #include "baseroot.h"
  65. #ifdef _WINDOWS
  66. #include "winroot.h" //must be included before colormap.h
  67. #endif
  68. #include "colormap.h"
  69. #if defined(_UNIX) && !defined(_MAC_UNIX)
  70. #include "X11/Xlib.h"
  71. #include "X11/keysym.h"
  72. #include "unixsite.h"
  73. #include "hxiids.h"
  74. #include "hxcmenu.h"
  75. #endif
  76. #include "sitetext.h"
  77. //#include "hxwinver.h"
  78. #include "ihxpckts.h"
  79. #include "hxprefs.h"
  80. #include "hxtick.h"
  81. #include "hxcore.h"
  82. #include "hxupgrd.h"
  83. #include "addupcol.h"
  84. #include "mmx_util.h"
  85. #ifdef _WINDOWS
  86. #include "winsite.h"
  87. #endif
  88. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  89. //#include "../dcondev/dcon.h"
  90. #include "platform/mac/macsite.h"
  91. #endif
  92. #if defined(_UNIX) && !defined(_MAC_UNIX)
  93. #include "unixsite.h"
  94. #endif
  95. #include "hxheap.h"
  96. #include "colormap.h"
  97. #include "drawline.h"
  98. #include "hxvimlog.h"
  99. #include "sitefact.h"
  100. #if defined(HELIX_FEATURE_PREFERENCES)
  101. #include "hxprefs.h"
  102. #include "hxprefutil.h"
  103. #endif /* HELIX_FEATURE_PREFERENCES */
  104. #ifdef _DEBUG
  105. #undef HX_THIS_FILE
  106. static const char HX_THIS_FILE[] = __FILE__;
  107. #endif
  108. //XXXgfw just to clean up the code. We still *REALLY* need to clean
  109. //this up.
  110. #ifdef _WIN32
  111. #define GETBITMAPCOLOR(x) GetBitmapColor( (LPBITMAPINFO)(x) )
  112. #else
  113. #define GETBITMAPCOLOR(x) GetBitmapColor( (HXBitmapInfo*)(x))
  114. #endif
  115. #ifdef _WIN32
  116. #define GETBITMAPPITCH(x) GetBitmapPitch( (LPBITMAPINFO)(x) )
  117. #else
  118. #define GETBITMAPPITCH(x) GetBitmapPitch( (HXBitmapInfo*)(x))
  119. #endif
  120. /*
  121.  *  Full Screen Preferences Information
  122.  */
  123. #define MODE_SEPERATOR                          "|"
  124. #define MODE_DESRIPTION_SEPS                    "xX"
  125. #define REGKEY_TESTED                           "Tested"
  126. #define REGKEY_BLT_TIME                         "BltTime"
  127. #define REGKEY_PASS                             "Passed"
  128. #define DIRECT_DRAW_DLL                         "ddraw.dll"
  129. #define REGKEY_FULLSCREEN_DATA                  "FullScreenData"
  130. #define REGKEY_FULLSCREEN_AVAILIABLE_MODES      "AvailiableModes"
  131. #define REGKEY_FULLSCREEN_TEST_MODES            "TestModes"
  132. #define REGKEY_FULLSCREEN_PREFERED_MODE         "PreferedMode"
  133. #define REGKEY_NEW_FULLSCREEN_CODE              "NewFullScreen"
  134. #define REGKEY_FULLSCREEN_NEW_STRING_FORMAT     "NewStringFormat"
  135. #define REGKEY_DO_NOT_SETUP_DD                  "DoNotSetupDD"
  136. #define TEST_THRESHOLD                          30
  137. #define REGKEY_FULLSCREEN_POSTAGE_STAMP         "PostageStamp"
  138. #define TEST_LENGTH                             6000
  139. #define NUM_OF_TEST_ITTERATIONS                 2000
  140. #define MOVING_TIMEOUT 200 // Milliseconds
  141. BOOL    CHXBaseSite::zm_bInFullScreenTest       = FALSE;
  142. extern  tranType z_TransitionTable[];
  143. extern  INT32 z_nNumberTransitionTypes;
  144. //Out global list of YUV sites.
  145. CHXSimpleList CHXBaseSite::zm_YUVSiteList;
  146. //#define DEBUG_LINKING
  147. /************************************************************************
  148.  *  Method:
  149.  *    Constructor
  150.  */
  151. CHXBaseSite::CHXBaseSite(IUnknown* pContext, IUnknown* pUnkOuter, INT32 lZorder)
  152.     : m_lRefCount(0)
  153.     , zm_pColorAcc(NULL)
  154.     , m_bIsChildWindow(FALSE)
  155.     , m_pValues(0)
  156.     , m_pUser(0)
  157.     , m_pParentSite(0)
  158.     , m_pVideoSurface(0)
  159.     , m_pCCF(0)
  160.     , m_pWatcher(0)
  161.     , m_pContext(pContext)
  162.     , m_pUnkOuter(pUnkOuter)
  163.     , m_lZOrder(lZorder)
  164.     , m_bIsVisible(TRUE)
  165.     , m_bInDestructor(FALSE)
  166.     , m_pRootSurface(NULL)
  167.     , m_CallbackHandle(0)
  168.     , m_ScrollSiteCallbackHandle(0)
  169.     , m_pMouseInSite(0)
  170.     , m_pScheduler(0)
  171.     , m_bRecomputeClipScheduled(FALSE)
  172.     , m_bForceRedrawNeeded(FALSE)
  173.     , m_bInFullScreen(FALSE)
  174.     , m_bSettingDisplayMode(FALSE)
  175.     , m_bRepaintScheduled(FALSE)
  176.     , m_bDisableForceRedraw(FALSE)
  177.     , m_bProcessRepaint(FALSE)
  178.     , m_bAboutToBlt(FALSE)
  179.     , m_fSharpness(DEF_SHARPNESS)
  180.     , m_fHue(DEF_HUE)
  181.     , m_fSaturation(DEF_SATURATION)
  182.     , m_fContrast(DEF_CONTRAST)
  183.     , m_fBrightness(DEF_BRIGHTNESS)
  184.     , m_XSliderPos(0)
  185.     , m_YSliderPos(0)
  186.     , m_XSliderRange(0)
  187.     , m_YSliderRange(0)
  188.     , m_pTopLevelSite(0)
  189.     , m_pFocusSite(0)
  190.     , m_pStatusText(0)
  191.     , m_nStatusTextExpireTime(0)
  192.     , m_pCallback(0)
  193.     , m_pScrollSiteCallback(0)
  194.     , m_bWasTopMost(FALSE)
  195.     , m_bDoNotGenerateWMPPaint(FALSE)
  196.     , m_bSetCaptureOn(FALSE)
  197.     , m_pCaptureUser(0)
  198.     , m_pLastUser(0)
  199.     , m_bModeSharpness(FALSE)
  200.     , m_nLastMoveTime(0)
  201.     , m_bAttachWindowPending(FALSE)
  202.     , m_bDetachWndMsgPending(FALSE)
  203.     , m_nOldBitsPerPixel(0)
  204.     , m_nOldHorzRes(0)
  205.     , m_nOldVertRes(0)
  206.     , m_Region(NULL)
  207.     , m_RegionForMouse(NULL)
  208.     , m_RegionWithoutChildren(NULL)
  209.     , m_nTransitionState(0)
  210.     , m_lBltEntryCount(0)
  211.     , m_bRegionIsValid(FALSE)
  212.     , m_bTransitionReversed(FALSE)
  213.     , m_bTransitionTranIn(TRUE)
  214.     , m_nTransitionVertRepeat(1)
  215.     , m_nTransitionHorzRepeat(1)
  216.     , m_nTransitionBorderWidth(0)
  217.     , m_ulTransitionBorderColor(0)
  218.     , m_ulTransitionFadeColor(0)
  219.     , m_bTransitionBlendBorder(FALSE)
  220.     , m_bTransitionCoordinated(FALSE)
  221.     , m_bTransitionCoordTranIsParentClip(FALSE)
  222.     , m_bWindowCreatedByCreate(FALSE)
  223.     , m_pWindow(NULL)
  224.     , m_bSiteNeverBlts(FALSE)
  225.     , m_bCalledComputeClipFromTransition(FALSE)
  226.     , m_nEventSensitivity(SENSITIVITY_NOT_SET)
  227.     , m_nDelayFillBorders(0)
  228.     , m_bUsingList(FALSE)
  229.     , m_bCompositionLocked(FALSE)
  230.     , m_bCompositionMode(FALSE)
  231.     , m_bScheduleUpgrade(FALSE)
  232.     , m_bVideoUnderTransition(FALSE)
  233.     , m_bInForceRedraw(FALSE)
  234.     , m_bSiteRefresh(FALSE)
  235.     , m_bMoving(FALSE)
  236.     , m_bTestWindowing(FALSE)
  237.     , m_nWindowColor(0)
  238.     , m_bPostageStamp(FALSE)
  239.     , m_bBltHasBeenCalled(FALSE)
  240.     , m_pKeyBoardFocusUser(NULL)
  241.     , m_nTLSMutexLockCount(0)
  242.     , m_ulTLSMutexOwningThread(0)
  243.     , m_pDirtyRegion(NULL)
  244.     , m_bUserWantsSubRects(FALSE)
  245.     , m_bSiteScalingInfo(FALSE)
  246.     , m_bScrollingSite(FALSE)
  247. {
  248.     m_fpTransitionEffect = z_TransitionTable[0].m_pSubTypes[0].m_fpTranFunction;
  249.     //If we are not being aggregated then just point the outer unkown
  250.     //to ourselves....
  251.     if( pUnkOuter == NULL )
  252.     {
  253.         m_pUnkOuter = (IUnknown*)(SiteNonDelegatingUnknown*) this;
  254.     }
  255.     // addref the context
  256.     if( m_pContext )
  257.     {
  258.         m_pContext->AddRef();
  259.         // get the CCF
  260.         m_pContext->QueryInterface(IID_IHXCommonClassFactory,
  261.                                    (void**)&m_pCCF);
  262.     }
  263.     HX_ASSERT( m_pCCF );
  264.     if( m_pCCF )
  265.     {
  266.         m_pCCF->CreateInstance(CLSID_IHXValues, (void**)&m_pValues);
  267.         HX_ASSERT(m_pValues);
  268.     }
  269.     if( m_pContext )
  270.     {
  271.         m_pContext->QueryInterface(IID_IHXScheduler, (void**)&m_pScheduler);
  272.     }
  273.     HX_ASSERT(m_pScheduler);
  274. #if defined(THREADS_SUPPORTED) || defined(_UNIX_THREADS_SUPPORTED)
  275.     HXMutex::MakeMutex(m_pMutex);
  276.     HXThread::MakeThread(m_pDummyThread);
  277. #else
  278.     HXMutex::MakeStubMutex(m_pMutex);
  279.     HXThread::MakeStubThread(m_pDummyThread);
  280. #endif
  281.     m_pVideoSurface = CBaseSurface::Create(m_pContext, this);
  282.     m_pVideoSurface->AddRef();
  283.     memset(&m_TopLevelWindow, 0, sizeof(HXxWindow));
  284.     memset(&m_topleft, 0, sizeof(HXxPoint));
  285.     memset(&m_position, 0, sizeof(HXxPoint));
  286.     memset(&m_positionOrig, 0, sizeof(HXxPoint));
  287.     memset(&m_CreateWindowPos, 0, sizeof(HXxPoint));
  288.     memset(&m_size, 0, sizeof(HXxPoint));
  289.     memset(&m_screenOffset, 0, sizeof(HXxPoint));
  290.     m_pWindow = NULL;
  291.     memset(&m_rectOldClientRect, 0, sizeof(HXxRect));
  292.     memset(&m_rcFocusRect, 0, sizeof(m_rcFocusRect));
  293.     m_pTopLevelSite  = this;
  294.     m_bIsChildWindow = TRUE;
  295.     CreateColorAccess(m_pContext);
  296.     m_pCallback = new BaseSiteCallback(this);
  297.     IHXPreferences*    pPreferences    = NULL;
  298.     IHXBuffer*         pBuffer         = NULL;
  299.     if (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences,(void**)&pPreferences))
  300.     {
  301. ReadPrefBOOL(pPreferences, "TestWindowing", m_bTestWindowing);
  302.     }
  303.     HX_RELEASE(pPreferences);
  304.     //Create our dirty rect region.
  305.     m_pDirtyRegion = HXCreateRegion();
  306. #ifdef _CHECK_CREATE
  307.  {
  308. #ifdef _WINDOWS
  309.      FILE* f1 = fopen("c:\create.txt", "a+"); /* Flawfinder: ignore */
  310. #elif defined(_UNIX)
  311.      FILE* f1 = fopen("/tmp/create.txt", "a+"); /* Flawfinder: ignore */
  312. #endif
  313.      if( f1 )
  314.      {
  315.          fprintf(f1, "%p Constructor: %pn", GetCurrentThreadId(), this);
  316.          fclose(f1);
  317.      }
  318.  }
  319. #endif
  320. }
  321. /************************************************************************
  322.  *  Method:
  323.  *    Destructor
  324.  */
  325. CHXBaseSite::~CHXBaseSite()
  326. {
  327.     HX_DELETE(m_pMutex);
  328.     HX_DELETE(m_pDummyThread);
  329.     m_bInDestructor = TRUE;
  330.     //Focus
  331.     if(m_pTopLevelSite->GetFocusSite() == this)
  332.     {
  333.         m_pTopLevelSite->SetFocusSite(NULL);
  334.     }
  335.     //Clean up the color access functions
  336.     HX_DELETE(zm_pColorAcc);
  337.     //Cleanup Mouse oversupport
  338.     if (m_pTopLevelSite->m_pMouseInSite == this)
  339.     {
  340.         m_pTopLevelSite->m_pMouseInSite = NULL;
  341.     }
  342.     //Cleanup all remaining callbacks
  343.     if (m_CallbackHandle)
  344.     {
  345.         m_pScheduler->Remove(m_CallbackHandle);
  346.         m_CallbackHandle = 0;
  347.     }
  348.     HX_DELETE(m_pCallback);
  349.     if (m_ScrollSiteCallbackHandle)
  350.     {
  351.         m_pScheduler->Remove(m_ScrollSiteCallbackHandle);
  352.         m_ScrollSiteCallbackHandle = 0;
  353.     }
  354.     HX_DELETE(m_pScrollSiteCallback);
  355.     //Clean up all child sites
  356.     while(m_ChildrenMap.GetCount())
  357.     {
  358.         IHXSite* pSite = NULL;
  359.         pSite = (IHXSite*) (m_ChildrenMap.Begin()).get_key();
  360.         DestroyChild(pSite);
  361.     }
  362.     m_ChildrenInZOrder.RemoveAll();
  363.     //clean up passive site watchers
  364.     while(m_PassiveSiteWatchers.GetCount())
  365.     {
  366.         IHXPassiveSiteWatcher* pWatcher =
  367.             (IHXPassiveSiteWatcher*)m_PassiveSiteWatchers.GetHead();
  368.         HX_RELEASE(pWatcher);
  369.         m_PassiveSiteWatchers.RemoveHead();
  370.     }
  371.     //Check and see if we are in the YUV Site list. If so, remove ourselves.
  372.     LISTPOSITION pPos = zm_YUVSiteList.Find(this);
  373.     if(pPos)
  374.     {
  375.         zm_YUVSiteList.RemoveAt(pPos);
  376.     }
  377.     _EmptyBlenderList();
  378.     _EmptyNotifierList();
  379.     //Remove all pending tasks.
  380.     if (m_pTopLevelSite)
  381.         m_pTopLevelSite->RemovePendingTasks(this);
  382.     // release intefaces
  383.     HX_RELEASE(m_pCCF);
  384.     HX_RELEASE(m_pScheduler);
  385.     HX_RELEASE(m_pContext);
  386.     HX_RELEASE(m_pValues);
  387.     HX_RELEASE(m_pVideoSurface);
  388.     HX_RELEASE(m_pRootSurface);
  389.     if(m_pTopLevelSite != this)
  390.         HX_RELEASE(m_pTopLevelSite);
  391.     HXDestroyRegion(m_Region);
  392.     m_Region=NULL;
  393.     HXDestroyRegion(m_RegionForMouse);
  394.     m_RegionForMouse=NULL;
  395.     HXDestroyRegion(m_RegionWithoutChildren);
  396.     m_RegionWithoutChildren = NULL;
  397.     HXDestroyRegion(m_pDirtyRegion);
  398.     m_pDirtyRegion = NULL;
  399. }
  400. /************************************************************************
  401.  *  Method:
  402.  *    CHXBaseSite::SetParentSite
  403.  */
  404. void
  405. CHXBaseSite::SetParentSite(CHXBaseSite* pParentSite)
  406. {
  407.     m_pParentSite = pParentSite;
  408. }
  409. /************************************************************************
  410.  *  Method:
  411.  *    CHXBaseSite::SetTopLevelSite
  412.  */
  413. void
  414. CHXBaseSite::SetTopLevelSite(CHXBaseSite* pTop)
  415. {
  416.     if (m_pTopLevelSite != this)
  417.     {
  418.         HX_RELEASE(m_pTopLevelSite);
  419.     }
  420.     m_pTopLevelSite = pTop;
  421.     if (m_pTopLevelSite && m_pTopLevelSite != this)
  422.         m_pTopLevelSite->AddRef();
  423. }
  424. /************************************************************************
  425.  *  Method:
  426.  *    IUnknown::QueryInterface
  427.  */
  428. STDMETHODIMP CHXBaseSite::QueryInterface(REFIID riid, void** ppvObj)
  429. {
  430.     return m_pUnkOuter->QueryInterface(riid,ppvObj);
  431. }
  432. /************************************************************************
  433.  *  Method:
  434.  *    IUnknown::AddRef
  435.  */
  436. STDMETHODIMP_(ULONG32) CHXBaseSite::AddRef()
  437. {
  438.     return m_pUnkOuter->AddRef();
  439. }
  440. /************************************************************************
  441.  *  Method:
  442.  *    IUnknown::Release
  443.  */
  444. STDMETHODIMP_(ULONG32) CHXBaseSite::Release()
  445. {
  446.     return m_pUnkOuter->Release();
  447. }
  448. /************************************************************************
  449.  *  Method:
  450.  *    IUnknown::QueryInterface
  451.  */
  452. STDMETHODIMP CHXBaseSite::SiteNonDelegatingQueryInterface(REFIID riid, void** ppvObj)
  453. {
  454.     if (IsEqualIID(riid, IID_IUnknown))
  455.     {
  456.         AddRef();
  457.         *ppvObj = (IUnknown*)(IHXSite*)this;
  458.         return HXR_OK;
  459.     }
  460.     else if (IsEqualIID(riid, IID_IHXSite))
  461.     {
  462.         AddRef();
  463.         *ppvObj = (IHXSite*)this;
  464.         return HXR_OK;
  465.     }
  466.     else if (IsEqualIID(riid, IID_IHXSite2))
  467.     {
  468.         AddRef();
  469.         *ppvObj = (IHXSite2*)this;
  470.         return HXR_OK;
  471.     }
  472.     else if (IsEqualIID(riid, IID_IHXSiteTreeNavigation))
  473.     {
  474.         AddRef();
  475.         *ppvObj = (IHXSiteTreeNavigation*)this;
  476.         return HXR_OK;
  477.     }
  478.     else if (IsEqualIID(riid, IID_IHXInterruptSafe))
  479.     {
  480.         AddRef();
  481.         *ppvObj = (IHXInterruptSafe*)this;
  482.         return HXR_OK;
  483.     }
  484.     else if (IsEqualIID(riid, IID_IHXSiteWindowless))
  485.     {
  486.         AddRef();
  487.         *ppvObj = (IHXSiteWindowless*)this;
  488.         return HXR_OK;
  489.     }
  490.     else if (IsEqualIID(riid, IID_IHXSiteWindowed))
  491.     {
  492.         AddRef();
  493.         *ppvObj = (IHXSiteWindowed*)this;
  494.         return HXR_OK;
  495.     }
  496.     else if (IsEqualIID(riid, IID_IHXStatusMessage))
  497.     {
  498.         AddRef();
  499.         *ppvObj = (IHXStatusMessage*)this;
  500.         return HXR_OK;
  501.     }
  502.     else if (IsEqualIID(riid, IID_IHXSiteFullScreen))
  503.     {
  504.         AddRef();
  505.         *ppvObj = (IHXSiteFullScreen*)this;
  506.         return HXR_OK;
  507.     }
  508.     else if (IsEqualIID(riid, IID_IHXVideoControl))
  509.     {
  510.         AddRef();
  511.         *ppvObj = (IHXVideoControl*)this;
  512.         return HXR_OK;
  513.     }
  514.     else if (IsEqualIID(riid, IID_IHXSiteTransition))
  515.     {
  516.         AddRef();
  517.         *ppvObj = (IHXSiteTransition*)this;
  518.         return HXR_OK;
  519.     }
  520.     else if (IsEqualIID(riid, IID_IHXSiteComposition))
  521.     {
  522.         AddRef();
  523.         *ppvObj = (IHXSiteComposition*)this;
  524.         return HXR_OK;
  525.     }
  526.     else if (m_pValues &&
  527.              m_pValues->QueryInterface(riid, ppvObj) == HXR_OK)
  528.     {
  529.         return HXR_OK;
  530.     }
  531.     else if (IsEqualIID(riid, IID_IHXKeyBoardFocus))
  532.     {
  533.         AddRef();
  534.         *ppvObj = (IHXKeyBoardFocus*)this;
  535.         return HXR_OK;
  536.     }
  537.     else if (IsEqualIID(riid, IID_IHXDrawFocus))
  538.     {
  539.         AddRef();
  540.         *ppvObj = (IHXDrawFocus*)this;
  541.         return HXR_OK;
  542.     }
  543.     else if (IsEqualIID(riid, IID_IHXSubRectSite))
  544.     {
  545.         AddRef();
  546.         *ppvObj = (IHXSubRectSite*)this;
  547.         return HXR_OK;
  548.     }
  549.     *ppvObj = NULL;
  550.     return HXR_NOINTERFACE;
  551. }
  552. /************************************************************************
  553.  *  Method:
  554.  *    IUnknown::AddRef
  555.  */
  556. STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingAddRef()
  557. {
  558.     return InterlockedIncrement(&m_lRefCount);
  559. }
  560. /************************************************************************
  561.  *  Method:
  562.  *    IUnknown::Release
  563.  */
  564. STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingRelease()
  565. {
  566.     if (InterlockedDecrement(&m_lRefCount) > 0)
  567.     {
  568.         return m_lRefCount;
  569.     }
  570.     delete this;
  571.     return 0;
  572. }
  573. /************************************************************************
  574.  *  Method:
  575.  *    IHXSite::AttachUser
  576.  */
  577. STDMETHODIMP CHXBaseSite::AttachUser(IHXSiteUser* /*IN*/ pUser)
  578. {
  579.     if (m_pUser) return HXR_UNEXPECTED;
  580. #ifndef _DEBUG_WINDOWED_SITES
  581.     if (m_pParentSite && pUser->NeedsWindowedSites())
  582.     {
  583.         _NeedWindowedSite();
  584.     }
  585. #endif
  586.     m_pUser = pUser;
  587.     m_pUser->AddRef();
  588.     //if (!m_pTopLevelSite->m_pKeyBoardFocusUser && m_pTopLevelSite->m_pUser)
  589.     //{
  590.     //    m_pTopLevelSite->m_pKeyBoardFocusUser = m_pTopLevelSite->m_pUser;
  591.     //    m_pTopLevelSite->m_pKeyBoardFocusUser->AddRef();
  592.     //}
  593.     m_pUser->AttachSite(this);
  594.     if (m_bAttachWindowPending)
  595.     {
  596.         m_bAttachWindowPending = FALSE;
  597.         m_bDetachWndMsgPending = TRUE;
  598.         // send HX_ATTACH_WINDOW msg to the renderers
  599.         void *  lpParam1 = NULL;
  600.         void *  lpParam2 = NULL;
  601.         HXxEvent event = {HX_ATTACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  602.         m_pUser->HandleEvent(&event);
  603.     }
  604.     /* XXXRA
  605.      * Mac one does scale to full screen and also forces and update message
  606.      * should not need it!
  607.      */
  608.     return HXR_OK;
  609. }
  610. /************************************************************************
  611.  *  Method:
  612.  *    IHXSite::DetachUser
  613.  */
  614. STDMETHODIMP CHXBaseSite::DetachUser()
  615. {
  616.     if (!m_pUser) return HXR_UNEXPECTED;
  617.     /*
  618.      *  SetCapture
  619.      */
  620.     if (m_pTopLevelSite->m_pLastUser == m_pUser)
  621.     {
  622.         m_pTopLevelSite->m_pLastUser = NULL;
  623.     }
  624.     if (m_pTopLevelSite->m_pCaptureUser == m_pUser)
  625.     {
  626.         m_pTopLevelSite->m_pCaptureUser= NULL;
  627.         m_bSetCaptureOn = FALSE;
  628.     }
  629.     if (m_CallbackHandle)
  630.     {
  631.         m_pScheduler->Remove(m_CallbackHandle);
  632.         m_CallbackHandle = 0;
  633.     }
  634.     if (m_ScrollSiteCallbackHandle)
  635.     {
  636.         m_pScheduler->Remove(m_ScrollSiteCallbackHandle);
  637.         m_ScrollSiteCallbackHandle = 0;
  638.     }
  639.     if (m_pUser && m_bDetachWndMsgPending)
  640.     {
  641.         // send HX_DETACH_WINDOW msg to the renderers
  642.         void *  lpParam1 = NULL;
  643.         void *  lpParam2 = NULL;
  644.         HXxEvent event = {HX_DETACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  645.         m_bDetachWndMsgPending = FALSE;
  646.         m_pUser->HandleEvent(&event);
  647.     }
  648.     AddRef();
  649.     if (HXR_OK == m_pUser->DetachSite())
  650.     {
  651.         if (m_pTopLevelSite->m_pKeyBoardFocusUser == m_pUser)
  652.             HX_RELEASE(m_pTopLevelSite->m_pKeyBoardFocusUser);
  653.         HX_RELEASE(m_pUser);
  654.     }
  655.     Release();
  656.     return HXR_OK;
  657. }
  658. /************************************************************************
  659.  *  Method:
  660.  *    IHXSite::GetUser
  661.  */
  662. STDMETHODIMP CHXBaseSite::GetUser(REF(IHXSiteUser*) /*OUT*/ pUser)
  663. {
  664.     if (!m_pUser) return HXR_UNEXPECTED;
  665.     pUser = m_pUser;
  666.     pUser->AddRef();
  667.     return HXR_OK;
  668. }
  669. /************************************************************************
  670.  *  Method:
  671.  *    IHXSite::CreateChild
  672.  */
  673. STDMETHODIMP CHXBaseSite::CreateChild(REF(IHXSite*) /*OUT*/ pChildSite)
  674. {
  675.     _TLSLock();
  676.     HRESULT result = HXR_OK;
  677.     // Create an instance of CHXBaseSite, let it know it's in child
  678.     // window mode.
  679.     CHXBaseSite* pChildSiteWindowless = CHXBaseSite::CreateSite(m_pContext, NULL, m_ChildrenMap.GetCount());
  680.     pChildSiteWindowless->AddRef();
  681.     pChildSiteWindowless->SetParentSite(this);
  682.     pChildSiteWindowless->SetTopLevelSite(m_pTopLevelSite);
  683.     pChildSiteWindowless->SetRootSurface(m_pRootSurface);
  684.     pChildSiteWindowless->SetParentWindow(&m_TopLevelWindow);
  685. #ifdef _WIN32
  686.     //this is to give the windows sites a chance to hook themselves
  687.     //into wm_move madness.
  688.     CHXWinSite* pSiteIt = (CHXWinSite*)pChildSiteWindowless;
  689.     pSiteIt->HookParents();
  690. #endif
  691.     // Get the IHXSite interface from the child to return to the
  692.     // outside world.
  693.     pChildSiteWindowless->QueryInterface(IID_IHXSite, (void**)&pChildSite);
  694.     // Store the CHXBaseSite in a list of child windows, always keep
  695.     //a reference to it.  ExSiteInfo does an AddRef in constructor
  696.     m_ChildrenMap.SetAt(pChildSite, pChildSiteWindowless);
  697.     pChildSite->AddRef();
  698.     //Now add the child into or ZOrder sorted list.
  699.     m_ChildrenInZOrder.AddTail( (void*)pChildSiteWindowless );
  700.     //Set the child's origin
  701.     pChildSiteWindowless->SetOrigin(&m_topleft);
  702.     if(m_pTopLevelSite)
  703.         m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  704.     HXxWindow* pWindow = GetWindow();
  705.     //XXXgfw this focus code is disabled for the beamer release.
  706.     //SafeSetFocus(pWindow);
  707.     _TLSUnlock();
  708.     return HXR_OK;
  709. }
  710. /************************************************************************
  711.  *  Method:
  712.  *    IHXSite::DestroyChild
  713.  */
  714. STDMETHODIMP CHXBaseSite::DestroyChild(IHXSite* /*IN*/ pChildSite)
  715. {
  716.     // Avoid dead-lock in vidsurf2
  717.     LockBlitters();
  718.     FlushSurfaces();
  719.     _TLSLock();
  720.     //Check and see if we are in the YUV Site list. If so, remove ourselves.
  721.     LISTPOSITION pPos = zm_YUVSiteList.Find(this);
  722.     if(pPos)
  723.     {
  724.         zm_YUVSiteList.RemoveAt(pPos);
  725.     }
  726.     //Verify that the site is actually a child site and find its
  727.     //position in the list in the event that it is a child.
  728.     HX_RESULT retVal = HXR_FAIL;
  729.     CHXBaseSite* pChildSiteWindowless=NULL;
  730.     if (m_ChildrenMap.Lookup(pChildSite, (void*&) pChildSiteWindowless))
  731.     {
  732.         m_ChildrenMap.RemoveKey(pChildSite);
  733.         pChildSiteWindowless->Destroy();
  734.         pChildSiteWindowless->SetParentSite(NULL);
  735.         //Remove it from our child z-order list.
  736.         LISTPOSITION pos,posNext = m_ChildrenInZOrder.GetHeadPosition();
  737.         while (posNext)
  738.         {
  739.             pos = posNext;
  740.             CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);
  741.             if( pSite == pChildSiteWindowless )
  742.             {
  743.                 m_ChildrenInZOrder.RemoveAt(pos);
  744.                 while (posNext)
  745.                 {
  746.     pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);
  747.     INT32 zOrder;
  748.     pSite->GetZOrder(zOrder);
  749.     pSite->SetInternalZOrder(zOrder - 1);
  750.                 }
  751.                 break;
  752.             }
  753.         }
  754.         HX_RELEASE(pChildSite);
  755.         HX_RELEASE(pChildSiteWindowless);
  756.         retVal = HXR_OK;
  757.     }
  758.     HX_ASSERT( m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount() );
  759.     if (m_pTopLevelSite==this)
  760.     {
  761.         m_pTopLevelSite->RecomputeClip();
  762.     }
  763.     else
  764.     {
  765.         if (m_pTopLevelSite)
  766.         {
  767.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  768.         }
  769.     }
  770.     _TLSUnlock();
  771.     UnlockBlitters();
  772.     return retVal;
  773. }
  774. /************************************************************************
  775.  *  Method:
  776.  *    IHXSite::AttachWatcher
  777.  */
  778. STDMETHODIMP CHXBaseSite::AttachWatcher(IHXSiteWatcher* /*IN*/ pWatcher)
  779. {
  780.     if (m_pWatcher) return HXR_UNEXPECTED;
  781.     m_pWatcher = pWatcher;
  782.     if (m_pWatcher)
  783.     {
  784.         m_pWatcher->AddRef();
  785.         m_pWatcher->AttachSite(this);
  786.     }
  787.     return HXR_OK;
  788. }
  789. /************************************************************************
  790.  *  Method:
  791.  *    IHXSite::DetachWatcher
  792.  */
  793. STDMETHODIMP CHXBaseSite::DetachWatcher()
  794. {
  795.     if (!m_pWatcher) return HXR_UNEXPECTED;
  796.     m_pWatcher->DetachSite();
  797.     HX_RELEASE(m_pWatcher);
  798.     return HXR_OK;
  799. }
  800. /************************************************************************
  801.  *  Method:
  802.  *    IHXSite::SetSize
  803.  */
  804. STDMETHODIMP CHXBaseSite::SetSize(HXxSize size)
  805. {
  806.     HX_RESULT ret = HXR_OK;
  807.     _TLSLock();
  808.     if (_AtSystemTime())
  809.     {
  810.         m_pTopLevelSite->ExecutePendingTasks();
  811.         ret = _SafeSetSize(size);
  812.         _TLSUnlock();
  813.         return ret;
  814.     }
  815.     PendingTask* pPendingTask = new PendingTask( ONSETSIZE,
  816.                                                  this,
  817.                                                  (void*)size.cx,
  818.                                                  (void*)size.cy,
  819.                                                  (void*)NULL,
  820.                                                  (void*)NULL,
  821.                                                  (void*)NULL,
  822.                                                  (void*)NULL
  823.                                                  );
  824.     m_pTopLevelSite->m_PendingTaskList.AddTail((void*) pPendingTask);
  825.     m_pTopLevelSite->ScheduleCallback(MOUSE, 0);
  826.     _TLSUnlock();
  827.     return TRUE;
  828. }
  829. /************************************************************************
  830.  *  Method:
  831.  *    IHXSite::SetSize
  832.  */
  833. HX_RESULT CHXBaseSite::_SafeSetSize(HXxSize size)
  834. {
  835.     _TLSLock();
  836.     HRESULT hres = HXR_OK;
  837.     CHXSimpleList::Iterator i;
  838.     size.cx = size.cx<0?0:size.cx;
  839.     size.cy = size.cy<0?0:size.cy;
  840.     //Fix up sizes for full screen. Some renderes, MPEG, will get very
  841.     //late setsize calls. If we get a setsize call after we have gone
  842.     //to fullscreen, we need to readjust our full screen window.
  843.     if( IsFullScreen() && this==m_pTopLevelSite )
  844.     {
  845.         double stretchRatio = 0;
  846.         double xRatio       = 0;
  847.         double yRatio       = 0;
  848.         UINT16 newBitsPerPixel = 0;
  849.         UINT16 nHozRes      = 0;
  850.         UINT16 nVertRes     = 0;
  851.         _GetDeviceCaps(NULL, newBitsPerPixel, nHozRes, nVertRes);
  852.         if(m_bPostageStamp)
  853.         {
  854.             if( m_windowSize.cx*2 <= nHozRes &&
  855.                 m_windowSize.cy*2 <= nVertRes)
  856.             {
  857.                 xRatio  = yRatio = 2.0;
  858.             }
  859.             else
  860.             {
  861.                 xRatio  = yRatio = 1.0;
  862.             }
  863.         }
  864.         else
  865.         {
  866.             xRatio = (double)nHozRes  / (double)size.cx ;
  867.             yRatio = (double)nVertRes / (double)size.cy ;
  868.         }
  869.         if (xRatio<yRatio)
  870.             stretchRatio = xRatio;
  871.         else
  872.             stretchRatio = yRatio;
  873.         if( m_bPostageStamp )
  874.         {
  875.             size.cx = (int) ((double) m_windowSize.cx * stretchRatio + 0.5);
  876.             size.cy = (int) ((double) m_windowSize.cy * stretchRatio + 0.5);
  877.         }
  878.         else
  879.         {
  880.             size.cx = (int) ((double) size.cx * stretchRatio + 0.5);
  881.             size.cy = (int) ((double) size.cy * stretchRatio + 0.5);
  882.         }
  883. #if !defined(_UNIX) || defined(_MAC_UNIX)
  884.         m_screenOffset.x = (nHozRes  - size.cx)/2;
  885.         m_screenOffset.y = (nVertRes - size.cy)/2;
  886. #endif
  887.     }
  888.     //before we do anything, we give the SiteWatcher a chance to
  889.     //influence this operation.
  890.     if (m_pWatcher)
  891.     {
  892.         hres = m_pWatcher->ChangingSize(m_size, size);
  893.     }
  894.     //Get rid of our last alpha blend region as it is the wrong size
  895.     //now....
  896.     HX_FREE( m_pVideoSurface->m_pucLastImage );
  897.     if (HXR_OK == hres )
  898.     {
  899.         //We must invalidate our rect.....
  900.         HXxRect pTmp = { m_topleft.x,
  901.                          m_topleft.y,
  902.                          m_topleft.x+m_size.cx,
  903.                          m_topleft.y+m_size.cy};
  904.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  905.         m_size = size;
  906.         // iterate child site list
  907.         for(i=m_PassiveSiteWatchers.Begin(); i!= m_PassiveSiteWatchers.End(); ++i)
  908.         {
  909.             ((IHXPassiveSiteWatcher*) *i)->SizeChanged(&m_size);
  910.         }
  911.         if( m_pWindow && m_pWindow->window &&
  912.             (m_pTopLevelSite!=this || m_bWindowCreatedByCreate ) )
  913.         {
  914.             _SetSize(size);
  915.         }
  916.         //Handle scrolling..
  917.         if( m_pValues )
  918.         {
  919.             ULONG32 bScroll = FALSE;
  920.             m_pValues->GetPropertyULONG32("ScrollingSite", bScroll);
  921.             if (bScroll)
  922.             {
  923.                 SetXSliderRange(size.cx);
  924.                 SetYSliderRange(size.cy);
  925.                 m_bScrollingSite = TRUE;
  926.             }
  927.         }
  928.         //We must invalidate our rect after the resize also..
  929.         HXxRect pTmp2 = { m_topleft.x,
  930.                           m_topleft.y,
  931.                           m_topleft.x+m_size.cx,
  932.                           m_topleft.y+m_size.cy};
  933.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp2, TRUE );
  934.     }
  935.     if (this == m_pTopLevelSite && m_pStatusText)
  936.     {
  937.         m_pStatusText->ParentChangedSize();
  938.     }
  939.     if (m_pTopLevelSite==this)
  940.     {
  941.         m_pTopLevelSite->RecomputeClip();
  942.     }
  943.     else
  944.     {
  945.         if(m_pTopLevelSite)
  946.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  947.     }
  948.     if( this == m_pTopLevelSite && m_pStatusText )
  949.     {
  950.         m_pStatusText->ParentChangedSize();
  951.     }
  952.     //XXXgfw Don't know where to really do this work. It must be after
  953.     //the site is created and smil can set these values but before we
  954.     //handle events.
  955.     //Get sensitivity setting for mouse clicks.  Only do this
  956.     //once per site on the first event.  If 'sensitivity'
  957.     //isn't set by then too bad.
  958.     if( m_nEventSensitivity==SENSITIVITY_NOT_SET )
  959.     {
  960.         //opaque is the default set by the W3C working group.
  961.         m_nEventSensitivity = SENSITIVITY_OPAQUE;
  962.         if( m_pValues )
  963.         {
  964.             IHXBuffer* pBuf = NULL;
  965.             m_pValues->GetPropertyCString( "sensitivity", pBuf );
  966.             if( pBuf )
  967.             {
  968.                 const char* pszBuff = (const char*)pBuf->GetBuffer();
  969.                 if( pszBuff)
  970.                 {
  971.                     //m_nEventSensitivity is in alpha values [0,255]
  972.                     if( strcmp( pszBuff, "transparent" )==0 )
  973.                     {
  974.                         m_nEventSensitivity = SENSITIVITY_TRANSPARENT;
  975.                     }
  976.                     else if( strcmp( pszBuff, "opaque" )==0 )
  977.                     {
  978.                         m_nEventSensitivity = SENSITIVITY_OPAQUE;
  979.                     }
  980.                     else
  981.                     {
  982.                         double sen = ::atof( pszBuff );
  983.                         if( sen < 0 )
  984.                             sen = 0;
  985.                         if( sen > 100 )
  986.                             sen = 100;
  987.                         //Scale percentages to [0,255]
  988.                         m_nEventSensitivity = 255-(int)(sen*255.0/100.0+0.5);
  989.                     }
  990.                 }
  991.                 HX_RELEASE(pBuf);
  992.             }
  993.         }
  994.     }
  995.     _TLSUnlock();
  996.     return hres;
  997. }
  998. /************************************************************************
  999.  *  Method:
  1000.  *    IHXSite::SetPosition
  1001.  */
  1002. STDMETHODIMP CHXBaseSite::SetPosition(HXxPoint position)
  1003. {
  1004.     HX_RESULT ret = HXR_OK;
  1005.     _TLSLock();
  1006.     if (_AtSystemTime())
  1007.     {
  1008.         m_pTopLevelSite->ExecutePendingTasks();
  1009.         ret = _SafeSetPosition(position);
  1010.         _TLSUnlock();
  1011.         return ret;
  1012.     }
  1013.     PendingTask* pPendingTask = new PendingTask(ONSETPOSITION,
  1014.                                                 this, (void*) position.x,
  1015.                                                 (void*) position.y,
  1016.                                                 (void*) NULL,
  1017.                                                 (void*) NULL,
  1018.                                                 (void*) NULL,
  1019.                                                 (void*) NULL);
  1020.     m_pTopLevelSite->m_PendingTaskList.AddTail((void*) pPendingTask);
  1021.     m_pTopLevelSite->ScheduleCallback(MOUSE, 0);
  1022.     _TLSUnlock();
  1023.     return TRUE;
  1024. }
  1025. HX_RESULT CHXBaseSite::_SafeSetPosition(HXxPoint position)
  1026. {
  1027.     _TLSLock();
  1028.     HRESULT hres = HXR_OK;
  1029.     CHXSimpleList::Iterator i;
  1030.     CHXMapPtrToPtr::Iterator j;
  1031.     //Before we do anything, we give the SiteWatcher a chance to
  1032.     //influence this operation.
  1033.     if (m_pWatcher)
  1034.     {
  1035.         hres = m_pWatcher->ChangingPosition(m_position, position);
  1036.     }
  1037. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  1038.     if (this == m_pTopLevelSite)
  1039.     {
  1040.         // xxxbobclark
  1041.         // For the Mac, the top-level site is moved by adjusting
  1042.         // its HXxWindow's x and y values. If we go ahead and
  1043.         // change m_position, it can screw up situations like the
  1044.         // embedded player where it DOES call SetPosition on the
  1045.         // top-level site to move it in its window.
  1046.         _TLSUnlock();
  1047.         return HXR_OK;
  1048.     }
  1049. #endif
  1050.     if (HXR_OK == hres)
  1051.     {
  1052.         //Damage The old position....
  1053.         HXxRect pTmp = { m_topleft.x,
  1054.                          m_topleft.y,
  1055.                          m_topleft.x+m_size.cx,
  1056.                          m_topleft.y+m_size.cy};
  1057.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  1058.         if(!m_bWindowCreatedByCreate )
  1059.         {
  1060.             // if we've created the window we don't want to move the site
  1061.             // just the window
  1062.             m_position     = position;
  1063.             m_positionOrig = m_position;
  1064.         }
  1065.         //fixup our top left
  1066.         ResetOrigin();
  1067.         //iterate passive site watcher list
  1068.         for(i=m_PassiveSiteWatchers.Begin(); i!= m_PassiveSiteWatchers.End(); ++i)
  1069.         {
  1070.             ((IHXPassiveSiteWatcher*) *i)->PositionChanged(&m_position);
  1071.         }
  1072.         if( m_pWindow &&
  1073.             m_pWindow->window &&
  1074.             (m_pTopLevelSite!=this || m_bWindowCreatedByCreate )
  1075.             )
  1076.         {
  1077.             m_CreateWindowPos = position;
  1078.             _SetPosition(position);
  1079.         }
  1080.     }
  1081.     //We must first remove our old dirty region because we moved and
  1082.     //we could get negative offsets...
  1083.     HXxRect pTmp2 = { m_topleft.x,
  1084.                       m_topleft.y,
  1085.                       m_topleft.x+m_size.cx,
  1086.                       m_topleft.y+m_size.cy};
  1087.     m_pTopLevelSite->_RecursiveDamageRect( &pTmp2, TRUE );
  1088.     if (m_pTopLevelSite==this)
  1089.     {
  1090.         m_pTopLevelSite->RecomputeClip();
  1091.     }
  1092.     else
  1093.     {
  1094.         if (m_pTopLevelSite)
  1095.         {
  1096.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  1097.         }
  1098.     }
  1099.     m_pVideoSurface->UpdateDestRect();
  1100.     _TLSUnlock();
  1101.     return hres;
  1102. }
  1103. /************************************************************************
  1104.  *  Method:
  1105.  *    IHXSite::GetSize
  1106.  */
  1107. STDMETHODIMP CHXBaseSite::GetSize(REF(HXxSize) size)
  1108. {
  1109.     size = m_size;
  1110.     //XXXgfw what???????? why change it after assignment???
  1111. //     m_pValues->GetPropertyULONG32("MediaSizeX", (ULONG32&) ttt.cx);
  1112. //     m_pValues->GetPropertyULONG32("MediaSizeY", (ULONG32&) ttt.cy);
  1113.     return HXR_OK;
  1114. }
  1115. /************************************************************************
  1116.  *  Method:
  1117.  *    IHXSite::GetPosition
  1118.  */
  1119. STDMETHODIMP CHXBaseSite::GetPosition(REF(HXxPoint) position)
  1120. {
  1121.     position = m_position;
  1122.     return HXR_OK;
  1123. }
  1124. //
  1125. // CHXBaseSite::DamageRect()
  1126. //
  1127. // All incoming coordinates are SITE relative...
  1128. //
  1129. STDMETHODIMP CHXBaseSite::DamageRect(HXxRect rect)
  1130. {
  1131. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  1132.     _TLSLock();
  1133. #endif
  1134.     HXRECTANGLE rectTmp;
  1135.     HXxPoint* pOrigin = GetOrigin();
  1136.     //Crop
  1137.     if( rect.left < 0 )
  1138.         rect.left = 0;
  1139.     if( rect.top < 0 )
  1140.         rect.top = 0;
  1141.     if( rect.right > m_size.cx )
  1142.         rect.right = m_size.cx;
  1143.     if( rect.bottom > m_size.cy )
  1144.         rect.bottom = m_size.cy;
  1145.     //Translate rect to window coordinates.
  1146.     rect.left   += pOrigin->x;
  1147.     rect.right  += pOrigin->x;
  1148.     rect.top    += pOrigin->y;
  1149.     rect.bottom += pOrigin->y;
  1150.     rectTmp.x      = (short)rect.left;
  1151.     rectTmp.y      = (short)rect.top;
  1152.     rectTmp.width  = (short)(rect.right-rect.left);
  1153.     rectTmp.height = (short)(rect.bottom-rect.top);
  1154.     HXUnionRectWithRegion( &rectTmp, m_pDirtyRegion, m_pDirtyRegion);
  1155.     //Do OS specific stuff here.
  1156.     _DamageRect(rect);
  1157. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  1158.     _TLSUnlock();
  1159. #endif
  1160.     return HXR_OK;
  1161. }
  1162. //This is the same as DamageRect except that the coordinates are in
  1163. //Window relative coords and we don't do the OS specific stuff (like
  1164. //no invalidateRect.
  1165. void CHXBaseSite::DamageRectWindowRel(HXxRect rect)
  1166. {
  1167.     HXxPoint* pPosition = GetOrigin();
  1168.     //Crop
  1169.     HXREGION* pReg = HXCreateRectRegion( rect.left,
  1170.                                          rect.top,
  1171.                                          rect.right-rect.left,
  1172.                                          rect.bottom-rect.top
  1173.                                          );
  1174.     //Find out what part intersects us.
  1175.     HXREGION*   pTemp = Transition( pPosition->x, pPosition->y,
  1176.                                     pPosition->x + m_size.cx,
  1177.                                     pPosition->y + m_size.cy
  1178.                                     );
  1179.     HXIntersectRegion( pTemp, pReg, pReg );
  1180.     if( !HXEmptyRegion(pReg) )
  1181.     {
  1182.         HXUnionRegion( pReg, m_pDirtyRegion, m_pDirtyRegion);
  1183.         // We must call _DamageRect to give windows a chance to see if
  1184.         // we are occluded by a drop down menu. If we are, then we
  1185.         // have to invalidate the OS rect so Windows does not do a
  1186.         // save under.
  1187.         HXxRect rectTmp =
  1188.             {pTemp->extents.x1, pTemp->extents.y1, pTemp->extents.x2, pTemp->extents.y2};
  1189.         _DamageRect(rectTmp);
  1190.     }
  1191.     HXDestroyRegion( pReg );
  1192.     HXDestroyRegion( pTemp );
  1193. }
  1194. /************************************************************************
  1195.  *  Method:
  1196.  *    IHXSite::DamageRegion
  1197.  */
  1198. STDMETHODIMP CHXBaseSite::DamageRegion(HXxRegion region)
  1199. {
  1200.     HX_ASSERT( "Depricated method, do not use. Use the new damage region." == NULL );
  1201.     //This was never used and it was not defined what a HXxRegion was.
  1202.     //So, we just have to invalidate the whole site.
  1203.     //Users should use the new damage region that takes the cross platform
  1204.     //region that actually works.
  1205.     HXxRect rect;
  1206.     HXREGION* reg = (HXREGION*)region;
  1207.     rect.left   = 0;
  1208.     rect.top    = 0;
  1209.     rect.right  = m_size.cx;
  1210.     rect.bottom = m_size.cy;
  1211.     return DamageRect( rect );
  1212. }
  1213. // Method:
  1214. //    IHXSite::ForceRedraw
  1215. STDMETHODIMP CHXBaseSite::ForceRedraw()
  1216. {
  1217.     HXxEvent event;
  1218.     HXxWindow* hxxWin = GetWindow();
  1219.     if( IsCompositionLocked() && m_pVideoSurface->m_nBltMode!=HX_OVERLAY_BLT )
  1220.     {
  1221.         return HXR_OK;
  1222.     }
  1223.     // make sure we have a visible window event though this should be
  1224.     // computed from the list of rects.
  1225.     if (!_ShouldEnterForceRedraw())
  1226.     {
  1227.         return HXR_OK;
  1228.     }
  1229.     _TLSLock();
  1230.     AddRef();
  1231.     memset(&m_UpdateBltStatsRect, 0, sizeof(m_UpdateBltStatsRect));
  1232.     if(m_pTopLevelSite->m_bDisableForceRedraw)
  1233.     {
  1234.         m_pTopLevelSite->m_bDisableForceRedraw = TRUE;
  1235.     }
  1236.     else
  1237.     {
  1238.         BOOL bDoIt =
  1239.             ((m_bIsVisible && m_pUser && m_Region && !HXEmptyRegion(m_Region)) ||
  1240.              (m_AlphaBlendNotifiers.GetCount()!=0 || m_AlphaBlendSites.GetCount()!=0));
  1241.         if( bDoIt )
  1242.         {
  1243.             AboutToBlt();
  1244.             event.handled = 0;
  1245.             if( m_bUserWantsSubRects )
  1246.             {
  1247.                 if( !HXEmptyRegion(m_pDirtyRegion) )
  1248.                 {
  1249.                     HXxExposeInfo exposeInfo;
  1250.                     HXxBoxRegion    dirtRegion;
  1251.                     //Construct a dirty rect that is relative to the
  1252.                     //site's topleft corner.
  1253.                     HXREGION* pTmpReg = HXCreateRegion();
  1254.                     HXUnionRegion( pTmpReg, m_pDirtyRegion, pTmpReg );
  1255.                     HXOffsetRegion( pTmpReg, -m_topleft.x, -m_topleft.y );
  1256.                     // adjust for scrolling; essentially turning off
  1257.                     // subrect blitting while scrolling
  1258.                     if (GetXSliderPos() || GetYSliderPos())
  1259.                     {
  1260. HXREGION* pMe = HXCreateRectRegion( 0,
  1261. 0,
  1262. m_size.cx,
  1263. m_size.cy
  1264. );
  1265. HXUnionRegion(pMe, pTmpReg, pTmpReg);
  1266. HXDestroyRegion(pMe);
  1267.                     }
  1268.                     //Set up the cross platform region.
  1269.                     dirtRegion.numRects = pTmpReg->numRects;
  1270.                     dirtRegion.rects    = pTmpReg->rects;
  1271.                     exposeInfo.extents.left    = pTmpReg->extents.x1;
  1272.                     exposeInfo.extents.right   = pTmpReg->extents.x2;
  1273.                     exposeInfo.extents.top     = pTmpReg->extents.y1;
  1274.                     exposeInfo.extents.bottom  = pTmpReg->extents.y2;
  1275.                     exposeInfo.pRegion         = & dirtRegion;
  1276.                     exposeInfo.pWindow         = GetWindow();
  1277.                     exposeInfo.pParam1         = NULL;
  1278.                     exposeInfo.pParam2         = NULL;
  1279.                     event.event   = HX_SURFACE_UPDATE2;
  1280.                     event.window  = hxxWin?hxxWin->window : NULL;
  1281.                     event.param1  = m_pVideoSurface;
  1282.                     event.param2  = &exposeInfo;
  1283.                     event.result  = 0;
  1284.                     event.handled = 0;
  1285.                     // Clear the dirty region
  1286.                     HXZeroOutRegion( m_pDirtyRegion );
  1287.                     if( m_pUser )
  1288.                     {
  1289.                         if (!m_bDoNotGenerateWMPPaint)
  1290.                         {
  1291.                             m_bInForceRedraw = m_bSiteRefresh;
  1292.                             m_pUser->HandleEvent(&event);
  1293.                             m_bInForceRedraw = FALSE;
  1294.                         }
  1295.                     }
  1296.                     HXDestroyRegion( pTmpReg );
  1297.                 }
  1298.             }
  1299.             else
  1300.             {
  1301. //XXXgfw OK, this is screwed up. Windows renders want a rectangle in
  1302. //XXXgfw param2 while the unix renderers want a Window there. To clean this
  1303. //XXXgfw up we need to clean up and unify the renderers.....
  1304. #if defined(_UNIX) && !defined(_MAC_UNIX)
  1305.                 event.event   = HX_SURFACE_UPDATE;
  1306.                 event.window  = hxxWin?hxxWin->window : NULL;
  1307.                 event.param1  = m_pVideoSurface;
  1308.                 event.param2  = GetWindow();
  1309.                 event.result  = 0;
  1310.                 event.handled = 0;
  1311. #else
  1312.                 event.event   = HX_SURFACE_UPDATE;
  1313.                 event.window  = m_pWindow? m_pWindow->window : NULL;
  1314.                 event.param1  = m_pVideoSurface;
  1315.                 event.param2  = NULL;
  1316.                 event.result  = 0;
  1317.                 event.handled = 0;
  1318. #endif
  1319.                 // Clear the dirty region
  1320.                 HXZeroOutRegion( m_pDirtyRegion );
  1321.                 if( m_pUser )
  1322.                 {
  1323.                     if (!m_bDoNotGenerateWMPPaint)
  1324.                     {
  1325.                         // Distinguishes between a new frame and a repaint of a prior frame
  1326.                         m_bInForceRedraw = m_bSiteRefresh;
  1327.                         m_pUser->HandleEvent(&event);
  1328.                         m_bInForceRedraw = FALSE;
  1329.                     }
  1330.                 }
  1331.             }
  1332.             // If blt has never been called, then blt black to the
  1333.             // background.  Do not do this if we are a windowed
  1334.             // renderer.
  1335.             if (!event.handled && !m_bBltHasBeenCalled
  1336.                 && !m_pWindow && m_pVideoSurface->m_nBltMode!=HX_OVERLAY_BLT )
  1337.             {
  1338.                 // Get the current size of the site The source rect is
  1339.                 // just a 1 by 1 black pixel that gets stretched to
  1340.                 // fit the destination
  1341.                 HXxRect rDestRect   = { 0, 0, m_size.cx, m_size.cy};
  1342.                 HXxRect rSrcRect    = { 0, 0, 1, 1};
  1343.                 HXBitmapInfoHeader bih;
  1344.                 memset(&bih, 0, sizeof(HXBitmapInfoHeader));
  1345.                 bih.biSize          = sizeof(HXBitmapInfoHeader);
  1346.                 bih.biWidth         = 1;
  1347.                 bih.biHeight        = 1;
  1348.                 bih.biPlanes        = 1;
  1349.                 bih.biBitCount      = 32;
  1350.                 bih.biCompression   = HX_RGB;
  1351.                 UCHAR pBuffer[4] = { 0,0,0,0 };
  1352.                 m_pVideoSurface->Blt(pBuffer,
  1353.                                      &bih,
  1354.                                      rDestRect,
  1355.                                      rSrcRect);
  1356.                 m_bBltHasBeenCalled = FALSE;
  1357.             }
  1358.             //Stupid Windowed renderers!
  1359.             if(!m_bDoNotGenerateWMPPaint &&
  1360.                !event.handled            &&
  1361.                m_pWindow                 &&
  1362.                m_pWindow->window )
  1363.             {
  1364.                 _SendOSUpdateMessage();
  1365.             }
  1366.         }
  1367.         m_pVideoSurface->UpdateBltStats(&m_UpdateBltStatsRect);
  1368.     }
  1369.     _TLSUnlock();
  1370.     _ExitForceRedraw();
  1371.     Release();
  1372.     return HXR_OK;
  1373. }
  1374. /************************************************************************
  1375.  *  Method:
  1376.  *    IHXSite2::UpdateSiteWindow
  1377.  *
  1378.  *      Not used on Windows platform
  1379.  */
  1380. STDMETHODIMP CHXBaseSite::UpdateSiteWindow
  1381. (
  1382.     HXxWindow* /*IN*/ pWindow
  1383.     )
  1384. {
  1385.     return HXR_NOTIMPL;
  1386. }
  1387. /************************************************************************
  1388.  *  Method:
  1389.  *    IHXSite2::ShowSite
  1390.  */
  1391. STDMETHODIMP CHXBaseSite::ShowSite(BOOL bShow)
  1392. {
  1393.     _TLSLock();
  1394.     if(m_bIsVisible != bShow)
  1395.     {
  1396.         m_bIsVisible = bShow;
  1397.         //Invalidate the rect....
  1398.         HXxRect pTmp = { m_topleft.x,
  1399.                          m_topleft.y,
  1400.                          m_topleft.x+m_size.cx,
  1401.                          m_topleft.y+m_size.cy};
  1402.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  1403.         if( this == m_pTopLevelSite )
  1404.         {
  1405.             RecomputeClip();
  1406.         }
  1407.         else
  1408.         {
  1409.             if(m_pTopLevelSite)
  1410.                 m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  1411.         }
  1412.     }
  1413.     _ShowSite(bShow);
  1414.     SizeSliders();
  1415.     _TLSUnlock();
  1416.     return HXR_OK;
  1417. }
  1418. void CHXBaseSite::_ForceRedrawAll()
  1419. {
  1420.     if( (IsSiteVisible() && m_Region && !HXEmptyRegion(m_Region)) ||
  1421.         (m_AlphaBlendSites.GetCount()||m_AlphaBlendNotifiers.GetCount() )
  1422.         )
  1423.     {
  1424. //         HXREGION* pReg = NULL;
  1425. //         if( pDirtyRect)
  1426. //         {
  1427. //             pReg = HXCreateRectRegion( pDirtyRect->left,
  1428. //                                         pDirtyRect->top,
  1429. //                                         pDirtyRect->right-pDirtyRect->left,
  1430. //                                         pDirtyRect->bottom-pDirtyRect->top );
  1431. //             HXIntersectRegion( m_Region, pReg, pReg );
  1432. //             HXUnionRegion( m_pDirtyRegion, pReg, m_pDirtyRegion );
  1433. //             HXDestroyRegion( pReg );
  1434. //         }
  1435. //         else
  1436. //         {
  1437. //            HXUnionRegion( m_pDirtyRegion, m_Region, m_pDirtyRegion );
  1438. //        }
  1439.         InternalForceRedraw();
  1440.     }
  1441.     //Now do all the children in z-order
  1442.     LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition();
  1443.     while(pos)
  1444.     {
  1445.         CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(pos);
  1446.         pSite->_ForceRedrawAll();
  1447.     }
  1448. }
  1449. BOOL CHXBaseSite::_CheckForVisibleChild()
  1450. {
  1451.     BOOL retVal = FALSE;
  1452.     if( m_bIsVisible && !m_bSiteNeverBlts )
  1453.     {
  1454.         retVal = TRUE;
  1455.     }
  1456.     else
  1457.     {
  1458.         LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition();
  1459.         while(pos)
  1460.         {
  1461.             CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(pos);
  1462.             if( pSite->_CheckForVisibleChild() )
  1463.             {
  1464.                 retVal = TRUE;
  1465.                 break;
  1466.             }
  1467.         }
  1468.     }
  1469.     return retVal;
  1470. }
  1471. /************************************************************************
  1472.  *  Method:
  1473.  *    IHXSite2::IsSiteVisible
  1474.  */
  1475. STDMETHODIMP_(BOOL) CHXBaseSite::IsSiteVisible()
  1476. {
  1477.     BOOL bIsVisible = m_bIsVisible;
  1478.     if(m_pParentSite)
  1479.     {
  1480.         bIsVisible &= m_pParentSite->IsSiteVisible();
  1481.     }
  1482.     if( bIsVisible )
  1483.     {
  1484.         //If we are a m_bSiteNeverBlts then it doesn't matter if we are
  1485.         //visible or not, we must have at least one child that is
  1486.         //visible and not m_bSiteNeverBlts. Otherwise we really aren't
  1487.         //visible at all. This distinction is needed because of our
  1488.         //favorite logic in computesubrecs not that we have transparent
  1489.         //regions.
  1490.         if(!_CheckForVisibleChild())
  1491.         {
  1492.             bIsVisible = FALSE;
  1493.         }
  1494.     }
  1495.     return bIsVisible;
  1496. }
  1497. /************************************************************************
  1498.  *  Method:
  1499.  *    IHXSite2::UpdateZOrder
  1500.  *    This method updates the Z order of its child sites since one of its
  1501.  *    child sites' Z order is being updated.
  1502.  */
  1503. void
  1504. CHXBaseSite::UpdateZOrder( CHXBaseSite* pUpdatedChildSite, INT32 lOldZOrder, INT32 lNewZOrder)
  1505. {
  1506.     HX_ASSERT(pUpdatedChildSite);
  1507.     LISTPOSITION pos = m_ChildrenInZOrder.Find((void*)pUpdatedChildSite);
  1508.     if (!pos)
  1509.     {
  1510. return;
  1511.     }
  1512.     m_ChildrenInZOrder.RemoveAt(pos);
  1513.     BOOL bHasReinsertedChild = FALSE;
  1514.     INT32 zOrder = 0;
  1515.     INT32 newZOrder = 0;
  1516.     LISTPOSITION posNext = m_ChildrenInZOrder.GetHeadPosition();
  1517.     while (posNext)
  1518.     {
  1519. pos = posNext;
  1520. CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);
  1521. if (!bHasReinsertedChild)
  1522. {
  1523.     pSite->GetZOrder(zOrder);
  1524.     if (zOrder > lNewZOrder)
  1525.     {
  1526. m_ChildrenInZOrder.InsertBefore(pos, (void*)pUpdatedChildSite);
  1527. bHasReinsertedChild = TRUE;
  1528. pUpdatedChildSite->SetInternalZOrder(newZOrder++);
  1529.     }
  1530. }
  1531. pSite->SetInternalZOrder(newZOrder++);
  1532.     }
  1533.     if (!bHasReinsertedChild)
  1534.     {
  1535. m_ChildrenInZOrder.AddTail((void*)pUpdatedChildSite);
  1536. pUpdatedChildSite->SetInternalZOrder(newZOrder++);
  1537.     }
  1538.     HX_ASSERT((newZOrder == m_ChildrenInZOrder.GetCount()) &&
  1539. (m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount()));
  1540. }
  1541. /************************************************************************
  1542.  *  Method:
  1543.  *    IHXSite2::SetZOrder
  1544.  */
  1545. STDMETHODIMP CHXBaseSite::SetZOrder(INT32 lZOrder)
  1546. {
  1547.     if(!m_pParentSite)
  1548.     {
  1549.         return HXR_UNEXPECTED;
  1550.     }
  1551.     _TLSLock();
  1552.     if (lZOrder == -1)
  1553.     {
  1554.         lZOrder = m_pParentSite->GetNumberOfChildSites() - 1;
  1555.     }
  1556.     if (lZOrder >= (INT32) m_pParentSite->GetNumberOfChildSites())
  1557.     {
  1558.         lZOrder = m_pParentSite->GetNumberOfChildSites() - 1;
  1559.     }
  1560.     if (m_lZOrder != lZOrder)
  1561.     {
  1562.         m_pParentSite->UpdateZOrder(this, m_lZOrder, lZOrder);
  1563.         //Invalidate the rect....
  1564.         if( m_pTopLevelSite )
  1565.         {
  1566.             HXxRect pTmp = { m_topleft.x,
  1567.                              m_topleft.y,
  1568.                              m_topleft.x+m_size.cx,
  1569.                              m_topleft.y+m_size.cy};
  1570.             m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  1571.         }
  1572.     }
  1573.     if( this == m_pTopLevelSite)
  1574.     {
  1575.         RecomputeClip();
  1576.     }
  1577.     else
  1578.     {
  1579.         if (m_pTopLevelSite)
  1580.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  1581.     }
  1582.     _TLSUnlock();
  1583.     return HXR_OK;
  1584. }
  1585. /************************************************************************
  1586.  *  Method:
  1587.  *    IHXSite2::GetZOrder
  1588.  */
  1589. STDMETHODIMP CHXBaseSite::GetZOrder(REF(INT32) lZOrder)
  1590. {
  1591.     lZOrder = m_lZOrder;
  1592.     HX_ASSERT(m_lZOrder> -1 && m_lZOrder< 2000);
  1593.     return HXR_OK;
  1594. }
  1595. /************************************************************************
  1596.  *  Method:
  1597.  *    IHXSite2::MoveSiteToTop
  1598.  */
  1599. STDMETHODIMP CHXBaseSite::MoveSiteToTop()
  1600. {
  1601.     SetZOrder(-1); //-1 means the top.
  1602.     return HXR_OK;
  1603. }
  1604. //IHXSubRectSite::GetSubRectVideoSurface()
  1605. STDMETHODIMP CHXBaseSite::GetSubRectVideoSurface( REF(IHXSubRectVideoSurface*) pSurface )
  1606. {
  1607.     HX_RESULT res = HXR_FAIL;
  1608.     if (m_pVideoSurface)
  1609.     {
  1610.         res = m_pVideoSurface->QueryInterface(IID_IHXSubRectVideoSurface,
  1611.                                               (void**)&pSurface);
  1612.     }
  1613.     return res;
  1614. }
  1615. /************************************************************************
  1616.  *  Method:
  1617.  *    IHXSite2::GetVideoSurface
  1618.  */
  1619. STDMETHODIMP CHXBaseSite::GetVideoSurface(REF(IHXVideoSurface*) pSurface)
  1620. {
  1621.     HX_RESULT res = HXR_FAIL;
  1622.     if (m_pVideoSurface)
  1623.     {
  1624.         res = m_pVideoSurface->QueryInterface(IID_IHXVideoSurface,
  1625.                                               (void**)&pSurface);
  1626.     }
  1627.     return res;
  1628. }
  1629. /************************************************************************
  1630.  *  Method:
  1631.  *    IHXSite2::GetNumberOfChildSites
  1632.  *            and
  1633.  *    IHXSiteTreeNavigation::GetNumberOfChildSites
  1634.  */
  1635. STDMETHODIMP_(UINT32) CHXBaseSite::GetNumberOfChildSites()
  1636. {
  1637.     HX_ASSERT( m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount() );
  1638.     return (UINT32)m_ChildrenMap.GetCount();
  1639. }
  1640. /************************************************************************
  1641.  *  Method:
  1642.  *    IHXSite2::AddPassiveSiteWatcher
  1643.  */
  1644. STDMETHODIMP CHXBaseSite::AddPassiveSiteWatcher(IHXPassiveSiteWatcher* pWatcher)
  1645. {
  1646.     pWatcher->AddRef();
  1647.     m_PassiveSiteWatchers.AddTail(pWatcher);
  1648.     return HXR_OK;
  1649. }
  1650. /************************************************************************
  1651.  *  Method:
  1652.  *    IHXSite2::RemovePassiveSiteWatcher
  1653.  */
  1654. STDMETHODIMP CHXBaseSite::RemovePassiveSiteWatcher(IHXPassiveSiteWatcher* pWatcher)
  1655. {
  1656.     // iterate child site list
  1657.     IHXPassiveSiteWatcher* pThisWatcher = NULL;
  1658.     LISTPOSITION pPos = m_PassiveSiteWatchers.Find(pWatcher);
  1659.     HX_RESULT retVal = HXR_FAIL;
  1660.     if (pPos)
  1661.     {
  1662.         m_PassiveSiteWatchers.RemoveAt(pPos);
  1663.         HX_RELEASE(pWatcher);
  1664.         retVal = HXR_OK;
  1665.     }
  1666.     return retVal;
  1667. }
  1668. #if defined(_DEBUG) && !defined(_MACINTOSH) && !defined(_MAC_UNIX)
  1669. void _PrintKeyboardEventInfo(HXxEvent* pEvent )
  1670. {
  1671.     char szBuff[256]; /* Flawfinder: ignore */
  1672.     if( pEvent->event == HX_CHAR )
  1673.         _DumpString( "HX_CHAR     " );
  1674.     if( pEvent->event == HX_KEY_DOWN )
  1675.         _DumpString( "HX_KEY_DOWN " );
  1676.     if( pEvent->event == HX_KEY_UP )
  1677.         _DumpString( "HX_KEY_UP   " );
  1678.     if( ((UINT32)pEvent->param2)&HX_VIRTUAL_KEY_MASK )
  1679.     {
  1680.         _DumpString( " key: " );
  1681.         switch((UINT32)pEvent->param1 )
  1682.         {
  1683.            case HX_VK_LBUTTON       :
  1684.                _DumpString( "HX_VK_LBUTTON   ");
  1685.                break;
  1686.            case HX_VK_RBUTTON       :
  1687.                _DumpString( "HX_VK_RBUTTON   ");
  1688.                break;
  1689.            case HX_VK_CANCEL        :
  1690.                _DumpString( "HX_VK_CANCEL    ");
  1691.                break;
  1692.            case HX_VK_MBUTTON       :
  1693.                _DumpString( "HX_VK_MBUTTON   ");
  1694.                break;
  1695.            case HX_VK_BACK          :
  1696.                _DumpString( "HX_VK_BACK      ");
  1697.                break;
  1698.            case HX_VK_TAB           :
  1699.                _DumpString( "HX_VK_TAB       ");
  1700.                break;
  1701.            case HX_VK_CLEAR         :
  1702.                _DumpString( "HX_VK_CLEAR     ");
  1703.                break;
  1704.            case HX_VK_RETURN        :
  1705.                _DumpString( "HX_VK_RETURN    ");
  1706.                break;
  1707.            case HX_VK_SHIFT         :
  1708.                _DumpString( "HX_VK_SHIFT     ");
  1709.                break;
  1710.            case HX_VK_CONTROL       :
  1711.                _DumpString( "HX_VK_CONTROL   ");
  1712.                break;
  1713.            case HX_VK_MENU          :
  1714.                _DumpString( "HX_VK_MENU      ");
  1715.                break;
  1716.            case HX_VK_PAUSE         :
  1717.                _DumpString( "HX_VK_PAUSE     ");
  1718.                break;
  1719.            case HX_VK_CAPITAL       :
  1720.                _DumpString( "HX_VK_CAPITAL   ");
  1721.                break;
  1722.            case HX_VK_ESCAPE        :
  1723.                _DumpString( "HX_VK_ESCAPE    ");
  1724.                break;
  1725.            case HX_VK_SPACE         :
  1726.                _DumpString( "HX_VK_SPACE     ");
  1727.                break;
  1728.            case HX_VK_PRIOR         :
  1729.                _DumpString( "HX_VK_PRIOR     ");
  1730.                break;
  1731.            case HX_VK_NEXT          :
  1732.                _DumpString( "HX_VK_NEXT      ");
  1733.                break;
  1734.            case HX_VK_END           :
  1735.                _DumpString( "HX_VK_END       ");
  1736.                break;
  1737.            case HX_VK_HOME          :
  1738.                _DumpString( "HX_VK_HOME      ");
  1739.                break;
  1740.            case HX_VK_LEFT          :
  1741.                _DumpString( "HX_VK_LEFT      ");
  1742.                break;
  1743.            case HX_VK_UP            :
  1744.                _DumpString( "HX_VK_UP        ");
  1745.                break;
  1746.            case HX_VK_RIGHT         :
  1747.                _DumpString( "HX_VK_RIGHT     ");
  1748.                break;
  1749.            case HX_VK_DOWN          :
  1750.                _DumpString( "HX_VK_DOWN      ");
  1751.                break;
  1752.            case HX_VK_SELECT        :
  1753.                _DumpString( "HX_VK_SELECT    ");
  1754.                break;
  1755.            case HX_VK_EXECUTE       :
  1756.                _DumpString( "HX_VK_EXECUTE   ");
  1757.                break;
  1758.            case HX_VK_SNAPSHOT      :
  1759.                _DumpString( "HX_VK_SNAPSHOT  ");
  1760.                break;
  1761.            case HX_VK_INSERT        :
  1762.                _DumpString( "HX_VK_INSERT    ");
  1763.                break;
  1764.            case HX_VK_DELETE        :
  1765.                _DumpString( "HX_VK_DELETE    ");
  1766.                break;
  1767.            case HX_VK_HELP          :
  1768.                _DumpString( "HX_VK_HELP      ");
  1769.                break;
  1770.            case HX_VK_LWIN          :
  1771.                _DumpString( "HX_VK_LWIN      ");
  1772.                break;
  1773.            case HX_VK_RWIN          :
  1774.                _DumpString( "HX_VK_RWIN      ");
  1775.                break;
  1776.            case HX_VK_APPS          :
  1777.                _DumpString( "HX_VK_APPS      ");
  1778.                break;
  1779.            case HX_VK_NUMPAD0       :
  1780.                _DumpString( "HX_VK_NUMPAD0   ");
  1781.                break;
  1782.            case HX_VK_NUMPAD1       :
  1783.                _DumpString( "HX_VK_NUMPAD1   ");
  1784.                break;
  1785.            case HX_VK_NUMPAD2       :
  1786.                _DumpString( "HX_VK_NUMPAD2   ");
  1787.                break;
  1788.            case HX_VK_NUMPAD3       :
  1789.                _DumpString( "HX_VK_NUMPAD3   ");
  1790.                break;
  1791.            case HX_VK_NUMPAD4       :
  1792.                _DumpString( "HX_VK_NUMPAD4   ");
  1793.                break;
  1794.            case HX_VK_NUMPAD5       :
  1795.                _DumpString( "HX_VK_NUMPAD5   ");
  1796.                break;
  1797.            case HX_VK_NUMPAD6       :
  1798.                _DumpString( "HX_VK_NUMPAD6   ");
  1799.                break;
  1800.            case HX_VK_NUMPAD7       :
  1801.                _DumpString( "HX_VK_NUMPAD7   ");
  1802.                break;
  1803.            case HX_VK_NUMPAD8       :
  1804.                _DumpString( "HX_VK_NUMPAD8   ");
  1805.                break;
  1806.            case HX_VK_NUMPAD9       :
  1807.                _DumpString( "HX_VK_NUMPAD9   ");
  1808.                break;
  1809.            case HX_VK_MULTIPLY      :
  1810.                _DumpString( "HX_VK_MULTIPLY  ");
  1811.                break;
  1812.            case HX_VK_ADD           :
  1813.                _DumpString( "HX_VK_ADD       ");
  1814.                break;
  1815.            case HX_VK_SEPARATOR     :
  1816.                _DumpString( "HX_VK_SEPARATOR ");
  1817.                break;
  1818.            case HX_VK_SUBTRACT      :
  1819.                _DumpString( "HX_VK_SUBTRACT  ");
  1820.                break;
  1821.            case HX_VK_DECIMAL       :
  1822.                _DumpString( "HX_VK_DECIMAL   ");
  1823.                break;
  1824.            case HX_VK_DIVIDE        :
  1825.                _DumpString( "HX_VK_DIVIDE    ");
  1826.                break;
  1827.            case HX_VK_F1            :
  1828.                _DumpString( "HX_VK_F1        ");
  1829.                break;
  1830.            case HX_VK_F2            :
  1831.                _DumpString( "HX_VK_F2        ");
  1832.                break;
  1833.            case HX_VK_F3            :
  1834.                _DumpString( "HX_VK_F3        ");
  1835.                break;
  1836.            case HX_VK_F4            :
  1837.                _DumpString( "HX_VK_F4        ");
  1838.                break;
  1839.            case HX_VK_F5            :
  1840.                _DumpString( "HX_VK_F5        ");
  1841.                break;
  1842.            case HX_VK_F6            :
  1843.                _DumpString( "HX_VK_F6        ");
  1844.                break;
  1845.            case HX_VK_F7            :
  1846.                _DumpString( "HX_VK_F7        ");
  1847.                break;
  1848.            case HX_VK_F8            :
  1849.                _DumpString( "HX_VK_F8        ");
  1850.                break;
  1851.            case HX_VK_F9            :
  1852.                _DumpString( "HX_VK_F9        ");
  1853.                break;
  1854.            case HX_VK_F10           :
  1855.                _DumpString( "HX_VK_F10       ");
  1856.                break;
  1857.            case HX_VK_F11           :
  1858.                _DumpString( "HX_VK_F11       ");
  1859.                break;
  1860.            case HX_VK_F12           :
  1861.                _DumpString( "HX_VK_F12       ");
  1862.                break;
  1863.            case HX_VK_F13           :
  1864.                _DumpString( "HX_VK_F13       ");
  1865.                break;
  1866.            case HX_VK_F14           :
  1867.                _DumpString( "HX_VK_F14       ");
  1868.                break;
  1869.            case HX_VK_F15           :
  1870.                _DumpString( "HX_VK_F15       ");
  1871.                break;
  1872.            case HX_VK_F16           :
  1873.                _DumpString( "HX_VK_F16       ");
  1874.                break;
  1875.            case HX_VK_F17           :
  1876.                _DumpString( "HX_VK_F17       ");
  1877.                break;
  1878.            case HX_VK_F18           :
  1879.                _DumpString( "HX_VK_F18       ");
  1880.                break;
  1881.            case HX_VK_F19           :
  1882.                _DumpString( "HX_VK_F19       ");
  1883.                break;
  1884.            case HX_VK_F20           :
  1885.                _DumpString( "HX_VK_F20       ");
  1886.                break;
  1887.            case HX_VK_F21           :
  1888.                _DumpString( "HX_VK_F21       ");
  1889.                break;
  1890.            case HX_VK_F22           :
  1891.                _DumpString( "HX_VK_F22       ");
  1892.                break;
  1893.            case HX_VK_F23           :
  1894.                _DumpString( "HX_VK_F23       ");
  1895.                break;
  1896.            case HX_VK_F24           :
  1897.                _DumpString( "HX_VK_F24       ");
  1898.                break;
  1899.            case HX_VK_NUMLOCK       :
  1900.                _DumpString( "HX_VK_NUMLOCK   ");
  1901.                break;
  1902.            case HX_VK_SCROLL        :
  1903.                _DumpString( "HX_VK_SCROLL    ");
  1904.                break;
  1905.            default:
  1906.                _DumpString( " !! UNKOWN VIRTUAL !! " );
  1907.         }
  1908.     }
  1909.     else
  1910.     {
  1911.         sprintf( szBuff, " key: "%c" (%d) ", pEvent->param1, pEvent->param1 ); /* Flawfinder: ignore */
  1912.         _DumpString( szBuff );
  1913.     }
  1914.     sprintf( szBuff, "scancode: %d flags: ", ((UINT32)pEvent->param2)&0x000000ff ); /* Flawfinder: ignore */
  1915.     _DumpString( szBuff );
  1916.     if( (UINT32)pEvent->param2 & HX_VIRTUAL_KEY_MASK )
  1917.         _DumpString( "VirtualKey " );
  1918.     if( (UINT32)pEvent->param2 & HX_EXTENDED_KEY_MASK )
  1919.         _DumpString( "ExtendedKey " );
  1920.     if( (UINT32)pEvent->param2 & HX_SHIFT_MASK )
  1921.         _DumpString( "ShiftKey " );
  1922.     if( (UINT32)pEvent->param2 & HX_CTRL_MASK )
  1923.         _DumpString( "ControlKey " );
  1924.     if( (UINT32)pEvent->param2 & HX_ALT_MASK )
  1925.         _DumpString( "AltKey " );
  1926.     if( (UINT32)pEvent->param2 & HX_CAPS_LOCK_MASK )
  1927.         _DumpString( "CapsLock " );
  1928.     if( (UINT32)pEvent->param2 & HX_NUM_LOCK_MASK )
  1929.         _DumpString( "NumLock " );
  1930.     if( (UINT32)pEvent->param2 & HX_SCROLL_LOCK_MASK )
  1931.         _DumpString( "ScrollLock " );
  1932.     _DumpString( "n" );
  1933. }
  1934. #endif
  1935. CHXBaseSite* CHXBaseSite::_GetSiteFromPixel(HXxPoint& point)
  1936. {
  1937.     CHXBaseSite* pRet = this;
  1938.     if( (  m_bSiteNeverBlts ||
  1939.            m_nEventSensitivity == SENSITIVITY_TRANSPARENT ||
  1940.            ( m_pVideoSurface &&
  1941.              m_pVideoSurface->IsPixelTransparent(point, m_nEventSensitivity)
  1942.              )
  1943.            ) &&
  1944.         !(m_nEventSensitivity == SENSITIVITY_OPAQUE )
  1945.         )
  1946.     {
  1947.         //Now go through all the alphablend regions and see who this
  1948.         //pixel belongs to.
  1949.         CHXMapPtrToPtr::Iterator i = m_AlphaBlendSites.Begin();
  1950.         for( ; i!=m_AlphaBlendSites.End() ; ++i)
  1951.         {
  1952.             CHXBaseSite* pSite    = (CHXBaseSite*) i.get_key();
  1953.             HXREGION*      pRegion = (HXREGION*)*i;
  1954.             if( HXPointInRegion( pRegion, point.x, point.y ) )
  1955.             {
  1956.                 pRet=pSite->_GetSiteFromPixel(point);
  1957.                 break;
  1958.             }
  1959.         }
  1960.         //If we are transparent here we MUST be blending with someone.
  1961.         HX_ASSERT( this!=pRet);
  1962.     }
  1963.     return pRet;
  1964. }
  1965. /************************************************************************
  1966.  *  Method:
  1967.  *    IHXSiteWindowless::EventOccurred
  1968.  */
  1969. STDMETHODIMP CHXBaseSite::EventOccurred(HXxEvent* /*IN*/ pEvent)
  1970. {
  1971.     HX_RESULT hr = HXR_OK;
  1972.     CHXMapPtrToPtr::Iterator i;
  1973.     HXxEvent event;
  1974.     if( NULL == pEvent )
  1975.     {
  1976.         return HXR_OK;
  1977.     }
  1978.     memcpy(&event, pEvent, sizeof(HXxEvent)); /* Flawfinder: ignore */
  1979.     AddRef();
  1980.     if(!_HandleOSEvents(pEvent) && !_ConvertToHXEvent(pEvent) )
  1981.     {
  1982.         if( _ConvertToHXEvent(pEvent))
  1983.         {
  1984.             Release();
  1985.             return hr;
  1986.         }
  1987.         switch((ULONG32)pEvent->event)
  1988.         {
  1989.            case HX_KEY_UP:
  1990.            case HX_KEY_DOWN:
  1991. #if defined(_DEBUG) && 0
  1992.                _PrintKeyboardEventInfo(pEvent);
  1993. #endif
  1994.                // Always send <CR> and <TAB> to the top level site for smil
  1995. #if !defined(_MACINTOSH) && !defined(_MAC_UNIX) // XXXSEH: Is this the correct solution?
  1996.                if (HX_VK_TAB == (int)pEvent->param1 || HX_VK_RETURN == (int)pEvent->param1)
  1997. #else
  1998.                    if (0)
  1999. #endif
  2000.                        m_pTopLevelSite->m_pUser->HandleEvent(pEvent);
  2001.                // Send keyboard messages to the user that has focus
  2002.                    else if (m_pTopLevelSite->m_pKeyBoardFocusUser)
  2003.                        m_pTopLevelSite->m_pKeyBoardFocusUser->HandleEvent(pEvent);
  2004.                    else if (m_pUser)
  2005.                        m_pUser->HandleEvent(pEvent);
  2006.                break;
  2007.            case HX_CHAR:
  2008. #if defined(_DEBUG) && 0
  2009.                _PrintKeyboardEventInfo(pEvent);
  2010. #endif
  2011.                // Always send <CR> and <TAB> to the top level site for smil
  2012. #if !defined(_MACINTOSH) && !defined(_MAC_UNIX) // XXXSEH: Is this the correct solution?
  2013.                if (HX_VK_TAB == (int)pEvent->param1 || HX_VK_RETURN == (int)pEvent->param1)
  2014. #else
  2015.                    if (0)
  2016. #endif
  2017.                        m_pTopLevelSite->m_pUser->HandleEvent(pEvent);
  2018.                // Send keyboard messages to the user that has focus
  2019.                    else if (m_pTopLevelSite->m_pKeyBoardFocusUser)
  2020.                        m_pTopLevelSite->m_pKeyBoardFocusUser->HandleEvent(pEvent);
  2021.                    else if (m_pUser)
  2022.                        m_pUser->HandleEvent(pEvent);
  2023.                break;
  2024.            case HX_SET_FOCUS:
  2025.            case HX_LOSE_FOCUS:
  2026.                if (m_pUser)
  2027.                    m_pUser->HandleEvent(pEvent);
  2028.                break;
  2029.            case HX_SET_STATUS:
  2030.            case HX_SET_CURSOR:
  2031.                if (m_pUser)
  2032.                    m_pUser->HandleEvent(pEvent);
  2033.                break;
  2034.            case HX_MOUSE_LEAVE:
  2035.            case HX_MOUSE_ENTER:
  2036.            {
  2037.                HXxEvent tempEvent;
  2038.                memcpy( &tempEvent, pEvent, sizeof( HXxEvent ) ); /* Flawfinder: ignore */
  2039.                if (m_pUser)
  2040.                    m_pUser->HandleEvent(pEvent);
  2041.                //Also send a set status and set cursor to the user.
  2042.                tempEvent.event = HX_SET_CURSOR;
  2043.                if (m_pUser)
  2044.                    m_pUser->HandleEvent(&tempEvent);
  2045.                tempEvent.event   = HX_SET_STATUS;
  2046.                tempEvent.handled = FALSE;
  2047.                if (m_pUser)
  2048.                    m_pUser->HandleEvent(&tempEvent);
  2049.            }
  2050.            break;
  2051.            case HX_PRIMARY_BUTTON_UP:
  2052.            case HX_PRIMARY_BUTTON_DOWN:
  2053.            case HX_CONTEXT_BUTTON_UP:
  2054.            case HX_CONTEXT_BUTTON_DOWN:
  2055.            case HX_MOUSE_MOVE:
  2056.            case HX_PRIMARY_DBLCLK:
  2057.            case HX_CONTEXT_DBLCLK:
  2058.            case HX_THIRD_DBLCLK:
  2059.            {
  2060.                HXxPoint point = *((HXxPoint*)pEvent->param1);
  2061.                HX_ASSERT( m_nEventSensitivity != SENSITIVITY_NOT_SET || m_pWindow);
  2062. #if defined(_DEBUG) && 0
  2063.                //XXXgfw just so I can set break points.
  2064.                if( pEvent->event == HX_PRIMARY_BUTTON_DOWN )
  2065.                {
  2066.                    int MasterSlaveFlipFlop=1;
  2067.                }
  2068. #endif
  2069.                // check to see if this message is within my bounding box.
  2070.                if( m_RegionWithoutChildren &&
  2071.                    ::HXPointInRegion( m_RegionWithoutChildren, point.x, point.y))
  2072.                {
  2073.                    // ok check to see it is within our clipping area
  2074.                    if (::HXPointInRegion(m_RegionForMouse, point.x, point.y) )
  2075.                    {
  2076.                        //Get the site under the point that isn't transparent.
  2077.                        CHXBaseSite* pRealSite = this;
  2078.                        pRealSite = _GetSiteFromPixel(point);
  2079.                        pRealSite->_HandleMouseEvent(pEvent);
  2080. #if defined(_UNIX) && !defined(_MAC_UNIX)
  2081.                        // for unix only, post context menu if the event is unhandled
  2082.                        if (!pEvent->handled && pEvent->event == HX_CONTEXT_BUTTON_DOWN)
  2083.                        {
  2084.                            IHXClientEngineMapper* pCleng = NULL;
  2085.                            if (m_pContext)
  2086.                            {
  2087.                                m_pContext->QueryInterface(IID_IHXClientEngineMapper,
  2088.                                                           (void**)&pCleng);
  2089.                                if (pCleng)
  2090.                                {
  2091.                                    IUnknown* pUnknown = NULL;
  2092.                                    if (HXR_OK != pCleng->GetPlayerBySite(this, pUnknown))
  2093.                                    {
  2094.                                        // check our children
  2095.                                        CHXMapPtrToPtr::Iterator i = m_ChildrenMap.Begin();
  2096.                                        for ( ; i != m_ChildrenMap.End(); ++i)
  2097.                                        {
  2098.                                            CHXBaseSite* pSite = (CHXBaseSite*) *i;
  2099.                                            if (HXR_OK == pCleng->GetPlayerBySite(pSite, pUnknown))
  2100.                                                break;
  2101.                                        }
  2102.                                    }
  2103.                                    if (pUnknown)
  2104.                                    {
  2105.                                        IHXContextMenu *pContextMenu = NULL;
  2106.                                        pUnknown->QueryInterface(IID_IHXContextMenu, (void**)&pContextMenu);
  2107.                                        HX_RELEASE(pUnknown);
  2108.                                        if (pContextMenu)
  2109.                                        {
  2110.                                            pContextMenu->InitContextMenu("Contextual Menu");
  2111.                                            pContextMenu->ShowMenu(NULL, point);
  2112.                                            HX_RELEASE(pContextMenu);
  2113.                                        }
  2114.                                    }
  2115.                                    HX_RELEASE(pCleng);
  2116.                                }
  2117.                            }
  2118.                        }
  2119. #endif
  2120.                    }
  2121.                    else
  2122.                    {
  2123.                        INT32 handledCount = 0;
  2124.                        INT32 mapCount     = 0;
  2125.                        LISTPOSITION pos   = NULL;
  2126.                        // try send this to all of our children
  2127.                      mapchanged2:
  2128.                        mapCount = m_ChildrenInZOrder.GetCount();
  2129.                        pos = m_ChildrenInZOrder.GetHeadPosition();
  2130.                        while(pos)
  2131.                        {
  2132.                            CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(pos);
  2133.                            pSite->EventOccurred(pEvent);
  2134.                            if (pEvent->handled)
  2135.                            {
  2136.                                break;
  2137.                            }
  2138.                            handledCount+=pEvent->handled;
  2139.                            pEvent->handled=0;
  2140.                            if (m_ChildrenInZOrder.GetCount() != mapCount)
  2141.                            {
  2142.                                goto mapchanged2;
  2143.                            }
  2144.                        }
  2145.                        if (handledCount)
  2146.                        {
  2147.                            pEvent->handled = 1;
  2148.                        }
  2149.                        HX_ASSERT(handledCount<2);
  2150.                    }
  2151.                }
  2152.                break;
  2153.            }
  2154.            default:
  2155. #if defined(_DEBUG) && 0
  2156.                _DumpString("CHXBaseSite::EventOccurred Unkown event type........n");
  2157. #endif
  2158.                break;
  2159.         }
  2160.     }
  2161.     event.handled = pEvent->handled;
  2162.     event.result  = pEvent->result;
  2163.     memcpy( pEvent, &event, sizeof( event ) ); /* Flawfinder: ignore */
  2164.     Release();
  2165.     return hr;
  2166. }
  2167. void CHXBaseSite::_HandleMouseEvent(HXxEvent* pEvent)
  2168. {
  2169.     HXxEvent event;
  2170.     memcpy( &event, pEvent, sizeof(event) ); /* Flawfinder: ignore */
  2171.     HXxPoint point = *((HXxPoint*)pEvent->param1);
  2172.     m_pTopLevelSite->m_pLastUser = m_pUser;
  2173.     //If this is a click then this is the site with "focus"
  2174.     if (pEvent->event == HX_PRIMARY_BUTTON_DOWN)
  2175.     {
  2176.         m_pTopLevelSite->SetFocusSite(this);
  2177.         HXxWindow* pTempwindow = GetWindow();
  2178.         if(pTempwindow && pTempwindow->window)
  2179.         {
  2180.             SafeSetFocus(pTempwindow);
  2181.         }
  2182.         // Keyboard focus must change to match the site focus
  2183.         if (m_pTopLevelSite->m_pKeyBoardFocusUser &&
  2184.             m_pTopLevelSite->m_pKeyBoardFocusUser != m_pUser)
  2185.         {
  2186.             HXxEvent focusEvent;
  2187.             memcpy(&focusEvent, pEvent, sizeof(focusEvent)); /* Flawfinder: ignore */
  2188.             focusEvent.handled = FALSE;
  2189.             focusEvent.event = HX_SET_FOCUS;
  2190.             EventOccurred(&focusEvent);
  2191.             if (focusEvent.handled)
  2192.                 SetKeyboardFocus(m_pUser);
  2193.             else
  2194.                 SetKeyboardFocus(m_pTopLevelSite->m_pUser);
  2195.         }
  2196.     }
  2197.     // translate point and send it off to our user
  2198.     float xf = 0.0;
  2199.     float yf = 0.0;
  2200.     if( m_pParentSite )
  2201.     {
  2202.         int dX = (m_size.cx-m_pParentSite->m_size.cx);
  2203.         int dY = (m_size.cy-m_pParentSite->m_size.cy);
  2204.         if( dX && dY )
  2205.         {
  2206.             xf = (float)GetXSliderPos()/(float)(dX);
  2207.             yf = (float)GetYSliderPos()/(float)(dY);
  2208.         }
  2209.     }
  2210.     point.x = point.x - (short)((m_topleft.x - GetXSliderPos()) + GetSliderWidth()*xf);
  2211.     point.y = point.y - (short)((m_topleft.y - GetYSliderPos()) + GetSliderHeight()*yf);
  2212.     memcpy(&event, pEvent, sizeof(HXxEvent)); /* Flawfinder: ignore */
  2213.     event.param1 = &point;
  2214.     // hey do we think that we are the window with the mouse?
  2215.     CHXBaseSite* pTopLevelSite = m_pTopLevelSite;
  2216.     if (pTopLevelSite->m_pMouseInSite != this)
  2217.     {
  2218.         if (pTopLevelSite->m_pMouseInSite)
  2219.         {
  2220.             HXxPoint oobPoint;
  2221.             oobPoint.x = -1;
  2222.             oobPoint.y = -1;
  2223.             HXxEvent Outevent = { HX_MOUSE_LEAVE,
  2224.                                   m_pWindow ? m_pWindow->window : NULL,
  2225.                                   (void*)&oobPoint,
  2226.                                   0, 0,
  2227.                                   FALSE };
  2228.             pTopLevelSite->m_pMouseInSite->EventOccurred(&Outevent);
  2229.         }
  2230.         //Generate a mouse enter message
  2231.         pTopLevelSite->m_pMouseInSite = this;
  2232.         HXxEvent tempevent = {HX_MOUSE_ENTER,
  2233.                               m_pWindow ? m_pWindow->window : NULL,
  2234.                               (void*)&point,
  2235.                               0, 0,
  2236.                               FALSE};
  2237.         if (m_pUser)
  2238.         {
  2239.             m_pUser->HandleEvent(&tempevent);
  2240.         }
  2241.         // hey, have we started the mouseleave generator?
  2242.         pTopLevelSite->ScheduleCallback(MOUSE, 100);
  2243.     }
  2244.     // we have already called HandleEvent on the
  2245.     // original user in HandleWndProc
  2246.     if(pEvent->window != (m_pWindow ? m_pWindow->window : NULL))
  2247.     {
  2248.         _GenerateOSEvent(&event, pEvent);
  2249.     }
  2250.     //Send out the HX_SET_CURSOR and HX_SET_STATUS *after*
  2251.     //the mouse leave/enter messages. These are sent out for
  2252.     //all mouse move messages.
  2253.     if( pEvent->event==HX_MOUSE_MOVE && m_pUser )
  2254.     {
  2255.         HXxEvent stTmpEvent;
  2256.         memcpy( &stTmpEvent, pEvent, sizeof( HXxEvent ) ); /* Flawfinder: ignore */
  2257.         //Set Cursor....
  2258.         stTmpEvent.event   = HX_SET_CURSOR;
  2259.         stTmpEvent.handled = FALSE;
  2260.         m_pUser->HandleEvent(&stTmpEvent);
  2261.         //Set Status....
  2262.         stTmpEvent.event   = HX_SET_STATUS;
  2263.         stTmpEvent.handled = FALSE;
  2264.         m_pUser->HandleEvent(&stTmpEvent);
  2265.     }
  2266.     //ALWAYS send the RMA MOUSE messages...  Needed for
  2267.     //hyperlinks to work in SMIL since the native
  2268.     //message is handled by...say...the Flash
  2269.     //renderer... and SMIL only understands the RMA
  2270.     //mouse messages.
  2271.     if(m_pUser)
  2272.     {
  2273.         m_pUser->HandleEvent(&event);
  2274.         pEvent->handled |= event.handled;
  2275.     }
  2276. #if !defined(_UNIX) || defined(_MAC_UNIX)
  2277. //XXXgfw We should change the realtext renderer to use
  2278. //HX_SET_CURSOR and HX_SET_STATUS instead and then
  2279. //just get rid of this....
  2280.     // and now for the real text renderer we will
  2281.     // check to see if this was a mouse move
  2282.     // message. If so we will give the user a
  2283.     // WM_SETCURSOR
  2284.     if (m_pUser && pEvent->event == HX_MOUSE_MOVE)
  2285.     {
  2286.         _GenerateSetCursorEvent();
  2287.     }
  2288. #endif
  2289. }
  2290. /************************************************************************
  2291.  *  Method:
  2292.  *    IHXSiteWindowless::GetParentWindow
  2293.  */
  2294. STDMETHODIMP_(HXxWindow*) CHXBaseSite::GetParentWindow()
  2295. {
  2296.     if (m_pWindow && m_pWindow->window)
  2297.     {
  2298.         return m_pWindow;
  2299.     }
  2300.     else
  2301.     {
  2302.         if(m_pParentSite)
  2303.         {
  2304.             return m_pParentSite->GetParentWindow();
  2305.         }
  2306.         else
  2307.         {
  2308.             return NULL;
  2309.         }
  2310.     }
  2311. }
  2312. /************************************************************************
  2313.  *  Method:
  2314.  *    CHXBaseSite::GetTopLevelSite
  2315.  */
  2316. CHXBaseSite*
  2317. CHXBaseSite::GetTopLevelSite()
  2318. {
  2319.     if (!m_pParentSite)
  2320.     {
  2321.         return this;
  2322.     }
  2323.     else
  2324.     {
  2325.         return m_pParentSite->GetTopLevelSite();
  2326.     }
  2327. }
  2328. CHXBaseSite*
  2329. CHXBaseSite::GetContainingCHXBaseSite()
  2330. {
  2331.     if (m_pWindow && m_pWindow->window)
  2332.     {
  2333.         return this;
  2334.     }
  2335.     else
  2336.     {
  2337.         if (m_pParentSite)
  2338.         {
  2339.             return m_pParentSite->GetContainingCHXBaseSite();
  2340.         }
  2341.     }
  2342.     return NULL;
  2343. }
  2344. /************************************************************************
  2345.  *  Method:
  2346.  *    CHXBaseSite::AttachWindow
  2347.  */
  2348. STDMETHODIMP CHXBaseSite::AttachWindow(HXxWindow* pWindow)
  2349. {
  2350.     if (m_pWindow && m_pWindow->window) return HXR_UNEXPECTED;
  2351.     _TLSLock();
  2352.     if (!m_pParentSite)
  2353.     {
  2354.         memcpy(&m_TopLevelWindow, pWindow, sizeof(HXxWindow)); /* Flawfinder: ignore */
  2355.     }
  2356.     m_pWindow = pWindow;
  2357.     if (!m_pRootSurface && !m_pParentSite)
  2358.     {
  2359.         m_pRootSurface = CBaseRootSurface::Create(m_pContext, this);
  2360.         m_pRootSurface->AddRef();
  2361.     }
  2362.     _AttachWindow();
  2363.     if (!m_pParentSite)
  2364.     {
  2365.         _GetDeviceCaps(NULL, m_nOldBitsPerPixel, m_nOldHorzRes, m_nOldVertRes);
  2366.         m_pRootSurface->AddRef();
  2367.         SetRootSurface(m_pRootSurface);
  2368.         m_pRootSurface->Release();
  2369.         SetParentWindow(&m_TopLevelWindow);
  2370.     }
  2371.     if (m_pUser)
  2372.     {
  2373.         m_bAttachWindowPending = FALSE;
  2374.         m_bDetachWndMsgPending = TRUE;
  2375.         // send HX_ATTACH_WINDOW msg to the renderers
  2376.         void *  lpParam1 = NULL;
  2377.         void *  lpParam2 = NULL;
  2378.         HXxEvent event = {HX_ATTACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  2379.         m_pUser->HandleEvent(&event);
  2380.     }
  2381.     else
  2382.     {
  2383.         m_bAttachWindowPending = TRUE;
  2384.     }
  2385.     //XXXgfw This focus code is disabled for the Beamer release.
  2386. //     if (!m_pParentSite)
  2387. //     {
  2388. //         SafeSetFocus(m_pWindow);
  2389. //     }
  2390.     _TLSUnlock();
  2391.     return HXR_OK;
  2392. }
  2393. /************************************************************************
  2394.  *  Method:
  2395.  *    IHXSiteWindowed::DetachWindow
  2396.  */
  2397. STDMETHODIMP CHXBaseSite::DetachWindow()
  2398. {
  2399.     if (!m_pWindow || !m_pWindow->window) return HXR_UNEXPECTED;
  2400.     if (m_pVideoSurface)
  2401.     {
  2402. m_pVideoSurface->EndOptimizedBlt();
  2403.     }
  2404.   
  2405.     // Avoid dead-lock in vidsurf2
  2406.     LockBlitters();
  2407.     FlushSurfaces();
  2408.     _TLSLock();
  2409.     if (m_pUser && m_bDetachWndMsgPending)
  2410.     {
  2411.         // send HX_DETACH_WINDOW msg to the renderers
  2412.         void *  lpParam1 = NULL;
  2413.         void *  lpParam2 = NULL;
  2414.         HXxEvent event = {HX_DETACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  2415.         m_bDetachWndMsgPending = FALSE;
  2416.         m_pUser->HandleEvent(&event);
  2417.     }
  2418.     //Status text
  2419.     if (m_pStatusText)
  2420.     {
  2421.         m_pStatusText->Destroy();
  2422. #ifdef _WINDOWS
  2423.         HX_DELETE(m_pStatusText);
  2424. #else
  2425.         HX_RELEASE(m_pStatusText);
  2426. #endif
  2427.         HX_DELETE(m_pStatusText);
  2428.     }
  2429.     _DestroySliders();
  2430.     // let the OS specific site do its cleanup.
  2431.     _DetachWindow();
  2432.     m_pWindow = NULL;
  2433.     DestroySurfaces();
  2434.     HX_RELEASE(m_pRootSurface);
  2435.     if (m_pTopLevelSite)
  2436.         m_pTopLevelSite->RemovePendingTasks(this);
  2437.     SetRootSurface(NULL);
  2438.     SetParentWindow(NULL);
  2439.     if (m_pTopLevelSite == this)
  2440.     {
  2441.         if (m_CallbackHandle)
  2442.         {
  2443.             m_pScheduler->Remove(m_CallbackHandle);
  2444.             m_CallbackHandle = 0;
  2445.         }
  2446.         if (m_ScrollSiteCallbackHandle)
  2447.         {
  2448.             m_pScheduler->Remove(m_ScrollSiteCallbackHandle);
  2449.             m_ScrollSiteCallbackHandle = 0;
  2450.         }
  2451.     }
  2452.     _TLSUnlock();
  2453.     UnlockBlitters();
  2454.     return HXR_OK;
  2455. }
  2456. /************************************************************************
  2457.  *  Method:
  2458.  *    IHXSiteWindowed::Create
  2459.  */
  2460. STDMETHODIMP CHXBaseSite::Create(void* ParentWindow, UINT32 style)
  2461. {
  2462.     HRESULT retVal = HXR_OK;
  2463.     if( m_pWindow && m_pWindow->window )
  2464.     {
  2465.         //We already have one.
  2466.         return HXR_FAIL;
  2467.     }
  2468.     _TLSLock();
  2469.     void* hWnd = _Create(ParentWindow, style);
  2470.     if (!hWnd)
  2471.     {
  2472.         retVal = HXR_FAIL;
  2473.     }
  2474.     else
  2475.     {
  2476.         HXxWindow* pWindow = new HXxWindow;
  2477.         memset(pWindow,0,sizeof(HXxWindow));
  2478.         pWindow->window = hWnd;
  2479.         if( this == m_pTopLevelSite )
  2480.         {
  2481.             //This flags tells us if Create was used to make the window
  2482.             //or not. We use this in SetSize and SetPosition so that we
  2483.             //never resize or move the TLCs window. But, in TLC that call
  2484.             //create, like testplay, we need to do the move and resize
  2485.             //for them.
  2486.             m_bWindowCreatedByCreate = TRUE;
  2487.         }
  2488.         //This way we always pass through attach window.
  2489.         AttachWindow(pWindow);
  2490.     }
  2491.     _TLSUnlock();
  2492.     return retVal;
  2493. }
  2494. /************************************************************************
  2495.  *  Method:
  2496.  *    IHXSiteWindowed::Destroy
  2497.  */
  2498. STDMETHODIMP CHXBaseSite::Destroy()
  2499. {
  2500.     //This could be the site that owns the overlay even though
  2501.     //it doesn't have a window. Give it a chance to clean up
  2502.     //here...
  2503.     if( m_pVideoSurface )
  2504.     {
  2505.         m_pVideoSurface->EndOptimizedBlt();
  2506.     }
  2507.     _DestroySliders();
  2508.     if(!m_pWindow || !m_pWindow->window)
  2509.     {
  2510.         return HXR_UNEXPECTED;
  2511.     }
  2512.     _TLSLock();
  2513.     HXxWindow tempWindow;
  2514.     memcpy( &tempWindow, m_pWindow, sizeof( HXxWindow ) ); /* Flawfinder: ignore */
  2515.     DetachWindow();
  2516.     _Destroy(&tempWindow);
  2517.     m_pWindow = NULL;
  2518.     if (m_pTopLevelSite && m_pTopLevelSite != this)
  2519.         m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  2520.     _TLSUnlock();
  2521.     return HXR_OK;
  2522. }
  2523. STDMETHODIMP_(HXxWindow*) CHXBaseSite::GetWindow()
  2524. {
  2525.     return GetParentWindow();
  2526. }
  2527. /************************************************************************
  2528.  *  Method:
  2529.  *    IHXSite2::SetCursor
  2530.  */
  2531. STDMETHODIMP CHXBaseSite::SetCursor(HXxCursor cursor, REF(HXxCursor) oldCursor)
  2532. {
  2533.     return HXR_NOTIMPL;
  2534. }
  2535. /************************************************************************
  2536.  *  Method:
  2537.  *    IHXSiteTreeNavigation::GetParentSite
  2538.  */
  2539. STDMETHODIMP
  2540. CHXBaseSite::GetParentSite(REF(IHXSite*)pParentSite)
  2541. {
  2542.     pParentSite = m_pParentSite;
  2543.     if (pParentSite)
  2544.     {
  2545.         pParentSite->AddRef();
  2546.         return HXR_OK;
  2547.     }
  2548.     
  2549.     return HXR_FAIL;
  2550. }
  2551. /************************************************************************
  2552.  *  Method:
  2553.  *    IHXSiteTreeNavigation::GetNthChildSite
  2554.  */
  2555. STDMETHODIMP
  2556. CHXBaseSite::GetNthChildSite(ULONG32 ulIndex,
  2557.                                 REF(IHXSite*) pSite)
  2558. {
  2559.     ULONG32 ulCurrentZOrder = 0;
  2560.     //Now do all the children in z-order
  2561.     LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition();
  2562.     while(pos)
  2563.     {
  2564.         CHXBaseSite* pChildSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(pos);
  2565.         
  2566.         if (ulCurrentZOrder == ulIndex)
  2567.         {
  2568.             HX_ASSERT(pChildSite);
  2569.             return pChildSite->QueryInterface(IID_IHXSite, (void**)&pSite);
  2570.         }
  2571.         
  2572.         ulCurrentZOrder++;
  2573.     }
  2574.     
  2575.     return HXR_FAIL;
  2576. }
  2577. /************************************************************************
  2578.  *  Method:
  2579.  *    IHXCallback::Func
  2580.  */
  2581. STDMETHODIMP CHXBaseSite::Func(void)
  2582. {
  2583.     _TLSLock();
  2584.     m_CallbackHandle = 0;
  2585.     AddRef();
  2586.     ExecutePendingTasks();
  2587.     if (m_bRecomputeClipScheduled)
  2588.     {
  2589.         m_bDisableForceRedraw = TRUE;
  2590.         m_bRecomputeClipScheduled = FALSE;
  2591.         RecomputeClip();
  2592.         m_bDisableForceRedraw = FALSE;
  2593.         _ForceRedrawAll();
  2594.         m_bForceRedrawNeeded = FALSE;
  2595.         m_bCalledComputeClipFromTransition = FALSE;
  2596.         FillColorKey();
  2597.     }
  2598.     if (m_bProcessRepaint)
  2599.     {
  2600.         _ForceRedrawAll();
  2601.         m_bProcessRepaint = FALSE;
  2602.     }
  2603.     if( m_bForceRedrawNeeded )
  2604.     {
  2605.         _ForceRedrawAll();
  2606.         m_bForceRedrawNeeded = FALSE;
  2607.         FillColorKey();
  2608.     }
  2609.     //The preferable fix is during WM_PAINT, if in full screen, to call
  2610.     //FillBorders.  However, we are currently generating quite a number
  2611.     //of spurious WM_PAINT callbacks and this would further degrade
  2612.     //performance. If some day we reduce the number of spurious
  2613.     //WM_PAINT callbacks then this code (which is hookey) should be
  2614.     //placed in * the WM_PAINT handler (too many handlers in that
  2615.     //sentence).
  2616.     if (m_nDelayFillBorders)
  2617.     {
  2618.         m_nDelayFillBorders--;
  2619.         m_pRootSurface->FillBorders();
  2620.     }
  2621.     if (m_nStatusTextExpireTime)
  2622.     {
  2623.         if (m_pStatusText && (HX_GET_TICKCOUNT() - m_nStatusTextExpireTime > 100))
  2624.         {
  2625.             if (m_pStatusText)
  2626.             {
  2627.                 m_pStatusText->SetStatusText(NULL);
  2628.                 if (IsFullScreen())
  2629.                 {
  2630.                     m_pRootSurface->FillBorders();
  2631.                 }
  2632.             }
  2633.             m_nStatusTextExpireTime = 0;
  2634.         }
  2635.     }
  2636.     if (m_nLastMoveTime)
  2637.     {
  2638.         if (HX_GET_TICKCOUNT() - m_nLastMoveTime > MOVING_TIMEOUT)
  2639.         {
  2640.             SiteNotMoving();
  2641.             m_nLastMoveTime = 0;
  2642.         }
  2643.     }
  2644.     if (m_bScheduleUpgrade)
  2645.     {
  2646.         ScheduleUpgrade();
  2647.     }
  2648. #ifdef _DEBUG_WINDOWED_SITES
  2649.     DrawAllSites();
  2650. #endif
  2651.     //TEST TEST TEST TEST XXXgfw
  2652. //     SetCompositionMode(1);
  2653. //     UnlockComposition();
  2654. //     BltComposition();
  2655. //     LockComposition();
  2656. //     ScheduleCallback(MOUSE, 45);
  2657.     //TEST TEST TEST TEST XXXgfw
  2658.     ScheduleCallback(MOUSE, 100);
  2659. #if !defined(_UNIX) && !defined(_MACINTOSH)
  2660.     //XXXgfw this whole section of code should go away when we add
  2661.     //       HX_SET_CURSOR and HX_SET_STATUS messages....
  2662.     //We don't need this in UNIX because we have EnterNotify and
  2663.     //LeaveNotify events that the OS supplies. This will be
  2664.     //handled in the OS specific class.
  2665.     // xxxbobclark The mac site call generate mouse leave message.
  2666.     if (_AtSystemTime())
  2667.     {
  2668.         GenerateMouseLeaveMessage();
  2669.     }
  2670. #endif
  2671.     Release();
  2672.     _TLSUnlock();
  2673.     return HXR_OK;
  2674. }
  2675. /************************************************************************
  2676.  *  Method:
  2677.  *    SetStatus
  2678.  */
  2679. STDMETHODIMP CHXBaseSite::SetStatus(const char* pText)
  2680. {
  2681.     if (this != m_pTopLevelSite)
  2682.     {
  2683.         m_pTopLevelSite->SetStatus(pText);
  2684.     }
  2685.     /*
  2686.      * if we get a zero length string we will remove the Status Text
  2687.      * in 100 milliseconds.
  2688.      */
  2689.     _TLSLock();
  2690.     if (!pText || !*pText)
  2691.     {
  2692.         m_nStatusTextExpireTime = HX_GET_TICKCOUNT();
  2693.         ScheduleCallback(MOUSE, 100);
  2694.         _TLSUnlock();
  2695.         return HXR_OK;
  2696.     }
  2697.     m_nStatusTextExpireTime = 0;
  2698.     if (!m_pStatusText)
  2699.     {
  2700.         m_pStatusText = new CHXSiteStatusText();
  2701.         //XXXgfw We need to make this interface cross platform.
  2702. #ifdef _WINDOWS
  2703.         m_pStatusText->Create( GetWindow()->window );
  2704. #else
  2705.         m_pStatusText->AddRef();
  2706.         m_pStatusText->Create( this );
  2707. #endif
  2708.         m_pStatusText->ParentChangedSize();
  2709.     }
  2710.     m_pStatusText->SetStatusText(pText);
  2711.     _TLSUnlock();
  2712.     return HXR_OK;
  2713. }
  2714. HXxPoint
  2715. CHXBaseSite::GetScreenOffset()
  2716. {
  2717.     if (m_pParentSite)
  2718.     {
  2719.         return m_pParentSite->GetScreenOffset();
  2720.     }
  2721.     return m_screenOffset;
  2722. }
  2723. STDMETHODIMP CHXBaseSite::EnterFullScreen()
  2724. {
  2725.     IHXPreferences* pPreferences = NULL;
  2726.     HX_RESULT        ret = HXR_OK;
  2727.     //Check to see if we are in postage stamp mode.
  2728.     m_bPostageStamp = FALSE;
  2729.     if (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences,(void**)&pPreferences))
  2730.     {
  2731.         IHXBuffer* pBuffer = NULL;
  2732.         char        szBuffer[255]; /* Flawfinder: ignore */
  2733.         strcpy(szBuffer, REGKEY_FULLSCREEN_DATA); /* Flawfinder: ignore */
  2734.         strcat(szBuffer, "\"); /* Flawfinder: ignore */
  2735.         strcat(szBuffer, REGKEY_FULLSCREEN_POSTAGE_STAMP); /* Flawfinder: ignore */
  2736. ReadPrefBOOL(pPreferences, szBuffer, m_bPostageStamp);
  2737.     }
  2738.     if (m_pParentSite)
  2739.     {
  2740.         return m_pParentSite->EnterFullScreen();
  2741.     }
  2742.     if (IsFullScreen())
  2743.     {
  2744.         return HXR_OK;
  2745.     }
  2746.     _TLSLock();
  2747.     ret = _EnterFullScreen();
  2748.     _TLSUnlock();
  2749.     return ret;
  2750. }
  2751. STDMETHODIMP CHXBaseSite::ExitFullScreen()
  2752. {
  2753.     HX_RESULT ret = HXR_OK;
  2754.     if (m_pParentSite)
  2755.     {
  2756.         return m_pParentSite->ExitFullScreen();
  2757.     }
  2758.     if( !m_bInFullScreen )
  2759.     {
  2760.         return HXR_OK;
  2761.     }
  2762.     // Avoid dead-lock in vidsurf2
  2763.     LockBlitters();
  2764.     FlushSurfaces();
  2765.     _TLSLock();
  2766.     ret = _ExitFullScreen();
  2767.     _TLSUnlock();
  2768.     UnlockBlitters();
  2769.     return ret;
  2770. }
  2771. STDMETHODIMP CHXBaseSite::TestFullScreen(void* hTestBitmap,const char* pszStatusText)
  2772. {
  2773.     return _TestFullScreen(hTestBitmap, pszStatusText);
  2774. }
  2775. STDMETHODIMP_(BOOL) CHXBaseSite::IsFullScreen()
  2776. {
  2777.     if (m_pParentSite)
  2778.     {
  2779.         return m_pParentSite->IsFullScreen();
  2780.     }
  2781.     return m_bInFullScreen;
  2782. }
  2783. STDMETHODIMP CHXBaseSite::Initialize (IHXValues* pParams)
  2784. {
  2785.     INT32 transitionType    = 0;
  2786.     INT32 transitionSubType = 0;
  2787.     BOOL  bFoundType        = FALSE;
  2788.     BOOL  bFoundSubType     = FALSE;
  2789.     IHXBuffer* pPropertyValue = NULL;
  2790.     pParams->GetPropertyCString("type", (IHXBuffer*&)pPropertyValue);
  2791.     if (pPropertyValue)
  2792.     {
  2793.         char* pString;
  2794.         pString = (char*)pPropertyValue->GetBuffer();
  2795.         if (pString)
  2796.         {
  2797.             for(int i = 0; i < z_nNumberTransitionTypes; ++i)
  2798.             {
  2799.                 tranType* pStruct;
  2800.                 pStruct = &z_TransitionTable[i];
  2801.                 if (pStruct->m_pName)
  2802.                 {
  2803.                     if (!strcmp(pStruct->m_pName, pString))
  2804.                     {
  2805.                         bFoundType = TRUE;
  2806.                         transitionType = i;
  2807.                         break;
  2808.                     }
  2809.                 }
  2810.             }
  2811.         }
  2812.     }
  2813.     HX_RELEASE(pPropertyValue);
  2814.     pParams->GetPropertyCString("subType", (IHXBuffer*&)pPropertyValue);
  2815.     if (bFoundType && pPropertyValue)
  2816.     {
  2817.         char* pString;
  2818.         pString = (char*)pPropertyValue->GetBuffer();
  2819.         if (pString)
  2820.         {
  2821.             for(int i = 0; i < z_TransitionTable[transitionType].m_nNum; ++i)
  2822.             {
  2823.                 tranStruct* pStruct;
  2824.                 pStruct = &z_TransitionTable[transitionType].m_pSubTypes[i];
  2825.                 if (pStruct->m_pTranName)
  2826.                 {
  2827.                     if (!strcmp(pStruct->m_pTranName, pString))
  2828.                     {
  2829.                         bFoundSubType = TRUE;
  2830.                         transitionSubType = i;
  2831.                         break;
  2832.                     }
  2833.                 }
  2834.             }
  2835.         }
  2836.     }
  2837.     HX_RELEASE(pPropertyValue);
  2838.     pParams->GetPropertyCString("reverse", (IHXBuffer*&)pPropertyValue);
  2839.     if (pPropertyValue)
  2840.     {
  2841.         m_bTransitionReversed = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2842.         HX_RELEASE(pPropertyValue);
  2843.     }
  2844.     pParams->GetPropertyCString("TranIn", (IHXBuffer*&)pPropertyValue);
  2845.     if (pPropertyValue)
  2846.     {
  2847.         m_bTransitionTranIn = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2848.         HX_RELEASE(pPropertyValue);
  2849.     }
  2850.     pParams->GetPropertyCString("VerticalRepeat", (IHXBuffer*&)pPropertyValue);
  2851.     if (pPropertyValue)
  2852.     {
  2853.         m_nTransitionVertRepeat = ::atoi((const char *)pPropertyValue->GetBuffer());
  2854.         HX_RELEASE(pPropertyValue);
  2855.     }
  2856.     pParams->GetPropertyCString("HorizontalRepeat", (IHXBuffer*&)pPropertyValue);
  2857.     if (pPropertyValue)
  2858.     {
  2859.         m_nTransitionHorzRepeat = ::atoi((const char *)pPropertyValue->GetBuffer());
  2860.         HX_RELEASE(pPropertyValue);
  2861.     }
  2862.     pParams->GetPropertyCString("BorderWidth", (IHXBuffer*&)pPropertyValue);
  2863.     if (pPropertyValue)
  2864.     {
  2865.         m_nTransitionBorderWidth = ::atoi((const char *)pPropertyValue->GetBuffer());
  2866.         HX_RELEASE(pPropertyValue);
  2867.     }
  2868.     pParams->GetPropertyCString("BorderColor", (IHXBuffer*&)pPropertyValue);
  2869.     if (pPropertyValue)
  2870.     {
  2871.         m_ulTransitionBorderColor = ::atoi((const char *)pPropertyValue->GetBuffer());
  2872.         HX_RELEASE(pPropertyValue);
  2873.     }
  2874.     pParams->GetPropertyCString("FadeColor", (IHXBuffer*&)pPropertyValue);
  2875.     if (pPropertyValue)
  2876.     {
  2877.         m_ulTransitionFadeColor = ::atoi((const char *)pPropertyValue->GetBuffer());
  2878.         HX_RELEASE(pPropertyValue);
  2879.     }
  2880.     pParams->GetPropertyCString("BlendBorder", (IHXBuffer*&)pPropertyValue);
  2881.     if (pPropertyValue)
  2882.     {
  2883.         m_bTransitionBlendBorder = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2884.         HX_RELEASE(pPropertyValue);
  2885.     }
  2886.     pParams->GetPropertyCString("Coordinated", (IHXBuffer*&)pPropertyValue);
  2887.     if (pPropertyValue)
  2888.     {
  2889.         m_bTransitionCoordinated = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2890.         HX_RELEASE(pPropertyValue);
  2891.     }
  2892.     pParams->GetPropertyCString("ClipBoundary", (IHXBuffer*&)pPropertyValue);
  2893.     if (pPropertyValue)
  2894.     {
  2895.         const char* pszType = (const char*)pPropertyValue->GetBuffer();
  2896.         BOOL        bIsParent = TRUE;
  2897.         if( pszType && strlen( pszType ) )
  2898.         {
  2899.             bIsParent = pszType[0]=='p' || pszType[0]=='P';
  2900.         }
  2901.         m_bTransitionCoordTranIsParentClip = bIsParent;
  2902.         HX_RELEASE(pPropertyValue);
  2903.     }
  2904.     if (bFoundSubType && bFoundType)
  2905.     {
  2906.         m_fpTransitionEffect        =
  2907.             z_TransitionTable[transitionType].m_pSubTypes[transitionSubType].m_fpTranFunction;
  2908.         m_nTransitionState = 0;
  2909.         return HXR_OK;
  2910.     }
  2911.     else
  2912.     {
  2913.         return HXR_FAIL;
  2914.     }
  2915. }
  2916. STDMETHODIMP CHXBaseSite::SetPercentage (UINT32 nThousandnthsComplete)
  2917. {
  2918.     _TLSLock();
  2919.     if( nThousandnthsComplete != (UINT32)m_nTransitionState )
  2920.     {
  2921.         m_nTransitionState = nThousandnthsComplete;
  2922.         // We need to invalidate the rect first before we may
  2923.         // update m_topleft and m_postion. This would happen
  2924.         // if we are doing some sort of slideWipe transition.
  2925.         // The first rect will be the "old" position of a
  2926.         // slideWipe. If we are not using some sort of
  2927.         // slideWipe, then the rect won't change and we
  2928.         // won't damage again.
  2929.         HXxRect cTmp = { m_topleft.x,
  2930.                          m_topleft.y,
  2931.                          m_topleft.x+m_size.cx,
  2932.                          m_topleft.y+m_size.cy};
  2933.         m_pTopLevelSite->_RecursiveDamageRect( &cTmp, TRUE );
  2934.         int completeness = m_nTransitionState;
  2935.         if(m_bTransitionReversed)
  2936.             completeness = 1000 - completeness;
  2937.         if( m_fpTransitionEffect == SlideFromLeft )
  2938.         {
  2939.             m_position.x = m_positionOrig.x -
  2940.                 ((INT32)(m_size.cx - (double(m_size.cx)/1000.0)*(double)completeness));
  2941.             ResetOrigin();
  2942.         }
  2943.         else if( m_fpTransitionEffect == SlideFromTop )
  2944.         {
  2945.             m_position.y = m_positionOrig.y -
  2946.                 ((INT32)(m_size.cy - (double(m_size.cy)/1000.0)*(double)completeness));
  2947.             ResetOrigin();
  2948.         }
  2949.         else if( m_fpTransitionEffect == SlideFromRight )
  2950.         {
  2951.             m_position.x = m_positionOrig.x +
  2952.                 ((INT32)(m_size.cx - (double(m_size.cx)/1000.0)*(double)completeness));
  2953.             ResetOrigin();
  2954.         }
  2955.         else if( m_fpTransitionEffect == SlideFromBottom )
  2956.         {
  2957.             m_position.y = m_positionOrig.y +
  2958.                 ((INT32)(m_size.cy - (double(m_size.cy)/1000.0)*(double)completeness));
  2959.             ResetOrigin();
  2960.         }
  2961.         // Did we change the rect? If so, then damage with
  2962.         // the new rect
  2963.         if (cTmp.left   != m_topleft.x             ||
  2964.             cTmp.top    != m_topleft.y             ||
  2965.             cTmp.right  != m_topleft.x + m_size.cx ||
  2966.             cTmp.bottom != m_topleft.y + m_size.cy)
  2967.         {
  2968.             // Invalidate the changed rect
  2969.             cTmp.left   = m_topleft.x;
  2970.             cTmp.top    = m_topleft.y;
  2971.             cTmp.right  = m_topleft.x + m_size.cx;
  2972.             cTmp.bottom = m_topleft.y + m_size.cy;
  2973.             m_pTopLevelSite->_RecursiveDamageRect(&cTmp, TRUE);
  2974.         }
  2975.         if( this==m_pTopLevelSite)
  2976.         {
  2977.             m_pTopLevelSite->RecomputeClip();
  2978.         }
  2979.         else
  2980.         {
  2981.             if(m_pTopLevelSite)
  2982.                 m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  2983.             m_pTopLevelSite->m_bCalledComputeClipFromTransition = TRUE;
  2984.         }
  2985.     }
  2986.     _TLSUnlock();
  2987.     return HXR_OK;
  2988. }
  2989. /*
  2990.  * IHXVideoControls methods
  2991.  */
  2992. STDMETHODIMP_(float) CHXBaseSite::GetBrightness(void)
  2993. {
  2994.     if (m_pParentSite)
  2995.     {
  2996.         return m_pParentSite->GetBrightness();
  2997.     }
  2998.     return m_fBrightness;
  2999. }
  3000. STDMETHODIMP CHXBaseSite::SetBrightness(float brightness)
  3001. {
  3002.     if (m_pParentSite)
  3003.     {
  3004.         return m_pParentSite->SetBrightness(brightness);
  3005.     }
  3006.     m_fBrightness = brightness;
  3007.     ScheduleCallback(REPAINT, 0);
  3008.     return HXR_OK;
  3009. }
  3010. STDMETHODIMP_(float) CHXBaseSite::GetContrast(void)
  3011. {
  3012.     if (m_pParentSite)
  3013.     {
  3014.         return m_pParentSite->GetContrast();
  3015.     }
  3016.     return m_fContrast;
  3017. }
  3018. STDMETHODIMP CHXBaseSite::SetContrast(float contrast)
  3019. {
  3020.     if (m_pParentSite)
  3021.     {
  3022.         return m_pParentSite->SetContrast(contrast);
  3023.     }
  3024.     m_fContrast = contrast;
  3025.     ScheduleCallback(REPAINT, 0);
  3026.     return HXR_OK;
  3027. }
  3028. STDMETHODIMP_(float) CHXBaseSite::GetSaturation(void)
  3029. {
  3030.     if (m_pParentSite)
  3031.     {
  3032.         return m_pParentSite->GetSaturation();
  3033.     }
  3034.     return m_fSaturation;
  3035. }
  3036. STDMETHODIMP CHXBaseSite::SetSaturation(float saturation)
  3037. {
  3038.     if (m_pParentSite)
  3039.     {
  3040.         return m_pParentSite->SetSaturation(saturation);
  3041.     }
  3042.     m_fSaturation = saturation;
  3043.     ScheduleCallback(REPAINT, 0);
  3044.     return HXR_OK;
  3045. }
  3046. STDMETHODIMP_(float) CHXBaseSite::GetHue(void)
  3047. {
  3048.     if (m_pParentSite)
  3049.     {
  3050.         return m_pParentSite->GetHue();
  3051.     }
  3052.     return m_fHue;
  3053. }
  3054. STDMETHODIMP CHXBaseSite::SetHue(float hue)
  3055. {
  3056.     if (m_pParentSite)
  3057.     {
  3058.         return m_pParentSite->SetHue(hue);
  3059.     }
  3060.     m_fHue = hue;
  3061.     ScheduleCallback(REPAINT, 0);
  3062.     return HXR_OK;
  3063. }
  3064. STDMETHODIMP_(float) CHXBaseSite::GetSharpness(void)
  3065. {
  3066.     if (m_pParentSite)
  3067.     {
  3068.         return m_pParentSite->GetSharpness();
  3069.     }
  3070.     return m_fSharpness;
  3071. }