diff --git a/0001-Add-remote-print-queue-support.patch b/0001-Add-remote-print-queue-support.patch new file mode 100644 index 0000000..596e461 --- /dev/null +++ b/0001-Add-remote-print-queue-support.patch @@ -0,0 +1,292 @@ +From d3faa880d19d9bf5b411dc81c0d5d881a323997d Mon Sep 17 00:00:00 2001 +From: Antonio Larrosa +Date: Tue, 6 Jun 2017 16:34:32 +0200 +Subject: [PATCH] Add remote print queue support + +Cups servers which announce themselves on avahi will be shown in +the printer dialog. This adds a delay the first time the print dialog +is opened in order to search for print queues . If you don't have any +network printer queue and you find the delay too annoying, it can be +disabled by setting the QT_DISABLE_PRINTER_DISCOVERY environment variable +to 1 + +Change-Id: Ib70715d331e8f380a3c9039011bb8521986652aa +--- + src/plugins/printsupport/cups/qcupsprintengine.cpp | 35 +++++++- + .../printsupport/cups/qcupsprintersupport.cpp | 95 ++++++++++++++++++++-- + .../printsupport/cups/qcupsprintersupport_p.h | 8 ++ + src/plugins/printsupport/cups/qppdprintdevice.cpp | 33 +++++++- + 4 files changed, 160 insertions(+), 11 deletions(-) + +diff --git a/src/plugins/printsupport/cups/qcupsprintengine.cpp b/src/plugins/printsupport/cups/qcupsprintengine.cpp +index a16eb3abb5..6dc123fb51 100644 +--- a/src/plugins/printsupport/cups/qcupsprintengine.cpp ++++ b/src/plugins/printsupport/cups/qcupsprintengine.cpp +@@ -48,6 +48,7 @@ + #include + #include "private/qcups_p.h" // Only needed for PPK_CupsOptions + #include ++#include "qcupsprintersupport_p.h" + + #include + +@@ -241,8 +242,40 @@ void QCupsPrintEnginePrivate::closePrintDevice() + + // Print the file. + cups_option_t* optPtr = cupsOptStruct.size() ? &cupsOptStruct.first() : 0; +- cupsPrintFile(printerName.toLocal8Bit().constData(), tempFile.toLocal8Bit().constData(), ++ ++ bool fallbackToLocal = false; ++ cups_dest_t *cupsDest = NULL; ++ ++ if (qEnvironmentVariableIsSet("QT_DISABLE_PRINTER_DISCOVERY")) { ++ fallbackToLocal = true; ++ } else { ++ cupsDest = cupsGetDest(printerName.toLocal8Bit(), NULL, QCupsPrinterSupport::cupsPrintersCount(), QCupsPrinterSupport::cupsPrinters()); ++ } ++ ++ if (cupsDest) { ++ char resource[HTTP_MAX_URI]; ++ http_t *http = cupsConnectDest (cupsDest, 0, -1, 0, ++ resource, sizeof (resource), ++ 0, 0); ++ if (http) { ++ char *name = strrchr (resource, '/'); ++ qDebug() << "resource:" << resource << "," << name; ++ if (name) ++ cupsPrintFile2 (http, ++name, tempFile.toLocal8Bit().constData(), + title.toLocal8Bit().constData(), cupsOptStruct.size(), optPtr); ++ httpClose(http); ++ } else { ++ fallbackToLocal=true; ++ } ++ } ++ else { ++ fallbackToLocal=true; ++ } ++ ++ if (fallbackToLocal) { ++ cupsPrintFile(printerName.toLocal8Bit().constData(), tempFile.toLocal8Bit().constData(), ++ title.toLocal8Bit().constData(), cupsOptStruct.size(), optPtr); ++ } + + QFile::remove(tempFile); + } +diff --git a/src/plugins/printsupport/cups/qcupsprintersupport.cpp b/src/plugins/printsupport/cups/qcupsprintersupport.cpp +index 1887625406..a145beaf18 100644 +--- a/src/plugins/printsupport/cups/qcupsprintersupport.cpp ++++ b/src/plugins/printsupport/cups/qcupsprintersupport.cpp +@@ -52,6 +52,35 @@ + # include + #endif + ++typedef struct ++{ ++ cups_dest_t *printers; ++ int num_printers; ++} EnumDestsContext; ++ ++static int enum_dest_cb2 (void *user_data, unsigned flags, cups_dest_t *dest) ++{ ++ EnumDestsContext *context = (EnumDestsContext *) user_data; ++ if ((flags & (CUPS_DEST_FLAGS_UNCONNECTED | ++ CUPS_DEST_FLAGS_REMOVED | ++ CUPS_DEST_FLAGS_ERROR | ++ CUPS_DEST_FLAGS_RESOLVING | ++ CUPS_DEST_FLAGS_CONNECTING | ++ CUPS_DEST_FLAGS_CANCELED)) == 0) { ++ ++ context->num_printers = cupsCopyDest (dest, context->num_printers, ++ &context->printers); ++ ++ // Also copy whether this is the local default / ++ cups_dest_t *the_dest; ++ the_dest = cupsGetDest(dest->name, dest->instance, ++ context->num_printers, context->printers); ++ the_dest->is_default = dest->is_default; ++ qDebug() << dest->name << "_" << dest->instance << "_" << context->num_printers; ++ } ++ return 1; ++} ++ + QT_BEGIN_NAMESPACE + + QCupsPrinterSupport::QCupsPrinterSupport() +@@ -81,17 +110,35 @@ QPrintDevice QCupsPrinterSupport::createPrintDevice(const QString &id) + + QStringList QCupsPrinterSupport::availablePrintDeviceIds() const + { +- QStringList list; ++/* // Reset cache disabled for now ++ if (qt_cups_printers) { ++ cupsFreeDests( qt_cups_num_printers, qt_cups_printers ); ++ qt_cups_printers = NULL; ++ qt_cups_num_printers = 0; ++ } ++*/ + cups_dest_t *dests; +- int count = cupsGetDests(&dests); +- list.reserve(count); +- for (int i = 0; i < count; ++i) { ++ bool disablePrinterDiscovery = qEnvironmentVariableIsSet("QT_DISABLE_PRINTER_DISCOVERY"); ++ if (disablePrinterDiscovery) { ++ qt_cups_num_printers = cupsGetDests(&dests); ++ } else { ++ if (qt_cups_num_printers == 0) ++ QCupsPrinterSupport::fillCupsPrinters(); ++ ++ dests = qt_cups_printers; ++ } ++ QStringList list; ++ list.reserve(qt_cups_num_printers); ++ for (int i = 0; i < qt_cups_num_printers; ++i) { + QString printerId = QString::fromLocal8Bit(dests[i].name); + if (dests[i].instance) + printerId += QLatin1Char('/') + QString::fromLocal8Bit(dests[i].instance); + list.append(printerId); + } +- cupsFreeDests(count, dests); ++ if (disablePrinterDiscovery) { ++ cupsFreeDests(qt_cups_num_printers, dests); ++ } ++ + return list; + } + +@@ -99,8 +146,18 @@ QString QCupsPrinterSupport::defaultPrintDeviceId() const + { + QString printerId; + cups_dest_t *dests; +- int count = cupsGetDests(&dests); +- for (int i = 0; i < count; ++i) { ++ ++ bool disablePrinterDiscovery = qEnvironmentVariableIsSet("QT_DISABLE_PRINTER_DISCOVERY"); ++ if (disablePrinterDiscovery) { ++ qt_cups_num_printers = cupsGetDests(&dests); ++ } else { ++ if (qt_cups_num_printers == 0) ++ QCupsPrinterSupport::fillCupsPrinters(); ++ ++ dests = qt_cups_printers; ++ } ++ ++ for (int i = 0; i < qt_cups_num_printers; ++i) { + if (dests[i].is_default) { + printerId = QString::fromLocal8Bit(dests[i].name); + if (dests[i].instance) { +@@ -109,8 +166,30 @@ QString QCupsPrinterSupport::defaultPrintDeviceId() const + } + } + } +- cupsFreeDests(count, dests); ++ if (disablePrinterDiscovery) { ++ cupsFreeDests(qt_cups_num_printers, dests); ++ } + return printerId; + } + ++void QCupsPrinterSupport::fillCupsPrinters() ++{ ++ EnumDestsContext context; ++ context.printers = 0; ++ context.num_printers = 0; ++ ++ qDebug() << "begin enumerating printers"; ++ ++ cupsEnumDests(CUPS_DEST_FLAGS_NONE, 4000, NULL, 0, 0, ++ enum_dest_cb2, &context); ++ ++ qDebug() << "end enumerating printers"; ++ qt_cups_printers = context.printers; ++ qt_cups_num_printers = context.num_printers; ++} ++ ++cups_dest_t *QCupsPrinterSupport::qt_cups_printers = NULL; ++int QCupsPrinterSupport::qt_cups_num_printers = 0; ++ ++ + QT_END_NAMESPACE +diff --git a/src/plugins/printsupport/cups/qcupsprintersupport_p.h b/src/plugins/printsupport/cups/qcupsprintersupport_p.h +index 13f64b5e69..81eaa09882 100644 +--- a/src/plugins/printsupport/cups/qcupsprintersupport_p.h ++++ b/src/plugins/printsupport/cups/qcupsprintersupport_p.h +@@ -56,6 +56,8 @@ + + #include + ++#include ++ + QT_BEGIN_NAMESPACE + + class QCupsPrinterSupport : public QPlatformPrinterSupport +@@ -71,8 +73,14 @@ public: + QStringList availablePrintDeviceIds() const Q_DECL_OVERRIDE; + QString defaultPrintDeviceId() const Q_DECL_OVERRIDE; + ++ static void fillCupsPrinters(); ++ static cups_dest_t *cupsPrinters() { return qt_cups_printers; }; ++ static int cupsPrintersCount() { return qt_cups_num_printers; }; + private: + QString cupsOption(int i, const QString &key) const; ++ ++ static cups_dest_t *qt_cups_printers; ++ static int qt_cups_num_printers; + }; + + QT_END_NAMESPACE +diff --git a/src/plugins/printsupport/cups/qppdprintdevice.cpp b/src/plugins/printsupport/cups/qppdprintdevice.cpp +index 9efa83d409..5b7222902d 100644 +--- a/src/plugins/printsupport/cups/qppdprintdevice.cpp ++++ b/src/plugins/printsupport/cups/qppdprintdevice.cpp +@@ -41,6 +41,7 @@ + + #include + #include ++#include "qcupsprintersupport_p.h" + + #ifndef QT_LINUXBASE // LSB merges everything into cups.h + #include +@@ -451,10 +452,38 @@ void QPpdPrintDevice::loadPrinter() + m_cupsDest = 0; + } + ++ bool disablePrinterDiscovery = qEnvironmentVariableIsSet("QT_DISABLE_PRINTER_DISCOVERY"); ++ + // Get the print instance and PPD file +- m_cupsDest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, m_cupsName, m_cupsInstance); ++ ++ if (disablePrinterDiscovery) { ++ m_cupsDest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, m_cupsName, m_cupsInstance); ++ } else { ++ cups_dest_t *cupsDest = cupsGetDest( m_cupsName, ++ (m_cupsInstance.isEmpty() ? NULL : m_cupsInstance.data()), ++ QCupsPrinterSupport::cupsPrintersCount(), ++ QCupsPrinterSupport::cupsPrinters() ); ++ cupsCopyDest(cupsDest, 0, &m_cupsDest); ++ } + if (m_cupsDest) { +- const char *ppdFile = cupsGetPPD(m_cupsName); ++ char resource[HTTP_MAX_URI]; ++ http_t *http = NULL; ++ const char *ppdFile = NULL; ++ ++ if (!disablePrinterDiscovery) { ++ http = cupsConnectDest (m_cupsDest, 0, -1, 0, ++ resource, sizeof (resource), ++ 0, 0); ++ } ++ if (http) { ++ char *name = strrchr (resource, '/'); ++ if (name) ++ ppdFile = cupsGetPPD2 (http, ++name); ++ httpClose(http); ++ } else { ++ ppdFile = cupsGetPPD(m_cupsName); ++ } ++ + if (ppdFile) { + m_ppd = ppdOpenFile(ppdFile); + unlink(ppdFile); +-- +2.13.0 + diff --git a/0001-Fix-open-chmod-race-condition-in-QSaveFile.patch b/0001-Fix-open-chmod-race-condition-in-QSaveFile.patch new file mode 100644 index 0000000..caaf450 --- /dev/null +++ b/0001-Fix-open-chmod-race-condition-in-QSaveFile.patch @@ -0,0 +1,33 @@ +From e840a7ed21bc8e93e2e87fec25dd98aa0039fca1 Mon Sep 17 00:00:00 2001 +From: Antonio Larrosa +Date: Tue, 18 Apr 2017 17:56:35 +0200 +Subject: [PATCH] Fix open/chmod race condition in QSaveFile + +This fixes a problem introduced in a60571b3700e80f44705ebc4bab9628cf852891c +by which a temporary file could be created with mode 0666 (0644 after +applying umask), and then changed to 0600, but in the meantime it would +be possible for anyone to get a working file descriptor that could be used +to read the file. See https://bugzilla.suse.com/show_bug.cgi?id=1034005. + +Change-Id: I824025f54d6faf853da88e4dfcb092b577b4df04 +--- + src/corelib/io/qsavefile.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/corelib/io/qsavefile.cpp b/src/corelib/io/qsavefile.cpp +index 5a325f8e2c..af90b96d82 100644 +--- a/src/corelib/io/qsavefile.cpp ++++ b/src/corelib/io/qsavefile.cpp +@@ -216,7 +216,8 @@ bool QSaveFile::open(OpenMode mode) + } + + d->fileEngine = new QTemporaryFileEngine; +- static_cast(d->fileEngine)->initialize(d->finalFileName, 0666); ++ int perm = (existingFile.exists() ? 0600 : 0666); ++ static_cast(d->fileEngine)->initialize(d->finalFileName, perm); + // Same as in QFile: QIODevice provides the buffering, so there's no need to request it from the file engine. + if (!d->fileEngine->open(mode | QIODevice::Unbuffered)) { + QFileDevice::FileError err = d->fileEngine->error(); +-- +2.12.2 + diff --git a/Fix-some-QtDBus-crashes-during-application-destruction.patch b/Fix-some-QtDBus-crashes-during-application-destruction.patch deleted file mode 100644 index 0516d39..0000000 --- a/Fix-some-QtDBus-crashes-during-application-destruction.patch +++ /dev/null @@ -1,120 +0,0 @@ -From d060b7aa5fc64902ea89416e58b57d6a90f5aea6 Mon Sep 17 00:00:00 2001 -From: Thiago Macieira -Date: Tue, 31 May 2016 17:33:03 -0300 -Subject: [PATCH] Fix some QtDBus crashes during application destruction - -It's possible that some code executes after QDBusConnectionManager is -destroyed and still tries to access QtDBus. Protect against such -crashes. - -Change-Id: I87e17314d8b24ae983b1fffd1453c13fbd3cf48e ---- - src/dbus/qdbusconnection.cpp | 12 ++++++++---- - src/dbus/qdbusintegrator.cpp | 3 +++ - src/dbus/qdbusserver.cpp | 12 ++++++++++-- - 3 files changed, 21 insertions(+), 6 deletions(-) - -diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp -index 4db6396..c1c4f05 100644 ---- a/src/dbus/qdbusconnection.cpp -+++ b/src/dbus/qdbusconnection.cpp -@@ -429,7 +429,7 @@ void QDBusConnectionManager::createServer(const QString &address, void *server) - */ - QDBusConnection::QDBusConnection(const QString &name) - { -- if (name.isEmpty()) { -+ if (name.isEmpty() || _q_manager.isDestroyed()) { - d = 0; - } else { - QMutexLocker locker(&_q_manager()->mutex); -@@ -494,7 +494,7 @@ QDBusConnection &QDBusConnection::operator=(const QDBusConnection &other) - */ - QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name) - { -- if (!qdbus_loadLibDBus()) { -+ if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) { - QDBusConnectionPrivate *d = 0; - return QDBusConnection(d); - } -@@ -508,7 +508,7 @@ QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name) - QDBusConnection QDBusConnection::connectToBus(const QString &address, - const QString &name) - { -- if (!qdbus_loadLibDBus()) { -+ if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) { - QDBusConnectionPrivate *d = 0; - return QDBusConnection(d); - } -@@ -523,7 +523,7 @@ QDBusConnection QDBusConnection::connectToBus(const QString &address, - QDBusConnection QDBusConnection::connectToPeer(const QString &address, - const QString &name) - { -- if (!qdbus_loadLibDBus()) { -+ if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) { - QDBusConnectionPrivate *d = 0; - return QDBusConnection(d); - } -@@ -1178,6 +1178,8 @@ bool QDBusConnection::unregisterService(const QString &serviceName) - */ - QDBusConnection QDBusConnection::sessionBus() - { -+ if (_q_manager.isDestroyed()) -+ return QDBusConnection(Q_NULLPTR); - return QDBusConnection(_q_manager()->busConnection(SessionBus)); - } - -@@ -1190,6 +1192,8 @@ QDBusConnection QDBusConnection::sessionBus() - */ - QDBusConnection QDBusConnection::systemBus() - { -+ if (_q_manager.isDestroyed()) -+ return QDBusConnection(Q_NULLPTR); - return QDBusConnection(_q_manager()->busConnection(SystemBus)); - } - -diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp -index 37d2ae1..9ea30d1 100644 ---- a/src/dbus/qdbusintegrator.cpp -+++ b/src/dbus/qdbusintegrator.cpp -@@ -293,6 +293,9 @@ static void qDBusNewConnection(DBusServer *server, DBusConnection *connection, v - Q_ASSERT(connection); - Q_ASSERT(data); - -+ if (!QDBusConnectionManager::instance()) -+ return; -+ - // keep the connection alive - q_dbus_connection_ref(connection); - QDBusConnectionPrivate *serverConnection = static_cast(data); -diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp -index babb270..ecb7d4f 100644 ---- a/src/dbus/qdbusserver.cpp -+++ b/src/dbus/qdbusserver.cpp -@@ -62,7 +62,11 @@ QDBusServer::QDBusServer(const QString &address, QObject *parent) - if (!qdbus_loadLibDBus()) - return; - -- emit QDBusConnectionManager::instance()->serverRequested(address, this); -+ QDBusConnectionManager *instance = QDBusConnectionManager::instance(); -+ if (!instance) -+ return; -+ -+ emit instance->serverRequested(address, this); - QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)), - this, SLOT(_q_newConnection(QDBusConnectionPrivate*)), Qt::QueuedConnection); - } -@@ -87,7 +91,11 @@ QDBusServer::QDBusServer(QObject *parent) - return; - } - -- emit QDBusConnectionManager::instance()->serverRequested(address, this); -+ QDBusConnectionManager *instance = QDBusConnectionManager::instance(); -+ if (!instance) -+ return; -+ -+ emit instance->serverRequested(address, this); - QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)), - this, SLOT(_q_newConnection(QDBusConnectionPrivate*)), Qt::QueuedConnection); - } --- -2.7.4 diff --git a/Merge-the-QDBusMetaTypes-custom-information-to-QDBusConnectionManager.patch b/Merge-the-QDBusMetaTypes-custom-information-to-QDBusConnectionManager.patch deleted file mode 100644 index b025049..0000000 --- a/Merge-the-QDBusMetaTypes-custom-information-to-QDBusConnectionManager.patch +++ /dev/null @@ -1,428 +0,0 @@ -From 93eb0169cbec0de47a66c1b78b734863fb921326 Mon Sep 17 00:00:00 2001 -From: Thiago Macieira -Date: Thu, 28 Apr 2016 15:00:58 -0700 -Subject: [PATCH] Merge the QDBusMetaType's custom information to - QDBusConnectionManager - -This allows us to get rid of two Q_GLOBAL_STATIC in QtDBus, which means -fewer opportunities for screwing up the order of destruction. And since -QDBusConnectionManager now ensures that the types are initialized, we -don't need to re-initialize them everywhere. - -The Q_GLOBAL_STATIC for QDBusConnectionManager ensures the proper -thread-safe locking, so we don't need to lock for every type that we're -trying to register. This should make things faster. - -But as a side-effect, trying to register a D-Bus metatype will cause the -QDBusConnectionManager thread to start too. - -Change-Id: Ifea6e497f11a461db432ffff1449a4e535234485 ---- - src/dbus/qdbusconnection.cpp | 1 + - src/dbus/qdbusconnectionmanager_p.h | 3 +- - src/dbus/qdbusintegrator.cpp | 1 - - src/dbus/qdbusmetatype.cpp | 185 +++++++++++++++++++----------------- - src/dbus/qdbusmetatype_p.h | 27 +++++- - src/dbus/qdbusmisc.cpp | 3 +- - 6 files changed, 127 insertions(+), 93 deletions(-) - -diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp -index 34b3da7..4db6396 100644 ---- a/src/dbus/qdbusconnection.cpp -+++ b/src/dbus/qdbusconnection.cpp -@@ -193,6 +193,7 @@ void QDBusConnectionManager::run() - } - } - connectionHash.clear(); -+ customTypes.clear(); - - // allow deletion from any thread without warning - moveToThread(Q_NULLPTR); -diff --git a/src/dbus/qdbusconnectionmanager_p.h b/src/dbus/qdbusconnectionmanager_p.h -index c0ab48e..97ecc74 100644 ---- a/src/dbus/qdbusconnectionmanager_p.h -+++ b/src/dbus/qdbusconnectionmanager_p.h -@@ -48,13 +48,14 @@ - #define QDBUSCONNECTIONMANAGER_P_H - - #include "qdbusconnection_p.h" -+#include "qdbusmetatype_p.h" - #include "private/qthread_p.h" - - #ifndef QT_NO_DBUS - - QT_BEGIN_NAMESPACE - --class QDBusConnectionManager : public QDaemonThread -+class QDBusConnectionManager : public QDaemonThread, public QDBusMetaTypeId - { - Q_OBJECT - struct ConnectionRequestData; -diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp -index 3be775d..37d2ae1 100644 ---- a/src/dbus/qdbusintegrator.cpp -+++ b/src/dbus/qdbusintegrator.cpp -@@ -1019,7 +1019,6 @@ QDBusConnectionPrivate::QDBusConnectionPrivate(QObject *p) - qdbusThreadDebug = qdbusDefaultThreadDebug; - #endif - -- QDBusMetaTypeId::init(); - connect(this, &QDBusConnectionPrivate::dispatchStatusChanged, - this, &QDBusConnectionPrivate::doDispatch, Qt::QueuedConnection); - connect(this, &QDBusConnectionPrivate::spyHooksFinished, -diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp -index 2aaf0e2..ce0d0c8 100644 ---- a/src/dbus/qdbusmetatype.cpp -+++ b/src/dbus/qdbusmetatype.cpp -@@ -1,6 +1,7 @@ - /**************************************************************************** - ** - ** Copyright (C) 2016 The Qt Company Ltd. -+** Copyright (C) 2016 Intel Corporation. - ** Contact: https://www.qt.io/licensing/ - ** - ** This file is part of the QtDBus module of the Qt Toolkit. -@@ -33,19 +34,15 @@ - - #include "qdbusmetatype.h" - #include "qdbusmetatype_p.h" -- --#include - #include "qdbus_symbols_p.h" - --#include --#include --#include --#include -+#include - - #include "qdbusargument_p.h" - #include "qdbusutil_p.h" - #include "qdbusunixfiledescriptor.h" - #ifndef QT_BOOTSTRAPPED -+#include "qdbusconnectionmanager_p.h" - #include "qdbusmessage.h" - #endif - -@@ -58,82 +55,72 @@ - - QT_BEGIN_NAMESPACE - --class QDBusCustomTypeInfo --{ --public: -- QDBusCustomTypeInfo() : signature(), marshall(0), demarshall(0) -- { } -- -- // Suggestion: -- // change 'signature' to char* and make QDBusCustomTypeInfo a Movable type -- QByteArray signature; -- QDBusMetaType::MarshallFunction marshall; -- QDBusMetaType::DemarshallFunction demarshall; --}; -+static void registerMarshallOperatorsNoLock(QVector &ct, int id, -+ QDBusMetaType::MarshallFunction mf, -+ QDBusMetaType::DemarshallFunction df); - - template --inline static void registerHelper(T * = 0) -+inline static void registerHelper(QVector &ct) - { - void (*mf)(QDBusArgument &, const T *) = qDBusMarshallHelper; - void (*df)(const QDBusArgument &, T *) = qDBusDemarshallHelper; -- QDBusMetaType::registerMarshallOperators(qMetaTypeId(), -+ registerMarshallOperatorsNoLock(ct, qMetaTypeId(), - reinterpret_cast(mf), - reinterpret_cast(df)); - } - --void QDBusMetaTypeId::init() -+QDBusMetaTypeId *QDBusMetaTypeId::instance() - { -- static QBasicAtomicInt initialized = Q_BASIC_ATOMIC_INITIALIZER(false); -- -- // reentrancy is not a problem since everything else is locked on their own -- // set the guard variable at the end -- if (!initialized.load()) { -- // register our types with Qt Core (calling qMetaTypeId() does this implicitly) -- (void)message(); -- (void)argument(); -- (void)variant(); -- (void)objectpath(); -- (void)signature(); -- (void)error(); -- (void)unixfd(); -+#ifdef QT_BOOTSTRAPPED -+ static QDBusMetaTypeId self; -+ return &self; -+#else -+ return QDBusConnectionManager::instance(); -+#endif -+} -+ -+QDBusMetaTypeId::QDBusMetaTypeId() -+{ -+ // register our types with Qt Core (calling qMetaTypeId() does this implicitly) -+ (void)message(); -+ (void)argument(); -+ (void)variant(); -+ (void)objectpath(); -+ (void)signature(); -+ (void)error(); -+ (void)unixfd(); - - #ifndef QDBUS_NO_SPECIALTYPES -- // and register Qt Core's with us -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- registerHelper(); -- -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -- qDBusRegisterMetaType >(); -+ // and register Qt Core's with us -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ registerHelper(customTypes); -+ -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); -+ registerHelper >(customTypes); - #endif -- -- initialized.store(true); -- } - } - --Q_GLOBAL_STATIC(QVector, customTypes) --Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock) -- - /*! - \class QDBusMetaType - \inmodule QtDBus -@@ -203,14 +190,22 @@ void QDBusMetaType::registerMarshallOperators(int id, MarshallFunction mf, - DemarshallFunction df) - { - QByteArray var; -- QVector *ct = customTypes(); -- if (id < 0 || !mf || !df || !ct) -+ QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance(); -+ if (id < 0 || !mf || !df || !mgr) - return; // error! - -- QWriteLocker locker(customTypesLock()); -- if (id >= ct->size()) -- ct->resize(id + 1); -- QDBusCustomTypeInfo &info = (*ct)[id]; -+ QWriteLocker locker(&mgr->customTypesLock); -+ QVector &ct = mgr->customTypes; -+ registerMarshallOperatorsNoLock(ct, id, mf, df); -+} -+ -+static void registerMarshallOperatorsNoLock(QVector &ct, int id, -+ QDBusMetaType::MarshallFunction mf, -+ QDBusMetaType::DemarshallFunction df) -+{ -+ if (id >= ct.size()) -+ ct.resize(id + 1); -+ QDBusCustomTypeInfo &info = ct[id]; - info.marshall = mf; - info.demarshall = df; - } -@@ -227,12 +222,16 @@ bool QDBusMetaType::marshall(QDBusArgument &arg, int id, const void *data) - - MarshallFunction mf; - { -- QReadLocker locker(customTypesLock()); -- QVector *ct = customTypes(); -- if (id >= ct->size()) -+ const QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance(); -+ if (!mgr) -+ return false; // shutting down -+ -+ QReadLocker locker(&mgr->customTypesLock); -+ const QVector &ct = mgr->customTypes; -+ if (id >= ct.size()) - return false; // non-existent - -- const QDBusCustomTypeInfo &info = (*ct).at(id); -+ const QDBusCustomTypeInfo &info = ct.at(id); - if (!info.marshall) { - mf = 0; // make gcc happy - return false; -@@ -256,12 +255,16 @@ bool QDBusMetaType::demarshall(const QDBusArgument &arg, int id, void *data) - - DemarshallFunction df; - { -- QReadLocker locker(customTypesLock()); -- QVector *ct = customTypes(); -- if (id >= ct->size()) -+ const QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance(); -+ if (!mgr) -+ return false; // shutting down -+ -+ QReadLocker locker(&mgr->customTypesLock); -+ const QVector &ct = mgr->customTypes; -+ if (id >= ct.size()) - return false; // non-existent - -- const QDBusCustomTypeInfo &info = (*ct).at(id); -+ const QDBusCustomTypeInfo &info = ct.at(id); - if (!info.demarshall) { - df = 0; // make gcc happy - return false; -@@ -420,7 +423,11 @@ const char *QDBusMetaType::typeToSignature(int type) - DBUS_TYPE_BYTE_AS_STRING; // ay - } - -- QDBusMetaTypeId::init(); -+ // try the database -+ QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance(); -+ if (!mgr) -+ return Q_NULLPTR; // shutting down -+ - if (type == QDBusMetaTypeId::variant()) - return DBUS_TYPE_VARIANT_AS_STRING; - else if (type == QDBusMetaTypeId::objectpath()) -@@ -430,14 +437,13 @@ const char *QDBusMetaType::typeToSignature(int type) - else if (type == QDBusMetaTypeId::unixfd()) - return DBUS_TYPE_UNIX_FD_AS_STRING; - -- // try the database -- QVector *ct = customTypes(); - { -- QReadLocker locker(customTypesLock()); -- if (type >= ct->size()) -+ QReadLocker locker(&mgr->customTypesLock); -+ const QVector &ct = mgr->customTypes; -+ if (type >= ct.size()) - return 0; // type not registered with us - -- const QDBusCustomTypeInfo &info = (*ct).at(type); -+ const QDBusCustomTypeInfo &info = ct.at(type); - - if (!info.signature.isNull()) - return info.signature; -@@ -454,8 +460,9 @@ const char *QDBusMetaType::typeToSignature(int type) - QByteArray signature = QDBusArgumentPrivate::createSignature(type); - - // re-acquire lock -- QWriteLocker locker(customTypesLock()); -- info = &(*ct)[type]; -+ QWriteLocker locker(&mgr->customTypesLock); -+ QVector &ct = mgr->customTypes; -+ info = &ct[type]; - info->signature = signature; - } - return info->signature; -diff --git a/src/dbus/qdbusmetatype_p.h b/src/dbus/qdbusmetatype_p.h -index 348fc6c..24c8326 100644 ---- a/src/dbus/qdbusmetatype_p.h -+++ b/src/dbus/qdbusmetatype_p.h -@@ -1,6 +1,7 @@ - /**************************************************************************** - ** - ** Copyright (C) 2016 The Qt Company Ltd. -+** Copyright (C) 2016 Intel Corporation. - ** Contact: https://www.qt.io/licensing/ - ** - ** This file is part of the QtDBus module of the Qt Toolkit. -@@ -53,10 +54,27 @@ - #include - #include - -+#include -+#include -+#include -+ - #ifndef QT_NO_DBUS - - QT_BEGIN_NAMESPACE - -+class QDBusCustomTypeInfo -+{ -+public: -+ QDBusCustomTypeInfo() : signature(), marshall(0), demarshall(0) -+ { } -+ -+ // Suggestion: -+ // change 'signature' to char* and make QDBusCustomTypeInfo a Movable type -+ QByteArray signature; -+ QDBusMetaType::MarshallFunction marshall; -+ QDBusMetaType::DemarshallFunction demarshall; -+}; -+ - struct QDBusMetaTypeId - { - static int message(); // QDBusMessage -@@ -67,7 +85,14 @@ struct QDBusMetaTypeId - static int error(); // QDBusError - static int unixfd(); // QDBusUnixFileDescriptor - -- static void init(); -+ static void init() { instance(); } -+ static QDBusMetaTypeId *instance(); -+ -+ mutable QReadWriteLock customTypesLock; -+ QVector customTypes; -+ -+protected: -+ QDBusMetaTypeId(); - }; - - inline int QDBusMetaTypeId::message() -diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp -index ca33717..19ff676 100644 ---- a/src/dbus/qdbusmisc.cpp -+++ b/src/dbus/qdbusmisc.cpp -@@ -132,8 +132,9 @@ int qDBusParametersForMethod(const QMetaMethod &mm, QVector &metaTypes, QSt - - int qDBusParametersForMethod(const QList ¶meterTypes, QVector& metaTypes, QString &errorMsg) - { -- QDBusMetaTypeId::init(); - metaTypes.clear(); -+ if (!QDBusMetaTypeId::instance()) -+ return -1; - - metaTypes.append(0); // return type - int inputCount = 0; --- -2.7.4 diff --git a/Stop-unloading-plugins-in-QPluginLoader-and-QFactoryLoader.patch b/Stop-unloading-plugins-in-QPluginLoader-and-QFactoryLoader.patch deleted file mode 100644 index 9868a04..0000000 --- a/Stop-unloading-plugins-in-QPluginLoader-and-QFactoryLoader.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 8081ab4938b192bb740c5ee3004468aa6840563d Mon Sep 17 00:00:00 2001 -From: Thiago Macieira -Date: Thu, 12 Nov 2015 10:14:51 -0800 -Subject: [PATCH] Stop unloading plugins in QPluginLoader and QFactoryLoader - -QPluginLoader hasn't unloaded in its destructor since Qt 5.0, but we -missed the equivalent code in QFactoryLoader (which bypasses -QPluginLoader). Besides, QPluginLoader::unload() was still doing -unloading, which it won't anymore. - -Not unloading plugins is Qt's policy, as decided during the 5.0 -development process and reaffirmed now in 5.6. This is due to static -data in plugins leaking out and remaining in use past the unloading of -the plugin, causing crashes. - -This does not affect QLibrary and QLibrary::unload(). Those are meant -for non-Qt loadable modules, so unloading them may be safe. - -Task-number: QTBUG-49061 -Task-number: QTBUG-52988 -Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html -Change-Id: I6b3a1770e6c79cc4485a28ab286e069b88a149e5 ---- - src/corelib/plugin/qfactoryloader.cpp | 6 ++++-- - src/corelib/plugin/qpluginloader.cpp | 5 +++-- - 2 files changed, 7 insertions(+), 4 deletions(-) - -diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp -index dcf1b1a..b6558f5 100644 ---- a/src/corelib/plugin/qfactoryloader.cpp -+++ b/src/corelib/plugin/qfactoryloader.cpp -@@ -208,10 +208,12 @@ void QFactoryLoader::update() - ++keyUsageCount; - } - } -- if (keyUsageCount || keys.isEmpty()) -+ if (keyUsageCount || keys.isEmpty()) { -+ library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload - d->libraryList += library; -- else -+ } else { - library->release(); -+ } - } - } - #else -diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp -index 37f2368..0ea8280 100644 ---- a/src/corelib/plugin/qpluginloader.cpp -+++ b/src/corelib/plugin/qpluginloader.cpp -@@ -148,6 +148,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent) - : QObject(parent), d(0), did_load(false) - { - setFileName(fileName); -+ setLoadHints(QLibrary::PreventUnloadHint); - } - - /*! -@@ -342,7 +343,7 @@ static QString locatePlugin(const QString& fileName) - void QPluginLoader::setFileName(const QString &fileName) - { - #if defined(QT_SHARED) -- QLibrary::LoadHints lh; -+ QLibrary::LoadHints lh = QLibrary::PreventUnloadHint; - if (d) { - lh = d->loadHints(); - d->release(); -@@ -391,7 +392,7 @@ Q_GLOBAL_STATIC(StaticPluginList, staticPluginList) - \brief Give the load() function some hints on how it should behave. - - You can give hints on how the symbols in the plugin are -- resolved. By default, none of the hints are set. -+ resolved. By default since Qt 5.7, QLibrary::PreventUnloadHint is set. - - See the documentation of QLibrary::loadHints for a complete - description of how this property works. --- -2.7.4 diff --git a/de63bbd2f806b0219a60775017899cedb121581f.patch b/de63bbd2f806b0219a60775017899cedb121581f.patch new file mode 100644 index 0000000..9b973d9 --- /dev/null +++ b/de63bbd2f806b0219a60775017899cedb121581f.patch @@ -0,0 +1,105 @@ +From de63bbd2f806b0219a60775017899cedb121581f Mon Sep 17 00:00:00 2001 +From: Alexander Volkov +Date: Wed, 9 Nov 2016 17:33:00 +0300 +Subject: [PATCH] Add QPlatformTheme::standardButtonShortcut() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It allows to set shortcuts for the standard buttons in +QDialogButtonBox. + +Restore Qt4's behavior for the "Don't Save" button on macOS +by setting a shortcut for it (it was Cmd-D before Lion, +now it's Cmd-Delete). + +Change-Id: I6b56f68f37670962178693a8983d9fe550540856 +Reviewed-by: Tor Arne Vestbø +--- + src/gui/kernel/qplatformtheme.cpp | 13 +++++++++++++ + src/gui/kernel/qplatformtheme.h | 1 + + src/plugins/platforms/cocoa/qcocoatheme.h | 1 + + src/plugins/platforms/cocoa/qcocoatheme.mm | 6 ++++++ + src/widgets/widgets/qdialogbuttonbox.cpp | 7 +------ + 5 files changed, 22 insertions(+), 6 deletions(-) + +Index: qtbase-opensource-src-5.9.0/src/gui/kernel/qplatformtheme.cpp +=================================================================== +--- qtbase-opensource-src-5.9.0.orig/src/gui/kernel/qplatformtheme.cpp ++++ qtbase-opensource-src-5.9.0/src/gui/kernel/qplatformtheme.cpp +@@ -678,19 +678,6 @@ QString QPlatformTheme::standardButtonTe + return QPlatformTheme::defaultStandardButtonText(button); + } + +-/*! +- Returns the mnemonic that should be used for a standard \a button. +- +- \since 5.9 +- \sa QPlatformDialogHelper::StandardButton +- */ +- +-QKeySequence QPlatformTheme::standardButtonShortcut(int button) const +-{ +- Q_UNUSED(button) +- return QKeySequence(); +-} +- + QString QPlatformTheme::defaultStandardButtonText(int button) + { + switch (button) { +Index: qtbase-opensource-src-5.9.0/src/gui/kernel/qplatformtheme.h +=================================================================== +--- qtbase-opensource-src-5.9.0.orig/src/gui/kernel/qplatformtheme.h ++++ qtbase-opensource-src-5.9.0/src/gui/kernel/qplatformtheme.h +@@ -312,7 +312,6 @@ public: + #endif + + virtual QString standardButtonText(int button) const; +- virtual QKeySequence standardButtonShortcut(int button) const; + + static QVariant defaultThemeHint(ThemeHint hint); + static QString defaultStandardButtonText(int button); +Index: qtbase-opensource-src-5.9.0/src/plugins/platforms/cocoa/qcocoatheme.h +=================================================================== +--- qtbase-opensource-src-5.9.0.orig/src/plugins/platforms/cocoa/qcocoatheme.h ++++ qtbase-opensource-src-5.9.0/src/plugins/platforms/cocoa/qcocoatheme.h +@@ -74,7 +74,6 @@ public: + + QVariant themeHint(ThemeHint hint) const Q_DECL_OVERRIDE; + QString standardButtonText(int button) const Q_DECL_OVERRIDE; +- QKeySequence standardButtonShortcut(int button) const Q_DECL_OVERRIDE; + + static const char *name; + +Index: qtbase-opensource-src-5.9.0/src/plugins/platforms/cocoa/qcocoatheme.mm +=================================================================== +--- qtbase-opensource-src-5.9.0.orig/src/plugins/platforms/cocoa/qcocoatheme.mm ++++ qtbase-opensource-src-5.9.0/src/plugins/platforms/cocoa/qcocoatheme.mm +@@ -344,12 +344,6 @@ QString QCocoaTheme::standardButtonText( + return button == QPlatformDialogHelper::Discard ? msgDialogButtonDiscard() : QPlatformTheme::standardButtonText(button); + } + +-QKeySequence QCocoaTheme::standardButtonShortcut(int button) const +-{ +- return button == QPlatformDialogHelper::Discard ? QKeySequence(Qt::CTRL | Qt::Key_Delete) +- : QPlatformTheme::standardButtonShortcut(button); +-} +- + QPlatformMenuItem *QCocoaTheme::createPlatformMenuItem() const + { + return new QCocoaMenuItem(); +Index: qtbase-opensource-src-5.9.0/src/widgets/widgets/qdialogbuttonbox.cpp +=================================================================== +--- qtbase-opensource-src-5.9.0.orig/src/widgets/widgets/qdialogbuttonbox.cpp ++++ qtbase-opensource-src-5.9.0/src/widgets/widgets/qdialogbuttonbox.cpp +@@ -410,9 +410,7 @@ QPushButton *QDialogButtonBoxPrivate::cr + qWarning("QDialogButtonBox::createButton: Invalid ButtonRole, button not added"); + else + addButton(button, static_cast(role), doLayout); +-#if QT_CONFIG(shortcut) +- button->setShortcut(QGuiApplicationPrivate::platformTheme()->standardButtonShortcut(sbutton)); +-#endif ++ + return button; + } + diff --git a/dont-destroy-foreign-windows.patch b/dont-destroy-foreign-windows.patch new file mode 100644 index 0000000..84dd1e3 --- /dev/null +++ b/dont-destroy-foreign-windows.patch @@ -0,0 +1,100 @@ +From 32390f49291308eb85dcbcaa898bbf825a2eb229 Mon Sep 17 00:00:00 2001 +From: =?utf8?q?Tor=20Arne=20Vestb=C3=B8?= +Date: Fri, 2 Jun 2017 11:09:55 +0200 +Subject: [PATCH] xcb: Don't destroy foreign windows + +We can't rely on virtual dispatch in the destructor. + +Task-number: QTBUG-61140 +Change-Id: Ib1026caf126095778c24254775cb5a0bfecf3a38 +--- + src/plugins/platforms/xcb/qxcbintegration.cpp | 18 +----------------- + src/plugins/platforms/xcb/qxcbwindow.cpp | 16 ++++++++++------ + src/plugins/platforms/xcb/qxcbwindow.h | 12 ++++++++++++ + 3 files changed, 23 insertions(+), 23 deletions(-) + +diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp +index b414bee..8e3ee20 100644 +--- a/src/plugins/platforms/xcb/qxcbintegration.cpp ++++ b/src/plugins/platforms/xcb/qxcbintegration.cpp +@@ -214,25 +214,9 @@ QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const + return xcbWindow; + } + +-class QXcbForeignWindow : public QXcbWindow +-{ +-public: +- QXcbForeignWindow(QWindow *window, WId nativeHandle) +- : QXcbWindow(window) { m_window = nativeHandle; } +- ~QXcbForeignWindow() {} +- bool isForeignWindow() const override { return true; } +- +-protected: +- // No-ops +- void create() override {} +- void destroy() override {} +-}; +- + QPlatformWindow *QXcbIntegration::createForeignWindow(QWindow *window, WId nativeHandle) const + { +- QXcbWindow *xcbWindow = new QXcbForeignWindow(window, nativeHandle); +- xcbWindow->create(); +- return xcbWindow; ++ return new QXcbForeignWindow(window, nativeHandle); + } + + #ifndef QT_NO_OPENGL +diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp +index 289d072..d6c69d5 100644 +--- a/src/plugins/platforms/xcb/qxcbwindow.cpp ++++ b/src/plugins/platforms/xcb/qxcbwindow.cpp +@@ -597,13 +597,17 @@ QXcbWindow::~QXcbWindow() + } + + destroy(); ++} + +- if (isForeignWindow()) { +- if (connection()->mouseGrabber() == this) +- connection()->setMouseGrabber(Q_NULLPTR); +- if (connection()->mousePressWindow() == this) +- connection()->setMousePressWindow(Q_NULLPTR); +- } ++QXcbForeignWindow::~QXcbForeignWindow() ++{ ++ // Clear window so that destroy() does not affect it ++ m_window = 0; ++ ++ if (connection()->mouseGrabber() == this) ++ connection()->setMouseGrabber(nullptr); ++ if (connection()->mousePressWindow() == this) ++ connection()->setMousePressWindow(nullptr); + } + + void QXcbWindow::destroy() +diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h +index 5662809..f38343b 100644 +--- a/src/plugins/platforms/xcb/qxcbwindow.h ++++ b/src/plugins/platforms/xcb/qxcbwindow.h +@@ -278,6 +278,18 @@ protected: + xcb_cursor_t m_currentBitmapCursor = XCB_CURSOR_NONE; + }; + ++class QXcbForeignWindow : public QXcbWindow ++{ ++public: ++ QXcbForeignWindow(QWindow *window, WId nativeHandle) ++ : QXcbWindow(window) { m_window = nativeHandle; } ++ ~QXcbForeignWindow(); ++ bool isForeignWindow() const override { return true; } ++ ++protected: ++ void create() override {} // No-op ++}; ++ + QT_END_NAMESPACE + + Q_DECLARE_METATYPE(QXcbWindow*) +-- +2.7.4 + diff --git a/libqt5-prioritise-gtk2-platformtheme.patch b/libqt5-prioritise-gtk2-platformtheme.patch index 3fca276..c7bd6c6 100644 --- a/libqt5-prioritise-gtk2-platformtheme.patch +++ b/libqt5-prioritise-gtk2-platformtheme.patch @@ -9,8 +9,7 @@ + result.push_back(QStringLiteral("gtk2")); + // prefer second the GTK+3 theme implementation with native dialogs, etc. result.push_back(QStringLiteral("gtk3")); -- // fallback to the generic Gnome theme if loading the GTK3 theme fails -+ // fallback to the generic GNOME theme if loading the GTK+3 theme fails + // fallback to the generic Gnome theme if loading the GTK3 theme fails result.push_back(QLatin1String(QGnomeTheme::name)); - } - } + } else { + // unknown, but lowercase the name (our standard practice) and diff --git a/libqt5-qtbase.changes b/libqt5-qtbase.changes index 1c0768e..471b3c2 100644 --- a/libqt5-qtbase.changes +++ b/libqt5-qtbase.changes @@ -1,3 +1,62 @@ +------------------------------------------------------------------- +Tue Jun 6 10:19:48 UTC 2017 - alarrosa@suse.com + +- Add 0001-Add-remote-print-queue-support.patch to support remote print + queues. This adds a delay the first time the print dialog is opened in + order to search for print queues. If you don't have any network printer + queue and you find the delay too annoying, it can be disabled by setting + the QT_DISABLE_PRINTER_DISCOVERY environment variable to 1 (fate#322052, + bsc#955432). +- Add 0001-Fix-open-chmod-race-condition-in-QSaveFile.patch to fix + a potential info leak due to race condition in QSaveFile (bsc#1034005). + +------------------------------------------------------------------- +Fri Jun 2 21:11:41 UTC 2017 - fabian@ritter-vogt.de + +- Revert upstream commit to workaround QTBUG-61197: + * de63bbd2f806b0219a60775017899cedb121581f.patch + +------------------------------------------------------------------- +Fri Jun 2 17:57:54 UTC 2017 - fabian@ritter-vogt.de + +- Add upstream patch to fix QTBUG-61140: + * dont-destroy-foreign-windows.patch +- Replaces c585802e946d97e7d177ea334a162dc7bc286b84.patch + +------------------------------------------------------------------- +Fri Jun 2 08:49:53 UTC 2017 - fabian@ritter-vogt.de + +- Add upstream patch to fix various HiDPI-related issues: + * native-children-hidpi-offset.patch (QTBUG-59017, kde#363548) + +------------------------------------------------------------------- +Wed May 31 19:46:07 UTC 2017 - fabian@ritter-vogt.de + +- Revert upstream commit to workaround QTBUG-61140: + c585802e946d97e7d177ea334a162dc7bc286b84.patch + +------------------------------------------------------------------- +Wed May 31 07:05:05 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.9.0 final + +------------------------------------------------------------------- +Wed May 24 19:16:41 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.9.0 RC: + * For more details please see: + http://lists.qt-project.org/pipermail/announce/2017-May/000115.html + and https://wiki.qt.io/New_Features_in_Qt_5.9 +- Remove patches, now upstream: + * Stop-unloading-plugins-in-QPluginLoader-and-QFactoryLoader.patch + * Fix-some-QtDBus-crashes-during-application-destruction.patch + * Merge-the-QDBusMetaTypes-custom-information-to-QDBusConnectionManager.patch +- Refresh patches: + * Fix-some-QtDBus-crashes-during-application-destruction.patch + * Merge-the-QDBusMetaTypes-custom-information-to-QDBusConnectionManager.patch + * libqt5-prioritise-gtk2-platformtheme.patch + * tell-the-truth-about-private-api.patch + ------------------------------------------------------------------- Wed Dec 14 16:05:44 UTC 2016 - hrvoje.senjan@gmail.com diff --git a/libqt5-qtbase.spec b/libqt5-qtbase.spec index 4a7ce05..9113f24 100644 --- a/libqt5-qtbase.spec +++ b/libqt5-qtbase.spec @@ -1,7 +1,7 @@ # # spec file for package libqt5-qtbase # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -26,17 +26,17 @@ %endif Name: libqt5-qtbase -Version: 5.7.1 +Version: 5.9.0 Release: 0 Summary: C++ Program Library, Core Components License: GPL-3.0 or SUSE-LGPL-2.1-with-digia-exception-1.1 Group: System/Libraries -Url: http://qt.digia.com +Url: https://www.qt.io %define base_name libqt5 -%define real_version 5.7.1 -%define so_version 5.7.1 +%define real_version 5.9.0 +%define so_version 5.9.0 %define tar_version qtbase-opensource-src-%{real_version} -Source: %{tar_version}.tar.xz +Source: https://download.qt.io/official_releases/qt/5.9/%{real_version}/submodules/%{tar_version}.tar.xz # to get mtime of file: Source1: libqt5-qtbase.changes Source2: macros.qt5 @@ -49,14 +49,21 @@ Patch3: libqt5-Fix-Gujarati-font.patch Patch5: libqt5-do-not-use-shm-if-display-name-doesnt-look-local.patch # PATCH-FIX-OPENSUSE disable-rc4-ciphers-bnc865241.diff bnc#865241-- Exclude rc4 ciphers from being used by default Patch6: disable-rc4-ciphers-bnc865241.diff -Patch7: tell-the-truth-about-private-api.patch +Patch8: tell-the-truth-about-private-api.patch # PATCH-FIX-OPENSUSE libqt5-prioritise-gtk2-platformtheme.patch boo#1002900 -- Give Gtk2 Platform Theme (from qtstyleplugins) a priority over Gtk3 PT which currently lacks QGtk3Style. Patch10: libqt5-prioritise-gtk2-platformtheme.patch -# patches 1000-2000 and above from upstream 5.7 branch # -Patch1004: Stop-unloading-plugins-in-QPluginLoader-and-QFactoryLoader.patch -Patch1006: Merge-the-QDBusMetaTypes-custom-information-to-QDBusConnectionManager.patch -Patch1007: Fix-some-QtDBus-crashes-during-application-destruction.patch -# patches 2000-3000 and above from upstream 5.8 branch # +# PATCH-FIX-OPENSUSE de63bbd2f806b0219a60775017899cedb121581f.patch -- Revert upstream commit to workaround QTBUG-61197 +Patch11: de63bbd2f806b0219a60775017899cedb121581f.patch +# PATCH-FEATURE-OPENSUSE 0001-Add-remote-print-queue-support.patch fate#322052 -- Automatically recognize and allow printing to remote cups servers +Patch12: 0001-Add-remote-print-queue-support.patch +# PATCH-FIX-UPSTREAM 0001-Fix-open-chmod-race-condition-in-QSaveFile.patch bsc#1034005 -- Fix a open file/change permission race condition in QSaveFile +Patch13: 0001-Fix-open-chmod-race-condition-in-QSaveFile.patch +# patches 1000-2000 and above from upstream 5.9 branch # +# PATCH-FIX-UPSTREAM +Patch1000: native-children-hidpi-offset.patch +# PATCH-FIX-UPSTREAM Revert to workaround QTBUG-61140 +Patch1001: dont-destroy-foreign-windows.patch +# patches 2000-3000 and above from upstream 5.10/dev branch # BuildRequires: alsa-devel BuildRequires: cups-devel BuildRequires: double-conversion-devel @@ -140,11 +147,13 @@ handling. %patch3 -p1 %patch5 -p1 %patch6 -p1 -%patch7 -p1 +%patch8 -p1 %patch10 -p1 -%patch1004 -p1 -%patch1006 -p1 -%patch1007 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch1000 -p1 +%patch1001 -p1 # be sure not to use them rm -rf src/3rdparty/{libjpeg,freetype,zlib} @@ -564,6 +573,7 @@ Requires: %{name}-devel = %{version} Requires: libQt5Core-private-headers-devel = %{version} Requires: libQt5DBus-private-headers-devel = %{version} Requires: libQt5Gui-private-headers-devel = %{version} +Requires: libQt5KmsSupport-private-headers-devel = %{version} Requires: libQt5Network-private-headers-devel = %{version} Requires: libQt5OpenGL-private-headers-devel = %{version} Requires: libQt5PlatformSupport-private-headers-devel = %{version} @@ -634,6 +644,26 @@ Requires: libQt5PlatformSupport-devel-static = %{version} %description -n libQt5PlatformSupport-private-headers-devel Qt 5 PlatformSupport Library - Non-ABI stable development files. +%package -n libQt5KmsSupport-devel-static +Summary: Qt KmsSupport module +Group: Development/Libraries/C and C++ +Requires: libQt5Core-devel = %{version} +Requires: libQt5Gui-devel = %{version} + +%description -n libQt5KmsSupport-devel-static +Qt KmsSupport module. + +%package -n libQt5KmsSupport-private-headers-devel +Summary: Qt 5 KmsSupport Library - Non-ABI stable development files +Group: Development/Libraries/X11 +BuildArch: noarch +Requires: libQt5Core-private-headers-devel = %{version} +Requires: libQt5Gui-private-headers-devel = %{version} +Requires: libQt5KmsSupport-devel-static = %{version} + +%description -n libQt5KmsSupport-private-headers-devel +Qt 5 KmsSupport Library - Non-ABI stable development files. + %package -n libQt5PlatformHeaders-devel Summary: Qt 5 PlatformHeaders Group: Development/Libraries/X11 @@ -661,7 +691,7 @@ Recommends: libqt5-qtbase-devel Examples for libqt5-qtbase modules. %build -export QMAKESPEC=$PWD/mkspecs/linux-g++ +#export QMAKESPEC=$PWD/mkspecs/linux-g++ %ifarch ppc64 RPM_OPT_FLAGS="%{optflags} -mminimal-toc" %endif @@ -716,11 +746,7 @@ echo yes | ./configure $platform \ -shared \ -xkb \ -system-xkbcommon \ - -xrender \ - -xcursor \ -dbus-linked \ - -xfixes \ - -xrandr \ -sm \ -no-rpath \ -system-libjpeg \ @@ -733,7 +759,6 @@ echo yes | ./configure $platform \ -system-freetype \ -cups \ -system-zlib \ - -iconv \ -no-pch \ -glib \ -system-sqlite \ @@ -742,7 +767,6 @@ echo yes | ./configure $platform \ %if %journald -journald \ %endif - -xsync \ -xcb \ -egl \ -eglfs \ @@ -785,7 +809,7 @@ find %{buildroot}%{libqt5_libdir} -type f -name '*pc' -print -exec perl -pi -e " find %{buildroot}%{libqt5_libdir}/ -name 'lib*.a' -exec chmod -x -- {} \; # kill .la files rm -fv %{buildroot}%{libqt5_libdir}/lib*.la -rm -fv %{buildroot}%{libqt5_libdir}/libqtpng.* +rm -fv %{buildroot}%{libqt5_libdir}/*png.* # rm -fv %{buildroot}%{libqt5_libdir}/cmake/Qt5*/Q*Plugin.cmake @@ -1035,7 +1059,7 @@ popd %ifarch %ix86 %{libqt5_libdir}/sse2/libQt5Gui.so.* %endif -%{libqt5_libdir}/libQt5EglDeviceIntegration.so.* +%{libqt5_libdir}/libQt5EglFSDeviceIntegration.so.* %if 0%{?is_opensuse} %{libqt5_libdir}/libQt5EglFsKmsSupport.so.* %endif @@ -1058,6 +1082,8 @@ popd %doc *.txt LICENSE.* %{libqt5_libdir}/libQt5Gui.so %{libqt5_libdir}/libQt5Gui.prl +%{libqt5_libdir}/libQt5EglFSDeviceIntegration.so +%{libqt5_libdir}/libQt5EglFSDeviceIntegration.prl %if 0%{?is_opensuse} %{libqt5_libdir}/libQt5EglFsKmsSupport.prl %{libqt5_libdir}/libQt5EglFsKmsSupport.so @@ -1065,7 +1091,9 @@ popd %{libqt5_libdir}/cmake/Qt5Gui/ %{libqt5_libdir}/pkgconfig/Qt5Gui.pc %{libqt5_includedir}/QtGui/ +%{libqt5_includedir}/QtEglFSDeviceIntegration/ %exclude %{libqt5_includedir}/QtGui/%{so_version} +%exclude %{libqt5_includedir}/QtEglFSDeviceIntegration/%{so_version} %files devel %defattr(-,root,root,755) @@ -1130,17 +1158,70 @@ popd %files -n libQt5PlatformSupport-devel-static %defattr(-,root,root,755) %doc *.txt LICENSE.* -%{libqt5_libdir}/libQt5EglDeviceIntegration.so %{libqt5_libdir}/libQt5XcbQpa.so -%{libqt5_libdir}/libQt5PlatformSupport.a -%{libqt5_libdir}/libQt5PlatformSupport.prl -%{libqt5_libdir}/libQt5EglDeviceIntegration.prl %{libqt5_libdir}/libQt5XcbQpa.prl -#{libqt5_libdir}/pkgconfig/Qt5PlatformSupport.pc -#{libqt5_libdir}/pkgconfig/Qt5EglDeviceIntegration.pc -#{libqt5_libdir}/pkgconfig/Qt5XcbQpa.pc -%{libqt5_includedir}/QtPlatformSupport/ -%exclude %{libqt5_includedir}/QtPlatformSupport/%{so_version} +%{libqt5_libdir}/libQt5AccessibilitySupport.a +%{libqt5_libdir}/libQt5AccessibilitySupport.prl +%{libqt5_libdir}/libQt5DeviceDiscoverySupport.a +%{libqt5_libdir}/libQt5DeviceDiscoverySupport.prl +%{libqt5_libdir}/libQt5EglSupport.a +%{libqt5_libdir}/libQt5EglSupport.prl +%{libqt5_libdir}/libQt5EventDispatcherSupport.a +%{libqt5_libdir}/libQt5EventDispatcherSupport.prl +%{libqt5_libdir}/libQt5FbSupport.a +%{libqt5_libdir}/libQt5FbSupport.prl +%{libqt5_libdir}/libQt5FontDatabaseSupport.a +%{libqt5_libdir}/libQt5FontDatabaseSupport.prl +%ifnarch %arm aarch64 +%{libqt5_libdir}/libQt5GlxSupport.a +%{libqt5_libdir}/libQt5GlxSupport.prl +%endif +%{libqt5_libdir}/libQt5InputSupport.a +%{libqt5_libdir}/libQt5InputSupport.prl +%{libqt5_libdir}/libQt5LinuxAccessibilitySupport.a +%{libqt5_libdir}/libQt5LinuxAccessibilitySupport.prl +%{libqt5_libdir}/libQt5PlatformCompositorSupport.a +%{libqt5_libdir}/libQt5PlatformCompositorSupport.prl +%{libqt5_libdir}/libQt5ServiceSupport.a +%{libqt5_libdir}/libQt5ServiceSupport.prl +%{libqt5_libdir}/libQt5ThemeSupport.a +%{libqt5_libdir}/libQt5ThemeSupport.prl +%{libqt5_includedir}/QtAccessibilitySupport/ +%{libqt5_includedir}/QtDeviceDiscoverySupport/ +%{libqt5_includedir}/QtEglSupport/ +%{libqt5_includedir}/QtEventDispatcherSupport/ +%{libqt5_includedir}/QtFbSupport/ +%{libqt5_includedir}/QtFontDatabaseSupport/ +%ifnarch %arm aarch64 +%{libqt5_includedir}/QtGlxSupport/ +%endif +%{libqt5_includedir}/QtInputSupport/ +%{libqt5_includedir}/QtLinuxAccessibilitySupport/ +%{libqt5_includedir}/QtPlatformCompositorSupport/ +%{libqt5_includedir}/QtServiceSupport/ +%{libqt5_includedir}/QtThemeSupport/ +%exclude %{libqt5_includedir}/QtAccessibilitySupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtDeviceDiscoverySupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtEglSupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtEventDispatcherSupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtFbSupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtFontDatabaseSupport/%{so_version}/ +%ifnarch %arm aarch64 +%exclude %{libqt5_includedir}/QtGlxSupport/%{so_version}/ +%endif +%exclude %{libqt5_includedir}/QtInputSupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtLinuxAccessibilitySupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtPlatformCompositorSupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtServiceSupport/%{so_version}/ +%exclude %{libqt5_includedir}/QtThemeSupport/%{so_version}/ + +%files -n libQt5KmsSupport-devel-static +%defattr(-,root,root,755) +%doc *.txt LICENSE.* +%{libqt5_libdir}/libQt5KmsSupport.a +%{libqt5_libdir}/libQt5KmsSupport.prl +%exclude %{libqt5_includedir}/QtKmsSupport/%{so_version}/ +%{libqt5_includedir}/QtKmsSupport/ %files -n libQt5Core-private-headers-devel %defattr(-,root,root,755) @@ -1156,6 +1237,12 @@ popd %defattr(-,root,root,755) %doc *.txt LICENSE.* %{libqt5_includedir}/QtGui/%{so_version}/ +%{libqt5_includedir}/QtEglFSDeviceIntegration/%{so_version} + +%files -n libQt5KmsSupport-private-headers-devel +%defattr(-,root,root,755) +%doc *.txt LICENSE.* +%{libqt5_includedir}/QtKmsSupport/%{so_version}/ %files -n libQt5Network-private-headers-devel %defattr(-,root,root,755) @@ -1170,7 +1257,20 @@ popd %files -n libQt5PlatformSupport-private-headers-devel %defattr(-,root,root,755) %doc *.txt LICENSE.* -%{libqt5_includedir}/QtPlatformSupport/%{so_version}/ +%{libqt5_includedir}/QtAccessibilitySupport/%{so_version}/ +%{libqt5_includedir}/QtDeviceDiscoverySupport/%{so_version}/ +%{libqt5_includedir}/QtEglSupport/%{so_version}/ +%{libqt5_includedir}/QtEventDispatcherSupport/%{so_version}/ +%{libqt5_includedir}/QtFbSupport/%{so_version}/ +%{libqt5_includedir}/QtFontDatabaseSupport/%{so_version}/ +%ifnarch %arm aarch64 +%{libqt5_includedir}/QtGlxSupport/%{so_version}/ +%endif +%{libqt5_includedir}/QtInputSupport/%{so_version}/ +%{libqt5_includedir}/QtLinuxAccessibilitySupport/%{so_version}/ +%{libqt5_includedir}/QtPlatformCompositorSupport/%{so_version}/ +%{libqt5_includedir}/QtServiceSupport/%{so_version}/ +%{libqt5_includedir}/QtThemeSupport/%{so_version}/ %files -n libQt5PrintSupport-private-headers-devel %defattr(-,root,root,755) diff --git a/native-children-hidpi-offset.patch b/native-children-hidpi-offset.patch new file mode 100644 index 0000000..26cf7a4 --- /dev/null +++ b/native-children-hidpi-offset.patch @@ -0,0 +1,30 @@ +From 9ff4abfb4a2a76b2ed0f664876955a9ab3a5b726 Mon Sep 17 00:00:00 2001 +From: Allan Sandfeld Jensen +Date: Thu, 1 Jun 2017 17:45:02 +0200 +Subject: [PATCH] Adjust offset of native children according to device pixel + ratio + +Otherwise the wrong background can be used. + +Task-number: QTBUG-59017 +Change-Id: Iccbe9cd9704bccbceda4c8dafe87435b68b5cf3e +--- + src/gui/painting/qplatformbackingstore.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/gui/painting/qplatformbackingstore.cpp b/src/gui/painting/qplatformbackingstore.cpp +index b8bbdef..b88dd76 100644 +--- a/src/gui/painting/qplatformbackingstore.cpp ++++ b/src/gui/painting/qplatformbackingstore.cpp +@@ -394,7 +394,7 @@ void QPlatformBackingStore::composeAndFlush(QWindow *window, const QRegion ®i + d_ptr->blitter->setRedBlueSwizzle(true); + // The backingstore is for the entire tlw. + // In case of native children offset tells the position relative to the tlw. +- const QRect srcRect = toBottomLeftRect(deviceWindowRect.translated(offset), d_ptr->textureSize.height()); ++ const QRect srcRect = toBottomLeftRect(deviceWindowRect.translated(offset * window->devicePixelRatio()), d_ptr->textureSize.height()); + const QMatrix3x3 source = QOpenGLTextureBlitter::sourceTransform(srcRect, + d_ptr->textureSize, + origin); +-- +2.7.4 + diff --git a/qtbase-opensource-src-5.7.1.tar.xz b/qtbase-opensource-src-5.7.1.tar.xz deleted file mode 100644 index 322dc11..0000000 --- a/qtbase-opensource-src-5.7.1.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edcdf549d94d98aff08e201dcb3ca25bc3628a37b1309e320d5f556b6b66557e -size 44992616 diff --git a/qtbase-opensource-src-5.9.0.tar.xz b/qtbase-opensource-src-5.9.0.tar.xz new file mode 100644 index 0000000..095eba7 --- /dev/null +++ b/qtbase-opensource-src-5.9.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:267eb2af1a203c087f2113f43b08014d0e2d2cb269295b8602d869a2fad5296c +size 44893232 diff --git a/tell-the-truth-about-private-api.patch b/tell-the-truth-about-private-api.patch index 5905997..75ec9e3 100644 --- a/tell-the-truth-about-private-api.patch +++ b/tell-the-truth-about-private-api.patch @@ -1,15 +1,10 @@ diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf -index aefd3ae..53a3f60 100644 +index f6cbf99..798472a 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf -@@ -195,16 +195,18 @@ - - !header_module:unix:!isEmpty(QMAKE_LFLAGS_VERSION_SCRIPT):!no_linker_version_script:!static { - verscript = $${TARGET}.version +@@ -214,9 +214,9 @@ android: CONFIG += qt_android_deps no_linker_version_script QMAKE_LFLAGS += $${QMAKE_LFLAGS_VERSION_SCRIPT}$$verscript -+ private_api_headers = $$SYNCQT.PRIVATE_HEADER_FILES $$SYNCQT.QPA_HEADER_FILES -+ internal_module { - verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API { *; };" + verscript_content = "Qt_$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION}_PRIVATE_API { *; };" @@ -17,23 +12,5 @@ index aefd3ae..53a3f60 100644 - verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API {" \ + verscript_content = "Qt_$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION}_PRIVATE_API {" \ " qt_private_api_tag*;" -- for(header, SYNCQT.PRIVATE_HEADER_FILES): \ -+ for(header, private_api_headers): \ - verscript_content += " @FILE:$${_PRO_FILE_PWD_}/$$header@" - verscript_content += "};" - current = Qt_$$QT_MAJOR_VERSION - verscript_content += "$$current { *; };" -@@ -221,11 +223,11 @@ - # Add a post-processing step to replace the @FILE:filename@ - verscript_in = $${verscript}.in - verscriptprocess.name = linker version script ${QMAKE_FILE_BASE} - verscriptprocess.input = verscript_in - verscriptprocess.CONFIG += no_link target_predeps -- for(header, SYNCQT.PRIVATE_HEADER_FILES): \ -+ for(header, private_api_headers): \ - verscriptprocess.depends += $${_PRO_FILE_PWD_}/$$header - verscriptprocess.output = $$verscript - verscriptprocess.commands = perl $${PWD}/data/unix/findclasslist.pl < ${QMAKE_FILE_IN} > $@ - silent:verscriptprocess.commands = @echo creating linker version script ${QMAKE_FILE_BASE} && $$verscriptprocess.commands - QMAKE_EXTRA_COMPILERS += verscriptprocess + private_api_headers = $$SYNCQT.PRIVATE_HEADER_FILES $$SYNCQT.QPA_HEADER_FILES