summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/automation/automation_provider.cc2
-rw-r--r--chrome/browser/task_manager.cc3
-rw-r--r--chrome/browser/views/about_chrome_view.cc2
-rw-r--r--chrome/browser/views/about_ipc_dialog.cc1
-rw-r--r--chrome/browser/views/bookmark_editor_view.cc1
-rw-r--r--chrome/browser/views/bookmark_manager_view.cc1
-rw-r--r--chrome/browser/views/constrained_window_impl.cc18
-rw-r--r--chrome/browser/views/constrained_window_impl.h4
-rw-r--r--chrome/browser/views/first_run_customize_view.cc2
-rw-r--r--chrome/browser/views/first_run_view.cc4
-rw-r--r--chrome/browser/views/frame/browser_frame.cc24
-rw-r--r--chrome/browser/views/frame/browser_frame.h6
-rw-r--r--chrome/browser/views/frame/browser_view.cc2
-rw-r--r--chrome/browser/views/frame/glass_browser_frame_view.cc10
-rw-r--r--chrome/browser/views/frame/opaque_browser_frame_view.cc26
-rw-r--r--chrome/browser/views/frame/opaque_browser_frame_view.h2
-rw-r--r--chrome/browser/views/hung_renderer_view.cc5
-rw-r--r--chrome/browser/views/input_window.cc4
-rw-r--r--chrome/browser/views/keyword_editor_view.cc1
-rw-r--r--chrome/browser/views/options/advanced_contents_view.cc1
-rw-r--r--chrome/browser/views/options/cookies_view.h1
-rw-r--r--chrome/browser/views/page_info_window.cc2
-rw-r--r--chrome/browser/views/shelf_item_dialog.cc1
-rw-r--r--chrome/browser/views/tabs/tab_renderer.cc6
-rw-r--r--chrome/browser/views/tabs/tab_strip.cc3
-rw-r--r--chrome/browser/views/toolbar_view.cc10
-rw-r--r--chrome/browser/views/user_data_dir_dialog.cc1
-rw-r--r--chrome/test/interactive_ui/view_event_test_base.cc4
-rw-r--r--chrome/views/client_view.cc2
-rw-r--r--chrome/views/custom_frame_view.cc25
-rw-r--r--chrome/views/custom_frame_view.h4
-rw-r--r--chrome/views/dialog_client_view.cc8
-rw-r--r--chrome/views/dialog_delegate.cc3
-rw-r--r--chrome/views/native_frame_view.cc4
-rw-r--r--chrome/views/native_frame_view.h6
-rw-r--r--chrome/views/non_client_view.cc30
-rw-r--r--chrome/views/non_client_view.h5
-rw-r--r--chrome/views/table_view_unittest.cc5
-rw-r--r--chrome/views/view_unittest.cc4
-rw-r--r--chrome/views/views.vcproj12
-rw-r--r--chrome/views/window.h341
-rw-r--r--chrome/views/window_delegate.h2
-rw-r--r--chrome/views/window_win.cc1234
-rw-r--r--chrome/views/window_win.h278
44 files changed, 405 insertions, 1705 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc
index ca473d6..5fa08ef 100644
--- a/chrome/browser/automation/automation_provider.cc
+++ b/chrome/browser/automation/automation_provider.cc
@@ -1203,7 +1203,7 @@ void AutomationProvider::ClickAppModalDialogButton(int button, bool* success) {
if (dialog_delegate &&
(dialog_delegate->GetDialogButtons() & button) == button) {
views::DialogClientView* client_view =
- dialog_delegate->window()->GetClientView()->AsDialogClientView();
+ dialog_delegate->window()->client_view()->AsDialogClientView();
if ((button & views::DialogDelegate::DIALOGBUTTON_OK) ==
views::DialogDelegate::DIALOGBUTTON_OK) {
client_view->AcceptWindow();
diff --git a/chrome/browser/task_manager.cc b/chrome/browser/task_manager.cc
index d8f578d..cacb30c 100644
--- a/chrome/browser/task_manager.cc
+++ b/chrome/browser/task_manager.cc
@@ -23,7 +23,6 @@
#include "chrome/views/link.h"
#include "chrome/views/menu.h"
#include "chrome/views/native_button.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
@@ -966,7 +965,7 @@ TaskManager::~TaskManager() {
void TaskManager::Open() {
TaskManager* task_manager = GetInstance();
if (task_manager->window()) {
- task_manager->window()->Activate();
+ task_manager->window()->MoveToFront(true);
} else {
views::Window::CreateChromeWindow(NULL, gfx::Rect(), task_manager);
task_manager->table_model_->StartUpdating();
diff --git a/chrome/browser/views/about_chrome_view.cc b/chrome/browser/views/about_chrome_view.cc
index c997c1d..91c10e0 100644
--- a/chrome/browser/views/about_chrome_view.cc
+++ b/chrome/browser/views/about_chrome_view.cc
@@ -784,7 +784,7 @@ void AboutChromeView::UpdateStatus(GoogleUpdateUpgradeResult result,
new_version_available_);
update_label_.SetText(update_string);
show_success_indicator = true;
- RestartMessageBox::ShowMessageBox(window()->GetNativeWindow());
+ RestartMessageBox::ShowMessageBox(window()->GetNativeView());
break;
}
case UPGRADE_ERROR:
diff --git a/chrome/browser/views/about_ipc_dialog.cc b/chrome/browser/views/about_ipc_dialog.cc
index 6e9848c..673661d 100644
--- a/chrome/browser/views/about_ipc_dialog.cc
+++ b/chrome/browser/views/about_ipc_dialog.cc
@@ -26,7 +26,6 @@
#include "chrome/common/render_messages.h"
#include "chrome/views/grid_layout.h"
#include "chrome/views/text_button.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_job.h"
diff --git a/chrome/browser/views/bookmark_editor_view.cc b/chrome/browser/views/bookmark_editor_view.cc
index 8b803bb..6810d63 100644
--- a/chrome/browser/views/bookmark_editor_view.cc
+++ b/chrome/browser/views/bookmark_editor_view.cc
@@ -16,7 +16,6 @@
#include "chrome/views/focus_manager.h"
#include "chrome/views/grid_layout.h"
#include "chrome/views/label.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
#include "googleurl/src/gurl.h"
#include "grit/chromium_strings.h"
diff --git a/chrome/browser/views/bookmark_manager_view.cc b/chrome/browser/views/bookmark_manager_view.cc
index a0de947..fb868c2 100644
--- a/chrome/browser/views/bookmark_manager_view.cc
+++ b/chrome/browser/views/bookmark_manager_view.cc
@@ -30,7 +30,6 @@
#include "chrome/views/label.h"
#include "chrome/views/menu_button.h"
#include "chrome/views/single_split_view.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
diff --git a/chrome/browser/views/constrained_window_impl.cc b/chrome/browser/views/constrained_window_impl.cc
index 7b815f3..3d0869a 100644
--- a/chrome/browser/views/constrained_window_impl.cc
+++ b/chrome/browser/views/constrained_window_impl.cc
@@ -368,7 +368,7 @@ int ConstrainedWindowFrameView::NonClientHitTest(const gfx::Point& point) {
if (!bounds().Contains(point))
return HTNOWHERE;
- int frame_component = container_->GetClientView()->NonClientHitTest(point);
+ int frame_component = container_->client_view()->NonClientHitTest(point);
if (frame_component != HTNOWHERE)
return frame_component;
@@ -378,7 +378,7 @@ int ConstrainedWindowFrameView::NonClientHitTest(const gfx::Point& point) {
int window_component = GetHTComponentForFrame(point, FrameBorderThickness(),
NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize,
- container_->GetDelegate()->CanResize());
+ container_->window_delegate()->CanResize());
// Fall back to the caption if no other component matches.
return (window_component == HTNOWHERE) ? HTCAPTION : window_component;
}
@@ -653,8 +653,8 @@ void ConstrainedWindowImpl::DidBecomeSelected() {
std::wstring ConstrainedWindowImpl::GetWindowTitle() const {
std::wstring display_title;
- if (GetDelegate())
- display_title = GetDelegate()->GetWindowTitle();
+ if (window_delegate())
+ display_title = window_delegate()->GetWindowTitle();
else
display_title = L"Untitled";
@@ -671,9 +671,9 @@ const gfx::Rect& ConstrainedWindowImpl::GetCurrentBounds() const {
ConstrainedWindowImpl::ConstrainedWindowImpl(
TabContents* owner,
views::WindowDelegate* window_delegate)
- : WindowWin(window_delegate),
+ : Window(window_delegate),
owner_(owner) {
- GetNonClientView()->SetFrameView(CreateFrameViewForWindow());
+ non_client_view_->SetFrameView(CreateFrameViewForWindow());
Init();
}
@@ -685,7 +685,7 @@ void ConstrainedWindowImpl::Init() {
}
void ConstrainedWindowImpl::InitAsDialog(const gfx::Rect& initial_bounds) {
- WindowWin::Init(owner_->GetNativeView(), initial_bounds);
+ Window::Init(owner_->GetNativeView(), initial_bounds);
ActivateConstrainedWindow();
}
@@ -719,7 +719,7 @@ void ConstrainedWindowImpl::OnDestroy() {
}
// Make sure we call super so that it can do its cleanup.
- WindowWin::OnDestroy();
+ Window::OnDestroy();
}
void ConstrainedWindowImpl::OnFinalMessage(HWND window) {
@@ -727,7 +727,7 @@ void ConstrainedWindowImpl::OnFinalMessage(HWND window) {
// list.
owner_->WillClose(this);
- WindowWin::OnFinalMessage(window);
+ WidgetWin::OnFinalMessage(window);
}
LRESULT ConstrainedWindowImpl::OnMouseActivate(HWND window,
diff --git a/chrome/browser/views/constrained_window_impl.h b/chrome/browser/views/constrained_window_impl.h
index ca2da6d..30e6303 100644
--- a/chrome/browser/views/constrained_window_impl.h
+++ b/chrome/browser/views/constrained_window_impl.h
@@ -8,7 +8,7 @@
#include "base/gfx/rect.h"
#include "chrome/browser/tab_contents/constrained_window.h"
#include "chrome/browser/tab_contents/tab_contents_delegate.h"
-#include "chrome/views/window_win.h"
+#include "chrome/views/window.h"
class ConstrainedTabContentsWindowDelegate;
class ConstrainedWindowAnimation;
@@ -25,7 +25,7 @@ class WindowDelegate;
// a child HWND with a custom window frame.
//
class ConstrainedWindowImpl : public ConstrainedWindow,
- public views::WindowWin {
+ public views::Window {
public:
virtual ~ConstrainedWindowImpl();
diff --git a/chrome/browser/views/first_run_customize_view.cc b/chrome/browser/views/first_run_customize_view.cc
index e9ad65e..1f8e132 100644
--- a/chrome/browser/views/first_run_customize_view.cc
+++ b/chrome/browser/views/first_run_customize_view.cc
@@ -201,7 +201,7 @@ bool FirstRunCustomizeView::Accept() {
int browser_selected = import_from_combo_->GetSelectedItem();
FirstRun::ImportSettings(profile_, browser_selected,
GetDefaultImportItems(),
- window()->GetNativeWindow());
+ window()->GetNativeView());
}
if (default_browser_->IsSelected())
SetDefaultBrowser();
diff --git a/chrome/browser/views/first_run_view.cc b/chrome/browser/views/first_run_view.cc
index f2df7be..13a10a1 100644
--- a/chrome/browser/views/first_run_view.cc
+++ b/chrome/browser/views/first_run_view.cc
@@ -150,7 +150,7 @@ void FirstRunView::Layout() {
void FirstRunView::OpenCustomizeDialog() {
// The customize dialog now owns the importer host object.
views::Window::CreateChromeWindow(
- window()->GetNativeWindow(),
+ window()->GetNativeView(),
gfx::Rect(),
new FirstRunCustomizeView(profile_,
importer_host_,
@@ -182,7 +182,7 @@ bool FirstRunView::Accept() {
SetDefaultBrowser();
// Index 0 is the default browser.
FirstRun::ImportSettings(profile_, 0, GetDefaultImportItems(),
- window()->GetNativeWindow());
+ window()->GetNativeView());
UserMetrics::RecordAction(L"FirstRunDef_Accept", profile_);
return true;
diff --git a/chrome/browser/views/frame/browser_frame.cc b/chrome/browser/views/frame/browser_frame.cc
index 10003af..31bf41d 100644
--- a/chrome/browser/views/frame/browser_frame.cc
+++ b/chrome/browser/views/frame/browser_frame.cc
@@ -24,11 +24,11 @@ static const int kClientEdgeThickness = 3;
// BrowserFrame, public:
BrowserFrame::BrowserFrame(BrowserView* browser_view)
- : WindowWin(browser_view),
+ : Window(browser_view),
browser_view_(browser_view),
frame_initialized_(false) {
browser_view_->set_frame(this);
- GetNonClientView()->SetFrameView(CreateFrameViewForWindow());
+ non_client_view_->SetFrameView(CreateFrameViewForWindow());
// Don't focus anything on creation, selecting a tab will set the focus.
set_focus_on_creation(false);
}
@@ -37,7 +37,7 @@ BrowserFrame::~BrowserFrame() {
}
void BrowserFrame::Init() {
- WindowWin::Init(NULL, gfx::Rect());
+ Window::Init(NULL, gfx::Rect());
}
int BrowserFrame::GetMinimizeButtonOffset() const {
@@ -104,7 +104,7 @@ LRESULT BrowserFrame::OnNCActivate(BOOL active) {
// Perform first time initialization of the DWM frame insets, only if we're
// using the native frame.
- if (GetNonClientView()->UseNativeFrame() && !frame_initialized_) {
+ if (non_client_view_->UseNativeFrame() && !frame_initialized_) {
if (browser_view_->IsBrowserTypeNormal()) {
::SetWindowPos(GetNativeView(), NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
@@ -113,15 +113,15 @@ LRESULT BrowserFrame::OnNCActivate(BOOL active) {
frame_initialized_ = true;
}
browser_view_->ActivationChanged(!!active);
- return WindowWin::OnNCActivate(active);
+ return Window::OnNCActivate(active);
}
LRESULT BrowserFrame::OnNCCalcSize(BOOL mode, LPARAM l_param) {
// We don't adjust the client area unless we're a tabbed browser window and
// are using the native frame.
- if (!GetNonClientView()->UseNativeFrame() ||
+ if (!non_client_view_->UseNativeFrame() ||
!browser_view_->IsBrowserTypeNormal()) {
- return WindowWin::OnNCCalcSize(mode, l_param);
+ return Window::OnNCCalcSize(mode, l_param);
}
RECT* client_rect = mode ?
@@ -173,14 +173,14 @@ LRESULT BrowserFrame::OnNCCalcSize(BOOL mode, LPARAM l_param) {
LRESULT BrowserFrame::OnNCHitTest(const CPoint& pt) {
// Only do DWM hit-testing when we are using the native frame.
- if (GetNonClientView()->UseNativeFrame()) {
+ if (non_client_view_->UseNativeFrame()) {
LRESULT result;
if (DwmDefWindowProc(GetNativeView(), WM_NCHITTEST, 0,
MAKELPARAM(pt.x, pt.y), &result)) {
return result;
}
}
- return WindowWin::OnNCHitTest(pt);
+ return Window::OnNCHitTest(pt);
}
///////////////////////////////////////////////////////////////////////////////
@@ -191,7 +191,7 @@ int BrowserFrame::GetShowState() const {
}
views::NonClientFrameView* BrowserFrame::CreateFrameViewForWindow() {
- if (GetNonClientView()->UseNativeFrame())
+ if (non_client_view_->UseNativeFrame())
browser_frame_view_ = new GlassBrowserFrameView(this, browser_view_);
else
browser_frame_view_ = new OpaqueBrowserFrameView(this, browser_view_);
@@ -199,7 +199,7 @@ views::NonClientFrameView* BrowserFrame::CreateFrameViewForWindow() {
}
void BrowserFrame::UpdateFrameAfterFrameChange() {
- WindowWin::UpdateFrameAfterFrameChange();
+ Window::UpdateFrameAfterFrameChange();
UpdateDWMFrame();
}
@@ -213,7 +213,7 @@ views::RootView* BrowserFrame::CreateRootView() {
void BrowserFrame::UpdateDWMFrame() {
// Nothing to do yet.
- if (!GetClientView() || !browser_view_->IsBrowserTypeNormal())
+ if (!client_view() || !browser_view_->IsBrowserTypeNormal())
return;
// In fullscreen mode, we don't extend glass into the client area at all,
diff --git a/chrome/browser/views/frame/browser_frame.h b/chrome/browser/views/frame/browser_frame.h
index 94d099b..7414719 100644
--- a/chrome/browser/views/frame/browser_frame.h
+++ b/chrome/browser/views/frame/browser_frame.h
@@ -5,7 +5,7 @@
#ifndef CHROME_BROWSER_VIEWS_FRAME_BROWSER_FRAME_
#define CHROME_BROWSER_VIEWS_FRAME_BROWSER_FRAME_
-#include "chrome/views/window_win.h"
+#include "chrome/views/window.h"
class AeroGlassNonClientView;
class BrowserView;
@@ -29,10 +29,10 @@ class BrowserNonClientFrameView : public views::NonClientFrameView {
///////////////////////////////////////////////////////////////////////////////
// BrowserFrame
//
-// BrowserFrame is a WindowWin subclass that provides the window frame for the
+// BrowserFrame is a Window subclass that provides the window frame for the
// Chrome browser window.
//
-class BrowserFrame : public views::WindowWin {
+class BrowserFrame : public views::Window {
public:
explicit BrowserFrame(BrowserView* browser_view);
virtual ~BrowserFrame();
diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc
index 062c2e1..f8d81d9 100644
--- a/chrome/browser/views/frame/browser_view.cc
+++ b/chrome/browser/views/frame/browser_view.cc
@@ -1088,7 +1088,7 @@ bool BrowserView::GetSavedWindowBounds(gfx::Rect* bounds) const {
}
gfx::Rect window_rect =
- frame_->GetNonClientView()->GetWindowBoundsForClientBounds(*bounds);
+ frame_->GetWindowBoundsForClientBounds(*bounds);
window_rect.set_origin(bounds->origin());
// When we are given x/y coordinates of 0 on a created popup window,
diff --git a/chrome/browser/views/frame/glass_browser_frame_view.cc b/chrome/browser/views/frame/glass_browser_frame_view.cc
index c822aa1..40bebe6 100644
--- a/chrome/browser/views/frame/glass_browser_frame_view.cc
+++ b/chrome/browser/views/frame/glass_browser_frame_view.cc
@@ -115,7 +115,7 @@ GlassBrowserFrameView::GlassBrowserFrameView(BrowserFrame* frame,
throbber_running_(false),
throbber_frame_(0) {
InitClass();
- if (frame_->GetDelegate()->ShouldShowWindowIcon())
+ if (frame_->window_delegate()->ShouldShowWindowIcon())
InitThrobberIcons();
}
@@ -202,7 +202,7 @@ int GlassBrowserFrameView::NonClientHitTest(const gfx::Point& point) {
if (!browser_view_->IsBrowserTypeNormal() || !bounds().Contains(point))
return HTNOWHERE;
- int frame_component = frame_->GetClientView()->NonClientHitTest(point);
+ int frame_component = frame_->client_view()->NonClientHitTest(point);
if (frame_component != HTNOWHERE)
return frame_component;
@@ -210,7 +210,7 @@ int GlassBrowserFrameView::NonClientHitTest(const gfx::Point& point) {
int window_component = GetHTComponentForFrame(point, border_thickness,
NonClientBorderThickness(), border_thickness,
kResizeAreaCornerSize - border_thickness,
- frame_->GetDelegate()->CanResize());
+ frame_->window_delegate()->CanResize());
// Fall back to the caption if no other component matches.
return (window_component == HTNOWHERE) ? HTCAPTION : window_component;
}
@@ -272,7 +272,7 @@ void GlassBrowserFrameView::PaintDistributorLogo(ChromeCanvas* canvas) {
void GlassBrowserFrameView::PaintToolbarBackground(ChromeCanvas* canvas) {
gfx::Rect toolbar_bounds(browser_view_->GetToolbarBounds());
gfx::Point toolbar_origin(toolbar_bounds.origin());
- View::ConvertPointToView(frame_->GetClientView(), this, &toolbar_origin);
+ View::ConvertPointToView(frame_->client_view(), this, &toolbar_origin);
toolbar_bounds.set_origin(toolbar_origin);
SkBitmap* toolbar_left =
@@ -306,7 +306,7 @@ void GlassBrowserFrameView::PaintRestoredClientEdge(ChromeCanvas* canvas) {
// The client edges start below the toolbar upper corner images regardless
// of how tall the toolbar itself is.
int client_area_top =
- frame_->GetClientView()->y() + browser_view_->GetToolbarBounds().y() +
+ frame_->client_view()->y() + browser_view_->GetToolbarBounds().y() +
resources_->GetPartBitmap(FRAME_CLIENT_EDGE_TOP_LEFT)->height();
gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height());
diff --git a/chrome/browser/views/frame/opaque_browser_frame_view.cc b/chrome/browser/views/frame/opaque_browser_frame_view.cc
index 01b8632..8452a37 100644
--- a/chrome/browser/views/frame/opaque_browser_frame_view.cc
+++ b/chrome/browser/views/frame/opaque_browser_frame_view.cc
@@ -474,7 +474,7 @@ int OpaqueBrowserFrameView::NonClientHitTest(const gfx::Point& point) {
if (!bounds().Contains(point))
return HTNOWHERE;
- int frame_component = frame_->GetClientView()->NonClientHitTest(point);
+ int frame_component = frame_->client_view()->NonClientHitTest(point);
if (frame_component != HTNOWHERE)
return frame_component;
@@ -496,7 +496,7 @@ int OpaqueBrowserFrameView::NonClientHitTest(const gfx::Point& point) {
int window_component = GetHTComponentForFrame(point, TopResizeHeight(),
NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize,
- frame_->GetDelegate()->CanResize());
+ frame_->window_delegate()->CanResize());
// Fall back to the caption if no other component matches.
return (window_component == HTNOWHERE) ? HTCAPTION : window_component;
}
@@ -621,13 +621,13 @@ void OpaqueBrowserFrameView::SetAccessibleName(const std::wstring& name) {
void OpaqueBrowserFrameView::ButtonPressed(views::BaseButton* sender) {
if (sender == minimize_button_)
- frame_->Minimize();
+ frame_->ExecuteSystemMenuCommand(SC_MINIMIZE);
else if (sender == maximize_button_)
- frame_->Maximize();
+ frame_->ExecuteSystemMenuCommand(SC_MAXIMIZE);
else if (sender == restore_button_)
- frame_->Restore();
+ frame_->ExecuteSystemMenuCommand(SC_RESTORE);
else if (sender == close_button_)
- frame_->Close();
+ frame_->ExecuteSystemMenuCommand(SC_CLOSE);
}
///////////////////////////////////////////////////////////////////////////////
@@ -642,7 +642,7 @@ bool OpaqueBrowserFrameView::ShouldTabIconViewAnimate() const {
}
SkBitmap OpaqueBrowserFrameView::GetFavIconForTabIconView() {
- return frame_->GetDelegate()->GetWindowIcon();
+ return frame_->window_delegate()->GetWindowIcon();
}
///////////////////////////////////////////////////////////////////////////////
@@ -663,7 +663,7 @@ int OpaqueBrowserFrameView::NonClientBorderThickness() const {
}
int OpaqueBrowserFrameView::NonClientTopBorderHeight() const {
- if (frame_->GetDelegate()->ShouldShowWindowTitle()) {
+ if (frame_->window_delegate()->ShouldShowWindowTitle()) {
int title_top_spacing, title_thickness;
return TitleCoordinates(&title_top_spacing, &title_thickness);
}
@@ -772,7 +772,7 @@ void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(ChromeCanvas* canvas) {
resources()->GetPartBitmap(FRAME_NO_TOOLBAR_TOP_CENTER);
int edge_height = top_center->height() - kClientEdgeThickness;
canvas->TileImageInt(*top_center, 0,
- frame_->GetClientView()->y() - edge_height, width(), edge_height);
+ frame_->client_view()->y() - edge_height, width(), edge_height);
}
}
@@ -787,7 +787,7 @@ void OpaqueBrowserFrameView::PaintDistributorLogo(ChromeCanvas* canvas) {
void OpaqueBrowserFrameView::PaintTitleBar(ChromeCanvas* canvas) {
// The window icon is painted by the TabIconView.
- views::WindowDelegate* d = frame_->GetDelegate();
+ views::WindowDelegate* d = frame_->window_delegate();
if (d->ShouldShowWindowTitle()) {
canvas->DrawStringInt(d->GetWindowTitle(), title_font_, SK_ColorWHITE,
MirroredLeftPointForRect(title_bounds_), title_bounds_.y(),
@@ -807,7 +807,7 @@ void OpaqueBrowserFrameView::PaintToolbarBackground(ChromeCanvas* canvas) {
gfx::Rect toolbar_bounds(browser_view_->GetToolbarBounds());
gfx::Point toolbar_origin(toolbar_bounds.origin());
- View::ConvertPointToView(frame_->GetClientView(), this, &toolbar_origin);
+ View::ConvertPointToView(frame_->client_view(), this, &toolbar_origin);
toolbar_bounds.set_origin(toolbar_origin);
SkBitmap* toolbar_left =
@@ -848,7 +848,7 @@ void OpaqueBrowserFrameView::PaintOTRAvatar(ChromeCanvas* canvas) {
}
void OpaqueBrowserFrameView::PaintRestoredClientEdge(ChromeCanvas* canvas) {
- int client_area_top = frame_->GetClientView()->y();
+ int client_area_top = frame_->client_view()->y();
gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height());
if (browser_view_->IsToolbarVisible()) {
@@ -991,7 +991,7 @@ void OpaqueBrowserFrameView::LayoutTitleBar() {
if (!frame_->IsMaximized())
icon_y -= kIconRestoredAdjust;
- views::WindowDelegate* d = frame_->GetDelegate();
+ views::WindowDelegate* d = frame_->window_delegate();
if (!d->ShouldShowWindowIcon())
icon_size = 0;
if (window_icon_)
diff --git a/chrome/browser/views/frame/opaque_browser_frame_view.h b/chrome/browser/views/frame/opaque_browser_frame_view.h
index ee805f8..d62bf71 100644
--- a/chrome/browser/views/frame/opaque_browser_frame_view.h
+++ b/chrome/browser/views/frame/opaque_browser_frame_view.h
@@ -112,7 +112,7 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView,
// Returns the set of resources to use to paint this view.
views::WindowResources* resources() const {
- return frame_->IsActive() || paint_as_active() ?
+ return frame_->is_active() || paint_as_active() ?
current_active_resources_ : current_inactive_resources_;
}
diff --git a/chrome/browser/views/hung_renderer_view.cc b/chrome/browser/views/hung_renderer_view.cc
index ef78677..4dc72f6 100644
--- a/chrome/browser/views/hung_renderer_view.cc
+++ b/chrome/browser/views/hung_renderer_view.cc
@@ -225,7 +225,7 @@ void HungRendererWarningView::ShowForWebContents(WebContents* contents) {
HWND frame_hwnd = GetAncestor(contents->GetNativeView(), GA_ROOT);
HWND foreground_window = GetForegroundWindow();
if (foreground_window != frame_hwnd &&
- foreground_window != window()->GetNativeWindow()) {
+ foreground_window != window()->GetNativeView()) {
return;
}
@@ -403,7 +403,8 @@ gfx::Rect HungRendererWarningView::GetDisplayBounds(
CRect contents_bounds;
GetWindowRect(contents_hwnd, &contents_bounds);
- gfx::Rect window_bounds = window()->GetBounds();
+ gfx::Rect window_bounds;
+ window()->GetBounds(&window_bounds, true);
int window_x = contents_bounds.left +
(contents_bounds.Width() - window_bounds.width()) / 2;
diff --git a/chrome/browser/views/input_window.cc b/chrome/browser/views/input_window.cc
index a2bc55b..6add8e8 100644
--- a/chrome/browser/views/input_window.cc
+++ b/chrome/browser/views/input_window.cc
@@ -4,8 +4,6 @@
#include "chrome/browser/views/input_window.h"
-#include "base/message_loop.h"
-#include "base/task.h"
#include "chrome/browser/views/standard_layout.h"
#include "chrome/common/l10n_util.h"
#include "chrome/views/grid_layout.h"
@@ -167,6 +165,6 @@ views::Window* CreateInputWindow(HWND parent_hwnd,
views::Window* window =
views::Window::CreateChromeWindow(parent_hwnd, gfx::Rect(),
new ContentView(delegate));
- window->GetClientView()->AsDialogClientView()->UpdateDialogButtons();
+ window->client_view()->AsDialogClientView()->UpdateDialogButtons();
return window;
}
diff --git a/chrome/browser/views/keyword_editor_view.cc b/chrome/browser/views/keyword_editor_view.cc
index a19a3ce..86c93eb7 100644
--- a/chrome/browser/views/keyword_editor_view.cc
+++ b/chrome/browser/views/keyword_editor_view.cc
@@ -25,7 +25,6 @@
#include "chrome/views/dialog_delegate.h"
#include "chrome/views/grid_layout.h"
#include "chrome/views/text_field.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
#include "googleurl/src/gurl.h"
#include "grit/generated_resources.h"
diff --git a/chrome/browser/views/options/advanced_contents_view.cc b/chrome/browser/views/options/advanced_contents_view.cc
index d3e46b2..cc44291 100644
--- a/chrome/browser/views/options/advanced_contents_view.cc
+++ b/chrome/browser/views/options/advanced_contents_view.cc
@@ -38,7 +38,6 @@
#include "chrome/views/combo_box.h"
#include "chrome/views/grid_layout.h"
#include "chrome/views/scroll_view.h"
-#include "chrome/views/widget.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
diff --git a/chrome/browser/views/options/cookies_view.h b/chrome/browser/views/options/cookies_view.h
index 503bbfa..6d829bb 100644
--- a/chrome/browser/views/options/cookies_view.h
+++ b/chrome/browser/views/options/cookies_view.h
@@ -5,7 +5,6 @@
#ifndef CHROME_BROWSER_VIEWS_OPTIONS_COOKIES_VIEW_H__
#define CHROME_BROWSER_VIEWS_OPTIONS_COOKIES_VIEW_H__
-#include "base/task.h"
#include "chrome/views/dialog_delegate.h"
#include "chrome/views/native_button.h"
#include "chrome/views/table_view.h"
diff --git a/chrome/browser/views/page_info_window.cc b/chrome/browser/views/page_info_window.cc
index 99a44c3..ad7f1cc 100644
--- a/chrome/browser/views/page_info_window.cc
+++ b/chrome/browser/views/page_info_window.cc
@@ -670,7 +670,7 @@ void PageInfoWindow::ShowCertDialog(int cert_id) {
view_info.dwSize = sizeof(view_info);
// We set our parent to the tab window. This makes the cert dialog created
// in CryptUIDlgViewCertificate modal to the browser.
- view_info.hwndParent = window()->GetNativeWindow();
+ view_info.hwndParent = window()->owning_window();
view_info.dwFlags = CRYPTUI_DISABLE_EDITPROPERTIES |
CRYPTUI_DISABLE_ADDTOSTORE;
view_info.pCertContext = cert->os_cert_handle();
diff --git a/chrome/browser/views/shelf_item_dialog.cc b/chrome/browser/views/shelf_item_dialog.cc
index eed4742..162076b 100644
--- a/chrome/browser/views/shelf_item_dialog.cc
+++ b/chrome/browser/views/shelf_item_dialog.cc
@@ -21,7 +21,6 @@
#include "chrome/views/grid_layout.h"
#include "chrome/views/label.h"
#include "chrome/views/text_field.h"
-#include "chrome/views/widget.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
#include "grit/theme_resources.h"
diff --git a/chrome/browser/views/tabs/tab_renderer.cc b/chrome/browser/views/tabs/tab_renderer.cc
index 654acea..f1c0e07 100644
--- a/chrome/browser/views/tabs/tab_renderer.cc
+++ b/chrome/browser/views/tabs/tab_renderer.cc
@@ -15,8 +15,6 @@
#include "chrome/common/l10n_util.h"
#include "chrome/common/resource_bundle.h"
#include "chrome/common/win_util.h"
-#include "chrome/views/non_client_view.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
@@ -501,7 +499,7 @@ void TabRenderer::OnMouseExited(const views::MouseEvent& e) {
void TabRenderer::ThemeChanged() {
if (GetWidget() && GetWidget()->AsWindow())
- LoadTabImages(GetWidget()->AsWindow()->GetNonClientView()->UseNativeFrame());
+ LoadTabImages(GetWidget()->AsWindow()->UseNativeFrame());
View::ThemeChanged();
}
@@ -536,7 +534,7 @@ void TabRenderer::PaintTabBackground(ChromeCanvas* canvas) {
animation = pulse_animation_.get();
if (animation->GetCurrentValue() > 0) {
PaintHoverTabBackground(canvas, animation->GetCurrentValue() *
- (GetWidget()->AsWindow()->GetNonClientView()->UseNativeFrame() ?
+ (GetWidget()->AsWindow()->UseNativeFrame() ?
kHoverOpacityVista : kHoverOpacity));
} else {
PaintInactiveTabBackground(canvas);
diff --git a/chrome/browser/views/tabs/tab_strip.cc b/chrome/browser/views/tabs/tab_strip.cc
index d2d4beb..7b26c78 100644
--- a/chrome/browser/views/tabs/tab_strip.cc
+++ b/chrome/browser/views/tabs/tab_strip.cc
@@ -25,7 +25,6 @@
#include "chrome/common/win_util.h"
#include "chrome/views/image_view.h"
#include "chrome/views/painter.h"
-#include "chrome/views/non_client_view.h"
#include "chrome/views/window.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
@@ -599,7 +598,7 @@ void TabStrip::PaintChildren(ChromeCanvas* canvas) {
}
}
- if (GetWidget()->AsWindow()->GetNonClientView()->UseNativeFrame()) {
+ if (GetWidget()->AsWindow()->UseNativeFrame()) {
// Make sure unselected tabs are somewhat transparent.
SkPaint paint;
paint.setColor(SkColorSetARGB(200, 255, 255, 255));
diff --git a/chrome/browser/views/toolbar_view.cc b/chrome/browser/views/toolbar_view.cc
index 02495fc..6b8e048 100644
--- a/chrome/browser/views/toolbar_view.cc
+++ b/chrome/browser/views/toolbar_view.cc
@@ -354,7 +354,7 @@ void BrowserToolbarView::Paint(ChromeCanvas* canvas) {
// For glass, we need to draw a black line below the location bar to separate
// it from the content area. For non-glass, the NonClientView draws the
// toolbar background below the location bar for us.
- if (GetWidget()->AsWindow()->GetNonClientView()->UseNativeFrame())
+ if (GetWidget()->AsWindow()->UseNativeFrame())
canvas->FillRectInt(SK_ColorBLACK, 0, height() - 1, width(), 1);
}
@@ -498,8 +498,8 @@ gfx::Size BrowserToolbarView::GetPreferredSize() {
}
int vertical_spacing = PopupTopSpacing() +
- (GetWidget()->AsWindow()->GetNonClientView()->UseNativeFrame() ?
- kPopupBottomSpacingGlass : kPopupBottomSpacingNonGlass);
+ (GetWidget()->AsWindow()->UseNativeFrame() ? kPopupBottomSpacingGlass
+ : kPopupBottomSpacingNonGlass);
return gfx::Size(0, location_bar_->GetPreferredSize().height() +
vertical_spacing);
}
@@ -810,8 +810,8 @@ void BrowserToolbarView::ButtonPressed(views::BaseButton* sender) {
// static
int BrowserToolbarView::PopupTopSpacing() {
- return GetWidget()->AsWindow()->GetNonClientView()->UseNativeFrame() ?
- 0 : kPopupTopSpacingNonGlass;
+ return GetWidget()->AsWindow()->UseNativeFrame() ? 0
+ : kPopupTopSpacingNonGlass;
}
void BrowserToolbarView::Observe(NotificationType type,
diff --git a/chrome/browser/views/user_data_dir_dialog.cc b/chrome/browser/views/user_data_dir_dialog.cc
index f6f814d..bc0db29 100644
--- a/chrome/browser/views/user_data_dir_dialog.cc
+++ b/chrome/browser/views/user_data_dir_dialog.cc
@@ -6,7 +6,6 @@
#include "chrome/browser/views/user_data_dir_dialog.h"
#include "chrome/common/l10n_util.h"
#include "chrome/views/message_box_view.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
diff --git a/chrome/test/interactive_ui/view_event_test_base.cc b/chrome/test/interactive_ui/view_event_test_base.cc
index 709b25d..b2480c9 100644
--- a/chrome/test/interactive_ui/view_event_test_base.cc
+++ b/chrome/test/interactive_ui/view_event_test_base.cc
@@ -57,7 +57,7 @@ void ViewEventTestBase::SetUp() {
void ViewEventTestBase::TearDown() {
if (window_) {
- DestroyWindow(window_->GetNativeWindow());
+ DestroyWindow(window_->GetNativeView());
window_ = NULL;
}
OleUninitialize();
@@ -79,7 +79,7 @@ void ViewEventTestBase::StartMessageLoopAndRunTest() {
window_->Show();
// Make sure the window is the foreground window, otherwise none of the
// mouse events are going to be targeted correctly.
- SetForegroundWindow(window_->GetNativeWindow());
+ SetForegroundWindow(window_->GetNativeView());
// Flush any pending events to make sure we start with a clean slate.
MessageLoop::current()->RunAllPending();
diff --git a/chrome/views/client_view.cc b/chrome/views/client_view.cc
index 319dd56..0d4cb3e 100644
--- a/chrome/views/client_view.cc
+++ b/chrome/views/client_view.cc
@@ -22,7 +22,7 @@ int ClientView::NonClientHitTest(const gfx::Point& point) {
}
void ClientView::WindowClosing() {
- window_->GetDelegate()->WindowClosing();
+ window_->window_delegate()->WindowClosing();
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/views/custom_frame_view.cc b/chrome/views/custom_frame_view.cc
index d9db4b2..316d7a4 100644
--- a/chrome/views/custom_frame_view.cc
+++ b/chrome/views/custom_frame_view.cc
@@ -260,7 +260,7 @@ CustomFrameView::CustomFrameView(Window* frame)
minimize_button_->SetListener(this, -1);
AddChildView(minimize_button_);
- should_show_minmax_buttons_ = frame_->GetDelegate()->CanMaximize();
+ should_show_minmax_buttons_ = frame_->window_delegate()->CanMaximize();
AddChildView(system_menu_button_);
}
@@ -311,7 +311,7 @@ int CustomFrameView::NonClientHitTest(const gfx::Point& point) {
int window_component = GetHTComponentForFrame(point, FrameBorderThickness(),
NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize,
- frame_->GetDelegate()->CanResize());
+ frame_->window_delegate()->CanResize());
// Fall back to the caption if no other component matches.
return (window_component == HTNOWHERE) ? HTCAPTION : window_component;
}
@@ -370,11 +370,10 @@ void CustomFrameView::Layout() {
}
gfx::Size CustomFrameView::GetPreferredSize() {
- gfx::Size pref = frame_->GetClientView()->GetPreferredSize();
+ gfx::Size pref = frame_->client_view()->GetPreferredSize();
DCHECK(pref.width() > 0 && pref.height() > 0);
gfx::Rect bounds(0, 0, pref.width(), pref.height());
- return frame_->GetNonClientView()->GetWindowBoundsForClientBounds(
- bounds).size();
+ return frame_->GetWindowBoundsForClientBounds(bounds).size();
}
///////////////////////////////////////////////////////////////////////////////
@@ -382,13 +381,13 @@ gfx::Size CustomFrameView::GetPreferredSize() {
void CustomFrameView::ButtonPressed(BaseButton* sender) {
if (sender == close_button_)
- frame_->Close();
+ frame_->ExecuteSystemMenuCommand(SC_CLOSE);
else if (sender == minimize_button_)
- frame_->Minimize();
+ frame_->ExecuteSystemMenuCommand(SC_MINIMIZE);
else if (sender == maximize_button_)
- frame_->Maximize();
+ frame_->ExecuteSystemMenuCommand(SC_MAXIMIZE);
else if (sender == restore_button_)
- frame_->Restore();
+ frame_->ExecuteSystemMenuCommand(SC_RESTORE);
}
///////////////////////////////////////////////////////////////////////////////
@@ -495,11 +494,11 @@ void CustomFrameView::PaintMaximizedFrameBorder(
SkBitmap* titlebar_bottom = resources()->GetPartBitmap(FRAME_CLIENT_EDGE_TOP);
int edge_height = titlebar_bottom->height() - kClientEdgeThickness;
canvas->TileImageInt(*titlebar_bottom, 0,
- frame_->GetClientView()->y() - edge_height, width(), edge_height);
+ frame_->client_view()->y() - edge_height, width(), edge_height);
}
void CustomFrameView::PaintTitleBar(ChromeCanvas* canvas) {
- WindowDelegate* d = frame_->GetDelegate();
+ WindowDelegate* d = frame_->window_delegate();
// It seems like in some conditions we can be asked to paint after the window
// that contains us is WM_DESTROYed. At this point, our delegate is NULL. The
@@ -513,7 +512,7 @@ void CustomFrameView::PaintTitleBar(ChromeCanvas* canvas) {
}
void CustomFrameView::PaintRestoredClientEdge(ChromeCanvas* canvas) {
- gfx::Rect client_area_bounds = frame_->GetClientView()->bounds();
+ gfx::Rect client_area_bounds = frame_->client_view()->bounds();
int client_area_top = client_area_bounds.y();
SkBitmap* top_left = resources()->GetPartBitmap(FRAME_CLIENT_EDGE_TOP_LEFT);
@@ -656,7 +655,7 @@ void CustomFrameView::LayoutTitleBar() {
if (!frame_->IsMaximized())
icon_y -= kIconRestoredAdjust;
- views::WindowDelegate* d = frame_->GetDelegate();
+ views::WindowDelegate* d = frame_->window_delegate();
if (!d->ShouldShowWindowIcon())
icon_size = 0;
system_menu_button_->SetBounds(icon_x, icon_y, icon_size, icon_size);
diff --git a/chrome/views/custom_frame_view.h b/chrome/views/custom_frame_view.h
index 2a47c73..db366a9 100644
--- a/chrome/views/custom_frame_view.h
+++ b/chrome/views/custom_frame_view.h
@@ -87,8 +87,8 @@ class CustomFrameView : public NonClientFrameView,
// Returns the resource collection to be used when rendering the window.
WindowResources* resources() const {
- return frame_->IsActive() || paint_as_active() ? active_resources_
- : inactive_resources_;
+ return frame_->is_active() || paint_as_active() ? active_resources_
+ : inactive_resources_;
}
// The bounds of the client view, in this view's coordinates.
diff --git a/chrome/views/dialog_client_view.cc b/chrome/views/dialog_client_view.cc
index 74732a3..3908c00 100644
--- a/chrome/views/dialog_client_view.cc
+++ b/chrome/views/dialog_client_view.cc
@@ -56,7 +56,7 @@ class DialogButton : public NativeButton {
// Overridden to forward to the delegate.
virtual bool AcceleratorPressed(const Accelerator& accelerator) {
- if (!owner_->GetDelegate()->AsDialogDelegate()->
+ if (!owner_->window_delegate()->AsDialogDelegate()->
AreAcceleratorsEnabled(type_)) {
return false;
}
@@ -322,8 +322,8 @@ void DialogClientView::ButtonPressed(NativeButton* sender) {
// DialogClientView, private:
void DialogClientView::PaintSizeBox(ChromeCanvas* canvas) {
- if (window()->GetDelegate()->CanResize() ||
- window()->GetDelegate()->CanMaximize()) {
+ if (window()->window_delegate()->CanResize() ||
+ window()->window_delegate()->CanMaximize()) {
HDC dc = canvas->beginPlatformPaint();
SIZE gripper_size = { 0, 0 };
gfx::NativeTheme::instance()->GetThemePartSize(
@@ -416,7 +416,7 @@ void DialogClientView::CreateExtraView() {
}
DialogDelegate* DialogClientView::GetDialogDelegate() const {
- DialogDelegate* dd = window()->GetDelegate()->AsDialogDelegate();
+ DialogDelegate* dd = window()->window_delegate()->AsDialogDelegate();
DCHECK(dd);
return dd;
}
diff --git a/chrome/views/dialog_delegate.cc b/chrome/views/dialog_delegate.cc
index d873318..8c29c13 100644
--- a/chrome/views/dialog_delegate.cc
+++ b/chrome/views/dialog_delegate.cc
@@ -4,7 +4,6 @@
#include "chrome/views/dialog_delegate.h"
-#include "base/logging.h"
#include "chrome/views/window.h"
namespace views {
@@ -44,7 +43,7 @@ ClientView* DialogDelegate::CreateClientView(Window* window) {
}
DialogClientView* DialogDelegate::GetDialogClientView() const {
- ClientView* client_view = window()->GetClientView();
+ ClientView* client_view = window()->client_view();
DialogClientView* dialog_client_view = client_view->AsDialogClientView();
DCHECK(dialog_client_view);
return dialog_client_view;
diff --git a/chrome/views/native_frame_view.cc b/chrome/views/native_frame_view.cc
index 898e105..ee8eea2 100644
--- a/chrome/views/native_frame_view.cc
+++ b/chrome/views/native_frame_view.cc
@@ -4,14 +4,14 @@
#include "chrome/views/native_frame_view.h"
-#include "chrome/views/window_win.h"
+#include "chrome/views/window.h"
namespace views {
////////////////////////////////////////////////////////////////////////////////
// NativeFrameView, public:
-NativeFrameView::NativeFrameView(WindowWin* frame)
+NativeFrameView::NativeFrameView(Window* frame)
: NonClientFrameView(),
frame_(frame) {
}
diff --git a/chrome/views/native_frame_view.h b/chrome/views/native_frame_view.h
index c13784d..c46be18 100644
--- a/chrome/views/native_frame_view.h
+++ b/chrome/views/native_frame_view.h
@@ -9,11 +9,9 @@
namespace views {
-class WindowWin;
-
class NativeFrameView : public NonClientFrameView {
public:
- explicit NativeFrameView(WindowWin* frame);
+ explicit NativeFrameView(Window* frame);
virtual ~NativeFrameView();
// NonClientFrameView overrides:
@@ -29,7 +27,7 @@ class NativeFrameView : public NonClientFrameView {
private:
// Our containing frame.
- WindowWin* frame_;
+ Window* frame_;
DISALLOW_COPY_AND_ASSIGN(NativeFrameView);
};
diff --git a/chrome/views/non_client_view.cc b/chrome/views/non_client_view.cc
index 984d5e9..46bea84 100644
--- a/chrome/views/non_client_view.cc
+++ b/chrome/views/non_client_view.cc
@@ -6,7 +6,6 @@
#include "chrome/common/win_util.h"
#include "chrome/views/root_view.h"
-#include "chrome/views/widget.h"
#include "chrome/views/window.h"
namespace views {
@@ -54,6 +53,33 @@ void NonClientView::WindowClosing() {
client_view_->WindowClosing();
}
+void NonClientView::SystemThemeChanged() {
+ // The window may try to paint in SetUseNativeFrame, and as a result it can
+ // get into a state where it is very unhappy with itself - rendering black
+ // behind the entire client area. This is because for some reason the
+ // SkPorterDuff::kClear_mode erase done in the RootView thinks the window is
+ // still opaque. So, to work around this we hide the window as soon as we can
+ // (now), saving off its placement so it can be properly restored once
+ // everything has settled down.
+ WINDOWPLACEMENT saved_window_placement;
+ saved_window_placement.length = sizeof(WINDOWPLACEMENT);
+ GetWindowPlacement(frame_->GetNativeView(), &saved_window_placement);
+ frame_->Hide();
+
+ // Important step: restore the window first, since our hiding hack doesn't
+ // work for maximized windows! We tell the frame not to allow itself to be
+ // made visible though, which removes the brief flicker.
+ frame_->set_force_hidden(true);
+ ShowWindow(frame_->GetNativeView(), SW_RESTORE);
+ frame_->set_force_hidden(false);
+
+ SetUseNativeFrame(win_util::ShouldUseVistaFrame());
+
+ // Now that we've updated the frame, we'll want to restore our saved placement
+ // since the display should have settled down and we can be properly rendered.
+ SetWindowPlacement(frame_->GetNativeView(), &saved_window_placement);
+}
+
void NonClientView::SetUseNativeFrame(bool use_native_frame) {
use_native_frame_ = use_native_frame;
SetFrameView(frame_->CreateFrameViewForWindow());
@@ -180,7 +206,7 @@ views::View* NonClientView::GetViewForPoint(const gfx::Point& point,
bool NonClientFrameView::HitTest(const gfx::Point& l) const {
// For the default case, we assume the non-client frame view never overlaps
// the client view.
- return !GetWidget()->AsWindow()->GetClientView()->bounds().Contains(l);
+ return !GetWidget()->AsWindow()->client_view()->bounds().Contains(l);
}
void NonClientFrameView::DidChangeBounds(const gfx::Rect& previous,
diff --git a/chrome/views/non_client_view.h b/chrome/views/non_client_view.h
index d2ed5c1..9561052 100644
--- a/chrome/views/non_client_view.h
+++ b/chrome/views/non_client_view.h
@@ -137,6 +137,11 @@ class NonClientView : public View {
// Called by the containing Window when it is closed.
void WindowClosing();
+ // Called by the window when it receives a theme changed notification. Changes
+ // the content of the NonClientView to match what is required for the current
+ // system theme.
+ void SystemThemeChanged();
+
// Changes the frame from native to custom depending on the value of
// |use_native_frame|.
void SetUseNativeFrame(bool use_native_frame);
diff --git a/chrome/views/table_view_unittest.cc b/chrome/views/table_view_unittest.cc
index 06f3458..41c985c 100644
--- a/chrome/views/table_view_unittest.cc
+++ b/chrome/views/table_view_unittest.cc
@@ -4,10 +4,9 @@
#include <vector>
-#include "base/message_loop.h"
#include "base/string_util.h"
#include "chrome/views/table_view.h"
-#include "chrome/views/window_win.h"
+#include "chrome/views/window.h"
#include "chrome/views/window_delegate.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -153,7 +152,7 @@ void TableViewTest::SetUp() {
}
void TableViewTest::TearDown() {
- window_->Close();
+ window_->CloseNow();
// Temporary workaround to avoid leak of RootView::pending_paint_task_.
message_loop_.RunAllPending();
OleUninitialize();
diff --git a/chrome/views/view_unittest.cc b/chrome/views/view_unittest.cc
index bbb7616..feb9182 100644
--- a/chrome/views/view_unittest.cc
+++ b/chrome/views/view_unittest.cc
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/message_loop.h"
#include "chrome/common/gfx/chrome_canvas.h"
#include "chrome/common/gfx/path.h"
#include "chrome/common/notification_service.h"
@@ -12,7 +11,6 @@
#include "chrome/views/event.h"
#include "chrome/views/root_view.h"
#include "chrome/views/view.h"
-#include "chrome/views/widget_win.h"
#include "chrome/views/window.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -625,7 +623,7 @@ TEST_F(ViewTest, DialogDefaultButtonTest) {
views::Window::CreateChromeWindow(NULL, gfx::Rect(0, 0, 100, 100),
dialog_view_);
views::DialogClientView* client_view =
- static_cast<views::DialogClientView*>(window->GetClientView());
+ static_cast<views::DialogClientView*>(window->client_view());
views::NativeButton* ok_button = client_view->ok_button();
views::NativeButton* cancel_button = client_view->cancel_button();
diff --git a/chrome/views/views.vcproj b/chrome/views/views.vcproj
index 49e1abe..cbc6cd8 100644
--- a/chrome/views/views.vcproj
+++ b/chrome/views/views.vcproj
@@ -638,6 +638,10 @@
>
</File>
<File
+ RelativePath=".\window.cc"
+ >
+ </File>
+ <File
RelativePath=".\window.h"
>
</File>
@@ -653,14 +657,6 @@
RelativePath=".\window_resources.h"
>
</File>
- <File
- RelativePath=".\window_win.cc"
- >
- </File>
- <File
- RelativePath=".\window_win.h"
- >
- </File>
</Files>
<Globals>
</Globals>
diff --git a/chrome/views/window.h b/chrome/views/window.h
index 718043e..9fe85dd 100644
--- a/chrome/views/window.h
+++ b/chrome/views/window.h
@@ -1,34 +1,123 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
-// source code is governed by a BSD-style license that can be found in the
-// LICENSE file.
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
#ifndef CHROME_VIEWS_WINDOW_H__
#define CHROME_VIEWS_WINDOW_H__
-#include "base/gfx/native_widget_types.h"
+#include "chrome/common/notification_registrar.h"
+#include "chrome/views/client_view.h"
+#include "chrome/views/non_client_view.h"
+#include "chrome/views/widget_win.h"
namespace gfx {
-class Rect;
+class Point;
class Size;
-}
+};
namespace views {
-class ClientView;
-class NonClientFrameView;
+class Client;
class NonClientView;
class WindowDelegate;
-// An interface implemented by an object that provides a top level window.
-class Window {
+///////////////////////////////////////////////////////////////////////////////
+//
+// Window
+//
+// A Window is a WidgetWIn that has a caption and a border. The frame is
+// rendered by the operating system.
+//
+///////////////////////////////////////////////////////////////////////////////
+class Window : public WidgetWin,
+ public NotificationObserver {
public:
- virtual ~Window() {}
+ virtual ~Window();
- // Creates an instance of an object implementing this interface.
- static Window* CreateChromeWindow(gfx::NativeWindow parent,
+ // Creates the appropriate Window class for a Chrome dialog or window. This
+ // means a ChromeWindow or a standard Windows frame.
+ static Window* CreateChromeWindow(HWND parent,
const gfx::Rect& bounds,
WindowDelegate* window_delegate);
+ // Return the maximum size possible size the window should be have if it is
+ // to be positioned within the bounds of the current "work area" (screen or
+ // parent window).
+ gfx::Size CalculateMaximumSize() const;
+
+ // Show the window.
+ void Show();
+ void Show(int show_state);
+
+ // Retrieve the show state of the window. This is one of the SW_SHOW* flags
+ // passed into Windows' ShowWindow method. For normal windows this defaults
+ // to SW_SHOWNORMAL, however windows (e.g. the main window) can override this
+ // method to provide different values (e.g. retrieve the user's specified
+ // show state from the shortcut starutp info).
+ virtual int GetShowState() const;
+
+ // Activate the window, assuming it already exists and is visible.
+ void Activate();
+
+ // Sizes and/or places the window to the specified bounds, size or position.
+ void SetBounds(const gfx::Rect& bounds);
+ // As above, except the window is inserted after |other_hwnd| in the window
+ // Z-order. If this window's HWND is not yet visible, other_hwnd's monitor
+ // is used as the constraining rectangle, rather than this window's hwnd's
+ // monitor.
+ void SetBounds(const gfx::Rect& bounds, HWND other_hwnd);
+
+ // Closes the window, ultimately destroying it.
+ void Close();
+
+ // Whether or not the window is maximized or minimized.
+ bool IsMaximized() const;
+ bool IsMinimized() const;
+
+ // Toggles the enable state for the Close button (and the Close menu item in
+ // the system menu).
+ void EnableClose(bool enable);
+
+ // Prevents the window from being rendered as deactivated the next time it is.
+ // This state is reset automatically as soon as the window becomes actiated
+ // again. There is no ability to control the state through this API as this
+ // leads to sync problems.
+ void DisableInactiveRendering();
+
+ // Tell the window to update its title from the delegate.
+ void UpdateWindowTitle();
+
+ // Tell the window to update its icon from the delegate.
+ void UpdateWindowIcon();
+
+ // Executes the specified SC_command.
+ void ExecuteSystemMenuCommand(int command);
+
+ // Shortcut to access the determination of whether or not we're using a
+ // native frame. This triggers different rendering modes in certain views and
+ // should be used in preference to calling win_util::ShouldUseVistaFrame.
+ bool UseNativeFrame() const { return non_client_view_->UseNativeFrame(); }
+
+ // Returns the bounds of the window required to display the content area
+ // at the specified bounds.
+ gfx::Rect GetWindowBoundsForClientBounds(const gfx::Rect& client_bounds);
+
+ // Creates an appropriate NonClientFrameView for this window.
+ virtual NonClientFrameView* CreateFrameViewForWindow();
+
+ // Updates the frame after an event caused it to be changed.
+ virtual void UpdateFrameAfterFrameChange();
+
+ // Accessors and setters for various properties.
+ WindowDelegate* window_delegate() const { return window_delegate_; }
+ HWND owning_window() const { return owning_hwnd_; }
+ ClientView* client_view() const { return non_client_view_->client_view(); }
+ bool is_active() const { return is_active_; }
+ void set_focus_on_creation(bool focus_on_creation) {
+ focus_on_creation_ = focus_on_creation;
+ }
+ void set_force_hidden(bool force_hidden) { force_hidden_ = force_hidden; }
+
// Returns the preferred size of the contents view of this window based on
// its localized size data. The width in cols is held in a localized string
// resource identified by |col_resource_id|, the height in the same fashion.
@@ -39,80 +128,196 @@ class Window {
static gfx::Size GetLocalizedContentsSize(int col_resource_id,
int row_resource_id);
- // Retrieves the window's bounds, including its frame.
- virtual gfx::Rect GetBounds() const = 0;
+ // NotificationObserver overrides:
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
- // Sizes and/or places the window to the specified bounds, size or position.
- virtual void SetBounds(const gfx::Rect& bounds) = 0;
-
- // As above, except the window is inserted after |other_window| in the window
- // Z-order. If this window is not yet visible, other_window's monitor is used
- // as the constraining rectangle, rather than this window's monitor.
- virtual void SetBounds(const gfx::Rect& bounds,
- gfx::NativeWindow other_window) = 0;
+ protected:
+ // Constructs the Window. |window_delegate| cannot be NULL.
+ explicit Window(WindowDelegate* window_delegate);
- // Makes the window visible.
- virtual void Show() = 0;
+ // Create the Window.
+ // If parent is NULL, this Window is top level on the desktop.
+ // If |bounds| is empty, the view is queried for its preferred size and
+ // centered on screen.
+ virtual void Init(HWND parent, const gfx::Rect& bounds);
- // Activate the window, assuming it already exists and is visible.
- virtual void Activate() = 0;
+ // Sizes the window to the default size specified by its ClientView.
+ virtual void SizeWindowToDefault();
- // Closes the window, ultimately destroying it. This isn't immediate (it
- // occurs after a return to the message loop.) Implementors must also make
- // sure that invoking Close multiple times doesn't cause bad things to happen,
- // since it can happen.
- virtual void Close() = 0;
+ // Returns true if the Window is considered to be an "app window" - i.e. any
+ // window which when it is the last of its type closed causes the application
+ // to exit.
+ virtual bool IsAppWindow() const { return false; }
- // Maximizes/minimizes/restores the window.
- virtual void Maximize() = 0;
- virtual void Minimize() = 0;
- virtual void Restore() = 0;
+ // Shows the system menu at the specified screen point.
+ void RunSystemMenu(const gfx::Point& point);
- // Whether or not the window is currently active.
- virtual bool IsActive() const = 0;
+ // Overridden from WidgetWin:
+ virtual void OnActivate(UINT action, BOOL minimized, HWND window);
+ virtual void OnActivateApp(BOOL active, DWORD thread_id);
+ virtual LRESULT OnAppCommand(HWND window, short app_command, WORD device,
+ int keystate);
+ virtual void OnCommand(UINT notification_code, int command_id, HWND window);
+ virtual void OnDestroy();
+ virtual LRESULT OnDwmCompositionChanged(UINT msg, WPARAM w_param,
+ LPARAM l_param);
+ virtual void OnFinalMessage(HWND window);
+ virtual void OnInitMenu(HMENU menu);
+ virtual void OnMouseLeave();
+ virtual LRESULT OnNCActivate(BOOL active);
+ virtual LRESULT OnNCCalcSize(BOOL mode, LPARAM l_param);
+ virtual LRESULT OnNCHitTest(const CPoint& point);
+ virtual void OnNCPaint(HRGN rgn);
+ virtual void OnNCLButtonDown(UINT ht_component, const CPoint& point);
+ virtual void OnNCRButtonDown(UINT ht_component, const CPoint& point);
+ virtual LRESULT OnNCUAHDrawCaption(UINT msg, WPARAM w_param, LPARAM l_param);
+ virtual LRESULT OnNCUAHDrawFrame(UINT msg, WPARAM w_param, LPARAM l_param);
+ virtual LRESULT OnSetCursor(HWND window, UINT hittest_code, UINT message);
+ virtual LRESULT OnSetIcon(UINT size_type, HICON new_icon);
+ virtual LRESULT OnSetText(const wchar_t* text);
+ virtual void OnSize(UINT size_param, const CSize& new_size);
+ virtual void OnSysCommand(UINT notification_code, CPoint click);
+ virtual void OnWindowPosChanging(WINDOWPOS* window_pos);
+ virtual Window* AsWindow() { return this; }
+ virtual const Window* AsWindow() const { return this; }
- // Whether or not the window is currently visible.
- virtual bool IsVisible() const = 0;
+ // The View that provides the non-client area of the window (title bar,
+ // window controls, sizing borders etc). To use an implementation other than
+ // the default, this class must be subclassed and this value set to the
+ // desired implementation before calling |Init|.
+ NonClientView* non_client_view_;
- // Whether or not the window is maximized or minimized.
- virtual bool IsMaximized() const = 0;
- virtual bool IsMinimized() const = 0;
+ // Accessor for disable_inactive_rendering_.
+ bool disable_inactive_rendering() const {
+ return disable_inactive_rendering_;
+ }
- // Toggles the enable state for the Close button (and the Close menu item in
- // the system menu).
- virtual void EnableClose(bool enable) = 0;
+ private:
+ // Set the window as modal (by disabling all the other windows).
+ void BecomeModal();
- // Prevents the window from being rendered as deactivated the next time it is.
- // This state is reset automatically as soon as the window becomes activated
- // again. There is no ability to control the state through this API as this
- // leads to sync problems.
- virtual void DisableInactiveRendering() = 0;
+ // Sets-up the focus manager with the view that should have focus when the
+ // window is shown the first time. If NULL is returned, the focus goes to the
+ // button if there is one, otherwise the to the Cancel button.
+ void SetInitialFocus();
- // Tell the window to update its title from the delegate.
- virtual void UpdateWindowTitle() = 0;
+ // Place and size the window when it is created. |create_bounds| are the
+ // bounds used when the window was created.
+ void SetInitialBounds(const gfx::Rect& create_bounds);
- // Tell the window to update its icon from the delegate.
- virtual void UpdateWindowIcon() = 0;
+ // Restore saved always on stop state and add the always on top system menu
+ // if needed.
+ void InitAlwaysOnTopState();
- // Creates an appropriate NonClientFrameView for this window.
- virtual NonClientFrameView* CreateFrameViewForWindow() = 0;
+ // Add an item for "Always on Top" to the System Menu.
+ void AddAlwaysOnTopSystemMenuItem();
- // Updates the frame after an event caused it to be changed.
- virtual void UpdateFrameAfterFrameChange() = 0;
+ // If necessary, enables all ancestors.
+ void RestoreEnabledIfNecessary();
+
+ // Update the window style to reflect the always on top state.
+ void AlwaysOnTopChanged();
+
+ // Calculate the appropriate window styles for this window.
+ DWORD CalculateWindowStyle();
+ DWORD CalculateWindowExStyle();
+
+ // Asks the delegate if any to save the window's location and size.
+ void SaveWindowPosition();
+
+ // Lock or unlock the window from being able to redraw itself in response to
+ // updates to its invalid region.
+ class ScopedRedrawLock;
+ void LockUpdates();
+ void UnlockUpdates();
+
+ // Resets the window region for the current window bounds if necessary.
+ // If |force| is true, the window region is reset to NULL even for native
+ // frame windows.
+ void ResetWindowRegion(bool force);
+
+ // Converts a non-client mouse down message to a regular ChromeViews event
+ // and handle it. |point| is the mouse position of the message in screen
+ // coords. |flags| are flags that would be passed with a WM_L/M/RBUTTON*
+ // message and relate to things like which button was pressed. These are
+ // combined with flags relating to the current key state.
+ void ProcessNCMousePress(const CPoint& point, int flags);
+
+ // Calls the default WM_NCACTIVATE handler with the specified activation
+ // value, safely wrapping the call in a ScopedRedrawLock to prevent frame
+ // flicker.
+ LRESULT CallDefaultNCActivateHandler(BOOL active);
+
+ // Static resource initialization.
+ static void InitClass();
+ enum ResizeCursor {
+ RC_NORMAL = 0, RC_VERTICAL, RC_HORIZONTAL, RC_NESW, RC_NWSE
+ };
+ static HCURSOR resize_cursors_[6];
+
+ // Our window delegate (see Init method for documentation).
+ WindowDelegate* window_delegate_;
+
+ // Whether we should SetFocus() on a newly created window after
+ // Init(). Defaults to true.
+ bool focus_on_creation_;
+
+ // We need to save the parent window that spawned us, since GetParent()
+ // returns NULL for dialogs.
+ HWND owning_hwnd_;
+
+ // The smallest size the window can be.
+ CSize minimum_size_;
+
+ // Whether or not the window is modal. This comes from the delegate and is
+ // cached at Init time to avoid calling back to the delegate from the
+ // destructor.
+ bool is_modal_;
+
+ // Whether all ancestors have been enabled. This is only used if is_modal_ is
+ // true.
+ bool restored_enabled_;
+
+ // Whether the window is currently always on top.
+ bool is_always_on_top_;
+
+ // We need to own the text of the menu, the Windows API does not copy it.
+ std::wstring always_on_top_menu_text_;
+
+ // Set to true if the window is in the process of closing .
+ bool window_closed_;
+
+ // True when the window should be rendered as active, regardless of whether
+ // or not it actually is.
+ bool disable_inactive_rendering_;
+
+ // True if this window is the active top level window.
+ bool is_active_;
+
+ // True if updates to this window are currently locked.
+ bool lock_updates_;
+
+ // The window styles of the window before updates were locked.
+ DWORD saved_window_style_;
- // Retrieves the Window's delegate.
- virtual WindowDelegate* GetDelegate() const = 0;
+ // The saved maximized state for this window. See note in SetInitialBounds
+ // that explains why we save this.
+ bool saved_maximized_state_;
- // Retrieves the Window's non-client view.
- virtual NonClientView* GetNonClientView() const = 0;
+ // True if we should prevent attempts to make the window visible when we
+ // handle WM_WINDOWPOSCHANGING. Some calls like ShowWindow(SW_RESTORE) make
+ // the window visible in addition to restoring it, when all we want to do is
+ // restore it.
+ bool force_hidden_;
- // Retrieves the Window's client view.
- virtual ClientView* GetClientView() const = 0;
+ // Hold onto notifications.
+ NotificationRegistrar notification_registrar_;
- // Retrieves the Window's native window handle.
- virtual gfx::NativeWindow GetNativeWindow() const = 0;
+ DISALLOW_COPY_AND_ASSIGN(Window);
};
} // namespace views
-#endif // #ifndef CHROME_VIEWS_WINDOW_H__
+#endif // CHROME_VIEWS_WINDOW_H__
diff --git a/chrome/views/window_delegate.h b/chrome/views/window_delegate.h
index 985ed60..bbd5296 100644
--- a/chrome/views/window_delegate.h
+++ b/chrome/views/window_delegate.h
@@ -148,7 +148,7 @@ class WindowDelegate {
void ReleaseWindow();
private:
- friend class WindowWin;
+ friend class Window;
// This is a little unusual. We use a scoped_ptr here because it's
// initialized to NULL automatically. We do this because we want to allow
// people using this helper to not have to call a ctor on this object.
diff --git a/chrome/views/window_win.cc b/chrome/views/window_win.cc
deleted file mode 100644
index e2226d7..0000000
--- a/chrome/views/window_win.cc
+++ /dev/null
@@ -1,1234 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/views/window_win.h"
-
-#include <shellapi.h>
-
-#include "base/win_util.h"
-#include "chrome/app/chrome_dll_resource.h"
-#include "chrome/common/gfx/chrome_canvas.h"
-#include "chrome/common/gfx/chrome_font.h"
-#include "chrome/common/gfx/icon_util.h"
-#include "chrome/common/gfx/path.h"
-#include "chrome/common/l10n_util.h"
-#include "chrome/common/notification_service.h"
-#include "chrome/common/pref_service.h"
-#include "chrome/common/resource_bundle.h"
-#include "chrome/common/win_util.h"
-#include "chrome/views/client_view.h"
-#include "chrome/views/custom_frame_view.h"
-#include "chrome/views/native_frame_view.h"
-#include "chrome/views/non_client_view.h"
-#include "chrome/views/root_view.h"
-#include "chrome/views/window_delegate.h"
-#include "grit/generated_resources.h"
-
-namespace views {
-
-// A scoping class that prevents a window from being able to redraw in response
-// to invalidations that may occur within it for the lifetime of the object.
-//
-// Why would we want such a thing? Well, it turns out Windows has some
-// "unorthodox" behavior when it comes to painting its non-client areas.
-// Occasionally, Windows will paint portions of the default non-client area
-// right over the top of the custom frame. This is not simply fixed by handling
-// WM_NCPAINT/WM_PAINT, with some investigation it turns out that this
-// rendering is being done *inside* the default implementation of some message
-// handlers and functions:
-// . WM_SETTEXT
-// . WM_SETICON
-// . WM_NCLBUTTONDOWN
-// . EnableMenuItem, called from our WM_INITMENU handler
-// The solution is to handle these messages and call DefWindowProc ourselves,
-// but prevent the window from being able to update itself for the duration of
-// the call. We do this with this class, which automatically calls its
-// associated Window's lock and unlock functions as it is created and destroyed.
-// See documentation in those methods for the technique used.
-//
-// IMPORTANT: Do not use this scoping object for large scopes or periods of
-// time! IT WILL PREVENT THE WINDOW FROM BEING REDRAWN! (duh).
-//
-// I would love to hear Raymond Chen's explanation for all this. And maybe a
-// list of other messages that this applies to ;-)
-class WindowWin::ScopedRedrawLock {
- public:
- explicit ScopedRedrawLock(WindowWin* window) : window_(window) {
- window_->LockUpdates();
- }
-
- ~ScopedRedrawLock() {
- window_->UnlockUpdates();
- }
-
- private:
- // The window having its style changed.
- WindowWin* window_;
-};
-
-HCURSOR WindowWin::resize_cursors_[6];
-
-// If the hung renderer warning doesn't fit on screen, the amount of padding to
-// be left between the edge of the window and the edge of the nearest monitor,
-// after the window is nudged back on screen. Pixels.
-static const int kMonitorEdgePadding = 10;
-
-////////////////////////////////////////////////////////////////////////////////
-// WindowWin, public:
-
-WindowWin::~WindowWin() {
-}
-
-// static
-Window* Window::CreateChromeWindow(gfx::NativeWindow parent,
- const gfx::Rect& bounds,
- WindowDelegate* window_delegate) {
- WindowWin* window = new WindowWin(window_delegate);
- window->GetNonClientView()->SetFrameView(window->CreateFrameViewForWindow());
- window->Init(parent, bounds);
- return window;
-}
-
-gfx::Rect WindowWin::GetBounds() const {
- gfx::Rect bounds;
- WidgetWin::GetBounds(&bounds, true);
- return bounds;
-}
-
-void WindowWin::SetBounds(const gfx::Rect& bounds) {
- SetBounds(bounds, NULL);
-}
-
-void WindowWin::SetBounds(const gfx::Rect& bounds,
- gfx::NativeWindow other_window) {
- win_util::SetChildBounds(GetNativeView(), GetParent(), other_window, bounds,
- kMonitorEdgePadding, 0);
-}
-
-void WindowWin::Show(int show_state) {
- ShowWindow(show_state);
- // When launched from certain programs like bash and Windows Live Messenger,
- // show_state is set to SW_HIDE, so we need to correct that condition. We
- // don't just change show_state to SW_SHOWNORMAL because MSDN says we must
- // always first call ShowWindow with the specified value from STARTUPINFO,
- // otherwise all future ShowWindow calls will be ignored (!!#@@#!). Instead,
- // we call ShowWindow again in this case.
- if (show_state == SW_HIDE) {
- show_state = SW_SHOWNORMAL;
- ShowWindow(show_state);
- }
-
- // We need to explicitly activate the window if we've been shown with a state
- // that should activate, because if we're opened from a desktop shortcut while
- // an existing window is already running it doesn't seem to be enough to use
- // one of these flags to activate the window.
- if (show_state == SW_SHOWNORMAL)
- Activate();
-
- SetInitialFocus();
-}
-
-int WindowWin::GetShowState() const {
- return SW_SHOWNORMAL;
-}
-
-void WindowWin::ExecuteSystemMenuCommand(int command) {
- if (command)
- SendMessage(GetNativeView(), WM_SYSCOMMAND, command, 0);
-}
-
-// static
-int Window::GetLocalizedContentsWidth(int col_resource_id) {
- double chars = _wtof(l10n_util::GetString(col_resource_id).c_str());
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- ChromeFont font = rb.GetFont(ResourceBundle::BaseFont);
- int width = font.GetExpectedTextWidth(static_cast<int>(chars));
- DCHECK(width > 0);
- return width;
-}
-
-// static
-int Window::GetLocalizedContentsHeight(int row_resource_id) {
- double lines = _wtof(l10n_util::GetString(row_resource_id).c_str());
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- ChromeFont font = rb.GetFont(ResourceBundle::BaseFont);
- int height = static_cast<int>(font.height() * lines);
- DCHECK(height > 0);
- return height;
-}
-
-// static
-gfx::Size Window::GetLocalizedContentsSize(int col_resource_id,
- int row_resource_id) {
- return gfx::Size(GetLocalizedContentsWidth(col_resource_id),
- GetLocalizedContentsHeight(row_resource_id));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WindowWin, Window implementation:
-
-void WindowWin::Show() {
- int show_state = GetShowState();
- if (saved_maximized_state_)
- show_state = SW_SHOWMAXIMIZED;
- Show(show_state);
-}
-
-void WindowWin::Activate() {
- if (IsMinimized())
- ::ShowWindow(GetNativeView(), SW_RESTORE);
- ::SetWindowPos(GetNativeView(), HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
- SetForegroundWindow(GetNativeView());
-}
-
-void WindowWin::Close() {
- if (window_closed_) {
- // It appears we can hit this code path if you close a modal dialog then
- // close the last browser before the destructor is hit, which triggers
- // invoking Close again. I'm short circuiting this code path to avoid
- // calling into the delegate twice, which is problematic.
- return;
- }
-
- if (non_client_view_->CanClose()) {
- SaveWindowPosition();
- RestoreEnabledIfNecessary();
- WidgetWin::Close();
- // 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.
- if (owning_hwnd_ && GetNativeView() == GetForegroundWindow() &&
- IsWindowVisible(owning_hwnd_)) {
- SetForegroundWindow(owning_hwnd_);
- }
- window_closed_ = true;
- }
-}
-
-void WindowWin::Maximize() {
- ExecuteSystemMenuCommand(SC_MAXIMIZE);
-}
-
-void WindowWin::Minimize() {
- ExecuteSystemMenuCommand(SC_MINIMIZE);
-}
-
-void WindowWin::Restore() {
- ExecuteSystemMenuCommand(SC_RESTORE);
-}
-
-bool WindowWin::IsActive() const {
- return is_active_;
-}
-
-bool WindowWin::IsVisible() const {
- return !!::IsWindowVisible(GetNativeView());
-}
-
-bool WindowWin::IsMaximized() const {
- return !!::IsZoomed(GetNativeView());
-}
-
-bool WindowWin::IsMinimized() const {
- return !!::IsIconic(GetNativeView());
-}
-
-void WindowWin::EnableClose(bool enable) {
- // If the native frame is rendering its own close button, ask it to disable.
- non_client_view_->EnableClose(enable);
-
- // Disable the native frame's close button regardless of whether or not the
- // native frame is in use, since this also affects the system menu.
- EnableMenuItem(GetSystemMenu(GetNativeView(), false),
- SC_CLOSE, enable ? MF_ENABLED : MF_GRAYED);
-
- // Let the window know the frame changed.
- SetWindowPos(NULL, 0, 0, 0, 0,
- SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOCOPYBITS |
- SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREPOSITION |
- SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOZORDER);
-}
-
-void WindowWin::DisableInactiveRendering() {
- disable_inactive_rendering_ = true;
- non_client_view_->DisableInactiveRendering(disable_inactive_rendering_);
-}
-
-void WindowWin::UpdateWindowTitle() {
- // If the non-client view is rendering its own title, it'll need to relayout
- // now.
- non_client_view_->Layout();
-
- // Update the native frame's text. We do this regardless of whether or not
- // the native frame is being used, since this also updates the taskbar, etc.
- std::wstring window_title = window_delegate_->GetWindowTitle();
- std::wstring localized_text;
- if (l10n_util::AdjustStringForLocaleDirection(window_title, &localized_text))
- window_title.assign(localized_text);
- SetWindowText(GetNativeView(), window_title.c_str());
-}
-
-void WindowWin::UpdateWindowIcon() {
- // If the non-client view is rendering its own icon, we need to tell it to
- // repaint.
- non_client_view_->SchedulePaint();
-
- // Update the native frame's icon. We do this regardless of whether or not
- // the native frame is being used, since this also updates the taskbar, etc.
- SkBitmap icon = window_delegate_->GetWindowIcon();
- if (!icon.isNull()) {
- HICON windows_icon = IconUtil::CreateHICONFromSkBitmap(icon);
- // We need to make sure to destroy the previous icon, otherwise we'll leak
- // these GDI objects until we crash!
- HICON old_icon = reinterpret_cast<HICON>(
- SendMessage(GetNativeView(), WM_SETICON, ICON_SMALL,
- reinterpret_cast<LPARAM>(windows_icon)));
- if (old_icon)
- DestroyIcon(old_icon);
- old_icon = reinterpret_cast<HICON>(
- SendMessage(GetNativeView(), WM_SETICON, ICON_BIG,
- reinterpret_cast<LPARAM>(windows_icon)));
- if (old_icon)
- DestroyIcon(old_icon);
- }
-}
-
-NonClientFrameView* WindowWin::CreateFrameViewForWindow() {
- if (non_client_view_->UseNativeFrame())
- return new NativeFrameView(this);
- return new CustomFrameView(this);
-}
-
-void WindowWin::UpdateFrameAfterFrameChange() {
- // We've either gained or lost a custom window region, so reset it now.
- ResetWindowRegion(true);
-}
-
-WindowDelegate* WindowWin::GetDelegate() const {
- return window_delegate_;
-}
-
-NonClientView* WindowWin::GetNonClientView() const {
- return non_client_view_;
-}
-
-ClientView* WindowWin::GetClientView() const {
- return non_client_view_->client_view();
-}
-
-gfx::NativeWindow WindowWin::GetNativeWindow() const {
- return GetNativeView();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WindowWin, NotificationObserver implementation:
-
-void WindowWin::Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- // This window is closed when the last app window is closed.
- DCHECK(type == NotificationType::ALL_APPWINDOWS_CLOSED);
- // Only registered as an observer when we're not an app window.
- // XXX DCHECK(!IsAppWindow());
- Close();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// WindowWin, protected:
-
-WindowWin::WindowWin(WindowDelegate* window_delegate)
- : WidgetWin(),
- focus_on_creation_(true),
- window_delegate_(window_delegate),
- non_client_view_(new NonClientView(this)),
- owning_hwnd_(NULL),
- minimum_size_(100, 100),
- is_modal_(false),
- restored_enabled_(false),
- is_always_on_top_(false),
- window_closed_(false),
- disable_inactive_rendering_(false),
- is_active_(false),
- lock_updates_(false),
- saved_window_style_(0),
- saved_maximized_state_(0),
- force_hidden_(false) {
- InitClass();
- DCHECK(window_delegate_);
- window_delegate_->window_.reset(this);
- // Initialize these values to 0 so that subclasses can override the default
- // behavior before calling Init.
- set_window_style(0);
- set_window_ex_style(0);
-}
-
-void WindowWin::Init(HWND parent, const gfx::Rect& bounds) {
- // We need to save the parent window, since later calls to GetParent() will
- // return NULL.
- owning_hwnd_ = parent;
- // We call this after initializing our members since our implementations of
- // assorted WidgetWin functions may be called during initialization.
- is_modal_ = window_delegate_->IsModal();
- if (is_modal_)
- BecomeModal();
- is_always_on_top_ = window_delegate_->IsAlwaysOnTop();
-
- if (window_style() == 0)
- set_window_style(CalculateWindowStyle());
- if (window_ex_style() == 0)
- set_window_ex_style(CalculateWindowExStyle());
-
- WidgetWin::Init(parent, bounds, true);
- win_util::SetWindowUserData(GetNativeView(), this);
-
- // Create the ClientView, add it to the NonClientView and add the
- // NonClientView to the RootView. This will cause everything to be parented.
- non_client_view_->set_client_view(window_delegate_->CreateClientView(this));
- WidgetWin::SetContentsView(non_client_view_);
-
- UpdateWindowTitle();
-
- SetInitialBounds(bounds);
- InitAlwaysOnTopState();
-
- if (!IsAppWindow()) {
- notification_registrar_.Add(
- this,
- NotificationType::ALL_APPWINDOWS_CLOSED,
- NotificationService::AllSources());
- }
-
- ResetWindowRegion(false);
-}
-
-void WindowWin::SizeWindowToDefault() {
- win_util::CenterAndSizeWindow(owning_window(), GetNativeView(),
- non_client_view_->GetPreferredSize().ToSIZE(),
- false);
-}
-
-void WindowWin::RunSystemMenu(const gfx::Point& point) {
- // We need to reset and clean up any currently created system menu objects.
- // We need to call this otherwise there's a small chance that we aren't going
- // to get a system menu. We also can't take the return value of this
- // function. We need to call it *again* to get a valid HMENU.
- //::GetSystemMenu(GetNativeView(), TRUE);
- HMENU system_menu = ::GetSystemMenu(GetNativeView(), FALSE);
- int id = ::TrackPopupMenu(system_menu,
- TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD,
- point.x(), point.y(), 0, GetNativeView(), NULL);
- ExecuteSystemMenuCommand(id);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// WindowWin, WidgetWin overrides:
-
-void WindowWin::OnActivate(UINT action, BOOL minimized, HWND window) {
- if (action == WA_INACTIVE)
- SaveWindowPosition();
-}
-
-void WindowWin::OnActivateApp(BOOL active, DWORD thread_id) {
- if (!active && thread_id != GetCurrentThreadId()) {
- // Another application was activated, we should reset any state that
- // disables inactive rendering now.
- disable_inactive_rendering_ = false;
- non_client_view_->DisableInactiveRendering(false);
- // Update the native frame too, since it could be rendering the non-client
- // area.
- CallDefaultNCActivateHandler(FALSE);
- }
-}
-
-LRESULT WindowWin::OnAppCommand(HWND window, short app_command, WORD device,
- int keystate) {
- // We treat APPCOMMAND ids as an extension of our command namespace, and just
- // let the delegate figure out what to do...
- if (!window_delegate_->ExecuteWindowsCommand(app_command))
- return WidgetWin::OnAppCommand(window, app_command, device, keystate);
- return 0;
-}
-
-void WindowWin::OnCommand(UINT notification_code, int command_id, HWND window) {
- // If the notification code is > 1 it means it is control specific and we
- // should ignore it.
- if (notification_code > 1 ||
- window_delegate_->ExecuteWindowsCommand(command_id)) {
- WidgetWin::OnCommand(notification_code, command_id, window);
- }
-}
-
-void WindowWin::OnDestroy() {
- non_client_view_->WindowClosing();
- RestoreEnabledIfNecessary();
- WidgetWin::OnDestroy();
-}
-
-namespace {
-static BOOL CALLBACK SendDwmCompositionChanged(HWND window, LPARAM param) {
- SendMessage(window, WM_DWMCOMPOSITIONCHANGED, 0, 0);
- return TRUE;
-}
-} // namespace
-
-LRESULT WindowWin::OnDwmCompositionChanged(UINT msg, WPARAM w_param,
- LPARAM l_param) {
- // The window may try to paint in SetUseNativeFrame, and as a result it can
- // get into a state where it is very unhappy with itself - rendering black
- // behind the entire client area. This is because for some reason the
- // SkPorterDuff::kClear_mode erase done in the RootView thinks the window is
- // still opaque. So, to work around this we hide the window as soon as we can
- // (now), saving off its placement so it can be properly restored once
- // everything has settled down.
- WINDOWPLACEMENT saved_window_placement;
- saved_window_placement.length = sizeof(WINDOWPLACEMENT);
- GetWindowPlacement(GetNativeView(), &saved_window_placement);
- Hide();
-
- // Important step: restore the window first, since our hiding hack doesn't
- // work for maximized windows! We tell the frame not to allow itself to be
- // made visible though, which removes the brief flicker.
- force_hidden_ = true;
- ::ShowWindow(GetNativeView(), SW_RESTORE);
- force_hidden_ = false;
-
- // We respond to this in response to WM_DWMCOMPOSITIONCHANGED since that is
- // the only thing we care about - we don't actually respond to WM_THEMECHANGED
- // messages.
- non_client_view_->SetUseNativeFrame(win_util::ShouldUseVistaFrame());
-
- // Now that we've updated the frame, we'll want to restore our saved placement
- // since the display should have settled down and we can be properly rendered.
- SetWindowPlacement(GetNativeView(), &saved_window_placement);
-
- // WM_DWMCOMPOSITIONCHANGED is only sent to top level windows, however we want
- // to notify our children too, since we can have MDI child windows who need to
- // update their appearance.
- EnumChildWindows(GetNativeView(), &SendDwmCompositionChanged, NULL);
- return 0;
-}
-
-void WindowWin::OnFinalMessage(HWND window) {
- // Delete and NULL the delegate here once we're guaranteed to get no more
- // messages.
- window_delegate_->DeleteDelegate();
- window_delegate_ = NULL;
- WidgetWin::OnFinalMessage(window);
-}
-
-namespace {
-static void EnableMenuItem(HMENU menu, UINT command, bool enabled) {
- UINT flags = MF_BYCOMMAND | (enabled ? MF_ENABLED : MF_DISABLED | MF_GRAYED);
- EnableMenuItem(menu, command, flags);
-}
-} // namespace
-
-void WindowWin::OnInitMenu(HMENU menu) {
- // We only need to manually enable the system menu if we're not using a native
- // frame.
- if (non_client_view_->UseNativeFrame())
- WidgetWin::OnInitMenu(menu);
-
- bool is_minimized = IsMinimized();
- bool is_maximized = IsMaximized();
- bool is_restored = !is_minimized && !is_maximized;
-
- ScopedRedrawLock lock(this);
- EnableMenuItem(menu, SC_RESTORE, !is_restored);
- EnableMenuItem(menu, SC_MOVE, is_restored);
- EnableMenuItem(menu, SC_SIZE, window_delegate_->CanResize() && is_restored);
- EnableMenuItem(menu, SC_MAXIMIZE,
- window_delegate_->CanMaximize() && !is_maximized);
- EnableMenuItem(menu, SC_MINIMIZE,
- window_delegate_->CanMaximize() && !is_minimized);
-}
-
-void WindowWin::OnMouseLeave() {
- // We only need to manually track WM_MOUSELEAVE messages between the client
- // and non-client area when we're not using the native frame.
- if (non_client_view_->UseNativeFrame()) {
- SetMsgHandled(FALSE);
- return;
- }
-
- bool process_mouse_exited = true;
- POINT pt;
- if (GetCursorPos(&pt)) {
- LRESULT ht_component =
- ::SendMessage(GetNativeView(), WM_NCHITTEST, 0, MAKELPARAM(pt.x, pt.y));
- if (ht_component != HTNOWHERE) {
- // If the mouse moved into a part of the window's non-client area, then
- // don't send a mouse exited event since the mouse is still within the
- // bounds of the ChromeView that's rendering the frame. Note that we do
- // _NOT_ do this for windows with native frames, since in that case the
- // mouse really will have left the bounds of the RootView.
- process_mouse_exited = false;
- }
- }
-
- if (process_mouse_exited)
- ProcessMouseExited();
-}
-
-LRESULT WindowWin::OnNCActivate(BOOL active) {
- is_active_ = !!active;
-
- // If we're not using the native frame, we need to force a synchronous repaint
- // otherwise we'll be left in the wrong activation state until something else
- // causes a repaint later.
- if (!non_client_view_->UseNativeFrame()) {
- // We can get WM_NCACTIVATE before we're actually visible. If we're not
- // visible, no need to paint.
- if (IsWindowVisible(GetNativeView())) {
- non_client_view_->SchedulePaint();
- // We need to force a paint now, as a user dragging a window will block
- // painting operations while the move is in progress.
- PaintNow(root_view_->GetScheduledPaintRect());
- }
- }
-
- // If we're active again, we should be allowed to render as inactive, so
- // tell the non-client view. This must be done independently of the check for
- // disable_inactive_rendering_ since that check is valid even if the frame
- // is not active, but this can only be done if we've become active.
- if (IsActive())
- non_client_view_->DisableInactiveRendering(false);
-
- // Reset the disable inactive rendering state since activation has changed.
- if (disable_inactive_rendering_) {
- disable_inactive_rendering_ = false;
- return CallDefaultNCActivateHandler(TRUE);
- }
- return CallDefaultNCActivateHandler(active);
-}
-
-LRESULT WindowWin::OnNCCalcSize(BOOL mode, LPARAM l_param) {
- // We only need to adjust the client size/paint handling when we're not using
- // the native frame.
- if (non_client_view_->UseNativeFrame())
- return WidgetWin::OnNCCalcSize(mode, l_param);
-
- RECT* client_rect = mode ?
- &reinterpret_cast<NCCALCSIZE_PARAMS*>(l_param)->rgrc[0] :
- reinterpret_cast<RECT*>(l_param);
- if (IsMaximized()) {
- // Make the maximized mode client rect fit the screen exactly, by
- // subtracting the border Windows automatically adds for maximized mode.
- int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME);
- InflateRect(client_rect, -border_thickness, -border_thickness);
-
- // Find all auto-hide taskbars along the screen edges and adjust in by the
- // thickness of the auto-hide taskbar on each such edge, so the window isn't
- // treated as a "fullscreen app", which would cause the taskbars to
- // disappear.
- HMONITOR monitor = MonitorFromWindow(GetNativeView(),
- MONITOR_DEFAULTTONEAREST);
- if (win_util::EdgeHasAutoHideTaskbar(ABE_LEFT, monitor))
- client_rect->left += win_util::kAutoHideTaskbarThicknessPx;
- if (win_util::EdgeHasAutoHideTaskbar(ABE_TOP, monitor))
- client_rect->top += win_util::kAutoHideTaskbarThicknessPx;
- if (win_util::EdgeHasAutoHideTaskbar(ABE_RIGHT, monitor))
- client_rect->right -= win_util::kAutoHideTaskbarThicknessPx;
- if (win_util::EdgeHasAutoHideTaskbar(ABE_BOTTOM, monitor))
- client_rect->bottom -= win_util::kAutoHideTaskbarThicknessPx;
-
- // We cannot return WVR_REDRAW when there is nonclient area, or Windows
- // exhibits bugs where client pixels and child HWNDs are mispositioned by
- // the width/height of the upper-left nonclient area.
- return 0;
- }
-
- // If the window bounds change, we're going to relayout and repaint anyway.
- // Returning WVR_REDRAW avoids an extra paint before that of the old client
- // pixels in the (now wrong) location, and thus makes actions like resizing a
- // window from the left edge look slightly less broken.
- return mode ? WVR_REDRAW : 0;
-}
-
-LRESULT WindowWin::OnNCHitTest(const CPoint& point) {
- // First, give the NonClientView a chance to test the point to see if it
- // provides any of the non-client area.
- CPoint temp = point;
- MapWindowPoints(HWND_DESKTOP, GetNativeView(), &temp, 1);
- int component = non_client_view_->NonClientHitTest(gfx::Point(temp));
- if (component != HTNOWHERE)
- return component;
-
- // Otherwise, we let Windows do all the native frame non-client handling for
- // us.
- return WidgetWin::OnNCHitTest(point);
-}
-
-namespace {
-struct ClipState {
- // The window being painted.
- HWND parent;
-
- // DC painting to.
- HDC dc;
-
- // Origin of the window in terms of the screen.
- int x;
- int y;
-};
-
-// See comments in OnNCPaint for details of this function.
-static BOOL CALLBACK ClipDCToChild(HWND window, LPARAM param) {
- ClipState* clip_state = reinterpret_cast<ClipState*>(param);
- if (GetParent(window) == clip_state->parent && IsWindowVisible(window)) {
- RECT bounds;
- GetWindowRect(window, &bounds);
- ExcludeClipRect(clip_state->dc,
- bounds.left - clip_state->x,
- bounds.top - clip_state->y,
- bounds.right - clip_state->x,
- bounds.bottom - clip_state->y);
- }
- return TRUE;
-}
-} // namespace
-
-void WindowWin::OnNCPaint(HRGN rgn) {
- // We only do non-client painting if we're not using the native frame.
- if (non_client_view_->UseNativeFrame()) {
- WidgetWin::OnNCPaint(rgn);
- return;
- }
-
- // We have an NC region and need to paint it. We expand the NC region to
- // include the dirty region of the root view. This is done to minimize
- // paints.
- CRect window_rect;
- GetWindowRect(&window_rect);
-
- if (window_rect.Width() != root_view_->width() ||
- window_rect.Height() != root_view_->height()) {
- // If the size of the window differs from the size of the root view it
- // means we're being asked to paint before we've gotten a WM_SIZE. This can
- // happen when the user is interactively resizing the window. To avoid
- // mass flickering we don't do anything here. Once we get the WM_SIZE we'll
- // reset the region of the window which triggers another WM_NCPAINT and
- // all is well.
- return;
- }
-
- CRect dirty_region;
- // A value of 1 indicates paint all.
- if (!rgn || rgn == reinterpret_cast<HRGN>(1)) {
- dirty_region = CRect(0, 0, window_rect.Width(), window_rect.Height());
- } else {
- RECT rgn_bounding_box;
- GetRgnBox(rgn, &rgn_bounding_box);
- if (!IntersectRect(&dirty_region, &rgn_bounding_box, &window_rect))
- return; // Dirty region doesn't intersect window bounds, bale.
-
- // rgn_bounding_box is in screen coordinates. Map it to window coordinates.
- OffsetRect(&dirty_region, -window_rect.left, -window_rect.top);
- }
-
- // In theory GetDCEx should do what we want, but I couldn't get it to work.
- // In particular the docs mentiond DCX_CLIPCHILDREN, but as far as I can tell
- // it doesn't work at all. So, instead we get the DC for the window then
- // manually clip out the children.
- HDC dc = GetWindowDC(GetNativeView());
- ClipState clip_state;
- clip_state.x = window_rect.left;
- clip_state.y = window_rect.top;
- clip_state.parent = GetNativeView();
- clip_state.dc = dc;
- EnumChildWindows(GetNativeView(), &ClipDCToChild,
- reinterpret_cast<LPARAM>(&clip_state));
-
- RootView* root_view = GetRootView();
- CRect old_paint_region = root_view->GetScheduledPaintRectConstrainedToSize();
-
- if (!old_paint_region.IsRectEmpty()) {
- // The root view has a region that needs to be painted. Include it in the
- // region we're going to paint.
-
- CRect tmp = dirty_region;
- UnionRect(&dirty_region, &tmp, &old_paint_region);
- }
-
- root_view->SchedulePaint(gfx::Rect(dirty_region), false);
-
- // ChromeCanvasPaints destructor does the actual painting. As such, wrap the
- // following in a block to force paint to occur so that we can release the dc.
- {
- ChromeCanvasPaint canvas(dc, opaque(), dirty_region.left, dirty_region.top,
- dirty_region.Width(), dirty_region.Height());
-
- root_view->ProcessPaint(&canvas);
- }
-
- ReleaseDC(GetNativeView(), dc);
-}
-
-void WindowWin::OnNCLButtonDown(UINT ht_component, const CPoint& point) {
- // When we're using a native frame, window controls work without us
- // interfering.
- if (!non_client_view_->UseNativeFrame()) {
- switch (ht_component) {
- case HTCLOSE:
- case HTMINBUTTON:
- case HTMAXBUTTON: {
- // When the mouse is pressed down in these specific non-client areas,
- // we need to tell the RootView to send the mouse pressed event (which
- // sets capture, allowing subsequent WM_LBUTTONUP (note, _not_
- // WM_NCLBUTTONUP) to fire so that the appropriate WM_SYSCOMMAND can be
- // sent by the applicable button's ButtonListener. We _have_ to do this
- // way rather than letting Windows just send the syscommand itself (as
- // would happen if we never did this dance) because for some insane
- // reason DefWindowProc for WM_NCLBUTTONDOWN also renders the pressed
- // window control button appearance, in the Windows classic style, over
- // our view! Ick! By handling this message we prevent Windows from
- // doing this undesirable thing, but that means we need to roll the
- // sys-command handling ourselves.
- ProcessNCMousePress(point, MK_LBUTTON);
- return;
- }
- }
- }
-
- // TODO(beng): figure out why we need to run the system menu manually
- // ourselves. This is wrong and causes many subtle bugs.
- // From my initial research, it looks like DefWindowProc tries
- // to run it but fails before sending the initial WM_MENUSELECT
- // for the sysmenu.
- if (ht_component == HTSYSMENU)
- RunSystemMenu(non_client_view_->GetSystemMenuPoint());
- else
- WidgetWin::OnNCLButtonDown(ht_component, point);
-
- /* TODO(beng): Fix the standard non-client over-painting bug. This code
- doesn't work but identifies the problem.
- if (!IsMsgHandled()) {
- // WindowWin::OnNCLButtonDown set the message as unhandled. This normally
- // means WidgetWin::ProcessWindowMessage will pass it to
- // DefWindowProc. Sadly, DefWindowProc for WM_NCLBUTTONDOWN does weird
- // non-client painting, so we need to call it directly here inside a
- // scoped update lock.
- ScopedRedrawLock lock(this);
- DefWindowProc(GetNativeView(), WM_NCLBUTTONDOWN, ht_component,
- MAKELPARAM(point.x, point.y));
- SetMsgHandled(TRUE);
- }
- */
-}
-
-void WindowWin::OnNCRButtonDown(UINT ht_component, const CPoint& point) {
- if (ht_component == HTCAPTION || ht_component == HTSYSMENU)
- RunSystemMenu(gfx::Point(point));
- else
- WidgetWin::OnNCRButtonDown(ht_component, point);
-}
-
-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(!non_client_view_->UseNativeFrame());
- return 0;
-}
-
-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(!non_client_view_->UseNativeFrame());
- return 0;
-}
-
-LRESULT WindowWin::OnSetCursor(HWND window, UINT hittest_code, UINT message) {
- // If the window is disabled, it's because we're showing a modal dialog box.
- // We need to let DefWindowProc handle the message. That's because
- // DefWindowProc for WM_SETCURSOR with message = some kind of mouse button
- // down message sends the top level window a WM_ACTIVATEAPP message, which we
- // otherwise wouldn't get. The symptom of not doing this is that if the user
- // has a window in the background with a modal dialog open, they can't click
- // on the disabled background window to bring the entire stack to the front.
- // This is annoying because they then have to move all the foreground windows
- // out of the way to be able to activate said window. I love how on Windows,
- // the answer isn't always logical.
- if (!IsWindowEnabled(GetNativeView()))
- return WidgetWin::OnSetCursor(window, hittest_code, message);
-
- int index = RC_NORMAL;
- switch (hittest_code) {
- case HTTOP:
- case HTBOTTOM:
- index = RC_VERTICAL;
- break;
- case HTTOPLEFT:
- case HTBOTTOMRIGHT:
- index = RC_NWSE;
- break;
- case HTTOPRIGHT:
- case HTBOTTOMLEFT:
- index = RC_NESW;
- break;
- case HTLEFT:
- case HTRIGHT:
- index = RC_HORIZONTAL;
- break;
- case HTCAPTION:
- case HTCLIENT:
- index = RC_NORMAL;
- break;
- }
- SetCursor(resize_cursors_[index]);
- return 0;
-}
-
-LRESULT WindowWin::OnSetIcon(UINT size_type, HICON new_icon) {
- // This shouldn't hurt even if we're using the native frame.
- ScopedRedrawLock lock(this);
- return DefWindowProc(GetNativeView(), WM_SETICON, size_type,
- reinterpret_cast<LPARAM>(new_icon));
-}
-
-LRESULT WindowWin::OnSetText(const wchar_t* text) {
- // This shouldn't hurt even if we're using the native frame.
- ScopedRedrawLock lock(this);
- return DefWindowProc(GetNativeView(), WM_SETTEXT, NULL,
- reinterpret_cast<LPARAM>(text));
-}
-
-void WindowWin::OnSize(UINT size_param, const CSize& new_size) {
- // Don't no-op if the new_size matches current size. If our normal bounds
- // and maximized bounds are the same, then we need to layout (because we
- // layout differently when maximized).
- SaveWindowPosition();
- ChangeSize(size_param, new_size);
- RedrawWindow(GetNativeView(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
-
- // ResetWindowRegion is going to trigger WM_NCPAINT. By doing it after we've
- // invoked OnSize we ensure the RootView has been laid out.
- ResetWindowRegion(false);
-}
-
-void WindowWin::OnSysCommand(UINT notification_code, CPoint click) {
- if (!non_client_view_->UseNativeFrame()) {
- // Windows uses the 4 lower order bits of |notification_code| for type-
- // specific information so we must exclude this when comparing.
- static const int sc_mask = 0xFFF0;
- if ((notification_code & sc_mask) == SC_MINIMIZE ||
- (notification_code & sc_mask) == SC_MAXIMIZE ||
- (notification_code & sc_mask) == SC_RESTORE) {
- non_client_view_->ResetWindowControls();
- } else if ((notification_code & sc_mask) == SC_MOVE ||
- (notification_code & sc_mask) == SC_SIZE) {
- if (lock_updates_) {
- // We were locked, before entering a resize or move modal loop. Now that
- // we've begun to move the window, we need to unlock updates so that the
- // sizing/moving feedback can be continuous.
- UnlockUpdates();
- }
- }
- }
-
- // First see if the delegate can handle it.
- if (window_delegate_->ExecuteWindowsCommand(notification_code))
- return;
-
- if (notification_code == IDC_ALWAYS_ON_TOP) {
- is_always_on_top_ = !is_always_on_top_;
-
- // Change the menu check state.
- HMENU system_menu = GetSystemMenu(GetNativeView(), FALSE);
- MENUITEMINFO menu_info;
- memset(&menu_info, 0, sizeof(MENUITEMINFO));
- menu_info.cbSize = sizeof(MENUITEMINFO);
- BOOL r = GetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP,
- FALSE, &menu_info);
- DCHECK(r);
- menu_info.fMask = MIIM_STATE;
- if (is_always_on_top_)
- menu_info.fState = MFS_CHECKED;
- r = SetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP, FALSE, &menu_info);
-
- // Now change the actual window's behavior.
- AlwaysOnTopChanged();
- } else if ((notification_code == SC_KEYMENU) && (click.x == VK_SPACE)) {
- // Run the system menu at the NonClientView's desired location.
- RunSystemMenu(non_client_view_->GetSystemMenuPoint());
- } else {
- // Use the default implementation for any other command.
- DefWindowProc(GetNativeView(), WM_SYSCOMMAND, notification_code,
- MAKELPARAM(click.y, click.x));
- }
-}
-
-void WindowWin::OnWindowPosChanging(WINDOWPOS* window_pos) {
- if (force_hidden_) {
- // Prevent the window from being made visible if we've been asked to do so.
- // See comment in header as to why we might want this.
- window_pos->flags &= ~SWP_SHOWWINDOW;
- }
- WidgetWin::OnWindowPosChanging(window_pos);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WindowWin, private:
-
-void WindowWin::BecomeModal() {
- // We implement modality by crawling up the hierarchy of windows starting
- // at the owner, disabling all of them so that they don't receive input
- // messages.
- DCHECK(owning_hwnd_) << "Can't create a modal dialog without an owner";
- HWND start = owning_hwnd_;
- while (start != NULL) {
- ::EnableWindow(start, FALSE);
- start = ::GetParent(start);
- }
-}
-
-void WindowWin::SetInitialFocus() {
- if (!focus_on_creation_)
- return;
-
- View* v = window_delegate_->GetInitiallyFocusedView();
- if (v) {
- v->RequestFocus();
- } else {
- // The window does not get keyboard messages unless we focus it, not sure
- // why.
- SetFocus(GetNativeView());
- }
-}
-
-void WindowWin::SetInitialBounds(const gfx::Rect& create_bounds) {
- // First we obtain the window's saved show-style and store it. We need to do
- // this here, rather than in Show() because by the time Show() is called,
- // the window's size will have been reset (below) and the saved maximized
- // state will have been lost. Sadly there's no way to tell on Windows when
- // a window is restored from maximized state, so we can't more accurately
- // track maximized state independently of sizing information.
- window_delegate_->GetSavedMaximizedState(&saved_maximized_state_);
-
- // Restore the window's placement from the controller.
- gfx::Rect saved_bounds(create_bounds.ToRECT());
- if (window_delegate_->GetSavedWindowBounds(&saved_bounds)) {
- // Make sure the bounds are at least the minimum size.
- if (saved_bounds.width() < minimum_size_.cx) {
- saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(),
- saved_bounds.right() + minimum_size_.cx -
- saved_bounds.width(),
- saved_bounds.bottom());
- }
-
- if (saved_bounds.height() < minimum_size_.cy) {
- saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(),
- saved_bounds.right(),
- saved_bounds.bottom() + minimum_size_.cy -
- saved_bounds.height());
- }
-
- // "Show state" (maximized, minimized, etc) is handled by Show().
- // Don't use SetBounds here. SetBounds constrains to the size of the
- // monitor, but we don't want that when creating a new window as the result
- // of dragging out a tab to create a new window.
- SetWindowPos(NULL, saved_bounds.x(), saved_bounds.y(),
- saved_bounds.width(), saved_bounds.height(), 0);
- } else {
- if (create_bounds.IsEmpty()) {
- // No initial bounds supplied, so size the window to its content and
- // center over its parent.
- SizeWindowToDefault();
- } else {
- // Use the supplied initial bounds.
- SetBounds(create_bounds);
- }
- }
-}
-
-void WindowWin::InitAlwaysOnTopState() {
- is_always_on_top_ = false;
- if (window_delegate_->GetSavedAlwaysOnTopState(&is_always_on_top_) &&
- is_always_on_top_ != window_delegate_->IsAlwaysOnTop()) {
- AlwaysOnTopChanged();
- }
-
- if (window_delegate_->HasAlwaysOnTopMenu())
- AddAlwaysOnTopSystemMenuItem();
-}
-
-void WindowWin::AddAlwaysOnTopSystemMenuItem() {
- // The Win32 API requires that we own the text.
- always_on_top_menu_text_ = l10n_util::GetString(IDS_ALWAYS_ON_TOP);
-
- // Let's insert a menu to the window.
- HMENU system_menu = ::GetSystemMenu(GetNativeView(), FALSE);
- int index = ::GetMenuItemCount(system_menu) - 1;
- if (index < 0) {
- // Paranoia check.
- NOTREACHED();
- index = 0;
- }
- // First we add the separator.
- MENUITEMINFO menu_info;
- memset(&menu_info, 0, sizeof(MENUITEMINFO));
- menu_info.cbSize = sizeof(MENUITEMINFO);
- menu_info.fMask = MIIM_FTYPE;
- menu_info.fType = MFT_SEPARATOR;
- ::InsertMenuItem(system_menu, index, TRUE, &menu_info);
-
- // Then the actual menu.
- menu_info.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING | MIIM_STATE;
- menu_info.fType = MFT_STRING;
- menu_info.fState = MFS_ENABLED;
- if (is_always_on_top_)
- menu_info.fState |= MFS_CHECKED;
- menu_info.wID = IDC_ALWAYS_ON_TOP;
- menu_info.dwTypeData = const_cast<wchar_t*>(always_on_top_menu_text_.c_str());
- ::InsertMenuItem(system_menu, index, TRUE, &menu_info);
-}
-
-void WindowWin::RestoreEnabledIfNecessary() {
- if (is_modal_ && !restored_enabled_) {
- restored_enabled_ = true;
- // If we were run modally, we need to undo the disabled-ness we inflicted on
- // the owner's parent hierarchy.
- HWND start = owning_hwnd_;
- while (start != NULL) {
- ::EnableWindow(start, TRUE);
- start = ::GetParent(start);
- }
- }
-}
-
-void WindowWin::AlwaysOnTopChanged() {
- ::SetWindowPos(GetNativeView(),
- is_always_on_top_ ? HWND_TOPMOST : HWND_NOTOPMOST,
- 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
-}
-
-DWORD WindowWin::CalculateWindowStyle() {
- DWORD window_styles =
- WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_SYSMENU | WS_CAPTION;
- bool can_resize = window_delegate_->CanResize();
- bool can_maximize = window_delegate_->CanMaximize();
- if (can_maximize) {
- window_styles |= WS_OVERLAPPEDWINDOW;
- } else if (can_resize) {
- window_styles |= WS_OVERLAPPED | WS_THICKFRAME;
- }
- if (window_delegate_->AsDialogDelegate()) {
- window_styles |= DS_MODALFRAME;
- // NOTE: Turning this off means we lose the close button, which is bad.
- // Turning it on though means the user can maximize or size the window
- // from the system menu, which is worse. We may need to provide our own
- // menu to get the close button to appear properly.
- // window_styles &= ~WS_SYSMENU;
- }
- return window_styles;
-}
-
-DWORD WindowWin::CalculateWindowExStyle() {
- DWORD window_ex_styles = 0;
- if (window_delegate_->AsDialogDelegate())
- window_ex_styles |= WS_EX_DLGMODALFRAME;
- if (window_delegate_->IsAlwaysOnTop())
- window_ex_styles |= WS_EX_TOPMOST;
- return window_ex_styles;
-}
-
-void WindowWin::SaveWindowPosition() {
- // The window delegate does the actual saving for us. It seems like (judging
- // by go/crash) that in some circumstances we can end up here after
- // WM_DESTROY, at which point the window delegate is likely gone. So just
- // bail.
- if (!window_delegate_)
- return;
-
- WINDOWPLACEMENT win_placement = { 0 };
- win_placement.length = sizeof(WINDOWPLACEMENT);
-
- BOOL r = GetWindowPlacement(GetNativeView(), &win_placement);
- DCHECK(r);
-
- bool maximized = (win_placement.showCmd == SW_SHOWMAXIMIZED);
- CRect window_bounds(win_placement.rcNormalPosition);
- window_delegate_->SaveWindowPlacement(
- gfx::Rect(win_placement.rcNormalPosition), maximized, is_always_on_top_);
-}
-
-void WindowWin::LockUpdates() {
- lock_updates_ = true;
- saved_window_style_ = GetWindowLong(GetNativeView(), GWL_STYLE);
- SetWindowLong(GetNativeView(), GWL_STYLE, saved_window_style_ & ~WS_VISIBLE);
-}
-
-void WindowWin::UnlockUpdates() {
- SetWindowLong(GetNativeView(), GWL_STYLE, saved_window_style_);
- lock_updates_ = false;
-}
-
-void WindowWin::ResetWindowRegion(bool force) {
- // A native frame uses the native window region, and we don't want to mess
- // with it.
- if (non_client_view_->UseNativeFrame()) {
- if (force)
- SetWindowRgn(NULL, TRUE);
- return;
- }
-
- // Changing the window region is going to force a paint. Only change the
- // window region if the region really differs.
- HRGN current_rgn = CreateRectRgn(0, 0, 0, 0);
- int current_rgn_result = GetWindowRgn(GetNativeView(), current_rgn);
-
- CRect window_rect;
- GetWindowRect(&window_rect);
- HRGN new_region;
- gfx::Path window_mask;
- non_client_view_->GetWindowMask(
- gfx::Size(window_rect.Width(), window_rect.Height()), &window_mask);
- new_region = window_mask.CreateHRGN();
-
- if (current_rgn_result == ERROR || !EqualRgn(current_rgn, new_region)) {
- // SetWindowRgn takes ownership of the HRGN created by CreateHRGN.
- SetWindowRgn(new_region, TRUE);
- } else {
- DeleteObject(new_region);
- }
-
- DeleteObject(current_rgn);
-}
-
-void WindowWin::ProcessNCMousePress(const CPoint& point, int flags) {
- CPoint temp = point;
- MapWindowPoints(HWND_DESKTOP, GetNativeView(), &temp, 1);
- UINT message_flags = 0;
- if ((GetKeyState(VK_CONTROL) & 0x80) == 0x80)
- message_flags |= MK_CONTROL;
- if ((GetKeyState(VK_SHIFT) & 0x80) == 0x80)
- message_flags |= MK_SHIFT;
- message_flags |= flags;
- ProcessMousePressed(temp, message_flags, false);
-}
-
-LRESULT WindowWin::CallDefaultNCActivateHandler(BOOL active) {
- // The DefWindowProc handling for WM_NCACTIVATE renders the classic-look
- // window title bar directly, so we need to use a redraw lock here to prevent
- // it from doing so.
- ScopedRedrawLock lock(this);
- return DefWindowProc(GetNativeView(), WM_NCACTIVATE, active, 0);
-}
-
-void WindowWin::InitClass() {
- static bool initialized = false;
- if (!initialized) {
- resize_cursors_[RC_NORMAL] = LoadCursor(NULL, IDC_ARROW);
- resize_cursors_[RC_VERTICAL] = LoadCursor(NULL, IDC_SIZENS);
- resize_cursors_[RC_HORIZONTAL] = LoadCursor(NULL, IDC_SIZEWE);
- resize_cursors_[RC_NESW] = LoadCursor(NULL, IDC_SIZENESW);
- resize_cursors_[RC_NWSE] = LoadCursor(NULL, IDC_SIZENWSE);
- initialized = true;
- }
-}
-
-} // namespace views
diff --git a/chrome/views/window_win.h b/chrome/views/window_win.h
deleted file mode 100644
index bd6f5ac..0000000
--- a/chrome/views/window_win.h
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_VIEWS_WINDOW_WIN_H__
-#define CHROME_VIEWS_WINDOW_WIN_H__
-
-#include "chrome/common/notification_registrar.h"
-#include "chrome/views/client_view.h"
-#include "chrome/views/non_client_view.h"
-#include "chrome/views/widget_win.h"
-#include "chrome/views/window.h"
-
-namespace gfx {
-class Point;
-class Size;
-};
-
-namespace views {
-
-class Client;
-class WindowDelegate;
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// WindowWin
-//
-// A WindowWin is a WidgetWin that has a caption and a border. The frame is
-// rendered by the operating system.
-//
-///////////////////////////////////////////////////////////////////////////////
-class WindowWin : public WidgetWin,
- public Window,
- public NotificationObserver {
- public:
- virtual ~WindowWin();
-
- // Show the window with the specified show command.
- void Show(int show_state);
-
- // Retrieve the show state of the window. This is one of the SW_SHOW* flags
- // passed into Windows' ShowWindow method. For normal windows this defaults
- // to SW_SHOWNORMAL, however windows (e.g. the main window) can override this
- // method to provide different values (e.g. retrieve the user's specified
- // show state from the shortcut starutp info).
- virtual int GetShowState() const;
-
- // Executes the specified SC_command.
- void ExecuteSystemMenuCommand(int command);
-
- // Accessors and setters for various properties.
- HWND owning_window() const { return owning_hwnd_; }
- void set_focus_on_creation(bool focus_on_creation) {
- focus_on_creation_ = focus_on_creation;
- }
- void set_force_hidden(bool force_hidden) { force_hidden_ = force_hidden; }
-
- // Window overrides:
- virtual gfx::Rect GetBounds() const;
- virtual void SetBounds(const gfx::Rect& bounds);
- virtual void SetBounds(const gfx::Rect& bounds,
- gfx::NativeWindow other_window);
- virtual void Show();
- virtual void Activate();
- virtual void Close();
- virtual void Maximize();
- virtual void Minimize();
- virtual void Restore();
- virtual bool IsActive() const;
- virtual bool IsVisible() const;
- virtual bool IsMaximized() const;
- virtual bool IsMinimized() const;
- virtual void EnableClose(bool enable);
- virtual void DisableInactiveRendering();
- virtual void UpdateWindowTitle();
- virtual void UpdateWindowIcon();
- virtual NonClientFrameView* CreateFrameViewForWindow();
- virtual void UpdateFrameAfterFrameChange();
- virtual WindowDelegate* GetDelegate() const;
- virtual NonClientView* GetNonClientView() const;
- virtual ClientView* GetClientView() const;
- virtual gfx::NativeWindow GetNativeWindow() const;
-
- // NotificationObserver overrides:
- virtual void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details);
-
- protected:
- friend Window;
-
- // Constructs the WindowWin. |window_delegate| cannot be NULL.
- explicit WindowWin(WindowDelegate* window_delegate);
-
- // Create the Window.
- // If parent is NULL, this WindowWin is top level on the desktop.
- // If |bounds| is empty, the view is queried for its preferred size and
- // centered on screen.
- virtual void Init(HWND parent, const gfx::Rect& bounds);
-
- // Sizes the window to the default size specified by its ClientView.
- virtual void SizeWindowToDefault();
-
- // Returns true if the WindowWin is considered to be an "app window" - i.e.
- // any window which when it is the last of its type closed causes the
- // application to exit.
- virtual bool IsAppWindow() const { return false; }
-
- // Shows the system menu at the specified screen point.
- void RunSystemMenu(const gfx::Point& point);
-
- // Overridden from WidgetWin:
- virtual void OnActivate(UINT action, BOOL minimized, HWND window);
- virtual void OnActivateApp(BOOL active, DWORD thread_id);
- virtual LRESULT OnAppCommand(HWND window, short app_command, WORD device,
- int keystate);
- virtual void OnCommand(UINT notification_code, int command_id, HWND window);
- virtual void OnDestroy();
- virtual LRESULT OnDwmCompositionChanged(UINT msg, WPARAM w_param,
- LPARAM l_param);
- virtual void OnFinalMessage(HWND window);
- virtual void OnInitMenu(HMENU menu);
- virtual void OnMouseLeave();
- virtual LRESULT OnNCActivate(BOOL active);
- virtual LRESULT OnNCCalcSize(BOOL mode, LPARAM l_param);
- virtual LRESULT OnNCHitTest(const CPoint& point);
- virtual void OnNCPaint(HRGN rgn);
- virtual void OnNCLButtonDown(UINT ht_component, const CPoint& point);
- virtual void OnNCRButtonDown(UINT ht_component, const CPoint& point);
- virtual LRESULT OnNCUAHDrawCaption(UINT msg, WPARAM w_param, LPARAM l_param);
- virtual LRESULT OnNCUAHDrawFrame(UINT msg, WPARAM w_param, LPARAM l_param);
- virtual LRESULT OnSetCursor(HWND window, UINT hittest_code, UINT message);
- virtual LRESULT OnSetIcon(UINT size_type, HICON new_icon);
- virtual LRESULT OnSetText(const wchar_t* text);
- virtual void OnSize(UINT size_param, const CSize& new_size);
- virtual void OnSysCommand(UINT notification_code, CPoint click);
- virtual void OnWindowPosChanging(WINDOWPOS* window_pos);
- virtual Window* AsWindow() { return this; }
- virtual const Window* AsWindow() const { return this; }
-
- // Accessor for disable_inactive_rendering_.
- bool disable_inactive_rendering() const {
- return disable_inactive_rendering_;
- }
-
- private:
- // Set the window as modal (by disabling all the other windows).
- void BecomeModal();
-
- // Sets-up the focus manager with the view that should have focus when the
- // window is shown the first time. If NULL is returned, the focus goes to the
- // button if there is one, otherwise the to the Cancel button.
- void SetInitialFocus();
-
- // Place and size the window when it is created. |create_bounds| are the
- // bounds used when the window was created.
- void SetInitialBounds(const gfx::Rect& create_bounds);
-
- // Restore saved always on stop state and add the always on top system menu
- // if needed.
- void InitAlwaysOnTopState();
-
- // Add an item for "Always on Top" to the System Menu.
- void AddAlwaysOnTopSystemMenuItem();
-
- // If necessary, enables all ancestors.
- void RestoreEnabledIfNecessary();
-
- // Update the window style to reflect the always on top state.
- void AlwaysOnTopChanged();
-
- // Calculate the appropriate window styles for this window.
- DWORD CalculateWindowStyle();
- DWORD CalculateWindowExStyle();
-
- // Asks the delegate if any to save the window's location and size.
- void SaveWindowPosition();
-
- // Lock or unlock the window from being able to redraw itself in response to
- // updates to its invalid region.
- class ScopedRedrawLock;
- void LockUpdates();
- void UnlockUpdates();
-
- // Resets the window region for the current window bounds if necessary.
- // If |force| is true, the window region is reset to NULL even for native
- // frame windows.
- void ResetWindowRegion(bool force);
-
- // Converts a non-client mouse down message to a regular ChromeViews event
- // and handle it. |point| is the mouse position of the message in screen
- // coords. |flags| are flags that would be passed with a WM_L/M/RBUTTON*
- // message and relate to things like which button was pressed. These are
- // combined with flags relating to the current key state.
- void ProcessNCMousePress(const CPoint& point, int flags);
-
- // Calls the default WM_NCACTIVATE handler with the specified activation
- // value, safely wrapping the call in a ScopedRedrawLock to prevent frame
- // flicker.
- LRESULT CallDefaultNCActivateHandler(BOOL active);
-
- // Static resource initialization.
- static void InitClass();
- enum ResizeCursor {
- RC_NORMAL = 0, RC_VERTICAL, RC_HORIZONTAL, RC_NESW, RC_NWSE
- };
- static HCURSOR resize_cursors_[6];
-
- // Our window delegate (see Init method for documentation).
- WindowDelegate* window_delegate_;
-
- // The View that provides the non-client area of the window (title bar,
- // window controls, sizing borders etc). To use an implementation other than
- // the default, this class must be subclassed and this value set to the
- // desired implementation before calling |Init|.
- NonClientView* non_client_view_;
-
- // Whether we should SetFocus() on a newly created window after
- // Init(). Defaults to true.
- bool focus_on_creation_;
-
- // We need to save the parent window that spawned us, since GetParent()
- // returns NULL for dialogs.
- HWND owning_hwnd_;
-
- // The smallest size the window can be.
- CSize minimum_size_;
-
- // Whether or not the window is modal. This comes from the delegate and is
- // cached at Init time to avoid calling back to the delegate from the
- // destructor.
- bool is_modal_;
-
- // Whether all ancestors have been enabled. This is only used if is_modal_ is
- // true.
- bool restored_enabled_;
-
- // Whether the window is currently always on top.
- bool is_always_on_top_;
-
- // We need to own the text of the menu, the Windows API does not copy it.
- std::wstring always_on_top_menu_text_;
-
- // Set to true if the window is in the process of closing .
- bool window_closed_;
-
- // True when the window should be rendered as active, regardless of whether
- // or not it actually is.
- bool disable_inactive_rendering_;
-
- // True if this window is the active top level window.
- bool is_active_;
-
- // True if updates to this window are currently locked.
- bool lock_updates_;
-
- // The window styles of the window before updates were locked.
- DWORD saved_window_style_;
-
- // The saved maximized state for this window. See note in SetInitialBounds
- // that explains why we save this.
- bool saved_maximized_state_;
-
- // True if we should prevent attempts to make the window visible when we
- // handle WM_WINDOWPOSCHANGING. Some calls like ShowWindow(SW_RESTORE) make
- // the window visible in addition to restoring it, when all we want to do is
- // restore it.
- bool force_hidden_;
-
- // Hold onto notifications.
- NotificationRegistrar notification_registrar_;
-
- DISALLOW_COPY_AND_ASSIGN(WindowWin);
-};
-
-} // namespace views
-
-#endif // CHROME_VIEWS_WINDOW_WIN_H__