#ifndef UI_BASE_X_X11_DISPLAY_MANAGER_H_
#define UI_BASE_X_X11_DISPLAY_MANAGER_H_
#include <memory>
#include <vector>
#include "base/cancelable_callback.h"
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/x/x11_workspace_handler.h"
#include "ui/display/display.h"
#include "ui/display/display_change_notifier.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/x/event.h"
namespace views {
class DesktopScreenX11Test;
}
namespace ui {
class X11ScreenOzoneTest;
class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager
: public X11WorkspaceHandler::Delegate {
public:
class Delegate;
explicit XDisplayManager(Delegate* delegate);
XDisplayManager(const XDisplayManager&) = delete;
XDisplayManager& operator=(const XDisplayManager&) = delete;
~XDisplayManager() override;
void Init();
bool IsXrandrAvailable() const;
void OnEvent(const x11::Event& xev);
void UpdateDisplayList();
void DispatchDelayedDisplayListUpdate();
display::Display GetPrimaryDisplay() const;
void AddObserver(display::DisplayObserver* observer);
void RemoveObserver(display::DisplayObserver* observer);
const std::vector<display::Display>& displays() const { return displays_; }
gfx::Point GetCursorLocation() const;
std::string GetCurrentWorkspace();
private:
friend class ui::X11ScreenOzoneTest;
friend class views::DesktopScreenX11Test;
void SetDisplayList(std::vector<display::Display> displays);
void FetchDisplayList();
void OnCurrentWorkspaceChanged(const std::string& new_workspace) override;
const raw_ptr<Delegate> delegate_;
std::vector<display::Display> displays_;
display::DisplayChangeNotifier change_notifier_;
const raw_ptr<x11::Connection> connection_;
x11::Window x_root_window_;
int64_t primary_display_index_ = 0;
const int xrandr_version_;
base::CancelableOnceClosure update_task_;
X11WorkspaceHandler workspace_handler_;
};
class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager::Delegate {
public:
virtual ~Delegate() = default;
virtual void OnXDisplayListUpdated() = 0;
virtual float GetXDisplayScaleFactor() const = 0;
};
}
#endif