Jacek Caban : ieframe: Added support for OnFocus notifications.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 28 13:30:07 CDT 2015


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jul 28 15:18:30 2015 +0200

ieframe: Added support for OnFocus notifications.

---

 dlls/ieframe/oleobject.c        | 28 ++++++++++++++++++++++++++--
 dlls/ieframe/tests/webbrowser.c | 20 ++++++++++++--------
 2 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/dlls/ieframe/oleobject.c b/dlls/ieframe/oleobject.c
index 462cf74..d02562d 100644
--- a/dlls/ieframe/oleobject.c
+++ b/dlls/ieframe/oleobject.c
@@ -49,6 +49,22 @@ static LRESULT resize_window(WebBrowser *This, LONG width, LONG height)
     return 0;
 }
 
+static void notify_on_focus(WebBrowser *This, BOOL got_focus)
+{
+    IOleControlSite *control_site;
+    HRESULT hres;
+
+    if(!This->client)
+        return;
+
+    hres = IOleClientSite_QueryInterface(This->client, &IID_IOleControlSite, (void**)&control_site);
+    if(FAILED(hres))
+        return;
+
+    IOleControlSite_OnFocus(control_site, got_focus);
+    IOleControlSite_Release(control_site);
+}
+
 static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     WebBrowser *This;
@@ -67,6 +83,12 @@ static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, L
         return resize_window(This, LOWORD(lParam), HIWORD(lParam));
     case WM_DOCHOSTTASK:
         return process_dochost_tasks(&This->doc_host);
+    case WM_SETFOCUS:
+        notify_on_focus(This, TRUE);
+        break;
+    case WM_KILLFOCUS:
+        notify_on_focus(This, FALSE);
+        break;
     }
 
     return DefWindowProcW(hwnd, msg, wParam, lParam);
@@ -203,6 +225,7 @@ static HRESULT activate_ui(WebBrowser *This, IOleClientSite *active_site)
         IOleInPlaceFrame_SetMenu(This->doc_host.frame, NULL, NULL, This->shell_embedding_hwnd);
 
     SetFocus(This->shell_embedding_hwnd);
+    notify_on_focus(This, TRUE);
 
     return S_OK;
 }
@@ -534,10 +557,11 @@ static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
     if(This->uiwindow)
         IOleInPlaceUIWindow_SetActiveObject(This->uiwindow, NULL, NULL);
 
-    if(This->inplace) {
+    if(This->inplace)
         IOleInPlaceSiteEx_OnUIDeactivate(This->inplace, FALSE);
+    notify_on_focus(This, FALSE);
+    if(This->inplace)
         IOleInPlaceSiteEx_OnInPlaceDeactivate(This->inplace);
-    }
 
     return IOleObject_SetClientSite(iface, NULL);
 }
diff --git a/dlls/ieframe/tests/webbrowser.c b/dlls/ieframe/tests/webbrowser.c
index 9ceed46..aa90755 100644
--- a/dlls/ieframe/tests/webbrowser.c
+++ b/dlls/ieframe/tests/webbrowser.c
@@ -143,7 +143,8 @@ DEFINE_EXPECT(OnUIDeactivate);
 DEFINE_EXPECT(OnInPlaceDeactivate);
 DEFINE_EXPECT(RequestUIActivate);
 DEFINE_EXPECT(ControlSite_TranslateAccelerator);
-DEFINE_EXPECT(OnFocus);
+DEFINE_EXPECT(OnFocus_TRUE);
+DEFINE_EXPECT(OnFocus_FALSE);
 DEFINE_EXPECT(GetExternal);
 
 static const WCHAR wszItem[] = {'i','t','e','m',0};
@@ -1135,7 +1136,10 @@ static HRESULT WINAPI IOleControlSite_fnTranslateAccelerator(IOleControlSite* Th
 
 static HRESULT WINAPI IOleControlSite_fnOnFocus(IOleControlSite* This, BOOL fGotFocus)
 {
-    CHECK_EXPECT2(OnFocus);
+    if(fGotFocus)
+        CHECK_EXPECT2(OnFocus_TRUE);
+    else
+        CHECK_EXPECT2(OnFocus_FALSE);
     return E_NOTIMPL;
 }
 
@@ -1813,7 +1817,7 @@ static void test_DoVerb(IWebBrowser2 *unk)
     SET_EXPECT(Frame_SetActiveObject);
     SET_EXPECT(UIWindow_SetActiveObject);
     SET_EXPECT(SetMenu);
-    SET_EXPECT(OnFocus);
+    SET_EXPECT(OnFocus_TRUE);
 
     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
                              0, (HWND)0xdeadbeef, &rect);
@@ -1830,7 +1834,7 @@ static void test_DoVerb(IWebBrowser2 *unk)
     CHECK_CALLED(Frame_SetActiveObject);
     CHECK_CALLED(UIWindow_SetActiveObject);
     CHECK_CALLED(SetMenu);
-    todo_wine CHECK_CALLED(OnFocus);
+    CHECK_CALLED(OnFocus_TRUE);
 
     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
                            0, (HWND)0xdeadbeef, &rect);
@@ -3213,7 +3217,7 @@ static void test_UIActivate(IWebBrowser2 *unk, BOOL activate)
             SET_EXPECT(RequestUIActivate);
             SET_EXPECT(ShowUI);
             SET_EXPECT(HideUI);
-            SET_EXPECT(OnFocus);
+            SET_EXPECT(OnFocus_FALSE);
         }
 
         hres = IOleDocumentView_UIActivate(docview, activate);
@@ -3227,7 +3231,7 @@ static void test_UIActivate(IWebBrowser2 *unk, BOOL activate)
                 CHECK_CALLED(RequestUIActivate);
                 CHECK_CALLED(ShowUI);
                 CHECK_CALLED(HideUI);
-                CHECK_CALLED(OnFocus);
+                CHECK_CALLED(OnFocus_FALSE);
             }
         }
 
@@ -3490,7 +3494,7 @@ static void test_Close(IWebBrowser2 *wb, BOOL do_download)
     SET_EXPECT(Frame_SetActiveObject);
     SET_EXPECT(UIWindow_SetActiveObject);
     SET_EXPECT(OnUIDeactivate);
-    SET_EXPECT(OnFocus);
+    SET_EXPECT(OnFocus_FALSE);
     SET_EXPECT(OnInPlaceDeactivate);
     SET_EXPECT(Invoke_STATUSTEXTCHANGE);
     if(!do_download) {
@@ -3513,7 +3517,7 @@ static void test_Close(IWebBrowser2 *wb, BOOL do_download)
     CHECK_CALLED(Frame_SetActiveObject);
     CHECK_CALLED(UIWindow_SetActiveObject);
     CHECK_CALLED(OnUIDeactivate);
-    todo_wine CHECK_CALLED(OnFocus);
+    CHECK_CALLED(OnFocus_FALSE);
     CHECK_CALLED(OnInPlaceDeactivate);
     CLEAR_CALLED(Invoke_STATUSTEXTCHANGE); /* Called by IE9 */
     if(!do_download) {




More information about the wine-cvs mailing list