Jacek Caban : mshtml: Reset focus after loading the page in edit mode.

Alexandre Julliard julliard at winehq.org
Mon Nov 12 06:27:26 CST 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov 12 01:23:47 2007 +0100

mshtml: Reset focus after loading the page in edit mode.

---

 dlls/mshtml/editor.c         |    1 +
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/nsembed.c        |   30 ++++++++++++++++++++++++------
 dlls/mshtml/nsevents.c       |    4 ++--
 4 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c
index 51f5f26..827fa07 100644
--- a/dlls/mshtml/editor.c
+++ b/dlls/mshtml/editor.c
@@ -524,6 +524,7 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event)
 
 void handle_edit_load(HTMLDocument *This)
 {
+    This->nscontainer->reset_focus = GetFocus();
     get_editor_controller(This->nscontainer);
 }
 
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 2a8627c..a35347e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -209,6 +209,7 @@ struct NSContainer {
     HWND hwnd;
 
     BSCallback *bscallback; /* hack */
+    HWND reset_focus; /* hack */
 };
 
 typedef struct {
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 9b8740d..00b98b2 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -81,6 +81,8 @@ 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;
@@ -96,13 +98,25 @@ static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
     }
 
     switch(msg) {
-        case WM_SIZE:
-            TRACE("(%p)->(WM_SIZE)\n", This);
+    case WM_SIZE:
+        TRACE("(%p)->(WM_SIZE)\n", This);
+
+        nsres = nsIBaseWindow_SetSize(This->window,
+                LOWORD(lParam), HIWORD(lParam), TRUE);
+        if(NS_FAILED(nsres))
+            WARN("SetSize failed: %08x\n", nsres);
+        break;
 
-            nsres = nsIBaseWindow_SetSize(This->window,
-                    LOWORD(lParam), HIWORD(lParam), TRUE);
-            if(NS_FAILED(nsres))
-                WARN("SetSize failed: %08x\n", nsres);
+    case WM_RESETFOCUS_HACK:
+        /*
+         * FIXME
+         * Gecko grabs focus in edit mode and some apps don't like it.
+         * We should somehow prevent grabbing focus.
+         */
+        if(This->reset_focus) {
+            SetFocus(This->reset_focus);
+            This->reset_focus = NULL;
+        }
     }
 
     return DefWindowProcW(hwnd, msg, wParam, lParam);
@@ -1293,6 +1307,9 @@ 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);
 }
 
@@ -1558,6 +1575,7 @@ NSContainer *NSContainer_Create(HTMLDocument *doc, NSContainer *parent)
     ret->content_listener = NULL;
     ret->editor_controller = NULL;
     ret->editor = NULL;
+    ret->reset_focus = NULL;
 
     if(parent)
         nsIWebBrowserChrome_AddRef(NSWBCHROME(parent));
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index b61aec2..3c532f0 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -90,7 +90,7 @@ static nsresult NSAPI handle_blur(nsIDOMEventListener *iface, nsIDOMEvent *event
 
     TRACE("(%p)\n", This);
 
-    if(This->doc && This->doc->focus && !is_doc_child_focus(This)) {
+    if(!This->reset_focus && This->doc && This->doc->focus && !is_doc_child_focus(This)) {
         This->doc->focus = FALSE;
         notif_focus(This->doc);
     }
@@ -104,7 +104,7 @@ static nsresult NSAPI handle_focus(nsIDOMEventListener *iface, nsIDOMEvent *even
 
     TRACE("(%p)\n", This);
 
-    if(This->doc && !This->doc->focus) {
+    if(!This->reset_focus && This->doc && !This->doc->focus) {
         This->doc->focus = TRUE;
         notif_focus(This->doc);
     }




More information about the wine-cvs mailing list