Skip to content

Commit cce4115

Browse files
committed
Add ext-data-control protocol support
1 parent 57dd480 commit cce4115

14 files changed

+470
-47
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ if (ENABLE_WAYLAND)
169169
set(REQUIRED_WAYLAND_COMPONENTS Client Cursor)
170170
find_package(Wayland 1.22 REQUIRED COMPONENTS ${REQUIRED_WAYLAND_COMPONENTS})
171171
find_package(WaylandScanner REQUIRED)
172-
find_package(WaylandProtocols REQUIRED)
172+
find_package(WaylandProtocols 1.39 REQUIRED)
173173
pkg_check_modules(Gio IMPORTED_TARGET gio-2.0)
174174
endif()
175175

src/lib/fcitx-wayland/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ add_subdirectory(core)
22
add_subdirectory(input-method)
33
add_subdirectory(input-method-v2)
44
add_subdirectory(wlr-data-control)
5+
add_subdirectory(ext-data-control)
56
add_subdirectory(blur)
67
add_subdirectory(plasma-window-management)
78
add_subdirectory(wlr-foreign-toplevel-management-unstable-v1)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
ecm_add_wayland_client_protocol(Ext_DATA_CONTROL_PROTOCOL_SRCS
2+
PROTOCOL ${WAYLAND_PROTOCOLS_PKGDATADIR}/staging/ext-data-control/ext-data-control-v1.xml
3+
BASENAME ext-data-control-unstable-v1)
4+
5+
set(FCITX_WAYLAND_Ext_DATA_CONTROL_PROTOCOL_SOURCES
6+
ext_data_control_device_v1.cpp
7+
ext_data_control_manager_v1.cpp
8+
ext_data_control_offer_v1.cpp
9+
ext_data_control_source_v1.cpp
10+
)
11+
12+
add_library(Fcitx5WaylandExtDataControl STATIC ${FCITX_WAYLAND_Ext_DATA_CONTROL_PROTOCOL_SOURCES} ${Ext_DATA_CONTROL_PROTOCOL_SRCS})
13+
set_target_properties(Fcitx5WaylandExtDataControl PROPERTIES
14+
POSITION_INDEPENDENT_CODE ON
15+
)
16+
target_include_directories(Fcitx5WaylandExtDataControl PUBLIC
17+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/..;${CMAKE_CURRENT_BINARY_DIR}>")
18+
target_link_libraries(Fcitx5WaylandExtDataControl Wayland::Client Fcitx5::Utils Fcitx5::Wayland::Core)
19+
20+
add_library(Fcitx5::Wayland::ExtDataControl ALIAS Fcitx5WaylandExtDataControl)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include "ext_data_control_device_v1.h"
2+
#include <cassert>
3+
#include "ext_data_control_offer_v1.h"
4+
#include "ext_data_control_source_v1.h"
5+
namespace fcitx::wayland {
6+
const struct ext_data_control_device_v1_listener
7+
ExtDataControlDeviceV1::listener = {
8+
[](void *data, ext_data_control_device_v1 *wldata,
9+
ext_data_control_offer_v1 *id) {
10+
auto *obj = static_cast<ExtDataControlDeviceV1 *>(data);
11+
assert(*obj == wldata);
12+
{
13+
auto *id_ = new ExtDataControlOfferV1(id);
14+
return obj->dataOffer()(id_);
15+
}
16+
},
17+
[](void *data, ext_data_control_device_v1 *wldata,
18+
ext_data_control_offer_v1 *id) {
19+
auto *obj = static_cast<ExtDataControlDeviceV1 *>(data);
20+
assert(*obj == wldata);
21+
{
22+
auto *id_ =
23+
id ? static_cast<ExtDataControlOfferV1 *>(
24+
ext_data_control_offer_v1_get_user_data(id))
25+
: nullptr;
26+
return obj->selection()(id_);
27+
}
28+
},
29+
[](void *data, ext_data_control_device_v1 *wldata) {
30+
auto *obj = static_cast<ExtDataControlDeviceV1 *>(data);
31+
assert(*obj == wldata);
32+
{
33+
return obj->finished()();
34+
}
35+
},
36+
[](void *data, ext_data_control_device_v1 *wldata,
37+
ext_data_control_offer_v1 *id) {
38+
auto *obj = static_cast<ExtDataControlDeviceV1 *>(data);
39+
assert(*obj == wldata);
40+
{
41+
auto *id_ =
42+
id ? static_cast<ExtDataControlOfferV1 *>(
43+
ext_data_control_offer_v1_get_user_data(id))
44+
: nullptr;
45+
return obj->primarySelection()(id_);
46+
}
47+
},
48+
};
49+
ExtDataControlDeviceV1::ExtDataControlDeviceV1(ext_data_control_device_v1 *data)
50+
: version_(ext_data_control_device_v1_get_version(data)), data_(data) {
51+
ext_data_control_device_v1_set_user_data(*this, this);
52+
ext_data_control_device_v1_add_listener(
53+
*this, &ExtDataControlDeviceV1::listener, this);
54+
}
55+
void ExtDataControlDeviceV1::destructor(ext_data_control_device_v1 *data) {
56+
auto version = ext_data_control_device_v1_get_version(data);
57+
if (version >= 1) {
58+
return ext_data_control_device_v1_destroy(data);
59+
}
60+
}
61+
void ExtDataControlDeviceV1::setSelection(ExtDataControlSourceV1 *source) {
62+
return ext_data_control_device_v1_set_selection(*this, rawPointer(source));
63+
}
64+
void ExtDataControlDeviceV1::setPrimarySelection(
65+
ExtDataControlSourceV1 *source) {
66+
return ext_data_control_device_v1_set_primary_selection(*this,
67+
rawPointer(source));
68+
}
69+
} // namespace fcitx::wayland
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#ifndef EXT_DATA_CONTROL_DEVICE_V1
2+
#define EXT_DATA_CONTROL_DEVICE_V1
3+
#include <memory>
4+
#include <wayland-client.h>
5+
#include "fcitx-utils/signals.h"
6+
#include "wayland-ext-data-control-unstable-v1-client-protocol.h"
7+
namespace fcitx::wayland {
8+
class ExtDataControlOfferV1;
9+
class ExtDataControlSourceV1;
10+
class ExtDataControlDeviceV1 final {
11+
public:
12+
static constexpr const char *interface = "ext_data_control_device_v1";
13+
static constexpr const wl_interface *const wlInterface =
14+
&ext_data_control_device_v1_interface;
15+
static constexpr const uint32_t version = 1;
16+
typedef ext_data_control_device_v1 wlType;
17+
operator ext_data_control_device_v1 *() { return data_.get(); }
18+
ExtDataControlDeviceV1(wlType *data);
19+
ExtDataControlDeviceV1(ExtDataControlDeviceV1 &&other) noexcept = delete;
20+
ExtDataControlDeviceV1 &
21+
operator=(ExtDataControlDeviceV1 &&other) noexcept = delete;
22+
auto actualVersion() const { return version_; }
23+
void *userData() const { return userData_; }
24+
void setUserData(void *userData) { userData_ = userData; }
25+
void setSelection(ExtDataControlSourceV1 *source);
26+
void setPrimarySelection(ExtDataControlSourceV1 *source);
27+
auto &dataOffer() { return dataOfferSignal_; }
28+
auto &selection() { return selectionSignal_; }
29+
auto &finished() { return finishedSignal_; }
30+
auto &primarySelection() { return primarySelectionSignal_; }
31+
32+
private:
33+
static void destructor(ext_data_control_device_v1 *);
34+
static const struct ext_data_control_device_v1_listener listener;
35+
fcitx::Signal<void(ExtDataControlOfferV1 *)> dataOfferSignal_;
36+
fcitx::Signal<void(ExtDataControlOfferV1 *)> selectionSignal_;
37+
fcitx::Signal<void()> finishedSignal_;
38+
fcitx::Signal<void(ExtDataControlOfferV1 *)> primarySelectionSignal_;
39+
uint32_t version_;
40+
void *userData_ = nullptr;
41+
UniqueCPtr<ext_data_control_device_v1, &destructor> data_;
42+
};
43+
static inline ext_data_control_device_v1 *
44+
rawPointer(ExtDataControlDeviceV1 *p) {
45+
return p ? static_cast<ext_data_control_device_v1 *>(*p) : nullptr;
46+
}
47+
} // namespace fcitx::wayland
48+
#endif
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "ext_data_control_manager_v1.h"
2+
#include <cassert>
3+
#include "ext_data_control_device_v1.h"
4+
#include "ext_data_control_source_v1.h"
5+
#include "wl_seat.h"
6+
namespace fcitx::wayland {
7+
ExtDataControlManagerV1::ExtDataControlManagerV1(
8+
ext_data_control_manager_v1 *data)
9+
: version_(ext_data_control_manager_v1_get_version(data)), data_(data) {
10+
ext_data_control_manager_v1_set_user_data(*this, this);
11+
}
12+
void ExtDataControlManagerV1::destructor(ext_data_control_manager_v1 *data) {
13+
auto version = ext_data_control_manager_v1_get_version(data);
14+
if (version >= 1) {
15+
return ext_data_control_manager_v1_destroy(data);
16+
}
17+
}
18+
ExtDataControlSourceV1 *ExtDataControlManagerV1::createDataSource() {
19+
return new ExtDataControlSourceV1(
20+
ext_data_control_manager_v1_create_data_source(*this));
21+
}
22+
ExtDataControlDeviceV1 *ExtDataControlManagerV1::getDataDevice(WlSeat *seat) {
23+
return new ExtDataControlDeviceV1(
24+
ext_data_control_manager_v1_get_data_device(*this, rawPointer(seat)));
25+
}
26+
} // namespace fcitx::wayland
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#ifndef EXT_DATA_CONTROL_MANAGER_V1
2+
#define EXT_DATA_CONTROL_MANAGER_V1
3+
#include <memory>
4+
#include <wayland-client.h>
5+
#include "fcitx-utils/signals.h"
6+
#include "wayland-ext-data-control-unstable-v1-client-protocol.h"
7+
namespace fcitx::wayland {
8+
class ExtDataControlDeviceV1;
9+
class ExtDataControlSourceV1;
10+
class WlSeat;
11+
class ExtDataControlManagerV1 final {
12+
public:
13+
static constexpr const char *interface = "ext_data_control_manager_v1";
14+
static constexpr const wl_interface *const wlInterface =
15+
&ext_data_control_manager_v1_interface;
16+
static constexpr const uint32_t version = 1;
17+
typedef ext_data_control_manager_v1 wlType;
18+
operator ext_data_control_manager_v1 *() { return data_.get(); }
19+
ExtDataControlManagerV1(wlType *data);
20+
ExtDataControlManagerV1(ExtDataControlManagerV1 &&other) noexcept = delete;
21+
ExtDataControlManagerV1 &
22+
operator=(ExtDataControlManagerV1 &&other) noexcept = delete;
23+
auto actualVersion() const { return version_; }
24+
void *userData() const { return userData_; }
25+
void setUserData(void *userData) { userData_ = userData; }
26+
ExtDataControlSourceV1 *createDataSource();
27+
ExtDataControlDeviceV1 *getDataDevice(WlSeat *seat);
28+
29+
private:
30+
static void destructor(ext_data_control_manager_v1 *);
31+
uint32_t version_;
32+
void *userData_ = nullptr;
33+
UniqueCPtr<ext_data_control_manager_v1, &destructor> data_;
34+
};
35+
static inline ext_data_control_manager_v1 *
36+
rawPointer(ExtDataControlManagerV1 *p) {
37+
return p ? static_cast<ext_data_control_manager_v1 *>(*p) : nullptr;
38+
}
39+
} // namespace fcitx::wayland
40+
#endif
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include "ext_data_control_offer_v1.h"
2+
#include <cassert>
3+
namespace fcitx::wayland {
4+
const struct ext_data_control_offer_v1_listener
5+
ExtDataControlOfferV1::listener = {
6+
[](void *data, ext_data_control_offer_v1 *wldata,
7+
const char *mimeType) {
8+
auto *obj = static_cast<ExtDataControlOfferV1 *>(data);
9+
assert(*obj == wldata);
10+
{
11+
return obj->offer()(mimeType);
12+
}
13+
},
14+
};
15+
ExtDataControlOfferV1::ExtDataControlOfferV1(ext_data_control_offer_v1 *data)
16+
: version_(ext_data_control_offer_v1_get_version(data)), data_(data) {
17+
ext_data_control_offer_v1_set_user_data(*this, this);
18+
ext_data_control_offer_v1_add_listener(
19+
*this, &ExtDataControlOfferV1::listener, this);
20+
}
21+
void ExtDataControlOfferV1::destructor(ext_data_control_offer_v1 *data) {
22+
auto version = ext_data_control_offer_v1_get_version(data);
23+
if (version >= 1) {
24+
return ext_data_control_offer_v1_destroy(data);
25+
}
26+
}
27+
void ExtDataControlOfferV1::receive(const char *mimeType, int32_t fd) {
28+
return ext_data_control_offer_v1_receive(*this, mimeType, fd);
29+
}
30+
} // namespace fcitx::wayland
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#ifndef EXT_DATA_CONTROL_OFFER_V1
2+
#define EXT_DATA_CONTROL_OFFER_V1
3+
#include <memory>
4+
#include <wayland-client.h>
5+
#include "fcitx-utils/signals.h"
6+
#include "wayland-ext-data-control-unstable-v1-client-protocol.h"
7+
namespace fcitx::wayland {
8+
class ExtDataControlOfferV1 final {
9+
public:
10+
static constexpr const char *interface = "ext_data_control_offer_v1";
11+
static constexpr const wl_interface *const wlInterface =
12+
&ext_data_control_offer_v1_interface;
13+
static constexpr const uint32_t version = 1;
14+
typedef ext_data_control_offer_v1 wlType;
15+
operator ext_data_control_offer_v1 *() { return data_.get(); }
16+
ExtDataControlOfferV1(wlType *data);
17+
ExtDataControlOfferV1(ExtDataControlOfferV1 &&other) noexcept = delete;
18+
ExtDataControlOfferV1 &
19+
operator=(ExtDataControlOfferV1 &&other) noexcept = delete;
20+
auto actualVersion() const { return version_; }
21+
void *userData() const { return userData_; }
22+
void setUserData(void *userData) { userData_ = userData; }
23+
void receive(const char *mimeType, int32_t fd);
24+
auto &offer() { return offerSignal_; }
25+
26+
private:
27+
static void destructor(ext_data_control_offer_v1 *);
28+
static const struct ext_data_control_offer_v1_listener listener;
29+
fcitx::Signal<void(const char *)> offerSignal_;
30+
uint32_t version_;
31+
void *userData_ = nullptr;
32+
UniqueCPtr<ext_data_control_offer_v1, &destructor> data_;
33+
};
34+
static inline ext_data_control_offer_v1 *rawPointer(ExtDataControlOfferV1 *p) {
35+
return p ? static_cast<ext_data_control_offer_v1 *>(*p) : nullptr;
36+
}
37+
} // namespace fcitx::wayland
38+
#endif
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include "ext_data_control_source_v1.h"
2+
#include <cassert>
3+
namespace fcitx::wayland {
4+
const struct ext_data_control_source_v1_listener
5+
ExtDataControlSourceV1::listener = {
6+
[](void *data, ext_data_control_source_v1 *wldata, const char *mimeType,
7+
int32_t fd) {
8+
auto *obj = static_cast<ExtDataControlSourceV1 *>(data);
9+
assert(*obj == wldata);
10+
{
11+
return obj->send()(mimeType, fd);
12+
}
13+
},
14+
[](void *data, ext_data_control_source_v1 *wldata) {
15+
auto *obj = static_cast<ExtDataControlSourceV1 *>(data);
16+
assert(*obj == wldata);
17+
{
18+
return obj->cancelled()();
19+
}
20+
},
21+
};
22+
ExtDataControlSourceV1::ExtDataControlSourceV1(ext_data_control_source_v1 *data)
23+
: version_(ext_data_control_source_v1_get_version(data)), data_(data) {
24+
ext_data_control_source_v1_set_user_data(*this, this);
25+
ext_data_control_source_v1_add_listener(
26+
*this, &ExtDataControlSourceV1::listener, this);
27+
}
28+
void ExtDataControlSourceV1::destructor(ext_data_control_source_v1 *data) {
29+
auto version = ext_data_control_source_v1_get_version(data);
30+
if (version >= 1) {
31+
return ext_data_control_source_v1_destroy(data);
32+
}
33+
}
34+
void ExtDataControlSourceV1::offer(const char *mimeType) {
35+
return ext_data_control_source_v1_offer(*this, mimeType);
36+
}
37+
} // namespace fcitx::wayland

0 commit comments

Comments
 (0)