1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_HOST_LINUX_GNOME_INTERACTION_STRATEGY_H_
#define REMOTING_HOST_LINUX_GNOME_INTERACTION_STRATEGY_H_
#include <memory>
#include <string>
#include <tuple>
#include "base/functional/callback.h"
#include "base/functional/callback_forward.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/types/expected.h"
#include "remoting/host/base/loggable.h"
#include "remoting/host/desktop_interaction_strategy.h"
#include "remoting/host/linux/ei_sender_session.h"
#include "remoting/host/linux/gdbus_connection_ref.h"
#include "remoting/host/linux/gdbus_fd_list.h"
#include "remoting/host/linux/gvariant_ref.h"
#include "remoting/host/linux/pipewire_capture_stream.h"
namespace remoting {
class GnomeInteractionStrategy : public DesktopInteractionStrategy {
public:
GnomeInteractionStrategy(const GnomeInteractionStrategy&) = delete;
GnomeInteractionStrategy& operator=(const GnomeInteractionStrategy&) = delete;
~GnomeInteractionStrategy() override;
// Correspond to the equivalent methods on DesktopEnvironment.
std::unique_ptr<ActionExecutor> CreateActionExecutor() override;
std::unique_ptr<AudioCapturer> CreateAudioCapturer() override;
std::unique_ptr<InputInjector> CreateInputInjector() override;
std::unique_ptr<DesktopResizer> CreateDesktopResizer() override;
std::unique_ptr<DesktopCapturer> CreateVideoCapturer(
webrtc::ScreenId id) override;
std::unique_ptr<webrtc::MouseCursorMonitor> CreateMouseCursorMonitor()
override;
std::unique_ptr<KeyboardLayoutMonitor> CreateKeyboardLayoutMonitor(
base::RepeatingCallback<void(const protocol::KeyboardLayout&)> callback)
override;
std::unique_ptr<ActiveDisplayMonitor> CreateActiveDisplayMonitor(
base::RepeatingCallback<void(webrtc::ScreenId)> callback) override;
// Used by DesktopEnvironment implementations.
std::unique_ptr<DesktopDisplayInfoMonitor> CreateDisplayInfoMonitor()
override;
std::unique_ptr<LocalInputMonitor> CreateLocalInputMonitor() override;
private:
friend class GnomeInteractionStrategyFactory;
friend class GnomeInputInjector;
using InitCallback =
base::OnceCallback<void(base::expected<void, std::string>)>;
explicit GnomeInteractionStrategy(
scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
template <typename SuccessType, typename String>
GDBusConnectionRef::CallCallback<SuccessType> CheckResultAndContinue(
void (GnomeInteractionStrategy::*success_method)(SuccessType),
String&& error_context);
void OnInitError(std::string_view what, Loggable why);
void Init(InitCallback callback);
void OnConnectionCreated(GDBusConnectionRef connection);
void OnSessionCreated(std::tuple<gvariant::ObjectPath> args);
void OnGotSessionId(std::string session_id);
void OnScreenCastSessionCreated(std::tuple<gvariant::ObjectPath> args);
void OnSessionStarted(std::tuple<>);
void OnEisFd(std::pair<std::tuple<GDBusFdList::Handle>, GDBusFdList> args);
void OnEiSession(std::unique_ptr<EiSenderSession> ei_session);
void OnStreamCreated(std::tuple<gvariant::ObjectPath> args);
void OnStreamParameters(GVariantRef<"a{sv}"> parameters);
void OnStreamStarted(std::tuple<> args);
void OnPipeWireStreamAdded(std::string mapping_id,
std::tuple<std::uint32_t> args);
void InjectKeyEvent(const protocol::KeyEvent& event);
void InjectTextEvent(const protocol::TextEvent& event);
void InjectMouseEvent(const protocol::MouseEvent& event);
GDBusConnectionRef connection_ GUARDED_BY_CONTEXT(sequence_checker_);
InitCallback init_callback_;
gvariant::ObjectPath session_path_ GUARDED_BY_CONTEXT(sequence_checker_);
gvariant::ObjectPath screencast_session_path_
GUARDED_BY_CONTEXT(sequence_checker_);
std::unique_ptr<EiSenderSession> ei_session_
GUARDED_BY_CONTEXT(sequence_checker_);
gvariant::ObjectPath stream_path_ GUARDED_BY_CONTEXT(sequence_checker_);
std::unique_ptr<GDBusConnectionRef::SignalSubscription> stream_added_signal_
GUARDED_BY_CONTEXT(sequence_checker_);
PipewireCaptureStream capture_stream_ GUARDED_BY_CONTEXT(sequence_checker_);
scoped_refptr<base::SequencedTaskRunner> ui_task_runner_
GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<GnomeInteractionStrategy> weak_ptr_factory_;
};
class GnomeInteractionStrategyFactory
: public DesktopInteractionStrategyFactory {
public:
explicit GnomeInteractionStrategyFactory(
scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
~GnomeInteractionStrategyFactory() override;
void Create(const DesktopEnvironmentOptions& options,
CreateCallback callback) override;
private:
static void OnSessionInit(
std::unique_ptr<GnomeInteractionStrategy> session,
base::OnceCallback<void(std::unique_ptr<DesktopInteractionStrategy>)>
callback,
base::expected<void, std::string> result);
scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
};
} // namespace remoting
#endif // REMOTING_HOST_LINUX_GNOME_INTERACTION_STRATEGY_H_
|