- add sources.
[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/display_controller.h"
8 #include "ash/display/mirror_window_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   Shell::RootWindowList root_windows =
21       Shell::GetInstance()->GetAllRootWindows();
22   for (Shell::RootWindowList::iterator iter = root_windows.begin();
23        iter != root_windows.end(); ++iter)
24     (*iter)->SetCursor(cursor);
25 #if defined(OS_CHROMEOS)
26   Shell::GetInstance()->display_controller()->
27       mirror_window_controller()->SetMirroredCursor(cursor);
28 #endif
29 }
30
31 void NotifyCursorVisibilityChange(bool visible) {
32   Shell::RootWindowList root_windows =
33       Shell::GetInstance()->GetAllRootWindows();
34   for (Shell::RootWindowList::iterator iter = root_windows.begin();
35        iter != root_windows.end(); ++iter)
36     (*iter)->OnCursorVisibilityChanged(visible);
37 #if defined(OS_CHROMEOS)
38   Shell::GetInstance()->display_controller()->mirror_window_controller()->
39       SetMirroredCursorVisibility(visible);
40 #endif
41 }
42
43 void NotifyMouseEventsEnableStateChange(bool enabled) {
44   Shell::RootWindowList root_windows =
45       Shell::GetInstance()->GetAllRootWindows();
46   for (Shell::RootWindowList::iterator iter = root_windows.begin();
47        iter != root_windows.end(); ++iter)
48     (*iter)->OnMouseEventsEnableStateChanged(enabled);
49   // Mirror window never process events.
50 }
51
52 }  // namespace
53
54 AshNativeCursorManager::AshNativeCursorManager()
55     : image_cursors_(new ImageCursors) {
56 }
57
58 AshNativeCursorManager::~AshNativeCursorManager() {
59 }
60
61 void AshNativeCursorManager::SetDisplay(
62     const gfx::Display& display,
63     views::corewm::NativeCursorManagerDelegate* delegate) {
64   if (image_cursors_->SetDisplay(display))
65     SetCursor(delegate->GetCurrentCursor(), delegate);
66 }
67
68 void AshNativeCursorManager::SetCursor(
69     gfx::NativeCursor cursor,
70     views::corewm::NativeCursorManagerDelegate* delegate) {
71   gfx::NativeCursor new_cursor = cursor;
72   image_cursors_->SetPlatformCursor(&new_cursor);
73   new_cursor.set_device_scale_factor(
74       image_cursors_->GetDisplay().device_scale_factor());
75
76   delegate->CommitCursor(new_cursor);
77
78   if (delegate->GetCurrentVisibility())
79     SetCursorOnAllRootWindows(new_cursor);
80 }
81
82 void AshNativeCursorManager::SetCursorSet(
83     ui::CursorSetType cursor_set,
84     views::corewm::NativeCursorManagerDelegate* delegate) {
85   image_cursors_->SetCursorSet(cursor_set);
86   delegate->CommitCursorSet(cursor_set);
87
88   // Sets the cursor to reflect the scale change immediately.
89   if (delegate->GetCurrentVisibility())
90     SetCursor(delegate->GetCurrentCursor(), delegate);
91 }
92
93 void AshNativeCursorManager::SetScale(
94     float scale,
95     views::corewm::NativeCursorManagerDelegate* delegate) {
96   image_cursors_->SetScale(scale);
97   delegate->CommitScale(scale);
98
99   // Sets the cursor to reflect the scale change immediately.
100   SetCursor(delegate->GetCurrentCursor(), delegate);
101 }
102
103 void AshNativeCursorManager::SetVisibility(
104     bool visible,
105     views::corewm::NativeCursorManagerDelegate* delegate) {
106   delegate->CommitVisibility(visible);
107
108   if (visible) {
109     SetCursor(delegate->GetCurrentCursor(), delegate);
110   } else {
111     gfx::NativeCursor invisible_cursor(ui::kCursorNone);
112     image_cursors_->SetPlatformCursor(&invisible_cursor);
113     SetCursorOnAllRootWindows(invisible_cursor);
114   }
115
116   NotifyCursorVisibilityChange(visible);
117 }
118
119 void AshNativeCursorManager::SetMouseEventsEnabled(
120     bool enabled,
121     views::corewm::NativeCursorManagerDelegate* delegate) {
122   delegate->CommitMouseEventsEnabled(enabled);
123
124   if (enabled) {
125     aura::Env::GetInstance()->set_last_mouse_location(
126         disabled_cursor_location_);
127   } else {
128     disabled_cursor_location_ = aura::Env::GetInstance()->last_mouse_location();
129   }
130
131   SetVisibility(delegate->GetCurrentVisibility(), delegate);
132   NotifyMouseEventsEnableStateChange(enabled);
133 }
134
135 }  // namespace ash