6#include "KWayland/Client/compositor.h"
7#include "KWayland/Client/connection_thread.h"
8#include "KWayland/Client/datadevice.h"
9#include "KWayland/Client/datadevicemanager.h"
10#include "KWayland/Client/dataoffer.h"
11#include "KWayland/Client/event_queue.h"
12#include "KWayland/Client/keyboard.h"
13#include "KWayland/Client/pointer.h"
14#include "KWayland/Client/registry.h"
15#include "KWayland/Client/seat.h"
16#include "KWayland/Client/shell.h"
17#include "KWayland/Client/shm_pool.h"
18#include "KWayland/Client/surface.h"
20#include <QCoreApplication>
41 void setupRegistry(Registry *registry);
43 QThread *m_connectionThread;
44 ConnectionThread *m_connectionThreadObject;
45 EventQueue *m_eventQueue =
nullptr;
46 Compositor *m_compositor =
nullptr;
47 DataDeviceManager *m_dataDeviceManager =
nullptr;
48 DataDevice *m_dataDevice =
nullptr;
49 Seat *m_seat =
nullptr;
50 Shell *m_shell =
nullptr;
51 ShellSurface *m_shellSurface =
nullptr;
52 ShmPool *m_shm =
nullptr;
53 Surface *m_surface =
nullptr;
58 , m_connectionThread(new QThread(this))
59 , m_connectionThreadObject(new ConnectionThread())
65 m_connectionThread->quit();
66 m_connectionThread->wait();
67 m_connectionThreadObject->deleteLater();
73 m_connectionThreadObject,
74 &ConnectionThread::connected,
77 m_eventQueue =
new EventQueue(
this);
78 m_eventQueue->setup(m_connectionThreadObject);
80 Registry *registry =
new Registry(
this);
81 setupRegistry(registry);
83 Qt::QueuedConnection);
84 m_connectionThreadObject->moveToThread(m_connectionThread);
85 m_connectionThread->start();
87 m_connectionThreadObject->initConnection();
90void PasteClient::setupRegistry(Registry *registry)
92 connect(registry, &Registry::compositorAnnounced,
this, [
this, registry](quint32 name, quint32
version) {
93 m_compositor = registry->createCompositor(name,
version,
this);
95 connect(registry, &Registry::shellAnnounced,
this, [
this, registry](quint32 name, quint32
version) {
98 connect(registry, &Registry::shmAnnounced,
this, [
this, registry](quint32 name, quint32
version) {
101 connect(registry, &Registry::seatAnnounced,
this, [
this, registry](quint32 name, quint32
version) {
104 connect(registry, &Registry::dataDeviceManagerAnnounced,
this, [
this, registry](quint32 name, quint32
version) {
105 m_dataDeviceManager =
registry->createDataDeviceManager(name,
version,
this);
107 connect(registry, &Registry::interfacesAnnounced,
this, [
this] {
108 Q_ASSERT(m_compositor);
109 Q_ASSERT(m_dataDeviceManager);
113 m_surface = m_compositor->createSurface(
this);
115 m_shellSurface = m_shell->createSurface(m_surface,
this);
116 Q_ASSERT(m_shellSurface);
117 m_shellSurface->setFullscreen();
118 connect(m_shellSurface, &ShellSurface::sizeChanged,
this, &PasteClient::render);
120 m_dataDevice = m_dataDeviceManager->getDataDevice(m_seat,
this);
121 connect(m_dataDevice, &DataDevice::selectionOffered,
this, [
this] {
122 auto dataOffer = m_dataDevice->offeredSelection();
126 const auto &mimeTypes = dataOffer->offeredMimeTypes();
127 auto it = std::find_if(mimeTypes.constBegin(), mimeTypes.constEnd(), [](
const QMimeType &type) {
128 return type.inherits(QStringLiteral(
"text/plain"));
130 if (it == mimeTypes.constEnd()) {
134 if (pipe(pipeFds) != 0) {
137 dataOffer->receive((*it).name(), pipeFds[1]);
139 QThreadPool::globalInstance()->start([pipeFds] {
141 if (readPipe.open(pipeFds[0], QIODevice::ReadOnly)) {
142 qDebug() <<
"Pasted: " << readPipe.readLine();
145 QCoreApplication::quit();
149 registry->setEventQueue(m_eventQueue);
150 registry->create(m_connectionThreadObject);
154void PasteClient::render()
156 const QSize &size = m_shellSurface->size();
157 auto buffer = m_shm->getBuffer(size, size.width() * 4).toStrongRef();
158 buffer->setUsed(
true);
159 QImage image(buffer->address(), size.width(), size.height(), QImage::Format_ARGB32_Premultiplied);
160 image.fill(Qt::blue);
162 m_surface->attachBuffer(*buffer);
163 m_surface->damage(QRect(QPoint(0, 0), size));
164 m_surface->commit(Surface::CommitFlag::None);
165 buffer->setUsed(
false);
170 QCoreApplication app(argc, argv);
177#include "pasteclient.moc"
PasteClient(QObject *parent=nullptr)
KWayland::Client::Registry * registry