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.
5 #include "ash/wm/ash_native_cursor_manager.h"
7 #include "ash/display/cursor_window_controller.h"
8 #include "ash/display/display_controller.h"
10 #include "ash/wm/image_cursors.h"
11 #include "base/logging.h"
12 #include "ui/aura/env.h"
13 #include "ui/aura/root_window.h"
14 #include "ui/base/cursor/cursor.h"
19 void SetCursorOnAllRootWindows(gfx::NativeCursor cursor) {
20 aura::Window::Windows root_windows =
21 Shell::GetInstance()->GetAllRootWindows();
22 for (aura::Window::Windows::iterator iter = root_windows.begin();
23 iter != root_windows.end(); ++iter)
24 (*iter)->GetDispatcher()->host()->SetCursor(cursor);
25 #if defined(OS_CHROMEOS)
26 Shell::GetInstance()->display_controller()->
27 cursor_window_controller()->SetCursor(cursor);
31 void NotifyCursorVisibilityChange(bool visible) {
32 aura::Window::Windows root_windows =
33 Shell::GetInstance()->GetAllRootWindows();
34 for (aura::Window::Windows::iterator iter = root_windows.begin();
35 iter != root_windows.end(); ++iter)
36 (*iter)->GetDispatcher()->host()->OnCursorVisibilityChanged(visible);
37 #if defined(OS_CHROMEOS)
38 Shell::GetInstance()->display_controller()->cursor_window_controller()->
39 SetVisibility(visible);
43 void NotifyMouseEventsEnableStateChange(bool enabled) {
44 aura::Window::Windows root_windows =
45 Shell::GetInstance()->GetAllRootWindows();
46 for (aura::Window::Windows::iterator iter = root_windows.begin();
47 iter != root_windows.end(); ++iter)
48 (*iter)->GetDispatcher()->OnMouseEventsEnableStateChanged(enabled);
49 // Mirror window never process events.
54 AshNativeCursorManager::AshNativeCursorManager()
55 : native_cursor_enabled_(true),
56 image_cursors_(new ImageCursors) {
59 AshNativeCursorManager::~AshNativeCursorManager() {
63 void AshNativeCursorManager::SetNativeCursorEnabled(bool enabled) {
64 native_cursor_enabled_ = enabled;
66 views::corewm::CursorManager* cursor_manager =
67 Shell::GetInstance()->cursor_manager();
68 SetCursor(cursor_manager->GetCursor(), cursor_manager);
71 void AshNativeCursorManager::SetDisplay(
72 const gfx::Display& display,
73 views::corewm::NativeCursorManagerDelegate* delegate) {
74 if (image_cursors_->SetDisplay(display))
75 SetCursor(delegate->GetCursor(), delegate);
76 #if defined(OS_CHROMEOS)
77 Shell::GetInstance()->display_controller()->cursor_window_controller()->
82 void AshNativeCursorManager::SetCursor(
83 gfx::NativeCursor cursor,
84 views::corewm::NativeCursorManagerDelegate* delegate) {
85 gfx::NativeCursor new_cursor = cursor;
86 if (native_cursor_enabled_) {
87 image_cursors_->SetPlatformCursor(&new_cursor);
89 gfx::NativeCursor invisible_cursor(ui::kCursorNone);
90 image_cursors_->SetPlatformCursor(&invisible_cursor);
91 if (new_cursor == ui::kCursorCustom) {
92 new_cursor = invisible_cursor;
94 new_cursor.SetPlatformCursor(invisible_cursor.platform());
97 new_cursor.set_device_scale_factor(
98 image_cursors_->GetDisplay().device_scale_factor());
100 delegate->CommitCursor(new_cursor);
102 if (delegate->IsCursorVisible())
103 SetCursorOnAllRootWindows(new_cursor);
106 void AshNativeCursorManager::SetCursorSet(
107 ui::CursorSetType cursor_set,
108 views::corewm::NativeCursorManagerDelegate* delegate) {
109 image_cursors_->SetCursorSet(cursor_set);
110 delegate->CommitCursorSet(cursor_set);
112 // Sets the cursor to reflect the scale change immediately.
113 if (delegate->IsCursorVisible())
114 SetCursor(delegate->GetCursor(), delegate);
116 #if defined(OS_CHROMEOS)
117 Shell::GetInstance()->display_controller()->cursor_window_controller()->
118 SetCursorSet(cursor_set);
122 void AshNativeCursorManager::SetScale(
124 views::corewm::NativeCursorManagerDelegate* delegate) {
125 image_cursors_->SetScale(scale);
126 delegate->CommitScale(scale);
128 // Sets the cursor to reflect the scale change immediately.
129 SetCursor(delegate->GetCursor(), delegate);
132 void AshNativeCursorManager::SetVisibility(
134 views::corewm::NativeCursorManagerDelegate* delegate) {
135 delegate->CommitVisibility(visible);
138 SetCursor(delegate->GetCursor(), delegate);
140 gfx::NativeCursor invisible_cursor(ui::kCursorNone);
141 image_cursors_->SetPlatformCursor(&invisible_cursor);
142 SetCursorOnAllRootWindows(invisible_cursor);
145 NotifyCursorVisibilityChange(visible);
148 void AshNativeCursorManager::SetMouseEventsEnabled(
150 views::corewm::NativeCursorManagerDelegate* delegate) {
151 delegate->CommitMouseEventsEnabled(enabled);
154 aura::Env::GetInstance()->set_last_mouse_location(
155 disabled_cursor_location_);
157 disabled_cursor_location_ = aura::Env::GetInstance()->last_mouse_location();
160 SetVisibility(delegate->IsCursorVisible(), delegate);
161 NotifyMouseEventsEnableStateChange(enabled);