blob: d33e3209023652c190f87535de44b7f5f65f5c1a [file] [log] [blame]
// Copyright (c) 2012 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 "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
#include <utility>
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/cursor/cursor_loader.h"
namespace views {
DesktopNativeCursorManager::DesktopNativeCursorManager()
: cursor_loader_(ui::CursorLoader::Create()) {}
DesktopNativeCursorManager::~DesktopNativeCursorManager() = default;
gfx::NativeCursor DesktopNativeCursorManager::GetInitializedCursor(
ui::CursorType type) {
gfx::NativeCursor cursor(type);
cursor_loader_->SetPlatformCursor(&cursor);
return cursor;
}
void DesktopNativeCursorManager::AddHost(aura::WindowTreeHost* host) {
hosts_.insert(host);
}
void DesktopNativeCursorManager::RemoveHost(aura::WindowTreeHost* host) {
hosts_.erase(host);
}
void DesktopNativeCursorManager::SetDisplay(
const display::Display& display,
wm::NativeCursorManagerDelegate* delegate) {
cursor_loader_->UnloadAll();
cursor_loader_->set_rotation(display.rotation());
cursor_loader_->set_scale(display.device_scale_factor());
SetCursor(delegate->GetCursor(), delegate);
}
void DesktopNativeCursorManager::SetCursor(
gfx::NativeCursor cursor,
wm::NativeCursorManagerDelegate* delegate) {
gfx::NativeCursor new_cursor = cursor;
cursor_loader_->SetPlatformCursor(&new_cursor);
delegate->CommitCursor(new_cursor);
if (delegate->IsCursorVisible()) {
for (auto* host : hosts_)
host->SetCursor(new_cursor);
}
}
void DesktopNativeCursorManager::SetVisibility(
bool visible,
wm::NativeCursorManagerDelegate* delegate) {
delegate->CommitVisibility(visible);
if (visible) {
SetCursor(delegate->GetCursor(), delegate);
} else {
gfx::NativeCursor invisible_cursor(ui::CursorType::kNone);
cursor_loader_->SetPlatformCursor(&invisible_cursor);
for (auto* host : hosts_)
host->SetCursor(invisible_cursor);
}
for (auto* host : hosts_)
host->OnCursorVisibilityChanged(visible);
}
void DesktopNativeCursorManager::SetCursorSize(
ui::CursorSize cursor_size,
wm::NativeCursorManagerDelegate* delegate) {
NOTIMPLEMENTED();
}
void DesktopNativeCursorManager::SetMouseEventsEnabled(
bool enabled,
wm::NativeCursorManagerDelegate* delegate) {
delegate->CommitMouseEventsEnabled(enabled);
// TODO(erg): In the ash version, we set the last mouse location on Env. I'm
// not sure this concept makes sense on the desktop.
SetVisibility(delegate->IsCursorVisible(), delegate);
for (auto* host : hosts_)
host->dispatcher()->OnMouseEventsEnableStateChanged(enabled);
}
} // namespace views