blob: b98bad649150d33bb718c4c7c28bc18ba4765f9f [file] [log] [blame]
// 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_CLIPBOARD_GNOME_H_
#define REMOTING_HOST_LINUX_CLIPBOARD_GNOME_H_
#include <cstdint>
#include <string>
#include <tuple>
#include "base/memory/weak_ptr.h"
#include "remoting/host/clipboard.h"
#include "remoting/host/linux/fd_string_reader.h"
#include "remoting/host/linux/fd_string_writer.h"
#include "remoting/host/linux/gdbus_connection_ref.h"
#include "remoting/host/linux/gvariant_ref.h"
namespace remoting {
// Clipboard implementation that uses the clipboard APIs from GNOME's
// D-Bus RemoteDesktop interface. These GNOME APIs only support a single
// "clipboard" selection - the middle-click "primary" selection is not
// supported.
class ClipboardGnome : public Clipboard {
public:
ClipboardGnome(GDBusConnectionRef connection,
gvariant::ObjectPath session_path);
ClipboardGnome(const ClipboardGnome&) = delete;
ClipboardGnome& operator=(const ClipboardGnome&) = delete;
~ClipboardGnome() override;
// Clipboard interface
void Start(
std::unique_ptr<protocol::ClipboardStub> client_clipboard) override;
void InjectClipboardEvent(const protocol::ClipboardEvent& event) override;
private:
// D-Bus signal handlers
void OnSelectionOwnerChanged(std::tuple<GVariantRef<"a{sv}">> args);
void OnSelectionTransfer(std::tuple<std::string, std::uint32_t> args);
void SelectionRead(std::string_view mime_type);
void OnSelectionReadReply(
base::expected<std::pair<std::tuple<GDBusFdList::Handle>, GDBusFdList>,
Loggable>);
void OnSelectionDataRead(base::expected<std::string, Loggable> result);
void SelectionWrite(std::uint32_t serial);
void OnSelectionWriteReply(
base::expected<std::pair<std::tuple<GDBusFdList::Handle>, GDBusFdList>,
Loggable> result);
void OnSelectionDataWritten(base::expected<void, Loggable>);
std::unique_ptr<protocol::ClipboardStub> client_clipboard_;
// Needed for making D-Bus calls on the RemoteDesktop session.
GDBusConnectionRef dbus_connection_;
gvariant::ObjectPath session_path_;
std::unique_ptr<GDBusConnectionRef::SignalSubscription>
selection_owner_changed_signal_;
std::unique_ptr<GDBusConnectionRef::SignalSubscription>
selection_transfer_signal_;
std::unique_ptr<FdStringReader> fd_string_reader_;
std::unique_ptr<FdStringWriter> fd_string_writer_;
// Holds the latest clipboard data injected by the client, owned by this
// process. It is stored so that other apps can read it when the user pastes
// the selection into some other app.
std::string clipboard_data_;
// Serial number for the current SelectionWrite process if any.
std::uint32_t selection_write_serial_;
base::WeakPtrFactory<ClipboardGnome> weak_factory_{this};
};
} // namespace remoting
#endif // REMOTING_HOST_LINUX_CLIPBOARD_GNOME_H_