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