diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1ee8148bf59..1b8b02f012e 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -116,6 +116,7 @@ struct HTMLDocument { BOOL window_active; BOOL has_key_path; BOOL container_locked; + BOOL focus; DWORD update; @@ -141,6 +142,8 @@ struct NSContainer { const nsIWeakReferenceVtbl *lpWeakReferenceVtbl; const nsISupportsWeakReferenceVtbl *lpSupportsWeakReferenceVtbl; + nsEventListener blur_listener; + nsEventListener focus_listener; nsEventListener keypress_listener; nsEventListener load_listener; @@ -327,6 +330,7 @@ void NSContainer_Release(NSContainer*); void HTMLDocument_LockContainer(HTMLDocument*,BOOL); void show_context_menu(HTMLDocument*,DWORD,POINT*); +void notif_focus(HTMLDocument*); void show_tooltip(HTMLDocument*,DWORD,DWORD,LPCWSTR); void hide_tooltip(HTMLDocument*); diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 2a04111dc77..255716c11af 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -72,6 +72,46 @@ static nsrefcnt NSAPI nsDOMEventListener_Release(nsIDOMEventListener *iface) return nsIWebBrowserChrome_Release(NSWBCHROME(This)); } +static BOOL is_doc_child_focus(NSContainer *This) +{ + HWND hwnd; + + if(!This->doc) + return FALSE; + + for(hwnd = GetFocus(); hwnd && hwnd != This->doc->hwnd; hwnd = GetParent(hwnd)); + + return hwnd == This->doc->hwnd; +} + +static nsresult NSAPI handle_blur(nsIDOMEventListener *iface, nsIDOMEvent *event) +{ + NSContainer *This = NSEVENTLIST_THIS(iface)->This; + + TRACE("(%p)\n", This); + + if(This->doc && This->doc->focus && !is_doc_child_focus(This)) { + This->doc->focus = FALSE; + notif_focus(This->doc); + } + + return NS_OK; +} + +static nsresult NSAPI handle_focus(nsIDOMEventListener *iface, nsIDOMEvent *event) +{ + NSContainer *This = NSEVENTLIST_THIS(iface)->This; + + TRACE("(%p)\n", This); + + if(This->doc && !This->doc->focus) { + This->doc->focus = TRUE; + notif_focus(This->doc); + } + + return NS_OK; +} + static nsresult NSAPI handle_keypress(nsIDOMEventListener *iface, nsIDOMEvent *event) { @@ -129,6 +169,8 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event handler, \ }; +static const nsIDOMEventListenerVtbl blur_vtbl = EVENTLISTENER_VTBL(handle_blur); +static const nsIDOMEventListenerVtbl focus_vtbl = EVENTLISTENER_VTBL(handle_focus); static const nsIDOMEventListenerVtbl keypress_vtbl = EVENTLISTENER_VTBL(handle_keypress); static const nsIDOMEventListenerVtbl load_vtbl = EVENTLISTENER_VTBL(handle_load); @@ -159,9 +201,13 @@ void init_nsevents(NSContainer *This) nsIDOMEventTarget *target; nsresult nsres; + static const PRUnichar wsz_blur[] = {'b','l','u','r',0}; + static const PRUnichar wsz_focus[] = {'f','o','c','u','s',0}; static const PRUnichar wsz_keypress[] = {'k','e','y','p','r','e','s','s',0}; static const PRUnichar wsz_load[] = {'l','o','a','d',0}; + init_listener(&This->blur_listener, This, &blur_vtbl); + init_listener(&This->focus_listener, This, &focus_vtbl); init_listener(&This->keypress_listener, This, &keypress_vtbl); init_listener(&This->load_listener, This, &load_vtbl); @@ -178,6 +224,8 @@ void init_nsevents(NSContainer *This) return; } + init_event(target, wsz_blur, NSEVENTLIST(&This->blur_listener), TRUE); + init_event(target, wsz_focus, NSEVENTLIST(&This->focus_listener), TRUE); init_event(target, wsz_keypress, NSEVENTLIST(&This->keypress_listener), FALSE); init_event(target, wsz_load, NSEVENTLIST(&This->load_listener), TRUE); diff --git a/dlls/mshtml/view.c b/dlls/mshtml/view.c index 14648c7eafb..c51bcf10b76 100644 --- a/dlls/mshtml/view.c +++ b/dlls/mshtml/view.c @@ -164,6 +164,19 @@ static LRESULT on_timer(HTMLDocument *This) return 0; } +void notif_focus(HTMLDocument *This) +{ + IOleControlSite *site; + HRESULT hres; + + hres = IOleClientSite_QueryInterface(This->client, &IID_IOleControlSite, (void**)&site); + if(FAILED(hres)) + return; + + IOleControlSite_OnFocus(site, This->focus); + IOleControlSite_Release(site); +} + static LRESULT WINAPI serverwnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HTMLDocument *This; @@ -771,6 +784,7 @@ void HTMLDocument_View_Init(HTMLDocument *This) This->in_place_active = FALSE; This->ui_active = FALSE; This->window_active = FALSE; + This->focus = FALSE; This->update = 0; }