| 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/shell.h" | 7 #include "ash/shell.h" |
| 8 #include "ash/shell_window_ids.h" | 8 #include "ash/shell_window_ids.h" |
| 9 #include "components/exo/buffer.h" | |
| 10 #include "components/exo/pointer_delegate.h" | 9 #include "components/exo/pointer_delegate.h" |
| 11 #include "components/exo/surface.h" | 10 #include "components/exo/surface.h" |
| 12 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" | |
| 13 #include "third_party/skia/include/core/SkBitmap.h" | |
| 14 #include "ui/aura/env.h" | |
| 15 #include "ui/aura/window.h" | 11 #include "ui/aura/window.h" |
| 16 #include "ui/base/cursor/cursors_aura.h" | |
| 17 #include "ui/compositor/compositor.h" | |
| 18 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
| 19 #include "ui/views/widget/widget.h" | 13 #include "ui/views/widget/widget.h" |
| 20 | 14 |
| 21 namespace exo { | 15 namespace exo { |
| 22 namespace { | |
| 23 | |
| 24 scoped_ptr<Buffer> CreateDefaultCursor(gfx::Point* hotspot) { | |
| 25 ui::Cursor cursor(ui::kCursorPointer); | |
| 26 cursor.set_device_scale_factor(1.0f); | |
| 27 | |
| 28 SkBitmap bitmap; | |
| 29 if (!ui::GetCursorBitmap(cursor, &bitmap, hotspot)) { | |
| 30 LOG(ERROR) << "Failed to load default cursor bitmap"; | |
| 31 return nullptr; | |
| 32 } | |
| 33 | |
| 34 DCHECK_EQ(bitmap.colorType(), kBGRA_8888_SkColorType); | |
| 35 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = | |
| 36 aura::Env::GetInstance() | |
| 37 ->context_factory() | |
| 38 ->GetGpuMemoryBufferManager() | |
| 39 ->AllocateGpuMemoryBuffer(gfx::SkISizeToSize(bitmap.dimensions()), | |
| 40 gfx::BufferFormat::BGRA_8888, | |
| 41 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE); | |
| 42 bool rv = gpu_memory_buffer->Map(); | |
| 43 DCHECK(rv); | |
| 44 int stride = gpu_memory_buffer->stride(0 /* plane */); | |
| 45 DCHECK_GT(stride, 0); | |
| 46 bitmap.copyPixelsTo(gpu_memory_buffer->memory(0 /* plane */), | |
| 47 stride * bitmap.height(), stride); | |
| 48 gpu_memory_buffer->Unmap(); | |
| 49 | |
| 50 return make_scoped_ptr(new Buffer(std::move(gpu_memory_buffer))); | |
| 51 } | |
| 52 | |
| 53 } // namespace | |
| 54 | 16 |
| 55 //////////////////////////////////////////////////////////////////////////////// | 17 //////////////////////////////////////////////////////////////////////////////// |
| 56 // Pointer, public: | 18 // Pointer, public: |
| 57 | 19 |
| 58 Pointer::Pointer(PointerDelegate* delegate) | 20 Pointer::Pointer(PointerDelegate* delegate) |
| 59 : delegate_(delegate), surface_(nullptr), focus_(nullptr) { | 21 : delegate_(delegate), surface_(nullptr), focus_(nullptr) { |
| 60 ash::Shell::GetInstance()->AddPreTargetHandler(this); | 22 ash::Shell::GetInstance()->AddPreTargetHandler(this); |
| 61 } | 23 } |
| 62 | 24 |
| 63 Pointer::~Pointer() { | 25 Pointer::~Pointer() { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 case ui::ET_MOUSE_EXITED: | 133 case ui::ET_MOUSE_EXITED: |
| 172 case ui::ET_MOUSE_CAPTURE_CHANGED: | 134 case ui::ET_MOUSE_CAPTURE_CHANGED: |
| 173 break; | 135 break; |
| 174 default: | 136 default: |
| 175 NOTREACHED(); | 137 NOTREACHED(); |
| 176 break; | 138 break; |
| 177 } | 139 } |
| 178 | 140 |
| 179 // Update cursor widget to reflect current focus and pointer location. | 141 // Update cursor widget to reflect current focus and pointer location. |
| 180 if (focus_) { | 142 if (focus_) { |
| 181 if (!widget_) { | 143 if (!widget_) |
| 182 CreatePointerWidget(); | 144 CreatePointerWidget(); |
| 183 | |
| 184 // Create default pointer surface. This will be used until a different | |
| 185 // pointer surface is set using SetCursor(). | |
| 186 default_cursor_ = CreateDefaultCursor(&hotspot_); | |
| 187 default_surface_.reset(new Surface); | |
| 188 surface_ = default_surface_.get(); | |
| 189 surface_->SetSurfaceDelegate(this); | |
| 190 surface_->AddSurfaceObserver(this); | |
| 191 widget_->GetNativeWindow()->AddChild(surface_); | |
| 192 surface_->Attach(default_cursor_.get()); | |
| 193 surface_->Commit(); | |
| 194 surface_->Show(); | |
| 195 } | |
| 196 widget_->SetBounds(gfx::Rect( | 145 widget_->SetBounds(gfx::Rect( |
| 197 focus_->GetBoundsInScreen().origin() + location_.OffsetFromOrigin(), | 146 focus_->GetBoundsInScreen().origin() + location_.OffsetFromOrigin(), |
| 198 gfx::Size(1, 1))); | 147 gfx::Size(1, 1))); |
| 199 if (!widget_->IsVisible()) | 148 if (!widget_->IsVisible()) |
| 200 widget_->Show(); | 149 widget_->Show(); |
| 201 } else { | 150 } else { |
| 202 if (widget_ && widget_->IsVisible()) | 151 if (widget_ && widget_->IsVisible()) |
| 203 widget_->Hide(); | 152 widget_->Hide(); |
| 204 } | 153 } |
| 205 } | 154 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 Surface* Pointer::GetEffectiveTargetForEvent(ui::Event* event) const { | 207 Surface* Pointer::GetEffectiveTargetForEvent(ui::Event* event) const { |
| 259 Surface* target = | 208 Surface* target = |
| 260 Surface::AsSurface(static_cast<aura::Window*>(event->target())); | 209 Surface::AsSurface(static_cast<aura::Window*>(event->target())); |
| 261 if (!target) | 210 if (!target) |
| 262 return nullptr; | 211 return nullptr; |
| 263 | 212 |
| 264 return delegate_->CanAcceptPointerEventsForSurface(target) ? target : nullptr; | 213 return delegate_->CanAcceptPointerEventsForSurface(target) ? target : nullptr; |
| 265 } | 214 } |
| 266 | 215 |
| 267 } // namespace exo | 216 } // namespace exo |
| OLD | NEW |