@@ -115,46 +115,58 @@ class ClipboardDataGuard final {
115
115
};
116
116
117
117
explicit ClipboardDataGuard (const QMimeData &data, bool *abortCloning = nullptr )
118
- : m_dataGuard (&data)
118
+ : m_data (&data)
119
119
, m_abort(abortCloning)
120
120
{
121
+ // This uses simple connection to ensure pointer is not destroyed
122
+ // instead of QPointer to work around a possible Qt bug
123
+ // (https://bugzilla.redhat.com/show_bug.cgi?id=2320093).
124
+ m_connection = QObject::connect (m_data, &QObject::destroyed, [this ](){
125
+ m_data = nullptr ;
126
+ log ( QStringLiteral (" Clipboard data deleted" ), LogWarning );
127
+ });
121
128
m_timerExpire.start ();
122
129
}
123
130
131
+ ~ClipboardDataGuard ()
132
+ {
133
+ QObject::disconnect (m_connection);
134
+ }
135
+
124
136
QStringList formats ()
125
137
{
126
138
ElapsedGuard _ (QStringLiteral (), QStringLiteral (" formats" ));
127
- return refresh () ? m_dataGuard ->formats () : QStringList ();
139
+ return refresh () ? m_data ->formats () : QStringList ();
128
140
}
129
141
130
142
bool hasFormat (const QString &mime)
131
143
{
132
144
ElapsedGuard _ (QStringLiteral (" hasFormat" ), mime);
133
- return refresh () && m_dataGuard ->hasFormat (mime);
145
+ return refresh () && m_data ->hasFormat (mime);
134
146
}
135
147
136
148
QByteArray data (const QString &mime)
137
149
{
138
150
ElapsedGuard _ (QStringLiteral (" data" ), mime);
139
- return refresh () ? m_dataGuard ->data (mime) : QByteArray ();
151
+ return refresh () ? m_data ->data (mime) : QByteArray ();
140
152
}
141
153
142
154
QList<QUrl> urls ()
143
155
{
144
156
ElapsedGuard _ (QStringLiteral (), QStringLiteral (" urls" ));
145
- return refresh () ? m_dataGuard ->urls () : QList<QUrl>();
157
+ return refresh () ? m_data ->urls () : QList<QUrl>();
146
158
}
147
159
148
160
QString text ()
149
161
{
150
162
ElapsedGuard _ (QStringLiteral (), QStringLiteral (" text" ));
151
- return refresh () ? m_dataGuard ->text () : QString ();
163
+ return refresh () ? m_data ->text () : QString ();
152
164
}
153
165
154
166
bool hasText ()
155
167
{
156
168
ElapsedGuard _ (QStringLiteral (), QStringLiteral (" hasText" ));
157
- return refresh () && m_dataGuard ->hasText ();
169
+ return refresh () && m_data ->hasText ();
158
170
}
159
171
160
172
QImage getImageData ()
@@ -165,7 +177,7 @@ class ClipboardDataGuard final {
165
177
166
178
// NOTE: Application hangs if using multiple sessions and
167
179
// calling QMimeData::hasImage() on X11 clipboard.
168
- QImage image = m_dataGuard ->imageData ().value <QImage>();
180
+ QImage image = m_data ->imageData ().value <QImage>();
169
181
if ( image.isNull () ) {
170
182
image.loadFromData ( data (QStringLiteral (" image/png" )), " png" );
171
183
if ( image.isNull () ) {
@@ -209,25 +221,26 @@ class ClipboardDataGuard final {
209
221
if (m_abort && *m_abort)
210
222
return false ;
211
223
212
- if (m_dataGuard. isNull () )
224
+ if (!m_data )
213
225
return false ;
214
226
215
227
const auto elapsed = m_timerExpire.elapsed ();
216
228
if (elapsed > 5000 ) {
217
229
log (QStringLiteral (" Clipboard data expired, refusing to access old data" ), LogWarning);
218
- m_dataGuard = nullptr ;
230
+ m_data = nullptr ;
219
231
return false ;
220
232
}
221
233
222
234
if (elapsed > 100 )
223
235
QCoreApplication::processEvents ();
224
236
225
- return !m_dataGuard. isNull () ;
237
+ return m_data ;
226
238
}
227
239
228
- QPointer< const QMimeData> m_dataGuard ;
240
+ const QMimeData *m_data ;
229
241
QElapsedTimer m_timerExpire;
230
242
bool *m_abort = nullptr ;
243
+ QMetaObject::Connection m_connection;
231
244
232
245
#ifdef COPYQ_WS_X11
233
246
WakeUpThread m_wakeUpThread;
0 commit comments