Skip to content

Commit 11a0d5c

Browse files
committed
Wayland: Avoid delaying GUI start
Waits on activating clipboard in Wayland only when needed.
1 parent ccf27e4 commit 11a0d5c

File tree

3 files changed

+30
-16
lines changed

3 files changed

+30
-16
lines changed

CMakePresets.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"cacheVariables": {
1010
"WITH_TESTS": "TRUE",
1111
"PEDANTIC": "TRUE",
12+
"CMAKE_BUILD_TYPE": "Debug",
1213
"CMAKE_C_COMPILER_LAUNCHER": "ccache",
1314
"CMAKE_CXX_COMPILER_LAUNCHER": "ccache"
1415
}

src/platform/x11/systemclipboard/waylandclipboard.cpp

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -595,25 +595,12 @@ WaylandClipboard::WaylandClipboard(QObject *parent)
595595
});
596596

597597
m_manager->instantiate();
598+
m_deviceRequestedTimer.start();
598599
}
599600

600601
WaylandClipboard *WaylandClipboard::createInstance()
601602
{
602-
qInfo() << "Using Wayland clipboard access";
603-
auto clipboard = new WaylandClipboard(qApp);
604-
605-
QElapsedTimer timer;
606-
timer.start();
607-
while ( !clipboard->isActive() && timer.elapsed() < 5000 ) {
608-
QCoreApplication::processEvents();
609-
}
610-
if ( timer.elapsed() > 100 ) {
611-
qWarning() << "Activating Wayland clipboard took" << timer.elapsed() << "ms";
612-
}
613-
if ( !clipboard->isActive() ) {
614-
qCritical() << "Failed to activate Wayland clipboard";
615-
}
616-
return clipboard;
603+
return new WaylandClipboard(qApp);
617604
}
618605

619606
void WaylandClipboard::setMimeData(QMimeData *mime, QClipboard::Mode mode)
@@ -664,6 +651,30 @@ const QMimeData *WaylandClipboard::mimeData(QClipboard::Mode mode) const
664651
return nullptr;
665652
}
666653

654+
DataControlDevice *WaylandClipboard::device() const
655+
{
656+
if (m_device)
657+
return m_device.get();
658+
659+
if (m_deviceRequestedTimer.elapsed() > 5000)
660+
return nullptr;
661+
662+
while (!m_device && m_deviceRequestedTimer.elapsed() < 5000) {
663+
QCoreApplication::processEvents();
664+
}
665+
666+
if (m_device) {
667+
if (m_deviceRequestedTimer.elapsed() > 200) {
668+
qWarning() << "Activating Wayland clipboard took"
669+
<< m_deviceRequestedTimer.elapsed() << "ms";
670+
}
671+
return m_device.get();
672+
}
673+
674+
qCritical() << "Failed to activate Wayland clipboard";
675+
return nullptr;
676+
}
677+
667678
bool WaylandClipboard::isSelectionSupported() const
668679
{
669680
return m_device && zwlr_data_control_device_v1_get_version(m_device->object())

src/platform/x11/systemclipboard/waylandclipboard.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#pragma once
88
#include <QClipboard>
9+
#include <QElapsedTimer>
910
#include <QObject>
1011
#include <memory>
1112

@@ -25,7 +26,7 @@ class WaylandClipboard final : public QObject
2526
void setMimeData(QMimeData *mime, QClipboard::Mode mode);
2627
void clear(QClipboard::Mode mode);
2728
const QMimeData *mimeData(QClipboard::Mode mode) const;
28-
bool isActive() const { return m_device != nullptr; }
29+
DataControlDevice *device() const;
2930
bool isSelectionSupported() const;
3031

3132
signals:
@@ -37,4 +38,5 @@ class WaylandClipboard final : public QObject
3738

3839
std::unique_ptr<DataControlDeviceManager> m_manager;
3940
std::unique_ptr<DataControlDevice> m_device;
41+
QElapsedTimer m_deviceRequestedTimer;
4042
};

0 commit comments

Comments
 (0)