Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7293)

Unified Diff: ash/wm/native_cursor_manager_ash_mus.cc

Issue 2932563002: Implement cursor changing on Mushrome (Closed)
Patch Set: oshima patch take 2 Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/wm/native_cursor_manager_ash_mus.h ('k') | ash/wm/native_cursor_manager_ash_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « ash/wm/native_cursor_manager_ash_mus.h ('k') | ash/wm/native_cursor_manager_ash_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698