Module: wine Branch: master Commit: c49e894e9f650eb197563eec2a3116d7d4bc8275 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c49e894e9f650eb197563eec2a...
Author: Jacek Caban jacek@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); }