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 <functional>
13
15
16namespace {
17
18std::shared_ptr<QOhosClipboardObject> makeClipboardObjectInstance(
19 std::function<void(std::optional<QOhosClipboardObject::PasteboardDataSource>)> &&pasteboardUpdatesNotifier)
20{
21 return QOhosClipboardObject::makeInstance(std::move(pasteboardUpdatesNotifier));
22}
23
24}
25
26std::optional<bool> &QOhosPlatformClipboard::shareInAppOnlyFlagRef()
27{
28 static std::optional<bool> shareInAppOnly;
29 return shareInAppOnly;
30}
31
33{
34 m_clipboardObject = makeClipboardObjectInstance(
35 [this](std::optional<QOhosClipboardObject::PasteboardDataSource> dataSource) {
36 if (dataSource == QOhosClipboardObject::PasteboardDataSource::OtherProcess
37 || (!dataSource.has_value() && m_mimeData)) {
38 m_mimeData = nullptr;
39 m_mimeDataIsOurs = false;
40 }
41 emitChanged(QClipboard::Clipboard);
42 });
43}
44
46
47QMimeData *QOhosPlatformClipboard::mimeData(QClipboard::Mode mode)
48{
49 Q_UNUSED(mode);
50 Q_ASSERT(supportsMode(mode));
51
52 // FIXME:
53 // as per client's request - try to fetch the clipboard content if the previous attempt resulted
54 // in an empty QMimeData object (in this case: due to clipboard content being inaccessible for
55 // an app with all windows inactive).
56 if (!m_mimeDataIsOurs && (m_mimeData == nullptr || m_mimeData->formats().isEmpty()))
57 m_mimeData = m_clipboardObject->getPasteboardDataWithLazyFetch().lazyFetchingData;
58
59 return m_mimeData.get();
60}
61
62void QOhosPlatformClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
63{
64 Q_ASSERT(supportsMode(mode));
65
66 if (supportsMode(mode)) {
67 bool callerReusedMimeDataPointer = mimeData == m_mimeData.get();
68 if (!callerReusedMimeDataPointer)
69 m_mimeData = std::shared_ptr<QMimeData>(mimeData);
70 m_mimeDataIsOurs = true;
71 if (mimeData != nullptr) {
72 m_clipboardObject->setMimeDataSync(m_mimeData, shareInAppOnlyFlagRef());
73 // HACK: reset share option state for next to come UdmfData to cross-app + cross-device.
74 shareInAppOnlyFlagRef() = {};
75 } else {
76 m_clipboardObject->setMimeDataSync(std::make_shared<QMimeData>(), {});
77 }
78 }
79}
80
82{
83 shareInAppOnlyFlagRef() = shareInAppOnly;
84}
85
86bool QOhosPlatformClipboard::supportsMode(QClipboard::Mode mode) const
87{
88 return mode == QClipboard::Clipboard;
89}
90
91bool QOhosPlatformClipboard::ownsMode(QClipboard::Mode mode) const
92{
93 Q_UNUSED(mode);
94 return false;
95}
96
98{
99 auto pasteboardData = m_clipboardObject->getPasteboardDataWithLazyFetch();
100
101 if (!pasteboardData.dataSource.has_value())
102 return std::make_shared<QMimeData>();
103
104 return pasteboardData.dataSource == QOhosClipboardObject::PasteboardDataSource::OtherProcess
105 ? std::move(pasteboardData.lazyFetchingData)
106 : m_mimeData
107 ? m_mimeData
108 : std::make_shared<QMimeData>();
109}
110
111QT_END_NAMESPACE
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(std::optional< QOhosClipboardObject::PasteboardDataSource >)> &&pasteboardUpdatesNotifier)