X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=activex%2Foleobject.cpp;h=ec7d8aedbefbaa66ac04a8888642d9040c8c1d8e;hb=d8d6f01c88adcca5e8a5133e6004572e471c994f;hp=217af46d44c311afd0abadffd538e9e71beda8c1;hpb=3d831e04ece115bb9ca379b9552370755453e46e;p=vlc diff --git a/activex/oleobject.cpp b/activex/oleobject.cpp index 217af46d44..ec7d8aedbe 100644 --- a/activex/oleobject.cpp +++ b/activex/oleobject.cpp @@ -65,13 +65,7 @@ STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActi case OLEIVERB_SHOW: case OLEIVERB_OPEN: case OLEIVERB_INPLACEACTIVATE: - if( NULL == hwndParent ) - return OLEOBJ_S_INVALIDHWND; - - if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) ) - return S_OK; - - return OLEOBJ_S_CANNOT_DOVERB_NOW; + return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect); case OLEIVERB_HIDE: _p_instance->setVisible(FALSE); @@ -84,13 +78,7 @@ STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActi return S_OK; default: - if( NULL == hwndParent ) - return OLEOBJ_S_INVALIDHWND; - - if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) ) - return OLEOBJ_S_INVALIDVERB; - - return OLEOBJ_S_CANNOT_DOVERB_NOW; + return OLEOBJ_S_INVALIDVERB; } }; @@ -116,7 +104,7 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) ) { if( S_OK != p_inPlaceSite->CanInPlaceActivate() ) - return E_FAIL; + return OLEOBJ_S_CANNOT_DOVERB_NOW; LPOLEINPLACEFRAME p_inPlaceFrame; LPOLEINPLACEUIWINDOW p_inPlaceUIWindow; @@ -132,10 +120,22 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite if( NULL != p_inPlaceUIWindow ) p_inPlaceUIWindow->Release(); } + + if( (NULL == hwndParent) && FAILED(p_inPlaceSite->GetWindow(&hwndParent)) ) + { + p_inPlaceSite->Release(); + return OLEOBJ_S_INVALIDHWND; + } } + else if( NULL == hwndParent ) + return OLEOBJ_S_INVALIDHWND; if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) ) - return E_FAIL; + { + if( NULL != p_inPlaceSite ) + p_inPlaceSite->Release(); + return OLEOBJ_S_CANNOT_DOVERB_NOW; + } if( NULL != p_inPlaceSite ) p_inPlaceSite->OnPosRectChange(lprcPosRect); @@ -163,7 +163,7 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite } return S_OK; } - return E_FAIL; + return OLEOBJ_S_CANNOT_DOVERB_NOW; }; HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect) @@ -214,7 +214,7 @@ STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite) if( NULL != _p_clientsite ) _p_clientsite->AddRef(); - *ppClientSite= _p_clientsite; + *ppClientSite = _p_clientsite; return S_OK; }; @@ -225,6 +225,16 @@ STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDa STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel) { + if( NULL == pSizel ) + return E_POINTER; + + if( dwDrawAspect & DVASPECT_CONTENT ) + { + *pSizel = _p_instance->getExtent(); + return S_OK; + } + pSizel->cx= 0L; + pSizel->cy= 0L; return E_NOTIMPL; }; @@ -302,8 +312,8 @@ STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite) VariantClear(&v); } } - _p_clientsite = pClientSite; + _p_instance->onClientSiteChanged(pClientSite); return S_OK; }; @@ -314,6 +324,48 @@ STDMETHODIMP VLCOleObject::SetColorScheme(LOGPALETTE *pLogpal) STDMETHODIMP VLCOleObject::SetExtent(DWORD dwDrawAspect, SIZEL *pSizel) { + if( NULL == pSizel ) + return E_POINTER; + + if( dwDrawAspect & DVASPECT_CONTENT ) + { + _p_instance->setExtent(*pSizel); + + if( _p_instance->isInPlaceActive() ) + { + LPOLEINPLACESITE p_inPlaceSite; + + if( SUCCEEDED(_p_clientsite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) ) + { + LPOLECONTROLSITE p_controlSite; + RECT posRect = _p_instance->getPosRect(); + + if( SUCCEEDED(_p_clientsite->QueryInterface(IID_IOleControlSite, (void**)&p_controlSite)) ) + { + // use HIMETRIC to container transform + POINTL extent = { pSizel->cx, pSizel->cy }; + POINTF container; + if( SUCCEEDED(p_controlSite->TransformCoords(&extent, + &container, XFORMCOORDS_SIZE|XFORMCOORDS_HIMETRICTOCONTAINER)) ) + { + posRect.right = ((LONG)container.x)+posRect.left; + posRect.bottom = ((LONG)container.y)+posRect.top; + } + p_controlSite->Release(); + } + else { + // use HIMETRIC to display transform + HDC hDC = CreateDevDC(NULL); + posRect.right = (pSizel->cx*GetDeviceCaps(hDC, LOGPIXELSX)/2540L)+posRect.left; + posRect.bottom = (pSizel->cy*GetDeviceCaps(hDC, LOGPIXELSY)/2540L)+posRect.top; + DeleteDC(hDC); + } + p_inPlaceSite->OnPosRectChange(&posRect); + p_inPlaceSite->Release(); + } + } + return S_OK; + } return E_NOTIMPL; };