summaryrefslogtreecommitdiffstats
path: root/views/window
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-17 20:20:00 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-17 20:20:00 +0000
commite941a283e5b107f0c0a3595d0b6e11d7259d833f (patch)
tree27f886fcad4f9ef980e3638dfbc00ccf5f96a868 /views/window
parentc4bdfe6586f6dd43c69102e4306872da504a1942 (diff)
downloadchromium_src-e941a283e5b107f0c0a3595d0b6e11d7259d833f.zip
chromium_src-e941a283e5b107f0c0a3595d0b6e11d7259d833f.tar.gz
chromium_src-e941a283e5b107f0c0a3595d0b6e11d7259d833f.tar.bz2
Consolidate ShouldUseNativeFrame/AlwaysUseNativeFrame/UseNativeFrame spaghetti.
Now there is: ... window::ShouldUseNativeFrame() Which is basically just a pass-thru to WindowWin::ShouldUseNativeFrame() ... which can be overridden by subclasses. Native-Frame is a windows-only concept but keeping the API on Window means I don't have to update a lot of call sites. Window also gains a FrameType state member that toggles three states - default, force-native and force-custom. This supercedes the "AlwaysUseNativeFrame/AlwaysUseCustomFrame" methods on NonClientView. I have also hooked up a context menu item behind a command line flag --debug-enable-frame-toggle that allows the frame type for an individual window to be toggled, useful for debugging. BUG=none TEST=none Review URL: http://codereview.chromium.org/7036014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85666 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/window')
-rw-r--r--views/window/native_window_delegate.h4
-rw-r--r--views/window/non_client_view.cc23
-rw-r--r--views/window/non_client_view.h14
-rw-r--r--views/window/window.cc20
-rw-r--r--views/window/window.h18
-rw-r--r--views/window/window_win.cc34
6 files changed, 50 insertions, 63 deletions
diff --git a/views/window/native_window_delegate.h b/views/window/native_window_delegate.h
index c88924b..12cf3cf 100644
--- a/views/window/native_window_delegate.h
+++ b/views/window/native_window_delegate.h
@@ -35,10 +35,6 @@ class NativeWindowDelegate {
// Returns true if the window is a dialog box.
virtual bool IsDialogBox() const = 0;
- // Returns true if the window is using a system native frame. Returns false if
- // it is rendering its own title bar, borders and controls.
- virtual bool IsUsingNativeFrame() const = 0;
-
// Returns the smallest size the window can be resized to by the user.
virtual gfx::Size GetMinimumSize() const = 0;
diff --git a/views/window/non_client_view.cc b/views/window/non_client_view.cc
index 5830d73..a930a19 100644
--- a/views/window/non_client_view.cc
+++ b/views/window/non_client_view.cc
@@ -66,21 +66,6 @@ void NonClientView::UpdateFrame() {
frame_->UpdateFrameAfterFrameChange();
}
-bool NonClientView::UseNativeFrame() const {
- if (frame_view_.get()) {
- // The frame view may always require a native frame, e.g. popups on Vista+
- // when themes are active.
- if (frame_view_->AlwaysUseNativeFrame())
- return true;
-
- // The frame view may always require a custom frame, e.g. Constrained
- // Windows.
- if (frame_view_->AlwaysUseCustomFrame())
- return false;
- }
- return frame_->ShouldUseNativeFrame();
-}
-
void NonClientView::DisableInactiveRendering(bool disable) {
frame_view_->DisableInactiveRendering(disable);
}
@@ -192,14 +177,6 @@ views::View* NonClientView::GetEventHandlerForPoint(const gfx::Point& point) {
////////////////////////////////////////////////////////////////////////////////
// NonClientFrameView, View overrides:
-bool NonClientFrameView::AlwaysUseCustomFrame() const {
- return false;
-}
-
-bool NonClientFrameView::AlwaysUseNativeFrame() const {
- return false;
-}
-
bool NonClientFrameView::HitTest(const gfx::Point& l) const {
// For the default case, we assume the non-client frame view never overlaps
// the client view.
diff --git a/views/window/non_client_view.h b/views/window/non_client_view.h
index d678571..0127d8b 100644
--- a/views/window/non_client_view.h
+++ b/views/window/non_client_view.h
@@ -45,16 +45,6 @@ class NonClientFrameView : public View {
// view should be laid out within.
virtual gfx::Rect GetBoundsForClientView() const = 0;
- // Returns true if this FrameView should always use the custom frame,
- // regardless of the system settings. An example is the Constrained Window,
- // which is a child window and must always provide its own frame.
- virtual bool AlwaysUseCustomFrame() const;
-
- // Like AlwaysUseCustomFrame, returns true if this FrameView should always use
- // the native frame, regardless of theme settings. An example is popup/app
- // windows, which we do not ever want to show themed.
- virtual bool AlwaysUseNativeFrame() const;
-
virtual gfx::Rect GetWindowBoundsForClientBounds(
const gfx::Rect& client_bounds) const = 0;
@@ -161,10 +151,6 @@ class NonClientView : public View {
// |use_native_frame|.
void UpdateFrame();
- // Returns true if the native window frame should be used, false if the
- // NonClientView provides its own frame implementation.
- bool UseNativeFrame() const;
-
// Prevents the window from being rendered as deactivated when |disable| is
// true, until called with |disable| false. Used when a sub-window is to be
// shown that shouldn't visually de-activate the window.
diff --git a/views/window/window.cc b/views/window/window.cc
index efc9f15..8ebc366 100644
--- a/views/window/window.cc
+++ b/views/window/window.cc
@@ -37,7 +37,8 @@ Window::Window()
saved_maximized_state_(false),
minimum_size_(100, 100),
disable_inactive_rendering_(false),
- window_closed_(false) {
+ window_closed_(false),
+ frame_type_(FRAME_TYPE_DEFAULT) {
}
Window::~Window() {
@@ -238,9 +239,22 @@ gfx::NativeWindow Window::GetNativeWindow() const {
}
bool Window::ShouldUseNativeFrame() const {
+ if (frame_type_ != FRAME_TYPE_DEFAULT)
+ return frame_type_ == FRAME_TYPE_FORCE_NATIVE;
return native_window_->ShouldUseNativeFrame();
}
+void Window::DebugToggleFrameType() {
+ if (frame_type_ == FRAME_TYPE_DEFAULT) {
+ frame_type_ = ShouldUseNativeFrame() ? FRAME_TYPE_FORCE_CUSTOM :
+ FRAME_TYPE_FORCE_NATIVE;
+ } else {
+ frame_type_ = frame_type_ == FRAME_TYPE_FORCE_CUSTOM ?
+ FRAME_TYPE_FORCE_NATIVE : FRAME_TYPE_FORCE_CUSTOM;
+ }
+ FrameTypeChanged();
+}
+
void Window::FrameTypeChanged() {
native_window_->FrameTypeChanged();
}
@@ -269,10 +283,6 @@ bool Window::IsDialogBox() const {
return !!window_delegate_->AsDialogDelegate();
}
-bool Window::IsUsingNativeFrame() const {
- return non_client_view_->UseNativeFrame();
-}
-
gfx::Size Window::GetMinimumSize() const {
return non_client_view_->GetMinimumSize();
}
diff --git a/views/window/window.h b/views/window/window.h
index 191aba4..eb8490a 100644
--- a/views/window/window.h
+++ b/views/window/window.h
@@ -52,6 +52,12 @@ class Window : public Widget,
Widget::InitParams widget_init_params;
};
+ enum FrameType {
+ FRAME_TYPE_DEFAULT, // Use whatever the default would be.
+ FRAME_TYPE_FORCE_CUSTOM, // Force the custom frame.
+ FRAME_TYPE_FORCE_NATIVE // Force the native frame.
+ };
+
Window();
virtual ~Window();
@@ -162,9 +168,16 @@ class Window : public Widget,
// Retrieves the Window's native window handle.
gfx::NativeWindow GetNativeWindow() const;
+ void set_frame_type(FrameType frame_type) { frame_type_ = frame_type; }
+ FrameType frame_type() const { return frame_type_; }
+
// Whether we should be using a native frame.
bool ShouldUseNativeFrame() const;
+ // Forces the frame into the alternate frame type (custom or native) depending
+ // on its current state.
+ void DebugToggleFrameType();
+
// Tell the window that something caused the frame type to change.
void FrameTypeChanged();
@@ -201,7 +214,6 @@ class Window : public Widget,
virtual void EnableInactiveRendering() OVERRIDE;
virtual bool IsModal() const OVERRIDE;
virtual bool IsDialogBox() const OVERRIDE;
- virtual bool IsUsingNativeFrame() const OVERRIDE;
virtual gfx::Size GetMinimumSize() const OVERRIDE;
virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE;
virtual bool ExecuteCommand(int command_id) OVERRIDE;
@@ -248,6 +260,10 @@ class Window : public Widget,
// Set to true if the window is in the process of closing .
bool window_closed_;
+ // The current frame type in use by this window. Defaults to
+ // FRAME_TYPE_DEFAULT.
+ FrameType frame_type_;
+
DISALLOW_COPY_AND_ASSIGN(Window);
};
diff --git a/views/window/window_win.cc b/views/window/window_win.cc
index e73c144..8ac69b5 100644
--- a/views/window/window_win.cc
+++ b/views/window/window_win.cc
@@ -310,7 +310,7 @@ gfx::Font WindowWin::GetWindowTitleFont() {
gfx::Insets WindowWin::GetClientAreaInsets() const {
// Returning an empty Insets object causes the default handling in
// WidgetWin::OnNCCalcSize() to be invoked.
- if (delegate_->IsUsingNativeFrame())
+ if (GetWindow()->ShouldUseNativeFrame())
return gfx::Insets();
if (IsMaximized()) {
@@ -331,7 +331,7 @@ gfx::Insets WindowWin::GetClientAreaInsets() const {
// rect when using the opaque frame.
// Note: this is only required for non-fullscreen windows. Note that
// fullscreen windows are in restored state, not maximized.
- return gfx::Insets(0, 0, IsFullscreen() ? 0 : 1, 0);
+ return gfx::Insets(0, 0, 0, 0);
}
int WindowWin::GetShowState() const {
@@ -414,7 +414,7 @@ void WindowWin::OnExitSizeMove() {
WidgetWin::OnExitSizeMove();
delegate_->OnNativeWindowEndUserBoundsChange();
- if (!ShouldUseNativeFrame()) {
+ if (!GetWindow()->ShouldUseNativeFrame()) {
// Sending SWP_FRAMECHANGED forces a non-client repaint, which fixes the
// glitch in rendering the bottom pixel of the window caused by us
// offsetting the client rect there (See comment in GetClientAreaInsets()).
@@ -438,7 +438,7 @@ void WindowWin::OnGetMinMaxInfo(MINMAXINFO* minmax_info) {
void WindowWin::OnInitMenu(HMENU menu) {
// We only need to manually enable the system menu if we're not using a native
// frame.
- if (delegate_->IsUsingNativeFrame())
+ if (GetWindow()->ShouldUseNativeFrame())
WidgetWin::OnInitMenu(menu);
bool is_fullscreen = IsFullscreen();
@@ -484,7 +484,8 @@ LRESULT WindowWin::OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param) {
ExecuteSystemMenuCommand(id);
return 0;
}
- } else if (message == WM_NCLBUTTONDOWN && !delegate_->IsUsingNativeFrame()) {
+ } else if (message == WM_NCLBUTTONDOWN &&
+ !GetWindow()->ShouldUseNativeFrame()) {
switch (w_param) {
case HTCLOSE:
case HTMINBUTTON:
@@ -562,7 +563,7 @@ LRESULT WindowWin::OnNCActivate(BOOL active) {
if (IsVisible())
GetWindow()->non_client_view()->SchedulePaint();
- if (!ShouldUseNativeFrame()) {
+ if (!GetWindow()->ShouldUseNativeFrame()) {
// TODO(beng, et al): Hack to redraw this window and child windows
// synchronously upon activation. Not all child windows are redrawing
// themselves leading to issues like http://crbug.com/74604
@@ -583,6 +584,7 @@ LRESULT WindowWin::OnNCActivate(BOOL active) {
}
LRESULT WindowWin::OnNCCalcSize(BOOL mode, LPARAM l_param) {
+ //return 0;
// We only override the default handling if we need to specify a custom
// non-client edge width. Note that in most cases "no insets" means no
// custom width, but in fullscreen mode we want a custom width of 0.
@@ -624,7 +626,7 @@ LRESULT WindowWin::OnNCCalcSize(BOOL mode, LPARAM l_param) {
if (EdgeHasTopmostAutoHideTaskbar(ABE_LEFT, monitor))
client_rect->left += kAutoHideTaskbarThicknessPx;
if (EdgeHasTopmostAutoHideTaskbar(ABE_TOP, monitor)) {
- if (delegate_->IsUsingNativeFrame()) {
+ if (GetWindow()->ShouldUseNativeFrame()) {
// Tricky bit. Due to a bug in DwmDefWindowProc()'s handling of
// WM_NCHITTEST, having any nonclient area atop the window causes the
// caption buttons to draw onscreen but not respond to mouse
@@ -665,7 +667,7 @@ LRESULT WindowWin::OnNCCalcSize(BOOL mode, LPARAM l_param) {
LRESULT WindowWin::OnNCHitTest(const CPoint& point) {
// If the DWM is rendering the window controls, we need to give the DWM's
// default window procedure first chance to handle hit testing.
- if (ShouldUseNativeFrame()) {
+ if (GetWindow()->ShouldUseNativeFrame()) {
LRESULT result;
if (DwmDefWindowProc(GetNativeView(), WM_NCHITTEST, 0,
MAKELPARAM(point.x, point.y), &result)) {
@@ -690,14 +692,14 @@ void WindowWin::OnNCPaint(HRGN rgn) {
// When using a custom frame, we want to avoid calling DefWindowProc() since
// that may render artifacts.
SetMsgHandled((!IsActive() || is_in_size_move_) &&
- !delegate_->IsUsingNativeFrame());
+ !GetWindow()->ShouldUseNativeFrame());
}
LRESULT WindowWin::OnNCUAHDrawCaption(UINT msg, WPARAM w_param,
LPARAM l_param) {
// See comment in widget_win.h at the definition of WM_NCUAHDRAWCAPTION for
// an explanation about why we need to handle this message.
- SetMsgHandled(!delegate_->IsUsingNativeFrame());
+ SetMsgHandled(!GetWindow()->ShouldUseNativeFrame());
return 0;
}
@@ -705,7 +707,7 @@ LRESULT WindowWin::OnNCUAHDrawFrame(UINT msg, WPARAM w_param,
LPARAM l_param) {
// See comment in widget_win.h at the definition of WM_NCUAHDRAWCAPTION for
// an explanation about why we need to handle this message.
- SetMsgHandled(!delegate_->IsUsingNativeFrame());
+ SetMsgHandled(!GetWindow()->ShouldUseNativeFrame());
return 0;
}
@@ -762,7 +764,7 @@ void WindowWin::OnSysCommand(UINT notification_code, CPoint click) {
((notification_code & sc_mask) == SC_MOVE) ||
((notification_code & sc_mask) == SC_MAXIMIZE)))
return;
- if (!delegate_->IsUsingNativeFrame()) {
+ if (!GetWindow()->ShouldUseNativeFrame()) {
if ((notification_code & sc_mask) == SC_MINIMIZE ||
(notification_code & sc_mask) == SC_MAXIMIZE ||
(notification_code & sc_mask) == SC_RESTORE) {
@@ -1205,7 +1207,7 @@ void WindowWin::SetUseDragFrame(bool use_drag_frame) {
}
NonClientFrameView* WindowWin::CreateFrameViewForWindow() {
- if (ShouldUseNativeFrame())
+ if (GetWindow()->ShouldUseNativeFrame())
return new NativeFrameView(GetWindow());
return new CustomFrameView(GetWindow());
}
@@ -1232,8 +1234,8 @@ void WindowWin::FrameTypeChanged() {
// the DWM's glass non-client rendering is enabled, which is why
// DWMNCRP_ENABLED is used for the native frame case. _DISABLED means the
// DWM doesn't render glass, and so is used in the custom frame case.
- DWMNCRENDERINGPOLICY policy =
- delegate_->IsUsingNativeFrame() ? DWMNCRP_ENABLED : DWMNCRP_DISABLED;
+ DWMNCRENDERINGPOLICY policy = GetWindow()->ShouldUseNativeFrame() ?
+ DWMNCRP_ENABLED : DWMNCRP_DISABLED;
DwmSetWindowAttribute(GetNativeView(), DWMWA_NCRENDERING_POLICY,
&policy, sizeof(DWMNCRENDERINGPOLICY));
}
@@ -1307,7 +1309,7 @@ void WindowWin::UnlockUpdates() {
void WindowWin::ResetWindowRegion(bool force) {
// A native frame uses the native window region, and we don't want to mess
// with it.
- if (delegate_->IsUsingNativeFrame()) {
+ if (GetWindow()->ShouldUseNativeFrame()) {
if (force)
SetWindowRgn(NULL, TRUE);
return;