Merge lp:~dandrader/qtubuntu/dbusClipboard into lp:qtubuntu

Proposed by Daniel d'Andrada
Status: Merged
Approved by: Robert Carr
Approved revision: 244
Merged at revision: 247
Proposed branch: lp:~dandrader/qtubuntu/dbusClipboard
Merge into: lp:qtubuntu
Diff against target: 580 lines (+282/-84)
8 files modified
src/ubuntumirclient/clipboard.cpp (+219/-73)
src/ubuntumirclient/clipboard.h (+31/-2)
src/ubuntumirclient/input.cpp (+3/-1)
src/ubuntumirclient/integration.cpp (+6/-2)
src/ubuntumirclient/integration.h (+4/-2)
src/ubuntumirclient/ubuntumirclient.pro (+1/-1)
src/ubuntumirclient/window.cpp (+15/-2)
src/ubuntumirclient/window.h (+3/-1)
To merge this branch: bzr merge lp:~dandrader/qtubuntu/dbusClipboard
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Robert Carr (community) Approve
Review via email: mp+235502@code.launchpad.net

Commit message

Use the global clipboard from D-Bus

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Robert Carr (robertcarr) wrote :

Why the commenting of debug statements at 412? Beyond that seems ok. The assert in serialization is less concerning on the client side than the server side.

review: Approve
Revision history for this message
Daniel d'Andrada (dandrader) wrote :

> Why the commenting of debug statements at 412?

Because they're ridiculously verbose. A simple swipe produces dozens of lines. So I think it's better for them to be an opt-in thing that you manually enable when you're debugging events. But yeah, not directly related to the objective of that MP.

lp:~dandrader/qtubuntu/dbusClipboard updated
244. By Daniel d'Andrada

Implement contents size limitation on the global clipboard

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Robert Carr (robertcarr) wrote :

