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

Side by Side Diff: mash/simple_wm/simple_wm.cc

Issue 2587183002: Adds sizing, maximizing, minimizing to simple_wm (Closed)
Patch Set: . Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mash/simple_wm/simple_wm.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mash/simple_wm/simple_wm.h" 5 #include "mash/simple_wm/simple_wm.h"
6 6
7 #include "base/observer_list.h" 7 #include "base/observer_list.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "mash/simple_wm/move_event_handler.h" 9 #include "mash/simple_wm/move_event_handler.h"
10 #include "ui/aura/client/aura_constants.h" 10 #include "ui/aura/client/aura_constants.h"
11 #include "ui/aura/layout_manager.h" 11 #include "ui/aura/layout_manager.h"
12 #include "ui/display/screen_base.h" 12 #include "ui/display/screen_base.h"
13 #include "ui/gfx/canvas.h" 13 #include "ui/gfx/canvas.h"
14 #include "ui/gfx/geometry/mojo/geometry.mojom.h" 14 #include "ui/gfx/geometry/mojo/geometry.mojom.h"
15 #include "ui/views/controls/button/md_text_button.h" 15 #include "ui/views/controls/button/md_text_button.h"
16 #include "ui/views/controls/label.h" 16 #include "ui/views/controls/label.h"
17 #include "ui/views/mus/aura_init.h" 17 #include "ui/views/mus/aura_init.h"
18 #include "ui/views/mus/mus_client.h" 18 #include "ui/views/mus/mus_client.h"
19 #include "ui/views/widget/native_widget_aura.h" 19 #include "ui/views/widget/native_widget_aura.h"
20 #include "ui/views/widget/widget.h" 20 #include "ui/views/widget/widget.h"
21 #include "ui/views/widget/widget_delegate.h" 21 #include "ui/views/widget/widget_delegate.h"
22 #include "ui/wm/core/default_activation_client.h" 22 #include "ui/wm/core/default_activation_client.h"
23 23
24 namespace simple_wm { 24 namespace simple_wm {
25 25
26 namespace { 26 namespace {
27 27
28 const int kNonClientTopHeight = 24; 28 const int kNonClientTopHeight = 24;
29 const int kNonClientSize = 5; 29 const int kNonClientSize = 5;
30 const int kNonClientMaximizedTopOverlap = 4;
30 31
31 } // namespace 32 } // namespace
32 33
33 class SimpleWM::WindowListModelObserver { 34 class SimpleWM::WindowListModelObserver {
34 public: 35 public:
35 virtual void OnWindowAddedOrRemoved() = 0; 36 virtual void OnWindowAddedOrRemoved() = 0;
36 virtual void OnWindowTitleChanged(size_t index, 37 virtual void OnWindowTitleChanged(size_t index,
37 const base::string16& title) = 0; 38 const base::string16& title) = 0;
38 }; 39 };
39 40
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 for (int i = 0; i < child_count(); ++i) { 127 for (int i = 0; i < child_count(); ++i) {
127 View* v = child_at(i); 128 View* v = child_at(i);
128 gfx::Size ps = v->GetPreferredSize(); 129 gfx::Size ps = v->GetPreferredSize();
129 gfx::Rect bounds(x_offset, kButtonSpacing, ps.width(), ps.height()); 130 gfx::Rect bounds(x_offset, kButtonSpacing, ps.width(), ps.height());
130 v->SetBoundsRect(bounds); 131 v->SetBoundsRect(bounds);
131 x_offset = bounds.right() + kButtonSpacing; 132 x_offset = bounds.right() + kButtonSpacing;
132 } 133 }
133 } 134 }
134 void OnPaint(gfx::Canvas* canvas) override { 135 void OnPaint(gfx::Canvas* canvas) override {
135 canvas->DrawColor(SK_ColorLTGRAY); 136 canvas->DrawColor(SK_ColorLTGRAY);
137 gfx::Rect stroke_bounds = GetLocalBounds();
138 stroke_bounds.set_height(1);
139 canvas->FillRect(stroke_bounds, SK_ColorDKGRAY);
136 } 140 }
137 gfx::Size GetPreferredSize() const override { 141 gfx::Size GetPreferredSize() const override {
138 std::unique_ptr<views::MdTextButton> measure_button( 142 std::unique_ptr<views::MdTextButton> measure_button(
139 views::MdTextButton::Create(nullptr, base::UTF8ToUTF16("Sample"))); 143 views::MdTextButton::Create(nullptr, base::UTF8ToUTF16("Sample")));
140 int height = 144 int height =
141 measure_button->GetPreferredSize().height() + 2 * kButtonSpacing; 145 measure_button->GetPreferredSize().height() + 2 * kButtonSpacing;
142 return gfx::Size(0, height); 146 return gfx::Size(0, height);
143 } 147 }
144 148
145 private: 149 private:
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 : base::UTF8ToUTF16("(Window)"); 209 : base::UTF8ToUTF16("(Window)");
206 // TODO(beng): quick hack to cause WindowObserver::OnWindowTitleChanged to 210 // TODO(beng): quick hack to cause WindowObserver::OnWindowTitleChanged to
207 // fire. 211 // fire.
208 GetWidget()->GetNativeWindow()->SetTitle(title); 212 GetWidget()->GetNativeWindow()->SetTitle(title);
209 return title; 213 return title;
210 } 214 }
211 void Layout() override { 215 void Layout() override {
212 // Client offsets are applied automatically by the window service. 216 // Client offsets are applied automatically by the window service.
213 gfx::Rect parent_bounds = GetWidget()->GetNativeWindow()->bounds(); 217 gfx::Rect parent_bounds = GetWidget()->GetNativeWindow()->bounds();
214 parent_bounds.set_origin(gfx::Point()); 218 parent_bounds.set_origin(gfx::Point());
219
220 if (GetWidget()->IsMaximized()) {
221 parent_bounds.Inset(-kNonClientSize, -kNonClientMaximizedTopOverlap,
222 -kNonClientSize, -kNonClientSize);
223 }
224
215 client_window_->SetBounds(parent_bounds); 225 client_window_->SetBounds(parent_bounds);
216 } 226 }
227 bool CanMaximize() const override {
228 return (client_window_->GetProperty(aura::client::kResizeBehaviorKey) &
229 ui::mojom::kResizeBehaviorCanMaximize) != 0;
230 }
231
232 bool CanMinimize() const override {
233 return (client_window_->GetProperty(aura::client::kResizeBehaviorKey) &
234 ui::mojom::kResizeBehaviorCanMinimize) != 0;
235 }
236
237 bool CanResize() const override {
238 return (client_window_->GetProperty(aura::client::kResizeBehaviorKey) &
239 ui::mojom::kResizeBehaviorCanResize) != 0;
240 }
217 241
218 // aura::WindowObserver: 242 // aura::WindowObserver:
219 void OnWindowPropertyChanged(aura::Window* window, const void* key, 243 void OnWindowPropertyChanged(aura::Window* window, const void* key,
220 intptr_t old) override { 244 intptr_t old) override {
221 if (key == aura::client::kTitleKey) 245 if (key == aura::client::kTitleKey)
222 GetWidget()->UpdateWindowTitle(); 246 GetWidget()->UpdateWindowTitle();
247 else if (key == aura::client::kResizeBehaviorKey)
248 GetWidget()->non_client_view()->frame_view()->Layout();
223 } 249 }
224 250
225 aura::Window* client_window_; 251 aura::Window* client_window_;
226 std::unique_ptr<MoveEventHandler> move_event_handler_; 252 std::unique_ptr<MoveEventHandler> move_event_handler_;
227 253
228 DISALLOW_COPY_AND_ASSIGN(FrameView); 254 DISALLOW_COPY_AND_ASSIGN(FrameView);
229 }; 255 };
230 256
257 class SimpleWM::WorkspaceLayoutManager : public aura::WindowObserver {
258 public:
259 explicit WorkspaceLayoutManager(aura::Window* window_root)
260 : window_root_(window_root) {}
261 ~WorkspaceLayoutManager() override {}
262
263 private:
264 // aura::WindowObserver:
265 void OnWindowPropertyChanged(aura::Window* window, const void* key,
266 intptr_t old) override {
267 if (key == aura::client::kShowStateKey) {
268 ui::WindowShowState show_state =
269 window->GetProperty(aura::client::kShowStateKey);
270 switch (show_state) {
271 case ui::SHOW_STATE_NORMAL:
272 window->Show();
273 window->SetBounds(
274 *window->GetProperty(aura::client::kRestoreBoundsKey));
275 break;
276 case ui::SHOW_STATE_MINIMIZED:
277 window->Hide();
278 break;
279 case ui::SHOW_STATE_MAXIMIZED:
280 window->Show();
281 window->SetProperty(aura::client::kRestoreBoundsKey,
282 new gfx::Rect(window->bounds()));
283 window->SetBounds(gfx::Rect(window_root_->bounds().size()));
284 break;
285 default:
286 NOTREACHED();
287 break;
288 }
289 }
290 }
291 void OnWindowDestroying(aura::Window* window) override {
292 window->RemoveObserver(this);
293 }
294
295 aura::Window* window_root_;
296
297 DISALLOW_COPY_AND_ASSIGN(WorkspaceLayoutManager);
298 };
299
231 class SimpleWM::DisplayLayoutManager : public aura::LayoutManager { 300 class SimpleWM::DisplayLayoutManager : public aura::LayoutManager {
232 public: 301 public:
233 DisplayLayoutManager(aura::Window* display_root, 302 DisplayLayoutManager(aura::Window* display_root,
234 aura::Window* window_root, 303 aura::Window* window_root,
235 SimpleWM::WindowListView* window_list_view) 304 SimpleWM::WindowListView* window_list_view)
236 : display_root_(display_root), 305 : display_root_(display_root),
237 window_root_(window_root), 306 window_root_(window_root),
238 window_list_view_(window_list_view) {} 307 window_list_view_(window_list_view) {}
239 ~DisplayLayoutManager() override {} 308 ~DisplayLayoutManager() override {}
240 309
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 FrameView* frame_view = new FrameView(client_window); 443 FrameView* frame_view = new FrameView(client_window);
375 params.delegate = frame_view; 444 params.delegate = frame_view;
376 params.native_widget = frame_native_widget; 445 params.native_widget = frame_native_widget;
377 params.parent = window_root_; 446 params.parent = window_root_;
378 params.bounds = gfx::Rect(10, 10, 500, 500); 447 params.bounds = gfx::Rect(10, 10, 500, 500);
379 frame_widget->Init(params); 448 frame_widget->Init(params);
380 frame_widget->Show(); 449 frame_widget->Show();
381 frame_view->Init(); 450 frame_view->Init();
382 451
383 frame_widget->GetNativeWindow()->AddChild(client_window); 452 frame_widget->GetNativeWindow()->AddChild(client_window);
453 frame_widget->GetNativeWindow()->AddObserver(workspace_layout_manager_.get());
384 454
385 client_window_to_frame_view_[client_window] = frame_view; 455 client_window_to_frame_view_[client_window] = frame_view;
386 // TODO(beng): probably need to observe client_window from now on so we can 456 // TODO(beng): probably need to observe client_window from now on so we can
387 // clean up this map. 457 // clean up this map.
388 458
389 return client_window; 459 return client_window;
390 } 460 }
391 461
392 void SimpleWM::OnWmClientJankinessChanged( 462 void SimpleWM::OnWmClientJankinessChanged(
393 const std::set<aura::Window*>& client_windows, 463 const std::set<aura::Window*>& client_windows,
394 bool janky) { 464 bool janky) {
395 // Don't care. 465 // Don't care.
396 } 466 }
397 467
398 void SimpleWM::OnWmWillCreateDisplay(const display::Display& display) { 468 void SimpleWM::OnWmWillCreateDisplay(const display::Display& display) {
399 screen_->display_list().AddDisplay(display, 469 screen_->display_list().AddDisplay(display,
400 display::DisplayList::Type::PRIMARY); 470 display::DisplayList::Type::PRIMARY);
401 } 471 }
402 472
403 void SimpleWM::OnWmNewDisplay( 473 void SimpleWM::OnWmNewDisplay(
404 std::unique_ptr<aura::WindowTreeHostMus> window_tree_host, 474 std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
405 const display::Display& display) { 475 const display::Display& display) {
406 // Only handles a single root. 476 // Only handles a single root.
407 DCHECK(!window_root_); 477 DCHECK(!window_root_);
408 window_tree_host_ = std::move(window_tree_host); 478 window_tree_host_ = std::move(window_tree_host);
409 window_tree_host_->InitHost(); 479 window_tree_host_->InitHost();
410 window_tree_host_->window()->Show(); 480 window_tree_host_->window()->Show();
411 display_root_ = window_tree_host_->window(); 481 display_root_ = window_tree_host_->window();
412 window_root_ = new aura::Window(nullptr); 482 window_root_ = new aura::Window(nullptr);
413 window_root_->Init(ui::LAYER_NOT_DRAWN); 483 window_root_->Init(ui::LAYER_SOLID_COLOR);
484 window_root_->layer()->SetColor(SK_ColorWHITE);
414 display_root_->AddChild(window_root_); 485 display_root_->AddChild(window_root_);
415 window_root_->Show(); 486 window_root_->Show();
487 workspace_layout_manager_ =
488 base::MakeUnique<WorkspaceLayoutManager>(window_root_);
416 489
417 window_list_model_ = base::MakeUnique<WindowListModel>(window_root_); 490 window_list_model_ = base::MakeUnique<WindowListModel>(window_root_);
418 491
419 views::Widget* window_list_widget = new views::Widget; 492 views::Widget* window_list_widget = new views::Widget;
420 views::NativeWidgetAura* window_list_widget_native_widget = 493 views::NativeWidgetAura* window_list_widget_native_widget =
421 new views::NativeWidgetAura(window_list_widget, true); 494 new views::NativeWidgetAura(window_list_widget, true);
422 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); 495 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
423 WindowListView* window_list_view = 496 WindowListView* window_list_view =
424 new WindowListView(window_list_model_.get(), 497 new WindowListView(window_list_model_.get(),
425 base::Bind(&SimpleWM::OnWindowListViewItemActivated, 498 base::Bind(&SimpleWM::OnWindowListViewItemActivated,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 const gfx::Insets& insets, 543 const gfx::Insets& insets,
471 const std::vector<gfx::Rect>& additional_client_areas) {} 544 const std::vector<gfx::Rect>& additional_client_areas) {}
472 545
473 SimpleWM::FrameView* SimpleWM::GetFrameViewForClientWindow( 546 SimpleWM::FrameView* SimpleWM::GetFrameViewForClientWindow(
474 aura::Window* client_window) { 547 aura::Window* client_window) {
475 auto it = client_window_to_frame_view_.find(client_window); 548 auto it = client_window_to_frame_view_.find(client_window);
476 return it != client_window_to_frame_view_.end() ? it->second : nullptr; 549 return it != client_window_to_frame_view_.end() ? it->second : nullptr;
477 } 550 }
478 551
479 void SimpleWM::OnWindowListViewItemActivated(aura::Window* window) { 552 void SimpleWM::OnWindowListViewItemActivated(aura::Window* window) {
553 window->Show();
480 aura::client::ActivationClient* activation_client = 554 aura::client::ActivationClient* activation_client =
481 aura::client::GetActivationClient(window->GetRootWindow()); 555 aura::client::GetActivationClient(window->GetRootWindow());
482 activation_client->ActivateWindow(window); 556 activation_client->ActivateWindow(window);
483 } 557 }
484 558
485 } // namespace simple_wm 559 } // namespace simple_wm
OLDNEW
« 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