📄 basesite.cpp
字号:
HXDestroyRegion(m_pDirtyRegion); m_pDirtyRegion = NULL;}/************************************************************************ * Method: * CHXBaseSite::SetParentSite */voidCHXBaseSite::SetParentSite(CHXBaseSite* pParentSite){ m_pParentSite = pParentSite;}/************************************************************************ * Method: * CHXBaseSite::SetTopLevelSite */voidCHXBaseSite::SetTopLevelSite(CHXBaseSite* pTop){ if (m_pTopLevelSite != this) { HX_RELEASE(m_pTopLevelSite); } m_pTopLevelSite = pTop; if (m_pTopLevelSite && m_pTopLevelSite != this) m_pTopLevelSite->AddRef();}/************************************************************************ * Method: * IUnknown::QueryInterface */STDMETHODIMP CHXBaseSite::QueryInterface(REFIID riid, void** ppvObj){ return m_pUnkOuter->QueryInterface(riid,ppvObj);}/************************************************************************ * Method: * IUnknown::AddRef */STDMETHODIMP_(ULONG32) CHXBaseSite::AddRef(){ return m_pUnkOuter->AddRef();}/************************************************************************ * Method: * IUnknown::Release */STDMETHODIMP_(ULONG32) CHXBaseSite::Release(){ return m_pUnkOuter->Release();}/************************************************************************ * Method: * IUnknown::QueryInterface */STDMETHODIMP CHXBaseSite::SiteNonDelegatingQueryInterface(REFIID riid, void** ppvObj){ if (IsEqualIID(riid, IID_IUnknown)) { AddRef(); *ppvObj = (IUnknown*)(IHXSite*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSite)) { AddRef(); *ppvObj = (IHXSite*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSite2)) { AddRef(); *ppvObj = (IHXSite2*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSiteTreeNavigation)) { AddRef(); *ppvObj = (IHXSiteTreeNavigation*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXInterruptSafe)) { AddRef(); *ppvObj = (IHXInterruptSafe*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSiteWindowless)) { AddRef(); *ppvObj = (IHXSiteWindowless*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSiteWindowed)) { AddRef(); *ppvObj = (IHXSiteWindowed*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXStatusMessage)) { AddRef(); *ppvObj = (IHXStatusMessage*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSiteFullScreen)) { AddRef(); *ppvObj = (IHXSiteFullScreen*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXVideoControl)) { AddRef(); *ppvObj = (IHXVideoControl*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSiteTransition)) { AddRef(); *ppvObj = (IHXSiteTransition*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSiteComposition)) { AddRef(); *ppvObj = (IHXSiteComposition*)this; return HXR_OK; } else if (m_pValues && m_pValues->QueryInterface(riid, ppvObj) == HXR_OK) { return HXR_OK; } else if (IsEqualIID(riid, IID_IHXKeyBoardFocus)) { AddRef(); *ppvObj = (IHXKeyBoardFocus*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXDrawFocus)) { AddRef(); *ppvObj = (IHXDrawFocus*)this; return HXR_OK; } else if (IsEqualIID(riid, IID_IHXSubRectSite)) { AddRef(); *ppvObj = (IHXSubRectSite*)this; return HXR_OK; } *ppvObj = NULL; return HXR_NOINTERFACE;}/************************************************************************ * Method: * IUnknown::AddRef */STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingAddRef(){ return InterlockedIncrement(&m_lRefCount);}/************************************************************************ * Method: * IUnknown::Release */STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingRelease(){ if (InterlockedDecrement(&m_lRefCount) > 0) { return m_lRefCount; } delete this; return 0;}/************************************************************************ * Method: * IHXSite::AttachUser */STDMETHODIMP CHXBaseSite::AttachUser(IHXSiteUser* /*IN*/ pUser){ if (m_pUser) return HXR_UNEXPECTED;#ifndef _DEBUG_WINDOWED_SITES if (m_pParentSite && pUser->NeedsWindowedSites()) { _NeedWindowedSite(); }#endif m_pUser = pUser; m_pUser->AddRef(); //if (!m_pTopLevelSite->m_pKeyBoardFocusUser && m_pTopLevelSite->m_pUser) //{ // m_pTopLevelSite->m_pKeyBoardFocusUser = m_pTopLevelSite->m_pUser; // m_pTopLevelSite->m_pKeyBoardFocusUser->AddRef(); //} m_pUser->AttachSite(this); if (m_bAttachWindowPending) { m_bAttachWindowPending = FALSE; m_bDetachWndMsgPending = TRUE; // send HX_ATTACH_WINDOW msg to the renderers void * lpParam1 = NULL; void * lpParam2 = NULL; HXxEvent event = {HX_ATTACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0}; m_pUser->HandleEvent(&event); } /* XXXRA * Mac one does scale to full screen and also forces and update message * should not need it! */ return HXR_OK;}/************************************************************************ * Method: * IHXSite::DetachUser */STDMETHODIMP CHXBaseSite::DetachUser(){ if (!m_pUser) return HXR_UNEXPECTED; /* * SetCapture */ if (m_pTopLevelSite->m_pLastUser == m_pUser) { m_pTopLevelSite->m_pLastUser = NULL; } if (m_pTopLevelSite->m_pCaptureUser == m_pUser) { m_pTopLevelSite->m_pCaptureUser= NULL; m_bSetCaptureOn = FALSE; } if (m_CallbackHandle) { m_pScheduler->Remove(m_CallbackHandle); m_CallbackHandle = 0; } if (m_ScrollSiteCallbackHandle) { m_pScheduler->Remove(m_ScrollSiteCallbackHandle); m_ScrollSiteCallbackHandle = 0; } if (m_pUser && m_bDetachWndMsgPending) { // send HX_DETACH_WINDOW msg to the renderers void * lpParam1 = NULL; void * lpParam2 = NULL; HXxEvent event = {HX_DETACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0}; m_bDetachWndMsgPending = FALSE; m_pUser->HandleEvent(&event); } AddRef(); if (HXR_OK == m_pUser->DetachSite()) { if (m_pTopLevelSite->m_pKeyBoardFocusUser == m_pUser) HX_RELEASE(m_pTopLevelSite->m_pKeyBoardFocusUser); HX_RELEASE(m_pUser); } Release(); return HXR_OK;}/************************************************************************ * Method: * IHXSite::GetUser */STDMETHODIMP CHXBaseSite::GetUser(REF(IHXSiteUser*) /*OUT*/ pUser){ if (!m_pUser) return HXR_UNEXPECTED; pUser = m_pUser; pUser->AddRef(); return HXR_OK;}/************************************************************************ * Method: * IHXSite::CreateChild */STDMETHODIMP CHXBaseSite::CreateChild(REF(IHXSite*) /*OUT*/ pChildSite){ _TLSLock(); HRESULT result = HXR_OK; // Create an instance of CHXBaseSite, let it know it's in child // window mode. CHXBaseSite* pChildSiteWindowless = CHXBaseSite::CreateSite(m_pContext, NULL, m_ChildrenMap.GetCount()); pChildSiteWindowless->AddRef(); pChildSiteWindowless->SetParentSite(this); pChildSiteWindowless->SetTopLevelSite(m_pTopLevelSite); pChildSiteWindowless->SetRootSurface(m_pRootSurface); pChildSiteWindowless->SetParentWindow(&m_TopLevelWindow);#ifdef _WIN32 //this is to give the windows sites a chance to hook themselves //into wm_move madness. CHXWinSite* pSiteIt = (CHXWinSite*)pChildSiteWindowless; pSiteIt->HookParents();#endif // Get the IHXSite interface from the child to return to the // outside world. pChildSiteWindowless->QueryInterface(IID_IHXSite, (void**)&pChildSite); // Store the CHXBaseSite in a list of child windows, always keep //a reference to it. ExSiteInfo does an AddRef in constructor m_ChildrenMap.SetAt(pChildSite, pChildSiteWindowless); pChildSite->AddRef(); //Now add the child into or ZOrder sorted list. m_ChildrenInZOrder.AddTail( (void*)pChildSiteWindowless ); //Set the child's origin pChildSiteWindowless->SetOrigin(&m_topleft); if(m_pTopLevelSite) m_pTopLevelSite->ScheduleCallback(CLIP, 0); HXxWindow* pWindow = GetWindow(); //XXXgfw this focus code is disabled for the beamer release. //SafeSetFocus(pWindow); _TLSUnlock(); return HXR_OK;}/************************************************************************ * Method: * IHXSite::DestroyChild */STDMETHODIMP CHXBaseSite::DestroyChild(IHXSite* /*IN*/ pChildSite){ // Avoid dead-lock in vidsurf2 LockBlitters(); FlushSurfaces(); _TLSLock(); //Check and see if we are in the YUV Site list. If so, remove ourselves. LISTPOSITION pPos = zm_YUVSiteList.Find(this); if(pPos) { zm_YUVSiteList.RemoveAt(pPos); } //Verify that the site is actually a child site and find its //position in the list in the event that it is a child. HX_RESULT retVal = HXR_FAIL; CHXBaseSite* pChildSiteWindowless=NULL; if (m_ChildrenMap.Lookup(pChildSite, (void*&) pChildSiteWindowless)) { m_ChildrenMap.RemoveKey(pChildSite); pChildSiteWindowless->Destroy(); pChildSiteWindowless->SetParentSite(NULL); //Remove it from our child z-order list. LISTPOSITION pos,posNext = m_ChildrenInZOrder.GetHeadPosition(); while (posNext) { pos = posNext; CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext); if( pSite == pChildSiteWindowless ) { m_ChildrenInZOrder.RemoveAt(pos); while (posNext) { pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext); INT32 zOrder; pSite->GetZOrder(zOrder); pSite->SetInternalZOrder(zOrder - 1); } break; } } HX_RELEASE(pChildSite); HX_RELEASE(pChildSiteWindowless); retVal = HXR_OK; } HX_ASSERT( m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount() ); if (m_pTopLevelSite==this) { m_pTopLevelSite->RecomputeClip(); } else { if (m_pTopLevelSite) { m_pTopLevelSite->ScheduleCallback(CLIP, 0); } } _TLSUnlock(); UnlockBlitters(); return retVal;}/************************************************************************ * Method: * IHXSite::AttachWatcher */STDMETHODIMP CHXBaseSite::AttachWatcher(IHXSiteWatcher* /*IN*/ pWatcher){ if (m_pWatcher) return HXR_UNEXPECTED; m_pWatcher = pWatcher; if (m_pWatcher) { m_pWatcher->AddRef(); m_pWatcher->AttachSite(this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -