File fcitx5-5.1.17-waylandprotocols-revert-ext-data-control.patch of Package fcitx5
diff -urN fcitx5-5.1.17/CMakeLists.txt fcitx5-5.1.17.new/CMakeLists.txt
--- fcitx5-5.1.17/CMakeLists.txt 2025-12-22 14:18:01.000000000 +0800
+++ fcitx5-5.1.17.new/CMakeLists.txt 2026-02-07 13:09:14.689438272 +0800
@@ -169,7 +169,7 @@
set(REQUIRED_WAYLAND_COMPONENTS Client Cursor)
find_package(Wayland 1.22 REQUIRED COMPONENTS ${REQUIRED_WAYLAND_COMPONENTS})
find_package(WaylandScanner REQUIRED)
- find_package(WaylandProtocols 1.39 REQUIRED)
+ find_package(WaylandProtocols REQUIRED)
pkg_check_modules(Gio IMPORTED_TARGET gio-2.0)
endif()
diff -urN fcitx5-5.1.17/src/lib/fcitx-wayland/CMakeLists.txt fcitx5-5.1.17.new/src/lib/fcitx-wayland/CMakeLists.txt
--- fcitx5-5.1.17/src/lib/fcitx-wayland/CMakeLists.txt 2025-12-22 14:18:01.000000000 +0800
+++ fcitx5-5.1.17.new/src/lib/fcitx-wayland/CMakeLists.txt 2026-02-07 13:09:52.981927150 +0800
@@ -2,7 +2,6 @@
add_subdirectory(input-method)
add_subdirectory(input-method-v2)
add_subdirectory(wlr-data-control)
-add_subdirectory(ext-data-control)
add_subdirectory(blur)
add_subdirectory(plasma-window-management)
add_subdirectory(wlr-foreign-toplevel-management-unstable-v1)
diff -urN fcitx5-5.1.17/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.cpp fcitx5-5.1.17.new/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.cpp
--- fcitx5-5.1.17/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.cpp 2025-12-22 14:18:01.000000000 +0800
+++ fcitx5-5.1.17.new/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.cpp 1970-01-01 08:00:00.000000000 +0800
@@ -1,37 +0,0 @@
-#include "ext_data_control_source_v1.h"
-#include <cassert>
-namespace fcitx::wayland {
-const struct ext_data_control_source_v1_listener
- ExtDataControlSourceV1::listener = {
- [](void *data, ext_data_control_source_v1 *wldata, const char *mimeType,
- int32_t fd) {
- auto *obj = static_cast<ExtDataControlSourceV1 *>(data);
- assert(*obj == wldata);
- {
- return obj->send()(mimeType, fd);
- }
- },
- [](void *data, ext_data_control_source_v1 *wldata) {
- auto *obj = static_cast<ExtDataControlSourceV1 *>(data);
- assert(*obj == wldata);
- {
- return obj->cancelled()();
- }
- },
-};
-ExtDataControlSourceV1::ExtDataControlSourceV1(ext_data_control_source_v1 *data)
- : version_(ext_data_control_source_v1_get_version(data)), data_(data) {
- ext_data_control_source_v1_set_user_data(*this, this);
- ext_data_control_source_v1_add_listener(
- *this, &ExtDataControlSourceV1::listener, this);
-}
-void ExtDataControlSourceV1::destructor(ext_data_control_source_v1 *data) {
- auto version = ext_data_control_source_v1_get_version(data);
- if (version >= 1) {
- return ext_data_control_source_v1_destroy(data);
- }
-}
-void ExtDataControlSourceV1::offer(const char *mimeType) {
- return ext_data_control_source_v1_offer(*this, mimeType);
-}
-} // namespace fcitx::wayland
diff -urN fcitx5-5.1.17/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.h fcitx5-5.1.17.new/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.h
--- fcitx5-5.1.17/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.h 2025-12-22 14:18:01.000000000 +0800
+++ fcitx5-5.1.17.new/src/lib/fcitx-wayland/ext-data-control/ext_data_control_source_v1.h 1970-01-01 08:00:00.000000000 +0800
@@ -1,41 +0,0 @@
-#ifndef EXT_DATA_CONTROL_SOURCE_V1
-#define EXT_DATA_CONTROL_SOURCE_V1
-#include <memory>
-#include <wayland-client.h>
-#include "fcitx-utils/signals.h"
-#include "wayland-ext-data-control-unstable-v1-client-protocol.h"
-namespace fcitx::wayland {
-class ExtDataControlSourceV1 final {
-public:
- static constexpr const char *interface = "ext_data_control_source_v1";
- static constexpr const wl_interface *const wlInterface =
- &ext_data_control_source_v1_interface;
- static constexpr const uint32_t version = 1;
- typedef ext_data_control_source_v1 wlType;
- operator ext_data_control_source_v1 *() { return data_.get(); }
- ExtDataControlSourceV1(wlType *data);
- ExtDataControlSourceV1(ExtDataControlSourceV1 &&other) noexcept = delete;
- ExtDataControlSourceV1 &
- operator=(ExtDataControlSourceV1 &&other) noexcept = delete;
- auto actualVersion() const { return version_; }
- void *userData() const { return userData_; }
- void setUserData(void *userData) { userData_ = userData; }
- void offer(const char *mimeType);
- auto &send() { return sendSignal_; }
- auto &cancelled() { return cancelledSignal_; }
-
-private:
- static void destructor(ext_data_control_source_v1 *);
- static const struct ext_data_control_source_v1_listener listener;
- fcitx::Signal<void(const char *, int32_t)> sendSignal_;
- fcitx::Signal<void()> cancelledSignal_;
- uint32_t version_;
- void *userData_ = nullptr;
- UniqueCPtr<ext_data_control_source_v1, &destructor> data_;
-};
-static inline ext_data_control_source_v1 *
-rawPointer(ExtDataControlSourceV1 *p) {
- return p ? static_cast<ext_data_control_source_v1 *>(*p) : nullptr;
-}
-} // namespace fcitx::wayland
-#endif
diff -urN fcitx5-5.1.17/src/modules/clipboard/CMakeLists.txt fcitx5-5.1.17.new/src/modules/clipboard/CMakeLists.txt
--- fcitx5-5.1.17/src/modules/clipboard/CMakeLists.txt 2025-12-22 14:18:01.000000000 +0800
+++ fcitx5-5.1.17.new/src/modules/clipboard/CMakeLists.txt 2026-02-07 13:08:13.279364482 +0800
@@ -10,11 +10,7 @@
if (WAYLAND_FOUND)
target_sources(clipboard PRIVATE waylandclipboard.cpp)
- target_link_libraries(clipboard
- Fcitx5::Module::Wayland
- Fcitx5::Wayland::WLRDataControl
- Fcitx5::Wayland::ExtDataControl
- Pthread::Pthread)
+ target_link_libraries(clipboard Fcitx5::Module::Wayland Fcitx5::Wayland::WLRDataControl Pthread::Pthread)
endif()
install(TARGETS clipboard DESTINATION "${FCITX_INSTALL_ADDONDIR}")
diff -urN fcitx5-5.1.17/src/modules/clipboard/waylandclipboard.cpp fcitx5-5.1.17.new/src/modules/clipboard/waylandclipboard.cpp
--- fcitx5-5.1.17/src/modules/clipboard/waylandclipboard.cpp 2025-12-22 14:18:01.000000000 +0800
+++ fcitx5-5.1.17.new/src/modules/clipboard/waylandclipboard.cpp 2026-02-07 13:54:56.155120036 +0800
@@ -25,18 +25,13 @@
#include "fcitx-utils/unixfd.h"
#include "clipboard.h"
#include "display.h"
-#include "ext_data_control_manager_v1.h"
#include "wl_seat.h"
#include "zwlr_data_control_manager_v1.h"
+#include "zwlr_data_control_offer_v1.h"
namespace fcitx {
-DataOfferInterface::~DataOfferInterface() = default;
-
-DataDeviceInterface::~DataDeviceInterface() = default;
-
-uint64_t DataReaderThread::addTask(DataOfferInterface *offer,
- std::shared_ptr<UnixFD> fd,
+uint64_t DataReaderThread::addTask(DataOffer *offer, std::shared_ptr<UnixFD> fd,
DataOfferDataCallback callback) {
auto id = nextId_++;
if (id == 0) {
@@ -75,7 +70,7 @@
}
void DataReaderThread::addTaskOnWorker(
- uint64_t id, TrackableObjectReference<DataOfferInterface> offer,
+ uint64_t id, TrackableObjectReference<DataOffer> offer,
std::shared_ptr<UnixFD> fd, DataOfferDataCallback callback) {
// std::unordered_map's ref/pointer to element is stable.
auto &task = tasks_[id];
@@ -133,25 +128,22 @@
tasks_.erase(task->id_);
}
-template <typename DataControlOffer>
-DataOffer<DataControlOffer>::DataOffer(DataControlOffer *offer,
- bool ignorePassword)
+DataOffer::DataOffer(wayland::ZwlrDataControlOfferV1 *offer,
+ bool ignorePassword)
: offer_(offer), ignorePassword_(ignorePassword) {
offer_->setUserData(this);
conns_.emplace_back(offer_->offer().connect(
[this](const char *offer) { mimeTypes_.insert(offer); }));
}
-template <typename DataControlOffer>
-DataOffer<DataControlOffer>::~DataOffer() {
+DataOffer::~DataOffer() {
if (thread_) {
thread_->removeTask(taskId_);
}
}
-template <typename DataControlOffer>
-void DataOffer<DataControlOffer>::receiveData(DataReaderThread &thread,
- DataOfferCallback callback) {
+void DataOffer::receiveData(DataReaderThread &thread,
+ DataOfferCallback callback) {
if (thread_) {
return;
}
@@ -181,9 +173,7 @@
}
}
-template <typename DataControlOffer>
-void DataOffer<DataControlOffer>::receiveRealData(
- DataOfferDataCallback callback) {
+void DataOffer::receiveRealData(DataOfferDataCallback callback) {
if (!thread_) {
return;
}
@@ -202,9 +192,8 @@
receiveDataForMime(mime, std::move(callback));
}
-template <typename DataControlOffer>
-void DataOffer<DataControlOffer>::receiveDataForMime(
- const std::string &mime, DataOfferDataCallback callback) {
+void DataOffer::receiveDataForMime(const std::string &mime,
+ DataOfferDataCallback callback) {
if (!thread_) {
return;
}
@@ -222,22 +211,20 @@
std::move(callback));
}
-template <typename DataControlDevice>
-DataDevice<DataControlDevice>::DataDevice(WaylandClipboard *clipboard,
- DataControlDevice *device)
+DataDevice::DataDevice(WaylandClipboard *clipboard,
+ wayland::ZwlrDataControlDeviceV1 *device)
: clipboard_(clipboard), device_(device),
thread_(clipboard_->parent()->instance()->eventDispatcher()) {
- conns_.emplace_back(
- device_->dataOffer().connect([this](DataControlOfferType *offer) {
+ conns_.emplace_back(device_->dataOffer().connect(
+ [this](wayland::ZwlrDataControlOfferV1 *offer) {
new DataOffer(offer, *clipboard_->parent()
->config()
.ignorePasswordFromPasswordManager);
}));
- conns_.emplace_back(
- device_->selection().connect([this](DataControlOfferType *offer) {
+ conns_.emplace_back(device_->selection().connect(
+ [this](wayland::ZwlrDataControlOfferV1 *offer) {
clipboardOffer_.reset(
- offer ? static_cast<DataOfferType *>(offer->userData())
- : nullptr);
+ offer ? static_cast<DataOffer *>(offer->userData()) : nullptr);
if (!clipboardOffer_) {
return;
}
@@ -249,10 +236,9 @@
});
}));
conns_.emplace_back(device_->primarySelection().connect(
- [this](DataControlOfferType *offer) {
+ [this](wayland::ZwlrDataControlOfferV1 *offer) {
primaryOffer_.reset(
- offer ? static_cast<DataOfferType *>(offer->userData())
- : nullptr);
+ offer ? static_cast<DataOffer *>(offer->userData()) : nullptr);
if (!primaryOffer_) {
clipboard_->setPrimary("", false);
return;
@@ -278,97 +264,57 @@
: parent_(clipboard), name_(std::move(name)),
display_(
static_cast<wayland::Display *>(wl_display_get_user_data(display))) {
- display_->requestGlobals<wayland::ExtDataControlManagerV1>();
display_->requestGlobals<wayland::ZwlrDataControlManagerV1>();
globalConn_ = display_->globalCreated().connect(
[this](const std::string &interface, const std::shared_ptr<void> &ptr) {
- if (interface == wayland::ExtDataControlManagerV1::interface) {
- if (ptr != extManager_) {
- extDeviceMap_.clear();
- extManager_ =
- display_->getGlobal<wayland::ExtDataControlManagerV1>();
- }
- parent_->instance()->eventDispatcher().schedule(
- [this]() { refreshSeat(); });
- deferRefreshSeat();
- } else if (interface ==
- wayland::ZwlrDataControlManagerV1::interface) {
- if (ptr != wlrManager_) {
- wlrDeviceMap_.clear();
- wlrManager_ =
+ if (interface == wayland::ZwlrDataControlManagerV1::interface) {
+ if (ptr != manager_) {
+ deviceMap_.clear();
+ manager_ =
display_
->getGlobal<wayland::ZwlrDataControlManagerV1>();
}
- deferRefreshSeat();
+ refreshSeat();
} else if (interface == wayland::WlSeat::interface) {
- deferRefreshSeat();
+ refreshSeat();
}
});
globalRemoveConn_ = display_->globalRemoved().connect(
[this](const std::string &interface, const std::shared_ptr<void> &ptr) {
- if (interface == wayland::ExtDataControlManagerV1::interface) {
- extDeviceMap_.clear();
- if (extManager_ == ptr) {
- extManager_.reset();
- }
- } else if (interface ==
+ if (interface ==
wayland::ZwlrDataControlManagerV1::interface) {
- wlrDeviceMap_.clear();
- if (wlrManager_ == ptr) {
- wlrManager_.reset();
+ deviceMap_.clear();
+ if (manager_ == ptr) {
+ manager_.reset();
}
} else if (interface == wayland::WlSeat::interface) {
- wlrDeviceMap_.erase(static_cast<wayland::WlSeat *>(ptr.get()));
- extDeviceMap_.erase(static_cast<wayland::WlSeat *>(ptr.get()));
+ deviceMap_.erase(static_cast<wayland::WlSeat *>(ptr.get()));
}
});
if (auto manager =
display_->getGlobal<wayland::ZwlrDataControlManagerV1>()) {
- wlrManager_ = std::move(manager);
+ manager_ = std::move(manager);
}
refreshSeat();
}
-void WaylandClipboard::deferRefreshSeat() {
- // The initial global registration update is more likely happen in one
- // message loop, so we defer so we can decide to only initialize ext or wlr.
- parent_->instance()->eventDispatcher().scheduleWithContext(
- watch(), [this]() { refreshSeat(); });
-}
-
void WaylandClipboard::refreshSeat() {
- if (!wlrManager_ && !extManager_) {
+ if (!manager_) {
return;
}
auto seats = display_->getGlobals<wayland::WlSeat>();
for (const auto &seat : seats) {
- if (extManager_) {
- if (extDeviceMap_.contains(seat.get())) {
- continue;
- }
- auto *device = extManager_->getDataDevice(seat.get());
- extDeviceMap_.emplace(
- seat.get(),
- std::make_unique<DataDevice<wayland::ExtDataControlDeviceV1>>(
- this, device));
+ if (deviceMap_.contains(seat.get())) {
continue;
- } else if (wlrManager_) {
- if (wlrDeviceMap_.contains(seat.get())) {
- continue;
- }
- auto *device = wlrManager_->getDataDevice(seat.get());
- wlrDeviceMap_.emplace(
- seat.get(),
- std::make_unique<DataDevice<wayland::ZwlrDataControlDeviceV1>>(
- this, device));
}
- }
- // If both are available, prefer ext.
- if (extManager_ && wlrManager_) {
- wlrDeviceMap_.clear();
+ auto *device = manager_->getDataDevice(seat.get());
+ deviceMap_.emplace(
+ seat.get(),
+ std::make_unique<DataDevice>(
+ this, device));
}
}
diff -urN fcitx5-5.1.17/src/modules/clipboard/waylandclipboard.h fcitx5-5.1.17.new/src/modules/clipboard/waylandclipboard.h
--- fcitx5-5.1.17/src/modules/clipboard/waylandclipboard.h 2025-12-22 14:18:01.000000000 +0800
+++ fcitx5-5.1.17.new/src/modules/clipboard/waylandclipboard.h 2026-02-07 13:47:21.644558508 +0800
@@ -25,12 +25,8 @@
#include "fcitx-utils/trackableobject.h"
#include "fcitx-utils/unixfd.h"
#include "display.h"
-#include "ext_data_control_device_v1.h"
-#include "ext_data_control_manager_v1.h"
-#include "ext_data_control_offer_v1.h"
#include "zwlr_data_control_device_v1.h"
#include "zwlr_data_control_manager_v1.h"
-#include "zwlr_data_control_offer_v1.h"
namespace fcitx {
@@ -44,12 +40,6 @@
using DataOfferCallback =
std::function<void(const std::vector<char> &data, bool password)>;
-class DataOfferInterface : public TrackableObject<DataOfferInterface> {
-public:
- virtual ~DataOfferInterface();
-};
-
-template <typename DataControlOffer>
class DataOffer;
struct DataOfferTask {
@@ -61,7 +51,7 @@
DataOfferTask &operator=(DataOfferTask &&) = delete;
uint64_t id_ = 0;
- TrackableObjectReference<DataOfferInterface> offer_;
+ TrackableObjectReference<DataOffer> offer_;
DataOfferDataCallback callback_;
std::shared_ptr<UnixFD> fd_;
std::vector<char> data_;
@@ -98,15 +88,14 @@
static void run(DataReaderThread *self) { self->realRun(); }
- uint64_t addTask(DataOfferInterface *offer, std::shared_ptr<UnixFD> fd,
+ uint64_t addTask(DataOffer *offer, std::shared_ptr<UnixFD> fd,
DataOfferDataCallback callback);
void removeTask(uint64_t token);
private:
// Function that run on reader thread
void realRun();
- void addTaskOnWorker(uint64_t id,
- TrackableObjectReference<DataOfferInterface> offer,
+ void addTaskOnWorker(uint64_t id, TrackableObjectReference<DataOffer> offer,
std::shared_ptr<UnixFD> fd,
DataOfferDataCallback callback);
void handleTaskIO(DataOfferTask *task, IOEventFlags flags);
@@ -127,11 +116,10 @@
std::unordered_map<uint64_t, DataOfferTask> tasks_;
};
-template <typename DataControlOffer>
-class DataOffer : public DataOfferInterface {
+class DataOffer : public TrackableObject<DataOffer> {
public:
- DataOffer(DataControlOffer *offer, bool ignorePassword);
- ~DataOffer() override;
+ DataOffer(wayland::ZwlrDataControlOfferV1 *offer, bool ignorePassword);
+ ~DataOffer();
void receiveData(DataReaderThread &thread, DataOfferCallback callback);
@@ -142,7 +130,7 @@
std::list<ScopedConnection> conns_;
std::unordered_set<std::string> mimeTypes_;
- std::unique_ptr<DataControlOffer> offer_;
+ std::unique_ptr<wayland::ZwlrDataControlOfferV1> offer_;
bool ignorePassword_ = true;
bool isPassword_ = false;
UnixFD fd_;
@@ -153,39 +141,17 @@
class WaylandClipboard;
class Clipboard;
-class DataDeviceInterface {
-public:
- virtual ~DataDeviceInterface();
-};
-
-template <typename DataControlDevice>
-struct DataControlDeviceTraits;
-
-template <>
-struct DataControlDeviceTraits<wayland::ExtDataControlDeviceV1> {
- using DataControlOfferType = wayland::ExtDataControlOfferV1;
-};
-
-template <>
-struct DataControlDeviceTraits<wayland::ZwlrDataControlDeviceV1> {
- using DataControlOfferType = wayland::ZwlrDataControlOfferV1;
-};
-
-template <typename DataControlDevice>
-class DataDevice : public DataDeviceInterface {
- using DataControlOfferType = typename DataControlDeviceTraits<
- DataControlDevice>::DataControlOfferType;
- using DataOfferType = DataOffer<DataControlOfferType>;
-
+class DataDevice {
public:
- DataDevice(WaylandClipboard *clipboard, DataControlDevice *device);
+ DataDevice(WaylandClipboard *clipboard,
+ wayland::ZwlrDataControlDeviceV1 *device);
private:
WaylandClipboard *clipboard_;
- std::unique_ptr<DataControlDevice> device_;
+ std::unique_ptr<wayland::ZwlrDataControlDeviceV1> device_;
DataReaderThread thread_;
- std::unique_ptr<DataOfferType> primaryOffer_;
- std::unique_ptr<DataOfferType> clipboardOffer_;
+ std::unique_ptr<DataOffer> primaryOffer_;
+ std::unique_ptr<DataOffer> clipboardOffer_;
std::list<ScopedConnection> conns_;
};
@@ -201,23 +167,14 @@
auto parent() const { return parent_; }
private:
- void deferRefreshSeat();
void refreshSeat();
Clipboard *parent_;
std::string name_;
wayland::Display *display_;
ScopedConnection globalConn_;
ScopedConnection globalRemoveConn_;
- std::shared_ptr<wayland::ExtDataControlManagerV1> extManager_;
- std::shared_ptr<wayland::ZwlrDataControlManagerV1> wlrManager_;
- std::unordered_map<
- wayland::WlSeat *,
- std::unique_ptr<DataDevice<wayland::ExtDataControlDeviceV1>>>
- extDeviceMap_;
- std::unordered_map<
- wayland::WlSeat *,
- std::unique_ptr<DataDevice<wayland::ZwlrDataControlDeviceV1>>>
- wlrDeviceMap_;
+ std::shared_ptr<wayland::ZwlrDataControlManagerV1> manager_;
+ std::unordered_map<wayland::WlSeat *, std::unique_ptr<DataDevice>> deviceMap_;
};
} // namespace fcitx