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
8
9#include <QtGui/private/qguiapplication_p.h>
10
11#include <qpa/qplatformclipboard.h>
12
14
15namespace QtWaylandClient {
16
22
24{
25 return new QWaylandDataControlDeviceV1(this, seat);
26}
27
28QWaylandDataControlOfferV1::QWaylandDataControlOfferV1(QWaylandDisplay *display, ::zwlr_data_control_offer_v1 *offer)
31 , m_mimeData(new QWaylandMimeData(this))
32{}
33
34void QWaylandDataControlOfferV1::startReceiving(const QString &mimeType, int fd)
35{
36 receive(mimeType, fd);
37 wl_display_flush(m_display->wl_display());
38}
39
41{
42 m_mimeData->appendFormat(mime_type);
43}
44
45QWaylandDataControlDeviceV1::QWaylandDataControlDeviceV1(
46 QWaylandDataControlManagerV1 *manager, QWaylandInputDevice *seat)
47 : QtWayland::zwlr_data_control_device_v1(manager->get_data_device(seat->wl_seat()))
48 , m_display(manager->display())
49 , m_seat(seat)
50{
51}
52
57
59{
60 if (!m_selectionOffer)
61 return;
62
63 m_selectionOffer.reset();
64 QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Selection);
65}
66
78
90
91void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_data_offer(zwlr_data_control_offer_v1 *offer)
92{
93 new QWaylandDataControlOfferV1(m_display, offer);
94}
95
96void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_selection(zwlr_data_control_offer_v1 *id)
97{
98 if (!id)
99 m_selectionOffer.reset();
100 else
101 m_selectionOffer.reset(static_cast<QWaylandDataControlOfferV1 *>(zwlr_data_control_offer_v1_get_user_data(id)));
102
103 // The selection event may be sent before platfrmIntegration is set.
104 if (auto* integration = QGuiApplicationPrivate::platformIntegration())
105 integration->clipboard()->emitChanged(QClipboard::Selection);
106}
107
109{
110 m_selectionOffer.reset();
111 m_primarySelectionOffer.reset();
112 QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Selection);
113}
114
115void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_primary_selection(struct ::zwlr_data_control_offer_v1 *id)
116{
117 if (!id)
118 m_primarySelectionOffer.reset();
119 else
120 m_primarySelectionOffer.reset(static_cast<QWaylandDataControlOfferV1 *>(zwlr_data_control_offer_v1_get_user_data(id)));
121
122 // The selection event may be sent before platfrmIntegration is set.
123 if (auto* integration = QGuiApplicationPrivate::platformIntegration())
124 integration->clipboard()->emitChanged(QClipboard::Selection);
125}
126
136
141
143{
145 if (!content.isEmpty()) {
146 // Create a sigpipe handler that does nothing, or clients may be forced to terminate
147 // if the pipe is closed in the other end.
148 struct sigaction action, oldAction;
151 action.sa_flags = 0;
152
156 sigaction(SIGPIPE, &oldAction, nullptr);
157 }
158 close(fd);
159}
160
161} // namespace QtWaylandClient
162
163QT_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
Combined button and popup list for selecting options.