From 7cdad62b973eb48c2e11aee0fb50c0de96277cb7 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 13 Apr 2010 20:01:21 +0200 Subject: [PATCH] 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 961bb916370..14e7ebb6f64 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 e378f2648e2..4431d9cd897 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 fa8aa41fedf..f3e43c83136 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. - */ + case WM_PARENTNOTIFY: + TRACE("WM_PARENTNOTIFY %x\n", (unsigned)wParam); - TRACE("WM_RESETFOCUS_HACK\n"); - - 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 c491424fdd4..fb2b0550ac4 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 2561478945d..5c096ed9928 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)