Jacek Caban : mshtml: Improved focus handling.

Alexandre Julliard julliard at winehq.org
Wed Apr 14 11:24:55 CDT 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Apr 13 20:01:21 2010 +0200

mshtml: Improved focus handling.

---

 dlls/mshtml/editor.c         |    1 -
 dlls/mshtml/mshtml_private.h |    2 --
 dlls/mshtml/nsembed.c        |   24 ++++++------------------
 dlls/mshtml/nsevents.c       |    4 ++--
 dlls/mshtml/view.c           |    7 ++++++-
 5 files changed, 14 insertions(+), 24 deletions(-)

diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c
index 961bb91..14e7ebb 100644
--- a/dlls/mshtml/editor.c
+++ b/dlls/mshtml/editor.c
@@ -508,7 +508,6 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event)
 
 void handle_edit_load(HTMLDocument *This)
 {
-    This->doc_obj->nscontainer->reset_focus = GetFocus();
     get_editor_controller(This->doc_obj->nscontainer);
 }
 
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index e378f26..4431d9c 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -437,8 +437,6 @@ struct NSContainer {
     nsIURIContentListener *content_listener;
 
     HWND hwnd;
-
-    HWND reset_focus; /* hack */
 };
 
 typedef struct nsWineURI nsWineURI;
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index fa8aa41..f3e43c8 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -80,8 +80,6 @@ static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e','
 
 static ATOM nscontainer_class;
 
-#define WM_RESETFOCUS_HACK WM_USER+600
-
 static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     NSContainer *This;
@@ -106,20 +104,13 @@ static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
             WARN("SetSize failed: %08x\n", nsres);
         break;
 
-    case WM_RESETFOCUS_HACK:
-        /*
-         * FIXME
-         * Gecko grabs focus in edit mode and some apps don't like it.
-         * We should somehow prevent grabbing focus.
-         */
-
-        TRACE("WM_RESETFOCUS_HACK\n");
+    case WM_PARENTNOTIFY:
+        TRACE("WM_PARENTNOTIFY %x\n", (unsigned)wParam);
 
-        if(This->reset_focus) {
-            SetFocus(This->reset_focus);
-            This->reset_focus = NULL;
-            if(This->doc)
-                This->doc->focus = FALSE;
+        switch(wParam) {
+        case WM_LBUTTONDOWN:
+        case WM_RBUTTONDOWN:
+            nsIWebBrowserFocus_Activate(This->focus);
         }
     }
 
@@ -1316,9 +1307,6 @@ static nsresult NSAPI nsEmbeddingSiteWindow_SetFocus(nsIEmbeddingSiteWindow *ifa
 
     TRACE("(%p)\n", This);
 
-    if(This->reset_focus)
-        PostMessageW(This->hwnd, WM_RESETFOCUS_HACK, 0, 0);
-
     return nsIBaseWindow_SetFocus(This->window);
 }
 
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index c491424..fb2b055 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -129,7 +129,7 @@ static nsresult NSAPI handle_blur(nsIDOMEventListener *iface, nsIDOMEvent *event
         return NS_ERROR_FAILURE;
     doc_obj = doc->basedoc.doc_obj;
 
-    if(!doc_obj->nscontainer->reset_focus && doc_obj->focus && !is_doc_child_focus(doc_obj)) {
+    if(doc_obj->focus && !is_doc_child_focus(doc_obj)) {
         doc_obj->focus = FALSE;
         notif_focus(doc_obj);
     }
@@ -148,7 +148,7 @@ static nsresult NSAPI handle_focus(nsIDOMEventListener *iface, nsIDOMEvent *even
         return NS_ERROR_FAILURE;
     doc_obj = doc->basedoc.doc_obj;
 
-    if(!doc_obj->nscontainer->reset_focus && !doc_obj->focus) {
+    if(!doc_obj->focus) {
         doc_obj->focus = TRUE;
         notif_focus(doc_obj);
     }
diff --git a/dlls/mshtml/view.c b/dlls/mshtml/view.c
index 2561478..5c096ed 100644
--- a/dlls/mshtml/view.c
+++ b/dlls/mshtml/view.c
@@ -92,7 +92,6 @@ static void activate_gecko(NSContainer *This)
 
     nsIBaseWindow_SetVisibility(This->window, TRUE);
     nsIBaseWindow_SetEnabled(This->window, TRUE);
-    nsIWebBrowserFocus_Activate(This->focus);
 }
 
 void update_doc(HTMLDocument *This, DWORD flags)
@@ -216,6 +215,10 @@ static LRESULT WINAPI serverwnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
         break;
     case WM_TIMER:
         return on_timer(This);
+    case WM_SETFOCUS:
+        TRACE("(%p) WM_SETFOCUS\n", This);
+        nsIWebBrowserFocus_Activate(This->nscontainer->focus);
+        break;
     case WM_MOUSEACTIVATE:
         return MA_ACTIVATE;
     }
@@ -664,6 +667,8 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f
 
         This->doc_obj->ui_active = TRUE;
     }else {
+        This->doc_obj->focus = FALSE;
+        nsIWebBrowserFocus_Deactivate(This->doc_obj->nscontainer->focus);
         if(This->doc_obj->ui_active) {
             This->doc_obj->ui_active = FALSE;
             if(This->doc_obj->ip_window)




More information about the wine-cvs mailing list