| 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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 // Reparent the cursor to the root window where the mouse is located. | 260 // Reparent the cursor to the root window where the mouse is located. |
| 261 if (container->GetRootWindow() != cursor_->GetRootWindow()) { | 261 if (container->GetRootWindow() != cursor_->GetRootWindow()) { |
| 262 if (cursor_->parent()) | 262 if (cursor_->parent()) |
| 263 cursor_->parent()->RemoveChild(cursor_.get()); | 263 cursor_->parent()->RemoveChild(cursor_.get()); |
| 264 container->AddChild(cursor_.get()); | 264 container->AddChild(cursor_.get()); |
| 265 } | 265 } |
| 266 | 266 |
| 267 auto info = helper->GetDisplayInfo(display.id()); | 267 auto info = helper->GetDisplayInfo(display.id()); |
| 268 display_scale_ = info.GetEffectiveUIScale() * info.device_scale_factor(); | 268 display_scale_ = info.GetEffectiveUIScale() * info.device_scale_factor(); |
| 269 device_scale_factor_ = display.device_scale_factor(); | 269 device_scale_factor_ = display.device_scale_factor(); |
| 270 rotation_ = display.rotation(); |
| 270 | 271 |
| 271 if (focus_ && surface_) { | 272 if (focus_ && surface_) { |
| 272 // Capture is asynchronous, so avoid rendering old cursor in the meantime. | 273 // Capture is asynchronous, so avoid rendering old cursor in the meantime. |
| 273 cursor_capture_weak_ptr_factory_.InvalidateWeakPtrs(); | 274 cursor_capture_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 274 UpdateCursor(ui::kCursorNone, true); | 275 UpdateCursor(ui::kCursorNone, true); |
| 275 // Force the cursor to be updated even if locked. | 276 // Force the cursor to be updated even if locked. |
| 276 CaptureCursor(true); | 277 CaptureCursor(true); |
| 277 } | 278 } |
| 278 } | 279 } |
| 279 | 280 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 | 321 |
| 321 void Pointer::CaptureCursor(bool force) { | 322 void Pointer::CaptureCursor(bool force) { |
| 322 DCHECK(surface_); | 323 DCHECK(surface_); |
| 323 DCHECK(focus_); | 324 DCHECK(focus_); |
| 324 | 325 |
| 325 float scale = cursor_scale_ * display_scale_; | 326 float scale = cursor_scale_ * display_scale_; |
| 326 float layer_scale = scale / device_scale_factor_; | 327 float layer_scale = scale / device_scale_factor_; |
| 327 | 328 |
| 328 gfx::Transform transform; | 329 gfx::Transform transform; |
| 329 transform.Scale(layer_scale, layer_scale); | 330 transform.Scale(layer_scale, layer_scale); |
| 331 transform.Rotate(display::Display::RotationAsDegree(rotation_)); |
| 330 surface_->window()->SetTransform(transform); | 332 surface_->window()->SetTransform(transform); |
| 331 | 333 |
| 334 gfx::Point hotspot = hotspot_; |
| 335 aura::Window::ConvertPointToTarget(surface_->window(), cursor_.get(), |
| 336 &hotspot); |
| 337 |
| 332 std::unique_ptr<cc::CopyOutputRequest> request = | 338 std::unique_ptr<cc::CopyOutputRequest> request = |
| 333 cc::CopyOutputRequest::CreateBitmapRequest( | 339 cc::CopyOutputRequest::CreateBitmapRequest( |
| 334 base::Bind(&Pointer::OnCursorCaptured, | 340 base::Bind(&Pointer::OnCursorCaptured, |
| 335 cursor_capture_weak_ptr_factory_.GetWeakPtr(), | 341 cursor_capture_weak_ptr_factory_.GetWeakPtr(), |
| 336 gfx::ScaleToFlooredPoint(hotspot_, scale), force)); | 342 gfx::ScaleToFlooredPoint(hotspot, scale), force)); |
| 337 | 343 |
| 338 request->set_source(cursor_capture_source_id_); | 344 request->set_source(cursor_capture_source_id_); |
| 339 cursor_->layer()->RequestCopyOfOutput(std::move(request)); | 345 cursor_->layer()->RequestCopyOfOutput(std::move(request)); |
| 340 | 346 |
| 341 // Prevent subsequent requests in the same frame from aborting this capture. | 347 // Prevent subsequent requests in the same frame from aborting this capture. |
| 342 if (force) | 348 if (force) |
| 343 cursor_capture_source_id_ = base::UnguessableToken::Create(); | 349 cursor_capture_source_id_ = base::UnguessableToken::Create(); |
| 344 } | 350 } |
| 345 | 351 |
| 346 void Pointer::OnCursorCaptured(gfx::Point hotspot, | 352 void Pointer::OnCursorCaptured(gfx::Point hotspot, |
| 347 bool force, | 353 bool force, |
| 348 std::unique_ptr<cc::CopyOutputResult> result) { | 354 std::unique_ptr<cc::CopyOutputResult> result) { |
| 349 if (!focus_) | 355 if (!focus_) |
| 350 return; | 356 return; |
| 351 | 357 |
| 352 gfx::NativeCursor cursor = ui::kCursorNull; | 358 gfx::NativeCursor cursor = ui::kCursorNull; |
| 353 if (!result->IsEmpty()) { | 359 if (!result->IsEmpty()) { |
| 354 DCHECK(result->HasBitmap()); | 360 DCHECK(result->HasBitmap()); |
| 355 std::unique_ptr<SkBitmap> bitmap = result->TakeBitmap(); | 361 std::unique_ptr<SkBitmap> bitmap = result->TakeBitmap(); |
| 356 | 362 |
| 363 switch (rotation_) { |
| 364 case display::Display::ROTATE_0: |
| 365 break; |
| 366 |
| 367 case display::Display::ROTATE_90: |
| 368 hotspot += gfx::Vector2d(bitmap->height(), 0); |
| 369 break; |
| 370 |
| 371 case display::Display::ROTATE_180: |
| 372 hotspot += gfx::Vector2d(bitmap->width(), bitmap->height()); |
| 373 break; |
| 374 |
| 375 case display::Display::ROTATE_270: |
| 376 hotspot += gfx::Vector2d(0, bitmap->width()); |
| 377 break; |
| 378 } |
| 379 |
| 357 ui::PlatformCursor platform_cursor; | 380 ui::PlatformCursor platform_cursor; |
| 358 #if defined(USE_OZONE) | 381 #if defined(USE_OZONE) |
| 359 // TODO(reveman): Add interface for creating cursors from GpuMemoryBuffers | 382 // TODO(reveman): Add interface for creating cursors from GpuMemoryBuffers |
| 360 // and use that here instead of the current bitmap API. crbug.com/686600 | 383 // and use that here instead of the current bitmap API. crbug.com/686600 |
| 361 platform_cursor = ui::CursorFactoryOzone::GetInstance()->CreateImageCursor( | 384 platform_cursor = ui::CursorFactoryOzone::GetInstance()->CreateImageCursor( |
| 362 *bitmap.get(), hotspot); | 385 *bitmap.get(), hotspot); |
| 363 #elif defined(USE_X11) | 386 #elif defined(USE_X11) |
| 364 XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap.get(), hotspot); | 387 XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap.get(), hotspot); |
| 365 platform_cursor = ui::CreateReffedCustomXCursor(image); | 388 platform_cursor = ui::CreateReffedCustomXCursor(image); |
| 366 #endif | 389 #endif |
| (...skipping 15 matching lines...) Expand all Loading... |
| 382 if (auto* cursor_client = | 405 if (auto* cursor_client = |
| 383 aura::client::GetCursorClient(focus_->window()->GetRootWindow())) { | 406 aura::client::GetCursorClient(focus_->window()->GetRootWindow())) { |
| 384 cursor_client->SetCursor(cursor); | 407 cursor_client->SetCursor(cursor); |
| 385 | 408 |
| 386 if (force && cursor_client->IsCursorLocked()) | 409 if (force && cursor_client->IsCursorLocked()) |
| 387 WMHelper::GetInstance()->SetCursor(cursor); | 410 WMHelper::GetInstance()->SetCursor(cursor); |
| 388 } | 411 } |
| 389 } | 412 } |
| 390 | 413 |
| 391 } // namespace exo | 414 } // namespace exo |
| OLD | NEW |