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