diff options
author | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-14 18:57:22 +0000 |
---|---|---|
committer | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-14 18:57:22 +0000 |
commit | 886f4f9d55ddaf72f7e0b870f5510538dae38281 (patch) | |
tree | 7fe9f6f702d9269e58226af5090bdaa997c64ccd /views/widget | |
parent | b842d4c63ecce6aacb5aa1e184582ee1c5ce4a9e (diff) | |
download | chromium_src-886f4f9d55ddaf72f7e0b870f5510538dae38281.zip chromium_src-886f4f9d55ddaf72f7e0b870f5510538dae38281.tar.gz chromium_src-886f4f9d55ddaf72f7e0b870f5510538dae38281.tar.bz2 |
The focus is not restored properly when a Windows modal dialog
(such as "open file', 'print'...) is closed.
We are running these dialogs from a different thread and they
cause the browser window to get activated before it has been
enabled. This causes the focus restoration to fail as the window
is not enabled.
In an earlier patch, I fixed it by storing/restoring the focus
explicitly before/after the dialog is shown.
But the fix did not apply to the print dialog which does not use
the code I added my fix in.
This CL reverts that previous fix and comes with a simpler solution:
if when we are about to restore focus the window is disabled, we
delay the focus restoration untill the window is enabled again.
BUG=3380
TEST=Set the focus on a page with scroll-bars, right-click to do a
'save as'. Close the dialog. The arrow keys should let you scroll
the page. Accelerators such as Ctrl-T should still work. Test
'open a file', 'print' and the font selection dialog (in the options).
When closing the dialog the focus should return to the view that last
had focus.
Review URL: http://codereview.chromium.org/199106
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26135 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/widget')
-rw-r--r-- | views/widget/widget_win.cc | 18 | ||||
-rw-r--r-- | views/widget/widget_win.h | 4 |
2 files changed, 21 insertions, 1 deletions
diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc index 8fbf31e..13df3ad 100644 --- a/views/widget/widget_win.cc +++ b/views/widget/widget_win.cc @@ -52,7 +52,8 @@ WidgetWin::WidgetWin() can_update_layered_window_(true), last_mouse_event_was_move_(false), is_mouse_down_(false), - is_window_(false) { + is_window_(false), + restore_focus_when_enabled_(false) { } WidgetWin::~WidgetWin() { @@ -926,6 +927,10 @@ LRESULT WidgetWin::OnWndProc(UINT message, WPARAM w_param, LPARAM l_param) { OnFinalMessage(window); if (message == WM_ACTIVATE) PostProcessActivateMessage(this, LOWORD(w_param)); + if (message == WM_ENABLE && restore_focus_when_enabled_) { + restore_focus_when_enabled_ = false; + focus_manager_->RestoreFocusedView(); + } return result; } @@ -941,6 +946,17 @@ void WidgetWin::PostProcessActivateMessage(WidgetWin* widget, } else { // We must restore the focus after the message has been DefProc'ed as it // does set the focus to the last focused HWND. + // Note that if the window is not enabled, we cannot restore the focus as + // calling ::SetFocus on a child of the non-enabled top-window would fail. + // This is the case when showing a modal dialog (such as 'open file', + // 'print'...) from a different thread. + // In that case we delay the focus restoration to when the window is enabled + // again. + if (!IsWindowEnabled(widget->GetNativeView())) { + DCHECK(!widget->restore_focus_when_enabled_); + widget->restore_focus_when_enabled_ = true; + return; + } widget->focus_manager_->RestoreFocusedView(); } } diff --git a/views/widget/widget_win.h b/views/widget/widget_win.h index 88a2a33..787281d 100644 --- a/views/widget/widget_win.h +++ b/views/widget/widget_win.h @@ -586,6 +586,10 @@ class WidgetWin : public base::WindowImpl, int last_mouse_move_x_; int last_mouse_move_y_; + // Whether the focus should be restored next time we get enabled. Needed to + // restore focus correctly when Windows modal dialogs are displayed. + bool restore_focus_when_enabled_; + // Instance of accessibility information and handling for MSAA root ScopedComPtr<IAccessible> accessibility_root_; |