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 "components/exo/pointer.h" | 5 #include "components/exo/pointer.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "ash/public/cpp/shell_window_ids.h" | 9 #include "ash/public/cpp/shell_window_ids.h" |
10 #include "cc/output/copy_output_request.h" | 10 #include "cc/output/copy_output_request.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 // Pointer, public: | 71 // Pointer, public: |
72 | 72 |
73 Pointer::Pointer(PointerDelegate* delegate) | 73 Pointer::Pointer(PointerDelegate* delegate) |
74 : delegate_(delegate), | 74 : delegate_(delegate), |
75 cursor_(ui::CursorType::kNull), | 75 cursor_(ui::CursorType::kNull), |
76 cursor_capture_source_id_(base::UnguessableToken::Create()), | 76 cursor_capture_source_id_(base::UnguessableToken::Create()), |
77 cursor_capture_weak_ptr_factory_(this) { | 77 cursor_capture_weak_ptr_factory_(this) { |
78 auto* helper = WMHelper::GetInstance(); | 78 auto* helper = WMHelper::GetInstance(); |
79 helper->AddPreTargetHandler(this); | 79 helper->AddPreTargetHandler(this); |
80 helper->AddCursorObserver(this); | 80 helper->AddCursorObserver(this); |
| 81 helper->AddDisplayConfigurationObserver(this); |
81 } | 82 } |
82 | 83 |
83 Pointer::~Pointer() { | 84 Pointer::~Pointer() { |
84 delegate_->OnPointerDestroying(this); | 85 delegate_->OnPointerDestroying(this); |
85 if (surface_) | 86 if (surface_) |
86 surface_->RemoveSurfaceObserver(this); | 87 surface_->RemoveSurfaceObserver(this); |
87 if (focus_) { | 88 if (focus_) { |
88 focus_->RemoveSurfaceObserver(this); | 89 focus_->RemoveSurfaceObserver(this); |
89 focus_->UnregisterCursorProvider(this); | 90 focus_->UnregisterCursorProvider(this); |
90 } | 91 } |
91 auto* helper = WMHelper::GetInstance(); | 92 auto* helper = WMHelper::GetInstance(); |
| 93 helper->RemoveDisplayConfigurationObserver(this); |
92 helper->RemoveCursorObserver(this); | 94 helper->RemoveCursorObserver(this); |
93 helper->RemovePreTargetHandler(this); | 95 helper->RemovePreTargetHandler(this); |
94 } | 96 } |
95 | 97 |
96 void Pointer::SetCursor(Surface* surface, const gfx::Point& hotspot) { | 98 void Pointer::SetCursor(Surface* surface, const gfx::Point& hotspot) { |
97 // Early out if the pointer doesn't have a surface in focus. | 99 // Early out if the pointer doesn't have a surface in focus. |
98 if (!focus_) | 100 if (!focus_) |
99 return; | 101 return; |
100 | 102 |
101 // This is used to avoid unnecessary cursor changes. | 103 // This is used to avoid unnecessary cursor changes. |
102 bool cursor_changed = false; | 104 bool cursor_changed = false; |
103 | 105 |
104 // If surface is different than the current pointer surface then remove the | 106 // If surface is different than the current pointer surface then remove the |
105 // current surface and add the new surface. | 107 // current surface and add the new surface. |
106 if (surface != surface_) { | 108 if (surface != surface_) { |
107 if (surface && surface->HasSurfaceDelegate()) { | 109 if (surface && surface->HasSurfaceDelegate()) { |
108 DLOG(ERROR) << "Surface has already been assigned a role"; | 110 DLOG(ERROR) << "Surface has already been assigned a role"; |
109 return; | 111 return; |
110 } | 112 } |
111 if (surface_) { | 113 UpdatePointerSurface(surface); |
112 surface_->window()->SetTransform(gfx::Transform()); | |
113 if (surface_->window()->parent()) | |
114 surface_->window()->parent()->RemoveChild(surface_->window()); | |
115 surface_->SetSurfaceDelegate(nullptr); | |
116 surface_->RemoveSurfaceObserver(this); | |
117 } | |
118 surface_ = surface; | |
119 if (surface_) { | |
120 surface_->SetSurfaceDelegate(this); | |
121 surface_->AddSurfaceObserver(this); | |
122 // Note: Surface window needs to be added to the tree so we can take a | |
123 // snapshot. Where in the tree is not important but we might as well use | |
124 // the cursor container. | |
125 WMHelper::GetInstance() | |
126 ->GetPrimaryDisplayContainer(ash::kShellWindowId_MouseCursorContainer) | |
127 ->AddChild(surface_->window()); | |
128 } | |
129 cursor_changed = true; | 114 cursor_changed = true; |
130 } | 115 } |
131 | 116 |
132 if (hotspot != hotspot_) | 117 if (hotspot != hotspot_) |
133 cursor_changed = true; | 118 cursor_changed = true; |
134 | 119 |
135 // Early out if cursor did not change. | 120 // Early out if cursor did not change. |
136 if (!cursor_changed) { | 121 if (!cursor_changed) { |
137 // Cursor scale or rotation may have changed. | 122 // Cursor scale or rotation may have changed. |
138 UpdateCursor(); | 123 UpdateCursor(); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 if (focus_) | 259 if (focus_) |
275 UpdateCursor(); | 260 UpdateCursor(); |
276 } | 261 } |
277 | 262 |
278 void Pointer::OnCursorDisplayChanged(const display::Display& display) { | 263 void Pointer::OnCursorDisplayChanged(const display::Display& display) { |
279 if (focus_) | 264 if (focus_) |
280 UpdateCursor(); | 265 UpdateCursor(); |
281 } | 266 } |
282 | 267 |
283 //////////////////////////////////////////////////////////////////////////////// | 268 //////////////////////////////////////////////////////////////////////////////// |
| 269 // WMHelper::DisplayConfigurationObserver overrides: |
| 270 |
| 271 void Pointer::OnDisplayConfigurationChanged() { |
| 272 UpdatePointerSurface(surface_); |
| 273 } |
| 274 |
| 275 //////////////////////////////////////////////////////////////////////////////// |
284 // SurfaceDelegate overrides: | 276 // SurfaceDelegate overrides: |
285 | 277 |
286 void Pointer::OnSurfaceCommit() { | 278 void Pointer::OnSurfaceCommit() { |
287 surface_->CheckIfSurfaceHierarchyNeedsCommitToNewSurfaces(); | 279 surface_->CheckIfSurfaceHierarchyNeedsCommitToNewSurfaces(); |
288 surface_->CommitSurfaceHierarchy(); | 280 surface_->CommitSurfaceHierarchy(); |
289 | 281 |
290 // Capture new cursor to reflect result of commit. | 282 // Capture new cursor to reflect result of commit. |
291 if (focus_) | 283 if (focus_) |
292 CaptureCursor(hotspot_); | 284 CaptureCursor(hotspot_); |
293 } | 285 } |
(...skipping 20 matching lines...) Expand all Loading... |
314 | 306 |
315 Surface* Pointer::GetEffectiveTargetForEvent(ui::Event* event) const { | 307 Surface* Pointer::GetEffectiveTargetForEvent(ui::Event* event) const { |
316 Surface* target = | 308 Surface* target = |
317 Surface::AsSurface(static_cast<aura::Window*>(event->target())); | 309 Surface::AsSurface(static_cast<aura::Window*>(event->target())); |
318 if (!target) | 310 if (!target) |
319 return nullptr; | 311 return nullptr; |
320 | 312 |
321 return delegate_->CanAcceptPointerEventsForSurface(target) ? target : nullptr; | 313 return delegate_->CanAcceptPointerEventsForSurface(target) ? target : nullptr; |
322 } | 314 } |
323 | 315 |
| 316 void Pointer::UpdatePointerSurface(Surface* surface) { |
| 317 if (surface_) { |
| 318 surface_->window()->SetTransform(gfx::Transform()); |
| 319 if (surface_->window()->parent()) |
| 320 surface_->window()->parent()->RemoveChild(surface_->window()); |
| 321 surface_->SetSurfaceDelegate(nullptr); |
| 322 surface_->RemoveSurfaceObserver(this); |
| 323 } |
| 324 surface_ = surface; |
| 325 if (surface_) { |
| 326 surface_->SetSurfaceDelegate(this); |
| 327 surface_->AddSurfaceObserver(this); |
| 328 // Note: Surface window needs to be added to the tree so we can take a |
| 329 // snapshot. Where in the tree is not important but we might as well use |
| 330 // the cursor container. |
| 331 WMHelper::GetInstance() |
| 332 ->GetPrimaryDisplayContainer(ash::kShellWindowId_MouseCursorContainer) |
| 333 ->AddChild(surface_->window()); |
| 334 } |
| 335 } |
| 336 |
324 void Pointer::CaptureCursor(const gfx::Point& hotspot) { | 337 void Pointer::CaptureCursor(const gfx::Point& hotspot) { |
325 DCHECK(surface_); | 338 DCHECK(surface_); |
326 DCHECK(focus_); | 339 DCHECK(focus_); |
327 | 340 |
328 // Surface size is in DIPs, while layer size is in pseudo-DIP units that | 341 // Surface size is in DIPs, while layer size is in pseudo-DIP units that |
329 // depend on the DSF of the display mode. Scale the layer to capture the | 342 // depend on the DSF of the display mode. Scale the layer to capture the |
330 // surface at a constant pixel size, regardless of the primary display's | 343 // surface at a constant pixel size, regardless of the primary display's |
331 // UI scale and display mode DSF. | 344 // UI scale and display mode DSF. |
332 display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay(); | 345 display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay(); |
333 auto* helper = WMHelper::GetInstance(); | 346 auto* helper = WMHelper::GetInstance(); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 if (!root_window) | 417 if (!root_window) |
405 return; | 418 return; |
406 | 419 |
407 aura::client::CursorClient* cursor_client = | 420 aura::client::CursorClient* cursor_client = |
408 aura::client::GetCursorClient(root_window); | 421 aura::client::GetCursorClient(root_window); |
409 if (cursor_client) | 422 if (cursor_client) |
410 cursor_client->SetCursor(cursor_); | 423 cursor_client->SetCursor(cursor_); |
411 } | 424 } |
412 | 425 |
413 } // namespace exo | 426 } // namespace exo |
OLD | NEW |