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

Unified Diff: mash/simple_wm/simple_wm.cc

Issue 2587183002: Adds sizing, maximizing, minimizing to simple_wm (Closed)
Patch Set: . Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mash/simple_wm/simple_wm.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mash/simple_wm/simple_wm.cc
diff --git a/mash/simple_wm/simple_wm.cc b/mash/simple_wm/simple_wm.cc
index 851cd1f6f85f352aaa5ce62e99e554b2dda42e58..92c0f6b5dc684ff0eaa233cb4e33c62e75cd9581 100644
--- a/mash/simple_wm/simple_wm.cc
+++ b/mash/simple_wm/simple_wm.cc
@@ -27,6 +27,7 @@ namespace {
const int kNonClientTopHeight = 24;
const int kNonClientSize = 5;
+const int kNonClientMaximizedTopOverlap = 4;
} // namespace
@@ -133,6 +134,9 @@ class SimpleWM::WindowListView : public views::WidgetDelegateView,
}
void OnPaint(gfx::Canvas* canvas) override {
canvas->DrawColor(SK_ColorLTGRAY);
+ gfx::Rect stroke_bounds = GetLocalBounds();
+ stroke_bounds.set_height(1);
+ canvas->FillRect(stroke_bounds, SK_ColorDKGRAY);
}
gfx::Size GetPreferredSize() const override {
std::unique_ptr<views::MdTextButton> measure_button(
@@ -212,14 +216,36 @@ class SimpleWM::FrameView : public views::WidgetDelegateView,
// Client offsets are applied automatically by the window service.
gfx::Rect parent_bounds = GetWidget()->GetNativeWindow()->bounds();
parent_bounds.set_origin(gfx::Point());
+
+ if (GetWidget()->IsMaximized()) {
+ parent_bounds.Inset(-kNonClientSize, -kNonClientMaximizedTopOverlap,
+ -kNonClientSize, -kNonClientSize);
+ }
+
client_window_->SetBounds(parent_bounds);
}
+ bool CanMaximize() const override {
+ return (client_window_->GetProperty(aura::client::kResizeBehaviorKey) &
+ ui::mojom::kResizeBehaviorCanMaximize) != 0;
+ }
+
+ bool CanMinimize() const override {
+ return (client_window_->GetProperty(aura::client::kResizeBehaviorKey) &
+ ui::mojom::kResizeBehaviorCanMinimize) != 0;
+ }
+
+ bool CanResize() const override {
+ return (client_window_->GetProperty(aura::client::kResizeBehaviorKey) &
+ ui::mojom::kResizeBehaviorCanResize) != 0;
+ }
// aura::WindowObserver:
void OnWindowPropertyChanged(aura::Window* window, const void* key,
intptr_t old) override {
if (key == aura::client::kTitleKey)
GetWidget()->UpdateWindowTitle();
+ else if (key == aura::client::kResizeBehaviorKey)
+ GetWidget()->non_client_view()->frame_view()->Layout();
}
aura::Window* client_window_;
@@ -228,6 +254,49 @@ class SimpleWM::FrameView : public views::WidgetDelegateView,
DISALLOW_COPY_AND_ASSIGN(FrameView);
};
+class SimpleWM::WorkspaceLayoutManager : public aura::WindowObserver {
+ public:
+ explicit WorkspaceLayoutManager(aura::Window* window_root)
+ : window_root_(window_root) {}
+ ~WorkspaceLayoutManager() override {}
+
+ private:
+ // aura::WindowObserver:
+ void OnWindowPropertyChanged(aura::Window* window, const void* key,
+ intptr_t old) override {
+ if (key == aura::client::kShowStateKey) {
+ ui::WindowShowState show_state =
+ window->GetProperty(aura::client::kShowStateKey);
+ switch (show_state) {
+ case ui::SHOW_STATE_NORMAL:
+ window->Show();
+ window->SetBounds(
+ *window->GetProperty(aura::client::kRestoreBoundsKey));
+ break;
+ case ui::SHOW_STATE_MINIMIZED:
+ window->Hide();
+ break;
+ case ui::SHOW_STATE_MAXIMIZED:
+ window->Show();
+ window->SetProperty(aura::client::kRestoreBoundsKey,
+ new gfx::Rect(window->bounds()));
+ window->SetBounds(gfx::Rect(window_root_->bounds().size()));
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ }
+ }
+ void OnWindowDestroying(aura::Window* window) override {
+ window->RemoveObserver(this);
+ }
+
+ aura::Window* window_root_;
+
+ DISALLOW_COPY_AND_ASSIGN(WorkspaceLayoutManager);
+};
+
class SimpleWM::DisplayLayoutManager : public aura::LayoutManager {
public:
DisplayLayoutManager(aura::Window* display_root,
@@ -381,6 +450,7 @@ aura::Window* SimpleWM::OnWmCreateTopLevelWindow(
frame_view->Init();
frame_widget->GetNativeWindow()->AddChild(client_window);
+ frame_widget->GetNativeWindow()->AddObserver(workspace_layout_manager_.get());
client_window_to_frame_view_[client_window] = frame_view;
// TODO(beng): probably need to observe client_window from now on so we can
@@ -410,9 +480,12 @@ void SimpleWM::OnWmNewDisplay(
window_tree_host_->window()->Show();
display_root_ = window_tree_host_->window();
window_root_ = new aura::Window(nullptr);
- window_root_->Init(ui::LAYER_NOT_DRAWN);
+ window_root_->Init(ui::LAYER_SOLID_COLOR);
+ window_root_->layer()->SetColor(SK_ColorWHITE);
display_root_->AddChild(window_root_);
window_root_->Show();
+ workspace_layout_manager_ =
+ base::MakeUnique<WorkspaceLayoutManager>(window_root_);
window_list_model_ = base::MakeUnique<WindowListModel>(window_root_);
@@ -477,6 +550,7 @@ SimpleWM::FrameView* SimpleWM::GetFrameViewForClientWindow(
}
void SimpleWM::OnWindowListViewItemActivated(aura::Window* window) {
+ window->Show();
aura::client::ActivationClient* activation_client =
aura::client::GetActivationClient(window->GetRootWindow());
activation_client->ActivateWindow(window);
« no previous file with comments | « mash/simple_wm/simple_wm.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698