Module: wine Branch: master Commit: 8c06ed96aeb737e5596e190efe785a2c2c97237e URL: http://source.winehq.org/git/wine.git/?a=commit;h=8c06ed96aeb737e5596e190efe...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Dec 7 14:54:33 2009 +0100
mshtml: Improved OleDocumentView_UIActivate implementation.
---
dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/view.c | 44 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index bf539d4..012d543 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -379,6 +379,7 @@ struct HTMLDocumentObj { HWND hwnd; HWND tooltips_hwnd;
+ BOOL request_uiactivate; BOOL in_place_active; BOOL ui_active; BOOL window_active; diff --git a/dlls/mshtml/view.c b/dlls/mshtml/view.c index 0d1d055..271a167 100644 --- a/dlls/mshtml/view.c +++ b/dlls/mshtml/view.c @@ -342,6 +342,14 @@ static HRESULT activate_window(HTMLDocumentObj *This) IOleInPlaceFrame_Release(This->frame); This->frame = pIPFrame;
+ if(!This->request_uiactivate) { + hres = IOleInPlaceSite_QueryInterface(This->ipsite, &IID_IOleInPlaceSiteEx, (void**)&ipsiteex); + if(SUCCEEDED(hres)) { + IOleInPlaceSiteEx_RequestUIActivate(ipsiteex); + IOleInPlaceSiteEx_Release(ipsiteex); + } + } + This->window_active = TRUE;
return S_OK; @@ -466,6 +474,7 @@ static HRESULT WINAPI OleDocumentView_SetInPlaceSite(IOleDocumentView *iface, IO IOleInPlaceSite_Release(This->doc_obj->ipsite);
This->doc_obj->ipsite = pIPSite; + This->doc_obj->request_uiactivate = TRUE; return S_OK; }
@@ -557,6 +566,10 @@ static HRESULT WINAPI OleDocumentView_Show(IOleDocumentView *iface, BOOL fShow) ShowWindow(This->doc_obj->hwnd, SW_SHOW); }else { ShowWindow(This->doc_obj->hwnd, SW_HIDE); + + if(This->doc_obj->in_place_active) + IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This)); + if(This->doc_obj->ip_window) { IOleInPlaceUIWindow_Release(This->doc_obj->ip_window); This->doc_obj->ip_window = NULL; @@ -574,8 +587,35 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f TRACE("(%p)->(%x)\n", This, fUIActivate);
if(!This->doc_obj->ipsite) { - FIXME("This->ipsite = NULL\n"); - return E_FAIL; + IOleClientSite *cs = This->doc_obj->client; + IOleInPlaceSite *ips; + + if(!cs) { + WARN("this->ipsite = NULL\n"); + return E_UNEXPECTED; + } + + hres = IOleClientSite_QueryInterface(cs, &IID_IOleInPlaceSiteWindowless, (void**)&ips); + if(SUCCEEDED(hres)) + This->doc_obj->ipsite = ips; + else { + hres = IOleClientSite_QueryInterface(cs, &IID_IOleInPlaceSiteEx, (void**)&ips); + if(SUCCEEDED(hres)) + This->doc_obj->ipsite = ips; + else { + hres = IOleClientSite_QueryInterface(cs, &IID_IOleInPlaceSite, (void**)&ips); + if(SUCCEEDED(hres)) + This->doc_obj->ipsite = ips; + else { + WARN("this->ipsite = NULL\n"); + return E_NOINTERFACE; + } + } + } + + IOleClientSite_AddRef(This->doc_obj->ipsite); + This->doc_obj->request_uiactivate = FALSE; + HTMLDocument_LockContainer(This->doc_obj, TRUE); }
if(fUIActivate) {