| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_EXO_WAYLAND_ZAURA_OUTPUT_MANAGER_V2_H_ |
| #define COMPONENTS_EXO_WAYLAND_ZAURA_OUTPUT_MANAGER_V2_H_ |
| |
| #include <unordered_set> |
| |
| #include "base/functional/callback.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "components/exo/wayland/output_configuration_change.h" |
| |
| struct wl_resource; |
| struct wl_client; |
| |
| namespace exo::wayland { |
| |
| class WaylandDisplayOutput; |
| |
| inline constexpr uint32_t kZAuraOutputManagerV2Version = 1; |
| |
| void bind_aura_output_manager_v2(wl_client* client, |
| void* data, |
| uint32_t version, |
| uint32_t id); |
| |
| // This class is responsible for propagating information about display |
| // configuration state changes atomically to participating clients. |
| class AuraOutputManagerV2 { |
| public: |
| using ActiveOutputGetter = base::RepeatingCallback<WaylandOutputList()>; |
| |
| // Used to manage the lifetime of client-bound handles to the aura output |
| // manager. |
| class UserData { |
| public: |
| UserData(AuraOutputManagerV2* output_manager, |
| wl_resource* outout_manager_resouce); |
| ~UserData(); |
| |
| private: |
| const base::WeakPtr<AuraOutputManagerV2> output_manager_; |
| const raw_ptr<wl_resource> outout_manager_resouce_; |
| }; |
| |
| explicit AuraOutputManagerV2(ActiveOutputGetter active_output_getter); |
| AuraOutputManagerV2(const AuraOutputManagerV2&) = delete; |
| AuraOutputManagerV2& operator=(const AuraOutputManagerV2&) = delete; |
| virtual ~AuraOutputManagerV2(); |
| |
| // Called when the system's display configuration has changed. Returns true if |
| // changes were propagated to clients and a done event is necessary to |
| // complete the transaction. |
| bool OnDidProcessDisplayChanges( |
| const OutputConfigurationChange& configuration_change); |
| |
| // Dispatches the activated event to all bound clients for the global |
| // `output`. |
| void SendOutputActivated(const WaylandDisplayOutput& output); |
| |
| // Notifies clients of the end of the display configuration change |
| // transaction. |
| void SendDone(); |
| |
| // Called by UserData when the wrapped resource is created and destroyed |
| // respectively. |
| void Register(wl_resource* manager_resource); |
| void Unregister(wl_resource* manager_resource); |
| |
| base::WeakPtr<AuraOutputManagerV2> GetWeakPtr(); |
| |
| private: |
| // Dispatches output metrics conditional on `changed_metrics` to all bound |
| // clients for the global `output`. Returns true if updates were dispatched. |
| bool SendOutputMetrics(const WaylandDisplayOutput& output, |
| uint32_t changed_metrics); |
| |
| // Dispatches output metrics to a specific client bound to the output manager. |
| void SendOutputMetricsForClient(const WaylandDisplayOutput& output, |
| wl_resource* manager_resource); |
| |
| // A set of resources for clients bound to the aura output manager global. |
| std::unordered_set<raw_ptr<wl_resource, CtnExperimental>> manager_resources_; |
| |
| // Gets the currently active outputs tracked by the server. |
| const ActiveOutputGetter active_output_getter_; |
| |
| base::WeakPtrFactory<AuraOutputManagerV2> weak_factory_{this}; |
| }; |
| |
| } // namespace exo::wayland |
| |
| #endif // COMPONENTS_EXO_WAYLAND_ZAURA_OUTPUT_MANAGER_V2_H_ |