summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa/qmacclipboard.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/cocoa/qmacclipboard.mm')
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.mm56
1 files changed, 44 insertions, 12 deletions
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm
index 65665ef790..b235625921 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.mm
+++ b/src/plugins/platforms/cocoa/qmacclipboard.mm
@@ -64,6 +64,26 @@ QT_BEGIN_NAMESPACE
QMacPasteboard code
*****************************************************************************/
+class QMacMimeData : public QMimeData
+{
+public:
+ QVariant variantData(const QString &mime) { return retrieveData(mime, QVariant::Invalid); }
+private:
+ QMacMimeData();
+};
+
+QMacPasteboard::Promise::Promise(int itemId, QMacInternalPasteboardMime *c, QString m, QMacMimeData *md, int o, DataRequestType drt)
+ : itemId(itemId), offset(o), convertor(c), mime(m), dataRequestType(drt)
+{
+ // Request the data from the application immediately for eager requests.
+ if (dataRequestType == QMacPasteboard::EagerRequest) {
+ variantData = md->variantData(m);
+ mimeData = 0;
+ } else {
+ mimeData = md;
+ }
+}
+
QMacPasteboard::QMacPasteboard(PasteboardRef p, uchar mt)
{
mac_mime_source = false;
@@ -103,6 +123,11 @@ QMacPasteboard::~QMacPasteboard()
// commit all promises for paste after exit close
for (int i = 0; i < promises.count(); ++i) {
const Promise &promise = promises.at(i);
+ // At this point app teardown has started and control is somewhere in the Q[Core]Application
+ // destructor. Skip "lazy" promises where the application has not provided data;
+ // the application will generally not be in a state to provide it.
+ if (promise.dataRequestType == LazyRequest)
+ continue;
QCFString flavor = QCFString(promise.convertor->flavorFor(promise.mime));
NSInteger pbItemId = promise.itemId;
promiseKeeper(paste, reinterpret_cast<PasteboardItemID>(pbItemId), flavor, this);
@@ -155,7 +180,17 @@ OSStatus QMacPasteboard::promiseKeeper(PasteboardRef paste, PasteboardItemID id,
qPrintable(flavorAsQString), qPrintable(promise.convertor->convertorName()), promise.offset);
#endif
- QList<QByteArray> md = promise.convertor->convertFromMime(promise.mime, promise.data, flavorAsQString);
+ // Get the promise data. If this is a "lazy" promise call variantData()
+ // to request the data from the application.
+ QVariant promiseData;
+ if (promise.dataRequestType == LazyRequest) {
+ if (!promise.mimeData.isNull())
+ promiseData = promise.mimeData->variantData(promise.mime);
+ } else {
+ promiseData = promise.variantData;
+ }
+
+ QList<QByteArray> md = promise.convertor->convertFromMime(promise.mime, promiseData, flavorAsQString);
if (md.size() <= promise.offset)
return cantGetFlavorErr;
const QByteArray &ba = md[promise.offset];
@@ -266,16 +301,8 @@ QMimeData
return mime;
}
-class QMacMimeData : public QMimeData
-{
-public:
- QVariant variantData(const QString &mime) { return retrieveData(mime, QVariant::Invalid); }
-private:
- QMacMimeData();
-};
-
void
-QMacPasteboard::setMimeData(QMimeData *mime_src)
+QMacPasteboard::setMimeData(QMimeData *mime_src, DataRequestType dataRequestType)
{
if (!paste)
return;
@@ -312,12 +339,17 @@ QMacPasteboard::setMimeData(QMimeData *mime_src)
continue;
QString flavor(c->flavorFor(mimeType));
if (!flavor.isEmpty()) {
- QVariant mimeData = static_cast<QMacMimeData*>(mime_src)->variantData(mimeType);
+ QMacMimeData *mimeData = static_cast<QMacMimeData*>(mime_src);
int numItems = c->count(mime_src);
for (int item = 0; item < numItems; ++item) {
const NSInteger itemID = item+1; //id starts at 1
- promises.append(QMacPasteboard::Promise(itemID, c, mimeType, mimeData, item));
+ //QMacPasteboard::Promise promise = (dataRequestType == QMacPasteboard::EagerRequest) ?
+ // QMacPasteboard::Promise::eagerPromise(itemID, c, mimeType, mimeData, item) :
+ // QMacPasteboard::Promise::lazyPromise(itemID, c, mimeType, mimeData, item);
+
+ QMacPasteboard::Promise promise(itemID, c, mimeType, mimeData, item, dataRequestType);
+ promises.append(promise);
PasteboardPutItemFlavor(paste, reinterpret_cast<PasteboardItemID>(itemID), QCFString(flavor), 0, kPasteboardFlavorNoFlags);
#ifdef DEBUG_PASTEBOARD
qDebug(" - adding %d %s [%s] <%s> [%d]",