summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/xcb/qxcbclipboard.cpp6
-rw-r--r--src/plugins/platforms/xcb/qxcbclipboard.h2
-rw-r--r--src/plugins/platforms/xcb/qxcbdrag.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbdrag.h2
4 files changed, 8 insertions, 4 deletions
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
index 3a9eaefa62..f021ab8b4a 100644
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
@@ -846,13 +846,15 @@ QByteArray QXcbClipboard::getDataInFormat(xcb_atom_t modeAtom, xcb_atom_t fmtAto
return getSelection(modeAtom, fmtAtom, atom(QXcbAtom::_QT_SELECTION));
}
-QByteArray QXcbClipboard::getSelection(xcb_atom_t selection, xcb_atom_t target, xcb_atom_t property)
+QByteArray QXcbClipboard::getSelection(xcb_atom_t selection, xcb_atom_t target, xcb_atom_t property, xcb_timestamp_t time)
{
QByteArray buf;
xcb_window_t win = requestor();
+ if (time == 0) time = connection()->time();
+
xcb_delete_property(xcb_connection(), win, property);
- xcb_convert_selection(xcb_connection(), win, selection, target, property, connection()->time());
+ xcb_convert_selection(xcb_connection(), win, selection, target, property, time);
connection()->sync();
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.h b/src/plugins/platforms/xcb/qxcbclipboard.h
index 31d99c758d..709ea3b953 100644
--- a/src/plugins/platforms/xcb/qxcbclipboard.h
+++ b/src/plugins/platforms/xcb/qxcbclipboard.h
@@ -84,7 +84,7 @@ public:
QByteArray getDataInFormat(xcb_atom_t modeAtom, xcb_atom_t fmtatom);
xcb_window_t getSelectionOwner(xcb_atom_t atom) const;
- QByteArray getSelection(xcb_atom_t selection, xcb_atom_t target, xcb_atom_t property);
+ QByteArray getSelection(xcb_atom_t selection, xcb_atom_t target, xcb_atom_t property, xcb_timestamp_t t = 0);
private:
xcb_generic_event_t *waitForClipboardEvent(xcb_window_t win, int type, int timeout, bool checkManager = false);
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
index 82a3fc8a83..247b2c991b 100644
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
@@ -1233,7 +1233,7 @@ QVariant QXcbDropData::xdndObtainData(const QByteArray &format, QVariant::Type r
return result; // should never happen?
xcb_atom_t xdnd_selection = c->atom(QXcbAtom::XdndSelection);
- result = c->clipboard()->getSelection(xdnd_selection, a, xdnd_selection);
+ result = c->clipboard()->getSelection(xdnd_selection, a, xdnd_selection, drag->targetTime());
return mimeConvertToFormat(c, a, result, QLatin1String(format), requestedType, encoding);
}
diff --git a/src/plugins/platforms/xcb/qxcbdrag.h b/src/plugins/platforms/xcb/qxcbdrag.h
index 19b7dd7f96..ef277e7eec 100644
--- a/src/plugins/platforms/xcb/qxcbdrag.h
+++ b/src/plugins/platforms/xcb/qxcbdrag.h
@@ -98,6 +98,7 @@ public:
bool dndEnable(QXcbWindow *win, bool on);
void updatePixmap();
+ xcb_timestamp_t targetTime() { return target_time; }
protected:
void timerEvent(QTimerEvent* e);
@@ -128,6 +129,7 @@ private:
enum { xdnd_max_type = 100 };
QList<xcb_atom_t> xdnd_types;
+ // timestamp from XdndPosition and XdndDroptime for retrieving the data
xcb_timestamp_t target_time;
xcb_timestamp_t source_time;