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 3 // found in the LICENSE file. 4 5 #include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h" 6 7 #include "ui/aura/root_window.h" 8 #include "ui/base/cursor/cursor_loader.h" 9 #include "ui/views/widget/desktop_aura/desktop_cursor_loader_updater.h" 10 11 namespace views { 12 13 DesktopNativeCursorManager::DesktopNativeCursorManager( 14 aura::RootWindow* window, 15 scoped_ptr<DesktopCursorLoaderUpdater> cursor_loader_updater) 16 : root_window_(window), 17 cursor_loader_updater_(cursor_loader_updater.Pass()), 18 cursor_loader_(ui::CursorLoader::Create()) { 19 if (cursor_loader_updater_.get()) 20 cursor_loader_updater_->OnCreate(root_window_, cursor_loader_.get()); 21 } 22 23 DesktopNativeCursorManager::~DesktopNativeCursorManager() { 24 } 25 26 gfx::NativeCursor DesktopNativeCursorManager::GetInitializedCursor(int type) { 27 gfx::NativeCursor cursor(type); 28 cursor_loader_->SetPlatformCursor(&cursor); 29 return cursor; 30 } 31 32 void DesktopNativeCursorManager::SetDisplay( 33 const gfx::Display& display, 34 views::corewm::NativeCursorManagerDelegate* delegate) { 35 cursor_loader_->UnloadAll(); 36 cursor_loader_->set_display(display); 37 38 if (cursor_loader_updater_.get()) 39 cursor_loader_updater_->OnDisplayUpdated(display, cursor_loader_.get()); 40 41 SetCursor(delegate->GetCurrentCursor(), delegate); 42 } 43 44 void DesktopNativeCursorManager::SetCursor( 45 gfx::NativeCursor cursor, 46 views::corewm::NativeCursorManagerDelegate* delegate) { 47 gfx::NativeCursor new_cursor = cursor; 48 cursor_loader_->SetPlatformCursor(&new_cursor); 49 delegate->CommitCursor(new_cursor); 50 51 if (delegate->GetCurrentVisibility()) 52 root_window_->SetCursor(new_cursor); 53 } 54 55 void DesktopNativeCursorManager::SetVisibility( 56 bool visible, 57 views::corewm::NativeCursorManagerDelegate* delegate) { 58 delegate->CommitVisibility(visible); 59 60 if (visible) { 61 SetCursor(delegate->GetCurrentCursor(), delegate); 62 } else { 63 gfx::NativeCursor invisible_cursor(ui::kCursorNone); 64 cursor_loader_->SetPlatformCursor(&invisible_cursor); 65 root_window_->SetCursor(invisible_cursor); 66 } 67 68 root_window_->OnCursorVisibilityChanged(visible); 69 } 70 71 72 void DesktopNativeCursorManager::SetScale( 73 float scale, 74 views::corewm::NativeCursorManagerDelegate* delegate) { 75 NOTIMPLEMENTED(); 76 } 77 78 void DesktopNativeCursorManager::SetMouseEventsEnabled( 79 bool enabled, 80 views::corewm::NativeCursorManagerDelegate* delegate) { 81 delegate->CommitMouseEventsEnabled(enabled); 82 83 // TODO(erg): In the ash version, we set the last mouse location on Env. I'm 84 // not sure this concept makes sense on the desktop. 85 86 SetVisibility(delegate->GetCurrentVisibility(), delegate); 87 88 root_window_->OnMouseEventsEnableStateChanged(enabled); 89 } 90 91 } // namespace views 92