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 "base/logging.h"
11 #include "ui/aura/env.h"
12 #include "ui/aura/window_event_dispatcher.h"
13 #include "ui/aura/window_tree_host.h"
14 #include "ui/base/cursor/cursor.h"
15 #include "ui/base/cursor/image_cursors.h"
20 void SetCursorOnAllRootWindows(gfx::NativeCursor cursor
) {
21 aura::Window::Windows root_windows
=
22 Shell::GetInstance()->GetAllRootWindows();
23 for (aura::Window::Windows::iterator iter
= root_windows
.begin();
24 iter
!= root_windows
.end(); ++iter
)
25 (*iter
)->GetHost()->SetCursor(cursor
);
26 #if defined(OS_CHROMEOS)
27 Shell::GetInstance()->display_controller()->
28 cursor_window_controller()->SetCursor(cursor
);
32 void NotifyCursorVisibilityChange(bool visible
) {
33 aura::Window::Windows root_windows
=
34 Shell::GetInstance()->GetAllRootWindows();
35 for (aura::Window::Windows::iterator iter
= root_windows
.begin();
36 iter
!= root_windows
.end(); ++iter
)
37 (*iter
)->GetHost()->OnCursorVisibilityChanged(visible
);
38 #if defined(OS_CHROMEOS)
39 Shell::GetInstance()->display_controller()->cursor_window_controller()->
40 SetVisibility(visible
);
44 void NotifyMouseEventsEnableStateChange(bool enabled
) {
45 aura::Window::Windows root_windows
=
46 Shell::GetInstance()->GetAllRootWindows();
47 for (aura::Window::Windows::iterator iter
= root_windows
.begin();
48 iter
!= root_windows
.end(); ++iter
)
49 (*iter
)->GetHost()->dispatcher()->OnMouseEventsEnableStateChanged(enabled
);
50 // Mirror window never process events.
55 AshNativeCursorManager::AshNativeCursorManager()
56 : native_cursor_enabled_(true),
57 image_cursors_(new ui::ImageCursors
) {
60 AshNativeCursorManager::~AshNativeCursorManager() {
64 void AshNativeCursorManager::SetNativeCursorEnabled(bool enabled
) {
65 native_cursor_enabled_
= enabled
;
67 ::wm::CursorManager
* cursor_manager
=
68 Shell::GetInstance()->cursor_manager();
69 SetCursor(cursor_manager
->GetCursor(), cursor_manager
);
72 void AshNativeCursorManager::SetDisplay(
73 const gfx::Display
& display
,
74 ::wm::NativeCursorManagerDelegate
* delegate
) {
75 DCHECK(display
.is_valid());
76 // Use the platform's device scale factor instead of the display's, which
77 // might have been adjusted for the UI scale.
78 const float scale_factor
= Shell::GetInstance()->display_manager()->
79 GetDisplayInfo(display
.id()).device_scale_factor();
80 if (image_cursors_
->SetDisplay(display
, scale_factor
))
81 SetCursor(delegate
->GetCursor(), delegate
);
82 #if defined(OS_CHROMEOS)
83 Shell::GetInstance()->display_controller()->cursor_window_controller()->
88 void AshNativeCursorManager::SetCursor(
89 gfx::NativeCursor cursor
,
90 ::wm::NativeCursorManagerDelegate
* delegate
) {
91 if (native_cursor_enabled_
) {
92 image_cursors_
->SetPlatformCursor(&cursor
);
94 gfx::NativeCursor
invisible_cursor(ui::kCursorNone
);
95 image_cursors_
->SetPlatformCursor(&invisible_cursor
);
96 if (cursor
== ui::kCursorCustom
) {
97 cursor
= invisible_cursor
;
99 cursor
.SetPlatformCursor(invisible_cursor
.platform());
102 cursor
.set_device_scale_factor(image_cursors_
->GetScale());
104 delegate
->CommitCursor(cursor
);
106 if (delegate
->IsCursorVisible())
107 SetCursorOnAllRootWindows(cursor
);
110 void AshNativeCursorManager::SetCursorSet(
111 ui::CursorSetType cursor_set
,
112 ::wm::NativeCursorManagerDelegate
* delegate
) {
113 image_cursors_
->SetCursorSet(cursor_set
);
114 delegate
->CommitCursorSet(cursor_set
);
116 // Sets the cursor to reflect the scale change immediately.
117 if (delegate
->IsCursorVisible())
118 SetCursor(delegate
->GetCursor(), delegate
);
120 #if defined(OS_CHROMEOS)
121 Shell::GetInstance()->display_controller()->cursor_window_controller()->
122 SetCursorSet(cursor_set
);
126 void AshNativeCursorManager::SetVisibility(
128 ::wm::NativeCursorManagerDelegate
* delegate
) {
129 delegate
->CommitVisibility(visible
);
132 SetCursor(delegate
->GetCursor(), delegate
);
134 gfx::NativeCursor
invisible_cursor(ui::kCursorNone
);
135 image_cursors_
->SetPlatformCursor(&invisible_cursor
);
136 SetCursorOnAllRootWindows(invisible_cursor
);
139 NotifyCursorVisibilityChange(visible
);
142 void AshNativeCursorManager::SetMouseEventsEnabled(
144 ::wm::NativeCursorManagerDelegate
* delegate
) {
145 delegate
->CommitMouseEventsEnabled(enabled
);
148 aura::Env::GetInstance()->set_last_mouse_location(
149 disabled_cursor_location_
);
151 disabled_cursor_location_
= aura::Env::GetInstance()->last_mouse_location();
154 SetVisibility(delegate
->IsCursorVisible(), delegate
);
155 NotifyMouseEventsEnableStateChange(enabled
);