Index: ash/wm/native_cursor_manager_ash_mus.cc |
diff --git a/ash/wm/ash_native_cursor_manager.cc b/ash/wm/native_cursor_manager_ash_mus.cc |
similarity index 53% |
rename from ash/wm/ash_native_cursor_manager.cc |
rename to ash/wm/native_cursor_manager_ash_mus.cc |
index 45a3ef82f59b4d8ffeabbd7e72ab466b331897da..a53c6b6dbdd937057e0b36a748e49cca9403671c 100644 |
--- a/ash/wm/ash_native_cursor_manager.cc |
+++ b/ash/wm/native_cursor_manager_ash_mus.cc |
@@ -1,28 +1,48 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "ash/wm/ash_native_cursor_manager.h" |
+#include "ash/wm/native_cursor_manager_ash_mus.h" |
#include "ash/display/cursor_window_controller.h" |
#include "ash/display/window_tree_host_manager.h" |
#include "ash/shell.h" |
-#include "base/logging.h" |
+#include "ash/shell_port.h" |
#include "ui/aura/env.h" |
+#include "ui/aura/mus/window_port_mus.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/aura/window_tree_host.h" |
-#include "ui/base/cursor/cursor.h" |
#include "ui/base/cursor/image_cursors.h" |
#include "ui/base/layout.h" |
+#include "ui/wm/core/cursor_manager.h" |
+ |
+#if defined(USE_OZONE) |
+#include "ui/base/cursor/ozone/cursor_data_factory_ozone.h" |
+#endif |
namespace ash { |
namespace { |
+// We want to forward these things to the window tree client. |
+ |
void SetCursorOnAllRootWindows(gfx::NativeCursor cursor) { |
- aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); |
- for (aura::Window::Windows::iterator iter = root_windows.begin(); |
- iter != root_windows.end(); ++iter) |
- (*iter)->GetHost()->SetCursor(cursor); |
+ ui::CursorData mojo_cursor; |
+ if (cursor.platform()) { |
+#if defined(USE_OZONE) |
+ mojo_cursor = ui::CursorDataFactoryOzone::GetCursorData(cursor.platform()); |
+#else |
+ NOTIMPLEMENTED() |
+ << "Can't pass native platform cursors on non-ozone platforms"; |
+ mojo_cursor = ui::CursorData(ui::CursorType::kPointer); |
+#endif |
+ } else { |
+ mojo_cursor = ui::CursorData(cursor.native_type()); |
+ } |
+ |
+ // As the window manager, tell mus to use |mojo_cursor| everywhere. We do |
+ // this instead of trying to set per-window because otherwise we run into the |
+ // event targeting issue. |
+ ShellPort::Get()->SetGlobalOverrideCursor(mojo_cursor); |
Shell::Get() |
->window_tree_host_manager() |
@@ -31,6 +51,13 @@ void SetCursorOnAllRootWindows(gfx::NativeCursor cursor) { |
} |
void NotifyCursorVisibilityChange(bool visible) { |
+ // Communicate the cursor visibility state to the mus server. |
+ if (visible) |
+ ShellPort::Get()->ShowCursor(); |
+ else |
+ ShellPort::Get()->HideCursor(); |
+ |
+ // Communicate the cursor visibility change to our local root window objects. |
aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); |
for (aura::Window::Windows::iterator iter = root_windows.begin(); |
iter != root_windows.end(); ++iter) |
@@ -52,19 +79,37 @@ void NotifyMouseEventsEnableStateChange(bool enabled) { |
} // namespace |
-AshNativeCursorManager::AshNativeCursorManager() |
- : native_cursor_enabled_(true), image_cursors_(new ui::ImageCursors) {} |
+NativeCursorManagerAshMus::NativeCursorManagerAshMus() { |
+#if defined(USE_OZONE) |
+ // If we're in a mus client, we aren't going to have all of ozone initialized |
+ // even though we're in an ozone build. All the hard coded USE_OZONE ifdefs |
+ // that handle cursor code expect that there will be a CursorFactoryOzone |
+ // instance. Partially initialize the ozone cursor internals here, like we |
+ // partially initialize other ozone subsystems in |
+ // ChromeBrowserMainExtraPartsViews. |
+ cursor_factory_ozone_ = base::MakeUnique<ui::CursorDataFactoryOzone>(); |
+ image_cursors_ = base::MakeUnique<ui::ImageCursors>(); |
+#endif |
+} |
-AshNativeCursorManager::~AshNativeCursorManager() {} |
+NativeCursorManagerAshMus::~NativeCursorManagerAshMus() = default; |
-void AshNativeCursorManager::SetNativeCursorEnabled(bool enabled) { |
+void NativeCursorManagerAshMus::SetNativeCursorEnabled(bool enabled) { |
native_cursor_enabled_ = enabled; |
::wm::CursorManager* cursor_manager = Shell::Get()->cursor_manager(); |
SetCursor(cursor_manager->GetCursor(), cursor_manager); |
} |
-void AshNativeCursorManager::SetDisplay( |
+float NativeCursorManagerAshMus::GetScale() const { |
+ return image_cursors_->GetScale(); |
+} |
+ |
+display::Display::Rotation NativeCursorManagerAshMus::GetRotation() const { |
+ return image_cursors_->GetRotation(); |
+} |
+ |
+void NativeCursorManagerAshMus::SetDisplay( |
const display::Display& display, |
::wm::NativeCursorManagerDelegate* delegate) { |
DCHECK(display.is_valid()); |
@@ -87,20 +132,22 @@ void AshNativeCursorManager::SetDisplay( |
->SetDisplay(display); |
} |
-void AshNativeCursorManager::SetCursor( |
+void NativeCursorManagerAshMus::SetCursor( |
gfx::NativeCursor cursor, |
::wm::NativeCursorManagerDelegate* delegate) { |
- if (native_cursor_enabled_) { |
- image_cursors_->SetPlatformCursor(&cursor); |
- } else { |
- gfx::NativeCursor invisible_cursor(ui::CursorType::kNone); |
- image_cursors_->SetPlatformCursor(&invisible_cursor); |
- if (cursor == ui::CursorType::kCustom) { |
- // Fall back to the default pointer cursor for now. (crbug.com/476078) |
- // TODO(oshima): support custom cursor. |
- cursor = ui::CursorType::kPointer; |
+ if (image_cursors_) { |
+ if (native_cursor_enabled_) { |
+ image_cursors_->SetPlatformCursor(&cursor); |
} else { |
- cursor.SetPlatformCursor(invisible_cursor.platform()); |
+ gfx::NativeCursor invisible_cursor(ui::CursorType::kNone); |
+ image_cursors_->SetPlatformCursor(&invisible_cursor); |
+ if (cursor == ui::CursorType::kCustom) { |
+ // Fall back to the default pointer cursor for now. (crbug.com/476078) |
+ // TODO(oshima): support custom cursor. |
+ cursor = ui::CursorType::kPointer; |
+ } else { |
+ cursor.SetPlatformCursor(invisible_cursor.platform()); |
+ } |
} |
} |
cursor.set_device_scale_factor(image_cursors_->GetScale()); |
@@ -111,23 +158,7 @@ void AshNativeCursorManager::SetCursor( |
SetCursorOnAllRootWindows(cursor); |
} |
-void AshNativeCursorManager::SetCursorSet( |
- ui::CursorSetType cursor_set, |
- ::wm::NativeCursorManagerDelegate* delegate) { |
- image_cursors_->SetCursorSet(cursor_set); |
- delegate->CommitCursorSet(cursor_set); |
- |
- // Sets the cursor to reflect the scale change immediately. |
- if (delegate->IsCursorVisible()) |
- SetCursor(delegate->GetCursor(), delegate); |
- |
- Shell::Get() |
- ->window_tree_host_manager() |
- ->cursor_window_controller() |
- ->SetCursorSet(cursor_set); |
-} |
- |
-void AshNativeCursorManager::SetVisibility( |
+void NativeCursorManagerAshMus::SetVisibility( |
bool visible, |
::wm::NativeCursorManagerDelegate* delegate) { |
delegate->CommitVisibility(visible); |
@@ -143,7 +174,15 @@ void AshNativeCursorManager::SetVisibility( |
NotifyCursorVisibilityChange(visible); |
} |
-void AshNativeCursorManager::SetMouseEventsEnabled( |
+void NativeCursorManagerAshMus::SetCursorSet( |
+ ui::CursorSetType cursor_set, |
+ ::wm::NativeCursorManagerDelegate* delegate) { |
+ // We can't just hand this off to ImageCursors like we do in the classic ash |
+ // case. We need to collaborate with the mus server to fully implement this. |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void NativeCursorManagerAshMus::SetMouseEventsEnabled( |
bool enabled, |
::wm::NativeCursorManagerDelegate* delegate) { |
delegate->CommitMouseEventsEnabled(enabled); |
@@ -156,6 +195,7 @@ void AshNativeCursorManager::SetMouseEventsEnabled( |
} |
SetVisibility(delegate->IsCursorVisible(), delegate); |
+ |
NotifyMouseEventsEnableStateChange(enabled); |
} |