| 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 "ash/public/cpp/shell_window_ids.h" | 7 #include "ash/public/cpp/shell_window_ids.h" |
| 8 #include "cc/output/copy_output_request.h" | 8 #include "cc/output/copy_output_request.h" |
| 9 #include "cc/output/copy_output_result.h" | 9 #include "cc/output/copy_output_result.h" |
| 10 #include "components/exo/pointer_delegate.h" | 10 #include "components/exo/pointer_delegate.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 return event->location_f() == location; | 44 return event->location_f() == location; |
| 45 } | 45 } |
| 46 | 46 |
| 47 } // namespace | 47 } // namespace |
| 48 | 48 |
| 49 //////////////////////////////////////////////////////////////////////////////// | 49 //////////////////////////////////////////////////////////////////////////////// |
| 50 // Pointer, public: | 50 // Pointer, public: |
| 51 | 51 |
| 52 Pointer::Pointer(PointerDelegate* delegate) | 52 Pointer::Pointer(PointerDelegate* delegate) |
| 53 : delegate_(delegate), | 53 : delegate_(delegate), |
| 54 cursor_(ui::kCursorNull), | 54 cursor_(ui::CursorType::kNull), |
| 55 cursor_capture_source_id_(base::UnguessableToken::Create()), | 55 cursor_capture_source_id_(base::UnguessableToken::Create()), |
| 56 cursor_capture_weak_ptr_factory_(this) { | 56 cursor_capture_weak_ptr_factory_(this) { |
| 57 auto* helper = WMHelper::GetInstance(); | 57 auto* helper = WMHelper::GetInstance(); |
| 58 helper->AddPreTargetHandler(this); | 58 helper->AddPreTargetHandler(this); |
| 59 helper->AddCursorObserver(this); | 59 helper->AddCursorObserver(this); |
| 60 } | 60 } |
| 61 | 61 |
| 62 Pointer::~Pointer() { | 62 Pointer::~Pointer() { |
| 63 delegate_->OnPointerDestroying(this); | 63 delegate_->OnPointerDestroying(this); |
| 64 if (surface_) | 64 if (surface_) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 // Early out if cursor did not change. | 118 // Early out if cursor did not change. |
| 119 if (!cursor_changed) | 119 if (!cursor_changed) |
| 120 return; | 120 return; |
| 121 | 121 |
| 122 // If |surface_| is set then asynchronously capture a snapshot of cursor, | 122 // If |surface_| is set then asynchronously capture a snapshot of cursor, |
| 123 // otherwise cancel pending capture and immediately set the cursor to "none". | 123 // otherwise cancel pending capture and immediately set the cursor to "none". |
| 124 if (surface_) { | 124 if (surface_) { |
| 125 CaptureCursor(); | 125 CaptureCursor(); |
| 126 } else { | 126 } else { |
| 127 cursor_capture_weak_ptr_factory_.InvalidateWeakPtrs(); | 127 cursor_capture_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 128 cursor_ = ui::kCursorNone; | 128 cursor_ = ui::CursorType::kNone; |
| 129 UpdateCursor(); | 129 UpdateCursor(); |
| 130 } | 130 } |
| 131 } | 131 } |
| 132 | 132 |
| 133 gfx::NativeCursor Pointer::GetCursor() { | 133 gfx::NativeCursor Pointer::GetCursor() { |
| 134 return cursor_; | 134 return cursor_; |
| 135 } | 135 } |
| 136 | 136 |
| 137 //////////////////////////////////////////////////////////////////////////////// | 137 //////////////////////////////////////////////////////////////////////////////// |
| 138 // ui::EventHandler overrides: | 138 // ui::EventHandler overrides: |
| 139 | 139 |
| 140 void Pointer::OnMouseEvent(ui::MouseEvent* event) { | 140 void Pointer::OnMouseEvent(ui::MouseEvent* event) { |
| 141 Surface* target = GetEffectiveTargetForEvent(event); | 141 Surface* target = GetEffectiveTargetForEvent(event); |
| 142 | 142 |
| 143 // If target is different than the current pointer focus then we need to | 143 // If target is different than the current pointer focus then we need to |
| 144 // generate enter and leave events. | 144 // generate enter and leave events. |
| 145 if (target != focus_) { | 145 if (target != focus_) { |
| 146 // First generate a leave event if we currently have a target in focus. | 146 // First generate a leave event if we currently have a target in focus. |
| 147 if (focus_) { | 147 if (focus_) { |
| 148 delegate_->OnPointerLeave(focus_); | 148 delegate_->OnPointerLeave(focus_); |
| 149 focus_->RemoveSurfaceObserver(this); | 149 focus_->RemoveSurfaceObserver(this); |
| 150 // Require SetCursor() to be called and cursor to be re-defined in | 150 // Require SetCursor() to be called and cursor to be re-defined in |
| 151 // response to each OnPointerEnter() call. | 151 // response to each OnPointerEnter() call. |
| 152 focus_->UnregisterCursorProvider(this); | 152 focus_->UnregisterCursorProvider(this); |
| 153 focus_ = nullptr; | 153 focus_ = nullptr; |
| 154 cursor_ = ui::kCursorNull; | 154 cursor_ = ui::CursorType::kNull; |
| 155 cursor_capture_weak_ptr_factory_.InvalidateWeakPtrs(); | 155 cursor_capture_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 156 } | 156 } |
| 157 // Second generate an enter event if focus moved to a new target. | 157 // Second generate an enter event if focus moved to a new target. |
| 158 if (target) { | 158 if (target) { |
| 159 delegate_->OnPointerEnter(target, event->location_f(), | 159 delegate_->OnPointerEnter(target, event->location_f(), |
| 160 event->button_flags()); | 160 event->button_flags()); |
| 161 location_ = event->location_f(); | 161 location_ = event->location_f(); |
| 162 focus_ = target; | 162 focus_ = target; |
| 163 focus_->AddSurfaceObserver(this); | 163 focus_->AddSurfaceObserver(this); |
| 164 focus_->RegisterCursorProvider(this); | 164 focus_->RegisterCursorProvider(this); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 cursor_scale_ * primary_device_scale_factor))); | 341 cursor_scale_ * primary_device_scale_factor))); |
| 342 request->set_source(cursor_capture_source_id_); | 342 request->set_source(cursor_capture_source_id_); |
| 343 surface_->window()->layer()->RequestCopyOfOutput(std::move(request)); | 343 surface_->window()->layer()->RequestCopyOfOutput(std::move(request)); |
| 344 } | 344 } |
| 345 | 345 |
| 346 void Pointer::OnCursorCaptured(const gfx::Point& hotspot, | 346 void Pointer::OnCursorCaptured(const gfx::Point& hotspot, |
| 347 std::unique_ptr<cc::CopyOutputResult> result) { | 347 std::unique_ptr<cc::CopyOutputResult> result) { |
| 348 if (!focus_) | 348 if (!focus_) |
| 349 return; | 349 return; |
| 350 | 350 |
| 351 cursor_ = ui::kCursorNone; | 351 cursor_ = ui::CursorType::kNone; |
| 352 if (!result->IsEmpty()) { | 352 if (!result->IsEmpty()) { |
| 353 DCHECK(result->HasBitmap()); | 353 DCHECK(result->HasBitmap()); |
| 354 std::unique_ptr<SkBitmap> bitmap = result->TakeBitmap(); | 354 std::unique_ptr<SkBitmap> bitmap = result->TakeBitmap(); |
| 355 | 355 |
| 356 ui::PlatformCursor platform_cursor; | 356 ui::PlatformCursor platform_cursor; |
| 357 #if defined(USE_OZONE) | 357 #if defined(USE_OZONE) |
| 358 // TODO(reveman): Add interface for creating cursors from GpuMemoryBuffers | 358 // TODO(reveman): Add interface for creating cursors from GpuMemoryBuffers |
| 359 // and use that here instead of the current bitmap API. crbug.com/686600 | 359 // and use that here instead of the current bitmap API. crbug.com/686600 |
| 360 platform_cursor = ui::CursorFactoryOzone::GetInstance()->CreateImageCursor( | 360 platform_cursor = ui::CursorFactoryOzone::GetInstance()->CreateImageCursor( |
| 361 *bitmap.get(), hotspot, cursor_scale_); | 361 *bitmap.get(), hotspot, cursor_scale_); |
| 362 #elif defined(USE_X11) | 362 #elif defined(USE_X11) |
| 363 XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap.get(), hotspot); | 363 XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap.get(), hotspot); |
| 364 platform_cursor = ui::CreateReffedCustomXCursor(image); | 364 platform_cursor = ui::CreateReffedCustomXCursor(image); |
| 365 #endif | 365 #endif |
| 366 cursor_ = ui::kCursorCustom; | 366 cursor_ = ui::CursorType::kCustom; |
| 367 cursor_.SetPlatformCursor(platform_cursor); | 367 cursor_.SetPlatformCursor(platform_cursor); |
| 368 #if defined(USE_OZONE) | 368 #if defined(USE_OZONE) |
| 369 ui::CursorFactoryOzone::GetInstance()->UnrefImageCursor(platform_cursor); | 369 ui::CursorFactoryOzone::GetInstance()->UnrefImageCursor(platform_cursor); |
| 370 #elif defined(USE_X11) | 370 #elif defined(USE_X11) |
| 371 ui::UnrefCustomXCursor(platform_cursor); | 371 ui::UnrefCustomXCursor(platform_cursor); |
| 372 #endif | 372 #endif |
| 373 } | 373 } |
| 374 | 374 |
| 375 UpdateCursor(); | 375 UpdateCursor(); |
| 376 } | 376 } |
| 377 | 377 |
| 378 void Pointer::UpdateCursor() { | 378 void Pointer::UpdateCursor() { |
| 379 DCHECK(focus_); | 379 DCHECK(focus_); |
| 380 | 380 |
| 381 aura::Window* root_window = focus_->window()->GetRootWindow(); | 381 aura::Window* root_window = focus_->window()->GetRootWindow(); |
| 382 if (!root_window) | 382 if (!root_window) |
| 383 return; | 383 return; |
| 384 | 384 |
| 385 aura::client::CursorClient* cursor_client = | 385 aura::client::CursorClient* cursor_client = |
| 386 aura::client::GetCursorClient(root_window); | 386 aura::client::GetCursorClient(root_window); |
| 387 if (cursor_client) | 387 if (cursor_client) |
| 388 cursor_client->SetCursor(cursor_); | 388 cursor_client->SetCursor(cursor_); |
| 389 } | 389 } |
| 390 | 390 |
| 391 } // namespace exo | 391 } // namespace exo |
| OLD | NEW |