Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwaylanddatacontrolv1.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 Jie Liu <liujie01@kylinos.cn>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
8#include "qwaylandmimehelper_p.h"
9
10#include <QtGui/private/qguiapplication_p.h>
11
12#include <qpa/qplatformclipboard.h>
13
14#include <signal.h>
15#include <unistd.h>
16
17QT_BEGIN_NAMESPACE
18
19namespace QtWaylandClient {
20
26
28{
29 return new QWaylandDataControlDeviceV1(this, seat);
30}
31
32QWaylandDataControlOfferV1::QWaylandDataControlOfferV1(QWaylandDisplay *display, ::zwlr_data_control_offer_v1 *offer)
35 , m_mimeData(new QWaylandMimeData(this))
36{}
37
38void QWaylandDataControlOfferV1::startReceiving(const QString &mimeType, int fd)
39{
40 receive(mimeType, fd);
41 wl_display_flush(m_display->wl_display());
42}
43
45{
46 m_mimeData->appendFormat(mime_type);
47}
48
49QWaylandDataControlDeviceV1::QWaylandDataControlDeviceV1(
50 QWaylandDataControlManagerV1 *manager, QWaylandInputDevice *seat)
51 : QtWayland::zwlr_data_control_device_v1(manager->get_data_device(seat->wl_seat()))
52 , m_display(manager->display())
53 , m_seat(seat)
54{
55}
56
61
63{
64 if (!m_selectionOffer)
65 return;
66
67 m_selectionOffer.reset();
68 QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Clipboard);
69}
70
82
94
95void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_data_offer(zwlr_data_control_offer_v1 *offer)
96{
97 new QWaylandDataControlOfferV1(m_display, offer);
98}
99
100void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_selection(zwlr_data_control_offer_v1 *id)
101{
102 if (!id)
103 m_selectionOffer.reset();
104 else
105 m_selectionOffer.reset(static_cast<QWaylandDataControlOfferV1 *>(zwlr_data_control_offer_v1_get_user_data(id)));
106
107 // The selection event may be sent before platfrmIntegration is set.
108 if (auto* integration = QGuiApplicationPrivate::platformIntegration())
109 integration->clipboard()->emitChanged(QClipboard::Clipboard);
110}
111
113{
114 m_selectionOffer.reset();
115 m_primarySelectionOffer.reset();
116 QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Clipboard);
117}
118
119void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_primary_selection(struct ::zwlr_data_control_offer_v1 *id)
120{
121 if (!id)
122 m_primarySelectionOffer.reset();
123 else
124 m_primarySelectionOffer.reset(static_cast<QWaylandDataControlOfferV1 *>(zwlr_data_control_offer_v1_get_user_data(id)));
125
126 // The selection event may be sent before platfrmIntegration is set.
127 if (auto* integration = QGuiApplicationPrivate::platformIntegration())
128 integration->clipboard()->emitChanged(QClipboard::Selection);
129}
130
141
146
148{
150 if (!content.isEmpty()) {
151 // Create a sigpipe handler that does nothing, or clients may be forced to terminate
152 // if the pipe is closed in the other end.
153 struct sigaction action, oldAction;
154 action.sa_handler = SIG_IGN;
156 action.sa_flags = 0;
157
158 sigaction(SIGPIPE, &action, &oldAction);
161 sigaction(SIGPIPE, &oldAction, nullptr);
162 }
163 close(fd);
164}
165
166} // namespace QtWaylandClient
167
168QT_END_NAMESPACE
QWaylandDataControlManagerV1(QWaylandDisplay *display, uint id, uint version)
QWaylandDataControlDeviceV1 * createDevice(QWaylandInputDevice *seat)
QWaylandDataControlOfferV1(QWaylandDisplay *display, ::zwlr_data_control_offer_v1 *offer)
void startReceiving(const QString &mimeType, int fd) override
void zwlr_data_control_offer_v1_offer(const QString &mime_type) override