Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / ash / wm / ash_native_cursor_manager.cc
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 "ash/wm/ash_native_cursor_manager.h"
6
7 #include "ash/display/cursor_window_controller.h"
8 #include "ash/display/display_controller.h"
9 #include "ash/shell.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"
15
16 namespace ash {
17 namespace  {
18
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);
28 #endif
29 }
30
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);
40 #endif
41 }
42
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.
50 }
51
52 }  // namespace
53
54 AshNativeCursorManager::AshNativeCursorManager()
55     : native_cursor_enabled_(true),
56       image_cursors_(new ImageCursors) {
57 }
58
59 AshNativeCursorManager::~AshNativeCursorManager() {
60 }
61
62
63 void AshNativeCursorManager::SetNativeCursorEnabled(bool enabled) {
64   native_cursor_enabled_ = enabled;
65
66   views::corewm::CursorManager* cursor_manager =
67       Shell::GetInstance()->cursor_manager();
68   SetCursor(cursor_manager->GetCursor(), cursor_manager);
69 }
70
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()->
78       SetDisplay(display);
79 #endif
80 }
81
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);
88   } else {
89     gfx::NativeCursor invisible_cursor(ui::kCursorNone);
90     image_cursors_->SetPlatformCursor(&invisible_cursor);
91     if (new_cursor == ui::kCursorCustom) {
92       new_cursor = invisible_cursor;
93     } else {
94       new_cursor.SetPlatformCursor(invisible_cursor.platform());
95     }
96   }
97   new_cursor.set_device_scale_factor(
98       image_cursors_->GetDisplay().device_scale_factor());
99
100   delegate->CommitCursor(new_cursor);
101
102   if (delegate->IsCursorVisible())
103     SetCursorOnAllRootWindows(new_cursor);
104 }
105
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);
111
112   // Sets the cursor to reflect the scale change immediately.
113   if (delegate->IsCursorVisible())
114     SetCursor(delegate->GetCursor(), delegate);
115
116 #if defined(OS_CHROMEOS)
117   Shell::GetInstance()->display_controller()->cursor_window_controller()->
118       SetCursorSet(cursor_set);
119 #endif
120 }
121
122 void AshNativeCursorManager::SetScale(
123     float scale,
124     views::corewm::NativeCursorManagerDelegate* delegate) {
125   image_cursors_->SetScale(scale);
126   delegate->CommitScale(scale);
127
128   // Sets the cursor to reflect the scale change immediately.
129   SetCursor(delegate->GetCursor(), delegate);
130 }
131
132 void AshNativeCursorManager::SetVisibility(
133     bool visible,
134     views::corewm::NativeCursorManagerDelegate* delegate) {
135   delegate->CommitVisibility(visible);
136
137   if (visible) {
138     SetCursor(delegate->GetCursor(), delegate);
139   } else {
140     gfx::NativeCursor invisible_cursor(ui::kCursorNone);
141     image_cursors_->SetPlatformCursor(&invisible_cursor);
142     SetCursorOnAllRootWindows(invisible_cursor);
143   }
144
145   NotifyCursorVisibilityChange(visible);
146 }
147
148 void AshNativeCursorManager::SetMouseEventsEnabled(
149     bool enabled,
150     views::corewm::NativeCursorManagerDelegate* delegate) {
151   delegate->CommitMouseEventsEnabled(enabled);
152
153   if (enabled) {
154     aura::Env::GetInstance()->set_last_mouse_location(
155         disabled_cursor_location_);
156   } else {
157     disabled_cursor_location_ = aura::Env::GetInstance()->last_mouse_location();
158   }
159
160   SetVisibility(delegate->IsCursorVisible(), delegate);
161   NotifyMouseEventsEnableStateChange(enabled);
162 }
163
164 }  // namespace ash