KWin
Loading...
Searching...
No Matches
transfer.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2018 Roman Gilg <subdiff@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#pragma once
10
11#include <QList>
12#include <QObject>
13#include <QSocketNotifier>
14
15#include <xcb/xcb.h>
16
17namespace KWayland
18{
19namespace Client
20{
21class DataDevice;
22class DataSource;
23}
24}
25namespace KWin
26{
27class DataDeviceInterface;
28
29namespace Xwl
30{
31
40class Transfer : public QObject
41{
42 Q_OBJECT
43
44public:
45 Transfer(xcb_atom_t selection,
46 qint32 fd,
47 xcb_timestamp_t timestamp,
48 QObject *parent = nullptr);
49
50 virtual bool handlePropertyNotify(xcb_property_notify_event_t *event) = 0;
51 void timeout();
52 xcb_timestamp_t timestamp() const
53 {
54 return m_timestamp;
55 }
56
57Q_SIGNALS:
58 void finished();
59
60protected:
61 void endTransfer();
62
63 xcb_atom_t atom() const
64 {
65 return m_atom;
66 }
67 qint32 fd() const
68 {
69 return m_fd;
70 }
71
72 void setIncr(bool set)
73 {
74 m_incr = set;
75 }
76 bool incr() const
77 {
78 return m_incr;
79 }
81 {
82 m_timeout = false;
83 }
84 void createSocketNotifier(QSocketNotifier::Type type);
86 QSocketNotifier *socketNotifier() const
87 {
88 return m_notifier;
89 }
90
91private:
92 void closeFd();
93
94 xcb_atom_t m_atom;
95 qint32 m_fd;
96 xcb_timestamp_t m_timestamp = XCB_CURRENT_TIME;
97
98 QSocketNotifier *m_notifier = nullptr;
99 bool m_incr = false;
100 bool m_timeout = false;
101
102 Q_DISABLE_COPY(Transfer)
103};
104
109{
110 Q_OBJECT
111
112public:
113 TransferWltoX(xcb_atom_t selection,
114 xcb_selection_request_event_t *request,
115 qint32 fd,
116 QObject *parent = nullptr);
117 ~TransferWltoX() override;
118
120 bool handlePropertyNotify(xcb_property_notify_event_t *event) override;
121
122Q_SIGNALS:
123 void selectionNotify(xcb_selection_request_event_t *event, bool success);
124
125private:
126 void startIncr();
127 void readWlSource();
128 int flushSourceData();
129 void handlePropertyDelete();
130
131 xcb_selection_request_event_t *m_request = nullptr;
132
133 /* contains all received data portioned in chunks
134 * TODO: explain second QPair component
135 */
136 QList<QPair<QByteArray, int>> m_chunks;
137
138 bool m_propertyIsSet = false;
139 bool m_flushPropertyOnDelete = false;
140
141 Q_DISABLE_COPY(TransferWltoX)
142};
143
148{
149public:
150 virtual ~DataReceiver();
151
152 void transferFromProperty(xcb_get_property_reply_t *reply);
153
154 void setData(const char *value, int length);
155 QByteArray data() const;
156
157 void partRead(int length);
158
159private:
160 xcb_get_property_reply_t *m_propertyReply = nullptr;
161 int m_propertyStart = 0;
162 QByteArray m_data;
163};
164
169{
170 Q_OBJECT
171
172public:
173 TransferXtoWl(xcb_atom_t selection,
174 xcb_atom_t target,
175 qint32 fd,
176 xcb_timestamp_t timestamp, xcb_window_t parentWindow,
177 QObject *parent = nullptr);
178 ~TransferXtoWl() override;
179
180 bool handleSelectionNotify(xcb_selection_notify_event_t *event);
181 bool handlePropertyNotify(xcb_property_notify_event_t *event) override;
182
183private:
184 void dataSourceWrite();
185 void startTransfer();
186 void getIncrChunk();
187
188 xcb_window_t m_window;
189 DataReceiver *m_receiver = nullptr;
190
191 Q_DISABLE_COPY(TransferXtoWl)
192};
193
194} // namespace Xwl
195} // namespace KWin
The Client class encapsulates a window decoration frame.
QByteArray data() const
Definition transfer.cpp:428
void transferFromProperty(xcb_get_property_reply_t *reply)
Definition transfer.cpp:413
void setData(const char *value, int length)
Definition transfer.cpp:422
void partRead(int length)
Definition transfer.cpp:434
virtual bool handlePropertyNotify(xcb_property_notify_event_t *event)=0
bool incr() const
Definition transfer.h:76
xcb_timestamp_t timestamp() const
Definition transfer.h:52
void clearSocketNotifier()
Definition transfer.cpp:52
void setIncr(bool set)
Definition transfer.h:72
QSocketNotifier * socketNotifier() const
Definition transfer.h:86
qint32 fd() const
Definition transfer.h:67
Transfer(xcb_atom_t selection, qint32 fd, xcb_timestamp_t timestamp, QObject *parent=nullptr)
Definition transfer.cpp:38
void createSocketNotifier(QSocketNotifier::Type type)
Definition transfer.cpp:46
xcb_atom_t atom() const
Definition transfer.h:63
bool handlePropertyNotify(xcb_property_notify_event_t *event) override
Definition transfer.cpp:213
TransferWltoX(xcb_atom_t selection, xcb_selection_request_event_t *request, qint32 fd, QObject *parent=nullptr)
Definition transfer.cpp:82
void selectionNotify(xcb_selection_request_event_t *event, bool success)
bool handleSelectionNotify(xcb_selection_notify_event_t *event)
Definition transfer.cpp:308
TransferXtoWl(xcb_atom_t selection, xcb_atom_t target, qint32 fd, xcb_timestamp_t timestamp, xcb_window_t parentWindow, QObject *parent=nullptr)
Definition transfer.cpp:257
bool handlePropertyNotify(xcb_property_notify_event_t *event) override
Definition transfer.cpp:297
Session::Type type
Definition session.cpp:17