OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ui/views/mus/native_widget_mus.h" | 5 #include "ui/views/mus/native_widget_mus.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 bool SupportsChildActivation(aura::Window* window) const override { | 66 bool SupportsChildActivation(aura::Window* window) const override { |
67 return root_ == window; | 67 return root_ == window; |
68 } | 68 } |
69 | 69 |
70 private: | 70 private: |
71 aura::Window* root_; | 71 aura::Window* root_; |
72 | 72 |
73 DISALLOW_COPY_AND_ASSIGN(FocusRulesImpl); | 73 DISALLOW_COPY_AND_ASSIGN(FocusRulesImpl); |
74 }; | 74 }; |
75 | 75 |
| 76 // This makes sure that an aura::Window focused (or activated) through the |
| 77 // aura::client::FocusClient (or ActivationClient) focuses (or activates) the |
| 78 // corresponding mus::Window too. |
| 79 class FocusControllerMus : public wm::FocusController { |
| 80 public: |
| 81 explicit FocusControllerMus(wm::FocusRules* rules) : FocusController(rules) {} |
| 82 ~FocusControllerMus() override {} |
| 83 |
| 84 private: |
| 85 void FocusWindow(aura::Window* window) override { |
| 86 FocusController::FocusWindow(window); |
| 87 if (window) { |
| 88 mus::Window* mus_window = |
| 89 window->GetRootWindow()->GetProperty(kMusWindow); |
| 90 if (mus_window) |
| 91 mus_window->SetFocus(); |
| 92 } |
| 93 } |
| 94 |
| 95 DISALLOW_COPY_AND_ASSIGN(FocusControllerMus); |
| 96 }; |
| 97 |
76 class ContentWindowLayoutManager : public aura::LayoutManager { | 98 class ContentWindowLayoutManager : public aura::LayoutManager { |
77 public: | 99 public: |
78 ContentWindowLayoutManager(aura::Window* outer, aura::Window* inner) | 100 ContentWindowLayoutManager(aura::Window* outer, aura::Window* inner) |
79 : outer_(outer), inner_(inner) {} | 101 : outer_(outer), inner_(inner) {} |
80 ~ContentWindowLayoutManager() override {} | 102 ~ContentWindowLayoutManager() override {} |
81 | 103 |
82 private: | 104 private: |
83 // aura::LayoutManager: | 105 // aura::LayoutManager: |
84 void OnWindowResized() override { inner_->SetBounds(outer_->bounds()); } | 106 void OnWindowResized() override { inner_->SetBounds(outer_->bounds()); } |
85 void OnWindowAddedToLayout(aura::Window* child) override { | 107 void OnWindowAddedToLayout(aura::Window* child) override { |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
656 | 678 |
657 ownership_ = params.ownership; | 679 ownership_ = params.ownership; |
658 window_->SetCanFocus(params.activatable == | 680 window_->SetCanFocus(params.activatable == |
659 Widget::InitParams::ACTIVATABLE_YES); | 681 Widget::InitParams::ACTIVATABLE_YES); |
660 | 682 |
661 window_tree_host_->AddObserver(this); | 683 window_tree_host_->AddObserver(this); |
662 window_tree_host_->InitHost(); | 684 window_tree_host_->InitHost(); |
663 hosted_window->SetProperty(kMusWindow, window_); | 685 hosted_window->SetProperty(kMusWindow, window_); |
664 | 686 |
665 focus_client_.reset( | 687 focus_client_.reset( |
666 new wm::FocusController(new FocusRulesImpl(hosted_window))); | 688 new FocusControllerMus(new FocusRulesImpl(hosted_window))); |
667 | 689 |
668 aura::client::SetFocusClient(hosted_window, focus_client_.get()); | 690 aura::client::SetFocusClient(hosted_window, focus_client_.get()); |
669 aura::client::SetActivationClient(hosted_window, focus_client_.get()); | 691 aura::client::SetActivationClient(hosted_window, focus_client_.get()); |
670 screen_position_client_.reset(new ScreenPositionClientMus(window_)); | 692 screen_position_client_.reset(new ScreenPositionClientMus(window_)); |
671 aura::client::SetScreenPositionClient(hosted_window, | 693 aura::client::SetScreenPositionClient(hosted_window, |
672 screen_position_client_.get()); | 694 screen_position_client_.get()); |
673 | 695 |
674 // TODO(erg): Remove this check when ash/mus/frame/move_event_handler.cc's | 696 // TODO(erg): Remove this check when ash/mus/frame/move_event_handler.cc's |
675 // direct usage of mus::Window::SetPredefinedCursor() is switched to a | 697 // direct usage of mus::Window::SetPredefinedCursor() is switched to a |
676 // private method on WindowManagerClient. | 698 // private method on WindowManagerClient. |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 GetWidget()->SetInitialFocus(state); | 996 GetWidget()->SetInitialFocus(state); |
975 } | 997 } |
976 } | 998 } |
977 | 999 |
978 bool NativeWidgetMus::IsVisible() const { | 1000 bool NativeWidgetMus::IsVisible() const { |
979 // TODO(beng): this should probably be wired thru PlatformWindow. | 1001 // TODO(beng): this should probably be wired thru PlatformWindow. |
980 return window_ && window_->visible(); | 1002 return window_ && window_->visible(); |
981 } | 1003 } |
982 | 1004 |
983 void NativeWidgetMus::Activate() { | 1005 void NativeWidgetMus::Activate() { |
984 if (window_) | |
985 window_->SetFocus(); | |
986 static_cast<aura::client::ActivationClient*>(focus_client_.get()) | 1006 static_cast<aura::client::ActivationClient*>(focus_client_.get()) |
987 ->ActivateWindow(content_); | 1007 ->ActivateWindow(content_); |
| 1008 // FocusControllerMus should have focused |window_| when |content_| is |
| 1009 // activated. |
| 1010 DCHECK(!window_ || window_->HasFocus()); |
988 } | 1011 } |
989 | 1012 |
990 void NativeWidgetMus::Deactivate() { | 1013 void NativeWidgetMus::Deactivate() { |
991 if (IsActive()) | 1014 if (IsActive()) |
992 window_->window_tree()->ClearFocus(); | 1015 window_->window_tree()->ClearFocus(); |
993 } | 1016 } |
994 | 1017 |
995 bool NativeWidgetMus::IsActive() const { | 1018 bool NativeWidgetMus::IsActive() const { |
996 mus::Window* focused = | 1019 mus::Window* focused = |
997 window_ ? window_->window_tree()->GetFocusedWindow() : nullptr; | 1020 window_ ? window_->window_tree()->GetFocusedWindow() : nullptr; |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 | 1392 |
1370 gfx::Path mask_path; | 1393 gfx::Path mask_path; |
1371 native_widget_delegate_->GetHitTestMask(&mask_path); | 1394 native_widget_delegate_->GetHitTestMask(&mask_path); |
1372 // TODO(jamescook): Use the full path for the mask. | 1395 // TODO(jamescook): Use the full path for the mask. |
1373 gfx::Rect mask_rect = | 1396 gfx::Rect mask_rect = |
1374 gfx::ToEnclosingRect(gfx::SkRectToRectF(mask_path.getBounds())); | 1397 gfx::ToEnclosingRect(gfx::SkRectToRectF(mask_path.getBounds())); |
1375 window_->SetHitTestMask(mask_rect); | 1398 window_->SetHitTestMask(mask_rect); |
1376 } | 1399 } |
1377 | 1400 |
1378 } // namespace views | 1401 } // namespace views |
OLD | NEW |