Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ui / views / widget / desktop_aura / desktop_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 "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
6
7 #include "ui/aura/window_event_dispatcher.h"
8 #include "ui/aura/window_tree_host.h"
9 #include "ui/base/cursor/cursor_loader.h"
10 #include "ui/views/widget/desktop_aura/desktop_cursor_loader_updater.h"
11
12 namespace views {
13
14 DesktopNativeCursorManager::DesktopNativeCursorManager(
15     scoped_ptr<DesktopCursorLoaderUpdater> cursor_loader_updater)
16     : cursor_loader_updater_(cursor_loader_updater.Pass()),
17       cursor_loader_(ui::CursorLoader::Create()) {
18   if (cursor_loader_updater_.get())
19     cursor_loader_updater_->OnCreate(1.0f, cursor_loader_.get());
20 }
21
22 DesktopNativeCursorManager::~DesktopNativeCursorManager() {
23 }
24
25 gfx::NativeCursor DesktopNativeCursorManager::GetInitializedCursor(int type) {
26   gfx::NativeCursor cursor(type);
27   cursor_loader_->SetPlatformCursor(&cursor);
28   return cursor;
29 }
30
31 void DesktopNativeCursorManager::AddHost(aura::WindowTreeHost* host) {
32   hosts_.insert(host);
33 }
34
35 void DesktopNativeCursorManager::RemoveHost(aura::WindowTreeHost* host) {
36   hosts_.erase(host);
37 }
38
39 void DesktopNativeCursorManager::SetDisplay(
40     const gfx::Display& display,
41     wm::NativeCursorManagerDelegate* delegate) {
42   cursor_loader_->UnloadAll();
43   cursor_loader_->set_rotation(display.rotation());
44   cursor_loader_->set_scale(display.device_scale_factor());
45
46   if (cursor_loader_updater_.get())
47     cursor_loader_updater_->OnDisplayUpdated(display, cursor_loader_.get());
48
49   SetCursor(delegate->GetCursor(), delegate);
50 }
51
52 void DesktopNativeCursorManager::SetCursor(
53     gfx::NativeCursor cursor,
54     wm::NativeCursorManagerDelegate* delegate) {
55   gfx::NativeCursor new_cursor = cursor;
56   cursor_loader_->SetPlatformCursor(&new_cursor);
57   delegate->CommitCursor(new_cursor);
58
59   if (delegate->IsCursorVisible()) {
60     for (Hosts::const_iterator i = hosts_.begin(); i != hosts_.end(); ++i)
61       (*i)->SetCursor(new_cursor);
62   }
63 }
64
65 void DesktopNativeCursorManager::SetVisibility(
66     bool visible,
67     wm::NativeCursorManagerDelegate* delegate) {
68   delegate->CommitVisibility(visible);
69
70   if (visible) {
71     SetCursor(delegate->GetCursor(), delegate);
72   } else {
73     gfx::NativeCursor invisible_cursor(ui::kCursorNone);
74     cursor_loader_->SetPlatformCursor(&invisible_cursor);
75     for (Hosts::const_iterator i = hosts_.begin(); i != hosts_.end(); ++i)
76       (*i)->SetCursor(invisible_cursor);
77   }
78
79   for (Hosts::const_iterator i = hosts_.begin(); i != hosts_.end(); ++i)
80     (*i)->OnCursorVisibilityChanged(visible);
81 }
82
83 void DesktopNativeCursorManager::SetCursorSet(
84     ui::CursorSetType cursor_set,
85     wm::NativeCursorManagerDelegate* delegate) {
86   NOTIMPLEMENTED();
87 }
88
89 void DesktopNativeCursorManager::SetMouseEventsEnabled(
90     bool enabled,
91     wm::NativeCursorManagerDelegate* delegate) {
92   delegate->CommitMouseEventsEnabled(enabled);
93
94   // TODO(erg): In the ash version, we set the last mouse location on Env. I'm
95   // not sure this concept makes sense on the desktop.
96
97   SetVisibility(delegate->IsCursorVisible(), delegate);
98
99   for (Hosts::const_iterator i = hosts_.begin(); i != hosts_.end(); ++i)
100     (*i)->dispatcher()->OnMouseEventsEnableStateChanged(enabled);
101 }
102
103 }  // namespace views