blob: 18ac572f655dfe48e28d86f9303f3970ea6c6a32 [file] [log] [blame]
// Copyright 2018 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.
#ifndef COMPONENTS_EXO_WM_HELPER_CHROMEOS_H_
#define COMPONENTS_EXO_WM_HELPER_CHROMEOS_H_
#include <vector>
#include "ash/display/window_tree_host_manager.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "components/exo/vsync_timing_manager.h"
#include "components/exo/wm_helper.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "ui/aura/client/drag_drop_delegate.h"
#include "ui/base/cursor/cursor.h"
namespace ash {
class TabletModeObserver;
}
namespace aura {
class Window;
namespace client {
class CursorClient;
class FocusChangeObserver;
} // namespace client
} // namespace aura
namespace wm {
class ActivationChangeObserver;
}
namespace display {
class ManagedDisplayInfo;
}
namespace ui {
class EventHandler;
class DropTargetEvent;
} // namespace ui
namespace wm {
class ActivationChangeObserver;
}
namespace exo {
// A ChromeOS-specific helper class for accessing WindowManager related
// features.
class WMHelperChromeOS : public WMHelper,
public chromeos::PowerManagerClient::Observer,
public VSyncTimingManager::Delegate {
public:
WMHelperChromeOS();
WMHelperChromeOS(const WMHelperChromeOS&) = delete;
WMHelperChromeOS& operator=(const WMHelperChromeOS&) = delete;
~WMHelperChromeOS() override;
static WMHelperChromeOS* GetInstance();
void AddTabletModeObserver(ash::TabletModeObserver* observer);
void RemoveTabletModeObserver(ash::TabletModeObserver* observer);
void AddDisplayConfigurationObserver(
ash::WindowTreeHostManager::Observer* observer);
void RemoveDisplayConfigurationObserver(
ash::WindowTreeHostManager::Observer* observer);
void AddFrameThrottlingObserver();
void RemoveFrameThrottlingObserver();
// Overridden from WMHelper
void AddActivationObserver(wm::ActivationChangeObserver* observer) override;
void RemoveActivationObserver(
wm::ActivationChangeObserver* observer) override;
void AddFocusObserver(aura::client::FocusChangeObserver* observer) override;
void RemoveFocusObserver(
aura::client::FocusChangeObserver* observer) override;
void AddDragDropObserver(DragDropObserver* observer) override;
void RemoveDragDropObserver(DragDropObserver* observer) override;
void AddPowerObserver(WMHelper::PowerObserver* observer) override;
void RemovePowerObserver(WMHelper::PowerObserver* observer) override;
void SetDragDropDelegate(aura::Window*) override;
void ResetDragDropDelegate(aura::Window*) override;
VSyncTimingManager& GetVSyncTimingManager() override;
const display::ManagedDisplayInfo& GetDisplayInfo(
int64_t display_id) const override;
const std::vector<uint8_t>& GetDisplayIdentificationData(
int64_t display_id) const override;
bool GetActiveModeForDisplayId(
int64_t display_id,
display::ManagedDisplayMode* mode) const override;
aura::Window* GetPrimaryDisplayContainer(int container_id) override;
aura::Window* GetActiveWindow() const override;
aura::Window* GetFocusedWindow() const override;
aura::Window* GetRootWindowForNewWindows() const override;
aura::client::CursorClient* GetCursorClient() override;
aura::client::DragDropClient* GetDragDropClient() override;
void AddPreTargetHandler(ui::EventHandler* handler) override;
void PrependPreTargetHandler(ui::EventHandler* handler) override;
void RemovePreTargetHandler(ui::EventHandler* handler) override;
void AddPostTargetHandler(ui::EventHandler* handler) override;
void RemovePostTargetHandler(ui::EventHandler* handler) override;
bool InTabletMode() const override;
double GetDefaultDeviceScaleFactor() const override;
double GetDeviceScaleFactorForWindow(aura::Window* window) const override;
void SetDefaultScaleCancellation(bool default_scale_cancellation) override;
LifetimeManager* GetLifetimeManager() override;
aura::client::CaptureClient* GetCaptureClient() override;
// Overridden from aura::client::DragDropDelegate:
void OnDragEntered(const ui::DropTargetEvent& event) override;
aura::client::DragUpdateInfo OnDragUpdated(
const ui::DropTargetEvent& event) override;
void OnDragExited() override;
aura::client::DragDropDelegate::DropCallback GetDropCallback(
const ui::DropTargetEvent& event) override;
// Overridden from chromeos::PowerManagerClient::Observer:
void SuspendDone(base::TimeDelta sleep_duration) override;
void ScreenBrightnessChanged(
const power_manager::BacklightBrightnessChange& change) override;
void LidEventReceived(chromeos::PowerManagerClient::LidState state,
base::TimeTicks timestamp) override;
// Overridden from VSyncTimingManager::Delegate:
void AddVSyncParameterObserver(
mojo::PendingRemote<viz::mojom::VSyncParameterObserver> observer)
override;
private:
void PerformDrop(
std::vector<WMHelper::DragDropObserver::DropCallback> drop_callbacks,
std::unique_ptr<ui::OSExchangeData> data,
ui::mojom::DragOperation& output_drag_op);
base::ObserverList<DragDropObserver>::Unchecked drag_drop_observers_;
base::ObserverList<PowerObserver> power_observers_;
LifetimeManager lifetime_manager_;
VSyncTimingManager vsync_timing_manager_;
bool default_scale_cancellation_ = true;
base::WeakPtrFactory<WMHelperChromeOS> weak_ptr_factory_{this};
};
// Returnsn the default device scale factor used for
// ClientControlledShellSurface (ARC).
float GetDefaultDeviceScaleFactor();
} // namespace exo
#endif // COMPONENTS_EXO_WM_HELPER_CHROMEOS_H_