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
qohosplatformclipboard.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include "qohosjsmain.h"
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qobject.h>
9#include <QtCore/private/qohoscommon_p.h>
10#include <QtCore/private/qohoslogger_p.h>
11#include <qohosclipboardobject.h>
12#include <qohosplugincore.h>
13#include <functional>
14#include <utility>
15
17
18namespace {
19
21 std::function<void(QOhosOptional<QOhosClipboardObject::PasteboardDataSource>)> &&pasteboardUpdatesNotifier)
22{
23 return QOhosClipboardObject::makeInstance(std::move(pasteboardUpdatesNotifier));
24}
25
26}
27
28QOhosOptional<bool> &QOhosPlatformClipboard::shareInAppOnlyFlagRef()
29{
30 static QOhosOptional<bool> shareInAppOnly;
31 return shareInAppOnly;
32}
33
35{
36 m_clipboardObject = makeClipboardObjectInstance(
37 [this](QOhosOptional<QOhosClipboardObject::PasteboardDataSource> dataSource) {
38 if (dataSource == QOhosClipboardObject::PasteboardDataSource::OtherProcess
39 || (!dataSource.hasValue() && m_mimeData)) {
40 m_mimeData = nullptr;
41 m_mimeDataIsOurs = false;
42 }
43 emitChanged(QClipboard::Clipboard);
44 });
45}
46
48
49QMimeData *QOhosPlatformClipboard::mimeData(QClipboard::Mode mode)
50{
51 Q_UNUSED(mode);
52 Q_ASSERT(supportsMode(mode));
53
54 // FIXME:
55 // as per client's request - try to fetch the clipboard content if the previous attempt resulted
56 // in an empty QMimeData object (in this case: due to clipboard content being inaccessible for
57 // an app with all windows inactive).
58 if (!m_mimeDataIsOurs && (m_mimeData == nullptr || m_mimeData->formats().isEmpty()))
59 m_mimeData = m_clipboardObject->getPasteboardDataWithLazyFetch().lazyFetchingData;
60
61 return m_mimeData.get();
62}
63
64void QOhosPlatformClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
65{
66 Q_ASSERT(supportsMode(mode));
67
68 if (supportsMode(mode)) {
69 bool callerReusedMimeDataPointer = mimeData == m_mimeData.get();
70 if (!callerReusedMimeDataPointer)
71 m_mimeData = std::shared_ptr<QMimeData>(mimeData);
72 m_mimeDataIsOurs = true;
73 if (mimeData != nullptr) {
74 m_clipboardObject->setMimeDataSync(m_mimeData, shareInAppOnlyFlagRef());
75 // HACK: reset share option state for next to come UdmfData to cross-app + cross-device.
76 shareInAppOnlyFlagRef() = makeEmptyQOhosOptional();
77 } else {
78 m_clipboardObject->setMimeDataSync(std::make_shared<QMimeData>(), {});
79 }
80 }
81}
82
84{
85 shareInAppOnlyFlagRef() = shareInAppOnly;
86}
87
88bool QOhosPlatformClipboard::supportsMode(QClipboard::Mode mode) const
89{
90 return mode == QClipboard::Clipboard;
91}
92
93bool QOhosPlatformClipboard::ownsMode(QClipboard::Mode mode) const
94{
95 Q_UNUSED(mode);
96 return false;
97}
98
100{
101 auto pasteboardData = m_clipboardObject->getPasteboardDataWithLazyFetch();
102
103 if (!pasteboardData.dataSource.hasValue())
104 return std::make_shared<QMimeData>();
105
106 return pasteboardData.dataSource == QOhosClipboardObject::PasteboardDataSource::OtherProcess
107 ? std::move(pasteboardData.lazyFetchingData)
108 : m_mimeData
109 ? m_mimeData
110 : std::make_shared<QMimeData>();
111}
112
113QT_END_NAMESPACE
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
bool ownsMode(QClipboard::Mode mode) const override
virtual ~QOhosPlatformClipboard()
std::shared_ptr< QMimeData > getPasteboardDataWithLazyFetchOrLocalIfOwner() const
QMimeData * mimeData(QClipboard::Mode mode=QClipboard::Clipboard) override
static void setInAppOnlyPasteboardShareOption(bool shareInAppOnly)
void setMimeData(QMimeData *mimeData, QClipboard::Mode mode=QClipboard::Clipboard) override
bool supportsMode(QClipboard::Mode mode) const override
Combined button and popup list for selecting options.
std::shared_ptr< QOhosClipboardObject > makeClipboardObjectInstance(std::function< void(QOhosOptional< QOhosClipboardObject::PasteboardDataSource >)> &&pasteboardUpdatesNotifier)