blob: a56e86079ad2e10bb19d892fccd4687ba77b7721 [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 "base/memory/ptr_util.h"
#include "ui/aura/client/drag_drop_delegate.h"
#include "ui/base/dragdrop/drag_drop_types.h"
namespace exo {
namespace {
WMHelper* g_instance = nullptr;
}
////////////////////////////////////////////////////////////////////////////////
// WMHelper, public:
WMHelper::WMHelper() {}
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(ActivationObserver* observer) {
activation_observers_.AddObserver(observer);
}
void WMHelper::RemoveActivationObserver(ActivationObserver* observer) {
activation_observers_.RemoveObserver(observer);
}
void WMHelper::AddFocusObserver(FocusObserver* observer) {
focus_observers_.AddObserver(observer);
}
void WMHelper::RemoveFocusObserver(FocusObserver* observer) {
focus_observers_.RemoveObserver(observer);
}
void WMHelper::AddCursorObserver(CursorObserver* observer) {
cursor_observers_.AddObserver(observer);
}
void WMHelper::RemoveCursorObserver(CursorObserver* observer) {
cursor_observers_.RemoveObserver(observer);
}
void WMHelper::AddTabletModeObserver(TabletModeObserver* observer) {
tablet_mode_observers_.AddObserver(observer);
}
void WMHelper::RemoveTabletModeObserver(TabletModeObserver* observer) {
tablet_mode_observers_.RemoveObserver(observer);
}
void WMHelper::AddInputDeviceEventObserver(InputDeviceEventObserver* observer) {
input_device_event_observers_.AddObserver(observer);
}
void WMHelper::RemoveInputDeviceEventObserver(
InputDeviceEventObserver* observer) {
input_device_event_observers_.RemoveObserver(observer);
}
void WMHelper::AddDisplayConfigurationObserver(
DisplayConfigurationObserver* observer) {
display_config_observers_.AddObserver(observer);
}
void WMHelper::RemoveDisplayConfigurationObserver(
DisplayConfigurationObserver* observer) {
display_config_observers_.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(VSyncObserver* observer) {
vsync_observers_.AddObserver(observer);
// Mimic CompositorVSyncManager::AddObserver's notification on addition.
observer->OnUpdateVSyncParameters(vsync_timebase_, vsync_interval_);
}
void WMHelper::RemoveVSyncObserver(VSyncObserver* observer) {
vsync_observers_.RemoveObserver(observer);
}
void WMHelper::NotifyWindowActivated(aura::Window* gained_active,
aura::Window* lost_active) {
for (ActivationObserver& observer : activation_observers_)
observer.OnWindowActivated(gained_active, lost_active);
}
void WMHelper::NotifyWindowFocused(aura::Window* gained_focus,
aura::Window* lost_focus) {
for (FocusObserver& observer : focus_observers_)
observer.OnWindowFocused(gained_focus, lost_focus);
}
void WMHelper::NotifyCursorVisibilityChanged(bool is_visible) {
for (CursorObserver& observer : cursor_observers_)
observer.OnCursorVisibilityChanged(is_visible);
}
void WMHelper::NotifyCursorSizeChanged(ui::CursorSize cursor_size) {
for (CursorObserver& observer : cursor_observers_)
observer.OnCursorSizeChanged(cursor_size);
}
void WMHelper::NotifyCursorDisplayChanged(const display::Display& display) {
for (CursorObserver& observer : cursor_observers_)
observer.OnCursorDisplayChanged(display);
}
void WMHelper::NotifyTabletModeStarted() {
for (TabletModeObserver& observer : tablet_mode_observers_)
observer.OnTabletModeStarted();
}
void WMHelper::NotifyTabletModeEnding() {
for (TabletModeObserver& observer : tablet_mode_observers_)
observer.OnTabletModeEnding();
}
void WMHelper::NotifyTabletModeEnded() {
for (TabletModeObserver& observer : tablet_mode_observers_)
observer.OnTabletModeEnded();
}
void WMHelper::NotifyKeyboardDeviceConfigurationChanged() {
for (InputDeviceEventObserver& observer : input_device_event_observers_)
observer.OnKeyboardDeviceConfigurationChanged();
}
void WMHelper::NotifyDisplayConfigurationChanged() {
for (DisplayConfigurationObserver& observer : display_config_observers_)
observer.OnDisplayConfigurationChanged();
}
void WMHelper::NotifyUpdateVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) {
vsync_timebase_ = timebase;
vsync_interval_ = interval;
for (VSyncObserver& observer : vsync_observers_)
observer.OnUpdateVSyncParameters(timebase, interval);
}
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;
}
} // namespace exo