Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
024ab7a0f4 | ||
|
425885b3cd | ||
|
3a8fd71ba6 | ||
|
edeff1b640 | ||
|
8d54bf0fcb | ||
|
8723a0d67a | ||
|
b30ae9f982 | ||
|
01c7f9ab08 | ||
|
c3879d9ba5 |
7
.gitignore
vendored
7
.gitignore
vendored
@ -1,6 +1 @@
|
||||
/qtbase-everywhere-src-5.12.1.tar.xz
|
||||
/qtbase-everywhere-src-5.12.3.tar.xz
|
||||
/qtbase-everywhere-src-5.12.4.tar.xz
|
||||
/qtbase-everywhere-src-5.12.5.tar.xz
|
||||
/qtbase-everywhere-src-5.13.2.tar.xz
|
||||
/qtbase-everywhere-src-5.14.2.tar.xz
|
||||
/qtbase-opensource-src-5.6.2.tar.xz
|
||||
|
403
0001-Merge-the-QDBusMetaType-s-custom-information-to-QDBu.patch
Normal file
403
0001-Merge-the-QDBusMetaType-s-custom-information-to-QDBu.patch
Normal file
@ -0,0 +1,403 @@
|
||||
From ca1ba9162d28bd07c39238bbd0c891e54a46e4be Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Thu, 28 Apr 2016 15:00:58 -0700
|
||||
Subject: [PATCH 1/2] 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 | 182 +++++++++++++++++++-----------------
|
||||
src/dbus/qdbusmetatype_p.h | 27 +++++-
|
||||
5 files changed, 124 insertions(+), 90 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..1774b85 100644
|
||||
--- a/src/dbus/qdbusmetatype.cpp
|
||||
+++ b/src/dbus/qdbusmetatype.cpp
|
||||
@@ -1,6 +1,7 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
+** Copyright (C) 2016 Intel Corporation.
|
||||
** Contact: http://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 <string.h>
|
||||
#include "qdbus_symbols_p.h"
|
||||
|
||||
-#include <qbytearray.h>
|
||||
-#include <qglobal.h>
|
||||
-#include <qreadwritelock.h>
|
||||
-#include <qvector.h>
|
||||
+#include <string.h>
|
||||
|
||||
#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<QDBusCustomTypeInfo> &ct, int id,
|
||||
+ QDBusMetaType::MarshallFunction mf,
|
||||
+ QDBusMetaType::DemarshallFunction df);
|
||||
|
||||
template<typename T>
|
||||
-inline static void registerHelper(T * = 0)
|
||||
+inline static void registerHelper(QVector<QDBusCustomTypeInfo> &ct)
|
||||
{
|
||||
void (*mf)(QDBusArgument &, const T *) = qDBusMarshallHelper<T>;
|
||||
void (*df)(const QDBusArgument &, T *) = qDBusDemarshallHelper<T>;
|
||||
- QDBusMetaType::registerMarshallOperators(qMetaTypeId<T>(),
|
||||
+ registerMarshallOperatorsNoLock(ct, qMetaTypeId<T>(),
|
||||
reinterpret_cast<QDBusMetaType::MarshallFunction>(mf),
|
||||
reinterpret_cast<QDBusMetaType::DemarshallFunction>(df));
|
||||
}
|
||||
|
||||
-void QDBusMetaTypeId::init()
|
||||
+QDBusMetaTypeId *QDBusMetaTypeId::instance()
|
||||
+{
|
||||
+#ifdef QT_BOOTSTRAPPED
|
||||
+ static QDBusMetaTypeId self;
|
||||
+ return &self;
|
||||
+#else
|
||||
+ return QDBusConnectionManager::instance();
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+QDBusMetaTypeId::QDBusMetaTypeId()
|
||||
{
|
||||
- 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<T>() does this implicitly)
|
||||
- (void)message();
|
||||
- (void)argument();
|
||||
- (void)variant();
|
||||
- (void)objectpath();
|
||||
- (void)signature();
|
||||
- (void)error();
|
||||
- (void)unixfd();
|
||||
+ // register our types with Qt Core (calling qMetaTypeId<T>() 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<QDate>();
|
||||
- registerHelper<QTime>();
|
||||
- registerHelper<QDateTime>();
|
||||
- registerHelper<QRect>();
|
||||
- registerHelper<QRectF>();
|
||||
- registerHelper<QSize>();
|
||||
- registerHelper<QSizeF>();
|
||||
- registerHelper<QPoint>();
|
||||
- registerHelper<QPointF>();
|
||||
- registerHelper<QLine>();
|
||||
- registerHelper<QLineF>();
|
||||
- registerHelper<QVariantList>();
|
||||
- registerHelper<QVariantMap>();
|
||||
- registerHelper<QVariantHash>();
|
||||
-
|
||||
- qDBusRegisterMetaType<QList<bool> >();
|
||||
- qDBusRegisterMetaType<QList<short> >();
|
||||
- qDBusRegisterMetaType<QList<ushort> >();
|
||||
- qDBusRegisterMetaType<QList<int> >();
|
||||
- qDBusRegisterMetaType<QList<uint> >();
|
||||
- qDBusRegisterMetaType<QList<qlonglong> >();
|
||||
- qDBusRegisterMetaType<QList<qulonglong> >();
|
||||
- qDBusRegisterMetaType<QList<double> >();
|
||||
- qDBusRegisterMetaType<QList<QDBusObjectPath> >();
|
||||
- qDBusRegisterMetaType<QList<QDBusSignature> >();
|
||||
- qDBusRegisterMetaType<QList<QDBusUnixFileDescriptor> >();
|
||||
+ // and register Qt Core's with us
|
||||
+ registerHelper<QDate>(customTypes);
|
||||
+ registerHelper<QTime>(customTypes);
|
||||
+ registerHelper<QDateTime>(customTypes);
|
||||
+ registerHelper<QRect>(customTypes);
|
||||
+ registerHelper<QRectF>(customTypes);
|
||||
+ registerHelper<QSize>(customTypes);
|
||||
+ registerHelper<QSizeF>(customTypes);
|
||||
+ registerHelper<QPoint>(customTypes);
|
||||
+ registerHelper<QPointF>(customTypes);
|
||||
+ registerHelper<QLine>(customTypes);
|
||||
+ registerHelper<QLineF>(customTypes);
|
||||
+ registerHelper<QVariantList>(customTypes);
|
||||
+ registerHelper<QVariantMap>(customTypes);
|
||||
+ registerHelper<QVariantHash>(customTypes);
|
||||
+
|
||||
+ registerHelper<QList<bool> >(customTypes);
|
||||
+ registerHelper<QList<short> >(customTypes);
|
||||
+ registerHelper<QList<ushort> >(customTypes);
|
||||
+ registerHelper<QList<int> >(customTypes);
|
||||
+ registerHelper<QList<uint> >(customTypes);
|
||||
+ registerHelper<QList<qlonglong> >(customTypes);
|
||||
+ registerHelper<QList<qulonglong> >(customTypes);
|
||||
+ registerHelper<QList<double> >(customTypes);
|
||||
+ registerHelper<QList<QDBusObjectPath> >(customTypes);
|
||||
+ registerHelper<QList<QDBusSignature> >(customTypes);
|
||||
+ registerHelper<QList<QDBusUnixFileDescriptor> >(customTypes);
|
||||
#endif
|
||||
-
|
||||
- initialized.store(true);
|
||||
- }
|
||||
}
|
||||
|
||||
-Q_GLOBAL_STATIC(QVector<QDBusCustomTypeInfo>, 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<QDBusCustomTypeInfo> *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<QDBusCustomTypeInfo> &ct = mgr->customTypes;
|
||||
+ registerMarshallOperatorsNoLock(ct, id, mf, df);
|
||||
+}
|
||||
+
|
||||
+static void registerMarshallOperatorsNoLock(QVector<QDBusCustomTypeInfo> &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<QDBusCustomTypeInfo> *ct = customTypes();
|
||||
- if (id >= ct->size())
|
||||
+ const QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance();
|
||||
+ if (!mgr)
|
||||
+ return false; // shutting down
|
||||
+
|
||||
+ QReadLocker locker(&mgr->customTypesLock);
|
||||
+ const QVector<QDBusCustomTypeInfo> &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<QDBusCustomTypeInfo> *ct = customTypes();
|
||||
- if (id >= ct->size())
|
||||
+ const QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance();
|
||||
+ if (!mgr)
|
||||
+ return false; // shutting down
|
||||
+
|
||||
+ QReadLocker locker(&mgr->customTypesLock);
|
||||
+ const QVector<QDBusCustomTypeInfo> &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;
|
||||
@@ -431,13 +434,17 @@ const char *QDBusMetaType::typeToSignature(int type)
|
||||
return DBUS_TYPE_UNIX_FD_AS_STRING;
|
||||
|
||||
// try the database
|
||||
- QVector<QDBusCustomTypeInfo> *ct = customTypes();
|
||||
+ QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance();
|
||||
+ if (!mgr)
|
||||
+ return Q_NULLPTR; // shutting down
|
||||
+
|
||||
{
|
||||
- QReadLocker locker(customTypesLock());
|
||||
- if (type >= ct->size())
|
||||
+ QReadLocker locker(&mgr->customTypesLock);
|
||||
+ const QVector<QDBusCustomTypeInfo> &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 +461,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<QDBusCustomTypeInfo> &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) 2015 The Qt Company Ltd.
|
||||
+** Copyright (C) 2016 Intel Corporation.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the QtDBus module of the Qt Toolkit.
|
||||
@@ -53,10 +54,27 @@
|
||||
#include <qdbuserror.h>
|
||||
#include <qdbusunixfiledescriptor.h>
|
||||
|
||||
+#include <qbytearray.h>
|
||||
+#include <qreadwritelock.h>
|
||||
+#include <qvector.h>
|
||||
+
|
||||
#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<QDBusCustomTypeInfo> customTypes;
|
||||
+
|
||||
+protected:
|
||||
+ QDBusMetaTypeId();
|
||||
};
|
||||
|
||||
inline int QDBusMetaTypeId::message()
|
||||
--
|
||||
2.9.3
|
||||
|
121
0002-Fix-some-QtDBus-crashes-during-application-destructi.patch
Normal file
121
0002-Fix-some-QtDBus-crashes-during-application-destructi.patch
Normal file
@ -0,0 +1,121 @@
|
||||
From d060b7aa5fc64902ea89416e58b57d6a90f5aea6 Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Tue, 31 May 2016 17:33:03 -0300
|
||||
Subject: [PATCH 2/2] 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<QDBusConnectionPrivate *>(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.9.3
|
||||
|
@ -0,0 +1,43 @@
|
||||
From 2cf3dee10be1d2163eff0893f51f9ece643c2540 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= <spaz16@wp.pl>
|
||||
Date: Mon, 12 Sep 2016 15:22:20 +0200
|
||||
Subject: [PATCH 019/352] xcb: Don't send "Qt::WindowNoState" event when hiding
|
||||
minimized window
|
||||
|
||||
This prevents getting "QWidget::showEvent()" when hiding minimized
|
||||
widget on some WMs like Marco or Xfwm4.
|
||||
|
||||
If QWindow is minimized and it gets the new "XCB_WM_STATE_WITHDRAWN"
|
||||
event from XCB, then don't change the QWindow state.
|
||||
|
||||
Task-number: QTBUG-55942
|
||||
Change-Id: I90cfc2bf55e507864ad8f26c8f569ea562c27314
|
||||
Reviewed-by: Uli Schlachter <psychon@znc.in>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbwindow.cpp | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
index da50201..d46228c 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
@@ -2543,8 +2543,13 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev
|
||||
|
||||
if (reply && reply->format == 32 && reply->type == atom(QXcbAtom::WM_STATE)) {
|
||||
const quint32 *data = (const quint32 *)xcb_get_property_value(reply);
|
||||
- if (reply->length != 0 && XCB_WM_STATE_ICONIC == data[0])
|
||||
- newState = Qt::WindowMinimized;
|
||||
+ if (reply->length != 0) {
|
||||
+ if (data[0] == XCB_WM_STATE_ICONIC
|
||||
+ || (data[0] == XCB_WM_STATE_WITHDRAWN
|
||||
+ && m_lastWindowStateEvent == Qt::WindowMinimized)) {
|
||||
+ newState = Qt::WindowMinimized;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
free(reply);
|
||||
} else { // _NET_WM_STATE can't change minimized state
|
||||
--
|
||||
2.9.3
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 2c48695f04b0f4b3b11ec037b13132b146cad082 Mon Sep 17 00:00:00 2001
|
||||
From: Frederik Gladhorn <frederik.gladhorn@theqtcompany.com>
|
||||
Date: Thu, 15 Sep 2016 23:21:15 +0200
|
||||
Subject: [PATCH 032/352] XCB Drop from external app: fix keyboard modifier
|
||||
state
|
||||
|
||||
Fix inspired by Qt 4 sources. When we get drop events that are not
|
||||
coming from the same application, it's unlikely that the keyboard
|
||||
modifiers are in a sensible state (the usual XCB events are not sent
|
||||
during drag and drop), so set the keyboard modifier state explicitly.
|
||||
|
||||
Task-number: QTBUG-49645
|
||||
Change-Id: I9360f2b7ffeaa5243a4dfe7ccf96df134c5d2156
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbdrag.cpp | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
index f93e420..acfb580 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
@@ -960,6 +960,9 @@ void QXcbDrag::handleDrop(QPlatformWindow *, const xcb_client_message_event_t *e
|
||||
} else {
|
||||
dropData = platformDropData();
|
||||
supported_drop_actions = accepted_drop_action;
|
||||
+
|
||||
+ // Drop coming from another app? Update keyboard modifiers.
|
||||
+ QGuiApplicationPrivate::modifier_buttons = QGuiApplication::queryKeyboardModifiers();
|
||||
}
|
||||
|
||||
if (!dropData)
|
||||
--
|
||||
2.9.3
|
||||
|
150
0036-xcb-Use-the-state-of-the-key-event-to-process-it.patch
Normal file
150
0036-xcb-Use-the-state-of-the-key-event-to-process-it.patch
Normal file
@ -0,0 +1,150 @@
|
||||
From 76adb6c29f9284a3d7cceb8fb09c3bb7c4cd5e1b Mon Sep 17 00:00:00 2001
|
||||
From: Albert Astals Cid <aacid@kde.org>
|
||||
Date: Thu, 21 Apr 2016 01:39:27 +0200
|
||||
Subject: [PATCH 036/352] xcb: Use the state of the key event to process it
|
||||
|
||||
Instead of the global state
|
||||
|
||||
Task-number: QTBUG-48795
|
||||
Change-Id: Ic2c545718adb68df41730e5a3bf25adb374ffce3
|
||||
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbkeyboard.cpp | 72 ++++++++++++++++++------------
|
||||
src/plugins/platforms/xcb/qxcbkeyboard.h | 2 +
|
||||
2 files changed, 46 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
|
||||
index 28de86b..e0fcc01 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
|
||||
@@ -742,8 +742,7 @@ void QXcbKeyboard::updateKeymap()
|
||||
// update xkb state object
|
||||
xkb_state_unref(xkb_state);
|
||||
xkb_state = new_state;
|
||||
- if (!connection()->hasXKB())
|
||||
- updateXKBMods();
|
||||
+ updateXKBMods();
|
||||
|
||||
checkForLatinLayout();
|
||||
}
|
||||
@@ -768,32 +767,37 @@ void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state)
|
||||
}
|
||||
#endif
|
||||
|
||||
+void QXcbKeyboard::updateXKBStateFromState(struct xkb_state *kb_state, quint16 state)
|
||||
+{
|
||||
+ const quint32 modsDepressed = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_DEPRESSED);
|
||||
+ const quint32 modsLatched = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LATCHED);
|
||||
+ const quint32 modsLocked = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LOCKED);
|
||||
+ const quint32 xkbMask = xkbModMask(state);
|
||||
+
|
||||
+ const quint32 latched = modsLatched & xkbMask;
|
||||
+ const quint32 locked = modsLocked & xkbMask;
|
||||
+ quint32 depressed = modsDepressed & xkbMask;
|
||||
+ // set modifiers in depressed if they don't appear in any of the final masks
|
||||
+ depressed |= ~(depressed | latched | locked) & xkbMask;
|
||||
+
|
||||
+ const xkb_state_component newState
|
||||
+ = xkb_state_update_mask(kb_state,
|
||||
+ depressed,
|
||||
+ latched,
|
||||
+ locked,
|
||||
+ 0,
|
||||
+ 0,
|
||||
+ (state >> 13) & 3); // bits 13 and 14 report the state keyboard group
|
||||
+
|
||||
+ if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) {
|
||||
+ //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void QXcbKeyboard::updateXKBStateFromCore(quint16 state)
|
||||
{
|
||||
if (m_config && !connection()->hasXKB()) {
|
||||
- const quint32 modsDepressed = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_DEPRESSED);
|
||||
- const quint32 modsLatched = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED);
|
||||
- const quint32 modsLocked = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED);
|
||||
- const quint32 xkbMask = xkbModMask(state);
|
||||
-
|
||||
- const quint32 latched = modsLatched & xkbMask;
|
||||
- const quint32 locked = modsLocked & xkbMask;
|
||||
- quint32 depressed = modsDepressed & xkbMask;
|
||||
- // set modifiers in depressed if they don't appear in any of the final masks
|
||||
- depressed |= ~(depressed | latched | locked) & xkbMask;
|
||||
-
|
||||
- const xkb_state_component newState
|
||||
- = xkb_state_update_mask(xkb_state,
|
||||
- depressed,
|
||||
- latched,
|
||||
- locked,
|
||||
- 0,
|
||||
- 0,
|
||||
- (state >> 13) & 3); // bits 13 and 14 report the state keyboard group
|
||||
-
|
||||
- if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) {
|
||||
- //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
|
||||
- }
|
||||
+ updateXKBStateFromState(xkb_state, state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1455,7 +1459,16 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
|
||||
if (type == QEvent::KeyPress)
|
||||
targetWindow->updateNetWmUserTime(time);
|
||||
|
||||
- xcb_keysym_t sym = xkb_state_key_get_one_sym(xkb_state, code);
|
||||
+ // Have a temporary keyboard state filled in from state
|
||||
+ // this way we allow for synthetic events to have different state
|
||||
+ // from the current state i.e. you can have Alt+Ctrl pressed
|
||||
+ // and receive a synthetic key event that has neither Alt nor Ctrl pressed
|
||||
+ struct xkb_state *kb_state = xkb_state_new(xkb_keymap);
|
||||
+ if (!kb_state)
|
||||
+ return;
|
||||
+ updateXKBStateFromState(kb_state, state);
|
||||
+
|
||||
+ xcb_keysym_t sym = xkb_state_key_get_one_sym(kb_state, code);
|
||||
|
||||
QPlatformInputContext *inputContext = QGuiApplicationPrivate::platformIntegration()->inputContext();
|
||||
QMetaMethod method;
|
||||
@@ -1474,11 +1487,13 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
|
||||
Q_ARG(uint, code),
|
||||
Q_ARG(uint, state),
|
||||
Q_ARG(bool, type == QEvent::KeyPress));
|
||||
- if (retval)
|
||||
+ if (retval) {
|
||||
+ xkb_state_unref(kb_state);
|
||||
return;
|
||||
+ }
|
||||
}
|
||||
|
||||
- QString string = lookupString(xkb_state, code);
|
||||
+ QString string = lookupString(kb_state, code);
|
||||
|
||||
// Ιf control modifier is set we should prefer latin character, this is
|
||||
// used for standard shortcuts in checks like "key == QKeySequence::Copy",
|
||||
@@ -1547,6 +1562,7 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
|
||||
QWindowSystemInterface::handleExtendedKeyEvent(window, time, QEvent::KeyPress, qtcode, modifiers,
|
||||
code, sym, state, string, isAutoRepeat);
|
||||
}
|
||||
+ xkb_state_unref(kb_state);
|
||||
}
|
||||
|
||||
QString QXcbKeyboard::lookupString(struct xkb_state *state, xcb_keycode_t code) const
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h
|
||||
index 457a27a..dc27511 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbkeyboard.h
|
||||
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.h
|
||||
@@ -98,6 +98,8 @@ protected:
|
||||
void checkForLatinLayout();
|
||||
|
||||
private:
|
||||
+ void updateXKBStateFromState(struct xkb_state *kb_state, quint16 state);
|
||||
+
|
||||
bool m_config;
|
||||
xcb_keycode_t m_autorepeat_code;
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
@ -1,109 +0,0 @@
|
||||
From 276fa8383a7535765be7182883ef4aade17ce013 Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Thu, 2 Apr 2020 12:08:41 -0300
|
||||
Subject: [PATCH 44/49] QLibrary: fix deadlock caused by fix to QTBUG-39642
|
||||
|
||||
Commit ae6f73e8566fa76470937aca737141183929a5ec inserted a mutex around
|
||||
the entire load_sys(). We had reasoed that deadlocks would only occur if
|
||||
the object creation in instance() recursed into its own instance(),
|
||||
which was already a bug. But we had forgotten that dlopen()/
|
||||
LoadLibrary() executes initialization code from the module being loaded,
|
||||
which could cause a recursion back into the same QPluginLoader or
|
||||
QLibrary object. This recursion is benign because the module *is* loaded
|
||||
and dlopen()/LoadLibrary() returns the same handle.
|
||||
|
||||
[ChangeLog][QtCore][QLibrary and QPluginLoader] Fixed a deadlock that
|
||||
would happen if the plugin or library being loaded has load-time
|
||||
initialization code (C++ global variables) that recursed back into the
|
||||
same QLibrary or QPluginLoader object.
|
||||
|
||||
PS: QLibraryPrivate::loadPlugin() updates pluginState outside a mutex
|
||||
lock, so pluginState should be made an atomic variable. Once that is
|
||||
done, we'll only need locking the mutex to update errorString (no
|
||||
locking before loading).
|
||||
|
||||
Fixes: QTBUG-83207
|
||||
Task-number: QTBUG-39642
|
||||
Change-Id: Ibdc95e9af7bd456a94ecfffd160209304e5ab2eb
|
||||
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
|
||||
Reviewed-by: David Faure <david.faure@kdab.com>
|
||||
---
|
||||
src/corelib/plugin/qlibrary.cpp | 2 --
|
||||
src/corelib/plugin/qlibrary_unix.cpp | 4 ++++
|
||||
src/corelib/plugin/qlibrary_win.cpp | 3 +++
|
||||
3 files changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
|
||||
index ddb053c26f..be9d92b204 100644
|
||||
--- a/src/corelib/plugin/qlibrary.cpp
|
||||
+++ b/src/corelib/plugin/qlibrary.cpp
|
||||
@@ -576,9 +576,7 @@ bool QLibraryPrivate::load()
|
||||
|
||||
Q_TRACE(QLibraryPrivate_load_entry, fileName);
|
||||
|
||||
- mutex.lock();
|
||||
bool ret = load_sys();
|
||||
- mutex.unlock();
|
||||
if (qt_debug_component()) {
|
||||
if (ret) {
|
||||
qDebug() << "loaded library" << fileName;
|
||||
diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp
|
||||
index 017aa97b66..a5c72f81d9 100644
|
||||
--- a/src/corelib/plugin/qlibrary_unix.cpp
|
||||
+++ b/src/corelib/plugin/qlibrary_unix.cpp
|
||||
@@ -123,6 +123,7 @@ QStringList QLibraryPrivate::prefixes_sys()
|
||||
|
||||
bool QLibraryPrivate::load_sys()
|
||||
{
|
||||
+ QMutexLocker locker(&mutex);
|
||||
QString attempt;
|
||||
QFileSystemEntry fsEntry(fileName);
|
||||
|
||||
@@ -213,6 +214,7 @@ bool QLibraryPrivate::load_sys()
|
||||
}
|
||||
#endif
|
||||
|
||||
+ locker.unlock();
|
||||
bool retry = true;
|
||||
Handle hnd = nullptr;
|
||||
for (int prefix = 0; retry && !hnd && prefix < prefixes.size(); prefix++) {
|
||||
@@ -273,6 +275,8 @@ bool QLibraryPrivate::load_sys()
|
||||
}
|
||||
}
|
||||
#endif
|
||||
+
|
||||
+ locker.relock();
|
||||
if (!hnd) {
|
||||
errorString = QLibrary::tr("Cannot load library %1: %2").arg(fileName, qdlerror());
|
||||
}
|
||||
diff --git a/src/corelib/plugin/qlibrary_win.cpp b/src/corelib/plugin/qlibrary_win.cpp
|
||||
index 000bf76276..ef58724be8 100644
|
||||
--- a/src/corelib/plugin/qlibrary_win.cpp
|
||||
+++ b/src/corelib/plugin/qlibrary_win.cpp
|
||||
@@ -78,6 +78,7 @@ bool QLibraryPrivate::load_sys()
|
||||
// fileName
|
||||
//
|
||||
// NB If it's a plugin we do not ever try the ".dll" extension
|
||||
+ QMutexLocker locker(&mutex);
|
||||
QStringList attempts;
|
||||
|
||||
if (pluginState != IsAPlugin)
|
||||
@@ -95,6 +96,7 @@ bool QLibraryPrivate::load_sys()
|
||||
attempts.prepend(QDir::rootPath() + fileName);
|
||||
#endif
|
||||
|
||||
+ locker.unlock();
|
||||
Handle hnd = nullptr;
|
||||
for (const QString &attempt : qAsConst(attempts)) {
|
||||
#ifndef Q_OS_WINRT
|
||||
@@ -115,6 +117,7 @@ bool QLibraryPrivate::load_sys()
|
||||
#ifndef Q_OS_WINRT
|
||||
SetErrorMode(oldmode);
|
||||
#endif
|
||||
+ locker.relock();
|
||||
if (!hnd) {
|
||||
errorString = QLibrary::tr("Cannot load library %1: %2").arg(
|
||||
QDir::toNativeSeparators(fileName), qt_error_string());
|
||||
--
|
||||
2.25.2
|
||||
|
139
0084-xcb-Treat-bitmap-cursors-differently-from-shaped-cur.patch
Normal file
139
0084-xcb-Treat-bitmap-cursors-differently-from-shaped-cur.patch
Normal file
@ -0,0 +1,139 @@
|
||||
From 422838685c31d9b57133a8711bfd5db92095d96d Mon Sep 17 00:00:00 2001
|
||||
From: Robin Burchell <robin.burchell@viroteck.net>
|
||||
Date: Wed, 7 Sep 2016 14:34:03 +0200
|
||||
Subject: [PATCH 084/352] xcb: Treat bitmap cursors differently from shaped
|
||||
cursors
|
||||
|
||||
QXcbCursor had a "cache" of cursor handles. Unfortunately, as QXcbCursor has its
|
||||
lifetime tied to the screen, this cache grew unbounded whenever the cursor was
|
||||
set: this could be witnessed worst when repeatedly setting the current cursor to
|
||||
a different pixmap each time.
|
||||
|
||||
We fix this by keeping the cursor cache only for the "regular" shaped cursors
|
||||
that are often shared between windows, working on the assumption that custom
|
||||
cursors are generally specific only to a given window. This makes the lifetime
|
||||
of the bitmap cursors much more clear: they are tied to that window, and when
|
||||
the window is destroyed (or changes cursor), so too is the bitmap cursor
|
||||
destroyed (if set).
|
||||
|
||||
Reported-by: Will Thompson <wjt@endlessm.com>
|
||||
Change-Id: Ia558d858ff49e89cd5220344567203eb0267a133
|
||||
Reviewed-by: Uli Schlachter <psychon@znc.in>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbcursor.cpp | 24 +++++++++++++++++-------
|
||||
src/plugins/platforms/xcb/qxcbwindow.cpp | 22 +++++++++++++++++++---
|
||||
src/plugins/platforms/xcb/qxcbwindow.h | 3 ++-
|
||||
3 files changed, 38 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbcursor.cpp b/src/plugins/platforms/xcb/qxcbcursor.cpp
|
||||
index b321ed9..4646ced 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbcursor.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbcursor.cpp
|
||||
@@ -353,17 +353,27 @@ void QXcbCursor::changeCursor(QCursor *cursor, QWindow *widget)
|
||||
return;
|
||||
|
||||
xcb_cursor_t c = XCB_CURSOR_NONE;
|
||||
+ bool isBitmapCursor = false;
|
||||
+
|
||||
if (cursor) {
|
||||
- const QXcbCursorCacheKey key(*cursor);
|
||||
- CursorHash::iterator it = m_cursorHash.find(key);
|
||||
- if (it == m_cursorHash.end()) {
|
||||
- const Qt::CursorShape shape = cursor->shape();
|
||||
- it = m_cursorHash.insert(key, shape == Qt::BitmapCursor ? createBitmapCursor(cursor) : createFontCursor(shape));
|
||||
+ const Qt::CursorShape shape = cursor->shape();
|
||||
+ isBitmapCursor = shape == Qt::BitmapCursor;
|
||||
+
|
||||
+ if (!isBitmapCursor) {
|
||||
+ const QXcbCursorCacheKey key(*cursor);
|
||||
+ CursorHash::iterator it = m_cursorHash.find(key);
|
||||
+ if (it == m_cursorHash.end()) {
|
||||
+ it = m_cursorHash.insert(key, createFontCursor(shape));
|
||||
+ }
|
||||
+ c = it.value();
|
||||
+ } else {
|
||||
+ // Do not cache bitmap cursors, as otherwise they have unclear
|
||||
+ // lifetime (we effectively leak xcb_cursor_t).
|
||||
+ c = createBitmapCursor(cursor);
|
||||
}
|
||||
- c = it.value();
|
||||
}
|
||||
|
||||
- w->setCursor(c);
|
||||
+ w->setCursor(c, isBitmapCursor);
|
||||
}
|
||||
|
||||
static int cursorIdForShape(int cshape)
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
index d46228c..5f402b6 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
@@ -302,6 +302,7 @@ QXcbWindow::QXcbWindow(QWindow *window)
|
||||
, m_lastWindowStateEvent(-1)
|
||||
, m_syncState(NoSyncNeeded)
|
||||
, m_pendingSyncRequest(0)
|
||||
+ , m_currentBitmapCursor(XCB_CURSOR_NONE)
|
||||
{
|
||||
setConnection(xcbScreen()->connection());
|
||||
}
|
||||
@@ -620,6 +621,9 @@ void QXcbWindow::create()
|
||||
|
||||
QXcbWindow::~QXcbWindow()
|
||||
{
|
||||
+ if (m_currentBitmapCursor != XCB_CURSOR_NONE) {
|
||||
+ xcb_free_cursor(xcb_connection(), m_currentBitmapCursor);
|
||||
+ }
|
||||
if (window()->type() != Qt::ForeignWindow)
|
||||
destroy();
|
||||
else {
|
||||
@@ -2665,10 +2669,22 @@ bool QXcbWindow::setMouseGrabEnabled(bool grab)
|
||||
return result;
|
||||
}
|
||||
|
||||
-void QXcbWindow::setCursor(xcb_cursor_t cursor)
|
||||
+void QXcbWindow::setCursor(xcb_cursor_t cursor, bool isBitmapCursor)
|
||||
{
|
||||
- xcb_change_window_attributes(xcb_connection(), m_window, XCB_CW_CURSOR, &cursor);
|
||||
- xcb_flush(xcb_connection());
|
||||
+ xcb_connection_t *conn = xcb_connection();
|
||||
+
|
||||
+ xcb_change_window_attributes(conn, m_window, XCB_CW_CURSOR, &cursor);
|
||||
+ xcb_flush(conn);
|
||||
+
|
||||
+ if (m_currentBitmapCursor != XCB_CURSOR_NONE) {
|
||||
+ xcb_free_cursor(conn, m_currentBitmapCursor);
|
||||
+ }
|
||||
+
|
||||
+ if (isBitmapCursor) {
|
||||
+ m_currentBitmapCursor = cursor;
|
||||
+ } else {
|
||||
+ m_currentBitmapCursor = XCB_CURSOR_NONE;
|
||||
+ }
|
||||
}
|
||||
|
||||
void QXcbWindow::windowEvent(QEvent *event)
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
|
||||
index b8bcf44..f2b6904 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.h
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
bool setKeyboardGrabEnabled(bool grab) Q_DECL_OVERRIDE;
|
||||
bool setMouseGrabEnabled(bool grab) Q_DECL_OVERRIDE;
|
||||
|
||||
- void setCursor(xcb_cursor_t cursor);
|
||||
+ void setCursor(xcb_cursor_t cursor, bool isBitmapCursor);
|
||||
|
||||
QSurfaceFormat format() const Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -263,6 +263,7 @@ protected:
|
||||
SyncState m_syncState;
|
||||
|
||||
QXcbSyncWindowRequest *m_pendingSyncRequest;
|
||||
+ xcb_cursor_t m_currentBitmapCursor;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
--
|
||||
2.9.3
|
||||
|
85
0098-Plug-QMimeData-leaks-in-QXcbClipboard.patch
Normal file
85
0098-Plug-QMimeData-leaks-in-QXcbClipboard.patch
Normal file
@ -0,0 +1,85 @@
|
||||
From f43c9697bcae997be3eb6db9504f3d7b64601148 Mon Sep 17 00:00:00 2001
|
||||
From: Marc Mutz <marc.mutz@kdab.com>
|
||||
Date: Tue, 27 Sep 2016 14:55:09 +0200
|
||||
Subject: [PATCH 098/352] Plug QMimeData leaks in QXcbClipboard
|
||||
|
||||
QXcbClipboard failed to delete the various QMimeData instances
|
||||
it owns.
|
||||
|
||||
For m_xClipboard, where the two QXcbClipboardMime instances are
|
||||
never the same, fix the leak by using a scoped instead of a
|
||||
naked pointer.
|
||||
|
||||
For m_clientClipboard, where the two QMimeData could be identical
|
||||
objects, keep the naked pointers, but delete the objects manually
|
||||
in the QXcbClipboard destructor, paying attention to the case
|
||||
where they're the same object.
|
||||
|
||||
Change-Id: I5ce0e3e8fcec068aeb344ca806cdf2667378e946
|
||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbclipboard.cpp | 12 +++++++-----
|
||||
src/plugins/platforms/xcb/qxcbclipboard.h | 2 +-
|
||||
2 files changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
index 8b75c13..d44ebae 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
@@ -269,8 +269,6 @@ QXcbClipboard::QXcbClipboard(QXcbConnection *c)
|
||||
{
|
||||
Q_ASSERT(QClipboard::Clipboard == 0);
|
||||
Q_ASSERT(QClipboard::Selection == 1);
|
||||
- m_xClipboard[QClipboard::Clipboard] = 0;
|
||||
- m_xClipboard[QClipboard::Selection] = 0;
|
||||
m_clientClipboard[QClipboard::Clipboard] = 0;
|
||||
m_clientClipboard[QClipboard::Selection] = 0;
|
||||
m_timestamp[QClipboard::Clipboard] = XCB_CURRENT_TIME;
|
||||
@@ -323,6 +321,10 @@ QXcbClipboard::~QXcbClipboard()
|
||||
}
|
||||
free(reply);
|
||||
}
|
||||
+
|
||||
+ if (m_clientClipboard[QClipboard::Clipboard] != m_clientClipboard[QClipboard::Selection])
|
||||
+ delete m_clientClipboard[QClipboard::Clipboard];
|
||||
+ delete m_clientClipboard[QClipboard::Selection];
|
||||
}
|
||||
|
||||
void QXcbClipboard::incrTransactionPeeker(xcb_generic_event_t *ge, bool &accepted)
|
||||
@@ -372,9 +374,9 @@ QMimeData * QXcbClipboard::mimeData(QClipboard::Mode mode)
|
||||
return m_clientClipboard[mode];
|
||||
} else {
|
||||
if (!m_xClipboard[mode])
|
||||
- m_xClipboard[mode] = new QXcbClipboardMime(mode, this);
|
||||
+ m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
|
||||
|
||||
- return m_xClipboard[mode];
|
||||
+ return m_xClipboard[mode].data();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -724,7 +726,7 @@ void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_eve
|
||||
// here we care only about the xfixes events that come from non Qt processes
|
||||
if (event->owner != XCB_NONE && event->owner != owner()) {
|
||||
if (!m_xClipboard[mode]) {
|
||||
- m_xClipboard[mode] = new QXcbClipboardMime(mode, this);
|
||||
+ m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
|
||||
} else {
|
||||
m_xClipboard[mode]->reset();
|
||||
}
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.h b/src/plugins/platforms/xcb/qxcbclipboard.h
|
||||
index 10f0704..f9a34f4 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbclipboard.h
|
||||
+++ b/src/plugins/platforms/xcb/qxcbclipboard.h
|
||||
@@ -92,7 +92,7 @@ private:
|
||||
QClipboard::Mode modeForAtom(xcb_atom_t atom) const;
|
||||
|
||||
// Selection and Clipboard
|
||||
- QXcbClipboardMime *m_xClipboard[2];
|
||||
+ QScopedPointer<QXcbClipboardMime> m_xClipboard[2];
|
||||
QMimeData *m_clientClipboard[2];
|
||||
xcb_timestamp_t m_timestamp[2];
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
@ -0,0 +1,64 @@
|
||||
From f4fff02cbb1f9399f407c15a27741c6cd1a17133 Mon Sep 17 00:00:00 2001
|
||||
From: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Date: Mon, 10 Oct 2016 16:09:32 +0200
|
||||
Subject: [PATCH 145/352] QXcbShmImage: don't use shmget()'s return unless it
|
||||
succeeds
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When shmget() failed, we didn't set m_shm_info.shmid (not even to the
|
||||
-1 failure id) but did pass it (i.e. uninitialized noise) to shmat(),
|
||||
among other related functions. Guard against this; handle failure
|
||||
gracefully.
|
||||
|
||||
Task-number: QTBUG-56419
|
||||
Change-Id: Ie823c36c2ede03af6cb5d94ce7b4b5cd543c1008
|
||||
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
|
||||
Reviewed-by: Błażej Szczygieł <spaz16@wp.pl>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Joni Poikelin <joni.poikelin@qt.io>
|
||||
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbbackingstore.cpp | 16 +++++++++-------
|
||||
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
|
||||
index 3b04c59..0b76830 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
|
||||
@@ -150,12 +150,13 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
|
||||
return;
|
||||
|
||||
int id = shmget(IPC_PRIVATE, segmentSize, IPC_CREAT | 0600);
|
||||
- if (id == -1)
|
||||
+ if (id == -1) {
|
||||
qWarning("QXcbShmImage: shmget() failed (%d: %s) for size %d (%dx%d)",
|
||||
errno, strerror(errno), segmentSize, size.width(), size.height());
|
||||
- else
|
||||
- m_shm_info.shmid = id;
|
||||
- m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat (m_shm_info.shmid, 0, 0);
|
||||
+ } else {
|
||||
+ m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat(id, 0, 0);
|
||||
+ }
|
||||
+ m_shm_info.shmid = id;
|
||||
m_shm_info.shmseg = xcb_generate_id(xcb_connection());
|
||||
|
||||
const xcb_query_extension_reply_t *shm_reply = xcb_get_extension_data(xcb_connection(), &xcb_shm_id);
|
||||
@@ -166,9 +167,10 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
|
||||
if (!shm_present || error || id == -1) {
|
||||
free(error);
|
||||
|
||||
- shmdt(m_shm_info.shmaddr);
|
||||
- shmctl(m_shm_info.shmid, IPC_RMID, 0);
|
||||
-
|
||||
+ if (id != -1) {
|
||||
+ shmdt(m_shm_info.shmaddr);
|
||||
+ shmctl(m_shm_info.shmid, IPC_RMID, 0);
|
||||
+ }
|
||||
m_shm_info.shmaddr = 0;
|
||||
|
||||
m_xcb_image->data = (uint8_t *)malloc(segmentSize);
|
||||
--
|
||||
2.9.3
|
||||
|
@ -0,0 +1,85 @@
|
||||
From ee22c6505a1f7cf52a862b1bd9219511db893417 Mon Sep 17 00:00:00 2001
|
||||
From: Clinton Stimpson <clinton@elemtech.com>
|
||||
Date: Tue, 30 Aug 2016 07:52:17 -0600
|
||||
Subject: [PATCH 177/352] xcb: fix passing of focus from child to its top level
|
||||
QWindow
|
||||
|
||||
With the client message _NET_ACTIVE_WINDOW, not all window managers
|
||||
will pass focus from a child window to its root window, Detect this
|
||||
child-to-root case, and use xcb_set_input_focus() instead.
|
||||
|
||||
Task-number: QTBUG-39362
|
||||
Change-Id: Ib32193018e3b725b323f87d7306c9ae9493d78a7
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbwindow.cpp | 3 ++-
|
||||
tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 20 +++++++++++++++++++-
|
||||
2 files changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
index 5f402b6..25a8b41 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
@@ -1698,9 +1698,11 @@ void QXcbWindow::requestActivateWindow()
|
||||
m_deferredActivation = false;
|
||||
|
||||
updateNetWmUserTime(connection()->time());
|
||||
+ QWindow *focusWindow = QGuiApplication::focusWindow();
|
||||
|
||||
if (window()->isTopLevel()
|
||||
&& !(window()->flags() & Qt::X11BypassWindowManagerHint)
|
||||
+ && (!focusWindow || !window()->isAncestorOf(focusWindow))
|
||||
&& connection()->wmSupport()->isSupportedByWM(atom(QXcbAtom::_NET_ACTIVE_WINDOW))) {
|
||||
xcb_client_message_event_t event;
|
||||
|
||||
@@ -1711,7 +1713,6 @@ void QXcbWindow::requestActivateWindow()
|
||||
event.type = atom(QXcbAtom::_NET_ACTIVE_WINDOW);
|
||||
event.data.data32[0] = 1;
|
||||
event.data.data32[1] = connection()->time();
|
||||
- QWindow *focusWindow = QGuiApplication::focusWindow();
|
||||
event.data.data32[2] = focusWindow ? focusWindow->winId() : XCB_NONE;
|
||||
event.data.data32[3] = 0;
|
||||
event.data.data32[4] = 0;
|
||||
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
|
||||
index 0cce5a0..d904d48 100644
|
||||
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
|
||||
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
|
||||
@@ -601,6 +601,24 @@ void tst_QWindow::isActive()
|
||||
// child has focus
|
||||
QVERIFY(window.isActive());
|
||||
|
||||
+ // test focus back to parent and then back to child (QTBUG-39362)
|
||||
+ // also verify the cumulative FocusOut and FocusIn counts
|
||||
+ // activate parent
|
||||
+ window.requestActivate();
|
||||
+ QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
|
||||
+ QVERIFY(window.isActive());
|
||||
+ QCoreApplication::processEvents();
|
||||
+ QTRY_COMPARE(child.received(QEvent::FocusOut), 1);
|
||||
+ QTRY_COMPARE(window.received(QEvent::FocusIn), 2);
|
||||
+
|
||||
+ // activate child again
|
||||
+ child.requestActivate();
|
||||
+ QTRY_COMPARE(QGuiApplication::focusWindow(), &child);
|
||||
+ QVERIFY(child.isActive());
|
||||
+ QCoreApplication::processEvents();
|
||||
+ QTRY_COMPARE(window.received(QEvent::FocusOut), 2);
|
||||
+ QTRY_COMPARE(child.received(QEvent::FocusIn), 2);
|
||||
+
|
||||
Window dialog;
|
||||
dialog.setTransientParent(&window);
|
||||
dialog.setGeometry(QRect(m_availableTopLeft + QPoint(110, 100), m_testWindowSize));
|
||||
@@ -625,7 +643,7 @@ void tst_QWindow::isActive()
|
||||
QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
|
||||
QCoreApplication::processEvents();
|
||||
QTRY_COMPARE(dialog.received(QEvent::FocusOut), 1);
|
||||
- QTRY_COMPARE(window.received(QEvent::FocusIn), 2);
|
||||
+ QTRY_COMPARE(window.received(QEvent::FocusIn), 3);
|
||||
|
||||
QVERIFY(window.isActive());
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 10b9321c1dc19236620ba20bdf54cae73891d1ef Mon Sep 17 00:00:00 2001
|
||||
From: Anton Kudryavtsev <a.kudryavtsev@netris.ru>
|
||||
Date: Wed, 19 Oct 2016 15:30:58 +0300
|
||||
Subject: [PATCH 190/352] qxcbconnection.cpp: fix warning about unused function
|
||||
|
||||
isXIEvent() is used iff XCB_USE_XINPUT2 is defined.
|
||||
So move declaration of the function in XCB_USE_XINPUT2 define scope.
|
||||
|
||||
Change-Id: I6f045cd07d572ee7425ee6edc5ac73dcf0afdb37
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbconnection.cpp | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
|
||||
index c533a2a..3d808d1 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
|
||||
@@ -110,6 +110,7 @@ Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen")
|
||||
#define XCB_GE_GENERIC 35
|
||||
#endif
|
||||
|
||||
+#if defined(XCB_USE_XINPUT2)
|
||||
// Starting from the xcb version 1.9.3 struct xcb_ge_event_t has changed:
|
||||
// - "pad0" became "extension"
|
||||
// - "pad1" and "pad" became "pad0"
|
||||
@@ -127,6 +128,7 @@ static inline bool isXIEvent(xcb_generic_event_t *event, int opCode)
|
||||
qt_xcb_ge_event_t *e = (qt_xcb_ge_event_t *)event;
|
||||
return e->extension == opCode;
|
||||
}
|
||||
+#endif // XCB_USE_XINPUT2
|
||||
|
||||
#ifdef XCB_USE_XLIB
|
||||
static const char * const xcbConnectionErrors[] = {
|
||||
--
|
||||
2.9.3
|
||||
|
@ -0,0 +1,82 @@
|
||||
From ca4d93d85ee446c5e30ec8e7814651e45cbf1218 Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Thu, 12 Nov 2015 10:14:51 -0800
|
||||
Subject: [PATCH 237/352] 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
|
||||
Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html
|
||||
Change-Id: I461e9fc7199748faa187ffff1416070f138df8db
|
||||
(cherry picked from commit 494376f980e96339b6f1eff7c41336ca4d853065)
|
||||
Discussed-again-on: http://lists.qt-project.org/pipermail/development/2016-October/027476.html
|
||||
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
|
||||
---
|
||||
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.9.3
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 3c2cb87de2554b9c4f6e2080768fe9ede00aeab3 Mon Sep 17 00:00:00 2001
|
||||
From: Laszlo Agocs <laszlo.agocs@qt.io>
|
||||
Date: Mon, 7 Nov 2016 09:54:55 +0100
|
||||
Subject: [PATCH 263/352] xcb: Warn and bail out when even the basic, dummy
|
||||
context fails
|
||||
|
||||
Do not move on to glGet since the behavior is undefined.
|
||||
|
||||
Task-number: QTBUG-48986
|
||||
Change-Id: Ifd279635ed1b8441f92697965d15ae3ecb59a7e3
|
||||
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
|
||||
---
|
||||
.../platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
|
||||
index 9bdedcc..c2b7a56 100644
|
||||
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
|
||||
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
|
||||
@@ -672,8 +672,11 @@ void QGLXContext::queryDummyContext()
|
||||
}
|
||||
|
||||
QOpenGLContext context;
|
||||
- context.create();
|
||||
- context.makeCurrent(surface.data());
|
||||
+ if (!context.create() || !context.makeCurrent(surface.data())) {
|
||||
+ qWarning("QGLXContext: Failed to create dummy context");
|
||||
+ m_supportsThreading = false;
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
m_supportsThreading = true;
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
40
0276-QClipboard-Fix-emitting-changed-in-XCB.patch
Normal file
40
0276-QClipboard-Fix-emitting-changed-in-XCB.patch
Normal file
@ -0,0 +1,40 @@
|
||||
From 291eba6f8099a0fec8fbd9cf8a1fb67e5c9f4f8d Mon Sep 17 00:00:00 2001
|
||||
From: Palo Kisa <palo.kisa@gmail.com>
|
||||
Date: Mon, 7 Nov 2016 18:27:17 +0100
|
||||
Subject: [PATCH 276/352] QClipboard: Fix emitting changed() in XCB
|
||||
|
||||
In XCB environment the QClipboard::changed() was not delivered if the
|
||||
QClipboard::clear() was issued by other Qt app/process.
|
||||
|
||||
If the QClipboard::clear() is used, then the owner in
|
||||
xcb_xfixes_selection_notify_event_t is XCB_NONE, so we need make the
|
||||
decission to handle this event by the selection_timestamp and our
|
||||
m_timestamp[mode].
|
||||
|
||||
Task-number: QTBUG-56972
|
||||
Change-Id: If4c486ac02223eac506465cac7ff1a07bd02a187
|
||||
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbclipboard.cpp | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
index d44ebae..40abef4 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
@@ -723,8 +723,10 @@ void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_eve
|
||||
if (mode > QClipboard::Selection)
|
||||
return;
|
||||
|
||||
- // here we care only about the xfixes events that come from non Qt processes
|
||||
- if (event->owner != XCB_NONE && event->owner != owner()) {
|
||||
+ // Note1: Here we care only about the xfixes events that come from other processes.
|
||||
+ // Note2: If the QClipboard::clear() is issued, event->owner is XCB_NONE,
|
||||
+ // so we check selection_timestamp to not handle our own QClipboard::clear().
|
||||
+ if (event->owner != owner() && event->selection_timestamp > m_timestamp[mode]) {
|
||||
if (!m_xClipboard[mode]) {
|
||||
m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
|
||||
} else {
|
||||
--
|
||||
2.9.3
|
||||
|
@ -0,0 +1,80 @@
|
||||
From dd52fd0024600d3beffc82d6da02b4239a62d725 Mon Sep 17 00:00:00 2001
|
||||
From: Jocelyn Turcotte <jturcotte@woboq.com>
|
||||
Date: Tue, 17 Jan 2017 17:05:00 +0100
|
||||
Subject: [PATCH 295/420] Ensure a pixel density of at least 1 for
|
||||
Qt::AA_EnableHighDpiScaling
|
||||
|
||||
Very large 1080p TVs or any display which is running at an abnormally
|
||||
low resolution can have a DPI lower than 48, which means that
|
||||
qRound(dpi/96) will result in a 0 pixel density, causing critical
|
||||
issues for applications using Qt::AA_EnableHighDpiScaling.
|
||||
|
||||
Make sure that we always have a pixel density of at least 1 to allow
|
||||
applications not having to worry about such displays.
|
||||
|
||||
Task-number: QTBUG-56140
|
||||
Change-Id: I1dafbf7794a99ae6f872984c0337d8ff0d1fc1c0
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
||||
---
|
||||
src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp | 2 +-
|
||||
src/plugins/platforms/windows/qwindowsscreen.cpp | 2 +-
|
||||
src/plugins/platforms/winrt/qwinrtscreen.cpp | 2 +-
|
||||
src/plugins/platforms/xcb/qxcbscreen.cpp | 2 +-
|
||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp b/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
index 3e1e93f..863a115 100644
|
||||
--- a/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
+++ b/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
@@ -226,7 +226,7 @@ QDpi QEglFSDeviceIntegration::logicalDpi() const
|
||||
|
||||
qreal QEglFSDeviceIntegration::pixelDensity() const
|
||||
{
|
||||
- return qRound(logicalDpi().first / qreal(100));
|
||||
+ return qMax(1, qRound(logicalDpi().first / qreal(100)));
|
||||
}
|
||||
|
||||
Qt::ScreenOrientation QEglFSDeviceIntegration::nativeOrientation() const
|
||||
diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
index 7a885b4..c70323c 100644
|
||||
--- a/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
+++ b/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
@@ -265,7 +265,7 @@ qreal QWindowsScreen::pixelDensity() const
|
||||
// the pixel density since it is reflects the Windows UI scaling.
|
||||
// High DPI auto scaling should be disabled when the user chooses
|
||||
// small fonts on a High DPI monitor, resulting in lower logical DPI.
|
||||
- return qRound(logicalDpi().first / 96);
|
||||
+ return qMax(1, qRound(logicalDpi().first / 96));
|
||||
}
|
||||
|
||||
/*!
|
||||
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
index f87ae9f..2a4b6c8 100644
|
||||
--- a/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
+++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
@@ -647,7 +647,7 @@ QDpi QWinRTScreen::logicalDpi() const
|
||||
qreal QWinRTScreen::pixelDensity() const
|
||||
{
|
||||
Q_D(const QWinRTScreen);
|
||||
- return qRound(d->logicalDpi / 96);
|
||||
+ return qMax(1, qRound(d->logicalDpi / 96));
|
||||
}
|
||||
|
||||
qreal QWinRTScreen::scaleFactor() const
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
index a967593..d8facdb 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
@@ -631,7 +631,7 @@ void QXcbScreen::updateGeometry(const QRect &geom, uint8_t rotation)
|
||||
m_sizeMillimeters = sizeInMillimeters(xGeometry.size(), virtualDpi());
|
||||
|
||||
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
|
||||
- m_pixelDensity = qRound(dpi/96);
|
||||
+ m_pixelDensity = qMax(1, qRound(dpi/96));
|
||||
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
|
||||
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
|
||||
--
|
||||
2.9.3
|
||||
|
36
macros.qt5
Normal file
36
macros.qt5
Normal file
@ -0,0 +1,36 @@
|
||||
%_qt5 @@NAME@@
|
||||
%_qt5_epoch @@EPOCH@@
|
||||
%_qt5_version @@VERSION@@
|
||||
%_qt5_evr @@EVR@@
|
||||
%_qt5_prefix %{_libdir}/qt5
|
||||
%_qt5_archdatadir %{_qt5_prefix}
|
||||
%_qt5_bindir %{_qt5_prefix}/bin
|
||||
%_qt5_datadir %{_datadir}/qt5
|
||||
%_qt5_docdir %{_docdir}/qt5
|
||||
%_qt5_examplesdir %{_qt5_prefix}/examples
|
||||
%_qt5_headerdir %{_includedir}/qt5
|
||||
%_qt5_importdir %{_qt5_archdatadir}/imports
|
||||
%_qt5_libdir %{_libdir}
|
||||
%_qt5_libexecdir %{_qt5_archdatadir}/libexec
|
||||
%_qt5_plugindir %{_qt5_archdatadir}/plugins
|
||||
%_qt5_qmldir %{_qt5_archdatadir}/qml
|
||||
%_qt5_qmake %{_qt5_bindir}/qmake
|
||||
%_qt5_settingsdir %{_sysconfdir}/xdg
|
||||
%_qt5_sysconfdir %{_qt5_settingsdir}
|
||||
%_qt5_translationdir %{_datadir}/qt5/translations
|
||||
|
||||
%_qt5_cflags %{nil}@@QT5_CFLAGS@@
|
||||
%_qt5_cxxflags %{nil}@@QT5_CXXFLAGS@@
|
||||
%_qt5_ldflags %{nil}%{?__global_ldflags} @@QT5_RPM_LD_FLAGS@@
|
||||
%_qt5_optflags %{optflags} @@QT5_RPM_OPT_FLAGS@@
|
||||
|
||||
%_qt5_qmake_flags \\\
|
||||
QMAKE_CFLAGS_DEBUG="${CFLAGS:-%{_qt5_optflags} %{?_qt5_cflags}}" \\\
|
||||
QMAKE_CFLAGS_RELEASE="${CFLAGS:-%{_qt5_optflags} %{?_qt5_cflags}}" \\\
|
||||
QMAKE_CXXFLAGS_DEBUG="${CXXFLAGS:-%{_qt5_optflags} %{?_qt5_cxxflags}}" \\\
|
||||
QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS:-%{_qt5_optflags} %{?_qt5_cxxflags}}" \\\
|
||||
QMAKE_LFLAGS_DEBUG="${LDFLAGS:-%{_qt5_ldflags}}" \\\
|
||||
QMAKE_LFLAGS_RELEASE="${LDFLAGS:-%{_qt5_ldflags}}" \\\
|
||||
QMAKE_STRIP=
|
||||
|
||||
%qmake_qt5 %{_qt5_qmake} %{?_qt5_qmake_flags}
|
@ -1,4 +0,0 @@
|
||||
%_qt5 @@NAME@@
|
||||
%_qt5_epoch @@EPOCH@@
|
||||
%_qt5_version @@VERSION@@
|
||||
%_qt5_evr @@EVR@@
|
@ -1,29 +0,0 @@
|
||||
diff -up qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/configure.json.firebird qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/configure.json
|
||||
--- qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/configure.json.firebird 2019-01-28 11:11:52.000000000 -0600
|
||||
+++ qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/configure.json 2019-02-03 13:41:27.392305128 -0600
|
||||
@@ -49,10 +49,11 @@
|
||||
"ibase": {
|
||||
"label": "InterBase",
|
||||
"test": {},
|
||||
- "headers": "ibase.h",
|
||||
+ "headers": "firebird/ibase.h",
|
||||
"sources": [
|
||||
{ "libs": "-lgds32_ms", "condition": "config.win32" },
|
||||
- { "libs": "-lgds", "condition": "!config.win32" }
|
||||
+ { "libs": "-lgds", "condition": "!config.win32" },
|
||||
+ { "libs": "-lfbclient", "condition": "!config.win32" }
|
||||
]
|
||||
},
|
||||
"mysql": {
|
||||
diff -up qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/ibase/qsql_ibase_p.h.firebird qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/ibase/qsql_ibase_p.h
|
||||
--- qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/ibase/qsql_ibase_p.h.firebird 2019-01-28 11:11:52.000000000 -0600
|
||||
+++ qtbase-everywhere-src-5.12.1/src/plugins/sqldrivers/ibase/qsql_ibase_p.h 2019-02-03 13:27:30.683142996 -0600
|
||||
@@ -52,7 +52,7 @@
|
||||
//
|
||||
|
||||
#include <QtSql/qsqldriver.h>
|
||||
-#include <ibase.h>
|
||||
+#include <firebird/ibase.h>
|
||||
|
||||
#ifdef QT_PLUGIN
|
||||
#define Q_EXPORT_SQLDRIVER_IBASE
|
48
qt5-qtbase-5.8-QTBUG-56140.patch
Normal file
48
qt5-qtbase-5.8-QTBUG-56140.patch
Normal file
@ -0,0 +1,48 @@
|
||||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp.0295 2017-02-13 12:58:54.062341106 -0600
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp 2017-02-13 13:00:13.318163725 -0600
|
||||
@@ -224,7 +224,7 @@ QDpi QEGLDeviceIntegration::logicalDpi()
|
||||
|
||||
qreal QEGLDeviceIntegration::pixelDensity() const
|
||||
{
|
||||
- return qRound(logicalDpi().first / qreal(100));
|
||||
+ return qMax(1, qRound(logicalDpi().first / qreal(100)));
|
||||
}
|
||||
|
||||
Qt::ScreenOrientation QEGLDeviceIntegration::nativeOrientation() const
|
||||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp.0295 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp 2017-02-13 12:58:54.063341117 -0600
|
||||
@@ -258,7 +258,7 @@ qreal QWindowsScreen::pixelDensity() con
|
||||
// the pixel density since it is reflects the Windows UI scaling.
|
||||
// High DPI auto scaling should be disabled when the user chooses
|
||||
// small fonts on a High DPI monitor, resulting in lower logical DPI.
|
||||
- return qRound(logicalDpi().first / 96);
|
||||
+ return qMax(1, qRound(logicalDpi().first / 96));
|
||||
}
|
||||
|
||||
/*!
|
||||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp.0295 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp 2017-02-13 12:58:54.063341117 -0600
|
||||
@@ -641,7 +641,7 @@ QDpi QWinRTScreen::logicalDpi() const
|
||||
qreal QWinRTScreen::pixelDensity() const
|
||||
{
|
||||
Q_D(const QWinRTScreen);
|
||||
- return qRound(d->logicalDpi / 96);
|
||||
+ return qMax(1, qRound(d->logicalDpi / 96));
|
||||
}
|
||||
|
||||
qreal QWinRTScreen::scaleFactor() const
|
||||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp.0295 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp 2017-02-13 12:58:54.063341117 -0600
|
||||
@@ -565,7 +565,7 @@ void QXcbScreen::updateGeometry(const QR
|
||||
m_sizeMillimeters = sizeInMillimeters(xGeometry.size(), virtualDpi());
|
||||
|
||||
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
|
||||
- m_pixelDensity = qRound(dpi/96);
|
||||
+ m_pixelDensity = qMax(1, qRound(dpi/96));
|
||||
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
|
||||
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
|
@ -1,146 +0,0 @@
|
||||
From f432c08882ffebe5074ea28de871559a98a4d094 Mon Sep 17 00:00:00 2001
|
||||
From: Lars Knoll <lars.knoll@qt.io>
|
||||
Date: Wed, 26 Feb 2020 10:42:10 +0100
|
||||
Subject: Add an expansion limit for entities
|
||||
|
||||
Recursively defined entities can easily exhaust all available
|
||||
memory. Limit entity expansion to a default of 4096 characters to
|
||||
avoid DoS attacks when a user loads untrusted content.
|
||||
|
||||
[ChangeLog][QtCore][QXmlStream] QXmlStreamReader does now
|
||||
limit the expansion of entities to 4096 characters. Documents where
|
||||
a single entity expands to more characters than the limit are not
|
||||
considered well formed. The limit is there to avoid DoS attacks through
|
||||
recursively expanding entities when loading untrusted content. Qt 5.15
|
||||
will add methods that allow changing that limit.
|
||||
|
||||
Fixes: QTBUG-47417
|
||||
Change-Id: I94387815d74fcf34783e136387ee57fac5ded0c9
|
||||
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
|
||||
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
|
||||
(cherry picked from commit fd4be84d23a0db4186cb42e736a9de3af722c7f7)
|
||||
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
|
||||
---
|
||||
src/corelib/serialization/qxmlstream.g | 14 ++++++++++++-
|
||||
src/corelib/serialization/qxmlstream_p.h | 14 ++++++++++++-
|
||||
.../serialization/qxmlstream/tst_qxmlstream.cpp | 23 ++++++++++++++++++++--
|
||||
3 files changed, 47 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/serialization/qxmlstream.g b/src/corelib/serialization/qxmlstream.g
|
||||
index 10bfcd491c..5726bafb26 100644
|
||||
--- a/src/corelib/serialization/qxmlstream.g
|
||||
+++ b/src/corelib/serialization/qxmlstream.g
|
||||
@@ -277,9 +277,19 @@ public:
|
||||
QHash<QStringView, Entity> entityHash;
|
||||
QHash<QStringView, Entity> parameterEntityHash;
|
||||
QXmlStreamSimpleStack<Entity *>entityReferenceStack;
|
||||
+ int entityExpansionLimit = 4096;
|
||||
+ int entityLength = 0;
|
||||
inline bool referenceEntity(Entity &entity) {
|
||||
if (entity.isCurrentlyReferenced) {
|
||||
- raiseWellFormedError(QXmlStream::tr("Recursive entity detected."));
|
||||
+ raiseWellFormedError(QXmlStream::tr("Self-referencing entity detected."));
|
||||
+ return false;
|
||||
+ }
|
||||
+ // entityLength represents the amount of additional characters the
|
||||
+ // entity expands into (can be negative for e.g. &). It's used to
|
||||
+ // avoid DoS attacks through recursive entity expansions
|
||||
+ entityLength += entity.value.size() - entity.name.size() - 2;
|
||||
+ if (entityLength > entityExpansionLimit) {
|
||||
+ raiseWellFormedError(QXmlStream::tr("Entity expands to more characters than the entity expansion limit."));
|
||||
return false;
|
||||
}
|
||||
entity.isCurrentlyReferenced = true;
|
||||
@@ -830,6 +840,8 @@ entity_done ::= ENTITY_DONE;
|
||||
/.
|
||||
case $rule_number:
|
||||
entityReferenceStack.pop()->isCurrentlyReferenced = false;
|
||||
+ if (entityReferenceStack.isEmpty())
|
||||
+ entityLength = 0;
|
||||
clearSym();
|
||||
break;
|
||||
./
|
||||
diff --git a/src/corelib/serialization/qxmlstream_p.h b/src/corelib/serialization/qxmlstream_p.h
|
||||
index 61f501f81b..31053f8e0b 100644
|
||||
--- a/src/corelib/serialization/qxmlstream_p.h
|
||||
+++ b/src/corelib/serialization/qxmlstream_p.h
|
||||
@@ -774,9 +774,19 @@ public:
|
||||
QHash<QStringView, Entity> entityHash;
|
||||
QHash<QStringView, Entity> parameterEntityHash;
|
||||
QXmlStreamSimpleStack<Entity *>entityReferenceStack;
|
||||
+ int entityExpansionLimit = 4096;
|
||||
+ int entityLength = 0;
|
||||
inline bool referenceEntity(Entity &entity) {
|
||||
if (entity.isCurrentlyReferenced) {
|
||||
- raiseWellFormedError(QXmlStream::tr("Recursive entity detected."));
|
||||
+ raiseWellFormedError(QXmlStream::tr("Self-referencing entity detected."));
|
||||
+ return false;
|
||||
+ }
|
||||
+ // entityLength represents the amount of additional characters the
|
||||
+ // entity expands into (can be negative for e.g. &). It's used to
|
||||
+ // avoid DoS attacks through recursive entity expansions
|
||||
+ entityLength += entity.value.size() - entity.name.size() - 2;
|
||||
+ if (entityLength > entityExpansionLimit) {
|
||||
+ raiseWellFormedError(QXmlStream::tr("Entity expands to more characters than the entity expansion limit."));
|
||||
return false;
|
||||
}
|
||||
entity.isCurrentlyReferenced = true;
|
||||
@@ -1308,6 +1318,8 @@ bool QXmlStreamReaderPrivate::parse()
|
||||
|
||||
case 10:
|
||||
entityReferenceStack.pop()->isCurrentlyReferenced = false;
|
||||
+ if (entityReferenceStack.isEmpty())
|
||||
+ entityLength = 0;
|
||||
clearSym();
|
||||
break;
|
||||
|
||||
diff --git a/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp
|
||||
index 8fdf91b090..1f9a0d575d 100644
|
||||
--- a/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp
|
||||
+++ b/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp
|
||||
@@ -393,8 +393,6 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
- QXmlStreamReader reader(&inputFile);
|
||||
-
|
||||
/* See testcases.dtd which reads: 'Nonvalidating parsers
|
||||
* must also accept "invalid" testcases, but validating ones must reject them.' */
|
||||
if(type == QLatin1String("invalid") || type == QLatin1String("valid"))
|
||||
@@ -580,6 +578,8 @@ private slots:
|
||||
void roundTrip() const;
|
||||
void roundTrip_data() const;
|
||||
|
||||
+ void entityExpansionLimit() const;
|
||||
+
|
||||
private:
|
||||
static QByteArray readFile(const QString &filename);
|
||||
|
||||
@@ -1756,6 +1756,25 @@ void tst_QXmlStream::roundTrip_data() const
|
||||
"</root>\n";
|
||||
}
|
||||
|
||||
+void tst_QXmlStream::entityExpansionLimit() const
|
||||
+{
|
||||
+ QString xml = QStringLiteral("<?xml version=\"1.0\"?>"
|
||||
+ "<!DOCTYPE foo ["
|
||||
+ "<!ENTITY a \"0123456789\" >"
|
||||
+ "<!ENTITY b \"&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;\" >"
|
||||
+ "<!ENTITY c \"&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;\" >"
|
||||
+ "<!ENTITY d \"&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;\" >"
|
||||
+ "]>"
|
||||
+ "<foo>&d;&d;&d;</foo>");
|
||||
+ {
|
||||
+ QXmlStreamReader reader(xml);
|
||||
+ do {
|
||||
+ reader.readNext();
|
||||
+ } while (!reader.atEnd());
|
||||
+ QCOMPARE(reader.error(), QXmlStreamReader::NotWellFormedError);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void tst_QXmlStream::roundTrip() const
|
||||
{
|
||||
QFETCH(QString, in);
|
||||
--
|
||||
cgit v0.2.1
|
@ -1,13 +1,12 @@
|
||||
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
|
||||
index e7e6ee1..ff2a939 100644
|
||||
--- a/mkspecs/common/gcc-base.conf
|
||||
+++ b/mkspecs/common/gcc-base.conf
|
||||
diff -up qtbase-opensource-src-5.6.0/mkspecs/common/gcc-base.conf.than qtbase-opensource-src-5.6.0/mkspecs/common/gcc-base.conf
|
||||
--- qtbase-opensource-src-5.6.0/mkspecs/common/gcc-base.conf.than 2016-06-02 17:30:07.249027901 +0200
|
||||
+++ qtbase-opensource-src-5.6.0/mkspecs/common/gcc-base.conf 2016-06-02 17:30:14.681748012 +0200
|
||||
@@ -32,7 +32,7 @@
|
||||
#
|
||||
|
||||
QMAKE_CFLAGS_OPTIMIZE = -O2
|
||||
-QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
|
||||
+QMAKE_CFLAGS_OPTIMIZE_FULL = -O2
|
||||
QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Og
|
||||
QMAKE_CFLAGS_OPTIMIZE_SIZE = -Os
|
||||
|
||||
QMAKE_CFLAGS += -pipe
|
||||
QMAKE_CFLAGS_DEPS += -M
|
||||
|
1005
qt5-qtbase.spec
1005
qt5-qtbase.spec
File diff suppressed because it is too large
Load Diff
@ -1,9 +0,0 @@
|
||||
diff -up qtbase-everywhere-src-5.11.1/mkspecs/features/uikit/devices.py.me qtbase-everywhere-src-5.11.1/mkspecs/features/uikit/devices.py
|
||||
--- qtbase-everywhere-src-5.11.1/mkspecs/features/uikit/devices.py.me 2018-06-23 11:29:21.750066271 +0200
|
||||
+++ qtbase-everywhere-src-5.11.1/mkspecs/features/uikit/devices.py 2018-06-23 11:30:07.457292033 +0200
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/python
|
||||
+#!/usr/bin/python3
|
||||
|
||||
#############################################################################
|
||||
##
|
@ -1,14 +0,0 @@
|
||||
diff -up qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in.foo qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in
|
||||
--- qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in.foo 2019-04-30 15:18:24.886346423 -0500
|
||||
+++ qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in 2019-04-30 15:19:48.303873296 -0500
|
||||
@@ -66,8 +66,10 @@ unset(_GL_INCDIRS)
|
||||
# Don\'t check for existence of the "_qt5gui_OPENGL_INCLUDE_DIR" because it is
|
||||
# optional.
|
||||
|
||||
+if (NOT ${_qt5gui_OPENGL_INCLUDE_DIR} STREQUAL "/usr/include")
|
||||
list(APPEND Qt5Gui_INCLUDE_DIRS ${_qt5gui_OPENGL_INCLUDE_DIR})
|
||||
set_property(TARGET Qt5::Gui APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${_qt5gui_OPENGL_INCLUDE_DIR})
|
||||
+endif()
|
||||
|
||||
unset(_qt5gui_OPENGL_INCLUDE_DIR CACHE)
|
||||
|
@ -1,16 +0,0 @@
|
||||
diff -up qtbase-everywhere-src-5.14.2/src/corelib/global/qlibraryinfo.cpp.no_relocatable qtbase-everywhere-src-5.14.2/src/corelib/global/qlibraryinfo.cpp
|
||||
--- qtbase-everywhere-src-5.14.2/src/corelib/global/qlibraryinfo.cpp.no_relocatable 2020-03-27 04:49:31.000000000 -0500
|
||||
+++ qtbase-everywhere-src-5.14.2/src/corelib/global/qlibraryinfo.cpp 2020-04-13 15:13:44.075705226 -0500
|
||||
@@ -671,8 +671,11 @@ static QString getPrefix(
|
||||
# if QT_CONFIGURE_CROSSBUILD
|
||||
if (group == QLibraryInfo::DevicePaths)
|
||||
return QString::fromLocal8Bit(QT_CONFIGURE_PREFIX_PATH);
|
||||
-# endif
|
||||
+# elif 0 //QT_CONFIG(relocatable)
|
||||
return getExtPrefixFromHostBinDir();
|
||||
+# else
|
||||
+ return QString::fromLocal8Bit(QT_CONFIGURE_PREFIX_PATH);
|
||||
+# endif
|
||||
#elif QT_CONFIG(relocatable)
|
||||
return getRelocatablePrefix();
|
||||
#else
|
@ -1,12 +1,12 @@
|
||||
diff -up qtbase-everywhere-src-5.12.1/src/plugins/platforms/xcb/qxcbscreen.cpp.hidpi_scale_at_192 qtbase-everywhere-src-5.12.1/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
--- qtbase-everywhere-src-5.12.1/src/plugins/platforms/xcb/qxcbscreen.cpp.hidpi_scale_at_192 2019-02-03 13:21:27.866906481 -0600
|
||||
+++ qtbase-everywhere-src-5.12.1/src/plugins/platforms/xcb/qxcbscreen.cpp 2019-02-03 13:23:47.554767565 -0600
|
||||
@@ -744,7 +744,7 @@ void QXcbScreen::updateGeometry(const QR
|
||||
// Use 128 as a reference DPI on small screens. This favors "small UI" over "large UI".
|
||||
qreal referenceDpi = physicalSize().width() <= 320 ? 128 : 96;
|
||||
diff -up qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp.hidpi_scale_at_192 qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
--- qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp.hidpi_scale_at_192 2017-02-09 07:47:26.060096259 -0600
|
||||
+++ qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp 2017-02-09 07:48:11.497567447 -0600
|
||||
@@ -633,7 +633,7 @@ void QXcbScreen::updateGeometry(const QR
|
||||
m_sizeMillimeters = sizeInMillimeters(xGeometry.size(), virtualDpi());
|
||||
|
||||
- m_pixelDensity = qMax(1, qRound(dpi/referenceDpi));
|
||||
+ m_pixelDensity = qMax(1, (int) (dpi/referenceDpi)); //instead of rounding at 1.5, round at 2.0 (same as GNOME)
|
||||
m_geometry = geometry;
|
||||
m_availableGeometry = geometry & m_virtualDesktop->workArea();
|
||||
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
|
||||
- m_pixelDensity = qMax(1, qRound(dpi/96));
|
||||
+ m_pixelDensity = qMax(1, (int) (dpi/96)); // instead of rounding at 1.5, round at 2.0 (same as GNOME)
|
||||
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
|
||||
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
|
||||
|
14
qtbase-opensource-src-5.6.0-moc_WORDSIZE.patch
Normal file
14
qtbase-opensource-src-5.6.0-moc_WORDSIZE.patch
Normal file
@ -0,0 +1,14 @@
|
||||
diff -up qtbase-opensource-src-5.6.0-beta/src/tools/moc/main.cpp.moc_WORDSIZE qtbase-opensource-src-5.6.0-beta/src/tools/moc/main.cpp
|
||||
--- qtbase-opensource-src-5.6.0-beta/src/tools/moc/main.cpp.moc_WORDSIZE 2015-12-04 18:05:24.000000000 -0600
|
||||
+++ qtbase-opensource-src-5.6.0-beta/src/tools/moc/main.cpp 2015-12-15 20:57:55.554485416 -0600
|
||||
@@ -184,6 +184,10 @@ int runMoc(int argc, char **argv)
|
||||
Moc moc;
|
||||
pp.macros["Q_MOC_RUN"];
|
||||
pp.macros["__cplusplus"];
|
||||
+ Macro macro;
|
||||
+ macro.symbols = Preprocessor::tokenize(QByteArray::number(Q_PROCESSOR_WORDSIZE*8), 1, Preprocessor::TokenizeDefine);
|
||||
+ macro.symbols.removeLast(); // remove the EOF symbol
|
||||
+ pp.macros.insert("__WORDSIZE", macro);
|
||||
|
||||
// Don't stumble over GCC extensions
|
||||
Macro dummyVariadicFunctionMacro;
|
12
qtbase-opensource-src-5.6.2-QTBUG-35459.patch
Normal file
12
qtbase-opensource-src-5.6.2-QTBUG-35459.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -up qtbase-opensource-src-5.6.2/src/xml/sax/qxml_p.h.QTBUG-35459 qtbase-opensource-src-5.6.2/src/xml/sax/qxml_p.h
|
||||
--- qtbase-opensource-src-5.6.2/src/xml/sax/qxml_p.h.QTBUG-35459 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/xml/sax/qxml_p.h 2016-10-16 08:40:04.441725330 -0500
|
||||
@@ -217,7 +217,7 @@ private:
|
||||
// for the DTD currently being parsed.
|
||||
static const int dtdRecursionLimit = 2;
|
||||
// The maximum amount of characters an entity value may contain, after expansion.
|
||||
- static const int entityCharacterLimit = 1024;
|
||||
+ static const int entityCharacterLimit = 65536;
|
||||
|
||||
const QString &string();
|
||||
void stringClear();
|
13
qtbase-opensource-src-5.6.2-arm.patch
Normal file
13
qtbase-opensource-src-5.6.2-arm.patch
Normal file
@ -0,0 +1,13 @@
|
||||
diff -up qtbase-opensource-src-5.6.2/configure.arm qtbase-opensource-src-5.6.2/configure
|
||||
--- qtbase-opensource-src-5.6.2/configure.arm 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/configure 2016-10-16 08:41:20.583267295 -0500
|
||||
@@ -4373,6 +4373,9 @@ if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; th
|
||||
else
|
||||
# not cross compiling, host == target
|
||||
CFG_HOST_ARCH="$CFG_ARCH"
|
||||
+ if [ "$CFG_ARCH" = "arm" ] ; then
|
||||
+ CFG_CPUFEATURES="neon"
|
||||
+ fi
|
||||
CFG_HOST_CPUFEATURES="$CFG_CPUFEATURES"
|
||||
fi
|
||||
unset OUTFILE
|
325
qtbase-opensource-src-5.6.2-moc_system_defines.patch
Normal file
325
qtbase-opensource-src-5.6.2-moc_system_defines.patch
Normal file
@ -0,0 +1,325 @@
|
||||
diff -up qtbase-opensource-src-5.6.2/mkspecs/features/moc.prf.moc_system_defines qtbase-opensource-src-5.6.2/mkspecs/features/moc.prf
|
||||
--- qtbase-opensource-src-5.6.2/mkspecs/features/moc.prf.moc_system_defines 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/mkspecs/features/moc.prf 2016-10-16 08:42:20.561694271 -0500
|
||||
@@ -24,8 +24,25 @@ win32:count(MOC_INCLUDEPATH, 40, >) {
|
||||
write_file($$absolute_path($$WIN_INCLUDETEMP, $$OUT_PWD), WIN_INCLUDETEMP_CONT)|error("Aborting.")
|
||||
}
|
||||
|
||||
+# QNX's compiler sets "gcc" config, but does not support the -dM option;
|
||||
+# iOS builds are multi-arch, so this feature cannot possibly work.
|
||||
+if(gcc|intel_icl|msvc):!rim_qcc:!ios {
|
||||
+ moc_predefs.CONFIG = no_link
|
||||
+ gcc: moc_predefs.commands = $$QMAKE_CXX $$QMAKE_CXXFLAGS -dM -E -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
|
||||
+ else:intel_icl: moc_predefs.commands = $$QMAKE_CXX $$QMAKE_CXXFLAGS -QdM -P -Fi${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
|
||||
+ else:msvc {
|
||||
+ # make sure that our bin dir is first in path, so qmake is found
|
||||
+ moc_predefs.commands = PATH $$shell_path($$[QT_INSTALL_BINS/src]);%PATH%&
|
||||
+ moc_predefs.commands += $$QMAKE_CXX -Bxqmake $$QMAKE_CXXFLAGS -E ${QMAKE_FILE_IN} 2>NUL >${QMAKE_FILE_OUT}
|
||||
+ } else: error("Oops, I messed up")
|
||||
+ moc_predefs.output = $$MOC_DIR/moc_predefs.h
|
||||
+ moc_predefs.input = MOC_PREDEF_FILE
|
||||
+ silent: moc_predefs.commands = @echo generating $$moc_predefs.output$$escape_expand(\n\t)@$$moc_predefs.commands
|
||||
+ QMAKE_EXTRA_COMPILERS += moc_predefs
|
||||
+ MOC_PREDEF_FILE = $$[QT_HOST_DATA/src]/mkspecs/features/data/dummy.cpp
|
||||
+}
|
||||
+
|
||||
defineReplace(mocCmdBase) {
|
||||
- RET =
|
||||
!isEmpty(WIN_INCLUDETEMP) {
|
||||
incvar = @$$WIN_INCLUDETEMP
|
||||
} else {
|
||||
@@ -34,7 +51,13 @@ defineReplace(mocCmdBase) {
|
||||
incvar += -I$$shell_quote($$inc)
|
||||
incvar += $$QMAKE_FRAMEWORKPATH_FLAGS
|
||||
}
|
||||
- RET += $$QMAKE_MOC $(DEFINES) $$join(QMAKE_COMPILER_DEFINES, " -D", -D) $$incvar $$QMAKE_MOC_OPTIONS
|
||||
+
|
||||
+ RET = $$QMAKE_MOC $(DEFINES)
|
||||
+
|
||||
+ isEmpty(MOC_PREDEF_FILE): RET += $$join(QMAKE_COMPILER_DEFINES, " -D", -D)
|
||||
+ else: RET += --include $$moc_predefs.output
|
||||
+
|
||||
+ RET += $$incvar $$QMAKE_MOC_OPTIONS
|
||||
return($$RET)
|
||||
}
|
||||
|
||||
@@ -46,7 +69,7 @@ moc_header.output = $$MOC_DIR/$${QMAKE_H
|
||||
moc_header.input = HEADERS
|
||||
moc_header.variable_out = SOURCES
|
||||
moc_header.name = MOC ${QMAKE_FILE_IN}
|
||||
-moc_header.depends += $$WIN_INCLUDETEMP
|
||||
+moc_header.depends += $$WIN_INCLUDETEMP $$moc_predefs.output
|
||||
silent:moc_header.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_header.commands
|
||||
QMAKE_EXTRA_COMPILERS += moc_header
|
||||
INCREDIBUILD_XGE += moc_header
|
||||
@@ -58,7 +81,7 @@ moc_source.commands = ${QMAKE_FUNC_mocCm
|
||||
moc_source.output = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC}
|
||||
moc_source.input = SOURCES OBJECTIVE_SOURCES
|
||||
moc_source.name = MOC ${QMAKE_FILE_IN}
|
||||
-moc_source.depends += $$WIN_INCLUDETEMP
|
||||
+moc_source.depends += $$WIN_INCLUDETEMP $$moc_predefs.output
|
||||
silent:moc_source.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_source.commands
|
||||
QMAKE_EXTRA_COMPILERS += moc_source
|
||||
INCREDIBUILD_XGE += moc_source
|
||||
diff -up qtbase-opensource-src-5.6.2/qmake/main.cpp.moc_system_defines qtbase-opensource-src-5.6.2/qmake/main.cpp
|
||||
--- qtbase-opensource-src-5.6.2/qmake/main.cpp.moc_system_defines 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/qmake/main.cpp 2016-10-16 08:42:20.561694271 -0500
|
||||
@@ -1,6 +1,7 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2015 The Qt Company Ltd.
|
||||
+** Copyright (C) 2015 Intel Corporation.
|
||||
** Contact: http://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the qmake application of the Qt Toolkit.
|
||||
@@ -47,6 +48,10 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
+#ifdef Q_OS_WIN
|
||||
+# include <qt_windows.h>
|
||||
+#endif
|
||||
+
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
@@ -246,6 +251,30 @@ static int doInstall(int argc, char **ar
|
||||
return 3;
|
||||
}
|
||||
|
||||
+static int dumpMacros(const wchar_t *cmdline)
|
||||
+{
|
||||
+ // from http://stackoverflow.com/questions/3665537/how-to-find-out-cl-exes-built-in-macros
|
||||
+ int argc;
|
||||
+ wchar_t **argv = CommandLineToArgvW(cmdline, &argc);
|
||||
+ if (!argv)
|
||||
+ return 2;
|
||||
+ for (int i = 0; i < argc; ++i) {
|
||||
+ if (argv[i][0] != L'-' || argv[i][1] != 'D')
|
||||
+ continue;
|
||||
+
|
||||
+ wchar_t *value = wcschr(argv[i], L'=');
|
||||
+ if (value) {
|
||||
+ *value = 0;
|
||||
+ ++value;
|
||||
+ } else {
|
||||
+ // point to the NUL at the end, so we don't print anything
|
||||
+ value = argv[i] + wcslen(argv[i]);
|
||||
+ }
|
||||
+ wprintf(L"#define %Ls %Ls\n", argv[i] + 2, value);
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#endif // Q_OS_WIN
|
||||
|
||||
/* This is to work around lame implementation on Darwin. It has been noted that the getpwd(3) function
|
||||
@@ -280,6 +309,15 @@ int runQMake(int argc, char **argv)
|
||||
// Workaround for inferior/missing command line tools on Windows: make our own!
|
||||
if (argc >= 2 && !strcmp(argv[1], "-install"))
|
||||
return doInstall(argc - 2, argv + 2);
|
||||
+
|
||||
+ {
|
||||
+ // Support running as Visual C++'s compiler
|
||||
+ const wchar_t *cmdline = _wgetenv(L"MSC_CMD_FLAGS");
|
||||
+ if (!cmdline || !*cmdline)
|
||||
+ cmdline = _wgetenv(L"MSC_IDE_FLAGS");
|
||||
+ if (cmdline && *cmdline)
|
||||
+ return dumpMacros(cmdline);
|
||||
+ }
|
||||
#endif
|
||||
|
||||
QMakeVfs vfs;
|
||||
diff -up qtbase-opensource-src-5.6.2/src/tools/moc/main.cpp.moc_system_defines qtbase-opensource-src-5.6.2/src/tools/moc/main.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/tools/moc/main.cpp.moc_system_defines 2016-10-16 08:42:20.558694249 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/tools/moc/main.cpp 2016-10-16 08:42:20.562694278 -0500
|
||||
@@ -263,6 +263,11 @@ int runMoc(int argc, char **argv)
|
||||
prependIncludeOption.setValueName(QStringLiteral("file"));
|
||||
parser.addOption(prependIncludeOption);
|
||||
|
||||
+ QCommandLineOption includeOption(QStringLiteral("include"));
|
||||
+ includeOption.setDescription(QStringLiteral("Parse <file> as an #include before the main source(s)."));
|
||||
+ includeOption.setValueName(QStringLiteral("file"));
|
||||
+ parser.addOption(includeOption);
|
||||
+
|
||||
QCommandLineOption noNotesWarningsCompatOption(QStringLiteral("n"));
|
||||
noNotesWarningsCompatOption.setDescription(QStringLiteral("Do not display notes (-nn) or warnings (-nw). Compatibility option."));
|
||||
noNotesWarningsCompatOption.setValueName(QStringLiteral("which"));
|
||||
@@ -412,7 +417,16 @@ int runMoc(int argc, char **argv)
|
||||
moc.includes = pp.includes;
|
||||
|
||||
// 1. preprocess
|
||||
- moc.symbols = pp.preprocessed(moc.filename, &in);
|
||||
+ foreach (const QString &includeName, parser.values(includeOption)) {
|
||||
+ QByteArray rawName = pp.resolveInclude(QFile::encodeName(includeName), moc.filename);
|
||||
+ QFile f(QFile::decodeName(rawName));
|
||||
+ if (f.open(QIODevice::ReadOnly)) {
|
||||
+ moc.symbols += Symbol(0, MOC_INCLUDE_BEGIN, rawName);
|
||||
+ moc.symbols += pp.preprocessed(rawName, &f);
|
||||
+ moc.symbols += Symbol(0, MOC_INCLUDE_END, rawName);
|
||||
+ }
|
||||
+ }
|
||||
+ moc.symbols += pp.preprocessed(moc.filename, &in);
|
||||
|
||||
if (!pp.preprocessOnly) {
|
||||
// 2. parse
|
||||
diff -up qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.cpp.moc_system_defines qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.cpp.moc_system_defines 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.cpp 2016-10-16 08:42:20.562694278 -0500
|
||||
@@ -1007,6 +1007,37 @@ static void mergeStringLiterals(Symbols
|
||||
}
|
||||
}
|
||||
|
||||
+QByteArray Preprocessor::resolveInclude(const QByteArray &include, const QByteArray &relativeTo)
|
||||
+{
|
||||
+ // #### stringery
|
||||
+ QFileInfo fi;
|
||||
+ if (!relativeTo.isEmpty())
|
||||
+ fi.setFile(QFileInfo(QString::fromLocal8Bit(relativeTo.constData())).dir(), QString::fromLocal8Bit(include.constData()));
|
||||
+ for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) {
|
||||
+ const IncludePath &p = Preprocessor::includes.at(j);
|
||||
+ if (p.isFrameworkPath) {
|
||||
+ const int slashPos = include.indexOf('/');
|
||||
+ if (slashPos == -1)
|
||||
+ continue;
|
||||
+ QByteArray frameworkCandidate = include.left(slashPos);
|
||||
+ frameworkCandidate.append(".framework/Headers/");
|
||||
+ fi.setFile(QString::fromLocal8Bit(QByteArray(p.path + '/' + frameworkCandidate).constData()), QString::fromLocal8Bit(include.mid(slashPos + 1).constData()));
|
||||
+ } else {
|
||||
+ fi.setFile(QString::fromLocal8Bit(p.path.constData()), QString::fromLocal8Bit(include.constData()));
|
||||
+ }
|
||||
+ // try again, maybe there's a file later in the include paths with the same name
|
||||
+ // (186067)
|
||||
+ if (fi.isDir()) {
|
||||
+ fi = QFileInfo();
|
||||
+ continue;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!fi.exists() || fi.isDir())
|
||||
+ return QByteArray();
|
||||
+ return fi.canonicalFilePath().toLocal8Bit();
|
||||
+}
|
||||
+
|
||||
void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
|
||||
{
|
||||
currentFilenames.push(filename);
|
||||
@@ -1027,33 +1058,9 @@ void Preprocessor::preprocess(const QByt
|
||||
continue;
|
||||
until(PP_NEWLINE);
|
||||
|
||||
- // #### stringery
|
||||
- QFileInfo fi;
|
||||
- if (local)
|
||||
- fi.setFile(QFileInfo(QString::fromLocal8Bit(filename.constData())).dir(), QString::fromLocal8Bit(include.constData()));
|
||||
- for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) {
|
||||
- const IncludePath &p = Preprocessor::includes.at(j);
|
||||
- if (p.isFrameworkPath) {
|
||||
- const int slashPos = include.indexOf('/');
|
||||
- if (slashPos == -1)
|
||||
- continue;
|
||||
- QByteArray frameworkCandidate = include.left(slashPos);
|
||||
- frameworkCandidate.append(".framework/Headers/");
|
||||
- fi.setFile(QString::fromLocal8Bit(QByteArray(p.path + '/' + frameworkCandidate).constData()), QString::fromLocal8Bit(include.mid(slashPos + 1).constData()));
|
||||
- } else {
|
||||
- fi.setFile(QString::fromLocal8Bit(p.path.constData()), QString::fromLocal8Bit(include.constData()));
|
||||
- }
|
||||
- // try again, maybe there's a file later in the include paths with the same name
|
||||
- // (186067)
|
||||
- if (fi.isDir()) {
|
||||
- fi = QFileInfo();
|
||||
- continue;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (!fi.exists() || fi.isDir())
|
||||
+ include = resolveInclude(include, local ? filename : QByteArray());
|
||||
+ if (include.isNull())
|
||||
continue;
|
||||
- include = fi.canonicalFilePath().toLocal8Bit();
|
||||
|
||||
if (Preprocessor::preprocessedIncludes.contains(include))
|
||||
continue;
|
||||
@@ -1208,6 +1215,7 @@ Symbols Preprocessor::preprocessed(const
|
||||
input = cleaned(input);
|
||||
|
||||
// phase 2: tokenize for the preprocessor
|
||||
+ index = 0;
|
||||
symbols = tokenize(input);
|
||||
|
||||
#if 0
|
||||
diff -up qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.h.moc_system_defines qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.h
|
||||
--- qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.h.moc_system_defines 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/tools/moc/preprocessor.h 2016-10-16 08:42:20.562694278 -0500
|
||||
@@ -67,6 +67,7 @@ public:
|
||||
QList<QByteArray> frameworks;
|
||||
QSet<QByteArray> preprocessedIncludes;
|
||||
Macros macros;
|
||||
+ QByteArray resolveInclude(const QByteArray &filename, const QByteArray &relativeTo);
|
||||
Symbols preprocessed(const QByteArray &filename, QFile *device);
|
||||
|
||||
void parseDefineArguments(Macro *m);
|
||||
diff -up qtbase-opensource-src-5.6.2/tests/auto/tools/moc/subdir/extradefines.h.moc_system_defines qtbase-opensource-src-5.6.2/tests/auto/tools/moc/subdir/extradefines.h
|
||||
--- qtbase-opensource-src-5.6.2/tests/auto/tools/moc/subdir/extradefines.h.moc_system_defines 2016-10-16 08:42:20.562694278 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/tests/auto/tools/moc/subdir/extradefines.h 2016-10-16 08:42:20.562694278 -0500
|
||||
@@ -0,0 +1 @@
|
||||
+#define FOO 1
|
||||
diff -up qtbase-opensource-src-5.6.2/tests/auto/tools/moc/tst_moc.cpp.moc_system_defines qtbase-opensource-src-5.6.2/tests/auto/tools/moc/tst_moc.cpp
|
||||
--- qtbase-opensource-src-5.6.2/tests/auto/tools/moc/tst_moc.cpp.moc_system_defines 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/tests/auto/tools/moc/tst_moc.cpp 2016-10-16 08:42:20.562694278 -0500
|
||||
@@ -581,6 +581,8 @@ private slots:
|
||||
void frameworkSearchPath();
|
||||
void cstyleEnums();
|
||||
void defineMacroViaCmdline();
|
||||
+ void defineMacroViaForcedInclude();
|
||||
+ void defineMacroViaForcedIncludeRelative();
|
||||
void specifyMetaTagsFromCmdline();
|
||||
void invokable();
|
||||
void singleFunctionKeywordSignalAndSlot();
|
||||
@@ -1248,6 +1250,46 @@ void tst_Moc::defineMacroViaCmdline()
|
||||
args << m_sourceDirectory + QStringLiteral("/macro-on-cmdline.h");
|
||||
|
||||
proc.start(m_moc, args);
|
||||
+ QVERIFY(proc.waitForFinished());
|
||||
+ QCOMPARE(proc.exitCode(), 0);
|
||||
+ QCOMPARE(proc.readAllStandardError(), QByteArray());
|
||||
+ QByteArray mocOut = proc.readAllStandardOutput();
|
||||
+ QVERIFY(!mocOut.isEmpty());
|
||||
+#else
|
||||
+ QSKIP("Only tested on linux/gcc");
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+void tst_Moc::defineMacroViaForcedInclude()
|
||||
+{
|
||||
+#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(QT_NO_PROCESS)
|
||||
+ QProcess proc;
|
||||
+
|
||||
+ QStringList args;
|
||||
+ args << "--include" << m_sourceDirectory + QLatin1String("/subdir/extradefines.h");
|
||||
+ args << m_sourceDirectory + QStringLiteral("/macro-on-cmdline.h");
|
||||
+
|
||||
+ proc.start(m_moc, args);
|
||||
+ QVERIFY(proc.waitForFinished());
|
||||
+ QCOMPARE(proc.exitCode(), 0);
|
||||
+ QCOMPARE(proc.readAllStandardError(), QByteArray());
|
||||
+ QByteArray mocOut = proc.readAllStandardOutput();
|
||||
+ QVERIFY(!mocOut.isEmpty());
|
||||
+#else
|
||||
+ QSKIP("Only tested on linux/gcc");
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+void tst_Moc::defineMacroViaForcedIncludeRelative()
|
||||
+{
|
||||
+#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(QT_NO_PROCESS)
|
||||
+ QProcess proc;
|
||||
+
|
||||
+ QStringList args;
|
||||
+ args << "--include" << QStringLiteral("extradefines.h") << "-I" + m_sourceDirectory + "/subdir";
|
||||
+ args << m_sourceDirectory + QStringLiteral("/macro-on-cmdline.h");
|
||||
+
|
||||
+ proc.start(m_moc, args);
|
||||
QVERIFY(proc.waitForFinished());
|
||||
QCOMPARE(proc.exitCode(), 0);
|
||||
QCOMPARE(proc.readAllStandardError(), QByteArray());
|
@ -1,15 +0,0 @@
|
||||
diff -up qtbase-opensource-src-5.7.1/src/tools/moc/main.cpp.moc_WORDSIZE qtbase-opensource-src-5.7.1/src/tools/moc/main.cpp
|
||||
--- qtbase-opensource-src-5.7.1/src/tools/moc/main.cpp.moc_WORDSIZE 2016-12-01 02:17:04.000000000 -0600
|
||||
+++ qtbase-opensource-src-5.7.1/src/tools/moc/main.cpp 2016-12-08 12:37:28.931589338 -0600
|
||||
@@ -179,6 +179,11 @@ int runMoc(int argc, char **argv)
|
||||
Moc moc;
|
||||
pp.macros["Q_MOC_RUN"];
|
||||
pp.macros["__cplusplus"];
|
||||
+ pp.macros["_SYS_SYSMACROS_H_OUTER"];
|
||||
+ Macro macro;
|
||||
+ macro.symbols = Preprocessor::tokenize(QByteArray::number(Q_PROCESSOR_WORDSIZE*8), 1, Preprocessor::TokenizeDefine);
|
||||
+ macro.symbols.removeLast(); // remove the EOF symbol
|
||||
+ pp.macros.insert("__WORDSIZE", macro);
|
||||
|
||||
// Don't stumble over GCC extensions
|
||||
Macro dummyVariadicFunctionMacro;
|
@ -1,11 +0,0 @@
|
||||
--- qtbase-opensource-src-5.8.0/src/corelib/global/qglobal.h.orig 2017-01-26 10:45:40.905010896 +0100
|
||||
+++ qtbase-opensource-src-5.8.0/src/corelib/global/qglobal.h 2017-01-26 10:46:50.299858887 +0100
|
||||
@@ -55,7 +55,7 @@
|
||||
/*
|
||||
can be used like #if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
|
||||
*/
|
||||
-#define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
|
||||
+#define QT_VERSION_CHECK(qt_version_check_major, qt_version_check_minor, qt_version_check_patch) ((qt_version_check_major<<16)|(qt_version_check_minor<<8)|(qt_version_check_patch))
|
||||
|
||||
#ifdef QT_BOOTSTRAPPED
|
||||
#include <QtCore/qconfig-bootstrapped.h>
|
@ -1,12 +0,0 @@
|
||||
diff -up qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql.cpp.than qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
|
||||
diff -up qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h.than qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h
|
||||
--- qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h.than 2017-07-14 13:43:50.831203768 +0200
|
||||
+++ qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h 2017-07-14 13:44:24.364948006 +0200
|
||||
@@ -58,6 +58,7 @@
|
||||
#endif
|
||||
|
||||
#include <mysql.h>
|
||||
+#include <mysql_version.h>
|
||||
|
||||
#ifdef QT_PLUGIN
|
||||
#define Q_EXPORT_SQLDRIVER_MYSQL
|
@ -1,12 +0,0 @@
|
||||
diff -up qtbase-everywhere-src-5.10.1/qmake/Makefile.unix.qmake_LFLAGS qtbase-everywhere-src-5.10.1/qmake/Makefile.unix
|
||||
--- qtbase-everywhere-src-5.10.1/qmake/Makefile.unix.qmake_LFLAGS 2018-02-08 12:24:48.000000000 -0600
|
||||
+++ qtbase-everywhere-src-5.10.1/qmake/Makefile.unix 2018-02-15 10:25:07.077763061 -0600
|
||||
@@ -142,7 +142,7 @@ CPPFLAGS = -g $(EXTRA_CPPFLAGS) \
|
||||
-DQT_NO_FOREACH
|
||||
|
||||
CXXFLAGS = $(EXTRA_CXXFLAGS) $(CONFIG_CXXFLAGS) $(CPPFLAGS)
|
||||
-LFLAGS = $(EXTRA_LFLAGS) $(CONFIG_LFLAGS)
|
||||
+LFLAGS = $(EXTRA_LFLAGS) $(CONFIG_LFLAGS) $(QMAKE_LFLAGS_RELEASE)
|
||||
|
||||
first all: $(BUILD_PATH)/bin/qmake$(EXEEXT)
|
||||
qmake: $(BUILD_PATH)/bin/qmake$(EXEEXT)
|
@ -1,20 +0,0 @@
|
||||
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
|
||||
index b8bfad4f16..676fdfad5e 100644
|
||||
--- a/src/gui/kernel/qguiapplication.cpp
|
||||
+++ b/src/gui/kernel/qguiapplication.cpp
|
||||
@@ -1376,14 +1376,7 @@ void QGuiApplicationPrivate::createPlatformIntegration()
|
||||
if (sessionType == QByteArrayLiteral("x11") && !platformName.contains(QByteArrayLiteral("xcb"))) {
|
||||
platformName = QByteArrayLiteral("xcb");
|
||||
} else if (sessionType == QByteArrayLiteral("wayland") && !platformName.contains(QByteArrayLiteral("wayland"))) {
|
||||
- QByteArray currentDesktop = qgetenv("XDG_CURRENT_DESKTOP").toLower();
|
||||
- QByteArray sessionDesktop = qgetenv("XDG_SESSION_DESKTOP").toLower();
|
||||
- if (currentDesktop.contains("gnome") || sessionDesktop.contains("gnome")) {
|
||||
- qInfo() << "Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome."
|
||||
- << "Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.";
|
||||
- } else {
|
||||
- platformName = QByteArrayLiteral("wayland");
|
||||
- }
|
||||
+ platformName = QByteArrayLiteral("wayland");
|
||||
}
|
||||
}
|
||||
#ifdef QT_QPA_DEFAULT_PLATFORM_NAME
|
@ -1,3 +1,2 @@
|
||||
[Rules]
|
||||
*.debug=false
|
||||
qt.qpa.xcb.xcberror.warning=false
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (qtbase-everywhere-src-5.14.2.tar.xz) = 8c83e06d58b56e9f288e83d6c3dd4ad6cc9f1eb1a32c7b44fb912fda34ed7255766fd9fa60cd740ee001df7d6172f25df05f1f95e986c3e793fbcd9bf4f18de9
|
||||
5672bf62a89061a6edb425b7796e4eca qtbase-opensource-src-5.6.2.tar.xz
|
||||
|
@ -1 +0,0 @@
|
||||
qtbase-everywhere-src
|
@ -1,16 +0,0 @@
|
||||
diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf
|
||||
index e6a0d97..cf93041 100644
|
||||
--- a/mkspecs/features/qt_module.prf
|
||||
+++ b/mkspecs/features/qt_module.prf
|
||||
@@ -216,9 +216,9 @@ android: CONFIG += qt_android_deps no_linker_version_script
|
||||
QMAKE_LFLAGS += $${QMAKE_LFLAGS_VERSION_SCRIPT}$$verscript
|
||||
|
||||
internal_module {
|
||||
- verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API { *; };"
|
||||
+ verscript_content = "Qt_$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION}_PRIVATE_API { *; };"
|
||||
} else {
|
||||
- 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*;"
|
||||
|
||||
private_api_headers = $$SYNCQT.PRIVATE_HEADER_FILES $$SYNCQT.QPA_HEADER_FILES
|
Loading…
Reference in New Issue
Block a user