Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Unified Diff: views/widget/native_widget_win.cc

Issue 8384020: Close new bubbles on deactivate; disable rendering Chrome inactive. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove the WS_POPUP style for non-modal dialogs. Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/bubble/bubble_delegate.cc ('k') | views/widget/root_view.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/widget/native_widget_win.cc
diff --git a/views/widget/native_widget_win.cc b/views/widget/native_widget_win.cc
index c356c1269925bf6a40f83e7465660e5b3c47eb1c..14bc4268ff2452c7389657b75e96c7ee5e45a551 100644
--- a/views/widget/native_widget_win.cc
+++ b/views/widget/native_widget_win.cc
@@ -833,6 +833,10 @@ void NativeWidgetWin::Close() {
// Let's hide ourselves right away.
Hide();
+ // Modal dialog windows disable their owner windows; re-enable them now so
+ // they can activate as foreground windows upon this window's destruction.
+ RestoreEnabledIfNecessary();
+
if (!close_widget_factory_.HasWeakPtrs()) {
// And we delay the close so that if we are called from an ATL callback,
// we don't destroy the window before the callback returned (as the caller
@@ -843,22 +847,6 @@ void NativeWidgetWin::Close() {
base::Bind(&NativeWidgetWin::CloseNow,
close_widget_factory_.GetWeakPtr()));
}
-
- // If the user activates another app after opening us, then comes back and
- // closes us, we want our owner to gain activation. But only if the owner
- // is visible. If we don't manually force that here, the other app will
- // regain activation instead.
- // It's tempting to think that this could be done from OnDestroy, but by then
- // it's too late - GetForegroundWindow() will return the window that Windows
- // has decided to re-activate for us instead of this dialog. It's also
- // tempting to think about removing the foreground window check entirely, but
- // it's necessary to this code path from being triggered when an inactive
- // window is closed.
- HWND owner = ::GetWindow(GetNativeView(), GW_OWNER);
- if (owner && GetNativeView() == GetForegroundWindow() &&
- IsWindowVisible(owner)) {
- SetForegroundWindow(owner);
- }
}
void NativeWidgetWin::CloseNow() {
@@ -1315,7 +1303,6 @@ LRESULT NativeWidgetWin::OnCreate(CREATESTRUCT* create_struct) {
}
void NativeWidgetWin::OnDestroy() {
- RestoreEnabledIfNecessary();
delegate_->OnNativeWidgetDestroying();
if (drop_target_.get()) {
RevokeDragDrop(hwnd());
@@ -1605,6 +1592,9 @@ void NativeWidgetWin::OnMoving(UINT param, const LPRECT new_bounds) {
}
LRESULT NativeWidgetWin::OnNCActivate(BOOL active) {
+ if (delegate_->CanActivate())
+ delegate_->OnNativeWidgetActivationChanged(!!active);
+
if (!GetWidget()->non_client_view()) {
SetMsgHandled(FALSE);
return 0;
@@ -1613,8 +1603,6 @@ LRESULT NativeWidgetWin::OnNCActivate(BOOL active) {
if (!delegate_->CanActivate())
return TRUE;
- delegate_->OnNativeWidgetActivationChanged(!!active);
-
// The frame may need to redraw as a result of the activation change.
// We can get WM_NCACTIVATE before we're actually visible. If we're not
// visible, no need to paint.
@@ -2276,6 +2264,11 @@ void NativeWidgetWin::SetInitParams(const Widget::InitParams& params) {
// from the system menu, which is worse. We may need to provide our own
// menu to get the close button to appear properly.
// style &= ~WS_SYSMENU;
+
+ // Set the WS_POPUP style for modal dialogs. This ensures that the owner
+ // window is activated on destruction. This style should not be set for
+ // non-modal non-top-level dialogs like constrained windows.
+ style |= delegate_->IsModal() ? WS_POPUP : 0;
}
ex_style |= delegate_->IsDialogBox() ? WS_EX_DLGMODALFRAME : 0;
break;
« no previous file with comments | « views/bubble/bubble_delegate.cc ('k') | views/widget/root_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698