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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « views/bubble/bubble_delegate.cc ('k') | views/widget/root_view.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "views/widget/native_widget_win.h" 5 #include "views/widget/native_widget_win.h"
6 6
7 #include <dwmapi.h> 7 #include <dwmapi.h>
8 #include <shellapi.h> 8 #include <shellapi.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 SetWindowRgn(region, TRUE); 826 SetWindowRgn(region, TRUE);
827 } 827 }
828 828
829 void NativeWidgetWin::Close() { 829 void NativeWidgetWin::Close() {
830 if (!IsWindow()) 830 if (!IsWindow())
831 return; // No need to do anything. 831 return; // No need to do anything.
832 832
833 // Let's hide ourselves right away. 833 // Let's hide ourselves right away.
834 Hide(); 834 Hide();
835 835
836 // Modal dialog windows disable their owner windows; re-enable them now so
837 // they can activate as foreground windows upon this window's destruction.
838 RestoreEnabledIfNecessary();
839
836 if (!close_widget_factory_.HasWeakPtrs()) { 840 if (!close_widget_factory_.HasWeakPtrs()) {
837 // And we delay the close so that if we are called from an ATL callback, 841 // And we delay the close so that if we are called from an ATL callback,
838 // we don't destroy the window before the callback returned (as the caller 842 // we don't destroy the window before the callback returned (as the caller
839 // may delete ourselves on destroy and the ATL callback would still 843 // may delete ourselves on destroy and the ATL callback would still
840 // dereference us when the callback returns). 844 // dereference us when the callback returns).
841 MessageLoop::current()->PostTask( 845 MessageLoop::current()->PostTask(
842 FROM_HERE, 846 FROM_HERE,
843 base::Bind(&NativeWidgetWin::CloseNow, 847 base::Bind(&NativeWidgetWin::CloseNow,
844 close_widget_factory_.GetWeakPtr())); 848 close_widget_factory_.GetWeakPtr()));
845 } 849 }
846
847 // If the user activates another app after opening us, then comes back and
848 // closes us, we want our owner to gain activation. But only if the owner
849 // is visible. If we don't manually force that here, the other app will
850 // regain activation instead.
851 // It's tempting to think that this could be done from OnDestroy, but by then
852 // it's too late - GetForegroundWindow() will return the window that Windows
853 // has decided to re-activate for us instead of this dialog. It's also
854 // tempting to think about removing the foreground window check entirely, but
855 // it's necessary to this code path from being triggered when an inactive
856 // window is closed.
857 HWND owner = ::GetWindow(GetNativeView(), GW_OWNER);
858 if (owner && GetNativeView() == GetForegroundWindow() &&
859 IsWindowVisible(owner)) {
860 SetForegroundWindow(owner);
861 }
862 } 850 }
863 851
864 void NativeWidgetWin::CloseNow() { 852 void NativeWidgetWin::CloseNow() {
865 // We may already have been destroyed if the selection resulted in a tab 853 // We may already have been destroyed if the selection resulted in a tab
866 // switch which will have reactivated the browser window and closed us, so 854 // switch which will have reactivated the browser window and closed us, so
867 // we need to check to see if we're still a window before trying to destroy 855 // we need to check to see if we're still a window before trying to destroy
868 // ourself. 856 // ourself.
869 if (IsWindow()) 857 if (IsWindow())
870 DestroyWindow(hwnd()); 858 DestroyWindow(hwnd());
871 } 859 }
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
1308 #endif 1296 #endif
1309 1297
1310 delegate_->OnNativeWidgetCreated(); 1298 delegate_->OnNativeWidgetCreated();
1311 1299
1312 // Get access to a modifiable copy of the system menu. 1300 // Get access to a modifiable copy of the system menu.
1313 GetSystemMenu(hwnd(), false); 1301 GetSystemMenu(hwnd(), false);
1314 return 0; 1302 return 0;
1315 } 1303 }
1316 1304
1317 void NativeWidgetWin::OnDestroy() { 1305 void NativeWidgetWin::OnDestroy() {
1318 RestoreEnabledIfNecessary();
1319 delegate_->OnNativeWidgetDestroying(); 1306 delegate_->OnNativeWidgetDestroying();
1320 if (drop_target_.get()) { 1307 if (drop_target_.get()) {
1321 RevokeDragDrop(hwnd()); 1308 RevokeDragDrop(hwnd());
1322 drop_target_ = NULL; 1309 drop_target_ = NULL;
1323 } 1310 }
1324 } 1311 }
1325 1312
1326 void NativeWidgetWin::OnDisplayChange(UINT bits_per_pixel, CSize screen_size) { 1313 void NativeWidgetWin::OnDisplayChange(UINT bits_per_pixel, CSize screen_size) {
1327 GetWidget()->widget_delegate()->OnDisplayChanged(); 1314 GetWidget()->widget_delegate()->OnDisplayChanged();
1328 } 1315 }
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 GetWidget()->widget_delegate()->OnWidgetMove(); 1585 GetWidget()->widget_delegate()->OnWidgetMove();
1599 SetMsgHandled(FALSE); 1586 SetMsgHandled(FALSE);
1600 } 1587 }
1601 1588
1602 void NativeWidgetWin::OnMoving(UINT param, const LPRECT new_bounds) { 1589 void NativeWidgetWin::OnMoving(UINT param, const LPRECT new_bounds) {
1603 // TODO(beng): move to Widget. 1590 // TODO(beng): move to Widget.
1604 GetWidget()->widget_delegate()->OnWidgetMove(); 1591 GetWidget()->widget_delegate()->OnWidgetMove();
1605 } 1592 }
1606 1593
1607 LRESULT NativeWidgetWin::OnNCActivate(BOOL active) { 1594 LRESULT NativeWidgetWin::OnNCActivate(BOOL active) {
1595 if (delegate_->CanActivate())
1596 delegate_->OnNativeWidgetActivationChanged(!!active);
1597
1608 if (!GetWidget()->non_client_view()) { 1598 if (!GetWidget()->non_client_view()) {
1609 SetMsgHandled(FALSE); 1599 SetMsgHandled(FALSE);
1610 return 0; 1600 return 0;
1611 } 1601 }
1612 1602
1613 if (!delegate_->CanActivate()) 1603 if (!delegate_->CanActivate())
1614 return TRUE; 1604 return TRUE;
1615 1605
1616 delegate_->OnNativeWidgetActivationChanged(!!active);
1617
1618 // The frame may need to redraw as a result of the activation change. 1606 // The frame may need to redraw as a result of the activation change.
1619 // We can get WM_NCACTIVATE before we're actually visible. If we're not 1607 // We can get WM_NCACTIVATE before we're actually visible. If we're not
1620 // visible, no need to paint. 1608 // visible, no need to paint.
1621 if (IsVisible()) 1609 if (IsVisible())
1622 GetWidget()->non_client_view()->SchedulePaint(); 1610 GetWidget()->non_client_view()->SchedulePaint();
1623 1611
1624 if (!GetWidget()->ShouldUseNativeFrame()) { 1612 if (!GetWidget()->ShouldUseNativeFrame()) {
1625 // TODO(beng, et al): Hack to redraw this window and child windows 1613 // TODO(beng, et al): Hack to redraw this window and child windows
1626 // synchronously upon activation. Not all child windows are redrawing 1614 // synchronously upon activation. Not all child windows are redrawing
1627 // themselves leading to issues like http://crbug.com/74604 1615 // themselves leading to issues like http://crbug.com/74604
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 } else if (can_resize) { 2257 } else if (can_resize) {
2270 style |= WS_OVERLAPPED | WS_THICKFRAME; 2258 style |= WS_OVERLAPPED | WS_THICKFRAME;
2271 } 2259 }
2272 if (delegate_->IsDialogBox()) { 2260 if (delegate_->IsDialogBox()) {
2273 style |= DS_MODALFRAME; 2261 style |= DS_MODALFRAME;
2274 // NOTE: Turning this off means we lose the close button, which is bad. 2262 // NOTE: Turning this off means we lose the close button, which is bad.
2275 // Turning it on though means the user can maximize or size the window 2263 // Turning it on though means the user can maximize or size the window
2276 // from the system menu, which is worse. We may need to provide our own 2264 // from the system menu, which is worse. We may need to provide our own
2277 // menu to get the close button to appear properly. 2265 // menu to get the close button to appear properly.
2278 // style &= ~WS_SYSMENU; 2266 // style &= ~WS_SYSMENU;
2267
2268 // Set the WS_POPUP style for modal dialogs. This ensures that the owner
2269 // window is activated on destruction. This style should not be set for
2270 // non-modal non-top-level dialogs like constrained windows.
2271 style |= delegate_->IsModal() ? WS_POPUP : 0;
2279 } 2272 }
2280 ex_style |= delegate_->IsDialogBox() ? WS_EX_DLGMODALFRAME : 0; 2273 ex_style |= delegate_->IsDialogBox() ? WS_EX_DLGMODALFRAME : 0;
2281 break; 2274 break;
2282 } 2275 }
2283 case Widget::InitParams::TYPE_CONTROL: 2276 case Widget::InitParams::TYPE_CONTROL:
2284 style |= WS_VISIBLE; 2277 style |= WS_VISIBLE;
2285 break; 2278 break;
2286 case Widget::InitParams::TYPE_WINDOW_FRAMELESS: 2279 case Widget::InitParams::TYPE_WINDOW_FRAMELESS:
2287 style |= WS_POPUP; 2280 style |= WS_POPUP;
2288 break; 2281 break;
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
2624 return (GetKeyState(VK_LBUTTON) & 0x80) || 2617 return (GetKeyState(VK_LBUTTON) & 0x80) ||
2625 (GetKeyState(VK_RBUTTON) & 0x80) || 2618 (GetKeyState(VK_RBUTTON) & 0x80) ||
2626 (GetKeyState(VK_MBUTTON) & 0x80) || 2619 (GetKeyState(VK_MBUTTON) & 0x80) ||
2627 (GetKeyState(VK_XBUTTON1) & 0x80) || 2620 (GetKeyState(VK_XBUTTON1) & 0x80) ||
2628 (GetKeyState(VK_XBUTTON2) & 0x80); 2621 (GetKeyState(VK_XBUTTON2) & 0x80);
2629 } 2622 }
2630 2623
2631 } // namespace internal 2624 } // namespace internal
2632 2625
2633 } // namespace views 2626 } // namespace views
OLDNEW
« 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