#ifndef REMOTING_HOST_LINUX_WAYLAND_MANAGER_H_
#define REMOTING_HOST_LINUX_WAYLAND_MANAGER_H_
#include <memory>
#include <xkbcommon/xkbcommon.h>
#include "base/callback_list.h"
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/single_thread_task_runner.h"
#include "remoting/host/base/screen_resolution.h"
#include "remoting/host/linux/wayland_connection.h"
#include "remoting/host/linux/wayland_display.h"
#include "remoting/host/linux/wayland_seat.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_capture_metadata.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"
namespace remoting {
class WaylandManager {
public:
using DesktopMetadataCallbackSignature = void(webrtc::DesktopCaptureMetadata);
using DesktopMetadataCallback =
base::RepeatingCallback<DesktopMetadataCallbackSignature>;
using UpdateScreenResolutionSignature = void(ScreenResolution,
webrtc::ScreenId);
using UpdateScreenResolutionCallback =
base::RepeatingCallback<UpdateScreenResolutionSignature>;
using KeyboardLayoutCallback =
base::RepeatingCallback<void(XkbKeyMapUniquePtr)>;
using KeyboardModifiersCallbackSignature = void(uint32_t group);
using KeyboardModifiersCallback =
base::RepeatingCallback<KeyboardModifiersCallbackSignature>;
using ClipboardMetadataCallbackSignature =
void(webrtc::DesktopCaptureMetadata);
using ClipboardMetadataCallback =
base::RepeatingCallback<ClipboardMetadataCallbackSignature>;
WaylandManager();
~WaylandManager();
WaylandManager(const WaylandManager&) = delete;
WaylandManager& operator=(const WaylandManager&) = delete;
static WaylandManager* Get();
void CleanupRunnerForTest();
void Init(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
void AddCapturerMetadataCallback(DesktopMetadataCallback callback);
void AddCapturerDestroyedCallback(base::OnceClosure callback);
void OnDesktopCapturerMetadata(webrtc::DesktopCaptureMetadata metadata);
void OnDesktopCapturerDestroyed();
void AddClipboardMetadataCallback(DesktopMetadataCallback callback);
void OnClipboardMetadata(webrtc::DesktopCaptureMetadata metadata);
void AddUpdateScreenResolutionCallback(
UpdateScreenResolutionCallback callback);
void OnUpdateScreenResolution(ScreenResolution resolution,
webrtc::ScreenId screen_id);
void SetKeyboardLayoutCallback(KeyboardLayoutCallback callback);
void OnKeyboardLayout(XkbKeyMapUniquePtr);
void AddKeyboardModifiersCallback(KeyboardModifiersCallback callback);
void OnKeyboardModifiers(uint32_t group);
DesktopDisplayInfo GetCurrentDisplayInfo();
void SetSeatPresentCallback(WaylandSeat::OnSeatPresentCallback callback);
void SetCapabilityCallbacks(base::OnceClosure keyboard_capability_callback,
base::OnceClosure pointer_capability_callback);
private:
friend class WaylandSeat;
void OnSeatKeyboardCapability();
void OnSeatKeyboardCapabilityRevoked();
void OnSeatPointerCapability();
void OnSeatPointerCapabilityRevoked();
SEQUENCE_CHECKER(sequence_checker_);
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
std::unique_ptr<WaylandConnection> wayland_connection_;
DesktopMetadataCallback capturer_metadata_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
UpdateScreenResolutionCallback screen_resolution_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
KeyboardLayoutCallback keyboard_layout_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
base::RepeatingCallbackList<KeyboardModifiersCallbackSignature>
keyboard_modifier_callbacks_ GUARDED_BY_CONTEXT(sequence_checker_);
ClipboardMetadataCallback clipboard_metadata_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
base::OnceClosure keyboard_capability_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
base::OnceClosure pointer_capability_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
base::OnceClosure capturer_destroyed_callback_
GUARDED_BY_CONTEXT(sequence_checker_);
XkbKeyMapUniquePtr keymap_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
bool is_keyboard_capability_acquired_ GUARDED_BY_CONTEXT(sequence_checker_) =
false;
bool is_pointer_capability_acquired_ GUARDED_BY_CONTEXT(sequence_checker_) =
false;
};
}
#endif