| // Copyright 2019 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 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 "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/x11_types.h" |
| |
| namespace views { |
| class DesktopScreenX11Test; |
| } |
| |
| namespace ui { |
| class X11ScreenOzoneTest; |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // XDisplayManager class |
| // |
| // Responsible for fetching and maintaining list of |display::Display|s |
| // representing X11 screens connected to the system. XRandR extension is used |
| // when version >= 1.3 is available, otherwise it falls back to |
| // |DefaultScreenOfDisplay| Xlib API. |
| // |
| // Scale Factor information and simple hooks are delegated to API clients |
| // through |XDisplayManager::Delegate| interface. To get notifications about |
| // dynamic display changes, clients must register |DisplayObserver| instances |
| // and feed |XDisplayManager| with |XEvent|s. |
| // |
| // All bounds and size values are assumed to be expressed in pixels. |
| class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager |
| : public X11WorkspaceHandler::Delegate { |
| public: |
| class Delegate; |
| |
| explicit XDisplayManager(Delegate* delegate); |
| ~XDisplayManager() override; |
| |
| void Init(); |
| bool IsXrandrAvailable() const; |
| bool CanProcessEvent(const XEvent& xev); |
| bool ProcessEvent(XEvent* 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; |
| |
| // Returns current workspace. |
| std::string GetCurrentWorkspace(); |
| |
| private: |
| friend class ui::X11ScreenOzoneTest; |
| friend class views::DesktopScreenX11Test; |
| |
| void SetDisplayList(std::vector<display::Display> displays); |
| void FetchDisplayList(); |
| |
| // X11WorkspaceHandler override: |
| void OnCurrentWorkspaceChanged(const std::string& new_workspace) override; |
| |
| Delegate* const delegate_; |
| std::vector<display::Display> displays_; |
| display::DisplayChangeNotifier change_notifier_; |
| |
| XDisplay* const xdisplay_; |
| XID x_root_window_; |
| int64_t primary_display_index_ = 0; |
| |
| // XRandR version. MAJOR * 100 + MINOR. Zero if no xrandr is present. |
| const int xrandr_version_; |
| |
| // The base of the event numbers used to represent XRandr events used in |
| // decoding events regarding output add/remove. |
| int xrandr_event_base_ = 0; |
| |
| // The task which fetches/updates display list info asynchronously. |
| base::CancelableOnceClosure update_task_; |
| |
| X11WorkspaceHandler workspace_handler_; |
| |
| DISALLOW_COPY_AND_ASSIGN(XDisplayManager); |
| }; |
| |
| class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager::Delegate { |
| public: |
| virtual ~Delegate() = default; |
| virtual void OnXDisplayListUpdated() = 0; |
| virtual float GetXDisplayScaleFactor() const = 0; |
| }; |
| |
| } // namespace ui |
| |
| #endif // UI_BASE_X_X11_DISPLAY_MANAGER_H_ |