Piotr Caban : mshtml: Improved OleDocumentView_UIActivate implementation.

Alexandre Julliard julliard at winehq.org
Mon Dec 7 10:26:20 CST 2009


Module: wine
Branch: master
Commit: 8c06ed96aeb737e5596e190efe785a2c2c97237e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8c06ed96aeb737e5596e190efe785a2c2c97237e

Author: Piotr Caban <piotr at 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) {




More information about the wine-cvs mailing list