#ifndef REMOTING_HOST_LINUX_GNOME_DISPLAY_CONFIG_MONITOR_H_
#define REMOTING_HOST_LINUX_GNOME_DISPLAY_CONFIG_MONITOR_H_
#include <optional>
#include "base/callback_list.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "remoting/host/linux/gnome_display_config_dbus_client.h"
namespace remoting {
struct GnomeDisplayConfig;
class GnomeDisplayConfigMonitor {
public:
struct Subscription {
~Subscription();
private:
friend class GnomeDisplayConfigMonitor;
Subscription();
base::CallbackListSubscription subscription_;
base::WeakPtrFactory<Subscription> weak_factory_{this};
};
using CallbackSignature = void(const GnomeDisplayConfig&);
using Callback = base::RepeatingCallback<CallbackSignature>;
explicit GnomeDisplayConfigMonitor(
base::WeakPtr<GnomeDisplayConfigDBusClient> display_config_client);
~GnomeDisplayConfigMonitor();
GnomeDisplayConfigMonitor(const GnomeDisplayConfigMonitor&) = delete;
GnomeDisplayConfigMonitor& operator=(const GnomeDisplayConfigMonitor&) =
delete;
[[nodiscard]] std::unique_ptr<Subscription> AddCallback(
Callback callback,
bool call_with_current_config);
const std::optional<GnomeDisplayConfig>& current_config() const {
return current_config_;
}
base::WeakPtr<GnomeDisplayConfigMonitor> GetWeakPtr();
private:
void Start();
void QueryDisplayConfig();
void OnGnomeDisplayConfigReceived(GnomeDisplayConfig config);
void CallWithCurrentConfig();
std::optional<GnomeDisplayConfig> current_config_
GUARDED_BY_CONTEXT(sequence_checker_);
base::WeakPtr<GnomeDisplayConfigDBusClient> display_config_client_
GUARDED_BY_CONTEXT(sequence_checker_);
std::unique_ptr<GnomeDisplayConfigDBusClient::Subscription>
monitors_changed_subscription_ GUARDED_BY_CONTEXT(sequence_checker_);
base::RepeatingCallbackList<void(const GnomeDisplayConfig&)> callbacks_
GUARDED_BY_CONTEXT(sequence_checker_);
base::OnceCallbackList<void(const GnomeDisplayConfig&)>
callbacks_pending_current_config_ GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<GnomeDisplayConfigMonitor> weak_ptr_factory_{this};
};
}
#endif