blob: bad907df9a2edad5476b56ff1e7348ac8d9bebaa [file] [log] [blame]
// Copyright 2016 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 "components/exo/wm_helper.h"
#include "ash/public/cpp/config.h"
#include "ash/shell.h"
#include "ash/system/tray/system_tray_notifier.h"
#include "ash/wm/tablet_mode/tablet_mode_controller.h"
#include "base/memory/singleton.h"
#include "ui/aura/client/drag_drop_delegate.h"
#include "ui/aura/client/focus_client.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/display/manager/display_manager.h"
#include "ui/events/devices/input_device_manager.h"
#include "ui/wm/public/activation_client.h"
namespace exo {
namespace {
WMHelper* g_instance = nullptr;
aura::Window* GetPrimaryRoot() {
return ash::Shell::Get()->GetPrimaryRootWindow();
}
} // namespace
////////////////////////////////////////////////////////////////////////////////
// WMHelper, public:
WMHelper::WMHelper()
: vsync_manager_(
GetPrimaryRoot()->layer()->GetCompositor()->vsync_manager()) {}
WMHelper::~WMHelper() {}
// static
void WMHelper::SetInstance(WMHelper* helper) {
DCHECK_NE(!!helper, !!g_instance);
g_instance = helper;
}
// static
WMHelper* WMHelper::GetInstance() {
DCHECK(g_instance);
return g_instance;
}
// static
bool WMHelper::HasInstance() {
return !!g_instance;
}
void WMHelper::AddActivationObserver(wm::ActivationChangeObserver* observer) {
ash::Shell::Get()->activation_client()->AddObserver(observer);
}
void WMHelper::RemoveActivationObserver(
wm::ActivationChangeObserver* observer) {
ash::Shell::Get()->activation_client()->RemoveObserver(observer);
}
void WMHelper::AddFocusObserver(aura::client::FocusChangeObserver* observer) {
aura::client::GetFocusClient(GetPrimaryRoot())->AddObserver(observer);
}
void WMHelper::RemoveFocusObserver(
aura::client::FocusChangeObserver* observer) {
aura::client::GetFocusClient(GetPrimaryRoot())->RemoveObserver(observer);
}
void WMHelper::AddTabletModeObserver(ash::TabletModeObserver* observer) {
ash::Shell::Get()->tablet_mode_controller()->AddObserver(observer);
}
void WMHelper::RemoveTabletModeObserver(ash::TabletModeObserver* observer) {
ash::Shell::Get()->tablet_mode_controller()->RemoveObserver(observer);
}
void WMHelper::AddInputDeviceEventObserver(
ui::InputDeviceEventObserver* observer) {
ui::InputDeviceManager::GetInstance()->AddObserver(observer);
}
void WMHelper::RemoveInputDeviceEventObserver(
ui::InputDeviceEventObserver* observer) {
ui::InputDeviceManager::GetInstance()->RemoveObserver(observer);
}
void WMHelper::AddDisplayConfigurationObserver(
ash::WindowTreeHostManager::Observer* observer) {
ash::Shell::Get()->window_tree_host_manager()->AddObserver(observer);
}
void WMHelper::RemoveDisplayConfigurationObserver(
ash::WindowTreeHostManager::Observer* observer) {
ash::Shell::Get()->window_tree_host_manager()->RemoveObserver(observer);
}
void WMHelper::AddDragDropObserver(DragDropObserver* observer) {
drag_drop_observers_.AddObserver(observer);
}
void WMHelper::RemoveDragDropObserver(DragDropObserver* observer) {
drag_drop_observers_.RemoveObserver(observer);
}
void WMHelper::SetDragDropDelegate(aura::Window* window) {
aura::client::SetDragDropDelegate(window, this);
}
void WMHelper::ResetDragDropDelegate(aura::Window* window) {
aura::client::SetDragDropDelegate(window, nullptr);
}
void WMHelper::AddVSyncObserver(
ui::CompositorVSyncManager::Observer* observer) {
vsync_manager_->AddObserver(observer);
}
void WMHelper::RemoveVSyncObserver(
ui::CompositorVSyncManager::Observer* observer) {
vsync_manager_->RemoveObserver(observer);
}
void WMHelper::OnDragEntered(const ui::DropTargetEvent& event) {
for (DragDropObserver& observer : drag_drop_observers_)
observer.OnDragEntered(event);
}
int WMHelper::OnDragUpdated(const ui::DropTargetEvent& event) {
int valid_operation = ui::DragDropTypes::DRAG_NONE;
for (DragDropObserver& observer : drag_drop_observers_)
valid_operation = valid_operation | observer.OnDragUpdated(event);
return valid_operation;
}
void WMHelper::OnDragExited() {
for (DragDropObserver& observer : drag_drop_observers_)
observer.OnDragExited();
}
int WMHelper::OnPerformDrop(const ui::DropTargetEvent& event) {
for (DragDropObserver& observer : drag_drop_observers_)
observer.OnPerformDrop(event);
// TODO(hirono): Return the correct result instead of always returning
// DRAG_MOVE.
return ui::DragDropTypes::DRAG_MOVE;
}
const display::ManagedDisplayInfo& WMHelper::GetDisplayInfo(
int64_t display_id) const {
return ash::Shell::Get()->display_manager()->GetDisplayInfo(display_id);
}
aura::Window* WMHelper::GetPrimaryDisplayContainer(int container_id) {
return ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(),
container_id);
}
aura::Window* WMHelper::GetActiveWindow() const {
return ash::Shell::Get()->activation_client()->GetActiveWindow();
}
aura::Window* WMHelper::GetFocusedWindow() const {
aura::client::FocusClient* focus_client =
aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow());
return focus_client->GetFocusedWindow();
}
aura::client::CursorClient* WMHelper::GetCursorClient() {
return aura::client::GetCursorClient(ash::Shell::GetPrimaryRootWindow());
}
void WMHelper::AddPreTargetHandler(ui::EventHandler* handler) {
ash::Shell::Get()->AddPreTargetHandler(handler);
}
void WMHelper::PrependPreTargetHandler(ui::EventHandler* handler) {
ash::Shell::Get()->AddPreTargetHandler(
handler, ui::EventTarget::Priority::kAccessibility);
}
void WMHelper::RemovePreTargetHandler(ui::EventHandler* handler) {
ash::Shell::Get()->RemovePreTargetHandler(handler);
}
void WMHelper::AddPostTargetHandler(ui::EventHandler* handler) {
ash::Shell::Get()->AddPostTargetHandler(handler);
}
void WMHelper::RemovePostTargetHandler(ui::EventHandler* handler) {
ash::Shell::Get()->RemovePostTargetHandler(handler);
}
bool WMHelper::IsTabletModeWindowManagerEnabled() const {
return ash::Shell::Get()
->tablet_mode_controller()
->IsTabletModeWindowManagerEnabled();
}
double WMHelper::GetDefaultDeviceScaleFactor() const {
if (!display::Display::HasInternalDisplay())
return 1.0;
if (display::Display::HasForceDeviceScaleFactor())
return display::Display::GetForcedDeviceScaleFactor();
display::DisplayManager* display_manager =
ash::Shell::Get()->display_manager();
const display::ManagedDisplayInfo& display_info =
display_manager->GetDisplayInfo(display::Display::InternalDisplayId());
for (auto& mode : display_info.display_modes()) {
if (mode.is_default())
return mode.device_scale_factor();
}
NOTREACHED();
return 1.0f;
}
bool WMHelper::AreVerifiedSyncTokensNeeded() const {
// For mus and mash, the compositor isn't sharing GPU the channel with
// exo, so it cannot consume unverified sync token generated by exo.
// We need verify sync tokens before sending them to the compositor.
return ash::Shell::GetAshConfig() != ash::Config::CLASSIC;
}
} // namespace exo