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