SHDOCVW: Added OLEIVERB_INPLACEACTIVATE implementation in IOleObject::DoVerb

Jacek Caban jacek at codeweavers.com
Tue Nov 15 16:06:59 CST 2005


Changelog:
    Added OLEIVERB_INPLACEACTIVATE implementation in IOleObject::DoVerb
-------------- next part --------------
--- dlls/shdocvw/shdocvw.h.old	2005-11-15 22:55:36.000000000 +0100
+++ dlls/shdocvw/shdocvw.h	2005-11-15 22:49:33.000000000 +0100
@@ -81,6 +81,17 @@
     IUnknown *document;
 
     IOleClientSite *client;
+    IOleContainer *container;
+
+    /* window context */
+
+    HWND iphwnd;
+    HWND frame_hwnd;
+    IOleInPlaceFrame *frame;
+    IOleInPlaceUIWindow *uiwindow;
+    RECT pos_rect;
+    RECT clip_rect;
+    OLEINPLACEFRAMEINFO frameinfo;
 } WebBrowser;
 
 #define WEBBROWSER(x)   ((IWebBrowser*)                 &(x)->lpWebBrowser2Vtbl)
@@ -108,6 +119,8 @@
 
 void WebBrowser_ClientSite_Init(WebBrowser*);
 
+void WebBrowser_OleObject_Destroy(WebBrowser*);
+
 HRESULT WebBrowser_Create(IUnknown*,REFIID,void**);
 
 /**********************************************************************
Index: dlls/shdocvw/webbrowser.c
===================================================================
RCS file: /home/wine/wine/dlls/shdocvw/webbrowser.c,v
retrieving revision 1.22
diff -u -p -r1.22 webbrowser.c
--- dlls/shdocvw/webbrowser.c	15 Nov 2005 12:03:25 -0000	1.22
+++ dlls/shdocvw/webbrowser.c	15 Nov 2005 22:07:17 -0000
@@ -121,12 +121,11 @@ static ULONG WINAPI WebBrowser_Release(I
     TRACE("(%p) ref=%ld\n", This, ref);
 
     if(!ref) {
-        if(This->client)
-            IOleClientSite_Release(This->client);
-
         if(This->document)
             IUnknown_Release(This->document);
 
+        WebBrowser_OleObject_Destroy(This);
+
         HeapFree(GetProcessHeap(), 0, This);
         SHDOCVW_UnlockModule();
     }
Index: dlls/shdocvw/oleobject.c
===================================================================
RCS file: /home/wine/wine/dlls/shdocvw/oleobject.c,v
retrieving revision 1.17
diff -u -p -r1.17 oleobject.c
--- dlls/shdocvw/oleobject.c	16 Sep 2005 18:44:37 -0000	1.17
+++ dlls/shdocvw/oleobject.c	15 Nov 2005 22:07:17 -0000
@@ -138,15 +138,58 @@ static HRESULT WINAPI OleObject_DoVerb(I
         LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
 {
     WebBrowser *This = OLEOBJ_THIS(iface);
-    FIXME("(%p)->(%ld %p %p %ld %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
+    HRESULT hres;
+
+    TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
             lprcPosRect);
+
     switch (iVerb)
     {
-    case OLEIVERB_INPLACEACTIVATE:
-        FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
-        break;
-    case OLEIVERB_HIDE:
-        FIXME ("stub for OLEIVERB_HIDE\n");
+    case OLEIVERB_INPLACEACTIVATE: {
+        IOleInPlaceSite *inplace;
+
+        TRACE("OLEIVERB_INPLACEACTIVATE\n");
+
+        if(!pActiveSite)
+            return E_INVALIDARG;
+
+        hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleInPlaceSite, (void**)&inplace);
+        if(FAILED(hres)) {
+            WARN("Could not get IOleInPlaceSite\n");
+            return hres;
+        }
+
+        hres = IOleInPlaceSite_CanInPlaceActivate(inplace);
+        if(hres != S_OK) {
+            WARN("CanInPlaceActivate returned: %08lx\n", hres);
+            IOleInPlaceSite_Release(inplace);
+            return E_FAIL;
+        }
+
+        hres = IOleInPlaceSite_GetWindow(inplace, &This->iphwnd);
+        if(FAILED(hres))
+            This->iphwnd = hwndParent;
+
+        IOleInPlaceSite_OnInPlaceActivate(inplace);
+
+        IOleInPlaceSite_GetWindowContext(inplace, &This->frame, &This->uiwindow,
+                                         &This->pos_rect, &This->clip_rect,
+                                         &This->frameinfo);
+
+        IOleInPlaceSite_Release(inplace);
+
+        if(This->client) {
+            IOleClientSite_ShowObject(This->client);
+            IOleClientSite_GetContainer(This->client, &This->container);
+        }
+
+        if(This->frame)
+            IOleInPlaceFrame_GetWindow(This->frame, &This->frame_hwnd);
+
+        return S_OK;
+    }
+    default:
+        FIXME("stub for %ld\n", iVerb);
         break;
     }
 
@@ -450,4 +493,25 @@ void WebBrowser_OleObject_Init(WebBrowse
     This->lpOleControlVtbl       = &OleControlVtbl;
 
     This->client = NULL;
+    This->container = NULL;
+    This->iphwnd = NULL;
+    This->frame_hwnd = NULL;
+    This->frame = NULL;
+    This->uiwindow = NULL;
+
+    memset(&This->pos_rect, 0, sizeof(RECT));
+    memset(&This->clip_rect, 0, sizeof(RECT));
+    memset(&This->frameinfo, 0, sizeof(OLEINPLACEFRAMEINFO));
+}
+
+void WebBrowser_OleObject_Destroy(WebBrowser *This)
+{
+    if(This->client)
+        IOleClientSite_Release(This->client);
+    if(This->container)
+        IOleContainer_Release(This->container);
+    if(This->frame)
+        IOleInPlaceFrame_Release(This->frame);
+    if(This->uiwindow)
+        IOleInPlaceUIWindow_Release(This->uiwindow);
 }


More information about the wine-patches mailing list