thanks for applying fixes from other branch!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/ubuntumirclient/clipboard.cpp'
--- src/ubuntumirclient/clipboard.cpp 2014-06-18 23:10:00 +0000
+++ src/ubuntumirclient/clipboard.cpp 2014-09-23 11:49:39 +0000
@@ -18,9 +18,9 @@
1818
19#include <QtCore/QMimeData>19#include <QtCore/QMimeData>
20#include <QtCore/QStringList>20#include <QtCore/QStringList>
2121#include <QDBusInterface>
22// Platform API22#include <QDBusPendingCallWatcher>
23#include <ubuntu/application/ui/clipboard.h>23#include <QDBusPendingReply>
2424
25// FIXME(loicm) The clipboard data format is not defined by Ubuntu Platform API25// FIXME(loicm) The clipboard data format is not defined by Ubuntu Platform API
26// which makes it impossible to have non-Qt applications communicate with Qt26// which makes it impossible to have non-Qt applications communicate with Qt
@@ -29,19 +29,26 @@
29// embedding different mime types in the clipboard.29// embedding different mime types in the clipboard.
3030
31// Data format:31// Data format:
32// number of mime types (4 bytes)32// number of mime types (sizeof(int))
33// data layout (16 bytes * number of mime types)33// data layout ((4 * sizeof(int)) * number of mime types)
34// mime type string offset (4 bytes)34// mime type string offset (sizeof(int))
35// mime type string size (4 bytes)35// mime type string size (sizeof(int))
36// data offset (4 bytes)36// data offset (sizeof(int))
37// data size (4 bytes)37// data size (sizeof(int))
38// data (n bytes)38// data (n bytes)
3939
40namespace {
41
40const int maxFormatsCount = 16;42const int maxFormatsCount = 16;
41const int maxBufferSize = 4 * 1024 * 1024; // 4 Mb43const int maxBufferSize = 4 * 1024 * 1024; // 4 Mb
4244
45}
46
43UbuntuClipboard::UbuntuClipboard()47UbuntuClipboard::UbuntuClipboard()
44 : mMimeData(new QMimeData)48 : mMimeData(new QMimeData)
49 , mIsOutdated(true)
50 , mUpdatesDisabled(false)
51 , mDBusSetupDone(false)
45{52{
46}53}
4754
@@ -50,80 +57,200 @@
50 delete mMimeData;57 delete mMimeData;
51}58}
5259
60void UbuntuClipboard::requestDBusClipboardContents()
61{
62 if (!mDBusSetupDone) {
63 setupDBus();
64 }
65
66 if (!mPendingGetContentsCall.isNull())
67 return;
68
69 QDBusPendingCall pendingCall = mDBusClipboard->asyncCall("GetContents");
70
71 mPendingGetContentsCall = new QDBusPendingCallWatcher(pendingCall, this);
72
73 QObject::connect(mPendingGetContentsCall.data(), SIGNAL(finished(QDBusPendingCallWatcher*)),
74 this, SLOT(onDBusClipboardGetContentsFinished(QDBusPendingCallWatcher*)));
75}
76
77void UbuntuClipboard::onDBusClipboardGetContentsFinished(QDBusPendingCallWatcher* call)
78{
79 Q_ASSERT(call == mPendingGetContentsCall.data());
80
81 QDBusPendingReply<QByteArray> reply = *call;
82 if (reply.isError()) {
83 qCritical("UbuntuClipboard - Failed to get system clipboard contents via D-Bus. %s, %s",
84 qPrintable(reply.error().name()), qPrintable(reply.error().message()));
85 // TODO: Might try again later a number of times...
86 } else {
87 QByteArray serializedMimeData = reply.argumentAt<0>();
88 updateMimeData(serializedMimeData);
89 }
90 call->deleteLater();
91}
92
93void UbuntuClipboard::onDBusClipboardSetContentsFinished(QDBusPendingCallWatcher *call)
94{
95 QDBusPendingReply<void> reply = *call;
96 if (reply.isError()) {
97 qCritical("UbuntuClipboard - Failed to set the system clipboard contents via D-Bus. %s, %s",
98 qPrintable(reply.error().name()), qPrintable(reply.error().message()));
99 // TODO: Might try again later a number of times...
100 }
101 call->deleteLater();
102}
103
104void UbuntuClipboard::updateMimeData(const QByteArray &serializedMimeData)
105{
106 if (mUpdatesDisabled)
107 return;
108
109 QMimeData *newMimeData = deserializeMimeData(serializedMimeData);
110 if (newMimeData) {
111 delete mMimeData;
112 mMimeData = newMimeData;
113 mIsOutdated = false;
114 emitChanged(QClipboard::Clipboard);
115 } else {
116 qWarning("UbuntuClipboard - Got invalid serialized mime data. Ignoring it.");
117 }
118}
119
120void UbuntuClipboard::setupDBus()
121{
122 QDBusConnection dbusConnection = QDBusConnection::sessionBus();
123
124 bool ok = dbusConnection.connect(
125 "com.canonical.QtMir",
126 "/com/canonical/QtMir/Clipboard",
127 "com.canonical.QtMir.Clipboard",
128 "ContentsChanged",
129 this, SLOT(updateMimeData(QByteArray)));
130 if (!ok) {
131 qCritical("UbuntuClipboard - Failed to connect to ContentsChanged signal form the D-Bus system clipboard.");
132 }
133
134 mDBusClipboard = new QDBusInterface("com.canonical.QtMir",
135 "/com/canonical/QtMir/Clipboard",
136 "com.canonical.QtMir.Clipboard",
137 dbusConnection);
138
139 mDBusSetupDone = true;
140}
141
142QByteArray UbuntuClipboard::serializeMimeData(QMimeData *mimeData) const
143{
144 const QStringList formats = mimeData->formats();
145 const int formatCount = qMin(formats.size(), maxFormatsCount);
146 const int headerSize = sizeof(int) + (formatCount * 4 * sizeof(int));
147 int bufferSize = headerSize;
148
149 for (int i = 0; i < formatCount; i++)
150 bufferSize += formats[i].size() + mimeData->data(formats[i]).size();
151
152 QByteArray serializedMimeData;
153 if (bufferSize <= maxBufferSize) {
154 // Serialize data.
155 serializedMimeData.resize(bufferSize);
156 {
157 char *buffer = serializedMimeData.data();
158 int* header = reinterpret_cast<int*>(serializedMimeData.data());
159 int offset = headerSize;
160 header[0] = formatCount;
161 for (int i = 0; i < formatCount; i++) {
162 const int formatOffset = offset;
163 const int formatSize = formats[i].size();
164 const int dataOffset = offset + formatSize;
165 const int dataSize = mimeData->data(formats[i]).size();
166 memcpy(&buffer[formatOffset], formats[i].toLatin1().data(), formatSize);
167 memcpy(&buffer[dataOffset], mimeData->data(formats[i]).data(), dataSize);
168 header[i*4+1] = formatOffset;
169 header[i*4+2] = formatSize;
170 header[i*4+3] = dataOffset;
171 header[i*4+4] = dataSize;
172 offset += formatSize + dataSize;
173 }
174 }
175 } else {
176 qWarning("UbuntuClipboard: Not sending contents (%d bytes) to the global clipboard as it's"
177 " bigger than the maximum allowed size of %d bytes", bufferSize, maxBufferSize);
178 }
179
180 return serializedMimeData;
181}
182
183QMimeData *UbuntuClipboard::deserializeMimeData(const QByteArray &serializedMimeData) const
184{
185 if (static_cast<std::size_t>(serializedMimeData.size()) < sizeof(int)) {
186 // Data is invalid
187 return nullptr;
188 }
189
190 QMimeData *mimeData = new QMimeData;
191
192 const char* const buffer = serializedMimeData.constData();
193 const int* const header = reinterpret_cast<const int*>(serializedMimeData.constData());
194
195 const int count = qMin(header[0], maxFormatsCount);
196
197 for (int i = 0; i < count; i++) {
198 const int formatOffset = header[i*4+1];
199 const int formatSize = header[i*4+2];
200 const int dataOffset = header[i*4+3];
201 const int dataSize = header[i*4+4];
202
203 if (formatOffset + formatSize <= serializedMimeData.size()
204 && dataOffset + dataSize <= serializedMimeData.size()) {
205
206 QString mimeType = QString::fromLatin1(&buffer[formatOffset], formatSize);
207 QByteArray mimeDataBytes(&buffer[dataOffset], dataSize);
208
209 mimeData->setData(mimeType, mimeDataBytes);
210 }
211 }
212
213 return mimeData;
214}
215
53QMimeData* UbuntuClipboard::mimeData(QClipboard::Mode mode)216QMimeData* UbuntuClipboard::mimeData(QClipboard::Mode mode)
54{217{
55 Q_UNUSED(mode);218 if (mode != QClipboard::Clipboard)
56 // Get clipboard data.219 return nullptr;
57 void* data = NULL;
58 size_t size = 0;
59 ua_ui_get_clipboard_content(&data, &size);
60220
61 // Deserialize, update and return mime data taking care of incorrectly221 if (mIsOutdated && mPendingGetContentsCall.isNull()) {
62 // formatted input.222 requestDBusClipboardContents();
63 mMimeData->clear();
64 if (static_cast<size_t>(size) > sizeof(int) // Should be at least that big to read the count.
65 && data != NULL) {
66 const char* const buffer = reinterpret_cast<char*>(data);
67 const int* const header = reinterpret_cast<int*>(data);
68 const int count = qMin(header[0], maxFormatsCount);
69 for (int i = 0; i < count; i++) {
70 const unsigned int formatOffset = header[i*4+1];
71 const unsigned int formatSize = header[i*4+2];
72 const unsigned int dataOffset = header[i*4+3];
73 const unsigned int dataSize = header[i*4+4];
74 if (formatOffset + formatSize <= size && dataOffset + dataSize <= size) {
75 mMimeData->setData(QString(&buffer[formatOffset]),
76 QByteArray(&buffer[dataOffset], dataSize));
77 }
78 }
79 }223 }
224
225 // Return whatever we have at the moment instead of blocking until we have something.
226 //
227 // This might be called during app startup just for the sake of checking if some
228 // "Paste" UI control should be enabled or not.
229 // We will emit QClipboard::changed() once we finally have something.
80 return mMimeData;230 return mMimeData;
81}231}
82232
83void UbuntuClipboard::setMimeData(QMimeData* mimeData, QClipboard::Mode mode)233void UbuntuClipboard::setMimeData(QMimeData* mimeData, QClipboard::Mode mode)
84{234{
85 Q_UNUSED(mode);235 if (mode != QClipboard::Clipboard)
86 if (mimeData == NULL) {
87 ua_ui_set_clipboard_content(NULL, 0);
88 return;236 return;
89 }237
90238 if (!mPendingGetContentsCall.isNull()) {
91 const QStringList formats = mimeData->formats();239 // Ignore whatever comes from the system clipboard as we are going to change it anyway
92 const int count = qMin(formats.size(), maxFormatsCount);240 QObject::disconnect(mPendingGetContentsCall.data(), 0, this, 0);
93 const int headerSize = sizeof(int) + count * 4 * sizeof(int);241 mUpdatesDisabled = true;
94 int bufferSize = headerSize;242 mPendingGetContentsCall->waitForFinished();
95 char* buffer;243 mUpdatesDisabled = false;
96244 delete mPendingGetContentsCall.data();
97 // Get the buffer size considering the header size, the NULL-terminated245 }
98 // formats and the non NULL-terminated data.246
99 for (int i = 0; i < count; i++)247 QByteArray serializedMimeData = serializeMimeData(mimeData);
100 bufferSize += formats[i].size() + 1 + mimeData->data(formats[i]).size();248 if (!serializedMimeData.isEmpty()) {
101 // FIXME(loicm) Implement max buffer size limitation.249 setDBusClipboardContents(serializedMimeData);
102 // FIXME(loicm) Remove ASSERT before release.250 }
103 Q_ASSERT(bufferSize <= maxBufferSize);251
104252 mMimeData = mimeData;
105 // Serialize data.253 emitChanged(QClipboard::Clipboard);
106 buffer = new char[bufferSize];
107 int* header = reinterpret_cast<int*>(buffer);
108 int offset = headerSize;
109 header[0] = count;
110 for (int i = 0; i < count; i++) {
111 const int formatOffset = offset;
112 const int formatSize = formats[i].size() + 1;
113 const int dataOffset = offset + formatSize;
114 const int dataSize = mimeData->data(formats[i]).size();
115 memcpy(&buffer[formatOffset], formats[i].toLatin1().data(), formatSize);
116 memcpy(&buffer[dataOffset], mimeData->data(formats[i]).data(), dataSize);
117 header[i*4+1] = formatOffset;
118 header[i*4+2] = formatSize;
119 header[i*4+3] = dataOffset;
120 header[i*4+4] = dataSize;
121 offset += formatSize + dataSize;
122 }
123
124 // Set clipboard content.
125 ua_ui_set_clipboard_content(reinterpret_cast<void*>(buffer), bufferSize);
126 delete [] buffer;
127}254}
128255
129bool UbuntuClipboard::supportsMode(QClipboard::Mode mode) const256bool UbuntuClipboard::supportsMode(QClipboard::Mode mode) const
@@ -136,3 +263,22 @@
136 Q_UNUSED(mode);263 Q_UNUSED(mode);
137 return false;264 return false;
138}265}
266
267void UbuntuClipboard::setDBusClipboardContents(const QByteArray &clipboardContents)
268{
269 if (!mPendingSetContentsCall.isNull()) {
270 // Ignore any previous set call as we are going to overwrite it anyway
271 QObject::disconnect(mPendingSetContentsCall.data(), 0, this, 0);
272 mUpdatesDisabled = true;
273 mPendingSetContentsCall->waitForFinished();
274 mUpdatesDisabled = false;
275 delete mPendingSetContentsCall.data();
276 }
277
278 QDBusPendingCall pendingCall = mDBusClipboard->asyncCall("SetContents", clipboardContents);
279
280 mPendingSetContentsCall = new QDBusPendingCallWatcher(pendingCall, this);
281
282 QObject::connect(mPendingSetContentsCall.data(), SIGNAL(finished(QDBusPendingCallWatcher*)),
283 this, SLOT(onDBusClipboardSetContentsFinished(QDBusPendingCallWatcher*)));
284}
139285
=== modified file 'src/ubuntumirclient/clipboard.h'
--- src/ubuntumirclient/clipboard.h 2014-06-18 23:10:00 +0000
+++ src/ubuntumirclient/clipboard.h 2014-09-23 11:49:39 +0000
@@ -19,8 +19,14 @@
1919
20#include <qpa/qplatformclipboard.h>20#include <qpa/qplatformclipboard.h>
2121
22class UbuntuClipboard : public QPlatformClipboard22#include <QMimeData>
23#include <QPointer>
24class QDBusInterface;
25class QDBusPendingCallWatcher;
26
27class UbuntuClipboard : public QObject, public QPlatformClipboard
23{28{
29 Q_OBJECT
24public:30public:
25 UbuntuClipboard();31 UbuntuClipboard();
26 virtual ~UbuntuClipboard();32 virtual ~UbuntuClipboard();
@@ -31,8 +37,31 @@
31 bool supportsMode(QClipboard::Mode mode) const override;37 bool supportsMode(QClipboard::Mode mode) const override;
32 bool ownsMode(QClipboard::Mode mode) const override;38 bool ownsMode(QClipboard::Mode mode) const override;
3339
40 void requestDBusClipboardContents();
41
42private Q_SLOTS:
43 void onDBusClipboardGetContentsFinished(QDBusPendingCallWatcher*);
44 void onDBusClipboardSetContentsFinished(QDBusPendingCallWatcher*);
45 void updateMimeData(const QByteArray &serializedMimeData);
46
34private:47private:
35 QMimeData* mMimeData;48 void setupDBus();
49
50 QByteArray serializeMimeData(QMimeData *mimeData) const;
51 QMimeData *deserializeMimeData(const QByteArray &serializedMimeData) const;
52
53 void setDBusClipboardContents(const QByteArray &clipboardContents);
54
55 QMimeData *mMimeData;
56 bool mIsOutdated;
57
58 QPointer<QDBusInterface> mDBusClipboard;
59
60 QPointer<QDBusPendingCallWatcher> mPendingGetContentsCall;
61 QPointer<QDBusPendingCallWatcher> mPendingSetContentsCall;
62
63 bool mUpdatesDisabled;
64 bool mDBusSetupDone;
36};65};
3766
38#endif // UBUNTU_CLIPBOARD_H67#endif // UBUNTU_CLIPBOARD_H
3968
=== modified file 'src/ubuntumirclient/input.cpp'
--- src/ubuntumirclient/input.cpp 2014-08-14 09:45:04 +0000
+++ src/ubuntumirclient/input.cpp 2014-09-23 11:49:39 +0000
@@ -160,6 +160,7 @@
160}160}
161161
162#ifndef QT_NO_DEBUG162#ifndef QT_NO_DEBUG
163/*
163static const char* nativeEventTypeToStr(int eventType)164static const char* nativeEventTypeToStr(int eventType)
164{165{
165 switch (eventType) {166 switch (eventType) {
@@ -178,6 +179,7 @@
178 return "INVALID!";179 return "INVALID!";
179 }180 }
180}181}
182*/
181#endif183#endif
182184
183void UbuntuInput::customEvent(QEvent* event)185void UbuntuInput::customEvent(QEvent* event)
@@ -199,7 +201,7 @@
199 return;201 return;
200 }202 }
201203
202 DLOG("UbuntuInput::customEvent(type=%s)", nativeEventTypeToStr(nativeEvent->type));204 //DLOG("UbuntuInput::customEvent(type=%s)", nativeEventTypeToStr(nativeEvent->type));
203205
204 // Event dispatching.206 // Event dispatching.
205 switch (nativeEvent->type) {207 switch (nativeEvent->type) {
206208
=== modified file 'src/ubuntumirclient/integration.cpp'
--- src/ubuntumirclient/integration.cpp 2014-08-05 16:02:48 +0000
+++ src/ubuntumirclient/integration.cpp 2014-09-23 11:49:39 +0000
@@ -108,7 +108,6 @@
108108
109UbuntuClientIntegration::~UbuntuClientIntegration()109UbuntuClientIntegration::~UbuntuClientIntegration()
110{110{
111 delete mClipboard;
112 delete mInput;111 delete mInput;
113 delete mInputContext;112 delete mInputContext;
114 delete mScreen;113 delete mScreen;
@@ -157,7 +156,7 @@
157QPlatformWindow* UbuntuClientIntegration::createPlatformWindow(QWindow* window)156QPlatformWindow* UbuntuClientIntegration::createPlatformWindow(QWindow* window)
158{157{
159 QPlatformWindow* platformWindow = new UbuntuWindow(158 QPlatformWindow* platformWindow = new UbuntuWindow(
160 window, static_cast<UbuntuScreen*>(mScreen), mInput, mInstance);159 window, mClipboard, static_cast<UbuntuScreen*>(mScreen), mInput, mInstance);
161 platformWindow->requestActivateWindow();160 platformWindow->requestActivateWindow();
162 return platformWindow;161 return platformWindow;
163}162}
@@ -233,3 +232,8 @@
233 }232 }
234 return QPlatformIntegration::styleHint(hint);233 return QPlatformIntegration::styleHint(hint);
235}234}
235
236QPlatformClipboard* UbuntuClientIntegration::clipboard() const
237{
238 return mClipboard.data();
239}
236240
=== modified file 'src/ubuntumirclient/integration.h'
--- src/ubuntumirclient/integration.h 2014-08-05 16:02:48 +0000
+++ src/ubuntumirclient/integration.h 2014-09-23 11:49:39 +0000
@@ -18,6 +18,7 @@
18#define UBUNTU_CLIENT_INTEGRATION_H18#define UBUNTU_CLIENT_INTEGRATION_H
1919
20#include <qpa/qplatformintegration.h>20#include <qpa/qplatformintegration.h>
21#include <QSharedPointer>
2122
22#include "platformservices.h"23#include "platformservices.h"
2324
@@ -27,6 +28,7 @@
27#include <ubuntu/application/ui/options.h>28#include <ubuntu/application/ui/options.h>
28#include <ubuntu/application/ui/session.h>29#include <ubuntu/application/ui/session.h>
2930
31class UbuntuClipboard;
30class UbuntuInput;32class UbuntuInput;
31class UbuntuScreen;33class UbuntuScreen;
3234
@@ -48,7 +50,7 @@
48 QPlatformServices *services() const override;50 QPlatformServices *services() const override;
49 QPlatformWindow* createPlatformWindow(QWindow* window) const override;51 QPlatformWindow* createPlatformWindow(QWindow* window) const override;
50 QPlatformInputContext* inputContext() const override { return mInputContext; }52 QPlatformInputContext* inputContext() const override { return mInputContext; }
51 QPlatformClipboard* clipboard() const override { return mClipboard; }53 QPlatformClipboard* clipboard() const override;
5254
53 QPlatformOpenGLContext* createPlatformOpenGLContext(QOpenGLContext* context);55 QPlatformOpenGLContext* createPlatformOpenGLContext(QOpenGLContext* context);
54 QPlatformWindow* createPlatformWindow(QWindow* window);56 QPlatformWindow* createPlatformWindow(QWindow* window);
@@ -66,7 +68,7 @@
66 UbuntuScreen* mScreen;68 UbuntuScreen* mScreen;
67 UbuntuInput* mInput;69 UbuntuInput* mInput;
68 QPlatformInputContext* mInputContext;70 QPlatformInputContext* mInputContext;
69 QPlatformClipboard* mClipboard;71 QSharedPointer<UbuntuClipboard> mClipboard;
70 qreal mScaleFactor;72 qreal mScaleFactor;
7173
72 // Platform API stuff74 // Platform API stuff
7375
=== modified file 'src/ubuntumirclient/ubuntumirclient.pro'
--- src/ubuntumirclient/ubuntumirclient.pro 2014-08-14 13:18:24 +0000
+++ src/ubuntumirclient/ubuntumirclient.pro 2014-09-23 11:49:39 +0000
@@ -2,7 +2,7 @@
2TEMPLATE = lib2TEMPLATE = lib
33
4QT -= gui4QT -= gui
5QT += core-private gui-private platformsupport-private sensors5QT += core-private gui-private platformsupport-private sensors dbus
66
7CONFIG += plugin no_keywords qpa/genericunixfontdatabase7CONFIG += plugin no_keywords qpa/genericunixfontdatabase
88
99
=== modified file 'src/ubuntumirclient/window.cpp'
--- src/ubuntumirclient/window.cpp 2014-08-08 14:04:13 +0000
+++ src/ubuntumirclient/window.cpp 2014-09-23 11:49:39 +0000
@@ -15,6 +15,7 @@
15 */15 */
1616
17// Local17// Local
18#include "clipboard.h"
18#include "input.h"19#include "input.h"
19#include "window.h"20#include "window.h"
20#include "screen.h"21#include "screen.h"
@@ -55,17 +56,17 @@
55 QSize bufferSize;56 QSize bufferSize;
56 QSize targetBufferSize;57 QSize targetBufferSize;
57 QMutex mutex;58 QMutex mutex;
59 QSharedPointer<UbuntuClipboard> clipboard;
58};60};
5961
60static void eventCallback(void* context, const WindowEvent* event)62static void eventCallback(void* context, const WindowEvent* event)
61{63{
62 DLOG("eventCallback (context=%p, event=%p)", context, event);
63 DASSERT(context != NULL);64 DASSERT(context != NULL);
64 UbuntuWindow* platformWindow = static_cast<UbuntuWindow*>(context);65 UbuntuWindow* platformWindow = static_cast<UbuntuWindow*>(context);
65 platformWindow->priv()->input->postEvent(platformWindow, event);66 platformWindow->priv()->input->postEvent(platformWindow, event);
66}67}
6768
68UbuntuWindow::UbuntuWindow(QWindow* w, UbuntuScreen* screen,69UbuntuWindow::UbuntuWindow(QWindow* w, QSharedPointer<UbuntuClipboard> clipboard, UbuntuScreen* screen,
69 UbuntuInput* input, UApplicationInstance* instance)70 UbuntuInput* input, UApplicationInstance* instance)
70 : QObject(nullptr), QPlatformWindow(w)71 : QObject(nullptr), QPlatformWindow(w)
71{72{
@@ -77,6 +78,7 @@
77 d->input = input;78 d->input = input;
78 d->state = window()->windowState();79 d->state = window()->windowState();
79 d->uaInstance = instance;80 d->uaInstance = instance;
81 d->clipboard = clipboard;
8082
81 static int id = 1;83 static int id = 1;
82 d->id = id++;84 d->id = id++;
@@ -265,6 +267,17 @@
265{267{
266 LOG("UbuntuWindow::handleSurfaceFocusChange(focused=%s)", focused ? "true" : "false");268 LOG("UbuntuWindow::handleSurfaceFocusChange(focused=%s)", focused ? "true" : "false");
267 QWindow *activatedWindow = focused ? window() : nullptr;269 QWindow *activatedWindow = focused ? window() : nullptr;
270
271 // System clipboard contents might have changed while this window was unfocused and wihtout
272 // this process getting notified about it because it might have been suspended (due to
273 // application lifecycle policies), thus unable to listen to any changes notified through
274 // D-Bus.
275 // Therefore let's ensure we are up to date with the system clipboard now that we are getting
276 // focused again.
277 if (focused) {
278 d->clipboard->requestDBusClipboardContents();
279 }
280
268 QWindowSystemInterface::handleWindowActivated(activatedWindow, Qt::ActiveWindowFocusReason);281 QWindowSystemInterface::handleWindowActivated(activatedWindow, Qt::ActiveWindowFocusReason);
269}282}
270283
271284
=== modified file 'src/ubuntumirclient/window.h'
--- src/ubuntumirclient/window.h 2014-08-08 12:05:21 +0000
+++ src/ubuntumirclient/window.h 2014-09-23 11:49:39 +0000
@@ -18,7 +18,9 @@
18#define UBUNTU_WINDOW_H18#define UBUNTU_WINDOW_H
1919
20#include <qpa/qplatformwindow.h>20#include <qpa/qplatformwindow.h>
21#include <QSharedPointer>
2122
23class UbuntuClipboard;
22class UbuntuInput;24class UbuntuInput;
23class UbuntuScreen;25class UbuntuScreen;
24class UbuntuWindowPrivate;26class UbuntuWindowPrivate;
@@ -27,7 +29,7 @@
27{29{
28 Q_OBJECT30 Q_OBJECT
29public:31public:
30 UbuntuWindow(QWindow* w, UbuntuScreen* screen,32 UbuntuWindow(QWindow* w, QSharedPointer<UbuntuClipboard> clipboard, UbuntuScreen* screen,
31 UbuntuInput* input, void* instance);33 UbuntuInput* input, void* instance);
32 virtual ~UbuntuWindow();34 virtual ~UbuntuWindow();
3335

Subscribers

People subscribed via source and target branches