OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/aura/root_window.h" | 5 #include "ui/aura/root_window.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 case ui::ET_GESTURE_PINCH_END: | 60 case ui::ET_GESTURE_PINCH_END: |
61 case ui::ET_GESTURE_TAP: | 61 case ui::ET_GESTURE_TAP: |
62 return NULL; | 62 return NULL; |
63 default: | 63 default: |
64 return target; | 64 return target; |
65 } | 65 } |
66 } | 66 } |
67 | 67 |
68 } // namespace | 68 } // namespace |
69 | 69 |
70 RootWindow* RootWindow::instance_ = NULL; | |
71 bool RootWindow::use_fullscreen_host_window_ = false; | |
72 bool RootWindow::hide_host_cursor_ = false; | 70 bool RootWindow::hide_host_cursor_ = false; |
73 | 71 |
74 //////////////////////////////////////////////////////////////////////////////// | 72 //////////////////////////////////////////////////////////////////////////////// |
75 // RootWindow, public: | 73 // RootWindow, public: |
76 | 74 |
77 RootWindow::RootWindow() | 75 RootWindow::RootWindow(const gfx::Rect& initial_bounds) |
78 : Window(NULL), | 76 : Window(NULL), |
79 host_(aura::RootWindowHost::Create(GetInitialHostWindowBounds())), | 77 host_(aura::RootWindowHost::Create(initial_bounds)), |
80 ALLOW_THIS_IN_INITIALIZER_LIST(schedule_paint_factory_(this)), | 78 ALLOW_THIS_IN_INITIALIZER_LIST(schedule_paint_factory_(this)), |
81 ALLOW_THIS_IN_INITIALIZER_LIST(event_factory_(this)), | 79 ALLOW_THIS_IN_INITIALIZER_LIST(event_factory_(this)), |
82 mouse_button_flags_(0), | 80 mouse_button_flags_(0), |
83 last_cursor_(kCursorNull), | 81 last_cursor_(kCursorNull), |
84 cursor_shown_(true), | 82 cursor_shown_(true), |
85 capture_window_(NULL), | 83 capture_window_(NULL), |
86 mouse_pressed_handler_(NULL), | 84 mouse_pressed_handler_(NULL), |
87 mouse_moved_handler_(NULL), | 85 mouse_moved_handler_(NULL), |
88 focused_window_(NULL), | 86 focused_window_(NULL), |
89 touch_event_handler_(NULL), | 87 touch_event_handler_(NULL), |
90 gesture_handler_(NULL), | 88 gesture_handler_(NULL), |
91 ALLOW_THIS_IN_INITIALIZER_LIST( | 89 ALLOW_THIS_IN_INITIALIZER_LIST( |
92 gesture_recognizer_(GestureRecognizer::Create(this))), | 90 gesture_recognizer_(GestureRecognizer::Create(this))), |
93 synthesize_mouse_move_(false), | 91 synthesize_mouse_move_(false), |
94 waiting_on_compositing_end_(false), | 92 waiting_on_compositing_end_(false), |
95 draw_on_compositing_end_(false), | 93 draw_on_compositing_end_(false), |
96 defer_draw_scheduling_(false), | 94 defer_draw_scheduling_(false), |
97 mouse_move_hold_count_(0), | 95 mouse_move_hold_count_(0), |
98 should_hold_mouse_moves_(false), | 96 should_hold_mouse_moves_(false), |
99 release_mouse_moves_after_draw_(false) { | 97 release_mouse_moves_after_draw_(false) { |
100 SetName("RootWindow"); | 98 SetName("RootWindow"); |
101 last_mouse_location_ = host_->QueryMouseLocation(); | 99 last_mouse_location_ = host_->QueryMouseLocation(); |
102 | 100 |
103 should_hold_mouse_moves_ = !CommandLine::ForCurrentProcess()->HasSwitch( | 101 should_hold_mouse_moves_ = !CommandLine::ForCurrentProcess()->HasSwitch( |
104 switches::kAuraDisableHoldMouseMoves); | 102 switches::kAuraDisableHoldMouseMoves); |
105 | 103 |
106 ui::Compositor::Initialize(false); | |
107 compositor_.reset(new ui::Compositor(this, host_->GetAcceleratedWidget(), | 104 compositor_.reset(new ui::Compositor(this, host_->GetAcceleratedWidget(), |
108 host_->GetBounds().size())); | 105 host_->GetBounds().size())); |
109 DCHECK(compositor_.get()); | 106 DCHECK(compositor_.get()); |
110 compositor_->AddObserver(this); | 107 compositor_->AddObserver(this); |
111 Init(); | 108 Init(); |
112 } | 109 } |
113 | 110 |
114 RootWindow::~RootWindow() { | 111 RootWindow::~RootWindow() { |
115 compositor_->RemoveObserver(this); | 112 compositor_->RemoveObserver(this); |
116 // Make sure to destroy the compositor before terminating so that state is | 113 // Make sure to destroy the compositor before terminating so that state is |
117 // cleared and we don't hit asserts. | 114 // cleared and we don't hit asserts. |
118 compositor_.reset(); | 115 compositor_.reset(); |
119 | 116 |
120 // Tear down in reverse. Frees any references held by the host. | 117 // Tear down in reverse. Frees any references held by the host. |
121 host_.reset(NULL); | 118 host_.reset(NULL); |
122 | 119 |
123 // An observer may have been added by an animation on the RootWindow. | 120 // An observer may have been added by an animation on the RootWindow. |
124 layer()->GetAnimator()->RemoveObserver(this); | 121 layer()->GetAnimator()->RemoveObserver(this); |
125 ui::Compositor::Terminate(); | |
126 if (instance_ == this) | |
127 instance_ = NULL; | |
128 } | 122 } |
129 | 123 |
130 void RootWindow::ShowRootWindow() { | 124 void RootWindow::ShowRootWindow() { |
131 host_->Show(); | 125 host_->Show(); |
132 } | 126 } |
133 | 127 |
134 void RootWindow::SetHostSize(const gfx::Size& size) { | 128 void RootWindow::SetHostSize(const gfx::Size& size) { |
135 DispatchHeldMouseMove(); | 129 DispatchHeldMouseMove(); |
136 gfx::Rect bounds = host_->GetBounds(); | 130 gfx::Rect bounds = host_->GetBounds(); |
137 bounds.set_size(size); | 131 bounds.set_size(size); |
138 host_->SetBounds(bounds); | 132 host_->SetBounds(bounds); |
139 // Requery the location to constrain it within the new root window size. | 133 // Requery the location to constrain it within the new root window size. |
140 last_mouse_location_ = host_->QueryMouseLocation(); | 134 last_mouse_location_ = host_->QueryMouseLocation(); |
141 synthesize_mouse_move_ = false; | 135 synthesize_mouse_move_ = false; |
142 } | 136 } |
143 | 137 |
144 gfx::Size RootWindow::GetHostSize() const { | 138 gfx::Size RootWindow::GetHostSize() const { |
145 gfx::Rect rect(host_->GetBounds().size()); | 139 gfx::Rect rect(host_->GetBounds().size()); |
146 layer()->transform().TransformRect(&rect); | 140 layer()->transform().TransformRect(&rect); |
147 return rect.size(); | 141 return rect.size(); |
148 } | 142 } |
149 | 143 |
| 144 void RootWindow::SetHostBounds(const gfx::Rect& bounds) { |
| 145 DispatchHeldMouseMove(); |
| 146 host_->SetBounds(bounds); |
| 147 // Requery the location to constrain it within the new root window size. |
| 148 last_mouse_location_ = host_->QueryMouseLocation(); |
| 149 synthesize_mouse_move_ = false; |
| 150 } |
| 151 |
150 void RootWindow::SetCursor(gfx::NativeCursor cursor) { | 152 void RootWindow::SetCursor(gfx::NativeCursor cursor) { |
151 last_cursor_ = cursor; | 153 last_cursor_ = cursor; |
152 // A lot of code seems to depend on NULL cursors actually showing an arrow, | 154 // A lot of code seems to depend on NULL cursors actually showing an arrow, |
153 // so just pass everything along to the host. | 155 // so just pass everything along to the host. |
154 host_->SetCursor(cursor); | 156 host_->SetCursor(cursor); |
155 } | 157 } |
156 | 158 |
157 void RootWindow::ShowCursor(bool show) { | 159 void RootWindow::ShowCursor(bool show) { |
158 cursor_shown_ = show; | 160 cursor_shown_ = show; |
159 host_->ShowCursor(show); | 161 host_->ShowCursor(show); |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 } | 432 } |
431 } | 433 } |
432 | 434 |
433 //////////////////////////////////////////////////////////////////////////////// | 435 //////////////////////////////////////////////////////////////////////////////// |
434 // RootWindow, Window overrides: | 436 // RootWindow, Window overrides: |
435 | 437 |
436 RootWindow* RootWindow::GetRootWindow() { | 438 RootWindow* RootWindow::GetRootWindow() { |
437 return this; | 439 return this; |
438 } | 440 } |
439 | 441 |
| 442 const RootWindow* RootWindow::GetRootWindow() const { |
| 443 return this; |
| 444 } |
| 445 |
440 void RootWindow::SetTransform(const ui::Transform& transform) { | 446 void RootWindow::SetTransform(const ui::Transform& transform) { |
441 Window::SetTransform(transform); | 447 Window::SetTransform(transform); |
442 | 448 |
443 // If the layer is not animating, then we need to update the host size | 449 // If the layer is not animating, then we need to update the host size |
444 // immediately. | 450 // immediately. |
445 if (!layer()->GetAnimator()->is_animating()) | 451 if (!layer()->GetAnimator()->is_animating()) |
446 OnHostResized(host_->GetBounds().size()); | 452 OnHostResized(host_->GetBounds().size()); |
447 } | 453 } |
448 | 454 |
449 //////////////////////////////////////////////////////////////////////////////// | 455 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 void RootWindow::DispatchHeldMouseMove() { | 833 void RootWindow::DispatchHeldMouseMove() { |
828 if (held_mouse_move_.get()) { | 834 if (held_mouse_move_.get()) { |
829 // If a mouse move has been synthesized, the target location is suspect, | 835 // If a mouse move has been synthesized, the target location is suspect, |
830 // so drop the held event. | 836 // so drop the held event. |
831 if (!synthesize_mouse_move_) | 837 if (!synthesize_mouse_move_) |
832 DispatchMouseEventImpl(held_mouse_move_.get()); | 838 DispatchMouseEventImpl(held_mouse_move_.get()); |
833 held_mouse_move_.reset(); | 839 held_mouse_move_.reset(); |
834 } | 840 } |
835 } | 841 } |
836 | 842 |
837 gfx::Rect RootWindow::GetInitialHostWindowBounds() const { | |
838 return Env::GetInstance()->monitor_manager()-> | |
839 GetMonitorNearestWindow(this)->bounds(); | |
840 } | |
841 | |
842 void RootWindow::PostMouseMoveEventAfterWindowChange() { | 843 void RootWindow::PostMouseMoveEventAfterWindowChange() { |
843 if (synthesize_mouse_move_) | 844 if (synthesize_mouse_move_) |
844 return; | 845 return; |
845 synthesize_mouse_move_ = true; | 846 synthesize_mouse_move_ = true; |
846 MessageLoop::current()->PostTask( | 847 MessageLoop::current()->PostTask( |
847 FROM_HERE, | 848 FROM_HERE, |
848 base::Bind(&RootWindow::SynthesizeMouseMoveEvent, | 849 base::Bind(&RootWindow::SynthesizeMouseMoveEvent, |
849 event_factory_.GetWeakPtr())); | 850 event_factory_.GetWeakPtr())); |
850 } | 851 } |
851 | 852 |
(...skipping 10 matching lines...) Expand all Loading... |
862 // is currently broken. See/ crbug.com/107931. | 863 // is currently broken. See/ crbug.com/107931. |
863 MouseEvent event(ui::ET_MOUSE_MOVED, | 864 MouseEvent event(ui::ET_MOUSE_MOVED, |
864 orig_mouse_location, | 865 orig_mouse_location, |
865 orig_mouse_location, | 866 orig_mouse_location, |
866 ui::EF_IS_SYNTHESIZED); | 867 ui::EF_IS_SYNTHESIZED); |
867 DispatchMouseEvent(&event); | 868 DispatchMouseEvent(&event); |
868 #endif | 869 #endif |
869 } | 870 } |
870 | 871 |
871 } // namespace aura | 872 } // namespace aura |
OLD | NEW |