From 50b9d8a931e859c027726a74ea0616e7b292e782 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 18 Oct 2016 19:12:55 +0200 Subject: [PATCH 001/174] Windows: Fix regression in QFSFileEnginePrivate::nativeWrite() Change 0696566b1e19c8178e00c0d14f185935e17d9e8b caused the block size to be incorrect for data > 32MB. Since bytesToWrite changes within the do...while loop, then the block size can potentially change too each time. So it needs to be recalculated each time rather than just once. Task-number: QTBUG-56616 Change-Id: I9880d0985f2d0242c30e67230be7271eb806db95 Reviewed-by: Oliver Wolff Reviewed-by: Friedemann Kleint (cherry picked from commit 683c9bc4a8e656b2251871b9d8c9952e58681a52) --- src/corelib/io/qfsfileengine_win.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index af026b8976..3251c481dd 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -433,11 +433,11 @@ qint64 QFSFileEnginePrivate::nativeWrite(const char *data, qint64 len) // Writing on Windows fails with ERROR_NO_SYSTEM_RESOURCES when // the chunks are too large, so we limit the block size to 32MB. - const DWORD blockSize = DWORD(qMin(bytesToWrite, qint64(32 * 1024 * 1024))); qint64 totalWritten = 0; do { + const DWORD currentBlockSize = DWORD(qMin(bytesToWrite, qint64(32 * 1024 * 1024))); DWORD bytesWritten; - if (!WriteFile(fileHandle, data + totalWritten, blockSize, &bytesWritten, NULL)) { + if (!WriteFile(fileHandle, data + totalWritten, currentBlockSize, &bytesWritten, NULL)) { if (totalWritten == 0) { // Note: Only return error if the first WriteFile failed. q->setError(QFile::WriteError, qt_error_string()); From ab0ba668642d2d4c941f57e949118327530234af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 3 Oct 2016 18:41:30 +0200 Subject: [PATCH 002/174] Apple OS: Handle QSetting strings with embedded zero-bytes Saving strings with embedded zero-bytes (\0) as CFStrings would sometimes fail, and only write the part of the string leading up to the first zero-byte, instead of all the way to the final zero-terminator. This bug was revealed by the code-path that falls back to storing e.g. QTime as strings, via the helper method QSettingsPrivate::variantToString(). We now use the same approach as on platforms such as Windows and WinRT, where the string produced by variantToString() is checked for null-bytes, and if so, stored using a binary representation instead of as a string. For our case that means we fall back to CFData when detecting the null-byte. To separate strings from regular byte arrays, new logic has been added to variantToString() that wraps the null-byte strings in @String(). That way we can implement a fast-path when converting back from CFData, that doesn't go via the slow and lossy conversion via UTF8, and the resulting QVariant will be of type QVariant::ByteArray. The reason for using UTF-8 as the binary representation of the string is that in the case of storing a QByteArray("@foo") we need to still be able to convert it back to the same byte array, which doesn't work if the on-disk format is UTF-16. Task-number: QTBUG-56124 Change-Id: Iab2f71cf96cf3225de48dc5e71870d74b6dde1e8 Cherry-picked: 764f5bf48cc87f4c72550b853ab93b815454cd48 Reviewed-by: Thiago Macieira Reviewed-by: Jani Heikkinen --- src/corelib/io/qsettings.cpp | 6 ++- src/corelib/io/qsettings_mac.cpp | 20 +++++++- src/corelib/io/qsettings_win.cpp | 13 +---- src/corelib/io/qsettings_winrt.cpp | 4 +- .../corelib/io/qsettings/tst_qsettings.cpp | 50 ++++++++++++++++++- 5 files changed, 76 insertions(+), 17 deletions(-) diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index 8bdd148e28..05f6c22fc2 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -417,7 +417,9 @@ QString QSettingsPrivate::variantToString(const QVariant &v) case QVariant::Double: case QVariant::KeySequence: { result = v.toString(); - if (result.startsWith(QLatin1Char('@'))) + if (result.contains(QChar::Null)) + result = QLatin1String("@String(") + result + QLatin1Char(')'); + else if (result.startsWith(QLatin1Char('@'))) result.prepend(QLatin1Char('@')); break; } @@ -477,6 +479,8 @@ QVariant QSettingsPrivate::stringToVariant(const QString &s) if (s.endsWith(QLatin1Char(')'))) { if (s.startsWith(QLatin1String("@ByteArray("))) { return QVariant(s.midRef(11, s.size() - 12).toLatin1()); + } else if (s.startsWith(QLatin1String("@String("))) { + return QVariant(s.midRef(8, s.size() - 9).toString()); } else if (s.startsWith(QLatin1String("@Variant(")) || s.startsWith(QLatin1String("@DateTime("))) { #ifndef QT_NO_DATASTREAM diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp index d73cc4d298..4282fcbe2c 100644 --- a/src/corelib/io/qsettings_mac.cpp +++ b/src/corelib/io/qsettings_mac.cpp @@ -214,7 +214,14 @@ static QCFType macValue(const QVariant &value) case QVariant::String: string_case: default: - result = QCFString::toCFStringRef(QSettingsPrivate::variantToString(value)); + QString string = QSettingsPrivate::variantToString(value); + if (string.contains(QChar::Null)) { + QByteArray ba = string.toUtf8(); + result = CFDataCreate(kCFAllocatorDefault, reinterpret_cast(ba.data()), + CFIndex(ba.size())); + } else { + result = QCFString::toCFStringRef(string); + } } return result; } @@ -267,8 +274,17 @@ static QVariant qtValue(CFPropertyListRef cfvalue) return (bool)CFBooleanGetValue(static_cast(cfvalue)); } else if (typeId == CFDataGetTypeID()) { CFDataRef cfdata = static_cast(cfvalue); - return QByteArray(reinterpret_cast(CFDataGetBytePtr(cfdata)), + QByteArray byteArray = QByteArray(reinterpret_cast(CFDataGetBytePtr(cfdata)), CFDataGetLength(cfdata)); + + // Fast-path for QByteArray, so that we don't have to go + // though the expensive and lossy conversion via UTF-8. + if (!byteArray.startsWith('@')) + return byteArray; + + const QString str = QString::fromUtf8(byteArray.constData(), byteArray.size()); + return QSettingsPrivate::stringToVariant(str); + } else if (typeId == CFDictionaryGetTypeID()) { CFDictionaryRef cfdict = static_cast(cfvalue); CFTypeID arrayTypeId = CFArrayGetTypeID(); diff --git a/src/corelib/io/qsettings_win.cpp b/src/corelib/io/qsettings_win.cpp index 05ed51e999..53e1ed360b 100644 --- a/src/corelib/io/qsettings_win.cpp +++ b/src/corelib/io/qsettings_win.cpp @@ -675,15 +675,6 @@ void QWinSettingsPrivate::remove(const QString &uKey) } } -static bool stringContainsNullChar(const QString &s) -{ - for (int i = 0; i < s.length(); ++i) { - if (s.at(i).unicode() == 0) - return true; - } - return false; -} - void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value) { if (writeHandle() == 0) { @@ -712,7 +703,7 @@ void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value) QStringList l = variantListToStringList(value.toList()); QStringList::const_iterator it = l.constBegin(); for (; it != l.constEnd(); ++it) { - if ((*it).length() == 0 || stringContainsNullChar(*it)) { + if ((*it).length() == 0 || it->contains(QChar::Null)) { type = REG_BINARY; break; } @@ -756,7 +747,7 @@ void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value) // If the string does not contain '\0', we can use REG_SZ, the native registry // string type. Otherwise we use REG_BINARY. QString s = variantToString(value); - type = stringContainsNullChar(s) ? REG_BINARY : REG_SZ; + type = s.contains(QChar::Null) ? REG_BINARY : REG_SZ; if (type == REG_BINARY) { regValueBuff = QByteArray((const char*)s.utf16(), s.length() * 2); } else { diff --git a/src/corelib/io/qsettings_winrt.cpp b/src/corelib/io/qsettings_winrt.cpp index 708287ce5e..209b56d920 100644 --- a/src/corelib/io/qsettings_winrt.cpp +++ b/src/corelib/io/qsettings_winrt.cpp @@ -402,7 +402,7 @@ void QWinRTSettingsPrivate::set(const QString &uKey, const QVariant &value) QStringList::const_iterator it = l.constBegin(); bool containsNull = false; for (; it != l.constEnd(); ++it) { - if ((*it).length() == 0 || it->indexOf(QChar::Null) != -1) { + if ((*it).length() == 0 || it->contains(QChar::Null)) { // We can only store as binary containsNull = true; break; @@ -445,7 +445,7 @@ void QWinRTSettingsPrivate::set(const QString &uKey, const QVariant &value) break; default: { const QString s = variantToString(value); - if (s.indexOf(QChar::Null) != -1) { + if (s.contains(QChar::Null)) { hr = valueStatics->CreateUInt8Array(s.length() * 2, (BYTE*) s.utf16(), &val); } else { HStringReference ref((const wchar_t*)s.utf16(), s.size()); diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp index 87a801c9dd..ed298bfafa 100644 --- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp +++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp @@ -158,6 +158,8 @@ private slots: void testByteArray(); void iniCodec(); void bom(); + void embeddedZeroByte_data(); + void embeddedZeroByte(); private: void cleanupTestFiles(); @@ -627,7 +629,6 @@ void tst_QSettings::testByteArray_data() #ifndef QT_NO_COMPRESS QTest::newRow("compressed") << qCompress(bytes); #endif - QTest::newRow("with \\0") << bytes + '\0' + bytes; } void tst_QSettings::testByteArray() @@ -678,6 +679,53 @@ void tst_QSettings::bom() QVERIFY(allkeys.contains("section2/foo2")); } +void tst_QSettings::embeddedZeroByte_data() +{ + QTest::addColumn("value"); + + QByteArray bytes("hello\0world", 11); + + QTest::newRow("bytearray\\0") << QVariant(bytes); + QTest::newRow("string\\0") << QVariant(QString::fromLatin1(bytes.data(), bytes.size())); + + bytes = QByteArray("@String("); + + QTest::newRow("@bytearray") << QVariant(bytes); + QTest::newRow("@string") << QVariant(QString(bytes)); + + bytes = QByteArray("@String(\0test", 13); + + QTest::newRow("@bytearray\\0") << QVariant(bytes); + QTest::newRow("@string\\0") << QVariant(QString::fromLatin1(bytes.data(), bytes.size())); +} + +void tst_QSettings::embeddedZeroByte() +{ + QFETCH(QVariant, value); + { + QSettings settings("QtProject", "tst_qsettings"); + settings.setValue(QTest::currentDataTag(), value); + } + { + QSettings settings("QtProject", "tst_qsettings"); + QVariant outValue = settings.value(QTest::currentDataTag()); + + switch (value.type()) { + case QVariant::ByteArray: + QCOMPARE(outValue.toByteArray(), value.toByteArray()); + break; + case QVariant::String: + QCOMPARE(outValue.toString(), value.toString()); + break; + default: + Q_UNREACHABLE(); + } + + if (value.toByteArray().contains(QChar::Null)) + QVERIFY(outValue.toByteArray().contains(QChar::Null)); + } +} + void tst_QSettings::testErrorHandling_data() { QTest::addColumn("filePerms"); // -1 means file should not exist From 65858057f0f76908e4734fd06e0cfaeb2ee233cd Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 10 Oct 2016 13:57:33 +0200 Subject: [PATCH 003/174] configure: Determine MSVC version by evaluating macro _MSC_FULL_VER The previously used regular expression failed for messages in local languages, particularly for the French message containing a non-breaking space. Task-number: QTBUG-56388 Change-Id: Ie757617f1b3a31820d0ed274c4b157d544ac1ea6 Reviewed-by: Oswald Buddenhagen (cherry picked from commit 1bd53131d83cdf595f95f82f0c049d2d68957159) --- tools/configure/environment.cpp | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp index 1a05c9ce62..8f18f3c489 100644 --- a/tools/configure/environment.cpp +++ b/tools/configure/environment.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -150,24 +151,23 @@ QString Environment::gccVersion() QString Environment::msvcVersion() { int returnValue = 0; - // Extract version from standard error output of "cl /?" - const QString command = QFile::decodeName(qgetenv("ComSpec")) - + QLatin1String(" /c ") + QLatin1String(compilerInfo(CC_MSVC2015)->executable) - + QLatin1String(" /? 2>&1"); - QString version = execute(command, &returnValue); - if (returnValue != 0) { - cout << "Could not get cl version" << returnValue << qPrintable(version) << '\n';; - version.clear(); - } else { - QRegExp versionRegexp(QStringLiteral("^.*Compiler Version ([0-9.]+) for.*$")); - Q_ASSERT(versionRegexp.isValid()); - if (versionRegexp.exactMatch(version)) { - version = versionRegexp.cap(1); - } else { - cout << "Unable to determine cl version from the output of \"" - << qPrintable(command) << "\"\n"; - } + QString tempSourceName; + { // QTemporaryFile needs to go out of scope, otherwise cl.exe refuses to open it. + QTemporaryFile tempSource(QDir::tempPath() + QLatin1String("/XXXXXX.cpp")); + tempSource.setAutoRemove(false); + if (!tempSource.open()) + return QString(); + tempSource.write("_MSC_FULL_VER\n"); + tempSourceName = tempSource.fileName(); } + QString version = execute(QLatin1String("cl /nologo /EP \"") + + QDir::toNativeSeparators(tempSourceName) + QLatin1Char('"'), + &returnValue).trimmed(); + QFile::remove(tempSourceName); + if (returnValue || version.size() < 9 || !version.at(0).isDigit()) + return QString(); + version.insert(4, QLatin1Char('.')); + version.insert(2, QLatin1Char('.')); return version; } From 3f347262da369b0a4adae89750f9fe0247fcd486 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 25 Oct 2016 12:12:09 -0700 Subject: [PATCH 004/174] Add changes file for 5.7.1 Change-Id: I96f1a5d4d7b559f7c5d3aba3c45eb77744b35cb5 Reviewed-by: Lars Knoll Reviewed-by: Timur Pocheptsov Reviewed-by: Eskil Abrahamsen Blomfeldt Reviewed-by: Thiago Macieira --- dist/changes-5.7.1 | 221 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 dist/changes-5.7.1 diff --git a/dist/changes-5.7.1 b/dist/changes-5.7.1 new file mode 100644 index 0000000000..83065f01c1 --- /dev/null +++ b/dist/changes-5.7.1 @@ -0,0 +1,221 @@ +Qt 5.7.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.7.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.7 series is binary compatible with the 5.6.x series. +Applications compiled for 5.6 will continue to run with 5.7. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +This release contains all fixes included in the Qt 5.6.2 release. + +**************************************************************************** +* Important Behavior Changes * +**************************************************************************** + + - [QTBUG-45031] The NSURLConnection backend of QNetworkAccessManager has + been removed, since SecureTransport is the default SSL backend on iOS + and is enabled by default. This means that building with -no-openssl + -no-securetransport will no longer provide SSL capabilities on iOS. + + - QtCore / QDataStream: + * [QTBUG-54022] Incomplete reads of Qt containers are now handled same + way as for primitive types, meaning that previous errors are latched. + +**************************************************************************** +* Library * +**************************************************************************** + +QtCore +------ + + - QLockFile: + * Fixed permissions on lock files on Unix to allow for adjustments via + umask. + + - QMimeType: + * [QTBUG-50776] QMimeType::comment() now uses the default locale rather + than system locale, so that applications can control which language is + being used. + + - QUrl: + * QUrl::resolved() no longer treats a URL with a scheme as a relative URL + if it matches this URL's scheme. For now it still treats "file:name.txt" + as relative for compatibility, but be warned that in Qt 5.8 it will no + longer consider those to be relative. Both isRelative() and RFC 3986 say + that such URLs are not relative, so starting from Qt 5.8, resolved() will + return them as is. + + - QXmlStreamReader: + * Fixed a bug in the XML parser that prevented to load XML that + contained invalid characters for XML 1.0. + + - QXmlStreamWriter: + * Fixed a bug that prevented the generation of valid XML files when + using encoding with 8 bit per character but not ASCII compatible. + QXMLStreamWriter generated XML markup using always ASCII in this case. + +QtGui +----- + + - QGuiApplication: + * [QTBUG-51703] Fixed a bug that would cause QGuiApplication::sync() to + be left undefined for Qt builds without session management support. + + - QIconLoaderEngine: + * Fixed theme lookup for scalable entries + + - QTextDocument: + * [QTBUG-48182] Fixed a bug that would return a wrong position when + searching backward from the end of the document. + + - Text: + * [QTBUG-49452] Fixed a performance regression in Freetype engine that + was introduced in Qt 5.5. + * [QTBUG-53911] Fixed a crash that could happen if you were doing many + different text layouts with different fonts and superscript or + subscript alignment. + * [QTBUG-42033] Fixed bug where a QTextLayout with + ShowLineAndParagraphSeparators would modify the layout's input string. + * [QTBUG-54180] Fixed performance regression when rapidly switching + between a large set of fonts. + +QtNetwork +--------- + +- QSslSocket: + * [QTBUG-55170] Fixed a bug in SecureTransport backend that would cause + a memory usage growth in case 'readBufferMaxSize' is set. + * [QTBUG-52975] Fixed a bug in SecureTransport backend where transmit + was using invalid SSL context and reporting (incorrectly) some irrelevant + errors as a result. + +QtSql +----- + + - [QTBUG-53969][QTBUG-53237] Fixed QSqlQuery::prepare value truncation + error when using UNSIGNED values in a MySQL database. + +QtWidgets +--------- + + - QAbstractItemDelegate: + * [QTBUG-16469] Show localized detailed tooltips and "What's this?" + texts. + + - QTreeView: + * [QTBUG-52793] Fixed a key navigation bug when the columns were + reordered. + +**************************************************************************** +* Platform-specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-50724] Added support for clang compiler + - [QTBUG-53511] Fixed CJK font resolution on Android 7. + +FreeBSD +------- + + - The freebsd-g++ mkspec was moved back and no longer requires the + "unsupported/" prefix, matching the FreeBSD ports tree, as FreeBSD 9.3 + still defaults to using GCC. Users of GCC that did not previously use + the ports patch will need to adapt their build scripts and drop the + "unsupported/" prefix. + +Linux +----- + +- [QTBUG-54733] It is now possible to opt out from installing signal + handlers when running with eglfs and linuxfb by setting the + QT_QPA_NO_SIGNAL_HANDLER environment variable to a non-zero value. +- [QTBUG-55140] xcb with EGL and OpenGL ES, as well as eglfs with the + eglfs_x11 backend, are now supported on DRIVE CX boards when using the + linux-drive-cx-g++ device spec. + + +Windows +------- + + - [QTBUG-41186] QWindow::fromWinId() may return 0 when passing invalid + window handles. + - [QTBUG-55595] Fixed crash when loading color fonts from data. + - [QTBUG-55097] Fixed rendering Adobe/Mozilla format color fonts with + other colors than black after Windows 10 Anniversary update. + - [QTBUG-54494] Fixed stretch when combined with either no or vertical + hinting preference or a device pixel ratio different from 1. + - [QTBUG-51024] Fixed height of text bounding box when using no or + vertical hinting preference, or when the device pixel ratio is + different from 1. + +**************************************************************************** +* Tools * +**************************************************************************** + +configure & build system +------------------------ + + - [QTBUG-35886][QTBUG-51417] Fixed Fontconfig vs. system FreeType + configuration. + - [QTBUG-43784][X11] Fixed detection of GLX with -qt-xcb. + - [QTBUG-51534][Windows] The configure.exe bootstrapping now prefers + cl over clang-cl, to avoid header incompatibility problems. + - [QTBUG-52940] Fixed missing plugins.qmltypes files in static builds. + - [QTBUG-52951] Fixed dynamic library support detection for platforms + without libdl. + - [QTBUG-53038] Fixed running of configure tests outside qtbase when + cross compiling on Windows (for example for Android). + - [QTBUG-53312] The flags supplied by the configure -D/-I/-L/-l options + are now applied after Qt's own flags. This helps in some cases when + the provided paths contain files which conflict with the Qt build. + - [QTBUG-53926] Fixed linkage of QML plugins in static prefix builds. + - [QTBUG-55011][Unix] Fixed -no-pkg-config being ignored by some + configure tests, which led to build failures later on. + - Fixed configure tests outside qtbase when $MAKEFLAGS contains the + -i flag. + - [Android] Some unused plugins are not built anymore. + - [MinGW] Added support for -separate-debug-info. + - [Unix] Added configure -no-opengles3 option. + - [Unix] Fixed MySQL detection/use on RHEL 6.6. + +qmake +----- + + - [QTBUG-41830] Fixed nested custom functions inheriting their callers' + arguments. + - [QTBUG-53895][MSVC] Started using separate PDB files for compiling + and linking. + - [QTBUG-54036][Darwin] Fixed installation of debug symbols. + - [QTBUG-54299] Various QMAKE_EXTRA_COMPILERS' .depends entries are now + appended to rather than overwritten. + - [QTBUG-54346][MSys/Apple] Fixed detection of QMAKE_DEFAULT_{INC,LIB}DIRS. + - [QTBUG-54550] Fixed access to freed memory in $$absolute_path(). + - [QTBUG-54674] The obsolete -target xp is now properly rejected. + - [QTBUG-55183][nmake] _WINDLL is now automatically defined when building + a DLL, consistently with Visual Studio. + - [QTBUG-55505] Fixed build of projects with spaces in the source or build + path against static builds of Qt. + - [QTBUG-55649][QTBUG-55915][Xcode] Fixed support for Xcode 8. + - [QTBUG-56162][MinGW] Fixed -release -force-debug-info missing both + optimization and debug info. + - Fixed several cases where the error() function would not abort qmake. + - Interrupting a command run via system() will now abort qmake as well. + - The packagesExist() function will now warn when used when Qt was + configured with -no-pkg-config. + - [Android] The default compiler flags were adjusted to match newer + NDK versions. + - [Darwin] Fixed detection of QMAKE_DEFAULT_INCDIRS. + - [Darwin][make] Added support for building Xcode asset catalogs. From e79b40ee8f78a9669ed0b7b6def2a69ef7ab02fa Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Tue, 1 Nov 2016 15:28:17 -0700 Subject: [PATCH 005/174] macOS: Clear event dispatcher interrupt state A pending interrupt of a QEventLoop may interfere with native runModal calls, resulting in Cocoa's main event loop to be stopped unexpectedly. After commit 9ab60b9c processEvents() no longer resets the event dispatcher interrupt flag. Add QCocoaEventDispatcher::clearCurrentThreadCocoa EventDispatcherInterruptFlag(). Use it to clear the interrupt state before calling runModal and variants. Work around the inability to use platform API in the print support code. Change-Id: I3e03e7ec21ff6c49442c7a6e803a7200aac0b58d Task-number: QTBUG-56746 Reviewed-by: Gabriel de Dietrich --- .../platforms/cocoa/qcocoacolordialoghelper.mm | 5 +++++ src/plugins/platforms/cocoa/qcocoaeventdispatcher.h | 2 ++ .../platforms/cocoa/qcocoaeventdispatcher.mm | 13 +++++++++++++ .../platforms/cocoa/qcocoafiledialoghelper.mm | 5 +++++ .../platforms/cocoa/qcocoafontdialoghelper.mm | 5 +++++ src/plugins/platforms/cocoa/qcocoanativeinterface.h | 2 ++ .../platforms/cocoa/qcocoanativeinterface.mm | 6 ++++++ src/printsupport/dialogs/qpagesetupdialog_mac.mm | 5 +++++ src/printsupport/dialogs/qprintdialog_mac.mm | 5 +++++ 9 files changed, 48 insertions(+) diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm index 0319d4ca6d..7d12804d47 100644 --- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm @@ -45,6 +45,7 @@ #include "qcocoacolordialoghelper.h" #include "qcocoahelpers.h" +#include "qcocoaeventdispatcher.h" #import @@ -322,6 +323,10 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSColorPanelDelegate); // cleanup of modal sessions. Do this before showing the native dialog, otherwise it will // close down during the cleanup. qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers); + + // Make sure we don't interrupt the runModalForWindow call. + QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag(); + [NSApp runModalForWindow:mColorPanel]; mDialogIsExecuting = false; return (mResultCode == NSOKButton); diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h index 84880d51c5..70887c41c9 100644 --- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h +++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h @@ -131,6 +131,8 @@ public: void interrupt(); void flush(); + static void clearCurrentThreadCocoaEventDispatcherInterruptFlag(); + friend void qt_mac_maybeCancelWaitForMoreEventsForwarder(QAbstractEventDispatcher *eventDispatcher); }; diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm index 5c27cf8059..d9c835d797 100644 --- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm +++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm @@ -966,6 +966,19 @@ void QCocoaEventDispatcher::interrupt() void QCocoaEventDispatcher::flush() { } +// QTBUG-56746: The behavior of processEvents() has been changed to not clear +// the interrupt flag. Use this function to clear it. + void QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag() +{ + QCocoaEventDispatcher *cocoaEventDispatcher = + qobject_cast(QThread::currentThread()->eventDispatcher()); + if (!cocoaEventDispatcher) + return; + QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = + static_cast(QObjectPrivate::get(cocoaEventDispatcher)); + cocoaEventDispatcherPrivate->interrupt = false; +} + QCocoaEventDispatcher::~QCocoaEventDispatcher() { Q_D(QCocoaEventDispatcher); diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index 4eb35f5495..c7191e4841 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -53,6 +53,7 @@ #include "qt_mac_p.h" #include "qcocoahelpers.h" #include "qcocoamenubar.h" +#include "qcocoaeventdispatcher.h" #include #include #include @@ -243,6 +244,10 @@ static QString strippedText(QString s) // cleanup of modal sessions. Do this before showing the native dialog, otherwise it will // close down during the cleanup. qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers); + + // Make sure we don't interrupt the runModal call below. + QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag(); + QCocoaMenuBar::redirectKnownMenuItemsToFirstResponder(); mReturnCode = [mSavePanel runModal]; QCocoaMenuBar::resetKnownMenuItemsToQt(); diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm index dc7dfb788f..d0b76861d8 100644 --- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm @@ -49,6 +49,7 @@ #include "qcocoafontdialoghelper.h" #include "qcocoahelpers.h" +#include "qcocoaeventdispatcher.h" #import @@ -319,6 +320,10 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate); // cleanup of modal sessions. Do this before showing the native dialog, otherwise it will // close down during the cleanup. qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers); + + // Make sure we don't interrupt the runModalForWindow call. + QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag(); + [NSApp runModalForWindow:mFontPanel]; mDialogIsExecuting = false; return (mResultCode == NSOKButton); diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h index 7065a364bf..b06fff1375 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h @@ -100,6 +100,8 @@ private: */ Q_INVOKABLE QPixmap defaultBackgroundPixmapForQWizard(); + Q_INVOKABLE void clearCurrentThreadCocoaEventDispatcherInterruptFlag(); + // QMacPastebardMime support. The mac pasteboard void pointers are // QMacPastebardMime instances from the cocoa plugin or qtmacextras // These two classes are kept in sync and can be casted between. diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm index 8562246817..a327750ffd 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -44,6 +44,7 @@ #include "qcocoahelpers.h" #include "qcocoaapplication.h" #include "qcocoaintegration.h" +#include "qcocoaeventdispatcher.h" #include #include @@ -194,6 +195,11 @@ QPixmap QCocoaNativeInterface::defaultBackgroundPixmapForQWizard() return QPixmap(); } +void QCocoaNativeInterface::clearCurrentThreadCocoaEventDispatcherInterruptFlag() +{ + QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag(); +} + void QCocoaNativeInterface::onAppFocusWindowChanged(QWindow *window) { Q_UNUSED(window); diff --git a/src/printsupport/dialogs/qpagesetupdialog_mac.mm b/src/printsupport/dialogs/qpagesetupdialog_mac.mm index e3e7523a16..c29b911e35 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_mac.mm +++ b/src/printsupport/dialogs/qpagesetupdialog_mac.mm @@ -133,6 +133,11 @@ void QMacPageSetupDialogPrivate::openCocoaPageLayout(Qt::WindowModality modality QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) alloc] initWithNSPrintInfo:printInfo]; if (modality == Qt::ApplicationModal) { + + // Make sure we don't interrupt the runModalWithPrintInfo call. + (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(), + "clearCurrentThreadCocoaEventDispatcherInterruptFlag"); + int rval = [pageLayout runModalWithPrintInfo:printInfo]; [delegate pageLayoutDidEnd:pageLayout returnCode:rval contextInfo:q]; } else { diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm index c16bb93013..c630ab634a 100644 --- a/src/printsupport/dialogs/qprintdialog_mac.mm +++ b/src/printsupport/dialogs/qprintdialog_mac.mm @@ -245,6 +245,11 @@ void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality) if (modality == Qt::ApplicationModal || !q->parentWidget()) { if (modality == Qt::NonModal) qWarning("QPrintDialog is required to be modal on OS X"); + + // Make sure we don't interrupt the runModalWithPrintInfo call. + (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(), + "clearCurrentThreadCocoaEventDispatcherInterruptFlag"); + int rval = [printPanel runModalWithPrintInfo:printInfo]; [delegate printPanelDidEnd:printPanel returnCode:rval contextInfo:q]; } else { From 3654a401f8e046e2fa5a340d0380cc0088a03048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Thu, 27 Oct 2016 09:57:54 +0200 Subject: [PATCH 006/174] Prevent stale QOpenGLContext fbo pointer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is logic for clearing the qgl_curent_fbo pointer in release(), but it is not always called, causing the pointer to become stale on QOpenGLFramebufferObject deletion. As a last resort, clear the qgl_curent_fbo pointer on the current context if it’s pointing to the object that is being deleted. Change-Id: I0a91d686cec5fcbe4c1520a9ba96cea833bb2249 Task-number: QTBUG-56639 Reviewed-by: Laszlo Agocs --- src/gui/kernel/qopenglcontext_p.h | 2 +- src/gui/opengl/qopenglframebufferobject.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qopenglcontext_p.h b/src/gui/kernel/qopenglcontext_p.h index 2fe8446c65..736f816bfe 100644 --- a/src/gui/kernel/qopenglcontext_p.h +++ b/src/gui/kernel/qopenglcontext_p.h @@ -264,7 +264,7 @@ public: static QOpenGLContextPrivate *get(QOpenGLContext *context) { - return context->d_func(); + return context ? context->d_func() : Q_NULLPTR; } #if !defined(QT_NO_DEBUG) diff --git a/src/gui/opengl/qopenglframebufferobject.cpp b/src/gui/opengl/qopenglframebufferobject.cpp index 14581c89f6..be5407ccbd 100644 --- a/src/gui/opengl/qopenglframebufferobject.cpp +++ b/src/gui/opengl/qopenglframebufferobject.cpp @@ -955,6 +955,12 @@ QOpenGLFramebufferObject::~QOpenGLFramebufferObject() d->stencil_buffer_guard->free(); if (d->fbo_guard) d->fbo_guard->free(); + + QOpenGLContextPrivate *contextPrv = QOpenGLContextPrivate::get(QOpenGLContext::currentContext()); + if (contextPrv && contextPrv->qgl_current_fbo == this) { + contextPrv->qgl_current_fbo_invalid = true; + contextPrv->qgl_current_fbo = Q_NULLPTR; + } } /*! From 628d367a9d618568167d43195c1118b7d7979da0 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 15 Nov 2016 10:44:37 +0100 Subject: [PATCH 007/174] Stabilize tst_QFileDialog2::task143519_deleteAndRenameActionBehavior() The test relied on the file created being automatically selected, which sometimes does not happen when executing the entire test. Explicitly select the file and check the selection. Use the temporary directory for testing. Change-Id: Ia58641c1ac32ba21effa8a5ace9623eb5d48a1c2 Reviewed-by: Maurice Kalinowski --- .../widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp index b457558879..656d4d46de 100644 --- a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp +++ b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp @@ -372,8 +372,7 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior() // test based on task233037_selectingDirectory struct TestContext { - TestContext() - : current(QDir::current()) {} + explicit TestContext(const QString &path) : current(path) {} ~TestContext() { file.remove(); current.rmdir(test.dirName()); @@ -381,7 +380,9 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior() QDir current; QDir test; QFile file; - } ctx; + }; + + TestContext ctx(tempDir.path()); // setup testbed QVERIFY(ctx.current.mkdir("task143519_deleteAndRenameActionBehavior_test")); // ensure at least one item @@ -395,6 +396,7 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior() QNonNativeFileDialog fd; fd.setViewMode(QFileDialog::List); fd.setDirectory(ctx.test.absolutePath()); + fd.selectFile(ctx.file.fileName()); fd.show(); QTest::qWaitForWindowActive(&fd); @@ -409,7 +411,7 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior() // defaults QVERIFY(openContextMenu(fd)); - QCOMPARE(fd.selectedFiles().size(), 1); + QCOMPARE(fd.selectedFiles(), QStringList(ctx.file.fileName())); QCOMPARE(rm->isEnabled(), !fd.isReadOnly()); QCOMPARE(mv->isEnabled(), !fd.isReadOnly()); From f2205c48c21a6b135f2f59d0cf46e72f90f9f0f4 Mon Sep 17 00:00:00 2001 From: Robin Burchell Date: Fri, 11 Nov 2016 15:29:28 +0100 Subject: [PATCH 008/174] QFontEngine: Cache whether or not a font can be smoothly scaled This will be used by QtQuick to correct a performance regression introduced by 592614ea3ecd90ede2ae1b8e6579d1b898f474ec -- QFontDatabase::isSmoothlyScalable is quite computationally expensive; and now it is unconditionally expensive regardless of the platform. Change-Id: I82bfa65a963c6c3c276d574f2b379da4a9ba5b69 Reviewed-by: Konstantin Ritt Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qfontdatabase.cpp | 3 ++- src/gui/text/qfontengine.cpp | 1 + src/gui/text/qfontengine_p.h | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index f1b2e84a1e..f1478515f4 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -948,8 +948,8 @@ QFontEngine *loadSingleEngine(int script, return 0; } + engine->isSmoothlyScalable = style->smoothScalable; fontCache->insertEngine(key, engine); - return engine; } } @@ -972,6 +972,7 @@ QFontEngine *loadSingleEngine(int script, return 0; } + engine->isSmoothlyScalable = style->smoothScalable; fontCache->insertEngine(key, engine); if (Q_LIKELY(cacheForCommonScript && !engine->symbol)) { diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index fa49b25073..790dd0b64b 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -251,6 +251,7 @@ QFontEngine::QFontEngine(Type type) cache_cost = 0; fsType = 0; symbol = false; + isSmoothlyScalable = false; glyphFormat = Format_None; m_subPixelPositionCount = 0; diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index 39cf826ee2..893dfb5092 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -283,6 +283,7 @@ public: uint cache_cost; // amount of mem used in bytes by the font uint fsType : 16; bool symbol; + bool isSmoothlyScalable; struct KernPair { uint left_right; QFixed adjust; From 083d8caee10892d2f3d9597609315231b6f8493a Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 20 Oct 2016 23:43:26 +0200 Subject: [PATCH 009/174] QXbmHandler: fix missing NUL-termination The buffer is fed into strstr() on the next loop iteration, but strstr() expects a NUL-terminated string. In the equivalent code some lines up, the buffer is explicitly terminated, and we never write the last character of the buffer again, so we'll not fall off the end of the buffer, but if we read less bytes than in the last line, we'll parse garbage from the previous line. Change-Id: I354e1ce1dea71188942305190500b4778a69b4ff Reviewed-by: Edward Welbourne --- src/gui/image/qxbmhandler.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/image/qxbmhandler.cpp b/src/gui/image/qxbmhandler.cpp index 44d07f1624..b21bc75bc4 100644 --- a/src/gui/image/qxbmhandler.cpp +++ b/src/gui/image/qxbmhandler.cpp @@ -157,6 +157,7 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage) } else { // read another line if ((readBytes = device->readLine(buf,buflen)) <= 0) // EOF ==> truncated image break; + buf[readBytes] = '\0'; p = buf + QByteArray::fromRawData(buf, readBytes).indexOf("0x"); } } From 1753d696070895f309c46ba5aee662b0f3a18bde Mon Sep 17 00:00:00 2001 From: "Martin T. H. Sandsmark" Date: Sat, 15 Oct 2016 14:14:00 +0200 Subject: [PATCH 010/174] QCss: Fix parsing of charset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When including a CSS file in a HTML file sent to QTextDocument, and the CSS file starts with «@charset "UTF-8";», which is the correct way of declaring that, the parsing fails. If you omit the space, like «@charset"UTF-8";» the parsing succeeds, which is wrong. Fix this by expecting and swallowing whitespace after the @charset tokens. Task-number: QTBUG-54829 Change-Id: I32044e8d24bda70c1eb06bf74af50d4cabe2211d Reviewed-by: Allan Sandfeld Jensen --- src/gui/text/qcssparser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp index e96aecdf68..3d6acccdb8 100644 --- a/src/gui/text/qcssparser.cpp +++ b/src/gui/text/qcssparser.cpp @@ -2175,6 +2175,7 @@ void Parser::init(const QString &css, bool isFile) bool Parser::parse(StyleSheet *styleSheet, Qt::CaseSensitivity nameCaseSensitivity) { if (testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("charset"))) { + while (test(S) || test(CDO) || test(CDC)) {} if (!next(STRING)) return false; if (!next(SEMICOLON)) return false; } From e655426e7ac8396713272e123fe0218380e13de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Tue, 15 Nov 2016 13:45:22 +0000 Subject: [PATCH 011/174] docs: Reference QLineEdit::hasAcceptableInput() in setValidator() Easy to miss otherwise and hasAcceptableInput() already references setValidator(). Change-Id: Id2d63050db670ab8f7150d7f76492664751cd2da Reviewed-by: Friedemann Kleint --- src/widgets/widgets/qlineedit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 2cad5d325c..2069c91664 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -605,7 +605,7 @@ const QValidator * QLineEdit::validator() const The initial setting is to have no input validator (i.e. any input is accepted up to maxLength()). - \sa validator(), QIntValidator, QDoubleValidator, QRegExpValidator + \sa validator(), hasAcceptableInput(), QIntValidator, QDoubleValidator, QRegExpValidator */ void QLineEdit::setValidator(const QValidator *v) From 8d8991c697d001e3e205ad03533dc0e5ca5dde0b Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 20 Oct 2016 23:33:02 +0200 Subject: [PATCH 012/174] QXbmHandler: don't construct a QByteArray just to find '0x' in text Even QByteArray::fromRawData() allocates memory. Instead of QByteArray::contains() and indexOf(), use good ol' strstr(), like already done elsewhere in the same function. Apart from the memory allocations saved, this fixes a Coverity error complaining that indexOf() can return -1. It's a false positive on the first occurrence, because we didn't call that function unless we know there is a "0x" in the string, but the second _was_ wrong, because we applied it on a new buffer, with unknown content. Coverity-Id: 11262 Change-Id: I18f352c5576e24f89a5c3ef7f2f1b2176f2a235d Reviewed-by: Edward Welbourne --- src/gui/image/qxbmhandler.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gui/image/qxbmhandler.cpp b/src/gui/image/qxbmhandler.cpp index b21bc75bc4..ada2485363 100644 --- a/src/gui/image/qxbmhandler.cpp +++ b/src/gui/image/qxbmhandler.cpp @@ -118,17 +118,18 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage) qint64 readBytes = 0; + char *p; + // scan for database - for (;;) { + do { if ((readBytes = device->readLine(buf, buflen)) <= 0) { // end of file return false; } buf[readBytes] = '\0'; - if (QByteArray::fromRawData(buf, readBytes).contains("0x")) - break; - } + p = strstr(buf, "0x"); + } while (!p); if (outImage->size() != QSize(w, h) || outImage->format() != QImage::Format_MonoLSB) { *outImage = QImage(w, h, QImage::Format_MonoLSB); @@ -142,7 +143,6 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage) int x = 0, y = 0; uchar *b = outImage->scanLine(0); - char *p = buf + QByteArray::fromRawData(buf, readBytes).indexOf("0x"); w = (w+7)/8; // byte width while (y < h) { // for all encoded bytes... @@ -158,7 +158,7 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage) if ((readBytes = device->readLine(buf,buflen)) <= 0) // EOF ==> truncated image break; buf[readBytes] = '\0'; - p = buf + QByteArray::fromRawData(buf, readBytes).indexOf("0x"); + p = strstr(buf, "0x"); } } From bebbaa43fd21baf0b2235199e84898f18d6cc861 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 30 Sep 2016 15:51:30 +0200 Subject: [PATCH 013/174] Fix warnings in tst_q{table,list}widget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GCC warned: tst_qtablewidget.cpp:30: tst_qtablewidget.cpp: In member function ‘void tst_QTableWidget::mimeData()’: qtestcase.h:66:52: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if (!QTest::qVerify(static_cast(statement), #statement, "", __FILE__, __LINE__))\ ^ tst_qtablewidget.cpp:1523:5: note: in expansion of macro ‘QVERIFY’ QVERIFY(data = table.mimeData(tableWidgetItemList)); ^~~~~~~ Fix by adding the extra parentheses, as usual. Change-Id: I2826d7a865b4113b468d5a958ede06e03aa0e278 Reviewed-by: Edward Welbourne Reviewed-by: Marc Mutz --- .../widgets/itemviews/qlistwidget/tst_qlistwidget.cpp | 8 ++++---- .../widgets/itemviews/qtablewidget/tst_qtablewidget.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp index ecf72613da..f526c041f5 100644 --- a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp +++ b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp @@ -1688,16 +1688,16 @@ void tst_QListWidget::mimeData() QMimeData *data; - QVERIFY(data = list.mimeData(tableWidgetItemList)); + QVERIFY((data = list.mimeData(tableWidgetItemList))); delete data; - QVERIFY(data = list.model()->mimeData(modelIndexList)); + QVERIFY((data = list.model()->mimeData(modelIndexList))); delete data; - QVERIFY(data = list.model()->mimeData(modelIndexList)); + QVERIFY((data = list.model()->mimeData(modelIndexList))); delete data; - QVERIFY(data = list.mimeData(tableWidgetItemList)); + QVERIFY((data = list.mimeData(tableWidgetItemList))); delete data; // check the saved data is actually the same diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp index ea31fd19dd..ff3cb72832 100644 --- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp +++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp @@ -1537,16 +1537,16 @@ void tst_QTableWidget::mimeData() QMimeData *data; - QVERIFY(data = table.mimeData(tableWidgetItemList)); + QVERIFY((data = table.mimeData(tableWidgetItemList))); delete data; - QVERIFY(data = table.model()->mimeData(modelIndexList)); + QVERIFY((data = table.model()->mimeData(modelIndexList))); delete data; - QVERIFY(data = table.model()->mimeData(modelIndexList)); + QVERIFY((data = table.model()->mimeData(modelIndexList))); delete data; - QVERIFY(data = table.mimeData(tableWidgetItemList)); + QVERIFY((data = table.mimeData(tableWidgetItemList))); delete data; // check the saved data is actually the same From 48d7db6b3119ee27d9ae6b1bd0fdb24333f44756 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Wed, 16 Nov 2016 13:51:08 +0300 Subject: [PATCH 014/174] QtCore: Add missing override Change-Id: Ifdec31aabdd0371f36abbb382e49f52f5b58ee94 Reviewed-by: hjk --- src/corelib/codecs/qsimplecodec_p.h | 10 +++++----- src/corelib/io/qfile_p.h | 2 +- src/corelib/io/qtemporaryfile_p.h | 14 +++++++------- src/corelib/mimetypes/qmimetypeparser_p.h | 10 +++++----- src/corelib/statemachine/qhistorystate_p.h | 4 ++-- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/corelib/codecs/qsimplecodec_p.h b/src/corelib/codecs/qsimplecodec_p.h index d45cf2377f..a84f9af1e9 100644 --- a/src/corelib/codecs/qsimplecodec_p.h +++ b/src/corelib/codecs/qsimplecodec_p.h @@ -66,12 +66,12 @@ public: explicit QSimpleTextCodec(int); ~QSimpleTextCodec(); - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; - QByteArray name() const; - QList aliases() const; - int mibEnum() const; + QByteArray name() const override; + QList aliases() const override; + int mibEnum() const override; private: int forwardIndex; diff --git a/src/corelib/io/qfile_p.h b/src/corelib/io/qfile_p.h index fd7db3c120..545890c6b3 100644 --- a/src/corelib/io/qfile_p.h +++ b/src/corelib/io/qfile_p.h @@ -70,7 +70,7 @@ protected: bool openExternalFile(int flags, int fd, QFile::FileHandleFlags handleFlags); bool openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handleFlags); - virtual QAbstractFileEngine *engine() const; + QAbstractFileEngine *engine() const override; QString fileName; }; diff --git a/src/corelib/io/qtemporaryfile_p.h b/src/corelib/io/qtemporaryfile_p.h index 58cc318ffd..40974bd6cd 100644 --- a/src/corelib/io/qtemporaryfile_p.h +++ b/src/corelib/io/qtemporaryfile_p.h @@ -69,7 +69,7 @@ protected: QTemporaryFilePrivate(); ~QTemporaryFilePrivate(); - QAbstractFileEngine *engine() const; + QAbstractFileEngine *engine() const override; void resetFileEngine() const; bool autoRemove; @@ -98,14 +98,14 @@ public: ~QTemporaryFileEngine(); bool isReallyOpen() const; - void setFileName(const QString &file); + void setFileName(const QString &file) override; void setFileTemplate(const QString &fileTemplate); - bool open(QIODevice::OpenMode flags); - bool remove(); - bool rename(const QString &newName); - bool renameOverwrite(const QString &newName); - bool close(); + bool open(QIODevice::OpenMode flags) override; + bool remove() override; + bool rename(const QString &newName) override; + bool renameOverwrite(const QString &newName) override; + bool close() override; quint32 fileMode; bool filePathIsTemplate; diff --git a/src/corelib/mimetypes/qmimetypeparser_p.h b/src/corelib/mimetypes/qmimetypeparser_p.h index a502439419..0ce39e701c 100644 --- a/src/corelib/mimetypes/qmimetypeparser_p.h +++ b/src/corelib/mimetypes/qmimetypeparser_p.h @@ -108,19 +108,19 @@ public: explicit QMimeTypeParser(QMimeXMLProvider &provider) : m_provider(provider) {} protected: - inline bool process(const QMimeType &t, QString *) + inline bool process(const QMimeType &t, QString *) override { m_provider.addMimeType(t); return true; } - inline bool process(const QMimeGlobPattern &glob, QString *) + inline bool process(const QMimeGlobPattern &glob, QString *) override { m_provider.addGlobPattern(glob); return true; } - inline void processParent(const QString &child, const QString &parent) + inline void processParent(const QString &child, const QString &parent) override { m_provider.addParent(child, parent); } - inline void processAlias(const QString &alias, const QString &name) + inline void processAlias(const QString &alias, const QString &name) override { m_provider.addAlias(alias, name); } - inline void processMagicMatcher(const QMimeMagicRuleMatcher &matcher) + inline void processMagicMatcher(const QMimeMagicRuleMatcher &matcher) override { m_provider.addMagicMatcher(matcher); } private: diff --git a/src/corelib/statemachine/qhistorystate_p.h b/src/corelib/statemachine/qhistorystate_p.h index 2e93c31982..f3eb20f194 100644 --- a/src/corelib/statemachine/qhistorystate_p.h +++ b/src/corelib/statemachine/qhistorystate_p.h @@ -87,8 +87,8 @@ protected: // state, it will handle this transition as a special case. The history state itself is never // entered either: either the stored configuration will be used, or the target(s) of this // transition are used. - virtual bool eventTest(QEvent *event) { Q_UNUSED(event); return false; } - virtual void onTransition(QEvent *event) { Q_UNUSED(event); } + bool eventTest(QEvent *event) override { Q_UNUSED(event); return false; } + void onTransition(QEvent *event) override { Q_UNUSED(event); } }; QT_END_NAMESPACE From bd591064be388216f91d48522b3bdbc1be93bb92 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Fri, 21 Oct 2016 17:14:31 +0200 Subject: [PATCH 015/174] Use QPersistentModelIndex for storing a model index MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QModelIndex is not safe to be used to store an index as it is designed to be discarded right after use as the index information can change. Therefore a QPersistentModelIndex should be used instead to store the index. Subsequently the m_index does not need to be updated whenever the model changes anymore as this is already done for us. Task-number: QTBUG-49907 Change-Id: Icc93e410de2821c503ea15a7a1dd9ae32634914e Reviewed-by: Jan Arve Sæther --- src/widgets/accessible/itemviews.cpp | 42 ++++--------------- src/widgets/accessible/itemviews_p.h | 2 +- .../qaccessibility/tst_qaccessibility.cpp | 5 ++- 3 files changed, 12 insertions(+), 37 deletions(-) diff --git a/src/widgets/accessible/itemviews.cpp b/src/widgets/accessible/itemviews.cpp index 1b724c9a17..d58db8de32 100644 --- a/src/widgets/accessible/itemviews.cpp +++ b/src/widgets/accessible/itemviews.cpp @@ -550,20 +550,8 @@ void QAccessibleTable::modelChange(QAccessibleTableModelChangeEvent *event) QAccessible::Id id = iter.value(); QAccessibleInterface *iface = QAccessible::accessibleInterface(id); Q_ASSERT(iface); - if (iface->role() == QAccessible::Cell || iface->role() == QAccessible::ListItem) { - Q_ASSERT(iface->tableCellInterface()); - QAccessibleTableCell *cell = static_cast(iface->tableCellInterface()); - if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted - && cell->m_index.row() >= event->firstRow()) { - int newRow = cell->m_index.row() + newRows; - cell->m_index = cell->m_index.sibling(newRow, cell->m_index.column()); - } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::ColumnsInserted - && cell->m_index.column() >= event->firstColumn()) { - int newColumn = cell->m_index.column() + newColumns; - cell->m_index = cell->m_index.sibling(cell->m_index.row(), newColumn); - } - } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted - && iface->role() == QAccessible::RowHeader) { + if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted + && iface->role() == QAccessible::RowHeader) { QAccessibleTableHeaderCell *cell = static_cast(iface); if (cell->index >= event->firstRow()) { cell->index += newRows; @@ -602,27 +590,11 @@ void QAccessibleTable::modelChange(QAccessibleTableModelChangeEvent *event) if (iface->role() == QAccessible::Cell || iface->role() == QAccessible::ListItem) { Q_ASSERT(iface->tableCellInterface()); QAccessibleTableCell *cell = static_cast(iface->tableCellInterface()); - if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsRemoved) { - if (cell->m_index.row() < event->firstRow()) { - newCache.insert(indexOfChild(cell), id); - } else if (cell->m_index.row() > event->lastRow()) { - int newRow = cell->m_index.row() - deletedRows; - cell->m_index = cell->m_index.sibling(newRow, cell->m_index.column()); - newCache.insert(indexOfChild(cell), id); - } else { - QAccessible::deleteAccessibleInterface(id); - } - } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::ColumnsRemoved) { - if (cell->m_index.column() < event->firstColumn()) { - newCache.insert(indexOfChild(cell), id); - } else if (cell->m_index.column() > event->lastColumn()) { - int newColumn = cell->m_index.column() - deletedColumns; - cell->m_index = cell->m_index.sibling(cell->m_index.row(), newColumn); - newCache.insert(indexOfChild(cell), id); - } else { - QAccessible::deleteAccessibleInterface(id); - } - } + // Since it is a QPersistentModelIndex, we only need to check if it is valid + if (cell->m_index.isValid()) + newCache.insert(indexOfChild(cell), id); + else + QAccessible::deleteAccessibleInterface(id); } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsRemoved && iface->role() == QAccessible::RowHeader) { QAccessibleTableHeaderCell *cell = static_cast(iface); diff --git a/src/widgets/accessible/itemviews_p.h b/src/widgets/accessible/itemviews_p.h index 6a18a1231b..b3cd456585 100644 --- a/src/widgets/accessible/itemviews_p.h +++ b/src/widgets/accessible/itemviews_p.h @@ -207,7 +207,7 @@ private: QHeaderView *verticalHeader() const; QHeaderView *horizontalHeader() const; QPointer view; - QModelIndex m_index; + QPersistentModelIndex m_index; QAccessible::Role m_role; void selectCell(); diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index 62c2c0a916..3d78749024 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -2903,7 +2903,10 @@ void tst_QAccessibility::listTest() QAccessibleInterface *cellMunich3 = table2->cellAt(2,0); QCOMPARE(cell4, cellMunich3); QCOMPARE(axidMunich, QAccessible::uniqueId(cellMunich3)); - + delete listView->takeItem(2); + // list: Oslo, Helsinki + // verify that it doesn't return an invalid item from the cache + QVERIFY(table2->cellAt(2,0) == 0); delete listView; } From 658c8370e4dd74ee82046799b56947bb3c738b92 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Fri, 22 Jan 2016 17:03:48 +0100 Subject: [PATCH 016/174] QDateTimeParser: localize variable to avoid shadowing The outer scope it was in had a later clause with its own pos variable. Change-Id: I8d083d3d5935416ef82a78890ed145f02d6d6ded Reviewed-by: Timur Pocheptsov --- src/corelib/tools/qdatetimeparser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qdatetimeparser.cpp b/src/corelib/tools/qdatetimeparser.cpp index 5b7bf0d3d4..bda786aa24 100644 --- a/src/corelib/tools/qdatetimeparser.cpp +++ b/src/corelib/tools/qdatetimeparser.cpp @@ -879,12 +879,12 @@ QDateTimeParser::StateNode QDateTimeParser::parse(QString &input, int &cursorPos State state = Acceptable; QDateTime newCurrentValue; - int pos = 0; bool conflicts = false; const int sectionNodesCount = sectionNodes.size(); QDTPDEBUG << "parse" << input; { + int pos = 0; int year, month, day; currentValue.date().getDate(&year, &month, &day); int year2digits = year % 100; From ac384524c8fa6b19153811e2eaf6dac6b911f930 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 14 Oct 2016 14:51:16 +0200 Subject: [PATCH 017/174] Speculative fix for tst_QThread::wait2() flakiness This test fails on Windows occasionally with values just short of 800, the lowest observed being 791. It is probably rounding somehow to 10ms segments, so allow it to be up to 10 ms too fast. Change-Id: Ie28e9f61588b68a9060a006f78eedc3a26d05155 Reviewed-by: Friedemann Kleint Reviewed-by: Thiago Macieira Reviewed-by: Simon Hausmann --- tests/auto/corelib/thread/qthread/tst_qthread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/corelib/thread/qthread/tst_qthread.cpp b/tests/auto/corelib/thread/qthread/tst_qthread.cpp index 3230472d5b..d7294c3ee6 100644 --- a/tests/auto/corelib/thread/qthread/tst_qthread.cpp +++ b/tests/auto/corelib/thread/qthread/tst_qthread.cpp @@ -1082,8 +1082,8 @@ void tst_QThread::wait2() thread.start(); timer.start(); QVERIFY(!thread.wait(Waiting_Thread::WaitTime)); - qint64 elapsed = timer.elapsed(); // On Windows, we sometimes get (WaitTime - 1). - QVERIFY2(elapsed >= Waiting_Thread::WaitTime - 1, qPrintable(QString::fromLatin1("elapsed: %1").arg(elapsed))); + qint64 elapsed = timer.elapsed(); // On Windows, we sometimes get (WaitTime - 9). + QVERIFY2(elapsed >= Waiting_Thread::WaitTime - 10, qPrintable(QString::fromLatin1("elapsed: %1").arg(elapsed))); timer.start(); thread.cond1.wakeOne(); From 35953be53bfe06f01f6b8cfde70d7e793341e481 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 7 Oct 2016 20:16:58 +0200 Subject: [PATCH 018/174] fix xcodebuilds without -sdk iphonesimulator the order of the arguments passed to addExclusiveBuilds() determines the name of the CONFIG flag which actually enables the mode. that is historically fixed to iphonesimulator_and_iphoneos and we cannot just change the order. to get around this, add a new "overload" of the function which allows specifying the flag independently from the order of the builds, and make use of it in ios' resolve_config.prf. amends d2b4a789c. Change-Id: Ia3fabea0c0c30beae680b57e75bdcdf35ef6503d (cherry picked from 59985b3c291f769cfc24cf361367757fce229397) Reviewed-by: Jake Petroules Reviewed-by: Oswald Buddenhagen --- mkspecs/features/exclusive_builds.prf | 18 +++++++++++------- .../macx-ios-clang/features/resolve_config.prf | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mkspecs/features/exclusive_builds.prf b/mkspecs/features/exclusive_builds.prf index 5d06198ae4..f40cc99172 100644 --- a/mkspecs/features/exclusive_builds.prf +++ b/mkspecs/features/exclusive_builds.prf @@ -1,12 +1,9 @@ -defineTest(addExclusiveBuilds) { - lessThan(ARGC, 2): \ - error("addExclusiveBuilds() requires at least two arguments") - - !$$join(ARGS, _and_):!fix_output_dirs: \ +defineTest(addExclusiveBuildsProper) { + !$$1:!fix_output_dirs: \ return(true) - for(build, ARGS) { + for(build, 2) { isEmpty($${build}.name) { $${build}.name = $$title($$build) export($${build}.name) @@ -20,7 +17,7 @@ defineTest(addExclusiveBuilds) { export($${build}.dir_affix) } - $${build}.exclusive = $$ARGS + $${build}.exclusive = $$2 export($${build}.exclusive) QMAKE_EXCLUSIVE_BUILDS += $$build @@ -33,6 +30,13 @@ defineTest(addExclusiveBuilds) { return(true) } +defineTest(addExclusiveBuilds) { + lessThan(ARGC, 2): \ + error("addExclusiveBuilds() requires at least two arguments") + + addExclusiveBuildsProper($$join(ARGS, _and_), $$ARGS) +} + # Default directories to process QMAKE_DIR_REPLACE = OBJECTS_DIR MOC_DIR RCC_DIR PRECOMPILED_DIR QGLTF_DIR DESTDIR QMAKE_DIR_REPLACE_SANE += QGLTF_DIR diff --git a/mkspecs/macx-ios-clang/features/resolve_config.prf b/mkspecs/macx-ios-clang/features/resolve_config.prf index a964ee3278..22d962af38 100644 --- a/mkspecs/macx-ios-clang/features/resolve_config.prf +++ b/mkspecs/macx-ios-clang/features/resolve_config.prf @@ -32,9 +32,9 @@ macx-xcode { } else { # Switch the order to make sure that the first Makefile target is the right one !contains(QT_CONFIG, simulator_and_device):contains(QMAKE_MAC_SDK, ^$${simulator.sdk}.*): \ - addExclusiveBuilds(simulator, device) + addExclusiveBuildsProper(simulator_and_device, simulator device) else: \ - addExclusiveBuilds(device, simulator) + addExclusiveBuildsProper(simulator_and_device, device simulator) } equals(TEMPLATE, subdirs) { From db6c31af0177025f178cb42d5febbdc47dc87778 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Fri, 11 Nov 2016 12:34:54 -0800 Subject: [PATCH 019/174] qmake: fix installation of asset catalog files This strips leading whitespace from asset catalog filenames, which was causing installation to fail due to incorrectly calculated paths. Task-number: QTBUG-57090 Change-Id: I80db627262f9d58f4403e2d8ab205bef2113992b (cherry picked from commit addf1f45f3e2c37a09ef7f7bab909467c2bf79f7) Reviewed-by: Jake Petroules Reviewed-by: Oswald Buddenhagen --- mkspecs/features/mac/asset_catalogs.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/mac/asset_catalogs.prf b/mkspecs/features/mac/asset_catalogs.prf index 57d93d56d5..87875136c2 100644 --- a/mkspecs/features/mac/asset_catalogs.prf +++ b/mkspecs/features/mac/asset_catalogs.prf @@ -65,7 +65,7 @@ actool_output_files = $$system(\ mkdir -p $$system_quote($$QMAKE_ASSET_CATALOGS_BUILD_PATH) && \ /usr/libexec/PlistBuddy -c \'Print :com.apple.actool.compilation-results:output-files\' \ - /dev/stdin <<< $($${asset_catalog_compiler.commands} 2>/dev/null) | grep \'^ .*$\', lines) + /dev/stdin <<< $($${asset_catalog_compiler.commands} 2>/dev/null) | sed -Ene \'s/^ +//p\', lines) for (output_file, actool_output_files) { !equals(output_file, $$asset_catalog_compiler.target): \ From a56dd0b82855dd91d95159de4b568203a026b66c Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 18 Jan 2016 17:07:56 +0100 Subject: [PATCH 020/174] tst_QDateTimeEdit: Use base method, not direct member access A test was directly accessing the .text member of QDateTimeParser (which presently has nothing private). Use the virtual .displayText() method of this base instead, to let the base have some hope of data-hiding (maybe, some day). Change-Id: I8b6e39fba130de56f117bffb2aec346197969c5b Reviewed-by: Timur Pocheptsov --- tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp index 08a28f3ea0..ee54b16990 100644 --- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp +++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp @@ -3749,7 +3749,7 @@ void tst_QDateTimeEdit::dateEditCorrectSectionSize() QTest::keyClick(&edit, keyPair.first, keyPair.second); QDateTimeEditPrivate* edit_d_ptr(static_cast(qt_widget_private(&edit))); - QCOMPARE(edit_d_ptr->text, expectedDisplayString); + QCOMPARE(edit_d_ptr->QDateTimeParser::displayText(), expectedDisplayString); } #endif From 1a3a8cf87b322b45fe38db7c270ce8235e979d3b Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 17 Nov 2016 11:17:33 +0100 Subject: [PATCH 021/174] QDeadlineTimer: mark more functions nothrow Change-Id: I3be9c69b46901311e9150a7f718707d8ff523e9e Reviewed-by: Thiago Macieira --- src/corelib/kernel/qdeadlinetimer.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/corelib/kernel/qdeadlinetimer.h b/src/corelib/kernel/qdeadlinetimer.h index 3b97b89359..aa0f735fcc 100644 --- a/src/corelib/kernel/qdeadlinetimer.h +++ b/src/corelib/kernel/qdeadlinetimer.h @@ -62,7 +62,7 @@ public: : t1(std::numeric_limits::max()), t2(0), type(type_) {} explicit QDeadlineTimer(qint64 msecs, Qt::TimerType type = Qt::CoarseTimer) Q_DECL_NOTHROW; - void swap(QDeadlineTimer &other) + void swap(QDeadlineTimer &other) Q_DECL_NOTHROW { qSwap(t1, other.t1); qSwap(t2, other.t2); qSwap(type, other.type); } Q_DECL_CONSTEXPR bool isForever() const Q_DECL_NOTHROW @@ -88,17 +88,17 @@ public: static QDeadlineTimer addNSecs(QDeadlineTimer dt, qint64 nsecs) Q_DECL_NOTHROW Q_DECL_PURE_FUNCTION; static QDeadlineTimer current(Qt::TimerType timerType = Qt::CoarseTimer) Q_DECL_NOTHROW; - friend bool operator==(QDeadlineTimer d1, QDeadlineTimer d2) + friend bool operator==(QDeadlineTimer d1, QDeadlineTimer d2) Q_DECL_NOTHROW { return d1.t1 == d2.t1 && d1.t2 == d2.t2; } - friend bool operator!=(QDeadlineTimer d1, QDeadlineTimer d2) + friend bool operator!=(QDeadlineTimer d1, QDeadlineTimer d2) Q_DECL_NOTHROW { return !(d1 == d2); } - friend bool operator<(QDeadlineTimer d1, QDeadlineTimer d2) + friend bool operator<(QDeadlineTimer d1, QDeadlineTimer d2) Q_DECL_NOTHROW { return d1.t1 < d2.t1 || (d1.t1 == d2.t1 && d1.t2 < d2.t2); } - friend bool operator<=(QDeadlineTimer d1, QDeadlineTimer d2) + friend bool operator<=(QDeadlineTimer d1, QDeadlineTimer d2) Q_DECL_NOTHROW { return d1 == d2 || d1 < d2; } - friend bool operator>(QDeadlineTimer d1, QDeadlineTimer d2) + friend bool operator>(QDeadlineTimer d1, QDeadlineTimer d2) Q_DECL_NOTHROW { return d2 < d1; } - friend bool operator>=(QDeadlineTimer d1, QDeadlineTimer d2) + friend bool operator>=(QDeadlineTimer d1, QDeadlineTimer d2) Q_DECL_NOTHROW { return !(d1 < d2); } friend QDeadlineTimer operator+(QDeadlineTimer dt, qint64 msecs) From f817a995b2f72d4d293816de7ae05b37585eb48d Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Mon, 14 Nov 2016 12:16:20 +0100 Subject: [PATCH 022/174] tst_qhooks: test that it's possible to chain multiple hooks together Chaining hooks together was mentioned by Ossi in the comments of d953d9a4. This patch justs add a test that verifies that it works, and also serves as an informal example for developers looking how to do it. Change-Id: I53a014d5663c289ea0559e0926ed301f4e5110e6 Reviewed-by: Oswald Buddenhagen Reviewed-by: hjk --- .../auto/corelib/global/qhooks/tst_qhooks.cpp | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp index f0685d64c5..5fa7566e86 100644 --- a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp +++ b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp @@ -35,10 +35,18 @@ class tst_QHooks: public QObject Q_OBJECT private slots: + void cleanup(); void testVersion(); void testAddRemoveObject(); + void testChaining(); }; +void tst_QHooks::cleanup() +{ + qtHookData[QHooks::AddQObject] = 0; + qtHookData[QHooks::RemoveQObject] = 0; +} + void tst_QHooks::testVersion() { QVERIFY(qtHookData[QHooks::HookDataVersion] >= 3); @@ -73,5 +81,67 @@ void tst_QHooks::testAddRemoveObject() QCOMPARE(objectCount, 0); } +static QVector hookOrder; + +static QHooks::AddQObjectCallback existingAddHook = 0; +static QHooks::RemoveQObjectCallback existingRemoveHook = 0; + +static void firstAddHook(QObject *) +{ + hookOrder.append(QLatin1String("firstAddHook")); +} + +static void firstRemoveHook(QObject *) +{ + hookOrder.append(QLatin1String("firstRemoveHook")); +} + +static void secondAddHook(QObject *object) +{ + if (existingAddHook) + existingAddHook(object); + + hookOrder.append(QLatin1String("secondAddHook")); +} + +static void secondRemoveHook(QObject *object) +{ + if (existingRemoveHook) + existingRemoveHook(object); + + hookOrder.append(QLatin1String("secondRemoveHook")); +} + +// Tests that it's possible to "chain" hooks together (i.e. have multiple hooks) +void tst_QHooks::testChaining() +{ + QCOMPARE(qtHookData[QHooks::AddQObject], (quintptr)0); + QCOMPARE(qtHookData[QHooks::RemoveQObject], (quintptr)0); + + // Set the add and remove hooks (could just skip this and go straight to the next step, + // but it's for illustrative purposes). + qtHookData[QHooks::AddQObject] = (quintptr)&firstAddHook; + qtHookData[QHooks::RemoveQObject] = (quintptr)&firstRemoveHook; + + // Store them so that we can call them later. + existingAddHook = reinterpret_cast(qtHookData[QHooks::AddQObject]); + existingRemoveHook = reinterpret_cast(qtHookData[QHooks::RemoveQObject]); + + // Overide them with hooks that call them first. + qtHookData[QHooks::AddQObject] = (quintptr)&secondAddHook; + qtHookData[QHooks::RemoveQObject] = (quintptr)&secondRemoveHook; + + QObject *obj = new QObject; + QCOMPARE(hookOrder.size(), 2); + QCOMPARE(hookOrder.at(0), QLatin1String("firstAddHook")); + QCOMPARE(hookOrder.at(1), QLatin1String("secondAddHook")); + delete obj; + QCOMPARE(hookOrder.size(), 4); + QCOMPARE(hookOrder.at(2), QLatin1String("firstRemoveHook")); + QCOMPARE(hookOrder.at(3), QLatin1String("secondRemoveHook")); + + hookOrder.clear(); +} + QTEST_APPLESS_MAIN(tst_QHooks) #include "tst_qhooks.moc" From 4b1c343e5e8f75b567e88541c1b8ea89a3a5b666 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 15 Nov 2016 15:11:00 +0100 Subject: [PATCH 023/174] Doc: Add missing reference to qInfo() Change-Id: I7438aa8ff9fddf2e0155ffe0d442f96d4d9265d4 Reviewed-by: Leena Miettinen --- src/corelib/global/qlogging.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index eb26b6198d..6b95449b3d 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -1748,7 +1748,7 @@ void qErrnoWarning(int code, const char *msg, ...) \snippet code/src_corelib_global_qglobal.cpp 23 - \sa QtMessageHandler, QtMsgType, qDebug(), qWarning(), qCritical(), qFatal(), + \sa QtMessageHandler, QtMsgType, qDebug(), qInfo(), qWarning(), qCritical(), qFatal(), {Debugging Techniques} */ From 0d2f0164f45cb626c40a7c95026ba00fa56ac249 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 15 Nov 2016 15:12:16 +0100 Subject: [PATCH 024/174] Also release winmain, qopenglextensions under commercial licenses Add commercial licenses as an alternative to BSD for code that is statically linked into applications by default. BSD requires attribution even for commercial customers, which is not intended. This is a manual backport of parts of change 71404b0be146 in 5.7, and should be dropped when merging to 5.7. [ChangeLog][License Changes] Static libraries that are linked into executables (winmain and qopenglextensions) are now licensed under BSD _and_ commercial licenses. Change-Id: I0d33bc09c06548d63b11a39027e9bb12c1b9a915 Reviewed-by: Lars Knoll --- header.BSD-NEW | 50 ++++++++++++++++++++++ src/openglextensions/qopenglextensions.cpp | 14 +++++- src/openglextensions/qopenglextensions.h | 14 +++++- src/winmain/qtmain_win.cpp | 16 +++++-- src/winmain/qtmain_winrt.cpp | 16 +++++-- util/glgen/qopenglextensions.cpp.header | 14 +++++- util/glgen/qopenglextensions.h.header | 14 +++++- 7 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 header.BSD-NEW diff --git a/header.BSD-NEW b/header.BSD-NEW new file mode 100644 index 0000000000..980b021aad --- /dev/null +++ b/header.BSD-NEW @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the FOO module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD-NEW$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/src/openglextensions/qopenglextensions.cpp b/src/openglextensions/qopenglextensions.cpp index 37c5a5d1f0..f35d5b298a 100644 --- a/src/openglextensions/qopenglextensions.cpp +++ b/src/openglextensions/qopenglextensions.cpp @@ -5,8 +5,18 @@ ** ** This file is part of the QtGui module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** $QT_BEGIN_LICENSE:BSD-NEW$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/openglextensions/qopenglextensions.h b/src/openglextensions/qopenglextensions.h index c9d1ef1267..7ecdee44c0 100644 --- a/src/openglextensions/qopenglextensions.h +++ b/src/openglextensions/qopenglextensions.h @@ -5,8 +5,18 @@ ** ** This file is part of the QtGui module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** $QT_BEGIN_LICENSE:BSD-NEW$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/winmain/qtmain_win.cpp b/src/winmain/qtmain_win.cpp index 2944e07e00..da3d722aa6 100644 --- a/src/winmain/qtmain_win.cpp +++ b/src/winmain/qtmain_win.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2016 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the Windows main function of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** $QT_BEGIN_LICENSE:BSD-NEW$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/winmain/qtmain_winrt.cpp b/src/winmain/qtmain_winrt.cpp index 81ca07e447..a11efc1b74 100644 --- a/src/winmain/qtmain_winrt.cpp +++ b/src/winmain/qtmain_winrt.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2016 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the Windows main function of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** $QT_BEGIN_LICENSE:BSD-NEW$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/util/glgen/qopenglextensions.cpp.header b/util/glgen/qopenglextensions.cpp.header index 1127d0bb20..a5ced11ce1 100644 --- a/util/glgen/qopenglextensions.cpp.header +++ b/util/glgen/qopenglextensions.cpp.header @@ -5,8 +5,18 @@ ** ** This file is part of the QtGui module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** $QT_BEGIN_LICENSE:BSD-NEW$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/util/glgen/qopenglextensions.h.header b/util/glgen/qopenglextensions.h.header index 8355163dcd..93dcb026d1 100644 --- a/util/glgen/qopenglextensions.h.header +++ b/util/glgen/qopenglextensions.h.header @@ -5,8 +5,18 @@ ** ** This file is part of the QtGui module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** $QT_BEGIN_LICENSE:BSD-NEW$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are From cb0d8ffdd930ed0b8b3966e133e91d8de44b0239 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 16 Nov 2016 12:34:00 +0100 Subject: [PATCH 025/174] Extend manual test windowflags Change the main window to contain a QTabWidget and add a log widget logging relevant events on the top level widgets for testing changes. In the preview window, add new window flags of Qt 5 and output geometry, margins and window state in addition. Change-Id: Icec366223b6c163d58a69034687f3d9323a91533 Reviewed-by: Oliver Wolff --- tests/manual/windowflags/controllerwindow.cpp | 241 +++++++++++++--- tests/manual/windowflags/controllerwindow.h | 39 ++- tests/manual/windowflags/main.cpp | 8 + tests/manual/windowflags/previewwindow.cpp | 273 ++++++++++++------ tests/manual/windowflags/previewwindow.h | 31 +- 5 files changed, 437 insertions(+), 155 deletions(-) diff --git a/tests/manual/windowflags/controllerwindow.cpp b/tests/manual/windowflags/controllerwindow.cpp index 7196608aa5..d02f64c27b 100644 --- a/tests/manual/windowflags/controllerwindow.cpp +++ b/tests/manual/windowflags/controllerwindow.cpp @@ -26,20 +26,33 @@ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include - #include "controllerwindow.h" #include "controls.h" -//! [0] -ControllerWindow::ControllerWindow() : previewWidget(0) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#if QT_VERSION >= 0x050000 +# include +# include +# include +#endif +#include + +ControllerWidget::ControllerWidget(QWidget *parent) + : QWidget(parent) + , previewWidget(0) { parentWindow = new QMainWindow; parentWindow->setWindowTitle(tr("Preview parent window")); @@ -53,18 +66,6 @@ ControllerWindow::ControllerWindow() : previewWidget(0) createTypeGroupBox(); - quitButton = new QPushButton(tr("&Quit")); - connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit())); - - QHBoxLayout *bottomLayout = new QHBoxLayout; - bottomLayout->addStretch(); - - QPushButton *updateControlsButton = new QPushButton(tr("&Update")); - connect(updateControlsButton, SIGNAL(clicked()), this, SLOT(updateStateControl())); - - bottomLayout->addWidget(updateControlsButton); - bottomLayout->addWidget(quitButton); - hintsControl = new HintControl; hintsControl->setHints(previewWindow->windowFlags()); connect(hintsControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(updatePreview())); @@ -78,39 +79,30 @@ ControllerWindow::ControllerWindow() : previewWidget(0) typeControl->setType(previewWindow->windowFlags()); connect(typeControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(updatePreview())); - QVBoxLayout *mainLayout = new QVBoxLayout; + QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(widgetTypeGroupBox); mainLayout->addWidget(additionalOptionsGroupBox); mainLayout->addWidget(typeControl); mainLayout->addWidget(hintsControl); mainLayout->addWidget(statesControl); - mainLayout->addLayout(bottomLayout); - setLayout(mainLayout); - setWindowTitle(tr("Window Flags (Qt version %1, %2)") - .arg(QLatin1String(qVersion()), -#if QT_VERSION >= 0x050000 - qApp->platformName())); -#else - QLatin1String(""))); -#endif updatePreview(); } -bool ControllerWindow::eventFilter(QObject *, QEvent *e) +bool ControllerWidget::eventFilter(QObject *, QEvent *e) { if (e->type() == QEvent::WindowStateChange) updateStateControl(); return false; } -void ControllerWindow::updateStateControl() +void ControllerWidget::updateStateControl() { if (previewWidget) statesControl->setStates(previewWidget->windowState()); } -void ControllerWindow::updatePreview() +void ControllerWidget::updatePreview() { const Qt::WindowFlags flags = typeControl->type() | hintsControl->hints(); @@ -154,7 +146,7 @@ void ControllerWindow::updatePreview() previewWidget->setVisible(statesControl->visibleValue()); } -void ControllerWindow::createTypeGroupBox() +void ControllerWidget::createTypeGroupBox() { widgetTypeGroupBox = new QGroupBox(tr("Widget Type")); previewWidgetButton = createRadioButton(tr("QWidget")); @@ -173,24 +165,181 @@ void ControllerWindow::createTypeGroupBox() l->addWidget(fixedSizeWindowCheckBox); additionalOptionsGroupBox->setLayout(l); } -//! [5] -//! [6] - -//! [7] -QCheckBox *ControllerWindow::createCheckBox(const QString &text) +QCheckBox *ControllerWidget::createCheckBox(const QString &text) { QCheckBox *checkBox = new QCheckBox(text); connect(checkBox, SIGNAL(clicked()), this, SLOT(updatePreview())); return checkBox; } -//! [7] -//! [8] -QRadioButton *ControllerWindow::createRadioButton(const QString &text) +QRadioButton *ControllerWidget::createRadioButton(const QString &text) { QRadioButton *button = new QRadioButton(text); connect(button, SIGNAL(clicked()), this, SLOT(updatePreview())); return button; } -//! [8] + +static bool isTopLevel(const QObject *o) +{ + if (o->isWidgetType()) + return static_cast(o)->isWindow(); +#if QT_VERSION >= 0x050000 + if (o->isWindowType()) + return static_cast(o)->isTopLevel(); +#endif + return false; +} + +static Qt::WindowState windowState(const QObject *o) +{ + if (o->isWidgetType()) { + Qt::WindowStates states = static_cast(o)->windowState(); + states &= ~Qt::WindowActive; + return static_cast(int(states)); + } +#if QT_VERSION >= 0x050000 + if (o->isWindowType()) + return static_cast(o)->windowState(); +#endif + return Qt::WindowNoState; +} + +class EventFilter : public QObject { +public: + explicit EventFilter(QObject *parent = 0) : QObject(parent) {} + + bool eventFilter(QObject *o, QEvent *e) + { + switch (e->type()) { + case QEvent::Move: + case QEvent::Resize: + case QEvent::WindowStateChange: + case QEvent::ApplicationActivate: + case QEvent::ApplicationDeactivate: +#if QT_VERSION >= 0x050000 + case QEvent::ApplicationStateChange: +#endif + if (isTopLevel(o)) + formatEvent(o, e); + break; + default: + break; + } + return QObject::eventFilter(o ,e); + } + +private: + void formatEvent(QObject *o, QEvent *e) + { + static int n = 0; + QDebug debug = qDebug().nospace(); +#if QT_VERSION >= 0x050000 + debug.noquote(); +#endif + debug << '#' << n++ << ' ' << o->metaObject()->className(); + const QString name = o->objectName(); + if (!name.isEmpty()) + debug << "/\"" << name << '"'; + debug << ' ' << e; + if (e->type() == QEvent::WindowStateChange) + debug << ' ' << windowState(o); + } +}; + +LogWidget *LogWidget::m_instance = 0; + +#if QT_VERSION >= 0x050000 +static void qt5MessageHandler(QtMsgType, const QMessageLogContext &, const QString &text) +{ + if (LogWidget *lw = LogWidget::instance()) + lw->appendText(text); +} +#else // Qt 5 +static void qt4MessageHandler(QtMsgType, const char *text) +{ + if (LogWidget *lw = LogWidget::instance()) + lw->appendText(QString::fromLocal8Bit(text)); +} +#endif // Qt 4 + +LogWidget::LogWidget(QWidget *parent) + : QPlainTextEdit(parent) +{ + LogWidget::m_instance = this; + setReadOnly(true); + appendText(startupMessage()); +} + +LogWidget::~LogWidget() +{ + LogWidget::m_instance = 0; +} + +void LogWidget::install() +{ +#if QT_VERSION >= 0x050000 + qInstallMessageHandler(qt5MessageHandler); +#else + qInstallMsgHandler(qt4MessageHandler); +#endif +} + +QString LogWidget::startupMessage() +{ + QString result; +#if QT_VERSION >= 0x050300 + result += QLatin1String(QLibraryInfo::build()); +#else + result += QLatin1String("Qt ") + QLatin1String(QT_VERSION_STR); +#endif +#if QT_VERSION >= 0x050000 + result += QLatin1Char(' '); + result += QGuiApplication::platformName(); +#endif + return result; +} + +void LogWidget::appendText(const QString &message) +{ + appendPlainText(message); + ensureCursorVisible(); +} + +ControllerWindow::ControllerWindow() +{ + setWindowTitle(tr("Window Flags (Qt version %1, %2)") + .arg(QLatin1String(qVersion()), +#if QT_VERSION >= 0x050000 + qApp->platformName())); +#else + QLatin1String(""))); +#endif + + QVBoxLayout *layout = new QVBoxLayout(this); + QTabWidget *tabWidget = new QTabWidget(this); + ControllerWidget *controllerWidget = new ControllerWidget(tabWidget); + tabWidget->addTab(controllerWidget, tr("Control")); + LogWidget *logWidget = new LogWidget(tabWidget); + tabWidget->addTab(logWidget, tr("Event log")); + layout->addWidget(tabWidget); + + QHBoxLayout *bottomLayout = new QHBoxLayout; + layout->addLayout(bottomLayout); + bottomLayout->addStretch(); + QPushButton *updateControlsButton = new QPushButton(tr("&Update")); + connect(updateControlsButton, SIGNAL(clicked()), controllerWidget, SLOT(updateStateControl())); + bottomLayout->addWidget(updateControlsButton); + QPushButton *clearLogButton = new QPushButton(tr("Clear &Log")); + connect(clearLogButton, SIGNAL(clicked()), logWidget, SLOT(clear())); + bottomLayout->addWidget(clearLogButton); + QPushButton *quitButton = new QPushButton(tr("&Quit")); + connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit())); + quitButton->setShortcut(Qt::CTRL + Qt::Key_Q); + bottomLayout->addWidget(quitButton); +} + +void ControllerWindow::registerEventFilter() +{ + qApp->installEventFilter(new EventFilter(qApp)); +} diff --git a/tests/manual/windowflags/controllerwindow.h b/tests/manual/windowflags/controllerwindow.h index 81126085ea..43a125a9ae 100644 --- a/tests/manual/windowflags/controllerwindow.h +++ b/tests/manual/windowflags/controllerwindow.h @@ -29,7 +29,7 @@ #ifndef CONTROLLERWINDOW_H #define CONTROLLERWINDOW_H -#include +#include #include "previewwindow.h" @@ -46,13 +46,12 @@ class HintControl; class WindowStatesControl; class TypeControl; -//! [0] -class ControllerWindow : public QWidget +class ControllerWidget : public QWidget { Q_OBJECT public: - ControllerWindow(); + explicit ControllerWidget(QWidget *parent = 0); virtual bool eventFilter(QObject *o, QEvent *e); @@ -75,13 +74,37 @@ private: HintControl *hintsControl; WindowStatesControl *statesControl; - QPushButton *quitButton; - QRadioButton *previewWidgetButton; QRadioButton *previewDialogButton; QCheckBox *modalWindowCheckBox; QCheckBox *fixedSizeWindowCheckBox; }; -//! [0] -#endif +class LogWidget : public QPlainTextEdit +{ + Q_OBJECT +public: + explicit LogWidget(QWidget *parent = 0); + ~LogWidget(); + + static LogWidget *instance() { return m_instance; } + static void install(); + +public slots: + void appendText(const QString &); + +private: + static QString startupMessage(); + + static LogWidget *m_instance; +}; + +class ControllerWindow : public QWidget { + Q_OBJECT +public: + ControllerWindow(); + + void registerEventFilter(); +}; + +#endif // CONTROLLERWINDOW_H diff --git a/tests/manual/windowflags/main.cpp b/tests/manual/windowflags/main.cpp index 86825dbb0d..a7d7307525 100644 --- a/tests/manual/windowflags/main.cpp +++ b/tests/manual/windowflags/main.cpp @@ -27,13 +27,21 @@ ****************************************************************************/ #include +#include #include "controllerwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); + QStringList arguments = QCoreApplication::arguments(); + arguments.pop_front(); + ControllerWindow controller; + if (!arguments.contains(QLatin1String("-l"))) + LogWidget::install(); + if (!arguments.contains(QLatin1String("-e"))) + controller.registerEventFilter(); controller.show(); return app.exec(); } diff --git a/tests/manual/windowflags/previewwindow.cpp b/tests/manual/windowflags/previewwindow.cpp index 11810763e7..54084fd1bc 100644 --- a/tests/manual/windowflags/previewwindow.cpp +++ b/tests/manual/windowflags/previewwindow.cpp @@ -26,136 +26,235 @@ ** ****************************************************************************/ -#include +#include #include +#include #include +#include +#include #include "previewwindow.h" -static QString windowFlagsToString(Qt::WindowFlags flags) +static void formatWindowFlags(QTextStream &str, Qt::WindowFlags flags) { - QString text; - - Qt::WindowFlags type = (flags & Qt::WindowType_Mask); - if (type == Qt::Window) { - text = "Qt::Window"; - } else if (type == Qt::Dialog) { - text = "Qt::Dialog"; - } else if (type == Qt::Sheet) { - text = "Qt::Sheet"; - } else if (type == Qt::Drawer) { - text = "Qt::Drawer"; - } else if (type == Qt::Popup) { - text = "Qt::Popup"; - } else if (type == Qt::Tool) { - text = "Qt::Tool"; - } else if (type == Qt::ToolTip) { - text = "Qt::ToolTip"; - } else if (type == Qt::SplashScreen) { - text = "Qt::SplashScreen"; + str << "Window flags: " << hex << showbase << unsigned(flags) << noshowbase << dec << ' '; + switch (flags & Qt::WindowType_Mask) { + case Qt::Window: + str << "Qt::Window"; + break; + case Qt::Dialog: + str << "Qt::Dialog"; + break; + case Qt::Sheet: + str << "Qt::Sheet"; + break; + case Qt::Drawer: + str << "Qt::Drawer"; + break; + case Qt::Popup: + str << "Qt::Popup"; + break; + case Qt::Tool: + str << "Qt::Tool"; + break; + case Qt::ToolTip: + str << "Qt::ToolTip"; + break; + case Qt::SplashScreen: + str << "Qt::SplashScreen"; + break; } if (flags & Qt::MSWindowsFixedSizeDialogHint) - text += "\n| Qt::MSWindowsFixedSizeDialogHint"; + str << "\n| Qt::MSWindowsFixedSizeDialogHint"; +#if QT_VERSION >= 0x050000 + if (flags & Qt::BypassWindowManagerHint) + str << "\n| Qt::BypassWindowManagerHint"; +#else if (flags & Qt::X11BypassWindowManagerHint) - text += "\n| Qt::X11BypassWindowManagerHint"; + str << "\n| Qt::X11BypassWindowManagerHint"; +#endif if (flags & Qt::FramelessWindowHint) - text += "\n| Qt::FramelessWindowHint"; + str << "\n| Qt::FramelessWindowHint"; if (flags & Qt::WindowTitleHint) - text += "\n| Qt::WindowTitleHint"; + str << "\n| Qt::WindowTitleHint"; if (flags & Qt::WindowSystemMenuHint) - text += "\n| Qt::WindowSystemMenuHint"; + str << "\n| Qt::WindowSystemMenuHint"; if (flags & Qt::WindowMinimizeButtonHint) - text += "\n| Qt::WindowMinimizeButtonHint"; + str << "\n| Qt::WindowMinimizeButtonHint"; if (flags & Qt::WindowMaximizeButtonHint) - text += "\n| Qt::WindowMaximizeButtonHint"; + str << "\n| Qt::WindowMaximizeButtonHint"; if (flags & Qt::WindowCloseButtonHint) - text += "\n| Qt::WindowCloseButtonHint"; + str << "\n| Qt::WindowCloseButtonHint"; if (flags & Qt::WindowContextHelpButtonHint) - text += "\n| Qt::WindowContextHelpButtonHint"; + str << "\n| Qt::WindowContextHelpButtonHint"; if (flags & Qt::WindowShadeButtonHint) - text += "\n| Qt::WindowShadeButtonHint"; + str << "\n| Qt::WindowShadeButtonHint"; if (flags & Qt::WindowStaysOnTopHint) - text += "\n| Qt::WindowStaysOnTopHint"; + str << "\n| Qt::WindowStaysOnTopHint"; if (flags & Qt::CustomizeWindowHint) - text += "\n| Qt::CustomizeWindowHint"; - return text; + str << "\n| Qt::CustomizeWindowHint"; + if (flags & Qt::WindowStaysOnBottomHint) + str << "\n| Qt::WindowStaysOnBottomHint"; +#if QT_VERSION >= 0x050000 + if (flags & Qt::WindowFullscreenButtonHint) + str << "\n| Qt::WindowFullscreenButtonHint"; + if (flags & Qt::WindowTransparentForInput) + str << "\n| Qt::WindowTransparentForInput"; + if (flags & Qt::WindowOverridesSystemGestures) + str << "\n| Qt::WindowOverridesSystemGestures"; + if (flags & Qt::WindowDoesNotAcceptFocus) + str << "\n| Qt::WindowDoesNotAcceptFocus"; + if (flags & Qt::MaximizeUsingFullscreenGeometryHint) + str << "\n| Qt::MaximizeUsingFullscreenGeometryHint"; + if (flags & Qt::NoDropShadowWindowHint) + str << "\n| Qt::NoDropShadowWindowHint"; +#endif // Qt 5 +} + +static void formatWindowStates(QTextStream &str, Qt::WindowStates states) +{ + str << "Window states: " << hex << showbase << unsigned(states) << noshowbase << dec << ' '; + if (states & Qt::WindowActive) { + str << "Qt::WindowActive "; + states &= ~Qt::WindowActive; + } + switch (states) { + case Qt::WindowNoState: + str << "Qt::WindowNoState"; + break; + case Qt::WindowMinimized: + str << "Qt::WindowMinimized"; + break; + case Qt::WindowMaximized: + str << "Qt::WindowMaximized"; + break; + case Qt::WindowFullScreen: + str << "Qt::WindowFullScreen"; + break; + default: + break; + } +} + +QTextStream &operator<<(QTextStream &str, const QRect &r) +{ + str << r.width() << 'x' << r.height() << forcesign << r.x() << r.y() << noforcesign; + return str; +} + +static QString formatWidgetInfo(const QWidget *w) +{ + QString result; + QTextStream str(&result); + formatWindowFlags(str, w->windowFlags()); + str << '\n'; + formatWindowStates(str, w->windowState()); + const QRect frame = w->frameGeometry(); + const QRect geometry = w->geometry(); + str << "\n\nFrame: " << frame << "\nGeometry: " << geometry << "\nMargins: " + << (geometry.x() - frame.x()) << ", " << (geometry.top() - frame.top()) + << ", " << (frame.right() - geometry.right()) << ", " + << (frame.bottom() - geometry.bottom()); + return result; +} + +static QPlainTextEdit *createControlPanel(QWidget *widget) +{ + QVBoxLayout *layout = new QVBoxLayout(widget); + QPlainTextEdit *textEdit = new QPlainTextEdit; + textEdit->setReadOnly(true); + textEdit->setLineWrapMode(QPlainTextEdit::NoWrap); + layout->addWidget(textEdit); + + QHBoxLayout *bottomLayout = new QHBoxLayout; + layout ->addLayout(bottomLayout); + QGridLayout *buttonLayout = new QGridLayout; + bottomLayout->addStretch(); + bottomLayout->addLayout(buttonLayout); + QPushButton *showNormalButton = new QPushButton(PreviewWindow::tr("Show normal")); + QObject::connect(showNormalButton, SIGNAL(clicked()), widget, SLOT(showNormal())); + buttonLayout->addWidget(showNormalButton, 0, 0); + QPushButton *showMinimizedButton = new QPushButton(PreviewWindow::tr("Show minimized")); + QObject::connect(showMinimizedButton, SIGNAL(clicked()), widget, SLOT(showMinimized())); + buttonLayout->addWidget(showMinimizedButton, 0, 1); + QPushButton *showMaximizedButton = new QPushButton(PreviewWindow::tr("Show maximized")); + QObject::connect(showMaximizedButton, SIGNAL(clicked()), widget, SLOT(showMaximized())); + buttonLayout->addWidget(showMaximizedButton, 0, 2); + QPushButton *showFullScreenButton = new QPushButton(PreviewWindow::tr("Show fullscreen")); + QObject::connect(showFullScreenButton, SIGNAL(clicked()), widget, SLOT(showFullScreen())); + buttonLayout->addWidget(showFullScreenButton, 0, 3); + + QPushButton *updateInfoButton = new QPushButton(PreviewWindow::tr("&Update Info")); + QObject::connect(updateInfoButton, SIGNAL(clicked()), widget, SLOT(updateInfo())); + buttonLayout->addWidget(updateInfoButton, 1, 0); + QPushButton *closeButton = new QPushButton(PreviewWindow::tr("&Close")); + QObject::connect(closeButton, SIGNAL(clicked()), widget, SLOT(close())); + buttonLayout->addWidget(closeButton, 1, 3); + + return textEdit; } PreviewWindow::PreviewWindow(QWidget *parent) : QWidget(parent) { - textEdit = new QTextEdit; - textEdit->setReadOnly(true); - textEdit->setLineWrapMode(QTextEdit::NoWrap); + textEdit = createControlPanel(this); + setWindowTitle(tr("Preview Qt %1").arg(QLatin1String(QT_VERSION_STR))); +} - closeButton = new QPushButton(tr("&Close")); - connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); +void PreviewWindow::resizeEvent(QResizeEvent *e) +{ + QWidget::resizeEvent(e); + updateInfo(); +} - showNormalButton = new QPushButton(tr("Show normal")); - connect(showNormalButton, SIGNAL(clicked()), this, SLOT(showNormal())); - showMinimizedButton = new QPushButton(tr("Show minimized")); - connect(showMinimizedButton, SIGNAL(clicked()), this, SLOT(showMinimized())); - showMaximizedButton = new QPushButton(tr("Show maximized")); - connect(showMaximizedButton, SIGNAL(clicked()), this, SLOT(showMaximized())); - showFullScreenButton = new QPushButton(tr("Show fullscreen")); - connect(showFullScreenButton, SIGNAL(clicked()), this, SLOT(showFullScreen())); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(textEdit); - layout->addWidget(showNormalButton); - layout->addWidget(showMinimizedButton); - layout->addWidget(showMaximizedButton); - layout->addWidget(showFullScreenButton); - layout->addWidget(closeButton); - setLayout(layout); - - setWindowTitle(tr("Preview ")); +void PreviewWindow::moveEvent(QMoveEvent *e) +{ + QWidget::moveEvent(e); + updateInfo(); } void PreviewWindow::setWindowFlags(Qt::WindowFlags flags) { + if (flags == windowFlags()) + return; QWidget::setWindowFlags(flags); + QTimer::singleShot(0, this, SLOT(updateInfo())); +} - QString text = windowFlagsToString(flags); - textEdit->setPlainText(text); +void PreviewWindow::updateInfo() +{ + textEdit->setPlainText(formatWidgetInfo(this)); } PreviewDialog::PreviewDialog(QWidget *parent) : QDialog(parent) { - textEdit = new QTextEdit; - textEdit->setReadOnly(true); - textEdit->setLineWrapMode(QTextEdit::NoWrap); + textEdit = createControlPanel(this); + setWindowTitle(tr("Preview Qt %1").arg(QLatin1String(QT_VERSION_STR))); +} - closeButton = new QPushButton(tr("&Close")); - connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); +void PreviewDialog::resizeEvent(QResizeEvent *e) +{ + QDialog::resizeEvent(e); + updateInfo(); +} - showNormalButton = new QPushButton(tr("Show normal")); - connect(showNormalButton, SIGNAL(clicked()), this, SLOT(showNormal())); - showMinimizedButton = new QPushButton(tr("Show minimized")); - connect(showMinimizedButton, SIGNAL(clicked()), this, SLOT(showMinimized())); - showMaximizedButton = new QPushButton(tr("Show maximized")); - connect(showMaximizedButton, SIGNAL(clicked()), this, SLOT(showMaximized())); - showFullScreenButton = new QPushButton(tr("Show fullscreen")); - connect(showFullScreenButton, SIGNAL(clicked()), this, SLOT(showFullScreen())); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(textEdit); - layout->addWidget(showNormalButton); - layout->addWidget(showMinimizedButton); - layout->addWidget(showMaximizedButton); - layout->addWidget(showFullScreenButton); - layout->addWidget(closeButton); - setLayout(layout); - - setWindowTitle(tr("Preview ")); +void PreviewDialog::moveEvent(QMoveEvent *e) +{ + QDialog::moveEvent(e); + updateInfo(); } void PreviewDialog::setWindowFlags(Qt::WindowFlags flags) { + if (flags == windowFlags()) + return; QWidget::setWindowFlags(flags); - - QString text = windowFlagsToString(flags); - textEdit->setPlainText(text); + QTimer::singleShot(0, this, SLOT(updateInfo())); +} + +void PreviewDialog::updateInfo() +{ + textEdit->setPlainText(formatWidgetInfo(this)); } diff --git a/tests/manual/windowflags/previewwindow.h b/tests/manual/windowflags/previewwindow.h index 00d5cc39f9..acd79735ad 100644 --- a/tests/manual/windowflags/previewwindow.h +++ b/tests/manual/windowflags/previewwindow.h @@ -32,8 +32,7 @@ #include QT_BEGIN_NAMESPACE -class QPushButton; -class QTextEdit; +class QPlainTextEdit; QT_END_NAMESPACE class PreviewWindow : public QWidget @@ -45,13 +44,15 @@ public: void setWindowFlags(Qt::WindowFlags flags); +public slots: + void updateInfo(); + +protected: + void resizeEvent(QResizeEvent *); + void moveEvent(QMoveEvent *); + private: - QTextEdit *textEdit; - QPushButton *closeButton; - QPushButton *showNormalButton; - QPushButton *showMinimizedButton; - QPushButton *showMaximizedButton; - QPushButton *showFullScreenButton; + QPlainTextEdit *textEdit; }; class PreviewDialog : public QDialog @@ -63,13 +64,15 @@ public: void setWindowFlags(Qt::WindowFlags flags); +public slots: + void updateInfo(); + +protected: + void resizeEvent(QResizeEvent *); + void moveEvent(QMoveEvent *); + private: - QTextEdit *textEdit; - QPushButton *closeButton; - QPushButton *showNormalButton; - QPushButton *showMinimizedButton; - QPushButton *showMaximizedButton; - QPushButton *showFullScreenButton; + QPlainTextEdit *textEdit; }; #endif From 32b99a38c563e4037362a25b2a749e2261bf16da Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 18 Nov 2016 10:02:33 +0100 Subject: [PATCH 026/174] PCRE: Document upstream version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also update copyright. Change-Id: I42a23701734c2c8d3ae43f70cc69dfb609b3a7a3 Reviewed-by: André Klitzing Reviewed-by: Topi Reiniö --- src/3rdparty/pcre/qt_attribution.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/3rdparty/pcre/qt_attribution.json b/src/3rdparty/pcre/qt_attribution.json index ec8832486b..fc7515175a 100644 --- a/src/3rdparty/pcre/qt_attribution.json +++ b/src/3rdparty/pcre/qt_attribution.json @@ -6,10 +6,11 @@ "Description": "The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5.", "Homepage": "http://www.pcre.org/", + "Version": "8.39", "License": "BSD 3-clause \"New\" or \"Revised\" License", "LicenseId": "BSD-3-Clause", "LicenseFile": "LICENCE", - "Copyright": "Copyright (c) 1997-2015 University of Cambridge -Copyright (c) 2010-2015 Zoltan Herczeg + "Copyright": "Copyright (c) 1997-2016 University of Cambridge +Copyright (c) 2009-2016 Zoltan Herczeg Copyright (c) 2007-2012, Google Inc." } From f1b4bd4790860e1ff5afcec111a359bc3a91cfda Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Tue, 15 Nov 2016 20:09:47 +0100 Subject: [PATCH 027/174] eglfs: fix eglfs_mali compile for odroid-mali Avoid duplicated struct fbdev_window definition (introduced by commit 58bed4cda98e8e25db8adc61c7db73b6853077dc) by renaming the local shadow definition to struct shadow_fbdev_window. Task-number: QTBUG-57156 Change-Id: I72b03f09fc57ddcd0284d6d3554a5658e02b80fc Reviewed-by: Laszlo Agocs Reviewed-by: Julien Corjon --- .../deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp index 43decdf849..aeba83f9bf 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp @@ -42,7 +42,7 @@ QT_BEGIN_NAMESPACE -struct fbdev_window { +struct shadow_fbdev_window { unsigned short width; unsigned short height; }; @@ -85,7 +85,7 @@ EGLNativeWindowType QEglFSMaliIntegration::createNativeWindow(QPlatformWindow *w Q_UNUSED(window); Q_UNUSED(format); - fbdev_window *fbwin = reinterpret_cast(malloc(sizeof(fbdev_window))); + shadow_fbdev_window *fbwin = reinterpret_cast(malloc(sizeof(shadow_fbdev_window))); if (NULL == fbwin) return 0; From 3691f7ca0c7117f18ea38ca3950ee9a8a91a53c8 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 20 Sep 2013 02:38:22 +0200 Subject: [PATCH 028/174] QFutureInterface: make accesses to 'state' thread-safe Introduce helper functions switch_{on,off,from_to} to make the code more readable, and prepare everything for later optimizations reducing the sizes of critical sections (by locking the mutex later, or even never). This commit, however, is only concerned with shutting up tsan. In waitForResult(), simplified the code by removing an unneeded if guard: the condition is checked in the while loop immediately following in the then-block, and the local variable declaration that precedes the loop is not worth guarding. Change-Id: I24bfd864ca96f862302536ad8662065e6f366fa8 Reviewed-by: David Faure --- src/corelib/thread/qfutureinterface.cpp | 109 ++++++++++++++---------- src/corelib/thread/qfutureinterface_p.h | 2 +- 2 files changed, 64 insertions(+), 47 deletions(-) diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp index 2fe038165b..a29f8ebba7 100644 --- a/src/corelib/thread/qfutureinterface.cpp +++ b/src/corelib/thread/qfutureinterface.cpp @@ -77,13 +77,33 @@ QFutureInterfaceBase::~QFutureInterfaceBase() delete d; } +static inline int switch_on(QAtomicInt &a, int which) +{ + return a.fetchAndOrRelaxed(which) | which; +} + +static inline int switch_off(QAtomicInt &a, int which) +{ + return a.fetchAndAndRelaxed(~which) & ~which; +} + +static inline int switch_from_to(QAtomicInt &a, int from, int to) +{ + int newValue; + int expected = a.load(); + do { + newValue = (expected & ~from) | to; + } while (!a.testAndSetRelaxed(expected, newValue, expected)); + return newValue; +} + void QFutureInterfaceBase::cancel() { QMutexLocker locker(&d->m_mutex); - if (d->state & Canceled) + if (d->state.load() & Canceled) return; - d->state = State((d->state & ~Paused) | Canceled); + switch_from_to(d->state, Paused, Canceled); d->waitCondition.wakeAll(); d->pausedWaitCondition.wakeAll(); d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Canceled)); @@ -93,10 +113,10 @@ void QFutureInterfaceBase::setPaused(bool paused) { QMutexLocker locker(&d->m_mutex); if (paused) { - d->state = State(d->state | Paused); + switch_on(d->state, Paused); d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Paused)); } else { - d->state = State(d->state & ~Paused); + switch_off(d->state, Paused); d->pausedWaitCondition.wakeAll(); d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Resumed)); } @@ -105,29 +125,24 @@ void QFutureInterfaceBase::setPaused(bool paused) void QFutureInterfaceBase::togglePaused() { QMutexLocker locker(&d->m_mutex); - if (d->state & Paused) { - d->state = State(d->state & ~Paused); + if (d->state.load() & Paused) { + switch_off(d->state, Paused); d->pausedWaitCondition.wakeAll(); d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Resumed)); } else { - d->state = State(d->state | Paused); + switch_on(d->state, Paused); d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Paused)); } } void QFutureInterfaceBase::setThrottled(bool enable) { - // bail out if we are not changing the state - if ((enable && (d->state & Throttled)) || (!enable && !(d->state & Throttled))) - return; - - // lock and change the state QMutexLocker lock(&d->m_mutex); if (enable) { - d->state = State(d->state | Throttled); + switch_on(d->state, Throttled); } else { - d->state = State(d->state & ~Throttled); - if (!(d->state & Paused)) + switch_off(d->state, Throttled); + if (!(d->state.load() & Paused)) d->pausedWaitCondition.wakeAll(); } } @@ -178,11 +193,15 @@ bool QFutureInterfaceBase::waitForNextResult() void QFutureInterfaceBase::waitForResume() { // return early if possible to avoid taking the mutex lock. - if ((d->state & Paused) == false || (d->state & Canceled)) - return; + { + const int state = d->state.load(); + if (!(state & Paused) || (state & Canceled)) + return; + } QMutexLocker lock(&d->m_mutex); - if ((d->state & Paused) == false || (d->state & Canceled)) + const int state = d->state.load(); + if (!(state & Paused) || (state & Canceled)) return; // decrease active thread count since this thread will wait. @@ -230,7 +249,7 @@ bool QFutureInterfaceBase::isProgressUpdateNeeded() const void QFutureInterfaceBase::reportStarted() { QMutexLocker locker(&d->m_mutex); - if ((d->state & Started) || (d->state & Canceled) || (d->state & Finished)) + if (d->state.load() & (Started|Canceled|Finished)) return; d->setState(State(Started | Running)); @@ -246,11 +265,11 @@ void QFutureInterfaceBase::reportCanceled() void QFutureInterfaceBase::reportException(const QException &exception) { QMutexLocker locker(&d->m_mutex); - if ((d->state & Canceled) || (d->state & Finished)) + if (d->state.load() & (Canceled|Finished)) return; d->m_exceptionStore.setException(exception); - d->state = State(d->state | Canceled); + switch_on(d->state, Canceled); d->waitCondition.wakeAll(); d->pausedWaitCondition.wakeAll(); d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Canceled)); @@ -260,8 +279,8 @@ void QFutureInterfaceBase::reportException(const QException &exception) void QFutureInterfaceBase::reportFinished() { QMutexLocker locker(&d->m_mutex); - if (!(d->state & Finished)) { - d->state = State((d->state & ~Running) | Finished); + if (!isFinished()) { + switch_from_to(d->state, Running, Finished); d->waitCondition.wakeAll(); d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Finished)); } @@ -281,7 +300,7 @@ int QFutureInterfaceBase::expectedResultCount() bool QFutureInterfaceBase::queryState(State state) const { - return (d->state & state); + return d->state.load() & state; } void QFutureInterfaceBase::waitForResult(int resultIndex) @@ -289,7 +308,7 @@ void QFutureInterfaceBase::waitForResult(int resultIndex) d->m_exceptionStore.throwPossibleException(); QMutexLocker lock(&d->m_mutex); - if (!(d->state & Running)) + if (!isRunning()) return; lock.unlock(); @@ -299,11 +318,9 @@ void QFutureInterfaceBase::waitForResult(int resultIndex) lock.relock(); - if (d->state & Running) { - const int waitIndex = (resultIndex == -1) ? INT_MAX : resultIndex; - while ((d->state & Running) && d->internal_isResultReadyAt(waitIndex) == false) - d->waitCondition.wait(&d->m_mutex); - } + const int waitIndex = (resultIndex == -1) ? INT_MAX : resultIndex; + while (isRunning() && !d->internal_isResultReadyAt(waitIndex)) + d->waitCondition.wait(&d->m_mutex); d->m_exceptionStore.throwPossibleException(); } @@ -311,7 +328,7 @@ void QFutureInterfaceBase::waitForResult(int resultIndex) void QFutureInterfaceBase::waitForFinished() { QMutexLocker lock(&d->m_mutex); - const bool alreadyFinished = !(d->state & Running); + const bool alreadyFinished = !isRunning(); lock.unlock(); if (!alreadyFinished) { @@ -319,7 +336,7 @@ void QFutureInterfaceBase::waitForFinished() lock.relock(); - while (d->state & Running) + while (isRunning()) d->waitCondition.wait(&d->m_mutex); } @@ -328,7 +345,7 @@ void QFutureInterfaceBase::waitForFinished() void QFutureInterfaceBase::reportResultsReady(int beginIndex, int endIndex) { - if ((d->state & Canceled) || (d->state & Finished) || beginIndex == endIndex) + if (beginIndex == endIndex || (d->state.load() & (Canceled|Finished))) return; d->waitCondition.wakeAll(); @@ -390,7 +407,7 @@ void QFutureInterfaceBase::setProgressValueAndText(int progressValue, if (d->m_progressValue >= progressValue) return; - if ((d->state & Canceled) || (d->state & Finished)) + if (d->state.load() & (Canceled|Finished)) return; if (d->internal_updateProgress(progressValue, progressText)) { @@ -462,10 +479,10 @@ bool QFutureInterfaceBasePrivate::internal_waitForNextResult() if (m_results.hasNextResult()) return true; - while ((state & QFutureInterfaceBase::Running) && m_results.hasNextResult() == false) + while ((state.load() & QFutureInterfaceBase::Running) && m_results.hasNextResult() == false) waitCondition.wait(&m_mutex); - return (!(state & QFutureInterfaceBase::Canceled) && m_results.hasNextResult()); + return !(state.load() & QFutureInterfaceBase::Canceled) && m_results.hasNextResult(); } bool QFutureInterfaceBasePrivate::internal_updateProgress(int progress, @@ -488,16 +505,16 @@ bool QFutureInterfaceBasePrivate::internal_updateProgress(int progress, void QFutureInterfaceBasePrivate::internal_setThrottled(bool enable) { // bail out if we are not changing the state - if ((enable && (state & QFutureInterfaceBase::Throttled)) - || (!enable && !(state & QFutureInterfaceBase::Throttled))) + if ((enable && (state.load() & QFutureInterfaceBase::Throttled)) + || (!enable && !(state.load() & QFutureInterfaceBase::Throttled))) return; // change the state if (enable) { - state = QFutureInterfaceBase::State(state | QFutureInterfaceBase::Throttled); + switch_on(state, QFutureInterfaceBase::Throttled); } else { - state = QFutureInterfaceBase::State(state & ~QFutureInterfaceBase::Throttled); - if (!(state & QFutureInterfaceBase::Paused)) + switch_off(state, QFutureInterfaceBase::Throttled); + if (!(state.load() & QFutureInterfaceBase::Paused)) pausedWaitCondition.wakeAll(); } } @@ -532,7 +549,7 @@ void QFutureInterfaceBasePrivate::connectOutputInterface(QFutureCallOutInterface { QMutexLocker locker(&m_mutex); - if (state & QFutureInterfaceBase::Started) { + if (state.load() & QFutureInterfaceBase::Started) { interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Started)); interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ProgressRange, m_progressMinimum, @@ -552,13 +569,13 @@ void QFutureInterfaceBasePrivate::connectOutputInterface(QFutureCallOutInterface it.batchedAdvance(); } - if (state & QFutureInterfaceBase::Paused) + if (state.load() & QFutureInterfaceBase::Paused) interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Paused)); - if (state & QFutureInterfaceBase::Canceled) + if (state.load() & QFutureInterfaceBase::Canceled) interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Canceled)); - if (state & QFutureInterfaceBase::Finished) + if (state.load() & QFutureInterfaceBase::Finished) interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Finished)); outputConnections.append(interface); @@ -577,7 +594,7 @@ void QFutureInterfaceBasePrivate::disconnectOutputInterface(QFutureCallOutInterf void QFutureInterfaceBasePrivate::setState(QFutureInterfaceBase::State newState) { - state = newState; + state.store(newState); } QT_END_NAMESPACE diff --git a/src/corelib/thread/qfutureinterface_p.h b/src/corelib/thread/qfutureinterface_p.h index e2d588cd07..eb0c38421b 100644 --- a/src/corelib/thread/qfutureinterface_p.h +++ b/src/corelib/thread/qfutureinterface_p.h @@ -155,7 +155,7 @@ public: int m_progressValue; // TQ int m_progressMinimum; // TQ int m_progressMaximum; // TQ - QFutureInterfaceBase::State state; + QAtomicInt state; // reads and writes can happen unprotected, both must be atomic QElapsedTimer progressTime; QWaitCondition pausedWaitCondition; QtPrivate::ResultStoreBase m_results; From d20773824529d191e7b483b505107dce6c1b1c3d Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 18 Nov 2016 16:54:09 +0100 Subject: [PATCH 029/174] Fix missing last modification time stamp in qrc content The time stamp is added at the end of the node information and consequently this also bumps the version. Task-number: QTBUG-57182 Change-Id: Ia10e006f28c0b168b2bcd74ed8b7098f84d10af3 Reviewed-by: hjk --- src/corelib/io/qresource.cpp | 65 +++++++++++++++---- src/corelib/io/qresource.h | 1 + src/tools/rcc/rcc.cpp | 46 +++++++++++-- src/tools/rcc/rcc.h | 1 + .../qresourceengine/tst_qresourceengine.cpp | 15 +++++ .../tools/rcc/data/images/images.expected | 10 ++- tests/auto/tools/rcc/tst_rcc.cpp | 17 ++++- 7 files changed, 133 insertions(+), 22 deletions(-) diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp index 7fe3753da4..72042e1600 100644 --- a/src/corelib/io/qresource.cpp +++ b/src/corelib/io/qresource.cpp @@ -101,35 +101,38 @@ class QResourceRoot Directory = 0x02 }; const uchar *tree, *names, *payloads; - inline int findOffset(int node) const { return node * 14; } //sizeof each tree element + int version; + inline int findOffset(int node) const { return node * (14 + (version >= 0x02 ? 8 : 0)); } //sizeof each tree element uint hash(int node) const; QString name(int node) const; short flags(int node) const; public: mutable QAtomicInt ref; - inline QResourceRoot(): tree(0), names(0), payloads(0) {} - inline QResourceRoot(const uchar *t, const uchar *n, const uchar *d) { setSource(t, n, d); } + inline QResourceRoot(): tree(0), names(0), payloads(0), version(0) {} + inline QResourceRoot(int version, const uchar *t, const uchar *n, const uchar *d) { setSource(version, t, n, d); } virtual ~QResourceRoot() { } int findNode(const QString &path, const QLocale &locale=QLocale()) const; inline bool isContainer(int node) const { return flags(node) & Directory; } inline bool isCompressed(int node) const { return flags(node) & Compressed; } const uchar *data(int node, qint64 *size) const; + QDateTime lastModified(int node) const; QStringList children(int node) const; virtual QString mappingRoot() const { return QString(); } bool mappingRootSubdir(const QString &path, QString *match=0) const; inline bool operator==(const QResourceRoot &other) const - { return tree == other.tree && names == other.names && payloads == other.payloads; } + { return tree == other.tree && names == other.names && payloads == other.payloads && version == other.version; } inline bool operator!=(const QResourceRoot &other) const { return !operator==(other); } enum ResourceRootType { Resource_Builtin, Resource_File, Resource_Buffer }; virtual ResourceRootType type() const { return Resource_Builtin; } protected: - inline void setSource(const uchar *t, const uchar *n, const uchar *d) { + inline void setSource(int v, const uchar *t, const uchar *n, const uchar *d) { tree = t; names = n; payloads = d; + version = v; } }; @@ -231,6 +234,7 @@ public: mutable qint64 size; mutable const uchar *data; mutable QStringList children; + mutable QDateTime lastModified; QResource *q_ptr; Q_DECLARE_PUBLIC(QResource) @@ -244,6 +248,7 @@ QResourcePrivate::clear() data = 0; size = 0; children.clear(); + lastModified = QDateTime(); container = 0; for(int i = 0; i < related.size(); ++i) { QResourceRoot *root = related.at(i); @@ -274,6 +279,7 @@ QResourcePrivate::load(const QString &file) size = 0; compressed = 0; } + lastModified = res->lastModified(node); } else if(res->isContainer(node) != container) { qWarning("QResourceInfo: Resource [%s] has both data and children!", file.toLatin1().constData()); } @@ -284,6 +290,7 @@ QResourcePrivate::load(const QString &file) data = 0; size = 0; compressed = 0; + lastModified = QDateTime(); res->ref.ref(); related.append(res); } @@ -513,6 +520,17 @@ const uchar *QResource::data() const return d->data; } +/*! + Returns the date and time when the file was last modified before + packaging into a resource. +*/ +QDateTime QResource::lastModified() const +{ + Q_D(const QResource); + d->ensureInitialized(); + return d->lastModified; +} + /*! Returns \c true if the resource represents a directory and thus may have children() in it, false if it represents a file. @@ -780,6 +798,24 @@ const uchar *QResourceRoot::data(int node, qint64 *size) const *size = 0; return 0; } + +QDateTime QResourceRoot::lastModified(int node) const +{ + if (node == -1 || version < 0x02) + return QDateTime(); + + const int offset = findOffset(node) + 14; + + const quint64 timeStamp = (quint64(tree[offset+0]) << 56) + (quint64(tree[offset+1]) << 48) + + (quint64(tree[offset+2]) << 40) + (quint64(tree[offset+3]) << 32) + + (quint64(tree[offset+4]) << 24) + (quint64(tree[offset+5]) << 16) + + (quint64(tree[offset+6]) << 8) + (quint64(tree[offset+7])); + if (timeStamp == 0) + return QDateTime(); + + return QDateTime::fromMSecsSinceEpoch(timeStamp); +} + QStringList QResourceRoot::children(int node) const { if(node == -1) @@ -829,9 +865,9 @@ Q_CORE_EXPORT bool qRegisterResourceData(int version, const unsigned char *tree, const unsigned char *name, const unsigned char *data) { QMutexLocker lock(resourceMutex()); - if(version == 0x01 && resourceList()) { + if ((version == 0x01 || version == 0x2) && resourceList()) { bool found = false; - QResourceRoot res(tree, name, data); + QResourceRoot res(version, tree, name, data); for(int i = 0; i < resourceList()->size(); ++i) { if(*resourceList()->at(i) == res) { found = true; @@ -839,7 +875,7 @@ Q_CORE_EXPORT bool qRegisterResourceData(int version, const unsigned char *tree, } } if(!found) { - QResourceRoot *root = new QResourceRoot(tree, name, data); + QResourceRoot *root = new QResourceRoot(version, tree, name, data); root->ref.ref(); resourceList()->append(root); } @@ -852,8 +888,8 @@ Q_CORE_EXPORT bool qUnregisterResourceData(int version, const unsigned char *tre const unsigned char *name, const unsigned char *data) { QMutexLocker lock(resourceMutex()); - if(version == 0x01 && resourceList()) { - QResourceRoot res(tree, name, data); + if ((version == 0x01 || version == 0x02) && resourceList()) { + QResourceRoot res(version, tree, name, data); for(int i = 0; i < resourceList()->size(); ) { if(*resourceList()->at(i) == res) { QResourceRoot *root = resourceList()->takeAt(i); @@ -919,9 +955,9 @@ public: if (size >= 0 && (tree_offset >= size || data_offset >= size || name_offset >= size)) return false; - if(version == 0x01) { + if (version == 0x01 || version == 0x02) { buffer = b; - setSource(b+tree_offset, b+name_offset, b+data_offset); + setSource(version, b+tree_offset, b+name_offset, b+data_offset); return true; } return false; @@ -1430,8 +1466,11 @@ QString QResourceFileEngine::owner(FileOwner) const return QString(); } -QDateTime QResourceFileEngine::fileTime(FileTime) const +QDateTime QResourceFileEngine::fileTime(FileTime time) const { + Q_D(const QResourceFileEngine); + if (time == ModificationTime) + return d->resource.lastModified(); return QDateTime(); } diff --git a/src/corelib/io/qresource.h b/src/corelib/io/qresource.h index a50bbbdaca..895cf0456e 100644 --- a/src/corelib/io/qresource.h +++ b/src/corelib/io/qresource.h @@ -69,6 +69,7 @@ public: bool isCompressed() const; qint64 size() const; const uchar *data() const; + QDateTime lastModified() const; static void addSearchPath(const QString &path); static QStringList searchPaths(); diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp index 18772d2816..c8ac554cd4 100644 --- a/src/tools/rcc/rcc.cpp +++ b/src/tools/rcc/rcc.cpp @@ -203,6 +203,12 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) } if (text || pass1) lib.writeChar('\n'); + + // last modified time stamp + const QDateTime lastModified = m_fileInfo.lastModified(); + lib.writeNumber8(quint64(lastModified.isValid() ? lastModified.toMSecsSinceEpoch() : 0)); + if (text || pass1) + lib.writeChar('\n'); } qint64 RCCFileInfo::writeDataBlob(RCCResourceLibrary &lib, qint64 offset, @@ -833,6 +839,38 @@ void RCCResourceLibrary::writeNumber4(quint32 number) } } +void RCCResourceLibrary::writeNumber8(quint64 number) +{ + if (m_format == RCCResourceLibrary::Pass2) { + m_outDevice->putChar(char(number >> 56)); + m_outDevice->putChar(char(number >> 48)); + m_outDevice->putChar(char(number >> 40)); + m_outDevice->putChar(char(number >> 32)); + m_outDevice->putChar(char(number >> 24)); + m_outDevice->putChar(char(number >> 16)); + m_outDevice->putChar(char(number >> 8)); + m_outDevice->putChar(char(number)); + } else if (m_format == RCCResourceLibrary::Binary) { + writeChar(number >> 56); + writeChar(number >> 48); + writeChar(number >> 40); + writeChar(number >> 32); + writeChar(number >> 24); + writeChar(number >> 16); + writeChar(number >> 8); + writeChar(number); + } else { + writeHex(number >> 56); + writeHex(number >> 48); + writeHex(number >> 40); + writeHex(number >> 32); + writeHex(number >> 24); + writeHex(number >> 16); + writeHex(number >> 8); + writeHex(number); + } +} + bool RCCResourceLibrary::writeHeader() { if (m_format == C_Code || m_format == Pass1) { @@ -1076,7 +1114,7 @@ bool RCCResourceLibrary::writeInitializer() if (m_root) { writeString(" "); writeAddNamespaceFunction("qRegisterResourceData"); - writeString("\n (0x01, qt_resource_struct, " + writeString("\n (0x02, qt_resource_struct, " "qt_resource_name, qt_resource_data);\n"); } writeString(" return 1;\n"); @@ -1097,7 +1135,7 @@ bool RCCResourceLibrary::writeInitializer() if (m_root) { writeString(" "); writeAddNamespaceFunction("qUnregisterResourceData"); - writeString("\n (0x01, qt_resource_struct, " + writeString("\n (0x02, qt_resource_struct, " "qt_resource_name, qt_resource_data);\n"); } writeString(" return 1;\n"); @@ -1114,10 +1152,10 @@ bool RCCResourceLibrary::writeInitializer() } else if (m_format == Binary) { int i = 4; char *p = m_out.data(); - p[i++] = 0; // 0x01 + p[i++] = 0; // 0x02 p[i++] = 0; p[i++] = 0; - p[i++] = 1; + p[i++] = 2; p[i++] = (m_treeOffset >> 24) & 0xff; p[i++] = (m_treeOffset >> 16) & 0xff; diff --git a/src/tools/rcc/rcc.h b/src/tools/rcc/rcc.h index 8d0d83e00c..157cd4809f 100644 --- a/src/tools/rcc/rcc.h +++ b/src/tools/rcc/rcc.h @@ -118,6 +118,7 @@ private: void writeHex(quint8 number); void writeNumber2(quint16 number); void writeNumber4(quint32 number); + void writeNumber8(quint64 number); void writeChar(char c) { m_out.append(c); } void writeByteArray(const QByteArray &); void write(const char *, int len); diff --git a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp index 561ab193c6..7fdd00876f 100644 --- a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp +++ b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp @@ -55,6 +55,7 @@ private slots: void searchPath(); void doubleSlashInRoot(); void setLocale(); + void lastModified(); private: const QString m_runtimeResourceRcc; @@ -489,6 +490,20 @@ void tst_QResourceEngine::setLocale() QLocale::setDefault(QLocale::system()); } +void tst_QResourceEngine::lastModified() +{ + { + QFileInfo fi(":/"); + QVERIFY(fi.exists()); + QVERIFY2(!fi.lastModified().isValid(), qPrintable(fi.lastModified().toString())); + } + { + QFileInfo fi(":/search_file.txt"); + QVERIFY(fi.exists()); + QVERIFY(fi.lastModified().isValid()); + } +} + QTEST_MAIN(tst_QResourceEngine) #include "tst_qresourceengine.moc" diff --git a/tests/auto/tools/rcc/data/images/images.expected b/tests/auto/tools/rcc/data/images/images.expected index 1f0157d51c..eb5d9222c8 100644 --- a/tests/auto/tools/rcc/data/images/images.expected +++ b/tests/auto/tools/rcc/data/images/images.expected @@ -79,16 +79,22 @@ static const unsigned char qt_resource_name[] = { static const unsigned char qt_resource_struct[] = { // : 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, // :/images 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, // :/images/subdir 0x0,0x0,0x0,0x12,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x5, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, // :/images/square.png 0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xa9, +TIMESTAMP:images/square.png // :/images/circle.png 0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, +TIMESTAMP:images/circle.png // :/images/subdir/triangle.png 0x0,0x0,0x0,0x58,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0xb, +TIMESTAMP:images/subdir/triangle.png }; @@ -120,7 +126,7 @@ int QT_RCC_MANGLE_NAMESPACE(qInitResources)(); int QT_RCC_MANGLE_NAMESPACE(qInitResources)() { QT_RCC_PREPEND_NAMESPACE(qRegisterResourceData) - (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + (0x02, qt_resource_struct, qt_resource_name, qt_resource_data); return 1; } @@ -128,7 +134,7 @@ int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)(); int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)() { QT_RCC_PREPEND_NAMESPACE(qUnregisterResourceData) - (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + (0x02, qt_resource_struct, qt_resource_name, qt_resource_data); return 1; } diff --git a/tests/auto/tools/rcc/tst_rcc.cpp b/tests/auto/tools/rcc/tst_rcc.cpp index 8d95d06e30..54a2854ede 100644 --- a/tests/auto/tools/rcc/tst_rcc.cpp +++ b/tests/auto/tools/rcc/tst_rcc.cpp @@ -92,12 +92,23 @@ static QString doCompare(const QStringList &actual, const QStringList &expected) QByteArray ba; for (int i = 0, n = expected.size(); i != n; ++i) { - if (expected.at(i).startsWith("IGNORE:")) + QString expectedLine = expected.at(i); + if (expectedLine.startsWith("IGNORE:")) continue; - if (expected.at(i) != actual.at(i)) { + if (expectedLine.startsWith("TIMESTAMP:")) { + const QString relativePath = expectedLine.mid(strlen("TIMESTAMP:")); + const quint64 timeStamp = QFileInfo(relativePath).lastModified().toMSecsSinceEpoch(); + expectedLine.clear(); + for (int shift = 56; shift >= 0; shift -= 8) { + expectedLine.append(QLatin1String("0x")); + expectedLine.append(QString::number(quint8(timeStamp >> shift), 16)); + expectedLine.append(QLatin1Char(',')); + } + } + if (expectedLine != actual.at(i)) { qDebug() << "LINES" << i << "DIFFER"; ba.append( - "\n<<<<<< actual\n" + actual.at(i) + "\n======\n" + expected.at(i) + "\n<<<<<< actual\n" + actual.at(i) + "\n======\n" + expectedLine + "\n>>>>>> expected\n" ); } From e798d0b18acfb6756a614aec3e7b4bcb1ef5ff58 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 21 Nov 2016 12:55:54 +0100 Subject: [PATCH 030/174] qnativesocketengine_winrt - do not shadow a variable We first hide identifier 'hr' and then later we check the one that was never correctly initialized. Task-number: QTBUG-57226 Change-Id: Ibbf1bb99aa752c2e4090caf4533dc5f5b71b5e41 Reviewed-by: Oliver Wolff --- src/network/socket/qnativesocketengine_winrt.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index 32fafc2cb0..934c8fe785 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -252,19 +252,18 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket:: // Start processing incoming data if (d->socketType == QAbstractSocket::TcpSocket) { - HRESULT hr; - QEventDispatcherWinRT::runOnXamlThread([d, &hr, socket, this]() { + HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([d, socket, this]() { ComPtr buffer; HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); - RETURN_OK_IF_FAILED("initialize(): Could not create buffer"); + RETURN_HR_IF_FAILED("initialize(): Could not create buffer"); ComPtr stream; hr = socket->get_InputStream(&stream); - RETURN_OK_IF_FAILED("initialize(): Could not obtain input stream"); + RETURN_HR_IF_FAILED("initialize(): Could not obtain input stream"); hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, d->readOp.GetAddressOf()); - RETURN_OK_IF_FAILED_WITH_ARGS("initialize(): Failed to read from the socket buffer (%s).", + RETURN_HR_IF_FAILED_WITH_ARGS("initialize(): Failed to read from the socket buffer (%s).", socketDescription(this).constData()); hr = d->readOp->put_Completed(Callback(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); - RETURN_OK_IF_FAILED_WITH_ARGS("initialize(): Failed to set socket read callback (%s).", + RETURN_HR_IF_FAILED_WITH_ARGS("initialize(): Failed to set socket read callback (%s).", socketDescription(this).constData()); return S_OK; }); From ad788c1014ea7a84f4ad9c52f50b957074cb3e38 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 18 Nov 2016 12:39:36 +0100 Subject: [PATCH 031/174] tst_qstandardpaths: Disable WOW64 redirection on Windows The logo (microsoft.windows.softwarelogo.showdesktop.exe) is otherwise not found. Change-Id: Ic52329462612a027e2928922a1f9a541dcbc67a3 Reviewed-by: Jesus Fernandez Reviewed-by: Oliver Wolff --- .../io/qstandardpaths/tst_qstandardpaths.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp index e1c277717d..92e66e20c2 100644 --- a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp +++ b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp @@ -38,6 +38,9 @@ #include #include #include +#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) && !defined(Q_OS_WINCE) +# include +#endif #ifdef Q_OS_UNIX #include @@ -131,6 +134,16 @@ static const char * const enumNames[MaxStandardLocation + 1 - int(QStandardPaths void tst_qstandardpaths::initTestCase() { +#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) && !defined(Q_OS_WINCE) + // Disable WOW64 redirection, see testFindExecutable() + if (QSysInfo::buildCpuArchitecture() != QSysInfo::currentCpuArchitecture()) { + void *oldMode; + const bool disabledDisableWow64FsRedirection = Wow64DisableWow64FsRedirection(&oldMode) == TRUE; + if (!disabledDisableWow64FsRedirection) + qErrnoWarning("Wow64DisableWow64FsRedirection() failed"); + QVERIFY(disabledDisableWow64FsRedirection); + } +#endif // Q_OS_WIN && !Q_OS_WINRT && !Q_OS_WINCE QVERIFY2(m_localConfigTempDir.isValid(), qPrintable(m_localConfigTempDir.errorString())); QVERIFY2(m_globalConfigTempDir.isValid(), qPrintable(m_globalConfigTempDir.errorString())); QVERIFY2(m_localAppTempDir.isValid(), qPrintable(m_localAppTempDir.errorString())); @@ -380,6 +393,7 @@ void tst_qstandardpaths::testFindExecutable_data() if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS8) { // The logo executable on Windows 8 is perfectly suited for testing that the // suffix mechanism is not thrown off by dots in the name. + // Note: Requires disabling WOW64 redirection, see initTestCase() const QString logo = QLatin1String("microsoft.windows.softwarelogo.showdesktop"); const QString logoPath = cmdFi.absolutePath() + QLatin1Char('/') + logo + QLatin1String(".exe"); QTest::newRow("win8-logo") From 4bf5a3c885c26150317e83555c0c3213bd7b417e Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 28 Sep 2016 00:12:36 +0200 Subject: [PATCH 032/174] tst_QFormLayout: Fix UB (invalid enum value) in several functions The code coerced a -123 into a QFormLayout::ItemFlags, which, however, being an enum with enumeration values 0..2, only has valid numerical values 0..3. Fix by using 3 as the value to represent the invalid enum value, and store this in a constant so as not to distribute this magic number all around the test class. Change-Id: Ie5e93a69ef5a3acdde43030b022e0cce8aec484d Reviewed-by: Thiago Macieira Reviewed-by: Marc Mutz --- .../kernel/qformlayout/tst_qformlayout.cpp | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp index 5703d7e114..5b87c0114d 100644 --- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp +++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp @@ -48,6 +48,10 @@ #include +// ItemRole has enumerators for numerical values 0..2, thus the only +// valid numerical values for storing into an ItemRole variable are 0..3: +Q_CONSTEXPR QFormLayout::ItemRole invalidRole = QFormLayout::ItemRole(3); + static inline void setFrameless(QWidget *w) { Qt::WindowFlags flags = w->windowFlags(); @@ -528,7 +532,7 @@ void tst_QFormLayout::insertRow_QWidget_QWidget() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout->getWidgetPosition(lbl1, &row, &role); QCOMPARE(row, 0); QCOMPARE(int(role), int(QFormLayout::LabelRole)); @@ -536,7 +540,7 @@ void tst_QFormLayout::insertRow_QWidget_QWidget() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout->getWidgetPosition(fld1, &row, &role); QCOMPARE(row, 0); QCOMPARE(int(role), int(QFormLayout::FieldRole)); @@ -597,7 +601,7 @@ void tst_QFormLayout::insertRow_QWidget_QLayout() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout->getWidgetPosition(lbl1, &row, &role); QCOMPARE(row, 0); QCOMPARE(int(role), int(QFormLayout::LabelRole)); @@ -605,7 +609,7 @@ void tst_QFormLayout::insertRow_QWidget_QLayout() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout->getLayoutPosition(fld1, &row, &role); QCOMPARE(row, 0); QCOMPARE(int(role), int(QFormLayout::FieldRole)); @@ -722,7 +726,7 @@ void tst_QFormLayout::setWidget() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getWidgetPosition(&w1, &row, &role); QCOMPARE(row, 5); QCOMPARE(int(role), int(QFormLayout::LabelRole)); @@ -730,7 +734,7 @@ void tst_QFormLayout::setWidget() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getWidgetPosition(&w2, &row, &role); QCOMPARE(row, 3); QCOMPARE(int(role), int(QFormLayout::FieldRole)); @@ -738,7 +742,7 @@ void tst_QFormLayout::setWidget() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getWidgetPosition(&w3, &row, &role); QCOMPARE(row, 3); QCOMPARE(int(role), int(QFormLayout::LabelRole)); @@ -746,18 +750,20 @@ void tst_QFormLayout::setWidget() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getWidgetPosition(&w4, &row, &role); + // not found QCOMPARE(row, -1); - QCOMPARE(int(role), -123); + QCOMPARE(int(role), int(invalidRole)); } { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getWidgetPosition(0, &row, &role); + // not found QCOMPARE(row, -1); - QCOMPARE(int(role), -123); + QCOMPARE(int(role), int(invalidRole)); } } @@ -790,7 +796,7 @@ void tst_QFormLayout::setLayout() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getLayoutPosition(&l1, &row, &role); QCOMPARE(row, 5); QCOMPARE(int(role), int(QFormLayout::LabelRole)); @@ -798,7 +804,7 @@ void tst_QFormLayout::setLayout() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getLayoutPosition(&l2, &row, &role); QCOMPARE(row, 3); QCOMPARE(int(role), int(QFormLayout::FieldRole)); @@ -806,7 +812,7 @@ void tst_QFormLayout::setLayout() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getLayoutPosition(&l3, &row, &role); QCOMPARE(row, 3); QCOMPARE(int(role), int(QFormLayout::LabelRole)); @@ -814,18 +820,18 @@ void tst_QFormLayout::setLayout() { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getLayoutPosition(&l4, &row, &role); QCOMPARE(row, -1); - QCOMPARE(int(role), -123); + QCOMPARE(int(role), int(invalidRole)); } { int row = -1; - QFormLayout::ItemRole role = QFormLayout::ItemRole(-123); + QFormLayout::ItemRole role = invalidRole; layout.getLayoutPosition(0, &row, &role); QCOMPARE(row, -1); - QCOMPARE(int(role), -123); + QCOMPARE(int(role), int(invalidRole)); } } From 0a203faa7f0bb836afbdd3addfba99190f69ff5f Mon Sep 17 00:00:00 2001 From: Vyacheslav Koscheev Date: Mon, 21 Nov 2016 13:17:47 +0700 Subject: [PATCH 033/174] Adjust comment to "new" spec name Change-Id: I58250de09f10637b145a5f43c3764a86e47bce96 Reviewed-by: Oswald Buddenhagen --- mkspecs/android-clang/qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/android-clang/qmake.conf b/mkspecs/android-clang/qmake.conf index b25a4399f3..c33bbe7eed 100644 --- a/mkspecs/android-clang/qmake.conf +++ b/mkspecs/android-clang/qmake.conf @@ -1,4 +1,4 @@ -# qmake configuration for building with android-g++ +# qmake configuration for building with android-clang MAKEFILE_GENERATOR = UNIX QMAKE_PLATFORM = android QMAKE_COMPILER = gcc clang llvm From 38675e18fcc841228141568a2ecfafdeb99eba2a Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 17 Nov 2016 10:40:44 +0100 Subject: [PATCH 034/174] Add support for Visual Studio 2017 Tested with RC Task-number: QTBUG-57086 Change-Id: I21f56edca3852b52edd2c5fdcce76817141e8d4a Reviewed-by: Friedemann Kleint --- mkspecs/win32-msvc2017/qmake.conf | 10 +++++++ mkspecs/win32-msvc2017/qplatformdefs.h | 34 +++++++++++++++++++++++ qmake/Makefile.win32 | 2 +- qmake/generators/win32/msvc_objectmodel.h | 3 +- qmake/generators/win32/msvc_vcproj.cpp | 11 ++++++++ qmake/library/qmakeevaluator.cpp | 13 ++++++++- src/corelib/global/qlibraryinfo.cpp | 4 ++- tools/configure/configureapp.cpp | 3 +- tools/configure/environment.cpp | 6 ++++ tools/configure/environment.h | 3 +- 10 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 mkspecs/win32-msvc2017/qmake.conf create mode 100644 mkspecs/win32-msvc2017/qplatformdefs.h diff --git a/mkspecs/win32-msvc2017/qmake.conf b/mkspecs/win32-msvc2017/qmake.conf new file mode 100644 index 0000000000..b8351eb3fe --- /dev/null +++ b/mkspecs/win32-msvc2017/qmake.conf @@ -0,0 +1,10 @@ +# +# qmake configuration for win32-msvc2017 +# +# Written for Microsoft Visual C++ 2017 +# + +MSC_VER = 1910 +MSVC_VER = 15.0 +include(../common/msvc-desktop.conf) +load(qt_config) diff --git a/mkspecs/win32-msvc2017/qplatformdefs.h b/mkspecs/win32-msvc2017/qplatformdefs.h new file mode 100644 index 0000000000..7100e3aa41 --- /dev/null +++ b/mkspecs/win32-msvc2017/qplatformdefs.h @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the qmake spec of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../win32-msvc2005/qplatformdefs.h" diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32 index e61e9503f3..96d9cb62cf 100644 --- a/qmake/Makefile.win32 +++ b/qmake/Makefile.win32 @@ -21,7 +21,7 @@ LINKER = link CFLAGS_EXTRA = /Zc:wchar_t- ! elseif "$(QMAKESPEC)" == "win32-msvc2008" || "$(QMAKESPEC)" == "win32-msvc2010" || "$(QMAKESPEC)" == "win32-msvc2012" || "$(QMAKESPEC)" == "win32-msvc2013" CFLAGS_EXTRA = /MP /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS $(CFLAGS_CRT) -! elseif "$(QMAKESPEC)" == "win32-msvc2015" +! elseif "$(QMAKESPEC)" == "win32-msvc2015" || "$(QMAKESPEC)" == "win32-msvc2017" CFLAGS_EXTRA = /MP /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /Zc:strictStrings /w44456 /w44457 /w44458 /wd4577 $(CFLAGS_CRT) ! else ! error Unsupported compiler for this Makefile diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 96923ba23d..7f924a9a2b 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -57,7 +57,8 @@ enum DotNET { NET2010 = 0xa0, NET2012 = 0xb0, NET2013 = 0xc0, - NET2015 = 0xd0 + NET2015 = 0xd0, + NET2017 = 0xe0 }; /* diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 5e3e11fd5c..d4930d9a05 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -70,6 +70,7 @@ struct DotNetCombo { const char *versionStr; const char *regKey; } dotNetCombo[] = { + {NET2017, "MSVC.NET 2017 (15.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\15.0"}, {NET2015, "MSVC.NET 2015 (14.0)", "Software\\Microsoft\\VisualStudio\\14.0\\Setup\\VC\\ProductDir"}, {NET2013, "MSVC.NET 2013 (12.0)", "Software\\Microsoft\\VisualStudio\\12.0\\Setup\\VC\\ProductDir"}, {NET2013, "MSVC.NET 2013 Express Edition (12.0)", "Software\\Microsoft\\VCExpress\\12.0\\Setup\\VC\\ProductDir"}, @@ -164,6 +165,8 @@ const char _slnHeader120[] = "Microsoft Visual Studio Solution File, Format "\n# Visual Studio 2013"; const char _slnHeader140[] = "Microsoft Visual Studio Solution File, Format Version 12.00" "\n# Visual Studio 2015"; +const char _slnHeader141[] = "Microsoft Visual Studio Solution File, Format Version 12.00" + "\n# Visual Studio 2017"; // The following UUID _may_ change for later servicepacks... // If so we need to search through the registry at // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Projects @@ -394,6 +397,8 @@ QString VcprojGenerator::retrievePlatformToolSet() const return QStringLiteral("v120") + suffix; case NET2015: return QStringLiteral("v140") + suffix; + case NET2017: + return QStringLiteral("v141") + suffix; default: return QString(); } @@ -620,6 +625,9 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) } switch (which_dotnet_version(project->first("MSVC_VER").toLatin1())) { + case NET2017: + t << _slnHeader141; + break; case NET2015: t << _slnHeader140; break; @@ -954,6 +962,9 @@ void VcprojGenerator::initProject() // Own elements ----------------------------- vcProject.Name = project->first("QMAKE_ORIG_TARGET").toQString(); switch (which_dotnet_version(project->first("MSVC_VER").toLatin1())) { + case NET2017: + vcProject.Version = "15.00"; + break; case NET2015: vcProject.Version = "14.00"; break; diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp index cd5676093d..4083fc5291 100644 --- a/qmake/library/qmakeevaluator.cpp +++ b/qmake/library/qmakeevaluator.cpp @@ -973,6 +973,13 @@ static ProString msvcBinDirToQMakeArch(QString subdir) subdir = subdir.toLower(); if (subdir == QLatin1String("amd64")) return ProString("x86_64"); + // Since 2017 the folder structure from here is HostX64|X86/x64|x86 + idx = subdir.indexOf(QLatin1Char('\\')); + if (idx == -1) + return ProString("x86"); + subdir.remove(0, idx + 1); + if (subdir == QLatin1String("x64")) + return ProString("x86_64"); return ProString(subdir); } @@ -1064,8 +1071,12 @@ void QMakeEvaluator::loadDefaults() vars[ProKey("QMAKE_HOST.arch")] << archStr; # if defined(Q_CC_MSVC) // ### bogus condition, but nobody x-builds for msvc with a different qmake + // Since VS 2017 we need VCToolsInstallDir instead of VCINSTALLDIR + QString vcInstallDir = m_option->getEnv(QLatin1String("VCToolsInstallDir")); + if (vcInstallDir.isEmpty()) + vcInstallDir = m_option->getEnv(QLatin1String("VCINSTALLDIR")); vars[ProKey("QMAKE_TARGET.arch")] = msvcArchitecture( - m_option->getEnv(QLatin1String("VCINSTALLDIR")), + vcInstallDir, m_option->getEnv(QLatin1String("PATH"))); # endif #elif defined(Q_OS_UNIX) diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp index 8bcacca13f..14be4c3475 100644 --- a/src/corelib/global/qlibraryinfo.cpp +++ b/src/corelib/global/qlibraryinfo.cpp @@ -310,8 +310,10 @@ QLibraryInfo::buildDate() # define COMPILER_STRING "MSVC 2012" # elif _MSC_VER < 1900 # define COMPILER_STRING "MSVC 2013" -# elif _MSC_VER < 2000 +# elif _MSC_VER < 1910 # define COMPILER_STRING "MSVC 2015" +# elif _MSC_VER < 2000 +# define COMPILER_STRING "MSVC 2017" # else # define COMPILER_STRING "MSVC _MSC_VER " QT_STRINGIFY(_MSC_VER) # endif diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 88dcd8170b..a908db0707 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -1458,7 +1458,8 @@ void Configure::parseCmdLine() dictionary[ "QMAKESPEC" ].endsWith("-msvc2010") || dictionary[ "QMAKESPEC" ].endsWith("-msvc2012") || dictionary[ "QMAKESPEC" ].endsWith("-msvc2013") || - dictionary[ "QMAKESPEC" ].endsWith("-msvc2015")) { + dictionary[ "QMAKESPEC" ].endsWith("-msvc2015") || + dictionary[ "QMAKESPEC" ].endsWith("-msvc2017")) { if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "nmake"; dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32"; } else if (dictionary[ "QMAKESPEC" ] == QString("win32-g++")) { diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp index 153a141d7a..f950945597 100644 --- a/tools/configure/environment.cpp +++ b/tools/configure/environment.cpp @@ -76,6 +76,7 @@ struct CompilerInfo{ {CC_MSVC2013, "Microsoft (R) Visual Studio 2013 C/C++ Compiler (12.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0", "cl.exe"}, // link.exe, lib.exe // Microsoft skipped version 13 {CC_MSVC2015, "Microsoft (R) Visual Studio 2015 C/C++ Compiler (14.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\14.0", "cl.exe"}, // link.exe, lib.exe + {CC_MSVC2017, "Microsoft (R) Visual Studio 2017 C/C++ Compiler (15.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\15.0", "cl.exe"}, // link.exe, lib.exe {CC_UNKNOWN, "Unknown", 0, 0}, }; @@ -101,6 +102,9 @@ QString Environment::detectQMakeSpec() { QString spec; switch (detectCompiler()) { + case CC_MSVC2017: + spec = "win32-msvc2017"; + break; case CC_MSVC2015: spec = "win32-msvc2015"; break; @@ -137,6 +141,8 @@ QString Environment::detectQMakeSpec() Compiler Environment::compilerFromQMakeSpec(const QString &qmakeSpec) { + if (qmakeSpec == QLatin1String("win32-msvc2017")) + return CC_MSVC2017; if (qmakeSpec == QLatin1String("win32-msvc2015")) return CC_MSVC2015; if (qmakeSpec == QLatin1String("win32-msvc2013")) diff --git a/tools/configure/environment.h b/tools/configure/environment.h index d096782e70..6b0e9bb9fe 100644 --- a/tools/configure/environment.h +++ b/tools/configure/environment.h @@ -46,7 +46,8 @@ enum Compiler { CC_MSVC2010 = 0xA0, CC_MSVC2012 = 0xB0, CC_MSVC2013 = 0xC0, - CC_MSVC2015 = 0xD0 + CC_MSVC2015 = 0xD0, + CC_MSVC2017 = 0xE0 }; struct CompilerInfo; From 9f17c245893e296d5c92ed1ef1e5d08896b469b1 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 17 Nov 2016 10:40:44 +0100 Subject: [PATCH 035/174] Enable constexpr support for Visual Studio 2017 Change-Id: I894789c41cc2c1a327c14d0526e658520d096085 Reviewed-by: Friedemann Kleint Reviewed-by: Thiago Macieira --- src/corelib/global/qcompilerdetection.h | 3 +++ src/corelib/thread/qbasicatomic.h | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index e324c043af..25e6e4c6bf 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -931,6 +931,9 @@ # define Q_COMPILER_THREADSAFE_STATICS # define Q_COMPILER_UNIFORM_INIT # endif +# if _MSC_VER >= 1910 +# define Q_COMPILER_CONSTEXPR +# endif # endif /* __cplusplus */ #endif /* Q_CC_MSVC */ diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h index 7960174277..c1e01a3212 100644 --- a/src/corelib/thread/qbasicatomic.h +++ b/src/corelib/thread/qbasicatomic.h @@ -78,6 +78,9 @@ # error "Qt has not been ported to this platform" #endif +QT_WARNING_PUSH +QT_WARNING_DISABLE_MSVC(4522) + QT_BEGIN_NAMESPACE #if 0 @@ -340,4 +343,6 @@ public: QT_END_NAMESPACE +QT_WARNING_POP + #endif // QBASICATOMIC_H From 3cd457bdad6eee4a703ef9773b80165a272fbdc7 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Mon, 21 Nov 2016 11:38:43 +0100 Subject: [PATCH 036/174] Handle RemovePath correctly when calling matches() Change-Id: Ied324a537df127e676fad26b42e658a9d5aeec9b Reviewed-by: David Faure --- src/corelib/io/qurl.cpp | 3 ++ tests/auto/corelib/io/qurl/tst_qurl.cpp | 50 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 7512bcd83f..de78d09dd9 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -3703,6 +3703,9 @@ bool QUrl::matches(const QUrl &url, FormattingOptions options) const if ((d->sectionIsPresent & mask) != (url.d->sectionIsPresent & mask)) return false; + if (options & QUrl::RemovePath) + return true; + // Compare paths, after applying path-related options QString path1; d->appendPath(path1, options, QUrlPrivate::Path); diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp index 8f99047df3..670b72acc8 100644 --- a/tests/auto/corelib/io/qurl/tst_qurl.cpp +++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp @@ -182,6 +182,8 @@ private slots: void streaming(); void detach(); void testThreading(); + void matches_data(); + void matches(); private: void testThreadingHelper(); @@ -4023,6 +4025,54 @@ void tst_QUrl::testThreading() delete s_urlStorage; } +void tst_QUrl::matches_data() +{ + QTest::addColumn("urlStrOne"); + QTest::addColumn("urlStrTwo"); + QTest::addColumn("options"); + QTest::addColumn("matches"); + + QTest::newRow("matchingString-none") << "http://www.website.com/directory/?#ref" + << "http://www.website.com/directory/?#ref" + << uint(QUrl::None) << true; + QTest::newRow("nonMatchingString-none") << "http://www.website.com/directory/?#ref" + << "http://www.nomatch.com/directory/?#ref" + << uint(QUrl::None) << false; + QTest::newRow("matchingHost-removePath") << "http://www.website.com/directory" + << "http://www.website.com/differentdir" + << uint(QUrl::RemovePath) << true; + QTest::newRow("nonMatchingHost-removePath") << "http://www.website.com/directory" + << "http://www.different.com/differentdir" + << uint(QUrl::RemovePath) << false; + QTest::newRow("matchingHost-removePathAuthority") << "http://user:pass@www.website.com/directory" + << "http://www.website.com/differentdir" + << uint(QUrl::RemovePath | QUrl::RemoveAuthority) + << true; + QTest::newRow("nonMatchingHost-removePathAuthority") << "http://user:pass@www.website.com/directory" + << "http://user:pass@www.different.com/differentdir" + << uint(QUrl::RemovePath | QUrl::RemoveAuthority) + << true; + QTest::newRow("matchingHostAuthority-removePathAuthority") + << "http://user:pass@www.website.com/directory" << "http://www.website.com/differentdir" + << uint(QUrl::RemovePath | QUrl::RemoveAuthority) << true; + QTest::newRow("nonMatchingAuthority-removePathAuthority") + << "http://user:pass@www.website.com/directory" + << "http://otheruser:otherpass@www.website.com/directory" + << uint(QUrl::RemovePath | QUrl::RemoveAuthority) << true; +} + +void tst_QUrl::matches() +{ + QFETCH(QString, urlStrOne); + QFETCH(QString, urlStrTwo); + QFETCH(uint, options); + QFETCH(bool, matches); + + QUrl urlOne(urlStrOne); + QUrl urlTwo(urlStrTwo); + QCOMPARE(urlOne.matches(urlTwo, QUrl::FormattingOptions(options)), matches); +} + QTEST_MAIN(tst_QUrl) #include "tst_qurl.moc" From 7920cfe46ad11ce1cd5592a71cfa16422e9207e1 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 21 Nov 2016 10:57:25 +0100 Subject: [PATCH 037/174] Fix SCTP API according to Qt conventions inDatagramMode() -> isInDatagramMode() maxChannelCount -> maximumChannelCount Change-Id: Ib64bf52cc3b40354927ee11e3f41d47e84c6d9c4 Reviewed-by: Lars Knoll --- examples/network/multistreamserver/server.cpp | 2 +- src/network/socket/qsctpserver.cpp | 28 ++++++------ src/network/socket/qsctpserver.h | 4 +- src/network/socket/qsctpserver_p.h | 2 +- src/network/socket/qsctpsocket.cpp | 44 +++++++++---------- src/network/socket/qsctpsocket.h | 6 +-- src/network/socket/qsctpsocket_p.h | 2 +- .../socket/qsctpsocket/tst_qsctpsocket.cpp | 16 +++---- 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/examples/network/multistreamserver/server.cpp b/examples/network/multistreamserver/server.cpp index 3b06c0fd37..1d18514c0e 100644 --- a/examples/network/multistreamserver/server.cpp +++ b/examples/network/multistreamserver/server.cpp @@ -66,7 +66,7 @@ Server::Server(QWidget *parent) setWindowTitle(tr("Multi-stream Server")); sctpServer = new QSctpServer(this); - sctpServer->setMaxChannelCount(NumberOfChannels); + sctpServer->setMaximumChannelCount(NumberOfChannels); statusLabel = new QLabel; QPushButton *quitButton = new QPushButton(tr("Quit")); diff --git a/src/network/socket/qsctpserver.cpp b/src/network/socket/qsctpserver.cpp index 24f18e1ee8..77cb997192 100644 --- a/src/network/socket/qsctpserver.cpp +++ b/src/network/socket/qsctpserver.cpp @@ -60,7 +60,7 @@ The most common way to use QSctpServer is to construct an object and set the maximum number of channels that the server is - prepared to support, by calling setMaxChannelCount(). You can set + prepared to support, by calling setMaximumChannelCount(). You can set the TCP emulation mode by passing a negative argument in this call. Also, a special value of 0 (the default) indicates to use the peer's value as the actual number of channels. The new incoming @@ -102,7 +102,7 @@ QT_BEGIN_NAMESPACE /*! \internal */ QSctpServerPrivate::QSctpServerPrivate() - : maxChannelCount(0) + : maximumChannelCount(0) { } @@ -119,7 +119,7 @@ void QSctpServerPrivate::configureCreatedSocket() QTcpServerPrivate::configureCreatedSocket(); if (socketEngine) socketEngine->setOption(QAbstractSocketEngine::MaxStreamsSocketOption, - maxChannelCount == -1 ? 1 : maxChannelCount); + maximumChannelCount == -1 ? 1 : maximumChannelCount); } /*! @@ -128,7 +128,7 @@ void QSctpServerPrivate::configureCreatedSocket() Sets the datagram operation mode. The \a parent argument is passed to QObject's constructor. - \sa setMaxChannelCount(), listen(), setSocketDescriptor() + \sa setMaximumChannelCount(), listen(), setSocketDescriptor() */ QSctpServer::QSctpServer(QObject *parent) : QTcpServer(QAbstractSocket::SctpSocket, *new QSctpServerPrivate, parent) @@ -159,19 +159,19 @@ QSctpServer::~QSctpServer() Call this method only when QSctpServer is in UnconnectedState. - \sa maxChannelCount(), QSctpSocket + \sa maximumChannelCount(), QSctpSocket */ -void QSctpServer::setMaxChannelCount(int count) +void QSctpServer::setMaximumChannelCount(int count) { Q_D(QSctpServer); if (d->state != QAbstractSocket::UnconnectedState) { - qWarning("QSctpServer::setMaxChannelCount() is only allowed in UnconnectedState"); + qWarning("QSctpServer::setMaximumChannelCount() is only allowed in UnconnectedState"); return; } #if defined(QSCTPSERVER_DEBUG) - qDebug("QSctpServer::setMaxChannelCount(%i)", count); + qDebug("QSctpServer::setMaximumChannelCount(%i)", count); #endif - d->maxChannelCount = count; + d->maximumChannelCount = count; } /*! @@ -183,11 +183,11 @@ void QSctpServer::setMaxChannelCount(int count) Returns -1, if QSctpServer running in TCP emulation mode. - \sa setMaxChannelCount() + \sa setMaximumChannelCount() */ -int QSctpServer::maxChannelCount() const +int QSctpServer::maximumChannelCount() const { - return d_func()->maxChannelCount; + return d_func()->maximumChannelCount; } /*! \reimp @@ -199,7 +199,7 @@ void QSctpServer::incomingConnection(qintptr socketDescriptor) #endif QSctpSocket *socket = new QSctpSocket(this); - socket->setMaxChannelCount(d_func()->maxChannelCount); + socket->setMaximumChannelCount(d_func()->maximumChannelCount); socket->setSocketDescriptor(socketDescriptor); addPendingConnection(socket); } @@ -234,7 +234,7 @@ QSctpSocket *QSctpServer::nextPendingDatagramConnection() QSctpSocket *socket = qobject_cast(i.next()); Q_ASSERT(socket); - if (socket->inDatagramMode()) { + if (socket->isInDatagramMode()) { i.remove(); Q_ASSERT(d->socketEngine); d->socketEngine->setReadNotificationEnabled(true); diff --git a/src/network/socket/qsctpserver.h b/src/network/socket/qsctpserver.h index fb017a924d..f39257485d 100644 --- a/src/network/socket/qsctpserver.h +++ b/src/network/socket/qsctpserver.h @@ -57,8 +57,8 @@ public: explicit QSctpServer(QObject *parent = nullptr); virtual ~QSctpServer(); - void setMaxChannelCount(int count); - int maxChannelCount() const; + void setMaximumChannelCount(int count); + int maximumChannelCount() const; QSctpSocket *nextPendingDatagramConnection(); diff --git a/src/network/socket/qsctpserver_p.h b/src/network/socket/qsctpserver_p.h index 32760caffe..274939fc3d 100644 --- a/src/network/socket/qsctpserver_p.h +++ b/src/network/socket/qsctpserver_p.h @@ -64,7 +64,7 @@ public: QSctpServerPrivate(); virtual ~QSctpServerPrivate(); - int maxChannelCount; + int maximumChannelCount; void configureCreatedSocket() Q_DECL_OVERRIDE; }; diff --git a/src/network/socket/qsctpsocket.cpp b/src/network/socket/qsctpsocket.cpp index cb07e80299..fe76f64c42 100644 --- a/src/network/socket/qsctpsocket.cpp +++ b/src/network/socket/qsctpsocket.cpp @@ -83,14 +83,14 @@ \endlist To set a continuous byte stream mode, instantiate QSctpSocket and - call setMaxChannelCount() with a negative value. This gives the + call setMaximumChannelCount() with a negative value. This gives the ability to use QSctpSocket as a regular buffered QTcpSocket. You can call connectToHost() to initiate connection with endpoint, write() to transmit and read() to receive data from the peer, but you cannot distinguish message boundaries. By default, QSctpSocket operates in datagram mode. Before - connecting, call setMaxChannelCount() to set the maximum number of + connecting, call setMaximumChannelCount() to set the maximum number of channels that the application is prepared to support. This number is a parameter negotiated with the remote endpoint and its value can be bounded by the operating system. The default value of 0 @@ -130,7 +130,7 @@ QT_BEGIN_NAMESPACE /*! \internal */ QSctpSocketPrivate::QSctpSocketPrivate() - : maxChannelCount(0) + : maximumChannelCount(0) { } @@ -150,7 +150,7 @@ bool QSctpSocketPrivate::canReadNotification() #endif // Handle TCP emulation mode in the base implementation. - if (!q->inDatagramMode()) + if (!q->isInDatagramMode()) return QTcpSocketPrivate::canReadNotification(); const int savedCurrentChannel = currentReadChannel; @@ -248,7 +248,7 @@ bool QSctpSocketPrivate::writeToSocket() #endif // Handle TCP emulation mode in the base implementation. - if (!q->inDatagramMode()) + if (!q->isInDatagramMode()) return QTcpSocketPrivate::writeToSocket(); if (!socketEngine) @@ -331,7 +331,7 @@ void QSctpSocketPrivate::configureCreatedSocket() { if (socketEngine) socketEngine->setOption(QAbstractSocketEngine::MaxStreamsSocketOption, - maxChannelCount < 0 ? 1 : maxChannelCount); + maximumChannelCount < 0 ? 1 : maximumChannelCount); } /*! @@ -340,7 +340,7 @@ void QSctpSocketPrivate::configureCreatedSocket() Sets the datagram operation mode. The \a parent argument is passed to QObject's constructor. - \sa socketType(), setMaxChannelCount() + \sa socketType(), setMaximumChannelCount() */ QSctpSocket::QSctpSocket(QObject *parent) : QTcpSocket(SctpSocket, *new QSctpSocketPrivate, parent) @@ -418,19 +418,19 @@ void QSctpSocket::disconnectFromHost() Call this method only when QSctpSocket is in UnconnectedState. - \sa maxChannelCount(), readChannelCount(), writeChannelCount() + \sa maximumChannelCount(), readChannelCount(), writeChannelCount() */ -void QSctpSocket::setMaxChannelCount(int count) +void QSctpSocket::setMaximumChannelCount(int count) { Q_D(QSctpSocket); if (d->state != QAbstractSocket::UnconnectedState) { - qWarning("QSctpSocket::setMaxChannelCount() is only allowed in UnconnectedState"); + qWarning("QSctpSocket::setMaximumChannelCount() is only allowed in UnconnectedState"); return; } #if defined(QSCTPSOCKET_DEBUG) - qDebug("QSctpSocket::setMaxChannelCount(%i)", count); + qDebug("QSctpSocket::setMaximumChannelCount(%i)", count); #endif - d->maxChannelCount = qMax(count, -1); + d->maximumChannelCount = qMax(count, -1); } /*! @@ -443,22 +443,22 @@ void QSctpSocket::setMaxChannelCount(int count) Returns -1 if QSctpSocket is running in continuous byte stream mode. - \sa setMaxChannelCount(), readChannelCount(), writeChannelCount() + \sa setMaximumChannelCount(), readChannelCount(), writeChannelCount() */ -int QSctpSocket::maxChannelCount() const +int QSctpSocket::maximumChannelCount() const { - return d_func()->maxChannelCount; + return d_func()->maximumChannelCount; } /*! Returns \c true if the socket is running in datagram mode. - \sa setMaxChannelCount() + \sa setMaximumChannelCount() */ -bool QSctpSocket::inDatagramMode() const +bool QSctpSocket::isInDatagramMode() const { Q_D(const QSctpSocket); - return d->maxChannelCount != -1 && d->isBuffered; + return d->maximumChannelCount != -1 && d->isBuffered; } /*! @@ -471,13 +471,13 @@ bool QSctpSocket::inDatagramMode() const On failure, returns a QNetworkDatagram that reports \l {QNetworkDatagram::isValid()}{not valid}. - \sa writeDatagram(), inDatagramMode(), currentReadChannel() + \sa writeDatagram(), isInDatagramMode(), currentReadChannel() */ QNetworkDatagram QSctpSocket::readDatagram() { Q_D(QSctpSocket); - if (!isReadable() || !inDatagramMode()) { + if (!isReadable() || !isInDatagramMode()) { qWarning("QSctpSocket::readDatagram(): operation is not permitted"); return QNetworkDatagram(); } @@ -507,14 +507,14 @@ QNetworkDatagram QSctpSocket::readDatagram() Writes a \a datagram to the buffer of the current write channel. Returns true on success; otherwise returns false. - \sa readDatagram(), inDatagramMode(), currentWriteChannel() + \sa readDatagram(), isInDatagramMode(), currentWriteChannel() */ bool QSctpSocket::writeDatagram(const QNetworkDatagram &datagram) { Q_D(QSctpSocket); if (!isWritable() || d->state != QAbstractSocket::ConnectedState || !d->socketEngine - || !d->socketEngine->isValid() || !inDatagramMode()) { + || !d->socketEngine->isValid() || !isInDatagramMode()) { qWarning("QSctpSocket::writeDatagram(): operation is not permitted"); return false; } diff --git a/src/network/socket/qsctpsocket.h b/src/network/socket/qsctpsocket.h index aaa4e1ecca..3e5a545c4b 100644 --- a/src/network/socket/qsctpsocket.h +++ b/src/network/socket/qsctpsocket.h @@ -59,9 +59,9 @@ public: void close() Q_DECL_OVERRIDE; void disconnectFromHost() Q_DECL_OVERRIDE; - void setMaxChannelCount(int count); - int maxChannelCount() const; - bool inDatagramMode() const; + void setMaximumChannelCount(int count); + int maximumChannelCount() const; + bool isInDatagramMode() const; QNetworkDatagram readDatagram(); bool writeDatagram(const QNetworkDatagram &datagram); diff --git a/src/network/socket/qsctpsocket_p.h b/src/network/socket/qsctpsocket_p.h index f38095330f..3f765ebed9 100644 --- a/src/network/socket/qsctpsocket_p.h +++ b/src/network/socket/qsctpsocket_p.h @@ -74,7 +74,7 @@ public: bool writeToSocket() Q_DECL_OVERRIDE; QByteArray incomingDatagram; - int maxChannelCount; + int maximumChannelCount; typedef std::deque IpHeaderList; QVector readHeaders; diff --git a/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp b/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp index fc976fbd0d..cf15e60531 100644 --- a/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp +++ b/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp @@ -112,7 +112,7 @@ void tst_QSctpSocket::constructing() QVERIFY(!socket.isOpen()); QVERIFY(!socket.isValid()); QCOMPARE(socket.socketType(), QAbstractSocket::SctpSocket); - QCOMPARE(socket.maxChannelCount(), 0); + QCOMPARE(socket.maximumChannelCount(), 0); QCOMPARE(socket.readChannelCount(), 0); QCOMPARE(socket.writeChannelCount(), 0); @@ -202,7 +202,7 @@ void tst_QSctpSocket::setSocketDescriptor() { QSctpServer server; - server.setMaxChannelCount(16); + server.setMaximumChannelCount(16); QVERIFY(server.listen()); SOCKET sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); @@ -218,8 +218,8 @@ void tst_QSctpSocket::setSocketDescriptor() QVERIFY(socket.waitForConnected(3000)); QVERIFY(server.waitForNewConnection(3000)); - QCOMPARE(socket.readChannelCount(), server.maxChannelCount()); - QVERIFY(socket.writeChannelCount() <= server.maxChannelCount()); + QCOMPARE(socket.readChannelCount(), server.maximumChannelCount()); + QVERIFY(socket.writeChannelCount() <= server.maximumChannelCount()); QSctpSocket *acceptedSocket = server.nextPendingDatagramConnection(); QVERIFY(acceptedSocket); @@ -338,11 +338,11 @@ void tst_QSctpSocket::loop() QSctpServer server; - server.setMaxChannelCount(10); + server.setMaximumChannelCount(10); QVERIFY(server.listen()); QSctpSocket peter; - peter.setMaxChannelCount(10); + peter.setMaximumChannelCount(10); peter.connectToHost(QHostAddress::LocalHost, server.serverPort()); QVERIFY(peter.waitForConnected(3000)); @@ -389,11 +389,11 @@ void tst_QSctpSocket::loopInTCPMode() QSctpServer server; - server.setMaxChannelCount(-1); + server.setMaximumChannelCount(-1); QVERIFY(server.listen()); QSctpSocket peter; - peter.setMaxChannelCount(-1); + peter.setMaximumChannelCount(-1); peter.connectToHost(QHostAddress::LocalHost, server.serverPort()); QVERIFY(peter.waitForConnected(3000)); QVERIFY(server.waitForNewConnection(3000)); From e1f0e08e9a290689f2778ffcfafc133f8a1b99cf Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Fri, 18 Nov 2016 17:39:01 +0100 Subject: [PATCH 038/174] Add more information for QKeySequence::toString on macOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous documentation said: "On OS X, the string returned resembles the sequence that is shown in the menu bar." That was not completely true because the string returned depends on the format passed to the function. Task-number: QTWEBSITE-744 Change-Id: I1b7d9367547326670d1b3a8cfe48f066910f5a10 Reviewed-by: Topi Reiniö --- src/gui/kernel/qkeysequence.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp index ea71e34e4b..77c5ae7a02 100644 --- a/src/gui/kernel/qkeysequence.cpp +++ b/src/gui/kernel/qkeysequence.cpp @@ -1517,7 +1517,9 @@ bool QKeySequence::isDetached() const If the key sequence has no keys, an empty string is returned. On \macos, the string returned resembles the sequence that is - shown in the menu bar. + shown in the menu bar if \a format is + QKeySequence::NativeText; otherwise, the string uses the + "portable" format, suitable for writing to a file. \sa fromString() */ From a9af3c85022994cfe18a05cd92db9fc0b0ad902c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 16 Sep 2016 11:27:00 +0200 Subject: [PATCH 039/174] win: Show Tech Preview license Show the tech preview license for commercial users if -confirm-license is not set. This matches what the configure shell script is doing, too. Task-number: QTBUG-55676 Change-Id: I69f5553ab53dfcdc14c200e682c024a6cebee8fe Reviewed-by: Oswald Buddenhagen --- tools/configure/configureapp.cpp | 34 +++++++++++++++++++------------- tools/configure/tools.cpp | 8 +------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index a908db0707..2b7a1d6b07 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -4550,11 +4550,6 @@ Configure::ProjectType Configure::projectType(const QString& proFileName) bool Configure::showLicense(QString orgLicenseFile) { - if (dictionary["LICENSE_CONFIRMED"] == "yes") { - cout << "You have already accepted the terms of the license." << endl << endl; - return true; - } - bool showLgpl2 = true; QString licenseFile = orgLicenseFile; QString theLicense; @@ -4665,21 +4660,32 @@ void Configure::readLicense() } } if (hasOpenSource && openSource) { - cout << endl << "This is the " << dictionary["PLATFORM NAME"] << " Open Source Edition." << endl; + cout << endl << "This is the " << dictionary["PLATFORM NAME"] << " Open Source Edition." << endl << endl; dictionary["LICENSEE"] = "Open Source"; dictionary["EDITION"] = "OpenSource"; - cout << endl; - if (!showLicense(dictionary["LICENSE FILE"])) { - cout << "Configuration aborted since license was not accepted"; - dictionary["DONE"] = "error"; - return; - } } else if (openSource) { cout << endl << "Cannot find the GPL license files! Please download the Open Source version of the library." << endl; dictionary["DONE"] = "error"; + } else { + QString tpLicense = sourcePath + "/LICENSE.PREVIEW.COMMERCIAL"; + if (QFile::exists(tpLicense)) { + cout << endl << "This is the Qt Preview Edition." << endl << endl; + + dictionary["EDITION"] = "Preview"; + dictionary["LICENSE FILE"] = tpLicense; + } else { + Tools::checkLicense(dictionary, sourcePath, buildPath); + } } - else { - Tools::checkLicense(dictionary, sourcePath, buildPath); + + if (dictionary["LICENSE_CONFIRMED"] != "yes") { + if (!showLicense(dictionary["LICENSE FILE"])) { + cout << "Configuration aborted since license was not accepted" << endl; + dictionary["DONE"] = "error"; + return; + } + } else if (dictionary["LICHECK"].isEmpty()) { // licheck executable shows license + cout << "You have already accepted the terms of the license." << endl << endl; } } diff --git a/tools/configure/tools.cpp b/tools/configure/tools.cpp index 095e798332..02c74282cd 100644 --- a/tools/configure/tools.cpp +++ b/tools/configure/tools.cpp @@ -47,13 +47,6 @@ using namespace std; void Tools::checkLicense(QMap &dictionary, const QString &sourcePath, const QString &buildPath) { - QString tpLicense = sourcePath + "/LICENSE.PREVIEW.COMMERCIAL"; - if (QFile::exists(tpLicense)) { - dictionary["EDITION"] = "Preview"; - dictionary["LICENSE FILE"] = tpLicense; - return; - } - dictionary["LICHECK"] = "licheck.exe"; const QString licenseChecker = @@ -80,6 +73,7 @@ void Tools::checkLicense(QMap &dictionary, } else { foreach (const QString &var, licheckOutput.split('\n')) dictionary[var.section('=', 0, 0).toUpper()] = var.section('=', 1, 1); + dictionary["LICENSE_CONFIRMED"] = "yes"; } } else { cout << endl << "Error: Could not find licheck.exe" << endl From 34c2a1dcf05661562cd00fe6dbdf884d8917933d Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 27 Sep 2016 15:30:15 +0200 Subject: [PATCH 040/174] QFormLayout: fix use-after-free in clearQLayoutItem() Found by ASan when it should have been found by me in the initial review... The old code did, in this order: 1. delete item->layout() (which deletes item, as QLayoutItem::layout() is just a dynamic_cast implemented with virtual functions) 2. delete item->widget() (which is correct, but too late, as 'item' may have already been deleted; this is the first use-after-free bug) 3. delete item->spacerItem() (which is the second use-after-free). Fix by deleting item->widget() (which may be a no-op), _then_ checking for a QLayout, deleting all children (but not the layout), and finally deleting item as a QLayoutItem. Rename clearQLayoutItem() to clearAndDestroyQLayoutItem() to better match what it actually does. Change-Id: Id70a7a137dac5de466ef619f01bfd61dfc150418 Reviewed-by: Thiago Macieira Reviewed-by: Samuel Gaist Reviewed-by: Marc Mutz --- src/widgets/kernel/qformlayout.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/widgets/kernel/qformlayout.cpp b/src/widgets/kernel/qformlayout.cpp index 3e60723f17..f3f7280030 100644 --- a/src/widgets/kernel/qformlayout.cpp +++ b/src/widgets/kernel/qformlayout.cpp @@ -1410,18 +1410,15 @@ static QLayoutItem *ownershipCleanedItem(QFormLayoutItem *item, QFormLayout *lay return i; } -static void clearQLayoutItem(QLayoutItem *item) +static void clearAndDestroyQLayoutItem(QLayoutItem *item) { if (Q_LIKELY(item)) { - if (QLayout *layout = item->layout()) { - while (QLayoutItem *child = layout->takeAt(0)) { - clearQLayoutItem(child); - delete child; - } - delete layout; - } delete item->widget(); - delete item->spacerItem(); + if (QLayout *layout = item->layout()) { + while (QLayoutItem *child = layout->takeAt(0)) + clearAndDestroyQLayoutItem(child); + } + delete item; } } @@ -1453,8 +1450,8 @@ static void clearQLayoutItem(QLayoutItem *item) void QFormLayout::removeRow(int row) { TakeRowResult result = takeRow(row); - clearQLayoutItem(result.labelItem); - clearQLayoutItem(result.fieldItem); + clearAndDestroyQLayoutItem(result.labelItem); + clearAndDestroyQLayoutItem(result.fieldItem); } /*! @@ -1485,8 +1482,8 @@ void QFormLayout::removeRow(int row) void QFormLayout::removeRow(QWidget *widget) { TakeRowResult result = takeRow(widget); - clearQLayoutItem(result.labelItem); - clearQLayoutItem(result.fieldItem); + clearAndDestroyQLayoutItem(result.labelItem); + clearAndDestroyQLayoutItem(result.fieldItem); } /*! @@ -1518,8 +1515,8 @@ void QFormLayout::removeRow(QWidget *widget) void QFormLayout::removeRow(QLayout *layout) { TakeRowResult result = takeRow(layout); - clearQLayoutItem(result.labelItem); - clearQLayoutItem(result.fieldItem); + clearAndDestroyQLayoutItem(result.labelItem); + clearAndDestroyQLayoutItem(result.fieldItem); } /*! From d6c8fab8805f5085568065cdc8bfbfddfcfd8f2e Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 17 Oct 2016 13:00:04 +0200 Subject: [PATCH 041/174] QMutex: make sure we try_lock_for no shorter than the duration passed By templating on the types and unconditionally using duration_cast to coerce the duration into a milliseconds, we allowed code such as mutex.try_lock_for(10us) to compile, which is misleading, since it's actually a zero- timeout try_lock(). Feedback from the std-discussions mailing list is that the wait_for functions should wait for _at least_ the duration given, because that is the natural direction of variance (tasks becoming ready to run might not get a CPU immediately, causing delays), while an interface that documents to wait _no more_ than the given duration is promising something it cannot fulfill. Fix by converting the given duration to the smallest number of milliseconds not less than the original duration. If that is not representable in an int, use INT_MAX, emulating the effect of a spurious wakeup, which are allowed to happen if the function returns false in that case. In the above example, the try_lock_for call is now equivalent to mutex.tryLock(1); The tryLock() docs state that the actual waiting time does not exceed the given milliseconds, but fixing that is a separate issue. Change-Id: Id4cbbea0ecc6fd2f94bb5aef28a1658be3728e52 Reviewed-by: Thiago Macieira --- src/corelib/thread/qmutex.cpp | 4 +- src/corelib/thread/qmutex.h | 38 ++++-- .../auto/corelib/thread/qmutex/tst_qmutex.cpp | 114 ++++++++++++++++++ 3 files changed, 146 insertions(+), 10 deletions(-) diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp index 6e0fa4eedb..0aee4aeda4 100644 --- a/src/corelib/thread/qmutex.cpp +++ b/src/corelib/thread/qmutex.cpp @@ -275,7 +275,7 @@ bool QMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT Attempts to lock the mutex. This function returns \c true if the lock was obtained; otherwise it returns \c false. If another thread has - locked the mutex, this function will wait for at most \a duration + locked the mutex, this function will wait for at least \a duration for the mutex to become available. Note: Passing a negative duration as the \a duration is equivalent to @@ -299,7 +299,7 @@ bool QMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT Attempts to lock the mutex. This function returns \c true if the lock was obtained; otherwise it returns \c false. If another thread has - locked the mutex, this function will wait at most until \a timePoint + locked the mutex, this function will wait at least until \a timePoint for the mutex to become available. Note: Passing a \a timePoint which has already passed is equivalent diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h index 3a0e22e3bd..056ebdeaa5 100644 --- a/src/corelib/thread/qmutex.h +++ b/src/corelib/thread/qmutex.h @@ -46,8 +46,11 @@ #if QT_HAS_INCLUDE() # include +# include #endif +class tst_QMutex; + QT_BEGIN_NAMESPACE @@ -135,14 +138,7 @@ public: template bool try_lock_for(std::chrono::duration duration) { - // N4606 § 30.4.1.3 [thread.timedmutex.requirements]/5 specifies that - // a duration less than or equal to duration.zero() shall result in a - // try_lock, unlike QMutex's tryLock with a negative duration which - // results in a lock. - - if (duration <= duration.zero()) - return tryLock(0); - return tryLock(std::chrono::duration_cast(duration).count()); + return tryLock(convertToMilliseconds(duration)); } // TimedLockable concept @@ -162,6 +158,32 @@ public: private: Q_DISABLE_COPY(QMutex) friend class QMutexLocker; + friend class ::tst_QMutex; + +#if QT_HAS_INCLUDE() + template + static int convertToMilliseconds(std::chrono::duration duration) + { + // N4606 § 30.4.1.3.5 [thread.timedmutex.requirements] specifies that a + // duration less than or equal to duration.zero() shall result in a + // try_lock, unlike QMutex's tryLock with a negative duration which + // results in a lock. + + if (duration <= duration.zero()) + return 0; + + // when converting from 'duration' to milliseconds, make sure that + // the result is not shorter than 'duration': + std::chrono::milliseconds wait = std::chrono::duration_cast(duration); + if (wait < duration) + wait += std::chrono::milliseconds(1); + Q_ASSERT(wait >= duration); + const auto ms = wait.count(); + const auto maxInt = (std::numeric_limits::max)(); + + return ms < maxInt ? int(ms) : maxInt; + } +#endif }; class Q_CORE_EXPORT QMutexLocker diff --git a/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp b/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp index b24ecfcd43..bf778e9fd1 100644 --- a/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp +++ b/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp @@ -44,8 +44,19 @@ class tst_QMutex : public QObject { Q_OBJECT +public: + enum class TimeUnit { + Nanoseconds, + Microseconds, + Milliseconds, + Seconds, + }; + Q_ENUM(TimeUnit); + private slots: void initTestCase(); + void convertToMilliseconds_data(); + void convertToMilliseconds(); void tryLock_non_recursive(); void try_lock_for_non_recursive(); void try_lock_until_non_recursive(); @@ -122,6 +133,109 @@ void tst_QMutex::initTestCase() initializeSystemTimersResolution(); } +void tst_QMutex::convertToMilliseconds_data() +{ + QTest::addColumn("unit"); + QTest::addColumn("doubleValue"); + QTest::addColumn("intValue"); + QTest::addColumn("expected"); + + + auto add = [](TimeUnit unit, double d, long long i, qint64 expected) { + const QScopedArrayPointer enumName(QTest::toString(unit)); + QTest::newRow(qPrintable(QString::asprintf("%s:%f:%lld", enumName.data(), d, i))) + << unit << d << qint64(i) << expected; + }; + + auto forAllUnitsAdd = [=](double d, long long i, qint64 expected) { + for (auto unit : {TimeUnit::Nanoseconds, TimeUnit::Microseconds, TimeUnit::Milliseconds, TimeUnit::Seconds}) + add(unit, d, i, expected); + }; + + forAllUnitsAdd(-0.5, -1, 0); // all negative values result in 0 + + forAllUnitsAdd(0, 0, 0); + + add(TimeUnit::Nanoseconds, 1, 1, 1); + add(TimeUnit::Nanoseconds, 1000 * 1000, 1000 * 1000, 1); + add(TimeUnit::Nanoseconds, 1000 * 1000 + 0.5, 1000 * 1000 + 1, 2); + + add(TimeUnit::Microseconds, 1, 1, 1); + add(TimeUnit::Microseconds, 1000, 1000, 1); + add(TimeUnit::Microseconds, 1000 + 0.5, 1000 + 1, 2); + + add(TimeUnit::Milliseconds, 1, 1, 1); + add(TimeUnit::Milliseconds, 1.5, 2, 2); + + add(TimeUnit::Seconds, 0.9991, 1, 1000); + + // + // overflowing int results in INT_MAX (equivalent to a spurious wakeup after ~24 days); check it: + // + + // spot on: + add(TimeUnit::Nanoseconds, INT_MAX * 1000. * 1000, INT_MAX * Q_INT64_C(1000) * 1000, INT_MAX); + add(TimeUnit::Microseconds, INT_MAX * 1000., INT_MAX * Q_INT64_C(1000), INT_MAX); + add(TimeUnit::Milliseconds, INT_MAX, INT_MAX, INT_MAX); + + // minimally above: + add(TimeUnit::Nanoseconds, INT_MAX * 1000. * 1000 + 1, INT_MAX * Q_INT64_C(1000) * 1000 + 1, INT_MAX); + add(TimeUnit::Microseconds, INT_MAX * 1000. + 1, INT_MAX * Q_INT64_C(1000) + 1, INT_MAX); + add(TimeUnit::Milliseconds, INT_MAX + 1., INT_MAX + Q_INT64_C(1), INT_MAX); + add(TimeUnit::Seconds, INT_MAX / 1000. + 1, INT_MAX / 1000 + 1, INT_MAX); + + // minimally below: + add(TimeUnit::Nanoseconds, INT_MAX * 1000. * 1000 - 1, INT_MAX * Q_INT64_C(1000) * 1000 - 1, INT_MAX); + add(TimeUnit::Microseconds, INT_MAX * 1000. - 1, INT_MAX * Q_INT64_C(1000) - 1, INT_MAX); + add(TimeUnit::Milliseconds, INT_MAX - 0.1, INT_MAX , INT_MAX); + +} + +void tst_QMutex::convertToMilliseconds() +{ +#if !QT_HAS_INCLUDE() + QSKIP("This test requires "); +#else + QFETCH(TimeUnit, unit); + QFETCH(double, doubleValue); + QFETCH(qint64, intValue); + QFETCH(qint64, expected); + + Q_CONSTEXPR qint64 maxShort = std::numeric_limits::max(); + Q_CONSTEXPR qint64 maxInt = std::numeric_limits::max(); + Q_CONSTEXPR qint64 maxUInt = std::numeric_limits::max(); + + switch (unit) { +#define CASE(Unit, Period) \ + case TimeUnit::Unit: \ + DO(double, Period, doubleValue); \ + if (intValue < maxShort) \ + DO(short, Period, short(intValue)); \ + if (intValue < maxInt) \ + DO(int, Period, int(intValue)); \ + DO(qint64, Period, intValue); \ + if (intValue >= 0) { \ + if (intValue < maxUInt) \ + DO(uint, Period, uint(intValue)); \ + DO(quint64, Period, quint64(intValue)); \ + } \ + break +#define DO(Rep, Period, val) \ + do { \ + const std::chrono::duration wait((val)); \ + QCOMPARE(QMutex::convertToMilliseconds(wait), expected); \ + } while (0) + + CASE(Nanoseconds, std::nano); + CASE(Microseconds, std::micro); + CASE(Milliseconds, std::milli); + CASE(Seconds, std::ratio<1>); +#undef DO +#undef CASE + } +#endif +} + void tst_QMutex::tryLock_non_recursive() { class Thread : public QThread From d377f14fd5b4fe3ed64392c6b743bac395f9f891 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 7 Nov 2016 11:28:16 +0100 Subject: [PATCH 042/174] Windows QPA: Detect Windows 10 tablet mode Add new file for dynamically loading Window 10 Helpers via combase.dll and add function qt_windowsIsTabletMode() querying UIViewSettings::get_UserInteractionMode() for "Touch" mode. The style hint QPlatformIntegration::ShowIsMaximized will then reflect the tablet mode setting. Task-number: QTBUG-56831 Change-Id: Ia361dd172fcf0e54fdfc70863c43527f3ea72fe2 Reviewed-by: Oliver Wolff Reviewed-by: Maurice Kalinowski --- .../platforms/windows/qwin10helpers.cpp | 167 ++++++++++++++++++ src/plugins/platforms/windows/qwin10helpers.h | 52 ++++++ .../platforms/windows/qwindowsclipboard.h | 2 + .../platforms/windows/qwindowsintegration.cpp | 7 + src/plugins/platforms/windows/windows.pri | 4 +- 5 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 src/plugins/platforms/windows/qwin10helpers.cpp create mode 100644 src/plugins/platforms/windows/qwin10helpers.h diff --git a/src/plugins/platforms/windows/qwin10helpers.cpp b/src/plugins/platforms/windows/qwin10helpers.cpp new file mode 100644 index 0000000000..3ded96b9d6 --- /dev/null +++ b/src/plugins/platforms/windows/qwin10helpers.cpp @@ -0,0 +1,167 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwin10helpers.h" + +#include +#include + +#if defined(Q_CC_MINGW) +# define HAS_UI_VIEW_SETTINGS_INTEROP +#elif !defined(Q_CC_MSVC) || _MSC_VER >= 1900 // MSVC2013 is lacking both +# define HAS_UI_VIEW_SETTINGS_INTEROP +# define HAS_UI_VIEW_SETTINGS +#endif + +#include + +#ifdef HAS_UI_VIEW_SETTINGS +# include +#endif + +#ifdef HAS_UI_VIEW_SETTINGS_INTEROP +# include +#endif + +#ifndef HAS_UI_VIEW_SETTINGS_INTEROP +MIDL_INTERFACE("3694dbf9-8f68-44be-8ff5-195c98ede8a6") +IUIViewSettingsInterop : public IInspectable +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetForWindow( + __RPC__in HWND hwnd, + __RPC__in REFIID riid, + __RPC__deref_out_opt void **ppv) = 0; +}; +#endif // !HAS_UI_VIEW_SETTINGS_INTEROP + +#ifndef HAS_UI_VIEW_SETTINGS +namespace ABI { +namespace Windows { +namespace UI { +namespace ViewManagement { + +enum UserInteractionMode { Mouse, Touch }; + +MIDL_INTERFACE("C63657F6-8850-470D-88F8-455E16EA2C26") +IUIViewSettings : public IInspectable +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_UserInteractionMode(UserInteractionMode *value) = 0; +}; + +} // namespace ViewManagement +} // namespace UI +} // namespace Windows +} // namespace ABI +#endif // HAS_UI_VIEW_SETTINGS + +QT_BEGIN_NAMESPACE + +// Starting from Windows 10 +struct QWindowsComBaseDLL +{ + bool init(); + bool isValid() const + { + return roGetActivationFactory != nullptr && windowsCreateStringReference != nullptr; + } + + typedef HRESULT (WINAPI *RoGetActivationFactory)(HSTRING, REFIID, void **); + typedef HRESULT (WINAPI *WindowsCreateStringReference)(PCWSTR, UINT32, HSTRING_HEADER *, HSTRING *); + + RoGetActivationFactory roGetActivationFactory = nullptr; + WindowsCreateStringReference windowsCreateStringReference = nullptr; +}; + +static QWindowsComBaseDLL baseComDll; + +bool QWindowsComBaseDLL::init() +{ + if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS10 && !isValid()) { + QSystemLibrary library(QStringLiteral("combase")); + roGetActivationFactory = + reinterpret_cast(library.resolve("RoGetActivationFactory")); + windowsCreateStringReference = + reinterpret_cast(library.resolve("WindowsCreateStringReference")); + } + return isValid(); +} + +// Return tablet mode, note: Does not work for GetDesktopWindow(). +bool qt_windowsIsTabletMode(HWND hwnd) +{ + bool result = false; + + if (!baseComDll.init()) + return false; + + const wchar_t uiViewSettingsId[] = L"Windows.UI.ViewManagement.UIViewSettings"; + HSTRING_HEADER uiViewSettingsIdRefHeader; + HSTRING uiViewSettingsIdHs = nullptr; + const UINT32 uiViewSettingsIdLen = UINT32(sizeof(uiViewSettingsId) / sizeof(uiViewSettingsId[0]) - 1); + if (FAILED(baseComDll.windowsCreateStringReference(uiViewSettingsId, uiViewSettingsIdLen, &uiViewSettingsIdRefHeader, &uiViewSettingsIdHs))) + return false; + + IUIViewSettingsInterop *uiViewSettingsInterop = nullptr; + // __uuidof(IUIViewSettingsInterop); + const GUID uiViewSettingsInteropRefId = {0x3694dbf9, 0x8f68, 0x44be,{0x8f, 0xf5, 0x19, 0x5c, 0x98, 0xed, 0xe8, 0xa6}}; + + HRESULT hr = baseComDll.roGetActivationFactory(uiViewSettingsIdHs, uiViewSettingsInteropRefId, + reinterpret_cast(&uiViewSettingsInterop)); + if (FAILED(hr)) + return false; + + // __uuidof(ABI::Windows::UI::ViewManagement::IUIViewSettings); + const GUID uiViewSettingsRefId = {0xc63657f6, 0x8850, 0x470d,{0x88, 0xf8, 0x45, 0x5e, 0x16, 0xea, 0x2c, 0x26}}; + ABI::Windows::UI::ViewManagement::IUIViewSettings *viewSettings = nullptr; + hr = uiViewSettingsInterop->GetForWindow(hwnd, uiViewSettingsRefId, + reinterpret_cast(&viewSettings)); + if (SUCCEEDED(hr)) { + ABI::Windows::UI::ViewManagement::UserInteractionMode currentMode; + hr = viewSettings->get_UserInteractionMode(¤tMode); + if (SUCCEEDED(hr)) + result = currentMode == 1; // Touch, 1 + viewSettings->Release(); + } + uiViewSettingsInterop->Release(); + return result; +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwin10helpers.h b/src/plugins/platforms/windows/qwin10helpers.h new file mode 100644 index 0000000000..e1485003dd --- /dev/null +++ b/src/plugins/platforms/windows/qwin10helpers.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIN10HELPERS_H +#define QWIN10HELPERS_H + +#include +#include + +QT_BEGIN_NAMESPACE + +bool qt_windowsIsTabletMode(HWND hwnd); + +QT_END_NAMESPACE + +#endif // QWIN10HELPERS_H diff --git a/src/plugins/platforms/windows/qwindowsclipboard.h b/src/plugins/platforms/windows/qwindowsclipboard.h index 3fe0c74e78..992d34d492 100644 --- a/src/plugins/platforms/windows/qwindowsclipboard.h +++ b/src/plugins/platforms/windows/qwindowsclipboard.h @@ -73,6 +73,8 @@ public: static QWindowsClipboard *instance() { return m_instance; } + HWND clipboardViewer() const { return m_clipboardViewer; } + private: void clear(); void releaseIData(); diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 004b03d9a9..f49ad0e767 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -41,6 +41,7 @@ #include "qwindowsintegration.h" #include "qwindowswindow.h" #include "qwindowscontext.h" +#include "qwin10helpers.h" #include "qwindowsopenglcontext.h" #include "qwindowsscreen.h" @@ -509,6 +510,12 @@ QVariant QWindowsIntegration::styleHint(QPlatformIntegration::StyleHint hint) co #ifdef SPI_GETKEYBOARDSPEED case KeyboardAutoRepeatRate: return QVariant(keyBoardAutoRepeatRateMS()); +#endif + case QPlatformIntegration::ShowIsMaximized: +#ifndef QT_NO_CLIPBOARD + return qt_windowsIsTabletMode(d->m_clipboard.clipboardViewer()); +#else + break; #endif case QPlatformIntegration::StartDragTime: case QPlatformIntegration::StartDragDistance: diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri index d97e49309f..20e0b81da9 100644 --- a/src/plugins/platforms/windows/windows.pri +++ b/src/plugins/platforms/windows/windows.pri @@ -25,7 +25,8 @@ SOURCES += \ $$PWD/qwindowsdialoghelpers.cpp \ $$PWD/qwindowsservices.cpp \ $$PWD/qwindowsnativeinterface.cpp \ - $$PWD/qwindowsopengltester.cpp + $$PWD/qwindowsopengltester.cpp \ + $$PWD/qwin10helpers.cpp HEADERS += \ $$PWD/qwindowswindow.h \ @@ -46,6 +47,7 @@ HEADERS += \ $$PWD/qwindowsnativeinterface.h \ $$PWD/qwindowsopengltester.h \ $$PWD/qwindowsthreadpoolrunner.h + $$PWD/qwin10helpers.h INCLUDEPATH += $$PWD From cff48c7845ccf51ac53a550a43dec78428124f70 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Mon, 21 Nov 2016 12:46:46 +0100 Subject: [PATCH 043/174] eglfs: Avoid unexpectedly flushing QPA input events Flushing all events to ensure that the expose (or other queued events) get processed right away is dangerous. Instead, pass ExcludeUserInputEvents like many other platform plugins do. This way queued input events do not get processed at an unexpected point in time and so do not interfere with modal dialogs for instance. Task-number: QTBUG-57229 Change-Id: I9da09e62627d26485fb5a37fc190cb4a4bcb28b6 Reviewed-by: Andy Nichols --- src/plugins/platforms/eglfs/qeglfsintegration.cpp | 2 +- src/plugins/platforms/eglfs/qeglfswindow.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp index bb62506f33..2a6f3aa7cf 100644 --- a/src/plugins/platforms/eglfs/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp @@ -176,7 +176,7 @@ QPlatformBackingStore *QEglFSIntegration::createPlatformBackingStore(QWindow *wi QPlatformWindow *QEglFSIntegration::createPlatformWindow(QWindow *window) const { - QWindowSystemInterface::flushWindowSystemEvents(); + QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents); QEglFSWindow *w = qt_egl_device_integration()->createWindow(window); w->create(); if (window->type() != Qt::ToolTip) diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp index 84856831c3..3cc7079fbb 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp @@ -208,7 +208,7 @@ void QEglFSWindow::setVisible(bool visible) QWindowSystemInterface::handleExposeEvent(wnd, QRect(QPoint(0, 0), wnd->geometry().size())); if (visible) - QWindowSystemInterface::flushWindowSystemEvents(); + QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents); } void QEglFSWindow::setGeometry(const QRect &r) From 53edaf0fb7146e20029afcdbb57003025db8b7bf Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Tue, 22 Nov 2016 15:27:44 +0100 Subject: [PATCH 044/174] Document QMAKE_OBJECTIVE_CFLAGS Task-number: QTBUG-57264 Change-Id: Iae06d9428d320a99cfd070154ed7bc94ec450b91 Reviewed-by: Oswald Buddenhagen --- qmake/doc/src/qmake-manual.qdoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc index ccb79f4a9f..fe67568c51 100644 --- a/qmake/doc/src/qmake-manual.qdoc +++ b/qmake/doc/src/qmake-manual.qdoc @@ -2057,6 +2057,12 @@ value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. + \section1 QMAKE_OBJECTIVE_CFLAGS + + Specifies the Objective C/C++ compiler flags for building + a project. These flags are used in addition to QMAKE_CFLAGS and + QMAKE_CXXFLAGS. + \section1 QMAKE_POST_LINK Specifies the command to execute after linking the \l{TARGET} From e2b856d56290e9b3eaaf889b3e0a08badbaa6046 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Thu, 17 Nov 2016 16:10:11 +0100 Subject: [PATCH 045/174] QDir::tempPath - use NSTemporaryDirectory on Darwin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of hardcoded "/tmp". Task-number: QTBUG-57165 Change-Id: I9d3ae157c22ce131281b8279149eea87a26244e8 Reviewed-by: Morten Johan Sørvig --- src/corelib/io/qfilesystemengine_unix.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 3cc27bf847..a3b28a8d95 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -59,6 +59,13 @@ #include #endif +#if defined(Q_OS_DARWIN) +// We cannot include (it's an Objective-C header), but +// we need these declarations: +Q_FORWARD_DECLARE_OBJC_CLASS(NSString); +extern "C" NSString *NSTemporaryDirectory(); +#endif + QT_BEGIN_NAMESPACE #if defined(Q_OS_DARWIN) @@ -706,8 +713,17 @@ QString QFileSystemEngine::tempPath() return QDir::cleanPath(temp); #else QString temp = QFile::decodeName(qgetenv("TMPDIR")); - if (temp.isEmpty()) - temp = QLatin1String("/tmp"); + if (temp.isEmpty()) { +#if defined(Q_OS_DARWIN) && !defined(QT_BOOTSTRAPPED) + if (NSString *nsPath = NSTemporaryDirectory()) { + temp = QString::fromCFString((CFStringRef)nsPath); + } else { +#else + { +#endif + temp = QLatin1String("/tmp"); + } + } return QDir::cleanPath(temp); #endif } From b5222307af591c5360a64ffa311bde4a61af97d6 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 19 Oct 2016 16:37:53 +0200 Subject: [PATCH 046/174] Fix some qdoc-warnings qtbase/src/corelib/kernel/qdeadlinetimer.cpp:343: warning: Cannot find 'setPreciseRemainingTime(...)' in '\fn' void QDeadlineTimer::setPreciseRemainingTime(qint64 secs, unsigned nsecs, Qt::TimerType type) qtbase/src/corelib/kernel/qdeadlinetimer.cpp:459: warning: Overrides a previous doc qtbase/src/corelib/kernel/qelapsedtimer.cpp:86: warning: Unknown command '\ref' qtbase/src/corelib/global/qglobal.cpp:1184: warning: Undocumented enum item 'MV_WATCHOS_2_2' in QSysInfo::MacVersion qtbase/src/corelib/global/qglobal.cpp:1184: warning: Undocumented enum item 'MV_WATCHOS_3_0' in QSysInfo::MacVersion qtbase/src/corelib/global/qglobal.cpp:1184: warning: Undocumented enum item 'MV_WATCHOS' in QSysInfo::MacVersion qtbase/src/corelib/global/qglobal.cpp:1184: warning: Undocumented enum item 'MV_WATCHOS_2_1' in QSysInfo::MacVersion qtbase/src/corelib/global/qglobal.cpp:1184: warning: Undocumented enum item 'MV_WATCHOS_2_0' in QSysInfo::MacVersion qtbase/src/corelib/kernel/qdeadlinetimer.cpp:175: warning: Missing parameter name qtbase/src/corelib/kernel/qdeadlinetimer.cpp:175: warning: No such parameter 'ForeverConstant' in QDeadlineTimer::QDeadlineTimer() qtbase/src/corelib/kernel/qdeadlinetimer.h:156: warning: No documentation for 'QDeadlineTimer::remainingTimeAsDuration()' qtbase/src/gui/painting/qcolor.cpp:796: warning: Undocumented parameter 'name' in QColor::QColor() qtbase/src/gui/painting/qcolor.cpp:802: warning: Undocumented parameter 'name' in QColor::QColor() Some errors in QDeadlineTimer remain due to qdoc not fully supporting templates. Change-Id: Ie7afd91c48048748eeda23c32056583c31fd7490 Reviewed-by: Nico Vertriest Reviewed-by: Jake Petroules --- src/corelib/global/qglobal.cpp | 6 ++++++ src/corelib/kernel/qdeadlinetimer.cpp | 25 ++++--------------------- src/corelib/kernel/qelapsedtimer.cpp | 2 +- src/gui/painting/qcolor.cpp | 8 ++++++++ 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index d06acb83b2..6efdc4c22c 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -1244,6 +1244,12 @@ bool qSharedBuild() Q_DECL_NOTHROW \value MV_TVOS_9_2 tvOS 9.2 \value MV_TVOS_10_0 tvOS 10.0 + \value MV_WATCHOS watchOS (any) + \value MV_WATCHOS_2_0 watchOS 2.0 + \value MV_WATCHOS_2_1 watchOS 2.1 + \value MV_WATCHOS_2_2 watchOS 2.2 + \value MV_WATCHOS_3_0 watchOS 3.0 + \value MV_None Not a Darwin operating system \sa WinVersion diff --git a/src/corelib/kernel/qdeadlinetimer.cpp b/src/corelib/kernel/qdeadlinetimer.cpp index 17a74b22d7..d670637d53 100644 --- a/src/corelib/kernel/qdeadlinetimer.cpp +++ b/src/corelib/kernel/qdeadlinetimer.cpp @@ -173,9 +173,9 @@ Q_DECL_CONST_FUNCTION static inline QPair toSecsAndNSecs(qint64 */ /*! - \fn QDeadlineTimer::QDeadlineTimer(ForeverConstant, Qt::TimerType timerType) + \fn QDeadlineTimer::QDeadlineTimer(ForeverConstant foreverConstant, Qt::TimerType timerType) - QDeadlineTimer objects created with parameter \a ForeverConstant never expire. + QDeadlineTimer objects created with parameter \a foreverConstant never expire. For such objects, remainingTime() will return -1, deadline() will return the maximum value, and isForever() will return true. @@ -295,7 +295,7 @@ void QDeadlineTimer::setRemainingTime(qint64 msecs, Qt::TimerType timerType) Q_D parameters are zero, this QDeadlineTimer will be marked as expired. The timer type for this QDeadlineTimer object will be set to the specified - \a type. + \a timerType. \sa setRemainingTime(), hasExpired(), isForever(), remainingTime() */ @@ -341,24 +341,7 @@ void QDeadlineTimer::setPreciseRemainingTime(qint64 secs, qint64 nsecs, Qt::Time */ /*! - \fn void QDeadlineTimer::setPreciseRemainingTime(qint64 secs, unsigned nsecs, Qt::TimerType type) - - Sets the remaining time for this QDeadlineTimer object to \a secs seconds - and \a nsecs nanoseconds from now, if \a secs is a positive value. If both - values are zero, this QDeadlineTimer object will be marked as expired, - whereas if \a secs is -1, it will set it to never expire. - - If value of \a nsecs is more than 1 billion nanoseconds (1 second), this - function will adjust \a secs accordingly. - - The timer type for this QDeadlineTimer object will be set to the specified \a type. - - \sa setRemainingTime(), hasExpired(), isForever(), remainingTime() -*/ - -/*! - \overload - \fn Duration QDeadlineTimer::remainingTime() const + \fn std::chrono::nanoseconds remainingTimeAsDuration() const Returns a \c{std::chrono::duration} object of type \c{Duration} containing the remaining time in this QDeadlineTimer, if it still has time left. If diff --git a/src/corelib/kernel/qelapsedtimer.cpp b/src/corelib/kernel/qelapsedtimer.cpp index 5e9d1317ac..e578b5b8b3 100644 --- a/src/corelib/kernel/qelapsedtimer.cpp +++ b/src/corelib/kernel/qelapsedtimer.cpp @@ -83,7 +83,7 @@ QT_BEGIN_NAMESPACE \snippet qelapsedtimer/main.cpp 2 - It is often more convenient to use \ref{QDeadlineTimer} in this case, which + It is often more convenient to use \l{QDeadlineTimer} in this case, which counts towards a timeout in the future instead of tracking elapsed time. \section1 Reference Clocks diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp index e3dbf663e1..6a8091bf8b 100644 --- a/src/gui/painting/qcolor.cpp +++ b/src/gui/painting/qcolor.cpp @@ -795,12 +795,20 @@ QColor::QColor(Spec spec) Q_DECL_NOTHROW /*! \fn QColor::QColor(const char *name) + + Constructs a named color in the same way as setNamedColor() using + the given \a name. + \overload \sa setNamedColor(), name(), isValid() */ /*! \fn QColor::QColor(QLatin1String name) + + Constructs a named color in the same way as setNamedColor() using + the given \a name. + \overload \since 5.8 \sa setNamedColor(), name(), isValid() From be94fc445a664fa10ce5ff5ea1e4fbe7d23585e7 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Sun, 13 Nov 2016 15:04:33 +0300 Subject: [PATCH 047/174] QString: optimize remove(QChar, Qt::CaseSensitivity) remove(int, int) with O(N) was used in a loop. We had a quadratic complexity. Use erase-remove idiom to fix it. Change-Id: I643a2a75619ec5ea2bf99e48a25f64a7f69ba156 Reviewed-by: Edward Welbourne Reviewed-by: Marc Mutz --- src/corelib/tools/qstring.cpp | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 8520bb5740..4262899e02 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -2300,21 +2300,20 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs) */ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs) { - int i = 0; - ushort c = ch.unicode(); - if (cs == Qt::CaseSensitive) { - while (i < d->size) - if (d->data()[i] == ch) - remove(i, 1); - else - i++; - } else { - c = foldCase(c); - while (i < d->size) - if (foldCase(d->data()[i]) == c) - remove(i, 1); - else - i++; + const int idx = indexOf(ch, 0, cs); + if (idx != -1) { + const auto first = begin(); // implicit detach() + auto last = end(); + if (cs == Qt::CaseSensitive) { + last = std::remove(first + idx, last, ch); + } else { + const QChar c = ch.toCaseFolded(); + auto caseInsensEqual = [c](QChar x) { + return c == x.toCaseFolded(); + }; + last = std::remove_if(first + idx, last, caseInsensEqual); + } + resize(last - first); } return *this; } From d8857f21ac2640215177b9cb7bb681b74bc66068 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 22 Nov 2016 09:46:14 +0100 Subject: [PATCH 048/174] If there are no available sizes, then fallback to the requested size In a case like the SVG iconengine there is no available sizes implementation. However in that case we don't need to provide different sizes as we can have SVG scale it for us to the one requested. So it is assumed that with no available sizes implementation that the icon engine will take care of this for us. This ensures that SVG files can be used as icons inside the menu on macOS. Task-number: QTBUG-40225 Task-number: QTBUG-55932 Change-Id: If01ca582c4c07834e6de16652924e0b7e118c87c Reviewed-by: Timur Pocheptsov --- src/plugins/platforms/cocoa/qcocoahelpers.h | 2 +- src/plugins/platforms/cocoa/qcocoahelpers.mm | 7 +++++-- src/plugins/platforms/cocoa/qcocoamenuitem.mm | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h index c2abe4e245..bbb37937d2 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.h +++ b/src/plugins/platforms/cocoa/qcocoahelpers.h @@ -64,7 +64,7 @@ inline NSMutableArray *qt_mac_QStringListToNSMutableArray(const QStringList &qst NSImage *qt_mac_cgimage_to_nsimage(CGImageRef iamge); NSImage *qt_mac_create_nsimage(const QPixmap &pm); -NSImage *qt_mac_create_nsimage(const QIcon &icon); +NSImage *qt_mac_create_nsimage(const QIcon &icon, int defaultSize = 0); CGImageRef qt_mac_toCGImage(const QImage &qImage); CGImageRef qt_mac_toCGImageMask(const QImage &qImage); QImage qt_mac_toQImage(CGImageRef image); diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm index 058209da7e..cd73148752 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.mm +++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm @@ -152,13 +152,16 @@ NSImage *qt_mac_create_nsimage(const QPixmap &pm) return nsImage; } -NSImage *qt_mac_create_nsimage(const QIcon &icon) +NSImage *qt_mac_create_nsimage(const QIcon &icon, int defaultSize) { if (icon.isNull()) return nil; NSImage *nsImage = [[NSImage alloc] init]; - foreach (QSize size, icon.availableSizes()) { + QList availableSizes = icon.availableSizes(); + if (availableSizes.isEmpty() && defaultSize > 0) + availableSizes << QSize(defaultSize, defaultSize); + foreach (QSize size, availableSizes) { QPixmap pm = icon.pixmap(size); QImage image = pm.toImage(); CGImageRef cgImage = qt_mac_toCGImage(image); diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm index 2d4073956a..fa8eb22569 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm @@ -348,7 +348,7 @@ NSMenuItem *QCocoaMenuItem::sync() NSImage *img = nil; if (!m_icon.isNull()) { - img = qt_mac_create_nsimage(m_icon); + img = qt_mac_create_nsimage(m_icon, m_iconSize); [img setSize:NSMakeSize(m_iconSize, m_iconSize)]; } [m_native setImage:img]; From a32424b46cd3ef6fd8d644354e3cec434d5ab951 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 15 Nov 2016 17:15:56 +0100 Subject: [PATCH 049/174] AreArgumentsNarrowedBase: Correct logic for narrowing connect() casts The prior test deemed there to be narrowing if source and destination integral-or-enum types didn't have the same signedness; but all values of an unsigned source type can be represented in a larger signed destination type, so there is no narrowing in this case. Updated QObject test-case to match. Change-Id: I517a5997adcad70e185d7469a8d26788e463cb75 Reviewed-by: Giuseppe D'Angelo --- src/corelib/kernel/qobjectdefs_impl.h | 10 ++++- .../corelib/kernel/qobject/tst_qobject.cpp | 40 +++++++++---------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h index e94e713e1f..79c9c8303e 100644 --- a/src/corelib/kernel/qobjectdefs_impl.h +++ b/src/corelib/kernel/qobjectdefs_impl.h @@ -229,8 +229,14 @@ namespace QtPrivate { (std::is_floating_point::value && std::is_integral::value) || (std::is_floating_point::value && std::is_floating_point::value && sizeof(From) > sizeof(To)) || ((std::is_integral::value || std::is_enum::value) && std::is_floating_point::value) || - (std::is_integral::value && std::is_integral::value && (sizeof(From) > sizeof(To) || std::is_signed::value != std::is_signed::value)) || - (std::is_enum::value && std::is_integral::value && (sizeof(From) > sizeof(To) || IsEnumUnderlyingTypeSigned::value != std::is_signed::value)) + (std::is_integral::value && std::is_integral::value + && (sizeof(From) > sizeof(To) + || (std::is_signed::value ? !std::is_signed::value + : (std::is_signed::value && sizeof(From) == sizeof(To))))) || + (std::is_enum::value && std::is_integral::value + && (sizeof(From) > sizeof(To) + || (IsEnumUnderlyingTypeSigned::value ? !std::is_signed::value + : (std::is_signed::value && sizeof(From) == sizeof(To))))) > { }; diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index 0f7f75fb2e..91810cdcd8 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -6969,10 +6969,10 @@ void tst_QObject::checkArgumentsForNarrowing() QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); @@ -6980,23 +6980,23 @@ void tst_QObject::checkArgumentsForNarrowing() QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(int) >= sizeof(long)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(long) >= sizeof(long long)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); @@ -7206,28 +7206,28 @@ void tst_QObject::checkArgumentsForNarrowing() QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(ScopedEnumBackedByUInt) >= sizeof(long)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(ScopedEnumBackedByULong) >= sizeof(long long)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); From 20017d0b1bde34190d96bebe34b4e641efdde779 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 21 Nov 2016 14:56:09 +0100 Subject: [PATCH 050/174] Remove some #if 0 blocks from API headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Noticed in API review for 5.8 release. Change-Id: I1dd48c676924048c32fab8307868cf61915df131 Reviewed-by: Jędrzej Nowacki --- src/widgets/kernel/qwidget.h | 10 ---------- src/widgets/widgets/qpushbutton.h | 3 --- 2 files changed, 13 deletions(-) diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index 5edf2c62da..58413c6bd3 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -570,16 +570,6 @@ public: inline QWidget *childAt(int x, int y) const; QWidget *childAt(const QPoint &p) const; -#if 0 // Used to be included in Qt4 for Q_WS_X11 - const QX11Info &x11Info() const; - Qt::HANDLE x11PictureHandle() const; -#endif - -#if 0 // Used to be included in Qt4 for Q_WS_MAC - Qt::HANDLE macQDHandle() const; - Qt::HANDLE macCGHandle() const; -#endif - void setAttribute(Qt::WidgetAttribute, bool on = true); inline bool testAttribute(Qt::WidgetAttribute) const; diff --git a/src/widgets/widgets/qpushbutton.h b/src/widgets/widgets/qpushbutton.h index 859ac247fb..b0d1ccacdb 100644 --- a/src/widgets/widgets/qpushbutton.h +++ b/src/widgets/widgets/qpushbutton.h @@ -87,9 +87,6 @@ public Q_SLOTS: protected: bool event(QEvent *e) Q_DECL_OVERRIDE; -#if 0 // Used to be included in Qt4 for Q_WS_MAC - bool hitButton(const QPoint &pos) const; -#endif void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE; void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE; void focusInEvent(QFocusEvent *) Q_DECL_OVERRIDE; From e9fa435652ef064515bd5c04c0b5e5c4a30ebca4 Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Fri, 4 Nov 2016 13:46:36 +0100 Subject: [PATCH 051/174] winrt: Add support for Windows Information Protection Windows Information Protection is used for splitting corporate and personal data, requiring connections to be established in a different way instantiating ThreadNetworkContext. Usage is enabled via the QT_WINRT_USE_THREAD_NETWORK_CONTEXT environment variable. Change-Id: I3aaa097b66fc616d42cd05a1e20bbcb004f6e467 Reviewed-by: James Tong Reviewed-by: Oliver Wolff --- src/network/socket/qabstractsocket.cpp | 13 ++-- .../socket/qnativesocketengine_winrt.cpp | 68 ++++++++++++++++++- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 02bba2d293..57c40194a3 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -1113,10 +1113,15 @@ void QAbstractSocketPrivate::_q_connectToNextAddress() // Tries to connect to the address. If it succeeds immediately // (localhost address on BSD or any UDP connect), emit // connected() and return. - if (socketEngine->connectToHost(host, port)) { - //_q_testConnection(); - fetchConnectionParameters(); - return; + if ( +#if defined(Q_OS_WINRT) && _MSC_VER >= 1900 + !qEnvironmentVariableIsEmpty("QT_WINRT_USE_THREAD_NETWORK_CONTEXT") ? + socketEngine->connectToHostByName(hostName, port) : +#endif + socketEngine->connectToHost(host, port)) { + //_q_testConnection(); + fetchConnectionParameters(); + return; } // Check that we're in delayed connection state. If not, try diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index 3daca38959..d0b8bff7f9 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -75,6 +75,9 @@ using namespace ABI::Windows::Storage::Streams; using namespace ABI::Windows::Networking; using namespace ABI::Windows::Networking::Connectivity; using namespace ABI::Windows::Networking::Sockets; +#if _MSC_VER >= 1900 +using namespace ABI::Windows::Security::EnterpriseData; +#endif typedef ITypedEventHandler ClientConnectedHandler; typedef ITypedEventHandler DatagramReceivedHandler; @@ -84,6 +87,45 @@ typedef IAsyncOperationWithProgress IAsyncBufferOperation; QT_BEGIN_NAMESPACE +#if _MSC_VER >= 1900 +static HRESULT qt_winrt_try_create_thread_network_context(QString host, ComPtr &context) +{ + HRESULT hr; + ComPtr protectionPolicyManager; + + hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Security_EnterpriseData_ProtectionPolicyManager).Get(), + &protectionPolicyManager); + RETURN_HR_IF_FAILED("Could not access ProtectionPolicyManager statics."); + + ComPtr hostNameFactory; + hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), + &hostNameFactory); + RETURN_HR_IF_FAILED("Could not access HostName factory."); + + ComPtr hostName; + HStringReference hostRef(reinterpret_cast(host.utf16()), host.length()); + hr = hostNameFactory->CreateHostName(hostRef.Get(), &hostName); + RETURN_HR_IF_FAILED("Could not create hostname."); + + ComPtr> op; + hr = protectionPolicyManager->GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName.Get(), &op); + RETURN_HR_IF_FAILED("Could not get identity operation."); + + HSTRING hIdentity; + hr = QWinRTFunctions::await(op, &hIdentity); + RETURN_HR_IF_FAILED("Could not wait for identity operation."); + + // Implies there is no need for a network context for this address + if (hIdentity == nullptr) + return S_OK; + + hr = protectionPolicyManager->CreateCurrentThreadNetworkContext(hIdentity, &context); + RETURN_HR_IF_FAILED("Could not create thread network context"); + + return S_OK; +} +#endif // _MSC_VER >= 1900 + static inline QString qt_QStringFromHString(const HString &string) { UINT32 length; @@ -367,9 +409,23 @@ bool QNativeSocketEngine::connectToHost(const QHostAddress &address, quint16 por bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port) { Q_D(QNativeSocketEngine); + HRESULT hr; + +#if _MSC_VER >= 1900 + ComPtr networkContext; + if (!qEnvironmentVariableIsEmpty("QT_WINRT_USE_THREAD_NETWORK_CONTEXT")) { + hr = qt_winrt_try_create_thread_network_context(name, networkContext); + if (FAILED(hr)) { + setError(QAbstractSocket::ConnectionRefusedError, QLatin1String("Could not create thread network context.")); + d->socketState = QAbstractSocket::ConnectedState; + return true; + } + } +#endif // _MSC_VER >= 1900 + HStringReference hostNameRef(reinterpret_cast(name.utf16())); ComPtr hostNameFactory; - HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), + hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), &hostNameFactory); Q_ASSERT_SUCCEEDED(hr); ComPtr remoteHost; @@ -390,6 +446,16 @@ bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port) } Q_ASSERT_SUCCEEDED(hr); +#if _MSC_VER >= 1900 + if (networkContext != nullptr) { + ComPtr networkContextCloser; + hr = networkContext.As(&networkContextCloser); + Q_ASSERT_SUCCEEDED(hr); + hr = networkContextCloser->Close(); + Q_ASSERT_SUCCEEDED(hr); + } +#endif // _MSC_VER >= 1900 + d->socketState = QAbstractSocket::ConnectingState; QEventDispatcherWinRT::runOnXamlThread([d, &hr]() { hr = d->connectOp->put_Completed(Callback( From d20a99c081491f020836904eaa1c9323b9b56921 Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Thu, 17 Nov 2016 16:19:32 +0100 Subject: [PATCH 052/174] winrt: Add printsupport For WinRT QPrinter and co are disabled in the new configure system. Still, we need to have printsupport enabled as a module, providing no printer. Task-number: QTBUG-56321 Change-Id: I95ce538e8f54073832af551ccf7f981e877a3b25 Reviewed-by: Oliver Wolff --- src/printsupport/kernel/kernel.pri | 2 +- src/src.pro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/printsupport/kernel/kernel.pri b/src/printsupport/kernel/kernel.pri index 22d12e4cc3..90eab4a634 100644 --- a/src/printsupport/kernel/kernel.pri +++ b/src/printsupport/kernel/kernel.pri @@ -30,7 +30,7 @@ win32 { $$PWD/qprintengine_win_p.h SOURCES += \ $$PWD/qprintengine_win.cpp - LIBS_PRIVATE += -lwinspool -lcomdlg32 -lgdi32 -luser32 + !winrt: LIBS_PRIVATE += -lwinspool -lcomdlg32 -lgdi32 -luser32 } unix:!darwin:qtConfig(cups) { diff --git a/src/src.pro b/src/src.pro index f19b0bd354..54f3b6e020 100644 --- a/src/src.pro +++ b/src/src.pro @@ -186,7 +186,7 @@ qtConfig(gui) { SUBDIRS += src_opengl src_plugins.depends += src_opengl } - !wince:!winrt { + !wince { SUBDIRS += src_printsupport src_plugins.depends += src_printsupport } From 2c8c6dd9a478f0f2e2b811a9d3e68891ee1bef0b Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Thu, 17 Nov 2016 16:32:04 +0100 Subject: [PATCH 053/174] Fix compilation without QPrinter support Task-number: QTBUG-56321 Change-Id: Ic77d01431ee58d609eca895d1f2d216042406bc9 Reviewed-by: Oliver Wolff --- examples/widgets/graphicsview/chip/view.cpp | 2 -- examples/widgets/painting/fontsampler/mainwindow.cpp | 4 ---- examples/widgets/painting/fontsampler/mainwindow.h | 2 ++ 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/examples/widgets/graphicsview/chip/view.cpp b/examples/widgets/graphicsview/chip/view.cpp index 7a26227628..62aa25b575 100644 --- a/examples/widgets/graphicsview/chip/view.cpp +++ b/examples/widgets/graphicsview/chip/view.cpp @@ -50,10 +50,8 @@ #include "view.h" -#ifndef QT_NO_PRINTER #include #include -#endif #ifndef QT_NO_OPENGL #include #else diff --git a/examples/widgets/painting/fontsampler/mainwindow.cpp b/examples/widgets/painting/fontsampler/mainwindow.cpp index 33d560edf3..06ffac3728 100644 --- a/examples/widgets/painting/fontsampler/mainwindow.cpp +++ b/examples/widgets/painting/fontsampler/mainwindow.cpp @@ -49,11 +49,7 @@ ****************************************************************************/ #include -#ifndef QT_NO_PRINTER -#include -#include #include -#endif #include "mainwindow.h" diff --git a/examples/widgets/painting/fontsampler/mainwindow.h b/examples/widgets/painting/fontsampler/mainwindow.h index f39e1b1916..ada0d47354 100644 --- a/examples/widgets/painting/fontsampler/mainwindow.h +++ b/examples/widgets/painting/fontsampler/mainwindow.h @@ -52,6 +52,8 @@ #define MAINWINDOW_H #include "ui_mainwindowbase.h" +#include +#include QT_BEGIN_NAMESPACE class QPrinter; From fca4acbfba12121bffb3d49aa2198a55e4a762cf Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Fri, 18 Nov 2016 12:10:38 +0100 Subject: [PATCH 054/174] Remove wince checks Windows CE is not supported since 5.6. No need to have checks anymore. Change-Id: I384bd67e04dec06e83ee69b4ef5dc7dd97888c14 Reviewed-by: Oliver Wolff Reviewed-by: Oswald Buddenhagen --- src/src.pro | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/src.pro b/src/src.pro index 54f3b6e020..b13bc4fa43 100644 --- a/src/src.pro +++ b/src/src.pro @@ -178,18 +178,14 @@ qtConfig(gui) { src_plugins.depends += src_gui src_platformsupport src_platformheaders src_testlib.depends += src_gui # if QtGui is enabled, QtTest requires QtGui's headers qtConfig(widgets) { - SUBDIRS += src_tools_uic src_widgets + SUBDIRS += src_tools_uic src_widgets src_printsupport TOOLS += src_tools_uic - src_plugins.depends += src_widgets + src_plugins.depends += src_widgets src_printsupport src_testlib.depends += src_widgets # if QtWidgets is enabled, QtTest requires QtWidgets's headers qtConfig(opengl) { SUBDIRS += src_opengl src_plugins.depends += src_opengl } - !wince { - SUBDIRS += src_printsupport - src_plugins.depends += src_printsupport - } } } SUBDIRS += src_plugins From 6542712dfafc4a64d505522ed23b02ae626ad38f Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 17 Nov 2016 16:52:31 +0100 Subject: [PATCH 055/174] Extend documentation for SHA-3 third-party license MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Write down which files are under CC0, and which under BSD. Change-Id: Ifdbfa3393b2a0f0d857e6c569bd105426c0719cb Reviewed-by: Topi Reiniö --- src/3rdparty/sha3/qt_attribution.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/3rdparty/sha3/qt_attribution.json b/src/3rdparty/sha3/qt_attribution.json index 13e6e971d9..4866be32ea 100644 --- a/src/3rdparty/sha3/qt_attribution.json +++ b/src/3rdparty/sha3/qt_attribution.json @@ -4,6 +4,7 @@ "Name": "Secure Hash Algorithm SHA-3 - brg_endian", "QDocModule": "qtcore", "QtUsage": "Used in Qt Core (QCryptographicHash).", + "Files": "brg_endian.h", "Description": "SHA-3, originally known as Keccak, is a cryptographic hash function.", "License": "BSD 3-clause \"New\" or \"Revised\" License", @@ -16,6 +17,7 @@ "Name": "Secure Hash Algorithm SHA-3 - Keccak", "QDocModule": "qtcore", "QtUsage": "Used in Qt Core (QCryptographicHash).", + "Files": "KeccakF-1600-32-rvk.macros KeccakF-1600-32.macros KeccakF-1600-64.macros KeccakF-1600-interface.h KeccakF-1600-opt32.c KeccakF-1600-opt64.c KeccakF-1600-unrolling.macros KeccakNISTInterface.c KeccakNISTInterface.h KeccakSponge.c KeccakSponge.h", "Description": "SHA-3, originally known as Keccak, is a cryptographic hash function.", "License": "Creative Commons Zero v1.0 Universal", From ae93a76c931d7de768d5ac600a092bdc87915d3e Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 19 Oct 2016 16:33:27 +0200 Subject: [PATCH 056/174] Document The Public Suffix List MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I3c8b00e04ed30209b0de0927b473ba2b9a4f0c87 Reviewed-by: Thiago Macieira Reviewed-by: Topi Reiniö --- src/corelib/io/PSL-LICENSE.txt | 373 +++++++++++++++++++++++++++++ src/corelib/io/qt_attribution.json | 29 +++ src/corelib/io/qurltlds_p.h.INFO | 3 - 3 files changed, 402 insertions(+), 3 deletions(-) create mode 100644 src/corelib/io/PSL-LICENSE.txt diff --git a/src/corelib/io/PSL-LICENSE.txt b/src/corelib/io/PSL-LICENSE.txt new file mode 100644 index 0000000000..d0a1fa1482 --- /dev/null +++ b/src/corelib/io/PSL-LICENSE.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/src/corelib/io/qt_attribution.json b/src/corelib/io/qt_attribution.json index 2a616a2819..c64f8cae4b 100644 --- a/src/corelib/io/qt_attribution.json +++ b/src/corelib/io/qt_attribution.json @@ -1,3 +1,4 @@ +[ { "Id": "qtemporaryfile", "Name": "Parts of QTemporaryFile", @@ -10,4 +11,32 @@ "LicenseId": "BSD-3-Clause", "LicenseFile": "QTEMPORARYFILE_LICENSE.txt", "Copyright": "Copyright (c) 1987, 1993 The Regents of the University of California." +}, +{ + "Id": "psl", + "Name": "The Public Suffix List", + "QDocModule": "qtcore", + "Description": "The Public Suffix List is an initiative of the Mozilla Project, +but is maintained as a community resource. It is available for use in any software, +but was originally created to meet the needs of browser manufacturers. +It allows browsers to, for example: + +- Avoid privacy-damaging \"supercookies\" being set for high-level domain name suffixes + +- Highlight the most important part of a domain name in the user interface + +- Accurately sort history entries by site", + + "Files": "qurltlds_p.h", + "QtUsage": "Used in Qt Core to avoid \"supercookies\" being set in the cookie jar +supported by Qt (by the QNetworkCookieJar class).", + + "Homepage": "http://publicsuffix.org/", + "Version": "Generated on 2016-10-20 from revision 915565885d0fbd25caf7d8b339cd3478f558da94", + "License": "Mozilla Public License 2.0", + "LicenseFile": "PSL-LICENSE.txt", + "LicenseId": "MPL-2.0", + "Copyright": "The list was originally provided by Jo Hermans . +It is now maintained on github (https://github.com/publicsuffix/list)." } +] diff --git a/src/corelib/io/qurltlds_p.h.INFO b/src/corelib/io/qurltlds_p.h.INFO index 3f3d808a21..33ccd458bf 100644 --- a/src/corelib/io/qurltlds_p.h.INFO +++ b/src/corelib/io/qurltlds_p.h.INFO @@ -9,9 +9,6 @@ Those arrays in qurltlds_p.h are derived from the Public Suffix List ([2]), which was originally provided by Jo Hermans . -The file qurltlds_p.h was last generated Thursday, -October 20th 8:40 2016. - ---- [1] list: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 [2] homepage: http://publicsuffix.org/ From b6f4003b87c92061cc5ef22f40f844ae16bf09bb Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 17 Nov 2016 15:48:17 +0100 Subject: [PATCH 057/174] Fix forkfd 3rd party documenation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bring the copyright lines in the license and the one's in the metadata into line by using the ones from forkfd.c. Also bring back description of forkfd from 5.6 documentation. Change-Id: I423ee8d5d1e1c866a34c346f78520d33ea099b5e Reviewed-by: Topi Reiniö --- src/3rdparty/forkfd/LICENSE | 1 + src/3rdparty/forkfd/qt_attribution.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/3rdparty/forkfd/LICENSE b/src/3rdparty/forkfd/LICENSE index 351ebf705d..36ab612951 100644 --- a/src/3rdparty/forkfd/LICENSE +++ b/src/3rdparty/forkfd/LICENSE @@ -1,4 +1,5 @@ Copyright (C) 2016 Intel Corporation. +Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/3rdparty/forkfd/qt_attribution.json b/src/3rdparty/forkfd/qt_attribution.json index 89f25f4870..f004116753 100644 --- a/src/3rdparty/forkfd/qt_attribution.json +++ b/src/3rdparty/forkfd/qt_attribution.json @@ -7,6 +7,6 @@ "License": "MIT License", "LicenseId": "MIT", "LicenseFile": "LICENSE", - "Copyright": "Copyright (C) 2013-2016 Intel Corporation + "Copyright": "Copyright (C) 2016 Intel Corporation Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com" } From b200bc662ee0e593306a2a96a89b57d0e340d2c3 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 17 Nov 2016 15:58:44 +0100 Subject: [PATCH 058/174] Improve documentation for 3rdparty freebsd code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iad5c659c2c422bf20e7ba6161889c7b261512e9e Reviewed-by: Topi Reiniö --- src/3rdparty/freebsd/qt_attribution.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/3rdparty/freebsd/qt_attribution.json b/src/3rdparty/freebsd/qt_attribution.json index 40c337cc67..57f425cdbc 100644 --- a/src/3rdparty/freebsd/qt_attribution.json +++ b/src/3rdparty/freebsd/qt_attribution.json @@ -4,14 +4,10 @@ "QDocModule": "qtcore", "QtUsage": "Used in Qt Core.", + "Description": "strtoll() and strtoull() are functions for converting a string to (unsigned) long long integer.", "License": "BSD 3-clause \"New\" or \"Revised\" License", "LicenseId": "BSD-3-Clause", "LicenseFile": "LICENSE", - "Copyright": "Copyright (c) 1992, 1993 - The Regents of the University of California. All rights reserved. - -Copyright (c) 2011 The FreeBSD Foundation -All rights reserved. -Portions of this software were developed by David Chisnall -under sponsorship from the FreeBSD Foundation." + "Copyright": "Copyright (c) 1992, 1993 The Regents of the University of California. +Copyright (c) 2011 The FreeBSD Foundation" } From 7611028879c81e5072ed96301d7f392a74d7e42c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 22 Nov 2016 15:39:28 +0100 Subject: [PATCH 059/174] List ANGLE contributions after another MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Place ANGLE at the start of the title, so that the different entries are sorted correctly. Change-Id: I11e9d25874f06450a3d9049b5f5c94aa53621e08 Reviewed-by: Topi Reiniö --- src/3rdparty/angle/qt_attribution.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/3rdparty/angle/qt_attribution.json b/src/3rdparty/angle/qt_attribution.json index 230f30940b..e35e1f0eb9 100644 --- a/src/3rdparty/angle/qt_attribution.json +++ b/src/3rdparty/angle/qt_attribution.json @@ -12,7 +12,7 @@ }, { "Id": "angle-arrayboundsclamper", - "Name": "ANGLE Array Bounds Clamper for WebKit", + "Name": "ANGLE: Array Bounds Clamper for WebKit", "QDocModule": "qtgui", "QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.", @@ -25,7 +25,7 @@ }, { "Id": "angle-murmurhash", - "Name": "Murmurhash (as part of ANGLE)", + "Name": "ANGLE: Murmurhash", "QDocModule": "qtgui", "QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.", @@ -36,7 +36,7 @@ }, { "Id": "angle-systeminfo", - "Name": "Systeminfo (as part of ANGLE)", + "Name": "ANGLE: Systeminfo", "QDocModule": "qtgui", "QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.", @@ -48,7 +48,7 @@ }, { "Id": "angle-trace_event", - "Name": "trace_event (as part of ANGLE)", + "Name": "ANGLE: trace_event", "QDocModule": "qtgui", "QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.", From a5cf8d76c265913864298b78fadda61889a1babe Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 1 Nov 2016 15:28:12 +0100 Subject: [PATCH 060/174] Remove second mentioning of cycle.h 3rdparty license MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is now documented in the qt_attribution.json file added in commit 41a7d74385eece725435159ca021151e871bf116 . Change-Id: I4f13397a14de7d9f98ba146cabf64dafac5dada4 Reviewed-by: Topi Reiniö --- src/testlib/doc/src/qttestlib-manual.qdoc | 29 ----------------------- 1 file changed, 29 deletions(-) diff --git a/src/testlib/doc/src/qttestlib-manual.qdoc b/src/testlib/doc/src/qttestlib-manual.qdoc index d775ae5b76..6bdf6c33c7 100644 --- a/src/testlib/doc/src/qttestlib-manual.qdoc +++ b/src/testlib/doc/src/qttestlib-manual.qdoc @@ -361,35 +361,6 @@ See \l {Chapter 5: Writing a Benchmark}{Writing a Benchmark} in the Qt Test Tutorial for more benchmarking examples. - - \section1 3rd Party Code - - The CPU tick counters used for benchmarking are licensed under the following - license: (from src/testlib/3rdparty/cycle.h) - - \legalese - Copyright (c) 2003, 2006 Matteo Frigo\br - Copyright (c) 2003, 2006 Massachusetts Institute of Technology - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - \endlegalese */ /*! From fedc09daa4d2db7435bb0e95641bb3c05fb04acf Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 16 Nov 2016 15:15:51 +0100 Subject: [PATCH 061/174] don't mention config.log in error messages before it even exists Change-Id: I0d56aff4988e92f2e4ce63a6a7939fbb4ceab590 Reviewed-by: Lars Knoll Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_configure.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index 289e2250bd..eaaa161270 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -22,7 +22,7 @@ defineTest(qtConfAddWarning) { defineTest(qtConfAddError) { QT_CONFIGURE_ERRORS += "ERROR: $$join(1, $$escape_expand(\\n))" export(QT_CONFIGURE_ERRORS) - equals(2, log) { + equals(2, log):qt_conf_tests_allowed { CONFIG += mention_config_log export(CONFIG) } From 591d9588f7e755c2b6eef22d572f5f51d7bc23d0 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 18 Nov 2016 21:05:53 +0100 Subject: [PATCH 062/174] fix use of $$QMAKE_QMAKE the variable is converted to a format suitable for makefiles only after the project was read. to access it, one needs to use the exported makefile variable $(QMAKE). amends 2b6bcd5ff. Change-Id: I5eddff4bebbbcf461b565d5033d17a8daff1e6f4 Reviewed-by: Lars Knoll Reviewed-by: Joerg Bornemann --- mkspecs/features/moc.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/moc.prf b/mkspecs/features/moc.prf index 59ed81b49e..bdb4eb49ec 100644 --- a/mkspecs/features/moc.prf +++ b/mkspecs/features/moc.prf @@ -32,7 +32,7 @@ if(gcc|intel_icl|msvc):!rim_qcc:!uikit { 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 { - moc_predefs.commands += $$QMAKE_CXX -Bx$$QMAKE_QMAKE $$QMAKE_CXXFLAGS -E ${QMAKE_FILE_IN} 2>NUL >${QMAKE_FILE_OUT} + moc_predefs.commands += $$QMAKE_CXX -Bx$(QMAKE) $$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 From 6d2f7e9efe1f2e5156014dfa0af42a84d115d00c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 18 Nov 2016 18:35:00 +0100 Subject: [PATCH 063/174] fix handling of -optimized-tools, take 2 amends dfbfc4915. Change-Id: I5516f322fceee0d71c2e09b4314f38207b4ac630 Reviewed-by: Lars Knoll Reviewed-by: Joerg Bornemann --- configure.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.json b/configure.json index 3480aed20f..f774291d22 100644 --- a/configure.json +++ b/configure.json @@ -515,7 +515,7 @@ }, "release_tools": { "label": "Compile tools in release mode", - "autoDetect": "!features.debug", + "autoDetect": "features.debug", "output": [ "privateFeature", "publicQtConfig" ] }, "simulator_and_device": { From 798b09ffe61b6b7f490b7d530f0e89501bbc89fd Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 17 Nov 2016 19:24:49 +0100 Subject: [PATCH 064/174] configure: don't read QMAKESPEC from the environment it was rather unexpected that this was done, entirely inconsistently with how the rest of the configure parameters are handled. Task-number: QTBUG-52266 Change-Id: I6e1d7a4fe1c85d6d64d465517b6be3f3cdda3359 Reviewed-by: Lars Knoll --- configure | 2 +- tools/configure/configureapp.cpp | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/configure b/configure index 938831df09..612ed4bf53 100755 --- a/configure +++ b/configure @@ -479,7 +479,7 @@ XPLATFORM_TVOS=no # Whether target platform is tvOS XPLATFORM_WATCHOS=no # Whether target platform is watchOS XPLATFORM_ANDROID=no XPLATFORM_MINGW=no # Whether target platform is MinGW (win32-g++*) -PLATFORM=$QMAKESPEC +PLATFORM= OPT_CONFIRM_LICENSE=no OPT_SHADOW=maybe OPT_VERBOSE=no diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 8716fa88f7..d9d247dbae 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -107,12 +107,9 @@ Configure::Configure(int& argc, char** argv) dictionary[ "QT_INSTALL_PREFIX" ] = installPath; - dictionary[ "QMAKESPEC" ] = getenv("QMAKESPEC"); if (dictionary[ "QMAKESPEC" ].size() == 0) { dictionary[ "QMAKESPEC" ] = Environment::detectQMakeSpec(); dictionary[ "QMAKESPEC_FROM" ] = "detected"; - } else { - dictionary[ "QMAKESPEC_FROM" ] = "env"; } dictionary[ "SYNCQT" ] = "auto"; @@ -481,12 +478,9 @@ void Configure::parseCmdLine() dictionary[ "DONE" ] = "error"; if (dictionary ["QMAKESPEC_FROM"] == "commandline") { cout << "Invalid option \"" << dictionary["QMAKESPEC"] << "\" for -platform." << endl; - } else if (dictionary ["QMAKESPEC_FROM"] == "env") { - cout << "QMAKESPEC environment variable is set to \"" << dictionary["QMAKESPEC"] - << "\" which is not a supported platform" << endl; } else { // was autodetected from environment cout << "Unable to detect the platform from environment. Use -platform command line" << endl - << "argument or set the QMAKESPEC environment variable and run configure again." << endl; + << "argument and run configure again." << endl; } cout << "See the README file for a list of supported operating systems and compilers." << endl; } else { From 4ce0beee1b69a8695fc24a244a8a3053711906ac Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 18 Nov 2016 18:11:41 +0100 Subject: [PATCH 065/174] configure: delete some dead code and outdated comments Change-Id: I764a9b383176e1fe9573790547ce0e12d1f88261 Reviewed-by: Lars Knoll --- configure | 41 +++----------------------------- qmake/Makefile.unix | 2 +- qmake/Makefile.win32 | 14 +---------- qmake/qmake.pro | 1 - tools/configure/configureapp.cpp | 17 ------------- tools/configure/configureapp.h | 2 -- tools/configure/environment.cpp | 4 ---- tools/configure/environment.h | 1 - 8 files changed, 5 insertions(+), 77 deletions(-) diff --git a/configure b/configure index 612ed4bf53..5a5f564abb 100755 --- a/configure +++ b/configure @@ -399,7 +399,6 @@ HostVar() UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # detect the "echo without newline" style. usage: echo $ECHO_N "$ECHO_C" if echo '\c' | grep '\c' >/dev/null; then @@ -512,8 +511,6 @@ QT_HOST_LIBS= QT_HOST_DATA= QT_EXT_PREFIX= -# default qpa platform - # Android vars CFG_DEFAULT_ANDROID_NDK_ROOT=$ANDROID_NDK_ROOT CFG_DEFAULT_ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT @@ -529,7 +526,6 @@ CFG_DEFAULT_ANDROID_NDK_HOST=$ANDROID_NDK_HOST # parse the arguments, setting things to "yes" or "no" while [ "$#" -gt 0 ]; do CURRENT_OPT="$1" - UNKNOWN_ARG=no case "$1" in #Autoconf style options --enable-*) @@ -658,10 +654,6 @@ while [ "$#" -gt 0 ]; do extprefix) QT_EXT_PREFIX="$VAL" ;; - pkg-config) - ;; - force-pkg-config) - ;; docdir) QT_INSTALL_DOCS="$VAL" ;; @@ -1314,8 +1306,6 @@ if [ "$OPT_SHADOW" = "yes" ]; then [ "$OPT_VERBOSE" = "yes" ] && echo "Performing shadow build..." fi -# if the source tree is different from the build tree, -# symlink or copy part of the sources if [ "$OPT_SHADOW" = "yes" ]; then echo "Preparing build tree..." @@ -1628,35 +1618,21 @@ setBootstrapVariable() } # build qmake -if true; then ###[ '!' -f "$outpath/bin/qmake" ]; echo "Creating qmake..." - mkdir -p "$outpath/qmake" || exit - # fix makefiles - for mkfile in GNUmakefile Makefile; do - EXTRA_LFLAGS= - EXTRA_CFLAGS= - in_mkfile="${mkfile}.in" - if [ "$mkfile" = "Makefile" ]; then -# if which qmake >/dev/null 2>&1 && [ -f qmake/qmake.pro ]; then -# (cd qmake && qmake) >/dev/null 2>&1 && continue -# fi - in_mkfile="${mkfile}.unix" - fi - in_mkfile="$relpath/qmake/$in_mkfile" - mkfile="$outpath/qmake/$mkfile" + + in_mkfile=$relpath/qmake/Makefile.unix + mkfile=$outpath/qmake/Makefile if [ -f "$mkfile" ]; then [ "$CFG_DEV" = "yes" ] && "$WHICH" chflags >/dev/null 2>&1 && chflags nouchg "$mkfile" rm -f "$mkfile" fi - [ -f "$in_mkfile" ] || continue echo "########################################################################" > "$mkfile" echo "## This file was autogenerated by configure, all changes will be lost ##" >> "$mkfile" echo "########################################################################" >> "$mkfile" EXTRA_OBJS= EXTRA_SRCS= - EXTRA_CFLAGS="\$(QMAKE_CFLAGS) \$(QMAKE_CFLAGS_SPLIT_SECTIONS)" EXTRA_CXXFLAGS="\$(QMAKE_CXXFLAGS) \$(QMAKE_CXXFLAGS_CXX11) \$(QMAKE_CXXFLAGS_SPLIT_SECTIONS)" EXTRA_LFLAGS="\$(QMAKE_LFLAGS) \$(QMAKE_LFLAGS_GCSECTIONS)" @@ -1667,8 +1643,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; [ "$CFG_SILENT" = "yes" ] && CC_TRANSFORM='s,^,\@,' || CC_TRANSFORM= setBootstrapVariable QMAKE_CC CC "$CC_TRANSFORM" setBootstrapVariable QMAKE_CXX CXX "$CC_TRANSFORM" - setBootstrapVariable QMAKE_CFLAGS - setBootstrapVariable QMAKE_CFLAGS_SPLIT_SECTIONS setBootstrapVariable QMAKE_CXXFLAGS setBootstrapVariable QMAKE_CXXFLAGS_CXX11 setBootstrapVariable QMAKE_CXXFLAGS_SPLIT_SECTIONS @@ -1676,20 +1650,15 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; setBootstrapVariable QMAKE_LFLAGS_GCSECTIONS if [ "$CFG_DEBUG" = "no" ] || [ "$CFG_RELEASE_TOOLS" = "yes" ]; then - setBootstrapVariable QMAKE_CFLAGS_RELEASE setBootstrapVariable QMAKE_CXXFLAGS_RELEASE - EXTRA_CFLAGS="$EXTRA_CFLAGS \$(QMAKE_CFLAGS_RELEASE)" EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(QMAKE_CXXFLAGS_RELEASE)" else - setBootstrapVariable QMAKE_CFLAGS_DEBUG setBootstrapVariable QMAKE_CXXFLAGS_DEBUG - EXTRA_CFLAGS="$EXTRA_CFLAGS \$(QMAKE_CFLAGS_DEBUG)" EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(QMAKE_CXXFLAGS_DEBUG)" fi case `basename "$PLATFORM"` in win32-g++*) - EXTRA_CFLAGS="$EXTRA_CFLAGS -DUNICODE" EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -DUNICODE" EXTRA_OBJS="qfilesystemengine_win.o \ qfilesystemiterator_win.o \ @@ -1726,7 +1695,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; echo "CARBON_CFLAGS =-fconstant-cfstrings" >>"$mkfile" EXTRA_LFLAGS="$EXTRA_LFLAGS \$(COCOA_LFLAGS)" EXTRA_LFLAGS="$EXTRA_LFLAGS \$(CARBON_LFLAGS)" - EXTRA_CFLAGS="$EXTRA_CFLAGS \$(CARBON_CFLAGS)" EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(CARBON_CFLAGS)" EXTRA_OBJS="$EXTRA_OBJS \ qsettings_mac.o \ @@ -1757,7 +1725,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; echo "QT_MAJOR_VERSION = $QT_MAJOR_VERSION" >> "$mkfile" echo "QT_MINOR_VERSION = $QT_MINOR_VERSION" >> "$mkfile" echo "QT_PATCH_VERSION = $QT_PATCH_VERSION" >> "$mkfile" - echo "EXTRA_CFLAGS = $EXTRA_CFLAGS" >> "$mkfile" echo "EXTRA_CXXFLAGS = $EXTRA_CXXFLAGS" >> "$mkfile" echo "QTOBJS =" $EXTRA_OBJS >> "$mkfile" echo "QTSRCS =" $EXTRA_SRCS >> "$mkfile" @@ -1779,7 +1746,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; rm "$mkfile.tmp" fi fi - done if [ "$OPT_VERBOSE" = yes ]; then # Show the output of make @@ -1797,7 +1763,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; fi echo "Done." fi -fi # Build qmake #------------------------------------------------------------------------------- # create a qt.conf for the Qt build tree itself diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix index 320979150f..0ab2a1b3c6 100644 --- a/qmake/Makefile.unix +++ b/qmake/Makefile.unix @@ -96,7 +96,7 @@ DEPEND_SRC = \ CPPFLAGS = -g $(EXTRA_CPPFLAGS) \ -I$(QMKSRC) -I$(QMKLIBSRC) -I$(QMKSRC)/generators -I$(QMKSRC)/generators/unix -I$(QMKSRC)/generators/win32 \ - -I$(QMKSRC)/generators/mac -I$(QMKSRC)/generators/integrity \ + -I$(QMKSRC)/generators/mac \ -I$(INC_PATH) -I$(INC_PATH)/QtCore \ -I$(INC_PATH)/QtCore/$(QT_VERSION) -I$(INC_PATH)/QtCore/$(QT_VERSION)/QtCore \ -I$(BUILD_PATH)/src/corelib/global \ diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32 index 3e67632939..0a1f5529af 100644 --- a/qmake/Makefile.win32 +++ b/qmake/Makefile.win32 @@ -38,7 +38,7 @@ PCH_OBJECT = qmake_pch.obj CFLAGS_BARE = -c -Fo./ -Fdqmake.pdb \ -W3 -nologo -O1 \ $(CFLAGS_EXTRA) \ - -I$(QMKSRC) -I$(QMKSRC)\library -I$(QMKSRC)\generators -I$(QMKSRC)\generators\unix -I$(QMKSRC)\generators\win32 -I$(QMKSRC)\generators\mac -I$(QMKSRC)\generators\integrity \ + -I$(QMKSRC) -I$(QMKSRC)\library -I$(QMKSRC)\generators -I$(QMKSRC)\generators\unix -I$(QMKSRC)\generators\win32 -I$(QMKSRC)\generators\mac \ -I$(INC_PATH) -I$(INC_PATH)\QtCore -I$(INC_PATH)\QtCore\$(QT_VERSION) -I$(INC_PATH)\QtCore\$(QT_VERSION)\QtCore \ -I$(BUILD_PATH)\src\corelib\global \ -I$(SOURCE_PATH)\mkspecs\$(QMAKESPEC) \ @@ -147,18 +147,9 @@ distclean:: clean -del $(BUILD_PATH)\bin\qmake.exe -del Makefile -.c.obj: - $(CXX) $(CFLAGS) $< - .cpp.obj: $(CXX) $(CXXFLAGS) $< -.cc.obj: - $(CXX) $(CXXFLAGS) $< - -.cxx.obj: - $(CXX) $(CXXFLAGS) $< - $(OBJS): $(PCH_OBJECT) $(QTOBJS): $(PCH_OBJECT) @@ -174,9 +165,6 @@ qmake_pch.obj: {$(SOURCE_PATH)\qmake\generators\mac}.cpp{}.obj:: $(CXX) $(CXXFLAGS) $< -{$(SOURCE_PATH)\qmake\generators\integrity}.cpp{}.obj:: - $(CXX) $(CXXFLAGS) $< - {$(SOURCE_PATH)\qmake\generators\unix}.cpp{}.obj:: $(CXX) $(CXXFLAGS) $< diff --git a/qmake/qmake.pro b/qmake/qmake.pro index 74cefb07aa..1472aef3e4 100644 --- a/qmake/qmake.pro +++ b/qmake/qmake.pro @@ -27,7 +27,6 @@ INCLUDEPATH += . \ generators/unix \ generators/win32 \ generators/mac \ - generators/integrity \ ../tools/shared include(qmake.pri) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index d9d247dbae..870bf3d368 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -173,12 +173,6 @@ QString Configure::formatPath(const QString &path) return ret; } -// #### somehow I get a compiler error about vc++ reaching the nesting limit without -// undefining the ansi for scoping. -#ifdef for -#undef for -#endif - void Configure::parseCmdLine() { sourcePathMangled = sourcePath; @@ -599,16 +593,6 @@ void Configure::generateQDevicePri() dictionary[ "DONE" ] = "error"; } -QString Configure::formatConfigPath(const char *var) -{ - QString val = dictionary[var]; - if (QFileInfo(val).isRelative()) { - QString pfx = dictionary["QT_INSTALL_PREFIX"]; - val = (val == ".") ? pfx : QDir(pfx).absoluteFilePath(val); - } - return QDir::toNativeSeparators(val); -} - void Configure::generateHeaders() { if (dictionary["SYNCQT"] == "auto") @@ -882,7 +866,6 @@ void Configure::buildQmake() << "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl; if (dictionary[ "QMAKESPEC" ].startsWith("win32-g++")) { stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\" << dictionary[ "QMAKESPEC" ] << endl - << "EXTRA_CFLAGS = -DUNICODE -ffunction-sections" << endl << "EXTRA_CXXFLAGS = -std=c++11 -DUNICODE -ffunction-sections" << endl << "EXTRA_LFLAGS = -Wl,--gc-sections" << endl << "QTOBJS = qfilesystemengine_win.o \\" << endl diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h index b1c6ea9181..c8d4d3df53 100644 --- a/tools/configure/configureapp.h +++ b/tools/configure/configureapp.h @@ -88,8 +88,6 @@ private: void saveCmdLine(); void applySpecSpecifics(); - - QString formatConfigPath(const char *var); }; class FileWriter : public QTextStream diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp index 6cc350acc5..17f44c12f7 100644 --- a/tools/configure/environment.cpp +++ b/tools/configure/environment.cpp @@ -62,7 +62,6 @@ struct CompilerInfo{ const char *executable; } compiler_info[] = { // The compilers here are sorted in a reversed-preferred order - {CC_BORLAND, "Borland C++", 0, "bcc32.exe"}, {CC_MINGW, "MinGW (Minimalist GNU for Windows)", 0, "g++.exe"}, {CC_INTEL, "Intel(R) C++ Compiler for 32-bit applications", 0, "icl.exe"}, // xilink.exe, xilink5.exe, xilink6.exe, xilib.exe {CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe @@ -109,9 +108,6 @@ QString Environment::detectQMakeSpec() case CC_MINGW: spec = "win32-g++"; break; - case CC_BORLAND: - spec = "win32-borland"; - break; default: break; } diff --git a/tools/configure/environment.h b/tools/configure/environment.h index d14961b5ac..2ab5b00d1c 100644 --- a/tools/configure/environment.h +++ b/tools/configure/environment.h @@ -33,7 +33,6 @@ QT_BEGIN_NAMESPACE enum Compiler { CC_UNKNOWN = 0, - CC_BORLAND = 0x01, CC_MINGW = 0x02, CC_INTEL = 0x03, CC_MSVC2005 = 0x80, From 9bdb5b5ffea50b2e8d3deb9fd370c2fb5805e076 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 18 Nov 2016 16:27:15 +0100 Subject: [PATCH 066/174] configure: put more of the makefile contents into template files ... instead of having (duplicated) code in the configures to create it. Change-Id: Ia86b44021a024a969f5a49b7fb18d3d414869f93 Reviewed-by: Lars Knoll --- configure | 74 +++++++------------------------- qmake/Makefile.unix | 7 +-- qmake/Makefile.unix.macos | 17 ++++++++ qmake/Makefile.unix.mingw | 27 ++++++++++++ qmake/Makefile.unix.unix | 11 +++++ qmake/Makefile.unix.win32 | 19 ++++++++ tools/configure/configureapp.cpp | 57 ++++-------------------- 7 files changed, 102 insertions(+), 110 deletions(-) create mode 100644 qmake/Makefile.unix.macos create mode 100644 qmake/Makefile.unix.mingw create mode 100644 qmake/Makefile.unix.unix create mode 100644 qmake/Makefile.unix.win32 diff --git a/configure b/configure index 5a5f564abb..bc18e614d2 100755 --- a/configure +++ b/configure @@ -1631,8 +1631,6 @@ setBootstrapVariable() echo "########################################################################" > "$mkfile" echo "## This file was autogenerated by configure, all changes will be lost ##" >> "$mkfile" echo "########################################################################" >> "$mkfile" - EXTRA_OBJS= - EXTRA_SRCS= EXTRA_CXXFLAGS="\$(QMAKE_CXXFLAGS) \$(QMAKE_CXXFLAGS_CXX11) \$(QMAKE_CXXFLAGS_SPLIT_SECTIONS)" EXTRA_LFLAGS="\$(QMAKE_LFLAGS) \$(QMAKE_LFLAGS_GCSECTIONS)" @@ -1657,58 +1655,6 @@ setBootstrapVariable() EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(QMAKE_CXXFLAGS_DEBUG)" fi - case `basename "$PLATFORM"` in - win32-g++*) - EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -DUNICODE" - EXTRA_OBJS="qfilesystemengine_win.o \ - qfilesystemiterator_win.o \ - qfsfileengine_win.o \ - qlocale_win.o \ - qsettings_win.o \ - qsystemlibrary.o \ - registry.o" - EXTRA_SRCS="\"\$(SOURCE_PATH)/src/corelib/corelib/io/qfilesystemengine_win.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/io/qsettings_win.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp\" \ - \"\$(SOURCE_PATH)/tools/shared/windows/registry.cpp\"" - EXTRA_LFLAGS="$EXTRA_LFLAGS -static -s -lole32 -luuid -ladvapi32 -lkernel32" - EXEEXT=".exe" - ;; - *) - EXTRA_OBJS="qfilesystemengine_unix.o \ - qfilesystemiterator_unix.o \ - qfsfileengine_unix.o \ - qlocale_unix.o" - EXTRA_SRCS="\"\$(SOURCE_PATH)/src/corelib/io/qfilesystemengine_unix.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_unix.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp\"" - EXEEXT= - ;; - esac - if [ "$BUILD_ON_MAC" = "yes" ]; then - echo "COCOA_LFLAGS =-framework Foundation -framework CoreServices" >>"$mkfile" - echo "CARBON_LFLAGS =-framework ApplicationServices" >>"$mkfile" - echo "CARBON_CFLAGS =-fconstant-cfstrings" >>"$mkfile" - EXTRA_LFLAGS="$EXTRA_LFLAGS \$(COCOA_LFLAGS)" - EXTRA_LFLAGS="$EXTRA_LFLAGS \$(CARBON_LFLAGS)" - EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(CARBON_CFLAGS)" - EXTRA_OBJS="$EXTRA_OBJS \ - qsettings_mac.o \ - qcore_mac.o \ - qcore_mac_objc.o \ - qcore_foundation.o" - EXTRA_SRCS="$EXTRA_SRCS \ - \"\$(SOURCE_PATH)/src/corelib/io/qsettings_mac.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp\" \ - \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm\" \ - \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm\"" - fi - - echo >>"$mkfile" adjrelpath=`echo "$relpath" | sed 's/ /\\\\\\\\ /g'` adjoutpath=`echo "$outpath" | sed 's/ /\\\\\\\\ /g'` adjqmakespec=`echo "$QMAKESPEC" | sed 's/ /\\\\\\\\ /g'` @@ -1725,14 +1671,24 @@ setBootstrapVariable() echo "QT_MAJOR_VERSION = $QT_MAJOR_VERSION" >> "$mkfile" echo "QT_MINOR_VERSION = $QT_MINOR_VERSION" >> "$mkfile" echo "QT_PATCH_VERSION = $QT_PATCH_VERSION" >> "$mkfile" - echo "EXTRA_CXXFLAGS = $EXTRA_CXXFLAGS" >> "$mkfile" - echo "QTOBJS =" $EXTRA_OBJS >> "$mkfile" - echo "QTSRCS =" $EXTRA_SRCS >> "$mkfile" - echo "LFLAGS = $EXTRA_LFLAGS" >> "$mkfile" - echo "EXEEXT = $EXEEXT" >> "$mkfile" + echo "CONFIG_CXXFLAGS = $EXTRA_CXXFLAGS" >> "$mkfile" + echo "CONFIG_LFLAGS = $EXTRA_LFLAGS" >> "$mkfile" echo "RM_F = rm -f" >> "$mkfile" echo "RM_RF = rm -rf" >> "$mkfile" + case `basename "$PLATFORM"` in + win32-g++*) + cat "$in_mkfile.win32" >> "$mkfile" + ;; + *) + cat "$in_mkfile.unix" >> "$mkfile" + if [ "$BUILD_ON_MAC" = "yes" ]; then + cat "$in_mkfile.macos" >> "$mkfile" + fi + ;; + esac + echo >>"$mkfile" + if [ "$BUILD_ON_MAC" = "yes" ]; then echo "EXTRA_CXXFLAGS += -MMD" >> "$mkfile" cat "$in_mkfile" >> "$mkfile" diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix index 0ab2a1b3c6..808a6d8233 100644 --- a/qmake/Makefile.unix +++ b/qmake/Makefile.unix @@ -20,7 +20,7 @@ QOBJS=qtextcodec.o qutfcodec.o qstring.o qstring_compat.o qstringbuilder.o qtext qvariant.o qvsnprintf.o qlocale.o qlocale_tools.o qlinkedlist.o qnumeric.o \ qcryptographichash.o qxmlstream.o qxmlutils.o qlogging.o \ qjson.o qjsondocument.o qjsonparser.o qjsonarray.o qjsonobject.o qjsonvalue.o \ - $(QTOBJS) + $(QTOBJS) $(QTOBJS2) #all sources, used for the depend target @@ -92,7 +92,7 @@ DEPEND_SRC = \ $(SOURCE_PATH)/src/corelib/json/qjsonarray.cpp \ $(SOURCE_PATH)/src/corelib/json/qjsonobject.cpp \ $(SOURCE_PATH)/src/corelib/json/qjsonvalue.cpp \ - $(QTSRCS) + $(QTSRCS) $(QTSRCS2) CPPFLAGS = -g $(EXTRA_CPPFLAGS) \ -I$(QMKSRC) -I$(QMKLIBSRC) -I$(QMKSRC)/generators -I$(QMKSRC)/generators/unix -I$(QMKSRC)/generators/win32 \ @@ -106,7 +106,8 @@ CPPFLAGS = -g $(EXTRA_CPPFLAGS) \ -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DPROEVALUATOR_FULL \ -DQT_NO_FOREACH -CXXFLAGS = $(EXTRA_CXXFLAGS) $(CPPFLAGS) +CXXFLAGS = $(EXTRA_CXXFLAGS) $(CONFIG_CXXFLAGS) $(CPPFLAGS) +LFLAGS = $(EXTRA_LFLAGS) $(CONFIG_LFLAGS) first all: $(BUILD_PATH)/bin/qmake$(EXEEXT) qmake: $(BUILD_PATH)/bin/qmake$(EXEEXT) diff --git a/qmake/Makefile.unix.macos b/qmake/Makefile.unix.macos new file mode 100644 index 0000000000..06b875a84a --- /dev/null +++ b/qmake/Makefile.unix.macos @@ -0,0 +1,17 @@ +COCOA_LFLAGS = -framework Foundation -framework CoreServices +CARBON_LFLAGS = -framework ApplicationServices +CARBON_CFLAGS = -fconstant-cfstrings + +EXTRA_CXXFLAGS = $(CARBON_CFLAGS) +EXTRA_LFLAGS = $(COCOA_LFLAGS) $(CARBON_LFLAGS) + +QTOBJS2 = \ + qsettings_mac.o \ + qcore_mac.o \ + qcore_mac_objc.o \ + qcore_foundation.o +QTSRCS2 = \ + $(SOURCE_PATH)/src/corelib/io/qsettings_mac.cpp \ + $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp \ + $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm \ + $(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm diff --git a/qmake/Makefile.unix.mingw b/qmake/Makefile.unix.mingw new file mode 100644 index 0000000000..2c52c07dca --- /dev/null +++ b/qmake/Makefile.unix.mingw @@ -0,0 +1,27 @@ +# SHELL is the full path of sh.exe, unless +# 1) it is found in the current directory +# 2) it is not found at all +# 3) it is overridden on the command line with an existing file +# ... otherwise it is always sh.exe. Specifically, SHELL from the +# environment has no effect. +# +# This check will fail if SHELL is explicitly set to a not +# sh-compatible shell. This is not a problem, because configure.bat +# will not do that. +ifeq ($(SHELL), sh.exe) + ifeq ($(wildcard $(CURDIR)/sh.exe), ) + SH = 0 + else + SH = 1 + endif +else + SH = 1 +endif + +ifeq ($(SH), 1) + RM_F = rm -f + RM_RF = rm -rf +else + RM_F = del /f + RM_RF = rmdir /s /q +endif diff --git a/qmake/Makefile.unix.unix b/qmake/Makefile.unix.unix new file mode 100644 index 0000000000..63eba4f5a5 --- /dev/null +++ b/qmake/Makefile.unix.unix @@ -0,0 +1,11 @@ +EXEEXT = +QTOBJS = \ + qfilesystemengine_unix.o \ + qfilesystemiterator_unix.o \ + qfsfileengine_unix.o \ + qlocale_unix.o +QTSRCS = \ + $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_unix.cpp \ + $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_unix.cpp \ + $(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp \ + $(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp diff --git a/qmake/Makefile.unix.win32 b/qmake/Makefile.unix.win32 new file mode 100644 index 0000000000..be7245a370 --- /dev/null +++ b/qmake/Makefile.unix.win32 @@ -0,0 +1,19 @@ +EXEEXT = .exe +EXTRA_CXXFLAGS = -DUNICODE +EXTRA_LFLAGS = -static -s -lole32 -luuid -ladvapi32 -lkernel32 +QTOBJS = \ + qfilesystemengine_win.o \ + qfilesystemiterator_win.o \ + qfsfileengine_win.o \ + qlocale_win.o \ + qsettings_win.o \ + qsystemlibrary.o \ + registry.o +QTSRCS = \ + $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp \ + $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp \ + $(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp \ + $(SOURCE_PATH)/src/corelib/io/qsettings_win.cpp \ + $(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp \ + $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp \ + $(SOURCE_PATH)/tools/shared/windows/registry.cpp diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 870bf3d368..f7baf4086b 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -866,54 +866,15 @@ void Configure::buildQmake() << "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl; if (dictionary[ "QMAKESPEC" ].startsWith("win32-g++")) { stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\" << dictionary[ "QMAKESPEC" ] << endl - << "EXTRA_CXXFLAGS = -std=c++11 -DUNICODE -ffunction-sections" << endl - << "EXTRA_LFLAGS = -Wl,--gc-sections" << endl - << "QTOBJS = qfilesystemengine_win.o \\" << endl - << " qfilesystemiterator_win.o \\" << endl - << " qfsfileengine_win.o \\" << endl - << " qlocale_win.o \\" << endl - << " qsettings_win.o \\" << endl - << " qsystemlibrary.o \\" << endl - << " registry.o" << endl - << "QTSRCS=\"$(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp\" \\" << endl - << " \"$(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp\" \\" << endl - << " \"$(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp\" \\" << endl - << " \"$(SOURCE_PATH)/src/corelib/io/qsettings_win.cpp\" \\" << endl - << " \"$(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp\" \\" << endl\ - << " \"$(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp\" \\" << endl - << " \"$(SOURCE_PATH)/tools/shared/windows/registry.cpp\"" << endl - << "EXEEXT=.exe" << endl - << "LFLAGS=-static -s -lole32 -luuid -ladvapi32 -lkernel32" << endl; - /* - ** SHELL is the full path of sh.exe, unless - ** 1) it is found in the current directory - ** 2) it is not found at all - ** 3) it is overridden on the command line with an existing file - ** ... otherwise it is always sh.exe. Specifically, SHELL from the - ** environment has no effect. - ** - ** This check will fail if SHELL is explicitly set to a not - ** sh-compatible shell. This is not a problem, because configure.bat - ** will not do that. - */ - stream << "ifeq ($(SHELL), sh.exe)" << endl - << " ifeq ($(wildcard $(CURDIR)/sh.exe), )" << endl - << " SH = 0" << endl - << " else" << endl - << " SH = 1" << endl - << " endif" << endl - << "else" << endl - << " SH = 1" << endl - << "endif" << endl - << "\n" - << "ifeq ($(SH), 1)" << endl - << " RM_F = rm -f" << endl - << " RM_RF = rm -rf" << endl - << "else" << endl - << " RM_F = del /f" << endl - << " RM_RF = rmdir /s /q" << endl - << "endif" << endl; - stream << "\n\n"; + << "CONFIG_CXXFLAGS = -std=c++11 -ffunction-sections" << endl + << "CONFIG_LFLAGS = -Wl,--gc-sections" << endl; + + QFile in(sourcePath + "/qmake/Makefile.unix.win32"); + if (in.open(QFile::ReadOnly | QFile::Text)) + stream << in.readAll(); + QFile in2(sourcePath + "/qmake/Makefile.unix.mingw"); + if (in2.open(QFile::ReadOnly | QFile::Text)) + stream << in2.readAll(); } else { stream << "QMAKESPEC = " << dictionary["QMAKESPEC"] << endl; } From 53686bf86db1c2695ee16b903e4b86cc3ee74006 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 16 Nov 2016 15:57:36 +0100 Subject: [PATCH 067/174] configure: simplify version string setup this basically finishes the job of 2d2cb6434. Change-Id: I47a5e29ca0df7f521242790be64a09b3514be464 Reviewed-by: Lars Knoll --- tools/configure/configureapp.cpp | 38 +++++--------------------------- 1 file changed, 5 insertions(+), 33 deletions(-) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index f7baf4086b..2e6ee2a681 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -117,34 +117,6 @@ Configure::Configure(int& argc, char** argv) //Only used when cross compiling. dictionary[ "QT_INSTALL_SETTINGS" ] = "/etc/xdg"; - QString version; - QFile qmake_conf(sourcePath + "/.qmake.conf"); - if (qmake_conf.open(QFile::ReadOnly)) { - while (!qmake_conf.atEnd()) { - static const char beginning[] = "MODULE_VERSION = "; - QByteArray line = qmake_conf.readLine(); - if (!line.startsWith(beginning)) - continue; - - version = qMove(line).mid(int(strlen(beginning))).trimmed(); - break; - } - qmake_conf.close(); - } - - if (version.isEmpty()) - version = QString("%1.%2.%3").arg(QT_VERSION>>16).arg(((QT_VERSION>>8)&0xff)).arg(QT_VERSION&0xff); - - dictionary[ "VERSION" ] = version; - { - QRegExp version_re("([0-9]*)\\.([0-9]*)\\.([0-9]*)(|-.*)"); - if (version_re.exactMatch(version)) { - dictionary[ "VERSION_MAJOR" ] = version_re.cap(1); - dictionary[ "VERSION_MINOR" ] = version_re.cap(2); - dictionary[ "VERSION_PATCH" ] = version_re.cap(3); - } - } - dictionary[ "REDO" ] = "no"; dictionary[ "BUILDTYPE" ] = "none"; @@ -604,7 +576,7 @@ void Configure::generateHeaders() QStringList args; args << "perl" << "-w"; args += sourcePath + "/bin/syncqt.pl"; - args << "-version" << dictionary["VERSION"] << "-minimal" << "-module" << "QtCore"; + args << "-version" << QT_VERSION_STR << "-minimal" << "-module" << "QtCore"; args += sourcePath; int retc = Environment::execute(args, QStringList(), QStringList()); if (retc) { @@ -860,10 +832,10 @@ void Configure::buildQmake() << "INC_PATH = " << QDir::toNativeSeparators( (QFile::exists(sourcePath + "/.git") ? ".." : sourcePath) + "/include") << endl; - stream << "QT_VERSION = " << dictionary["VERSION"] << endl - << "QT_MAJOR_VERSION = " << dictionary["VERSION_MAJOR"] << endl - << "QT_MINOR_VERSION = " << dictionary["VERSION_MINOR"] << endl - << "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl; + stream << "QT_VERSION = " QT_VERSION_STR << endl + << "QT_MAJOR_VERSION = " QT_STRINGIFY(QT_VERSION_MAJOR) << endl + << "QT_MINOR_VERSION = " QT_STRINGIFY(QT_VERSION_MINOR) << endl + << "QT_PATCH_VERSION = " QT_STRINGIFY(QT_VERSION_PATCH) << endl; if (dictionary[ "QMAKESPEC" ].startsWith("win32-g++")) { stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\" << dictionary[ "QMAKESPEC" ] << endl << "CONFIG_CXXFLAGS = -std=c++11 -ffunction-sections" << endl From 9204b8c31ea1b5f0c05870c5b5d74c33b1a4f622 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 7 Nov 2016 14:37:58 +0100 Subject: [PATCH 068/174] Register fonts with preferred names on Windows Looks up the canonical names of enumerated fonts and register them under their preferred names if present. Also changes the logic handling registration of english aliases, so it is always done, even if it might in rare cases cause a double registration since that is safe. Task-number: QTBUG-53458 Change-Id: Ia010774b26072192b55697b717cc37442c852881 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../windows/qwindowsfontdatabase.cpp | 217 ++++++++++-------- .../windows/qwindowsfontdatabase_ft.cpp | 105 ++++----- .../windows/qwindowsfontdatabase_p.h | 25 +- .../windows/qwindowsfontengine.cpp | 16 +- .../direct2d/qwindowsdirect2dpaintengine.cpp | 2 +- .../text/qfontdatabase/tst_qfontdatabase.cpp | 4 + 6 files changed, 194 insertions(+), 175 deletions(-) diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp index b8d997bc35..1c615e06ed 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -759,7 +759,7 @@ static inline QFontDatabase::WritingSystem writingSystemFromCharSet(uchar charSe ((quint32)(ch1)) \ ) -bool localizedName(const QString &name) +bool qt_localizedName(const QString &name) { const QChar *c = name.unicode(); for (int i = 0; i < name.length(); ++i) { @@ -769,24 +769,8 @@ bool localizedName(const QString &name) return false; } -static inline quint16 getUShort(const unsigned char *p) -{ - quint16 val; - val = *p++ << 8; - val |= *p; - - return val; -} - namespace { -struct FontNames { - QString name; // e.g. "DejaVu Sans Condensed" - QString style; // e.g. "Italic" - QString preferredName; // e.g. "DejaVu Sans" - QString preferredStyle; // e.g. "Condensed Italic" -}; - static QString readName(bool unicode, const uchar *string, int length) { QString out; @@ -797,7 +781,7 @@ static QString readName(bool unicode, const uchar *string, int length) out.resize(length); QChar *uc = out.data(); for (int i = 0; i < length; ++i) - uc[i] = getUShort(string + 2*i); + uc[i] = qt_getUShort(string + 2*i); } else { // Apple Roman @@ -822,7 +806,7 @@ enum PlatformFieldValue { PlatformId_Microsoft = 3 }; -static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) +FontNames qt_getCanonicalFontNames(const uchar *table, quint32 bytes) { FontNames out; const int NameRecordSize = 12; @@ -836,11 +820,11 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) if (bytes < 8) return out; - if (getUShort(table) != 0) + if (qt_getUShort(table) != 0) return out; - count = getUShort(table+2); - string_offset = getUShort(table+4); + count = qt_getUShort(table + 2); + string_offset = qt_getUShort(table + 4); names = table + 6; if (string_offset >= bytes || 6 + count*NameRecordSize > string_offset) @@ -859,10 +843,10 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) for (int i = 0; i < count; ++i) { // search for the correct name entries - quint16 platform_id = getUShort(names + i*NameRecordSize); - quint16 encoding_id = getUShort(names + 2 + i*NameRecordSize); - quint16 language_id = getUShort(names + 4 + i*NameRecordSize); - quint16 name_id = getUShort(names + 6 + i*NameRecordSize); + quint16 platform_id = qt_getUShort(names + i*NameRecordSize); + quint16 encoding_id = qt_getUShort(names + 2 + i*NameRecordSize); + quint16 language_id = qt_getUShort(names + 4 + i*NameRecordSize); + quint16 name_id = qt_getUShort(names + 6 + i*NameRecordSize); PlatformIdType *idType = nullptr; int *id = nullptr; @@ -888,8 +872,8 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) continue; } - quint16 length = getUShort(names + 8 + i*NameRecordSize); - quint16 offset = getUShort(names + 10 + i*NameRecordSize); + quint16 length = qt_getUShort(names + 8 + i*NameRecordSize); + quint16 offset = qt_getUShort(names + 10 + i*NameRecordSize); if (DWORD(string_offset + offset + length) > bytes) continue; @@ -916,8 +900,8 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) if (idStatus[i] == NotFound) continue; int id = ids[i]; - quint16 length = getUShort(names + 8 + id * NameRecordSize); - quint16 offset = getUShort(names + 10 + id * NameRecordSize); + quint16 length = qt_getUShort(names + 8 + id * NameRecordSize); + quint16 offset = qt_getUShort(names + 10 + id * NameRecordSize); const unsigned char *string = table + string_offset + offset; strings[i] = readName(idStatus[i] != Apple, string, length); } @@ -931,7 +915,7 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) } // namespace -QString getEnglishName(const QString &familyName, bool includeStyle = false) +QString qt_getEnglishName(const QString &familyName, bool includeStyle) { QString i18n_name; QString faceName = familyName; @@ -970,7 +954,7 @@ QString getEnglishName(const QString &familyName, bool includeStyle = false) goto error; { - const FontNames names = getCanonicalFontNames(table, bytes); + const FontNames names = qt_getCanonicalFontNames(table, bytes); i18n_name = names.name; if (includeStyle) i18n_name += QLatin1Char(' ') + names.style; @@ -985,16 +969,63 @@ error: return i18n_name; } -static bool addFontToDatabase(const QString &familyName, const QString &styleName, uchar charSet, +// Note this duplicates parts of qt_getEnglishName, we should try to unify the two functions. +FontNames qt_getCanonicalFontNames(const LOGFONT &lf) +{ + FontNames fontNames; + HDC hdc = GetDC(0); + HFONT hfont = CreateFontIndirect(&lf); + + if (!hfont) { + ReleaseDC(0, hdc); + return fontNames; + } + + HGDIOBJ oldobj = SelectObject(hdc, hfont); + + // get the name table + QByteArray table; + const DWORD name_tag = MAKE_TAG('n', 'a', 'm', 'e'); + DWORD bytes = GetFontData(hdc, name_tag, 0, 0, 0); + if (bytes != GDI_ERROR) { + table.resize(bytes); + + if (GetFontData(hdc, name_tag, 0, table.data(), bytes) != GDI_ERROR) + fontNames = qt_getCanonicalFontNames(reinterpret_cast(table.constData()), bytes); + } + + SelectObject(hdc, oldobj); + DeleteObject(hfont); + ReleaseDC(0, hdc); + + return fontNames; +} + +static QChar *createFontFile(const QString &faceName) +{ + QChar *faceNamePtr = nullptr; + if (!faceName.isEmpty()) { + const int nameLength = qMin(faceName.length(), LF_FACESIZE - 1); + faceNamePtr = new QChar[nameLength + 1]; + memcpy(faceNamePtr, faceName.utf16(), sizeof(wchar_t) * nameLength); + faceNamePtr[nameLength] = 0; + } + return faceNamePtr; +} + +static bool addFontToDatabase(QString familyName, + QString styleName, + const LOGFONT &logFont, const TEXTMETRIC *textmetric, const FONTSIGNATURE *signature, - int type, - bool registerAlias) + int type) { // the "@family" fonts are just the same as "family". Ignore them. if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_"))) return false; + uchar charSet = logFont.lfCharSet; + static const int SMOOTH_SCALABLE = 0xffff; const QString foundryName; // No such concept. const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH); @@ -1023,10 +1054,24 @@ static bool addFontToDatabase(const QString &familyName, const QString &styleNam qCDebug(lcQpaFonts) << message; } #endif - QString englishName; - if (registerAlias && ttf && localizedName(familyName)) - englishName = getEnglishName(familyName); + QString faceName; + + QString subFamilyName; + QString subFamilyStyle; + if (ttf) { + // Look-up names registered in the font + FontNames canonicalNames = qt_getCanonicalFontNames(logFont); + if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty()) + englishName = canonicalNames.name; + if (!canonicalNames.preferredName.isEmpty()) { + subFamilyName = familyName; + subFamilyStyle = styleName; + faceName = familyName; // Remember the original name for later lookups + familyName = canonicalNames.preferredName; + styleName = canonicalNames.preferredStyle; + } + } QSupportedWritingSystems writingSystems; if (type & TRUETYPE_FONTTYPE) { @@ -1054,32 +1099,36 @@ static bool addFontToDatabase(const QString &familyName, const QString &styleNam } QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight, - style, stretch, antialias, scalable, size, fixed, writingSystems, 0); + style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName)); + // add fonts windows can generate for us: if (weight <= QFont::DemiBold && styleName.isEmpty()) QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, - style, stretch, antialias, scalable, size, fixed, writingSystems, 0); + style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName)); if (style != QFont::StyleItalic && styleName.isEmpty()) QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight, - QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0); + QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName)); if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty()) QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, - QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0); + QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName)); - if (!englishName.isEmpty()) + if (!subFamilyName.isEmpty() && familyName != subFamilyName) { + QPlatformFontDatabase::registerFont(subFamilyName, subFamilyStyle, foundryName, weight, + style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName)); + } + + if (!englishName.isEmpty() && englishName != familyName) QPlatformFontDatabase::registerAliasToFontFamily(familyName, englishName); return true; } static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD type, LPARAM lParam) + DWORD type, LPARAM) { const ENUMLOGFONTEX *f = reinterpret_cast(logFont); const QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName); const QString styleName = QString::fromWCharArray(f->elfStyle); - const uchar charSet = f->elfLogFont.lfCharSet; - const bool registerAlias = bool(lParam); // NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according // to the documentation is identical to a TEXTMETRIC except for the last four @@ -1087,13 +1136,13 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t const FONTSIGNATURE *signature = Q_NULLPTR; if (type & TRUETYPE_FONTTYPE) signature = &reinterpret_cast(textmetric)->ntmFontSig; - addFontToDatabase(familyName, styleName, charSet, textmetric, signature, type, registerAlias); + addFontToDatabase(familyName, styleName, *logFont, textmetric, signature, type); // keep on enumerating return 1; } -void QWindowsFontDatabase::populateFamily(const QString &familyName, bool registerAlias) +void QWindowsFontDatabase::populateFamily(const QString &familyName) { qCDebug(lcQpaFonts) << familyName; if (familyName.size() >= LF_FACESIZE) { @@ -1106,29 +1155,12 @@ void QWindowsFontDatabase::populateFamily(const QString &familyName, bool regist familyName.toWCharArray(lf.lfFaceName); lf.lfFaceName[familyName.size()] = 0; lf.lfPitchAndFamily = 0; - EnumFontFamiliesEx(dummy, &lf, storeFont, LPARAM(registerAlias), 0); + EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0); ReleaseDC(0, dummy); } -void QWindowsFontDatabase::populateFamily(const QString &familyName) -{ - populateFamily(familyName, false); -} - -namespace { -// Context for enumerating system fonts, records whether the default font has been encountered, -// which is normally not enumerated by EnumFontFamiliesEx(). -struct PopulateFamiliesContext -{ - PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {} - - QString systemDefaultFont; - bool seenSystemDefaultFont; -}; -} // namespace - -static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD, LPARAM lparam) +static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *, + DWORD, LPARAM) { // the "@family" fonts are just the same as "family". Ignore them. const ENUMLOGFONTEX *f = reinterpret_cast(logFont); @@ -1136,22 +1168,6 @@ static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TE if (faceNameW[0] && faceNameW[0] != L'@' && wcsncmp(faceNameW, L"WST_", 4)) { const QString faceName = QString::fromWCharArray(faceNameW); QPlatformFontDatabase::registerFontFamily(faceName); - PopulateFamiliesContext *context = reinterpret_cast(lparam); - if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - - // Register current font's english name as alias - const bool ttf = textmetric->tmPitchAndFamily & TMPF_TRUETYPE; - if (ttf && localizedName(faceName)) { - const QString englishName = getEnglishName(faceName); - if (!englishName.isEmpty()) { - QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); - // Check whether the system default font name is an alias of the current font family name, - // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name - if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - } - } } return 1; // continue } @@ -1164,12 +1180,10 @@ void QWindowsFontDatabase::populateFontDatabase() lf.lfCharSet = DEFAULT_CHARSET; lf.lfFaceName[0] = 0; lf.lfPitchAndFamily = 0; - PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family()); - EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast(&context), 0); + EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, 0, 0); ReleaseDC(0, dummy); // Work around EnumFontFamiliesEx() not listing the system font. - if (!context.seenSystemDefaultFont) - QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont); + QPlatformFontDatabase::registerFontFamily(QWindowsFontDatabase::systemDefaultFont().family()); } typedef QSharedPointer QWindowsFontEngineDataPtr; @@ -1228,7 +1242,8 @@ QFontEngineMulti *QWindowsFontDatabase::fontEngineMulti(QFontEngine *fontEngine, QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, void *handle) { - QFontEngine *fe = QWindowsFontDatabase::createEngine(fontDef, + const QString faceName(static_cast(handle)); + QFontEngine *fe = QWindowsFontDatabase::createEngine(fontDef, faceName, defaultVerticalDPI(), sharedFontData()); qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDEF" << fontDef << fe << handle; @@ -1282,7 +1297,7 @@ QT_WARNING_POP request.hintingPreference = hintingPreference; request.stretch = QFont::Unstretched; - fontEngine = QWindowsFontDatabase::createEngine(request, + fontEngine = QWindowsFontDatabase::createEngine(request, QString(), defaultVerticalDPI(), sharedFontData()); @@ -1461,7 +1476,7 @@ static void getFamiliesAndSignatures(const QByteArray &fontData, getFontTable(data, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length); if (!table) continue; - FontNames names = getCanonicalFontNames(table, length); + FontNames names = qt_getCanonicalFontNames(table, length); if (names.name.isEmpty()) continue; @@ -1523,8 +1538,8 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData, TEXTMETRIC textMetrics; GetTextMetrics(hdc, &textMetrics); - addFontToDatabase(familyName, styleName, lf.lfCharSet, &textMetrics, &signatures.at(j), - TRUETYPE_FONTTYPE, true); + addFontToDatabase(familyName, styleName, lf, &textMetrics, &signatures.at(j), + TRUETYPE_FONTTYPE); SelectObject(hdc, oldobj); DeleteObject(hfont); @@ -1550,7 +1565,7 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData, for (int j = 0; j < families.count(); ++j) { const QString familyName = families.at(j).name; familyNames << familyName; - populateFamily(familyName, true); + populateFamily(familyName); } } @@ -1571,8 +1586,10 @@ void QWindowsFontDatabase::removeApplicationFonts() m_applicationFonts.clear(); } -void QWindowsFontDatabase::releaseHandle(void * /* handle */) +void QWindowsFontDatabase::releaseHandle(void *handle) { + const QChar *faceName = reinterpret_cast(handle); + delete[] faceName; } QString QWindowsFontDatabase::fontDir() const @@ -1663,7 +1680,7 @@ static const char *kr_tryFonts[] = { static const char **tryFonts = 0; -LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request) +LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request, const QString &faceName) { LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); @@ -1738,7 +1755,9 @@ LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request) lf.lfPitchAndFamily = DEFAULT_PITCH | hint; - QString fam = request.family; + QString fam = faceName; + if (fam.isEmpty()) + fam = request.family; if (Q_UNLIKELY(fam.size() >= LF_FACESIZE)) { qCritical("%s: Family name '%s' is too long.", __FUNCTION__, qPrintable(fam)); fam.truncate(LF_FACESIZE - 1); @@ -1837,13 +1856,13 @@ QStringList QWindowsFontDatabase::fallbacksForFamily(const QString &family, QFon } -QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, +QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, const QString &faceName, int dpi, const QSharedPointer &data) { QFontEngine *fe = 0; - LOGFONT lf = fontDefToLOGFONT(request); + LOGFONT lf = fontDefToLOGFONT(request, faceName); const bool preferClearTypeAA = lf.lfQuality == CLEARTYPE_QUALITY; if (request.stretch != 100) { diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp index 4d973bbf17..df84198862 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp @@ -100,9 +100,6 @@ static FontFile * createFontFile(const QString &fileName, int index) return fontFile; } -extern bool localizedName(const QString &name); -extern QString getEnglishName(const QString &familyName, bool includeStyle = false); - namespace { struct FontKey { @@ -162,19 +159,20 @@ static const FontKey *findFontKey(const QString &name, int *indexIn = Q_NULLPTR) return Q_NULLPTR; } -static bool addFontToDatabase(const QString &faceName, - const QString &styleName, +static bool addFontToDatabase(QString familyName, + QString styleName, const QString &fullName, - uchar charSet, + const LOGFONT &logFont, const TEXTMETRIC *textmetric, const FONTSIGNATURE *signature, - int type, - bool registerAlias) + int type) { // the "@family" fonts are just the same as "family". Ignore them. - if (faceName.isEmpty() || faceName.at(0) == QLatin1Char('@') || faceName.startsWith(QLatin1String("WST_"))) + if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_"))) return false; + uchar charSet = logFont.lfCharSet; + static const int SMOOTH_SCALABLE = 0xffff; const QString foundryName; // No such concept. const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH); @@ -190,7 +188,7 @@ static bool addFontToDatabase(const QString &faceName, if (lcQpaFonts().isDebugEnabled()) { QString message; QTextStream str(&message); - str << __FUNCTION__ << ' ' << faceName << "::" << fullName << ' ' << charSet << " TTF=" << ttf; + str << __FUNCTION__ << ' ' << familyName << "::" << fullName << ' ' << charSet << " TTF=" << ttf; if (type & DEVICE_FONTTYPE) str << " DEVICE"; if (type & RASTER_FONTTYPE) @@ -205,8 +203,22 @@ static bool addFontToDatabase(const QString &faceName, #endif QString englishName; - if (registerAlias & ttf && localizedName(faceName)) - englishName = getEnglishName(faceName); + QString faceName = familyName; + + QString subFamilyName; + QString subFamilyStyle; + if (ttf) { + // Look-up names registered in the font + FontNames canonicalNames = qt_getCanonicalFontNames(logFont); + if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty()) + englishName = canonicalNames.name; + if (!canonicalNames.preferredName.isEmpty()) { + subFamilyName = familyName; + subFamilyStyle = styleName; + familyName = canonicalNames.preferredName; + styleName = canonicalNames.preferredStyle; + } + } QSupportedWritingSystems writingSystems; if (type & TRUETYPE_FONTTYPE) { @@ -243,12 +255,10 @@ static bool addFontToDatabase(const QString &faceName, && systemLocale.language() != QLocale::English && styleName != QLatin1String("Italic") && styleName != QLatin1String("Bold")) { - key = findFontKey(getEnglishName(fullName, true), &index); + key = findFontKey(qt_getEnglishName(fullName, true), &index); } if (!key) key = findFontKey(faceName, &index); - if (!key && !registerAlias && englishName.isEmpty() && localizedName(faceName)) - englishName = getEnglishName(faceName); if (!key && !englishName.isEmpty()) key = findFontKey(englishName, &index); if (!key) @@ -261,24 +271,29 @@ static bool addFontToDatabase(const QString &faceName, if (!QDir::isAbsolutePath(value)) value.prepend(QFile::decodeName(qgetenv("windir") + "\\Fonts\\")); - QPlatformFontDatabase::registerFont(faceName, styleName, foundryName, weight, style, stretch, + QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight, style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); // add fonts windows can generate for us: if (weight <= QFont::DemiBold && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, style, stretch, + QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); if (style != QFont::StyleItalic && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, weight, QFont::StyleItalic, stretch, + QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight, QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, QFont::StyleItalic, stretch, + QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); - if (!englishName.isEmpty()) - QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); + if (!subFamilyName.isEmpty() && familyName != subFamilyName) { + QPlatformFontDatabase::registerFont(subFamilyName, subFamilyStyle, foundryName, weight, + style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); + } + + if (!englishName.isEmpty() && englishName != familyName) + QPlatformFontDatabase::registerAliasToFontFamily(familyName, englishName); return true; } @@ -290,7 +305,6 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t const QString faceName = QString::fromWCharArray(f->elfLogFont.lfFaceName); const QString styleName = QString::fromWCharArray(f->elfStyle); const QString fullName = QString::fromWCharArray(f->elfFullName); - const uchar charSet = f->elfLogFont.lfCharSet; // NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according // to the documentation is identical to a TEXTMETRIC except for the last four @@ -298,7 +312,7 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t const FONTSIGNATURE *signature = Q_NULLPTR; if (type & TRUETYPE_FONTTYPE) signature = &reinterpret_cast(textmetric)->ntmFontSig; - addFontToDatabase(faceName, styleName, fullName, charSet, textmetric, signature, type, false); + addFontToDatabase(faceName, styleName, fullName, *logFont, textmetric, signature, type); // keep on enumerating return 1; @@ -321,30 +335,19 @@ void QWindowsFontDatabaseFT::populateFamily(const QString &familyName) } HDC dummy = GetDC(0); LOGFONT lf; - lf.lfCharSet = DEFAULT_CHARSET; + memset(&lf, 0, sizeof(LOGFONT)); familyName.toWCharArray(lf.lfFaceName); lf.lfFaceName[familyName.size()] = 0; + lf.lfCharSet = DEFAULT_CHARSET; lf.lfPitchAndFamily = 0; EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0); ReleaseDC(0, dummy); } -namespace { -// Context for enumerating system fonts, records whether the default font has been -// encountered, which is normally not enumerated. -struct PopulateFamiliesContext -{ - PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {} - - QString systemDefaultFont; - bool seenSystemDefaultFont; -}; -} // namespace - // Delayed population of font families static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD, LPARAM lparam) + DWORD, LPARAM) { const ENUMLOGFONTEX *f = reinterpret_cast(logFont); // the "@family" fonts are just the same as "family". Ignore them. @@ -356,27 +359,11 @@ static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TE const FontKey *key = findFontKey(faceName); if (!key) { key = findFontKey(QString::fromWCharArray(f->elfFullName)); - if (!key && ttf && localizedName(faceName)) - key = findFontKey(getEnglishName(faceName)); + if (!key && ttf && qt_localizedName(faceName)) + key = findFontKey(qt_getEnglishName(faceName)); } - if (key) { + if (key) QPlatformFontDatabase::registerFontFamily(faceName); - PopulateFamiliesContext *context = reinterpret_cast(lparam); - if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - - // Register current font's english name as alias - if (ttf && localizedName(faceName)) { - const QString englishName = getEnglishName(faceName); - if (!englishName.isEmpty()) { - QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); - // Check whether the system default font name is an alias of the current font family name, - // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name - if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - } - } - } } return 1; // continue } @@ -388,12 +375,10 @@ void QWindowsFontDatabaseFT::populateFontDatabase() lf.lfCharSet = DEFAULT_CHARSET; lf.lfFaceName[0] = 0; lf.lfPitchAndFamily = 0; - PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family()); - EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast(&context), 0); + EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, 0, 0); ReleaseDC(0, dummy); // Work around EnumFontFamiliesEx() not listing the system font - if (!context.seenSystemDefaultFont) - QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont); + QPlatformFontDatabase::registerFontFamily(QWindowsFontDatabase::systemDefaultFont().family()); } QFontEngine * QWindowsFontDatabaseFT::fontEngine(const QFontDef &fontDef, void *handle) diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h index b7ebfc033f..325f522335 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h @@ -112,7 +112,7 @@ public: static QFont systemDefaultFont(); - static QFontEngine *createEngine(const QFontDef &request, + static QFontEngine *createEngine(const QFontDef &request, const QString &faceName, int dpi, const QSharedPointer &data); @@ -120,7 +120,7 @@ public: static QFont LOGFONT_to_QFont(const LOGFONT& lf, int verticalDPI = 0); static qreal fontSmoothingGamma(); - static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef); + static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef, const QString &faceName); static QStringList extraTryFontsForFamily(const QString &family); static QString familyForStyleHint(QFont::StyleHint styleHint); @@ -133,7 +133,6 @@ public: static QString readRegistryString(HKEY parentHandle, const wchar_t *keyPath, const wchar_t *keyName); private: - void populateFamily(const QString &familyName, bool registerAlias); void removeApplicationFonts(); struct WinApplicationFont { @@ -157,6 +156,26 @@ private: QDebug operator<<(QDebug, const QFontDef &def); #endif +inline quint16 qt_getUShort(const unsigned char *p) +{ + quint16 val; + val = *p++ << 8; + val |= *p; + + return val; +} + +struct FontNames { + QString name; // e.g. "DejaVu Sans Condensed" + QString style; // e.g. "Italic" + QString preferredName; // e.g. "DejaVu Sans" + QString preferredStyle; // e.g. "Condensed Italic" +}; + +bool qt_localizedName(const QString &name); +QString qt_getEnglishName(const QString &familyName, bool includeStyle = false); +FontNames qt_getCanonicalFontNames(const LOGFONT &lf); + QT_END_NAMESPACE #endif // QWINDOWSFONTDATABASE_H diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp index 9fc6fec915..0cd473e020 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp @@ -97,15 +97,6 @@ static void resolveGetCharWidthI() ptrGetCharWidthI = (PtrGetCharWidthI)QSystemLibrary::resolve(QStringLiteral("gdi32"), "GetCharWidthI"); } -static inline quint16 getUShort(unsigned char *p) -{ - quint16 val; - val = *p++ << 8; - val |= *p; - - return val; -} - // general font engine QFixed QWindowsFontEngine::lineThickness() const @@ -912,7 +903,7 @@ int QWindowsFontEngine::synthesized() const SelectObject(hdc, hfont); uchar data[4]; GetFontData(hdc, HEAD, 44, &data, 4); - USHORT macStyle = getUShort(data); + USHORT macStyle = qt_getUShort(data); if (tm.tmItalic && !(macStyle & 2)) synthesized_flags = SynthesizedItalic; if (fontDef.stretch != 100 && ttf) @@ -1192,9 +1183,10 @@ QFontEngine *QWindowsFontEngine::cloneWithSize(qreal pixelSize) const if (!uniqueFamilyName.isEmpty()) request.family = uniqueFamilyName; request.pixelSize = pixelSize; + const QString faceName = QString::fromWCharArray(m_logfont.lfFaceName); QFontEngine *fontEngine = - QWindowsFontDatabase::createEngine(request, + QWindowsFontDatabase::createEngine(request, faceName, QWindowsFontDatabase::defaultVerticalDPI(), m_fontEngineData); if (fontEngine) { @@ -1257,7 +1249,7 @@ QFontEngine *QWindowsMultiFontEngine::loadEngine(int at) #ifndef QT_NO_DIRECTWRITE if (fontEngine->type() == QFontEngine::DirectWrite) { QWindowsFontEngineDirectWrite *fe = static_cast(fontEngine); - lf = QWindowsFontDatabase::fontDefToLOGFONT(fe->fontDef); + lf = QWindowsFontDatabase::fontDefToLOGFONT(fe->fontDef, QString()); data = fe->fontEngineData(); } else diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp index 69d2e12778..c4ff937a0b 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp @@ -1037,7 +1037,7 @@ public: if (fontFace) return fontFace; - LOGFONT lf = QWindowsFontDatabase::fontDefToLOGFONT(fontDef); + LOGFONT lf = QWindowsFontDatabase::fontDefToLOGFONT(fontDef, QString()); // Get substitute name static const char keyC[] = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes"; diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp index 8c26f8a91f..e8244a0e5d 100644 --- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp @@ -326,6 +326,10 @@ void tst_QFontDatabase::condensedFontMatching() QFont tfcByStyleName("QtBidiTestFont"); tfcByStyleName.setStyleName("Condensed"); +#ifdef Q_OS_WIN + QEXPECT_FAIL("","No matching of sub-family by stretch on Windows", Continue); +#endif + QCOMPARE(QFontMetrics(tfcByStretch).width(testString()), QFontMetrics(tfcByStyleName).width(testString())); From 7e9aca683abf1360e3d20dfebdd937b2594c94b2 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 18 Nov 2016 09:50:22 +0100 Subject: [PATCH 069/174] De-duplicate the systemsemaphore entry Change-Id: Id015cfe60956d899bbb58597b88204738578b7fe Reviewed-by: Oswald Buddenhagen --- src/corelib/configure.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/corelib/configure.json b/src/corelib/configure.json index e7eb5fe482..76b6612a5d 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -372,11 +372,6 @@ "condition": "tests.syslog", "output": [ "privateConfig" ] }, - "systemsemaphore": { - "label": "Enable QSystemSemaphore", - "condition": "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix", - "output": [ { "type": "define", "negative": true, "name": "QT_NO_SYSTEMSEMAPHORE" } ] - }, "threadsafe-cloexec": { "label": "Threadsafe pipe creation", "condition": "tests.cloexec", @@ -407,6 +402,7 @@ "label": "QSystemSemaphore", "purpose": "Provides a general counting system semaphore.", "section": "Kernel", + "condition": "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix", "output": [ "publicFeature", "feature" ] }, "xmlstream": { From fd9e5d90333c385ad191a289b2e95e918c58b242 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 22 Nov 2016 10:13:41 +0100 Subject: [PATCH 070/174] Clean up iconv configuration Turn iconv off if ICU is being used (in line with codecs.pri) and get rid of the DEFINES += GNU_LIBICONV in the pri file. Change-Id: I6fbca975498adbb3e67f913ae9b1dd5cc53ee8da Reviewed-by: Oswald Buddenhagen --- src/corelib/codecs/codecs.pri | 6 +----- src/corelib/codecs/qiconvcodec.cpp | 14 +++++++------- src/corelib/codecs/qiconvcodec_p.h | 4 +--- src/corelib/codecs/qtextcodec.cpp | 6 +++--- src/corelib/configure.json | 8 ++++---- src/corelib/global/qconfig-bootstrapped.h | 1 + 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/corelib/codecs/codecs.pri b/src/corelib/codecs/codecs.pri index 4fa778d042..dc8974d13f 100644 --- a/src/corelib/codecs/codecs.pri +++ b/src/corelib/codecs/codecs.pri @@ -43,12 +43,8 @@ qtConfig(icu) { qtConfig(iconv) { HEADERS += codecs/qiconvcodec_p.h SOURCES += codecs/qiconvcodec.cpp - qtConfig(gnu-libiconv) { - DEFINES += GNU_LIBICONV + qtConfig(gnu-libiconv): \ QMAKE_USE_PRIVATE += iconv - } else: qtConfig(sun-libiconv) { - DEFINES += GNU_LIBICONV - } } win32 { diff --git a/src/corelib/codecs/qiconvcodec.cpp b/src/corelib/codecs/qiconvcodec.cpp index 845155dce0..8961d01eee 100644 --- a/src/corelib/codecs/qiconvcodec.cpp +++ b/src/corelib/codecs/qiconvcodec.cpp @@ -37,7 +37,9 @@ ** ****************************************************************************/ -#ifndef QT_NO_ICONV +#include + +QT_REQUIRE_CONFIG(iconv); #include "qiconvcodec_p.h" #include "qtextcodec_p.h" @@ -221,7 +223,7 @@ QString QIconvCodec::convertToUnicode(const char* chars, int len, ConverterState IconvState *state = *pstate; size_t inBytesLeft = len; // best case assumption, each byte is converted into one UTF-16 character, plus 2 bytes for the BOM -#ifdef GNU_LIBICONV +#if !QT_CONFIG(posix_libiconv) // GNU doesn't disagree with POSIX :/ const char *inBytes = chars; #else @@ -320,7 +322,7 @@ static bool setByteOrder(iconv_t cd) size_t outBytesLeft = sizeof buf; size_t inBytesLeft = sizeof bom; -#if defined(GNU_LIBICONV) +#if !QT_CONFIG(posix_libiconv) const char **inBytesPtr = const_cast(&inBytes); #else char **inBytesPtr = &inBytes; @@ -342,7 +344,7 @@ QByteArray QIconvCodec::convertFromUnicode(const QChar *uc, int len, ConverterSt char *outBytes; size_t inBytesLeft; -#if defined(GNU_LIBICONV) +#if !QT_CONFIG(posix_libiconv) const char **inBytesPtr = const_cast(&inBytes); #else char **inBytesPtr = &inBytes; @@ -472,7 +474,7 @@ iconv_t QIconvCodec::createIconv_t(const char *to, const char *from) const init(); iconv_t cd = (iconv_t) -1; -#if defined(__GLIBC__) || defined(GNU_LIBICONV) || defined(Q_OS_QNX) +#if defined(__GLIBC__) || !QT_CONFIG(posix_libiconv) || defined(Q_OS_QNX) #if defined(Q_OS_QNX) // on QNX the default locale is UTF-8, and an empty string will cause iconv_open to fail static const char empty_codeset[] = "UTF-8"; @@ -562,5 +564,3 @@ iconv_t QIconvCodec::createIconv_t(const char *to, const char *from) const } QT_END_NAMESPACE - -#endif /* #ifndef QT_NO_ICONV */ diff --git a/src/corelib/codecs/qiconvcodec_p.h b/src/corelib/codecs/qiconvcodec_p.h index 238351bc81..d99e72f635 100644 --- a/src/corelib/codecs/qiconvcodec_p.h +++ b/src/corelib/codecs/qiconvcodec_p.h @@ -54,7 +54,7 @@ #include #include "qtextcodec.h" -#if defined(Q_OS_UNIX) && !defined(QT_NO_ICONV) && !defined(QT_BOOTSTRAPPED) +QT_REQUIRE_CONFIG(iconv); #ifdef Q_OS_MAC typedef void * iconv_t; @@ -100,6 +100,4 @@ public: QT_END_NAMESPACE -#endif // Q_OS_UNIX && !QT_NO_ICONV && !QT_BOOTSTRAPPED - #endif // QICONVCODEC_P_H diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index 5098ac4242..0c9036aadf 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -61,7 +61,7 @@ #if defined(QT_USE_ICU) #include "qicucodec_p.h" #else -#if !defined(QT_NO_ICONV) +#if QT_CONFIG(iconv) # include "qiconvcodec_p.h" #endif #ifdef Q_OS_WIN @@ -184,7 +184,7 @@ static QTextCodec *setupLocaleMapper() if (charset) locale = QTextCodec::codecForName(charset); #endif -#if !defined(QT_NO_ICONV) && !defined(QT_BOOTSTRAPPED) +#if QT_CONFIG(iconv) if (!locale) { // no builtin codec for the locale found, let's try using iconv (void) new QIconvCodec(); @@ -286,7 +286,7 @@ static void setup() (void)new QBig5Codec; (void)new QBig5hkscsCodec; # endif // !QT_NO_BIG_CODECS && !Q_OS_INTEGRITY -#if !defined(QT_NO_ICONV) +#if QT_CONFIG(iconv) (void) new QIconvCodec; #endif #if defined(Q_OS_WIN32) diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 76b6612a5d..5017f4652a 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -245,21 +245,21 @@ "label": "iconv", "purpose": "Provides internationalization on Unix.", "section": "Internationalization", - "condition": "features.posix-libiconv || features.sun-libiconv || features.gnu-libiconv", + "condition": "!features.icu && (features.posix-libiconv || features.sun-libiconv || features.gnu-libiconv)", "output": [ "privateFeature", "feature" ] }, "posix-libiconv": { "label": "POSIX iconv", "enable": "input.iconv == 'posix'", "disable": "input.iconv == 'sun' || input.iconv == 'gnu' || input.iconv == 'no'", - "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && tests.posix-iconv" + "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && tests.posix-iconv", + "output": [ "privateFeature" ] }, "sun-libiconv": { "label": "SUN iconv", "enable": "input.iconv == 'sun'", "disable": "input.iconv == 'posix' || input.iconv == 'gnu' || input.iconv == 'no'", - "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && tests.sun-iconv", - "output": [ "privateFeature", "publicQtConfig" ] + "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && tests.sun-iconv" }, "gnu-libiconv": { "label": "GNU iconv", diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h index 3b86e94cdd..4629a57485 100644 --- a/src/corelib/global/qconfig-bootstrapped.h +++ b/src/corelib/global/qconfig-bootstrapped.h @@ -68,6 +68,7 @@ #define QT_CRYPTOGRAPHICHASH_ONLY_SHA1 #define QT_NO_DATASTREAM +#define QT_FEATURE_iconv -1 #define QT_NO_LIBRARY #define QT_FEATURE_library -1 #define QT_NO_QOBJECT From 5d9413ab3574dd65fb9380bed88caa22d3e5dc92 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 22 Nov 2016 10:14:07 +0100 Subject: [PATCH 071/174] Remove Mac specific code paths from qiconvcodec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The code is dead, as the codec is never used on macOS. Change-Id: I86138f1c95e5564256b4d592f0044e83658def93 Reviewed-by: Morten Johan Sørvig Reviewed-by: Oswald Buddenhagen --- src/corelib/codecs/qiconvcodec.cpp | 42 +----------------------------- src/corelib/codecs/qiconvcodec_p.h | 4 --- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/src/corelib/codecs/qiconvcodec.cpp b/src/corelib/codecs/qiconvcodec.cpp index 8961d01eee..e4fb359f2c 100644 --- a/src/corelib/codecs/qiconvcodec.cpp +++ b/src/corelib/codecs/qiconvcodec.cpp @@ -64,7 +64,7 @@ QT_REQUIRE_CONFIG(iconv); #elif defined(Q_OS_AIX) # define NO_BOM # define UTF16 "UCS-2" -#elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC) +#elif defined(Q_OS_FREEBSD) # define NO_BOM # if Q_BYTE_ORDER == Q_BIG_ENDIAN # define UTF16 "UTF-16BE" @@ -75,19 +75,6 @@ QT_REQUIRE_CONFIG(iconv); # define UTF16 "UTF-16" #endif -#if defined(Q_OS_MAC) -#ifndef GNU_LIBICONV -#define GNU_LIBICONV -#endif -typedef iconv_t (*Ptr_iconv_open) (const char*, const char*); -typedef size_t (*Ptr_iconv) (iconv_t, const char **, size_t *, char **, size_t *); -typedef int (*Ptr_iconv_close) (iconv_t); - -static Ptr_iconv_open ptr_iconv_open = 0; -static Ptr_iconv ptr_iconv = 0; -static Ptr_iconv_close ptr_iconv_close = 0; -#endif - QT_BEGIN_NAMESPACE QIconvCodec::QIconvCodec() @@ -105,33 +92,6 @@ void QIconvCodec::init() const fprintf(stderr, "QIconvCodec::convertToUnicode: internal error, UTF-16 codec not found\n"); utf16Codec = reinterpret_cast(~0); } -#if defined(Q_OS_MAC) - if (ptr_iconv_open == 0) { - QLibrary libiconv(QLatin1String("/usr/lib/libiconv")); - libiconv.setLoadHints(QLibrary::ExportExternalSymbolsHint); - - ptr_iconv_open = reinterpret_cast(libiconv.resolve("libiconv_open")); - if (!ptr_iconv_open) - ptr_iconv_open = reinterpret_cast(libiconv.resolve("iconv_open")); - ptr_iconv = reinterpret_cast(libiconv.resolve("libiconv")); - if (!ptr_iconv) - ptr_iconv = reinterpret_cast(libiconv.resolve("iconv")); - ptr_iconv_close = reinterpret_cast(libiconv.resolve("libiconv_close")); - if (!ptr_iconv_close) - ptr_iconv_close = reinterpret_cast(libiconv.resolve("iconv_close")); - - Q_ASSERT_X(ptr_iconv_open && ptr_iconv && ptr_iconv_close, - "QIconvCodec::QIconvCodec()", - "internal error, could not resolve the iconv functions"); - -# undef iconv_open -# define iconv_open ptr_iconv_open -# undef iconv -# define iconv ptr_iconv -# undef iconv_close -# define iconv_close ptr_iconv_close - } -#endif } QIconvCodec::~QIconvCodec() diff --git a/src/corelib/codecs/qiconvcodec_p.h b/src/corelib/codecs/qiconvcodec_p.h index d99e72f635..9b8500538b 100644 --- a/src/corelib/codecs/qiconvcodec_p.h +++ b/src/corelib/codecs/qiconvcodec_p.h @@ -56,11 +56,7 @@ QT_REQUIRE_CONFIG(iconv); -#ifdef Q_OS_MAC -typedef void * iconv_t; -#else #include -#endif QT_BEGIN_NAMESPACE From f17605777b06fb451935e8cbd38b23842dff68d1 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 14 Nov 2016 10:12:37 +0000 Subject: [PATCH 072/174] Revert "Revert "Deduplication fetchTransformed"" qdrawhelper.cpp is now compiled without PCH, and changes blocked by the ICE can be reinstated. This reverts commit cd9de59177ccbeb7fdfacf8716af7bb20112c880. Task-number: QTBUG-56817 Change-Id: I8d674768d16b3705598bfe5d08ed98376c97a478 Reviewed-by: Simon Hausmann --- src/gui/painting/qdrawhelper.cpp | 185 ++++++++----------------------- 1 file changed, 48 insertions(+), 137 deletions(-) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index fe1ff6603d..656b04fdf3 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -836,7 +836,10 @@ static const uint *QT_FASTCALL convertGrayscale8FromARGB32PM(uint *buffer, const } template static -uint QT_FASTCALL fetchPixel(const uchar *src, int index); +uint QT_FASTCALL fetchPixel(const uchar *, int) +{ + Q_UNREACHABLE(); +} template <> inline uint QT_FASTCALL fetchPixel(const uchar *src, int index) @@ -1554,92 +1557,11 @@ static const QRgba64 *QT_FASTCALL fetchUntransformed64(QRgba64 *buffer, const Op } } -// blendType is either BlendTransformed or BlendTransformedTiled -template -static const uint *QT_FASTCALL fetchTransformedARGB32PM(uint *buffer, const Operator *, const QSpanData *data, - int y, int x, int length) -{ - int image_width = data->texture.width; - int image_height = data->texture.height; - - const qreal cx = x + qreal(0.5); - const qreal cy = y + qreal(0.5); - - const uint *end = buffer + length; - uint *b = buffer; - if (data->fast_matrix) { - // The increment pr x in the scanline - int fdx = (int)(data->m11 * fixed_scale); - int fdy = (int)(data->m12 * fixed_scale); - - int fx = int((data->m21 * cy - + data->m11 * cx + data->dx) * fixed_scale); - int fy = int((data->m22 * cy - + data->m12 * cx + data->dy) * fixed_scale); - - while (b < end) { - int px = fx >> 16; - int py = fy >> 16; - - if (blendType == BlendTransformedTiled) { - px %= image_width; - py %= image_height; - if (px < 0) px += image_width; - if (py < 0) py += image_height; - } else { - px = qBound(0, px, image_width - 1); - py = qBound(0, py, image_height - 1); - } - *b = reinterpret_cast(data->texture.scanLine(py))[px]; - - fx += fdx; - fy += fdy; - ++b; - } - } else { - const qreal fdx = data->m11; - const qreal fdy = data->m12; - const qreal fdw = data->m13; - - qreal fx = data->m21 * cy + data->m11 * cx + data->dx; - qreal fy = data->m22 * cy + data->m12 * cx + data->dy; - qreal fw = data->m23 * cy + data->m13 * cx + data->m33; - - while (b < end) { - const qreal iw = fw == 0 ? 1 : 1 / fw; - const qreal tx = fx * iw; - const qreal ty = fy * iw; - int px = int(tx) - (tx < 0); - int py = int(ty) - (ty < 0); - - if (blendType == BlendTransformedTiled) { - px %= image_width; - py %= image_height; - if (px < 0) px += image_width; - if (py < 0) py += image_height; - } else { - px = qBound(0, px, image_width - 1); - py = qBound(0, py, image_height - 1); - } - *b = reinterpret_cast(data->texture.scanLine(py))[px]; - - fx += fdx; - fy += fdy; - fw += fdw; - //force increment to avoid /0 - if (!fw) { - fw += fdw; - } - ++b; - } - } - return buffer; -} - -template /* either BlendTransformed or BlendTransformedTiled */ +template static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const QSpanData *data, int y, int x, int length) { + Q_STATIC_ASSERT(blendType == BlendTransformed || blendType == BlendTransformedTiled); int image_width = data->texture.width; int image_height = data->texture.height; @@ -1647,9 +1569,12 @@ static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const qreal cy = y + qreal(0.5); const QPixelLayout *layout = &qPixelLayouts[data->texture.format]; - FetchPixelFunc fetch = qFetchPixel[layout->bpp]; + if (bpp != QPixelLayout::BPPNone) // Like this to not ICE on GCC 5.3.1 + Q_ASSERT(layout->bpp == bpp); + // When templated 'fetch' should be inlined at compile time: + const FetchPixelFunc fetch = (bpp == QPixelLayout::BPPNone) ? qFetchPixel[layout->bpp] : fetchPixel; - const uint *end = buffer + length; + uint *const end = buffer + length; uint *b = buffer; if (data->fast_matrix) { // The increment pr x in the scanline @@ -2585,12 +2510,17 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c } // blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled -template +template static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *, const QSpanData *data, int y, int x, int length) { const QPixelLayout *layout = &qPixelLayouts[data->texture.format]; const QVector *clut = data->texture.colorTable; + if (bpp != QPixelLayout::BPPNone) // Like this to not ICE on GCC 5.3.1 + Q_ASSERT(layout->bpp == bpp); + // When templated 'fetch' should be inlined at compile time: + const FetchPixelsFunc fetch = (bpp == QPixelLayout::BPPNone) ? qFetchPixels[layout->bpp] : fetchPixels; + const FetchPixelFunc fetch1 = (bpp == QPixelLayout::BPPNone) ? qFetchPixel[layout->bpp] : fetchPixel; int image_width = data->texture.width; int image_height = data->texture.height; @@ -2628,7 +2558,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper // The idea is first to do the interpolation between the row s1 and the row s2 // into an intermediate buffer, then we interpolate between two pixel of this buffer. - FetchPixelsFunc fetch = qFetchPixels[layout->bpp]; // +1 for the last pixel to interpolate with, and +1 for rounding errors. uint buf1[buffer_size + 2]; uint buf2[buffer_size + 2]; @@ -2717,7 +2646,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper fx += fdx; } } else { - FetchPixelFunc fetch = qFetchPixel[layout->bpp]; uint buf1[buffer_size]; uint buf2[buffer_size]; uint *b = buffer; @@ -2728,19 +2656,10 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper int x1 = (fx >> 16); int x2; fetchTransformedBilinear_pixelBounds(image_width, image_x1, image_x2, x1, x2); - - if (layout->bpp == QPixelLayout::BPP32) { - buf1[i * 2 + 0] = ((const uint*)s1)[x1]; - buf1[i * 2 + 1] = ((const uint*)s1)[x2]; - buf2[i * 2 + 0] = ((const uint*)s2)[x1]; - buf2[i * 2 + 1] = ((const uint*)s2)[x2]; - } else { - buf1[i * 2 + 0] = fetch(s1, x1); - buf1[i * 2 + 1] = fetch(s1, x2); - buf2[i * 2 + 0] = fetch(s2, x1); - buf2[i * 2 + 1] = fetch(s2, x2); - } - + buf1[i * 2 + 0] = fetch1(s1, x1); + buf1[i * 2 + 1] = fetch1(s1, x2); + buf2[i * 2 + 0] = fetch1(s2, x1); + buf2[i * 2 + 1] = fetch1(s2, x2); fx += fdx; } layout->convertToARGB32PM(buf1, buf1, len * 2, clut, 0); @@ -2770,7 +2689,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper } } } else { //rotation - FetchPixelFunc fetch = qFetchPixel[layout->bpp]; uint buf1[buffer_size]; uint buf2[buffer_size]; uint *b = buffer; @@ -2789,19 +2707,10 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper const uchar *s1 = data->texture.scanLine(y1); const uchar *s2 = data->texture.scanLine(y2); - - if (layout->bpp == QPixelLayout::BPP32) { - buf1[i * 2 + 0] = ((const uint*)s1)[x1]; - buf1[i * 2 + 1] = ((const uint*)s1)[x2]; - buf2[i * 2 + 0] = ((const uint*)s2)[x1]; - buf2[i * 2 + 1] = ((const uint*)s2)[x2]; - } else { - buf1[i * 2 + 0] = fetch(s1, x1); - buf1[i * 2 + 1] = fetch(s1, x2); - buf2[i * 2 + 0] = fetch(s2, x1); - buf2[i * 2 + 1] = fetch(s2, x2); - } - + buf1[i * 2 + 0] = fetch1(s1, x1); + buf1[i * 2 + 1] = fetch1(s1, x2); + buf2[i * 2 + 0] = fetch1(s2, x1); + buf2[i * 2 + 1] = fetch1(s2, x2); fx += fdx; fy += fdy; } @@ -2848,7 +2757,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper qreal fy = data->m22 * cy + data->m12 * cx + data->dy; qreal fw = data->m23 * cy + data->m13 * cx + data->m33; - FetchPixelFunc fetch = qFetchPixel[layout->bpp]; uint buf1[buffer_size]; uint buf2[buffer_size]; uint *b = buffer; @@ -2876,18 +2784,10 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper const uchar *s1 = data->texture.scanLine(y1); const uchar *s2 = data->texture.scanLine(y2); - - if (layout->bpp == QPixelLayout::BPP32) { - buf1[i * 2 + 0] = ((const uint*)s1)[x1]; - buf1[i * 2 + 1] = ((const uint*)s1)[x2]; - buf2[i * 2 + 0] = ((const uint*)s2)[x1]; - buf2[i * 2 + 1] = ((const uint*)s2)[x2]; - } else { - buf1[i * 2 + 0] = fetch(s1, x1); - buf1[i * 2 + 1] = fetch(s1, x2); - buf2[i * 2 + 0] = fetch(s2, x1); - buf2[i * 2 + 1] = fetch(s2, x2); - } + buf1[i * 2 + 0] = fetch1(s1, x1); + buf1[i * 2 + 1] = fetch1(s1, x2); + buf2[i * 2 + 0] = fetch1(s2, x1); + buf2[i * 2 + 1] = fetch1(s2, x2); fx += fdx; fy += fdy; @@ -3293,23 +3193,32 @@ static SourceFetchProc sourceFetchUntransformed[QImage::NImageFormats] = { }; static const SourceFetchProc sourceFetchGeneric[NBlendTypes] = { - fetchUntransformed, // Untransformed - fetchUntransformed, // Tiled - fetchTransformed, // Transformed - fetchTransformed, // TransformedTiled - fetchTransformedBilinear, // Bilinear - fetchTransformedBilinear // BilinearTiled + fetchUntransformed, // Untransformed + fetchUntransformed, // Tiled + fetchTransformed, // Transformed + fetchTransformed, // TransformedTiled + fetchTransformedBilinear, // TransformedBilinear + fetchTransformedBilinear // TransformedBilinearTiled }; static SourceFetchProc sourceFetchARGB32PM[NBlendTypes] = { fetchUntransformedARGB32PM, // Untransformed fetchUntransformedARGB32PM, // Tiled - fetchTransformedARGB32PM, // Transformed - fetchTransformedARGB32PM, // TransformedTiled + fetchTransformed, // Transformed + fetchTransformed, // TransformedTiled fetchTransformedBilinearARGB32PM, // Bilinear fetchTransformedBilinearARGB32PM // BilinearTiled }; +static SourceFetchProc sourceFetchAny32[NBlendTypes] = { + fetchUntransformed, // Untransformed + fetchUntransformed, // Tiled + fetchTransformed, // Transformed + fetchTransformed, // TransformedTiled + fetchTransformedBilinear, // TransformedBilinear + fetchTransformedBilinear // TransformedBilinearTiled +}; + static const SourceFetchProc64 sourceFetchGeneric64[NBlendTypes] = { fetchUntransformed64, // Untransformed fetchUntransformed64, // Tiled @@ -3325,6 +3234,8 @@ static inline SourceFetchProc getSourceFetch(TextureBlendType blendType, QImage: return sourceFetchARGB32PM[blendType]; if (blendType == BlendUntransformed || blendType == BlendTiled) return sourceFetchUntransformed[format]; + if (qPixelLayouts[format].bpp == QPixelLayout::BPP32) + return sourceFetchAny32[blendType]; return sourceFetchGeneric[blendType]; } From 04b276b0f5dd265b27dd6ca54fda15a4a64a40df Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 18 Nov 2016 13:02:59 +0100 Subject: [PATCH 073/174] Remove last traces of MeeGo Change-Id: I5242f1dfcfccf9811398e717b90196e6228d1dc5 Reviewed-by: Laszlo Agocs Reviewed-by: Oswald Buddenhagen --- src/gui/opengl/opengl.pri | 1 - src/gui/opengl/qopenglshadercache_meego_p.h | 450 ------------------ src/gui/opengl/qopenglshadercache_p.h | 5 - src/network/ssl/qsslsocket.cpp | 2 +- .../gl2paintengineex/qglshadercache_meego_p.h | 450 ------------------ .../gl2paintengineex/qglshadercache_p.h | 5 - src/opengl/opengl.pro | 3 +- src/tools/uic/qclass_lib_map.h | 6 - 8 files changed, 2 insertions(+), 920 deletions(-) delete mode 100644 src/gui/opengl/qopenglshadercache_meego_p.h delete mode 100644 src/opengl/gl2paintengineex/qglshadercache_meego_p.h diff --git a/src/gui/opengl/opengl.pri b/src/gui/opengl/opengl.pri index 712cf144e0..1a1022b3a7 100644 --- a/src/gui/opengl/opengl.pri +++ b/src/gui/opengl/opengl.pri @@ -24,7 +24,6 @@ qtConfig(opengl) { opengl/qopenglcustomshaderstage_p.h \ opengl/qopengltextureglyphcache_p.h \ opengl/qopenglshadercache_p.h \ - opengl/qopenglshadercache_meego_p.h \ opengl/qopenglversionfunctions.h \ opengl/qopenglversionfunctionsfactory_p.h \ opengl/qopenglvertexarrayobject.h \ diff --git a/src/gui/opengl/qopenglshadercache_meego_p.h b/src/gui/opengl/qopenglshadercache_meego_p.h deleted file mode 100644 index 0892e1a2a1..0000000000 --- a/src/gui/opengl/qopenglshadercache_meego_p.h +++ /dev/null @@ -1,450 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#ifndef QOPENGLSHADERCACHE_MEEGO_P_H -#define QOPENGLSHADERCACHE_MEEGO_P_H - -#include - -#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2) - -#include -#include -#include - -#ifndef QT_BOOTSTRAPPED -# include -#endif -#if defined(QT_DEBUG) || defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE) -# include -#endif - -/* - This cache stores internal Qt shader programs in shared memory. - - This header file is ugly on purpose and can only be included once. It is only to be used - for the internal shader cache, not as a generic cache for anyone's shaders. - - The cache stores either ShaderCacheMaxEntries shader programs or ShaderCacheDataSize kilobytes - of shader programs, whatever limit is reached first. - - The layout of the cache is as outlined in the CachedShaders struct. After some - integers, an array of headers is reserved, then comes the space for the actual binaries. - - Shader Programs are identified by the md5sum of their frag and vertex shader source code. - - Shader Programs are never removed. The cache never shrinks or re-shuffles. This is done - on purpose to ensure minimum amount of locking, no alignment problems and very few write - operations. - - Note: Locking the shader cache could be expensive, because the entire system might hang. - That's why the cache is immutable to minimize the time we need to keep it locked. - - Why is it Meego specific? - - First, the size is chosen so that it fits to generic meego usage. Second, on Meego, there's - always at least one Qt application active (the launcher), so the cache will never be destroyed. - Only when the last Qt app exits, the cache dies, which should only be when someone kills the - X11 server. And last but not least it was only tested with Meego's SGX driver. - - There's a small tool in src/opengl/util/meego that dumps the contents of the cache. - */ - -// anonymous namespace, prevent exporting of the private symbols -namespace -{ - -struct CachedShaderHeader -{ - /* the index in the data[] member of CachedShaders */ - int index; - /* the size of the binary shader */ - GLsizei size; - /* the format of the binary shader */ - GLenum format; - /* the md5sum of the frag+vertex shaders */ - char md5Sum[16]; -}; - -enum -{ - /* The maximum amount of shader programs the cache can hold */ - ShaderCacheMaxEntries = 20 -}; - -typedef CachedShaderHeader CachedShaderHeaders[ShaderCacheMaxEntries]; - -enum -{ - // ShaderCacheDataSize is 20k minus the other data members of CachedShaders - ShaderCacheDataSize = 1024 * ShaderCacheMaxEntries - sizeof(CachedShaderHeaders) - 2 * sizeof(int) -}; - -struct CachedShaders -{ - /* How much space is still available in the cache */ - inline int availableSize() const { return ShaderCacheDataSize - dataSize; } - - /* The current amount of cached shaders */ - int shaderCount; - - /* The current amount (in bytes) of cached data */ - int dataSize; - - /* The headers describing the shaders */ - CachedShaderHeaders headers; - - /* The actual binary data of the shader programs */ - char data[ShaderCacheDataSize]; -}; - -//#define QT_DEBUG_SHADER_CACHE -#ifdef QT_DEBUG_SHADER_CACHE -static QDebug shaderCacheDebug() -{ - return QDebug(QtDebugMsg); -} -#else -static inline QNoDebug shaderCacheDebug() { return QNoDebug(); } -#endif - -class ShaderCacheSharedMemory -{ -public: - ShaderCacheSharedMemory() - : shm(QLatin1String("qt_gles2_shadercache_" QT_VERSION_STR)) - { - // we need a system semaphore here, since cache creation and initialization must be atomic - QSystemSemaphore attachSemaphore(QLatin1String("qt_gles2_shadercache_mutex_" QT_VERSION_STR), 1); - - if (!attachSemaphore.acquire()) { - shaderCacheDebug() << "Unable to require shader cache semaphore:" << attachSemaphore.errorString(); - return; - } - - if (shm.attach()) { - // success! - shaderCacheDebug() << "Attached to shader cache"; - } else { - - // no cache exists - create and initialize it - if (shm.create(sizeof(CachedShaders))) { - shaderCacheDebug() << "Created new shader cache"; - initializeCache(); - } else { - shaderCacheDebug() << "Unable to create shader cache:" << shm.errorString(); - } - } - - attachSemaphore.release(); - } - - inline bool isAttached() const { return shm.isAttached(); } - - inline bool lock() { return shm.lock(); } - inline bool unlock() { return shm.unlock(); } - inline void *data() { return shm.data(); } - inline QString errorString() { return shm.errorString(); } - - ~ShaderCacheSharedMemory() - { - if (!shm.detach()) - shaderCacheDebug() << "Unable to detach shader cache" << shm.errorString(); - } - -private: - void initializeCache() - { - // no need to lock the shared memory since we're already protected by the - // attach system semaphore. - - void *data = shm.data(); - Q_ASSERT(data); - - memset(data, 0, sizeof(CachedShaders)); - } - - QSharedMemory shm; -}; - -class ShaderCacheLocker -{ -public: - inline ShaderCacheLocker(ShaderCacheSharedMemory *cache) - : shm(cache->lock() ? cache : (ShaderCacheSharedMemory *)0) - { - if (!shm) - shaderCacheDebug() << "Unable to lock shader cache" << cache->errorString(); - } - - inline bool isLocked() const { return shm; } - - inline ~ShaderCacheLocker() - { - if (!shm) - return; - if (!shm->unlock()) - shaderCacheDebug() << "Unable to unlock shader cache" << shm->errorString(); - } - -private: - ShaderCacheSharedMemory *shm; -}; - -#ifdef QT_BOOTSTRAPPED -} // end namespace -#else - -static void traceCacheOverflow(const char *message) -{ -#if defined(QT_DEBUG) || defined (QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE) - openlog(qPrintable(QCoreApplication::applicationName()), LOG_PID | LOG_ODELAY, LOG_USER); - syslog(LOG_DEBUG, message); - closelog(); -#endif - shaderCacheDebug() << message; -} - -Q_GLOBAL_STATIC(ShaderCacheSharedMemory, shaderCacheSharedMemory) - -/* - Finds the index of the shader program identified by md5Sum in the cache. - Note: Does NOT lock the cache for reading, the cache must already be locked! - - Returns -1 when no shader was found. - */ -static int qt_cache_index_unlocked(const QByteArray &md5Sum, CachedShaders *cache) -{ - for (int i = 0; i < cache->shaderCount; ++i) { - if (qstrncmp(md5Sum.constData(), cache->headers[i].md5Sum, 16) == 0) { - return i; - } - } - return -1; -} - -/* Returns the index of the shader identified by md5Sum */ -static int qt_cache_index(const QByteArray &md5Sum) -{ - ShaderCacheSharedMemory *shm = shaderCacheSharedMemory(); - if (!shm || !shm->isAttached()) - return false; - - Q_ASSERT(md5Sum.length() == 16); - - ShaderCacheLocker locker(shm); - if (!locker.isLocked()) - return false; - - void *data = shm->data(); - Q_ASSERT(data); - - CachedShaders *cache = reinterpret_cast(data); - - return qt_cache_index_unlocked(md5Sum, cache); -} - -/* Loads the cached shader at index \a shaderIndex into \a program - * Note: Since the cache is immutable, this operation doesn't lock the shared memory. - */ -static bool qt_cached_shader(QOpenGLShaderProgram *program, QOpenGLContext *ctx, int shaderIndex) -{ - Q_ASSERT(shaderIndex >= 0 && shaderIndex <= ShaderCacheMaxEntries); - Q_ASSERT(program); - - ShaderCacheSharedMemory *shm = shaderCacheSharedMemory(); - if (!shm || !shm->isAttached()) - return false; - - void *data = shm->data(); - Q_ASSERT(data); - - CachedShaders *cache = reinterpret_cast(data); - - shaderCacheDebug() << "fetching cached shader at index" << shaderIndex - << "dataIndex" << cache->headers[shaderIndex].index - << "size" << cache->headers[shaderIndex].size - << "format" << cache->headers[shaderIndex].format; - - // call program->programId first, since that resolves the glProgramBinaryOES symbol - GLuint programId = program->programId(); - glProgramBinaryOES(programId, cache->headers[shaderIndex].format, - cache->data + cache->headers[shaderIndex].index, - cache->headers[shaderIndex].size); - - return true; -} - -/* Stores the shader program in the cache. Returns false if there's an error with the cache, or - if the cache is too small to hold the shader. */ -static bool qt_cache_shader(const QOpenGLShaderProgram *shader, QOpenGLContext *ctx, const QByteArray &md5Sum) -{ - ShaderCacheSharedMemory *shm = shaderCacheSharedMemory(); - if (!shm || !shm->isAttached()) - return false; - - void *data = shm->data(); - Q_ASSERT(data); - - CachedShaders *cache = reinterpret_cast(data); - - ShaderCacheLocker locker(shm); - if (!locker.isLocked()) - return false; - - int cacheIdx = cache->shaderCount; - if (cacheIdx >= ShaderCacheMaxEntries) { - traceCacheOverflow("Qt OpenGL shader cache index overflow!"); - return false; - } - - // now that we have the lock on the shared memory, make sure no one - // inserted the shader already while we were unlocked - if (qt_cache_index_unlocked(md5Sum, cache) != -1) - return true; // already cached - - shaderCacheDebug() << "Caching shader at index" << cacheIdx; - - GLint binaryLength = 0; - glGetProgramiv(shader->programId(), GL_PROGRAM_BINARY_LENGTH_OES, &binaryLength); - - if (!binaryLength) { - shaderCacheDebug() << "Unable to determine binary shader size!"; - return false; - } - - if (binaryLength > cache->availableSize()) { - traceCacheOverflow("Qt OpenGL shader cache data overflow!"); - return false; - } - - GLsizei size = 0; - GLenum format = 0; - glGetProgramBinaryOES(shader->programId(), binaryLength, &size, &format, - cache->data + cache->dataSize); - - if (!size) { - shaderCacheDebug() << "Unable to get binary shader!"; - return false; - } - - cache->headers[cacheIdx].index = cache->dataSize; - cache->dataSize += binaryLength; - ++cache->shaderCount; - cache->headers[cacheIdx].size = binaryLength; - cache->headers[cacheIdx].format = format; - - memcpy(cache->headers[cacheIdx].md5Sum, md5Sum.constData(), 16); - - shaderCacheDebug() << "cached shader size" << size - << "format" << format - << "binarySize" << binaryLength - << "cache index" << cacheIdx - << "data index" << cache->headers[cacheIdx].index; - - return true; -} - -} // namespace - -QT_BEGIN_NAMESPACE - - -class CachedShader -{ -public: - CachedShader(const QByteArray &fragSource, const QByteArray &vertexSource) - : cacheIdx(-1) - { - QCryptographicHash md5Hash(QCryptographicHash::Md5); - - md5Hash.addData(fragSource); - md5Hash.addData(vertexSource); - - md5Sum = md5Hash.result(); - } - - bool isCached() - { - return cacheIndex() != -1; - } - - int cacheIndex() - { - if (cacheIdx != -1) - return cacheIdx; - cacheIdx = qt_cache_index(md5Sum); - return cacheIdx; - } - - bool load(QOpenGLShaderProgram *program, QOpenGLContext *ctx) - { - if (cacheIndex() == -1) - return false; - return qt_cached_shader(program, ctx, cacheIdx); - } - - bool store(QOpenGLShaderProgram *program, QOpenGLContext *ctx) - { - return qt_cache_shader(program, ctx, md5Sum); - } - -private: - QByteArray md5Sum; - int cacheIdx; -}; - - -QT_END_NAMESPACE - -#endif - -#endif -#endif diff --git a/src/gui/opengl/qopenglshadercache_p.h b/src/gui/opengl/qopenglshadercache_p.h index b4d1d64721..0f730602b0 100644 --- a/src/gui/opengl/qopenglshadercache_p.h +++ b/src/gui/opengl/qopenglshadercache_p.h @@ -53,10 +53,6 @@ #include -#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2) -# include "qopenglshadercache_meego_p.h" -#else - QT_BEGIN_NAMESPACE @@ -88,4 +84,3 @@ public: QT_END_NAMESPACE #endif -#endif diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index 29e1f32815..2fc779b257 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -2643,7 +2643,7 @@ bool QSslSocketPrivate::rootCertOnDemandLoadingSupported() */ QList QSslSocketPrivate::unixRootCertDirectories() { - return QList() << "/etc/ssl/certs/" // (K)ubuntu, OpenSUSE, Mandriva, MeeGo ... + return QList() << "/etc/ssl/certs/" // (K)ubuntu, OpenSUSE, Mandriva ... << "/usr/lib/ssl/certs/" // Gentoo, Mandrake << "/usr/share/ssl/" // Centos, Redhat, SuSE << "/usr/local/ssl/" // Normal OpenSSL Tarball diff --git a/src/opengl/gl2paintengineex/qglshadercache_meego_p.h b/src/opengl/gl2paintengineex/qglshadercache_meego_p.h deleted file mode 100644 index de75d5ae8c..0000000000 --- a/src/opengl/gl2paintengineex/qglshadercache_meego_p.h +++ /dev/null @@ -1,450 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtOpenGL module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#ifndef QGLSHADERCACHE_MEEGO_P_H -#define QGLSHADERCACHE_MEEGO_P_H - -#include - -#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2) - -#include -#include -#include - -#ifndef QT_BOOTSTRAPPED -# include -#endif -#if defined(QT_DEBUG) || defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE) -# include -#endif - -/* - This cache stores internal Qt shader programs in shared memory. - - This header file is ugly on purpose and can only be included once. It is only to be used - for the internal shader cache, not as a generic cache for anyone's shaders. - - The cache stores either ShaderCacheMaxEntries shader programs or ShaderCacheDataSize kilobytes - of shader programs, whatever limit is reached first. - - The layout of the cache is as outlined in the CachedShaders struct. After some - integers, an array of headers is reserved, then comes the space for the actual binaries. - - Shader Programs are identified by the md5sum of their frag and vertex shader source code. - - Shader Programs are never removed. The cache never shrinks or re-shuffles. This is done - on purpose to ensure minimum amount of locking, no alignment problems and very few write - operations. - - Note: Locking the shader cache could be expensive, because the entire system might hang. - That's why the cache is immutable to minimize the time we need to keep it locked. - - Why is it Meego specific? - - First, the size is chosen so that it fits to generic meego usage. Second, on Meego, there's - always at least one Qt application active (the launcher), so the cache will never be destroyed. - Only when the last Qt app exits, the cache dies, which should only be when someone kills the - X11 server. And last but not least it was only tested with Meego's SGX driver. - - There's a small tool in src/opengl/util/meego that dumps the contents of the cache. - */ - -// anonymous namespace, prevent exporting of the private symbols -namespace -{ - -struct CachedShaderHeader -{ - /* the index in the data[] member of CachedShaders */ - int index; - /* the size of the binary shader */ - GLsizei size; - /* the format of the binary shader */ - GLenum format; - /* the md5sum of the frag+vertex shaders */ - char md5Sum[16]; -}; - -enum -{ - /* The maximum amount of shader programs the cache can hold */ - ShaderCacheMaxEntries = 20 -}; - -typedef CachedShaderHeader CachedShaderHeaders[ShaderCacheMaxEntries]; - -enum -{ - // ShaderCacheDataSize is 20k minus the other data members of CachedShaders - ShaderCacheDataSize = 1024 * ShaderCacheMaxEntries - sizeof(CachedShaderHeaders) - 2 * sizeof(int) -}; - -struct CachedShaders -{ - /* How much space is still available in the cache */ - inline int availableSize() const { return ShaderCacheDataSize - dataSize; } - - /* The current amount of cached shaders */ - int shaderCount; - - /* The current amount (in bytes) of cached data */ - int dataSize; - - /* The headers describing the shaders */ - CachedShaderHeaders headers; - - /* The actual binary data of the shader programs */ - char data[ShaderCacheDataSize]; -}; - -//#define QT_DEBUG_SHADER_CACHE -#ifdef QT_DEBUG_SHADER_CACHE -static QDebug shaderCacheDebug() -{ - return QDebug(QtDebugMsg); -} -#else -static inline QNoDebug shaderCacheDebug() { return QNoDebug(); } -#endif - -class ShaderCacheSharedMemory -{ -public: - ShaderCacheSharedMemory() - : shm(QLatin1String("qt_gles2_shadercache_" QT_VERSION_STR)) - { - // we need a system semaphore here, since cache creation and initialization must be atomic - QSystemSemaphore attachSemaphore(QLatin1String("qt_gles2_shadercache_mutex_" QT_VERSION_STR), 1); - - if (!attachSemaphore.acquire()) { - shaderCacheDebug() << "Unable to require shader cache semaphore:" << attachSemaphore.errorString(); - return; - } - - if (shm.attach()) { - // success! - shaderCacheDebug() << "Attached to shader cache"; - } else { - - // no cache exists - create and initialize it - if (shm.create(sizeof(CachedShaders))) { - shaderCacheDebug() << "Created new shader cache"; - initializeCache(); - } else { - shaderCacheDebug() << "Unable to create shader cache:" << shm.errorString(); - } - } - - attachSemaphore.release(); - } - - inline bool isAttached() const { return shm.isAttached(); } - - inline bool lock() { return shm.lock(); } - inline bool unlock() { return shm.unlock(); } - inline void *data() { return shm.data(); } - inline QString errorString() { return shm.errorString(); } - - ~ShaderCacheSharedMemory() - { - if (!shm.detach()) - shaderCacheDebug() << "Unable to detach shader cache" << shm.errorString(); - } - -private: - void initializeCache() - { - // no need to lock the shared memory since we're already protected by the - // attach system semaphore. - - void *data = shm.data(); - Q_ASSERT(data); - - memset(data, 0, sizeof(CachedShaders)); - } - - QSharedMemory shm; -}; - -class ShaderCacheLocker -{ -public: - inline ShaderCacheLocker(ShaderCacheSharedMemory *cache) - : shm(cache->lock() ? cache : (ShaderCacheSharedMemory *)0) - { - if (!shm) - shaderCacheDebug() << "Unable to lock shader cache" << cache->errorString(); - } - - inline bool isLocked() const { return shm; } - - inline ~ShaderCacheLocker() - { - if (!shm) - return; - if (!shm->unlock()) - shaderCacheDebug() << "Unable to unlock shader cache" << shm->errorString(); - } - -private: - ShaderCacheSharedMemory *shm; -}; - -#ifdef QT_BOOTSTRAPPED -} // end namespace -#else - -static void traceCacheOverflow(const char *message) -{ -#if defined(QT_DEBUG) || defined (QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE) - openlog(qPrintable(QCoreApplication::applicationName()), LOG_PID | LOG_ODELAY, LOG_USER); - syslog(LOG_DEBUG, message); - closelog(); -#endif - shaderCacheDebug() << message; -} - -Q_GLOBAL_STATIC(ShaderCacheSharedMemory, shaderCacheSharedMemory) - -/* - Finds the index of the shader program identified by md5Sum in the cache. - Note: Does NOT lock the cache for reading, the cache must already be locked! - - Returns -1 when no shader was found. - */ -static int qt_cache_index_unlocked(const QByteArray &md5Sum, CachedShaders *cache) -{ - for (int i = 0; i < cache->shaderCount; ++i) { - if (qstrncmp(md5Sum.constData(), cache->headers[i].md5Sum, 16) == 0) { - return i; - } - } - return -1; -} - -/* Returns the index of the shader identified by md5Sum */ -static int qt_cache_index(const QByteArray &md5Sum) -{ - ShaderCacheSharedMemory *shm = shaderCacheSharedMemory(); - if (!shm || !shm->isAttached()) - return false; - - Q_ASSERT(md5Sum.length() == 16); - - ShaderCacheLocker locker(shm); - if (!locker.isLocked()) - return false; - - void *data = shm->data(); - Q_ASSERT(data); - - CachedShaders *cache = reinterpret_cast(data); - - return qt_cache_index_unlocked(md5Sum, cache); -} - -/* Loads the cached shader at index \a shaderIndex into \a program - * Note: Since the cache is immutable, this operation doesn't lock the shared memory. - */ -static bool qt_cached_shader(QGLShaderProgram *program, const QGLContext *ctx, int shaderIndex) -{ - Q_ASSERT(shaderIndex >= 0 && shaderIndex <= ShaderCacheMaxEntries); - Q_ASSERT(program); - - ShaderCacheSharedMemory *shm = shaderCacheSharedMemory(); - if (!shm || !shm->isAttached()) - return false; - - void *data = shm->data(); - Q_ASSERT(data); - - CachedShaders *cache = reinterpret_cast(data); - - shaderCacheDebug() << "fetching cached shader at index" << shaderIndex - << "dataIndex" << cache->headers[shaderIndex].index - << "size" << cache->headers[shaderIndex].size - << "format" << cache->headers[shaderIndex].format; - - // call program->programId first, since that resolves the glProgramBinaryOES symbol - GLuint programId = program->programId(); - glProgramBinaryOES(programId, cache->headers[shaderIndex].format, - cache->data + cache->headers[shaderIndex].index, - cache->headers[shaderIndex].size); - - return true; -} - -/* Stores the shader program in the cache. Returns false if there's an error with the cache, or - if the cache is too small to hold the shader. */ -static bool qt_cache_shader(const QGLShaderProgram *shader, const QGLContext *ctx, const QByteArray &md5Sum) -{ - ShaderCacheSharedMemory *shm = shaderCacheSharedMemory(); - if (!shm || !shm->isAttached()) - return false; - - void *data = shm->data(); - Q_ASSERT(data); - - CachedShaders *cache = reinterpret_cast(data); - - ShaderCacheLocker locker(shm); - if (!locker.isLocked()) - return false; - - int cacheIdx = cache->shaderCount; - if (cacheIdx >= ShaderCacheMaxEntries) { - traceCacheOverflow("Qt OpenGL shader cache index overflow!"); - return false; - } - - // now that we have the lock on the shared memory, make sure no one - // inserted the shader already while we were unlocked - if (qt_cache_index_unlocked(md5Sum, cache) != -1) - return true; // already cached - - shaderCacheDebug() << "Caching shader at index" << cacheIdx; - - GLint binaryLength = 0; - glGetProgramiv(shader->programId(), GL_PROGRAM_BINARY_LENGTH_OES, &binaryLength); - - if (!binaryLength) { - shaderCacheDebug() << "Unable to determine binary shader size!"; - return false; - } - - if (binaryLength > cache->availableSize()) { - traceCacheOverflow("Qt OpenGL shader cache data overflow!"); - return false; - } - - GLsizei size = 0; - GLenum format = 0; - glGetProgramBinaryOES(shader->programId(), binaryLength, &size, &format, - cache->data + cache->dataSize); - - if (!size) { - shaderCacheDebug() << "Unable to get binary shader!"; - return false; - } - - cache->headers[cacheIdx].index = cache->dataSize; - cache->dataSize += binaryLength; - ++cache->shaderCount; - cache->headers[cacheIdx].size = binaryLength; - cache->headers[cacheIdx].format = format; - - memcpy(cache->headers[cacheIdx].md5Sum, md5Sum.constData(), 16); - - shaderCacheDebug() << "cached shader size" << size - << "format" << format - << "binarySize" << binaryLength - << "cache index" << cacheIdx - << "data index" << cache->headers[cacheIdx].index; - - return true; -} - -} // namespace - -QT_BEGIN_NAMESPACE - - -class CachedShader -{ -public: - CachedShader(const QByteArray &fragSource, const QByteArray &vertexSource) - : cacheIdx(-1) - { - QCryptographicHash md5Hash(QCryptographicHash::Md5); - - md5Hash.addData(fragSource); - md5Hash.addData(vertexSource); - - md5Sum = md5Hash.result(); - } - - bool isCached() - { - return cacheIndex() != -1; - } - - int cacheIndex() - { - if (cacheIdx != -1) - return cacheIdx; - cacheIdx = qt_cache_index(md5Sum); - return cacheIdx; - } - - bool load(QGLShaderProgram *program, const QGLContext *ctx) - { - if (cacheIndex() == -1) - return false; - return qt_cached_shader(program, ctx, cacheIdx); - } - - bool store(QGLShaderProgram *program, const QGLContext *ctx) - { - return qt_cache_shader(program, ctx, md5Sum); - } - -private: - QByteArray md5Sum; - int cacheIdx; -}; - - -QT_END_NAMESPACE - -#endif - -#endif -#endif diff --git a/src/opengl/gl2paintengineex/qglshadercache_p.h b/src/opengl/gl2paintengineex/qglshadercache_p.h index e2ac3f85d7..4204e3e256 100644 --- a/src/opengl/gl2paintengineex/qglshadercache_p.h +++ b/src/opengl/gl2paintengineex/qglshadercache_p.h @@ -53,10 +53,6 @@ #include -#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2) -# include "qglshadercache_meego_p.h" -#else - QT_BEGIN_NAMESPACE @@ -88,4 +84,3 @@ public: QT_END_NAMESPACE #endif -#endif diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro index 25de6ad670..718a886809 100644 --- a/src/opengl/opengl.pro +++ b/src/opengl/opengl.pro @@ -41,8 +41,7 @@ HEADERS += qglshaderprogram.h \ gl2paintengineex/qglengineshadersource_p.h \ gl2paintengineex/qglcustomshaderstage_p.h \ gl2paintengineex/qtextureglyphcache_gl_p.h \ - gl2paintengineex/qglshadercache_p.h \ - gl2paintengineex/qglshadercache_meego_p.h + gl2paintengineex/qglshadercache_p.h SOURCES += qglshaderprogram.cpp \ qgraphicsshadereffect.cpp \ diff --git a/src/tools/uic/qclass_lib_map.h b/src/tools/uic/qclass_lib_map.h index 930a648d57..810b326b30 100644 --- a/src/tools/uic/qclass_lib_map.h +++ b/src/tools/uic/qclass_lib_map.h @@ -440,12 +440,6 @@ QT_CLASS_LIB(QXmlResultItems, QtXmlPatterns, qxmlresultitems.h) QT_CLASS_LIB(QXmlSchema, QtXmlPatterns, qxmlschema.h) QT_CLASS_LIB(QXmlSchemaValidator, QtXmlPatterns, qxmlschemavalidator.h) QT_CLASS_LIB(QXmlSerializer, QtXmlPatterns, qxmlserializer.h) -QT_CLASS_LIB(QMeeGoFenceSync, QtMeeGoGraphicsSystemHelper, qmeegofencesync.h) -QT_CLASS_LIB(QMeeGoGraphicsSystemHelper, QtMeeGoGraphicsSystemHelper, qmeegographicssystemhelper.h) -QT_CLASS_LIB(QMeeGoLivePixmap, QtMeeGoGraphicsSystemHelper, qmeegolivepixmap.h) -QT_CLASS_LIB(QMeeGoOverlayWidget, QtMeeGoGraphicsSystemHelper, qmeegooverlaywidget.h) -QT_CLASS_LIB(QMeeGoRuntime, QtMeeGoGraphicsSystemHelper, qmeegoruntime.h) -QT_CLASS_LIB(QMeeGoSwitchEvent, QtMeeGoGraphicsSystemHelper, qmeegoswitchevent.h) QT_CLASS_LIB(QAxBase, ActiveQt, qaxbase.h) QT_CLASS_LIB(QAxObject, ActiveQt, qaxobject.h) QT_CLASS_LIB(QAxScriptEngine, ActiveQt, qaxscript.h) From 389b4ec28b6bb402d3575ff9c648ef878257ea84 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 22 Nov 2016 15:45:36 +0100 Subject: [PATCH 074/174] Windows QPA: Do not send key events for mouse-synthesized app commands Sending key events in addition causes applications to respond twice to for example the back / forward extra mouse buttons. Suppress the keypress by checking on the device. This is in line with the other platforms, which do not send keypresses either. Native event filters will still be able to listen for WM_APPCOMMAND. Task-number: QTBUG-48117 Task-number: QTBUG-57198 Change-Id: I219e17244087663f06ab2c5a8cf4b880c3655700 Reviewed-by: Andy Shaw --- src/plugins/platforms/windows/qwindowskeymapper.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp index 60361e436d..a52ae7c2a9 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.cpp +++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp @@ -861,6 +861,9 @@ bool QWindowsKeyMapper::translateKeyEvent(QWindow *widget, HWND hwnd, bool QWindowsKeyMapper::translateMultimediaKeyEventInternal(QWindow *window, const MSG &msg) { #if defined(WM_APPCOMMAND) + // QTBUG-57198, do not send mouse-synthesized commands as key events in addition + if (GET_DEVICE_LPARAM(msg.lParam) == FAPPCOMMAND_MOUSE) + return false; const int cmd = GET_APPCOMMAND_LPARAM(msg.lParam); const int dwKeys = GET_KEYSTATE_LPARAM(msg.lParam); int state = 0; From 60054b5940b19f4dd9780e63da1e2dce45baf131 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 2 Nov 2016 13:58:54 +0100 Subject: [PATCH 075/174] QSettings: Replace deprecated Win32 SHGetSpecialFolderPath MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SHGetSpecialFolderPath is declared 'unsupported' by Microsoft, and has problems with non-ASCII characters. Replace it by the newer SHGetKnownFolderPath. Task-number: QTBUG-50570 Change-Id: I8b2dfa10fa5dc30e6c3be094a2ba8d7c3504f2ca GPush-Base: 4d181bd93234a3747b520d10417825a0147bfeb1 Reviewed-by: Jan Arve Sæther --- src/corelib/io/qsettings.cpp | 71 ++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index 47108d057b..480a777457 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -97,14 +97,6 @@ using namespace ABI::Windows::Foundation; using namespace ABI::Windows::Storage; #endif -#ifndef CSIDL_COMMON_APPDATA -#define CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data -#endif - -#ifndef CSIDL_APPDATA -#define CSIDL_APPDATA 0x001a // \Application Data -#endif - #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID) #define Q_XDG_PLATFORM #endif @@ -959,31 +951,34 @@ void QConfFileSettingsPrivate::initAccess() } #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) -static QString windowsConfigPath(int type) +static QString windowsConfigPath(const KNOWNFOLDERID &type) { QString result; - wchar_t path[MAX_PATH]; - if (SHGetSpecialFolderPath(0, path, type, false)) + PWSTR path = nullptr; + if (SHGetKnownFolderPath(type, KF_FLAG_DONT_VERIFY, NULL, &path) == S_OK) { result = QString::fromWCharArray(path); + CoTaskMemFree(path); + } if (result.isEmpty()) { - switch (type) { - case CSIDL_COMMON_APPDATA: + if (type == FOLDERID_ProgramData) { result = QLatin1String("C:\\temp\\qt-common"); - break; - case CSIDL_APPDATA: + } else if (type == FOLDERID_RoamingAppData) { result = QLatin1String("C:\\temp\\qt-user"); - break; - default: - ; } } return result; } #elif defined(Q_OS_WINRT) // Q_OS_WIN && !Q_OS_WINRT -static QString windowsConfigPath(int type) + +enum ConfigPathType { + ConfigPath_CommonAppData, + ConfigPath_UserAppData +}; + +static QString windowsConfigPath(ConfigPathType type) { static QString result; while (result.isEmpty()) { @@ -1006,12 +1001,10 @@ static QString windowsConfigPath(int type) } switch (type) { - case CSIDL_COMMON_APPDATA: + case ConfigPath_CommonAppData: return result + QLatin1String("\\qt-common"); - case CSIDL_APPDATA: + case ConfigPath_UserAppData: return result + QLatin1String("\\qt-user"); - default: - break; } return result; } @@ -1068,10 +1061,18 @@ static void initDefaultPaths(QMutexLocker *locker) Windows registry and the Mac CFPreferences.) */ #ifdef Q_OS_WIN + +# ifdef Q_OS_WINRT + const QString roamingAppDataFolder = windowsConfigPath(ConfigPath_UserAppData); + const QString programDataFolder = windowsConfigPath(ConfigPath_CommonAppData); +# else + const QString roamingAppDataFolder = windowsConfigPath(FOLDERID_RoamingAppData); + const QString programDataFolder = windowsConfigPath(FOLDERID_ProgramData); +# endif pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::UserScope), - windowsConfigPath(CSIDL_APPDATA) + QDir::separator()); + roamingAppDataFolder + QDir::separator()); pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::SystemScope), - windowsConfigPath(CSIDL_COMMON_APPDATA) + QDir::separator()); + programDataFolder + QDir::separator()); #else const QString userPath = make_user_path(); pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::UserScope), userPath); @@ -2231,20 +2232,20 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile, On Windows, the following files are used: \list 1 - \li \c{CSIDL_APPDATA\MySoft\Star Runner.ini} - \li \c{CSIDL_APPDATA\MySoft.ini} - \li \c{CSIDL_COMMON_APPDATA\MySoft\Star Runner.ini} - \li \c{CSIDL_COMMON_APPDATA\MySoft.ini} + \li \c{FOLDERID_RoamingAppData\MySoft\Star Runner.ini} + \li \c{FOLDERID_RoamingAppData\MySoft.ini} + \li \c{FOLDERID_ProgramData\MySoft\Star Runner.ini} + \li \c{FOLDERID_ProgramData\MySoft.ini} \endlist - The identifiers prefixed by \c{CSIDL_} are special item ID lists to be passed - to the Win32 API function \c{SHGetSpecialFolderPath()} to obtain the + The identifiers prefixed by \c{FOLDERID_} are special item ID lists to be passed + to the Win32 API function \c{SHGetKnownFolderPath()} to obtain the corresponding path. - \c{CSIDL_APPDATA} usually points to \tt{C:\\Users\\\e{User Name}\\AppData\\Roaming}, + \c{FOLDERID_RoamingAppData} usually points to \tt{C:\\Users\\\e{User Name}\\AppData\\Roaming}, also shown by the environment variable \c{%APPDATA%}. - \c{CSIDL_COMMON_APPDATA} usually points to \tt{C:\\ProgramData}. + \c{FOLDERID_ProgramData} usually points to \tt{C:\\ProgramData}. If the file format is IniFormat, this is "Settings/MySoft/Star Runner.ini" in the application's home directory. @@ -3348,8 +3349,8 @@ void QSettings::setUserIniPath(const QString &dir) \table \header \li Platform \li Format \li Scope \li Path - \row \li{1,2} Windows \li{1,2} IniFormat \li UserScope \li \c CSIDL_APPDATA - \row \li SystemScope \li \c CSIDL_COMMON_APPDATA + \row \li{1,2} Windows \li{1,2} IniFormat \li UserScope \li \c FOLDERID_RoamingAppData + \row \li SystemScope \li \c FOLDERID_ProgramData \row \li{1,2} Unix \li{1,2} NativeFormat, IniFormat \li UserScope \li \c $HOME/.config \row \li SystemScope \li \c /etc/xdg \row \li{1,2} Qt for Embedded Linux \li{1,2} NativeFormat, IniFormat \li UserScope \li \c $HOME/Settings From 5b05c37845887c275c8b076505f536bc42edf099 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 18 Nov 2016 19:40:33 +0100 Subject: [PATCH 076/174] qmake: fix up dist targets for mingw & nmake somewhat actually pack the extra compilers' input files, not the variable names. unlike on unix, we don't create an actual distdir, so the package is still going to be rather broken. Change-Id: If0a15bbe9db95aebd88c2a21ca3c0f787ce5c7e1 Reviewed-by: Joerg Bornemann --- qmake/generators/win32/winmakefile.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp index ccf6457048..26e1901f8b 100644 --- a/qmake/generators/win32/winmakefile.cpp +++ b/qmake/generators/win32/winmakefile.cpp @@ -608,8 +608,10 @@ void Win32MakefileGenerator::writeStandardParts(QTextStream &t) const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { const ProStringList &inputs = project->values(ProKey(*it + ".input")); - for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) - t << escapeFilePath(*input) << ' '; + for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) { + const ProStringList &val = project->values((*input).toKey()); + t << escapeFilePaths(val).join(' ') << ' '; + } } } t << endl << endl; From 0810d48bc4cb820c0cba982a2ec392058eccd466 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 18 Nov 2016 19:05:54 +0100 Subject: [PATCH 077/174] unbreak "aux" template for mingw & msvc, take 2 of course, we should stub out everything related to TARGET - only the generic "all" and "first" targets including their deps should be emitted. amends af2847260. Change-Id: I8ed7a550b8022c69328d2e16dbd078928d176964 Reviewed-by: Joerg Bornemann --- qmake/generators/win32/mingw_make.cpp | 9 +++++++-- qmake/generators/win32/msvc_nmake.cpp | 9 +++++++-- qmake/generators/win32/winmakefile.cpp | 18 ++++++++++-------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp index 8c315e0696..92c6f35817 100644 --- a/qmake/generators/win32/mingw_make.cpp +++ b/qmake/generators/win32/mingw_make.cpp @@ -313,7 +313,12 @@ void MingwMakefileGenerator::writeBuildRulesPart(QTextStream &t) { t << "first: all\n"; t << "all: " << escapeDependencyPath(fileFixify(Option::output.fileName())) - << ' ' << depVar("ALL_DEPS") << " $(DESTDIR_TARGET)\n\n"; + << ' ' << depVar("ALL_DEPS"); + if (project->first("TEMPLATE") == "aux") { + t << "\n\n"; + return; + } + t << " $(DESTDIR_TARGET)\n\n"; t << "$(DESTDIR_TARGET): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS"); if(!project->isEmpty("QMAKE_PRE_LINK")) t << "\n\t" <first("TEMPLATE") != "aux") { + } else { t << "\n\t$(LINKER) $(LFLAGS) " << var("QMAKE_LINK_O_FLAG") << "$(DESTDIR_TARGET) " << objectsLinkLine << " $(LIBS)"; } if(!project->isEmpty("QMAKE_POST_LINK")) diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index 41bec4c36d..8f70be4665 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -552,7 +552,12 @@ void NmakeMakefileGenerator::writeBuildRulesPart(QTextStream &t) t << "first: all\n"; t << "all: " << escapeDependencyPath(fileFixify(Option::output.fileName())) - << ' ' << depVar("ALL_DEPS") << " $(DESTDIR_TARGET)\n\n"; + << ' ' << depVar("ALL_DEPS"); + if (templateName == "aux") { + t << "\n\n"; + return; + } + t << " $(DESTDIR_TARGET)\n\n"; t << "$(DESTDIR_TARGET): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS"); if(!project->isEmpty("QMAKE_PRE_LINK")) @@ -561,7 +566,7 @@ void NmakeMakefileGenerator::writeBuildRulesPart(QTextStream &t) t << "\n\t$(LIBAPP) $(LIBFLAGS) " << var("QMAKE_LINK_O_FLAG") << "$(DESTDIR_TARGET) @<<\n\t " << "$(OBJECTS)" << "\n<<"; - } else if (templateName != "aux") { + } else { const bool embedManifest = ((templateName == "app" && project->isActiveConfig("embed_manifest_exe")) || (templateName == "lib" && project->isActiveConfig("embed_manifest_dll") && !(project->isActiveConfig("plugin") && project->isActiveConfig("no_plugin_manifest")) diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp index 26e1901f8b..ec66efd1cb 100644 --- a/qmake/generators/win32/winmakefile.cpp +++ b/qmake/generators/win32/winmakefile.cpp @@ -575,16 +575,18 @@ void Win32MakefileGenerator::writeStandardParts(QTextStream &t) t << "####### Build rules\n\n"; writeBuildRulesPart(t); - if(project->isActiveConfig("shared") && !project->values("DLLDESTDIR").isEmpty()) { - const ProStringList &dlldirs = project->values("DLLDESTDIR"); - for (ProStringList::ConstIterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir) { - t << "\t-$(COPY_FILE) $(DESTDIR_TARGET) " - << escapeFilePath(Option::fixPathToTargetOS((*dlldir).toQString(), false)) << endl; + if (project->first("TEMPLATE") != "aux") { + if (project->isActiveConfig("shared") && !project->values("DLLDESTDIR").isEmpty()) { + const ProStringList &dlldirs = project->values("DLLDESTDIR"); + for (ProStringList::ConstIterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir) { + t << "\t-$(COPY_FILE) $(DESTDIR_TARGET) " + << escapeFilePath(Option::fixPathToTargetOS((*dlldir).toQString(), false)) << endl; + } } - } - t << endl; + t << endl; - writeRcFilePart(t); + writeRcFilePart(t); + } writeMakeQmake(t); From 435e7b17a35f4aa2cc2a7cb3ac935cf56ee27d62 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Tue, 15 Nov 2016 17:28:44 +0100 Subject: [PATCH 078/174] Fix qmldir copying in debug and release builds on Windows This is a backport of 6cc02ce6c85d3dbd49a55060bd21a8359884786f from 5.7. In a parallel build we may end up copying the qmldir file at the same time, which doesn't work on Windows due to file locking. Apply the same guard for the copying condition as in commit 770a0c91f3fadcdb132d9eb96d085aafbe1bacd0. Task-number: QTBUG-57153 Change-Id: Ibac759b16cebaf04f5d2f785211b62071aa656a8 Reviewed-by: Oswald Buddenhagen --- mkspecs/features/qml_module.prf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mkspecs/features/qml_module.prf b/mkspecs/features/qml_module.prf index b09d42a0a4..47ebe78400 100644 --- a/mkspecs/features/qml_module.prf +++ b/mkspecs/features/qml_module.prf @@ -28,4 +28,8 @@ qmldir.files = $$fq_qml_files qmldir.path = $$instbase/$$TARGETPATH INSTALLS += qmldir -!prefix_build: COPIES += qmldir +!debug_and_release|!build_all|CONFIG(release, debug|release) { + !prefix_build { + COPIES += qmldir + } +} From d3ab4a1ce7cd0fe6539d592138a8119dd51d818f Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 16 Nov 2016 13:11:43 +0100 Subject: [PATCH 079/174] _q_networkSessionClosed - disconnect the correct object We have: ... auto networkSession = getNetworkSession(); ... getNetworkSession() can return non-null pointer even if networkSessionStrongRef is null: ... if (networkSessionStrongRef) return networkSessionStrongRef; return networkSessionWeakRef.toStrongRef(); .... We check the result: if (networkSession) { // here we disconnect signals } But we should use the same networkSession when disconnecting, not start using networkSessionStrongRef suddenly, since it can be null. Task-number: QTBUG-57110 Change-Id: I96babb42c2182e741e6eabaf7d1abb88869861f4 Reviewed-by: Jesus Fernandez Reviewed-by: Edward Welbourne Reviewed-by: Timur Pocheptsov --- src/network/access/qnetworkaccessmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index b649aba4a8..57d110ed94 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -1599,7 +1599,7 @@ void QNetworkAccessManagerPrivate::_q_networkSessionClosed() QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed())); QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)), q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State))); - QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(error(QNetworkSession::SessionError)), + QObject::disconnect(networkSession.data(), SIGNAL(error(QNetworkSession::SessionError)), q, SLOT(_q_networkSessionFailed(QNetworkSession::SessionError))); networkSessionStrongRef.clear(); From a4bd635b33d08a4b58fb4db8cefd1e0535fb95eb Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 21 Nov 2016 17:05:49 +0100 Subject: [PATCH 080/174] Typo fix in QDateTime::toString() documentation Text that should simply have been naming days of the week used Qt::Sunday rather than the simple day name. Change-Id: I64a3cdacd854c1c9c0fbf2d11826555086d674f4 Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 3e29b55666..5f5023e8b5 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -3611,7 +3611,7 @@ QString QDateTime::toString(Qt::DateFormat format) const \li the abbreviated localized day name (e.g. 'Mon' to 'Sun'). Uses the system locale to localize the name, i.e. QLocale::system(). \row \li dddd - \li the long localized day name (e.g. 'Monday' to 'Qt::Sunday'). + \li the long localized day name (e.g. 'Monday' to 'Sunday'). Uses the system locale to localize the name, i.e. QLocale::system(). \row \li M \li the month as number without a leading zero (1-12) \row \li MM \li the month as number with a leading zero (01-12) From 0aa3de46cacacdb83efe1d5e5b2506560c93c9ff Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 7 Nov 2016 10:09:06 +0100 Subject: [PATCH 081/174] Fix two leaky uses of realloc() If it fails, we get NULL back but haven't free()d the old pointer; saving the NULL return over the old pointer forgets it, leaking the memory it pointed to. This is particularly severe in the JSON parser's grow(), where reading a very large JSON document can lead to the last successful realloc() in a doubling pattern being very large indeed; the subsequent failure will leak this very last allocation. Only worth checking for, however, when the subsequent code takes care to handle failure: in most cases, if realloc() fails, we're about to crash anyway. Change-Id: Icd3a503f169be224f0a058c58e8b7c82a3241ae7 Reviewed-by: Marc Mutz Reviewed-by: Anton Kudryavtsev --- src/corelib/json/qjsonparser.cpp | 5 +++-- src/corelib/json/qjsonparser_p.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp index c7b16d5ec9..a23741a85c 100644 --- a/src/corelib/json/qjsonparser.cpp +++ b/src/corelib/json/qjsonparser.cpp @@ -491,9 +491,10 @@ namespace { memcpy(newValues, data, size*sizeof(QJsonPrivate::Value)); data = newValues; } else { - data = static_cast(realloc(data, alloc*sizeof(QJsonPrivate::Value))); - if (!data) + void *newValues = realloc(data, alloc * sizeof(QJsonPrivate::Value)); + if (!newValues) return false; + data = static_cast(newValues); } return true; } diff --git a/src/corelib/json/qjsonparser_p.h b/src/corelib/json/qjsonparser_p.h index 82a7899a51..b17d75fb3a 100644 --- a/src/corelib/json/qjsonparser_p.h +++ b/src/corelib/json/qjsonparser_p.h @@ -101,11 +101,12 @@ private: inline int reserveSpace(int space) { if (current + space >= dataLength) { dataLength = 2*dataLength + space; - data = (char *)realloc(data, dataLength); - if (!data) { + char *newData = (char *)realloc(data, dataLength); + if (!newData) { lastError = QJsonParseError::DocumentTooLarge; return -1; } + data = newData; } int pos = current; current += space; From 7c41ced98c3cb5484069c14c45733d3129e7945a Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 2 Feb 2016 17:35:09 +0100 Subject: [PATCH 082/174] QDateTimeParser: introduce at least some encapsulation Shuffled its parts to make clear which bits are public, private and protected. QDateTimeEditPrivate makes rather heavy use of the last. Change-Id: Ic5f9d0c5cc85f02e57d3f31e9ac31a17428c5311 Reviewed-by: Timur Pocheptsov --- src/corelib/tools/qdatetimeparser_p.h | 85 ++++++++++++++------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/src/corelib/tools/qdatetimeparser_p.h b/src/corelib/tools/qdatetimeparser_p.h index 90c6a8acba..0ac7532aed 100644 --- a/src/corelib/tools/qdatetimeparser_p.h +++ b/src/corelib/tools/qdatetimeparser_p.h @@ -97,14 +97,6 @@ public: none.zeroesAdded = 0; } virtual ~QDateTimeParser() {} - enum AmPmFinder { - Neither = -1, - AM = 0, - PM = 1, - PossibleAM = 2, - PossiblePM = 3, - PossibleBoth = 4 - }; enum Section { NoSection = 0x00000, @@ -180,40 +172,11 @@ public: #ifndef QT_NO_DATESTRING StateNode parse(QString &input, int &cursorPosition, const QDateTime ¤tValue, bool fixup) const; #endif - int sectionMaxSize(int index) const; - int sectionSize(int index) const; - int sectionMaxSize(Section s, int count) const; - int sectionPos(int index) const; - int sectionPos(const SectionNode &sn) const; - - const SectionNode §ionNode(int index) const; - Section sectionType(int index) const; - QString sectionText(int sectionIndex) const; - QString sectionText(const QString &text, int sectionIndex, int index) const; - int getDigit(const QDateTime &dt, int index) const; - bool setDigit(QDateTime &t, int index, int newval) const; - int parseSection(const QDateTime ¤tValue, int sectionIndex, QString &txt, int &cursorPosition, - int index, QDateTimeParser::State &state, int *used = 0) const; - int absoluteMax(int index, const QDateTime &value = QDateTime()) const; - int absoluteMin(int index) const; bool parseFormat(const QString &format); #ifndef QT_NO_DATESTRING bool fromString(const QString &text, QDate *date, QTime *time) const; #endif -#ifndef QT_NO_TEXTDATE - int findMonth(const QString &str1, int monthstart, int sectionIndex, - QString *monthName = 0, int *used = 0) const; - int findDay(const QString &str1, int intDaystart, int sectionIndex, - QString *dayName = 0, int *used = 0) const; -#endif - AmPmFinder findAmPm(QString &str, int index, int *used = 0) const; - bool potentialValue(const QString &str, int min, int max, int index, - const QDateTime ¤tValue, int insert) const; - bool skipToNextSection(int section, const QDateTime ¤t, const QString §ionText) const; - - QString stateName(State s) const; - enum FieldInfoFlag { Numeric = 0x01, FixedWidth = 0x02, @@ -225,17 +188,59 @@ public: FieldInfo fieldInfo(int index) const; void setDefaultLocale(const QLocale &loc) { defaultLocale = loc; } + virtual QString displayText() const { return text; } + +private: + int sectionMaxSize(Section s, int count) const; + QString sectionText(const QString &text, int sectionIndex, int index) const; + int parseSection(const QDateTime ¤tValue, int sectionIndex, QString &txt, int &cursorPosition, + int index, QDateTimeParser::State &state, int *used = 0) const; +#ifndef QT_NO_TEXTDATE + int findMonth(const QString &str1, int monthstart, int sectionIndex, + QString *monthName = 0, int *used = 0) const; + int findDay(const QString &str1, int intDaystart, int sectionIndex, + QString *dayName = 0, int *used = 0) const; +#endif + + enum AmPmFinder { + Neither = -1, + AM = 0, + PM = 1, + PossibleAM = 2, + PossiblePM = 3, + PossibleBoth = 4 + }; + AmPmFinder findAmPm(QString &str, int index, int *used = 0) const; + bool potentialValue(const QString &str, int min, int max, int index, + const QDateTime ¤tValue, int insert) const; + +protected: // for the benefit of QDateTimeEditPrivate + int sectionSize(int index) const; + int sectionMaxSize(int index) const; + int sectionPos(int index) const; + int sectionPos(const SectionNode &sn) const; + + const SectionNode §ionNode(int index) const; + Section sectionType(int index) const; + QString sectionText(int sectionIndex) const; + int getDigit(const QDateTime &dt, int index) const; + bool setDigit(QDateTime &t, int index, int newval) const; + + int absoluteMax(int index, const QDateTime &value = QDateTime()) const; + int absoluteMin(int index) const; + + bool skipToNextSection(int section, const QDateTime ¤t, const QString §ionText) const; + QString stateName(State s) const; virtual QDateTime getMinimum() const; virtual QDateTime getMaximum() const; virtual int cursorPosition() const { return -1; } - virtual QString displayText() const { return text; } virtual QString getAmPmText(AmPm ap, Case cs) const; virtual QLocale locale() const { return defaultLocale; } mutable int currentSectionIndex; Sections display; /* - This stores the stores the most recently selected day. + This stores the most recently selected day. It is useful when considering the following scenario: 1. Date is: 31/01/2000 @@ -255,9 +260,7 @@ public: QString displayFormat; QLocale defaultLocale; QVariant::Type parserType; - bool fixday; - Qt::TimeSpec spec; // spec if used by QDateTimeEdit Context context; }; From dc4c647137257fc7d3081db5d52f722c754e7dcb Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 21 Nov 2016 15:44:36 +0100 Subject: [PATCH 083/174] Clean up the resource reading code Instead of doing the conversion from the big-endian data by hand, let's use the convenience functions from qendian.h. Change-Id: If3966ca94428afabb1f5c922967fb9970f976622 Reviewed-by: hjk --- src/corelib/io/qresource.cpp | 69 +++++++++++++----------------------- 1 file changed, 24 insertions(+), 45 deletions(-) diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp index 72042e1600..febf22639c 100644 --- a/src/corelib/io/qresource.cpp +++ b/src/corelib/io/qresource.cpp @@ -49,6 +49,7 @@ #include "qdatetime.h" #include "qbytearray.h" #include "qstringlist.h" +#include "qendian.h" #include #include #include "private/qabstractfileengine_p.h" @@ -606,11 +607,9 @@ inline uint QResourceRoot::hash(int node) const if(!node) //root return 0; const int offset = findOffset(node); - int name_offset = (tree[offset+0] << 24) + (tree[offset+1] << 16) + - (tree[offset+2] << 8) + (tree[offset+3] << 0); + qint32 name_offset = qFromBigEndian(tree + offset); name_offset += 2; //jump past name length - return (names[name_offset+0] << 24) + (names[name_offset+1] << 16) + - (names[name_offset+2] << 8) + (names[name_offset+3] << 0); + return qFromBigEndian(names + name_offset); } inline QString QResourceRoot::name(int node) const { @@ -619,10 +618,8 @@ inline QString QResourceRoot::name(int node) const const int offset = findOffset(node); QString ret; - int name_offset = (tree[offset+0] << 24) + (tree[offset+1] << 16) + - (tree[offset+2] << 8) + (tree[offset+3] << 0); - const short name_length = (names[name_offset+0] << 8) + - (names[name_offset+1] << 0); + qint32 name_offset = qFromBigEndian(tree + offset); + const qint16 name_length = qFromBigEndian(names + name_offset); name_offset += 2; name_offset += 4; //jump past hash @@ -662,10 +659,8 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const return 0; //the root node is always first - int child_count = (tree[6] << 24) + (tree[7] << 16) + - (tree[8] << 8) + (tree[9] << 0); - int child = (tree[10] << 24) + (tree[11] << 16) + - (tree[12] << 8) + (tree[13] << 0); + qint32 child_count = qFromBigEndian(tree + 6); + qint32 child = qFromBigEndian(tree + 10); //now iterate up the tree int node = -1; @@ -711,18 +706,15 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const #endif offset += 4; //jump past name - const short flags = (tree[offset+0] << 8) + - (tree[offset+1] << 0); + const qint16 flags = qFromBigEndian(tree + offset); offset += 2; if(!splitter.hasNext()) { if(!(flags & Directory)) { - const short country = (tree[offset+0] << 8) + - (tree[offset+1] << 0); + const qint16 country = qFromBigEndian(tree + offset); offset += 2; - const short language = (tree[offset+0] << 8) + - (tree[offset+1] << 0); + const qint16 language = qFromBigEndian(tree + offset); offset += 2; #ifdef DEBUG_RESOURCE_MATCH qDebug() << " " << "LOCALE" << country << language; @@ -749,11 +741,9 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const if(!(flags & Directory)) return -1; - child_count = (tree[offset+0] << 24) + (tree[offset+1] << 16) + - (tree[offset+2] << 8) + (tree[offset+3] << 0); + child_count = qFromBigEndian(tree + offset); offset += 4; - child = (tree[offset+0] << 24) + (tree[offset+1] << 16) + - (tree[offset+2] << 8) + (tree[offset+3] << 0); + child = qFromBigEndian(tree + offset); break; } } @@ -771,7 +761,7 @@ short QResourceRoot::flags(int node) const if(node == -1) return 0; const int offset = findOffset(node) + 4; //jump past name - return (tree[offset+0] << 8) + (tree[offset+1] << 0); + return qFromBigEndian(tree + offset); } const uchar *QResourceRoot::data(int node, qint64 *size) const { @@ -781,16 +771,14 @@ const uchar *QResourceRoot::data(int node, qint64 *size) const } int offset = findOffset(node) + 4; //jump past name - const short flags = (tree[offset+0] << 8) + (tree[offset+1] << 0); + const qint16 flags = qFromBigEndian(tree + offset); offset += 2; offset += 4; //jump past locale if(!(flags & Directory)) { - const int data_offset = (tree[offset+0] << 24) + (tree[offset+1] << 16) + - (tree[offset+2] << 8) + (tree[offset+3] << 0); - const uint data_length = (payloads[data_offset+0] << 24) + (payloads[data_offset+1] << 16) + - (payloads[data_offset+2] << 8) + (payloads[data_offset+3] << 0); + const qint32 data_offset = qFromBigEndian(tree + offset); + const quint32 data_length = qFromBigEndian(payloads + data_offset); const uchar *ret = payloads+data_offset+4; *size = data_length; return ret; @@ -806,10 +794,7 @@ QDateTime QResourceRoot::lastModified(int node) const const int offset = findOffset(node) + 14; - const quint64 timeStamp = (quint64(tree[offset+0]) << 56) + (quint64(tree[offset+1]) << 48) + - (quint64(tree[offset+2]) << 40) + (quint64(tree[offset+3]) << 32) + - (quint64(tree[offset+4]) << 24) + (quint64(tree[offset+5]) << 16) + - (quint64(tree[offset+6]) << 8) + (quint64(tree[offset+7])); + const quint64 timeStamp = qFromBigEndian(tree + offset); if (timeStamp == 0) return QDateTime(); @@ -822,16 +807,14 @@ QStringList QResourceRoot::children(int node) const return QStringList(); int offset = findOffset(node) + 4; //jump past name - const short flags = (tree[offset+0] << 8) + (tree[offset+1] << 0); + const qint16 flags = qFromBigEndian(tree + offset); offset += 2; QStringList ret; if(flags & Directory) { - const int child_count = (tree[offset+0] << 24) + (tree[offset+1] << 16) + - (tree[offset+2] << 8) + (tree[offset+3] << 0); + const qint32 child_count = qFromBigEndian(tree + offset); offset += 4; - const int child_off = (tree[offset+0] << 24) + (tree[offset+1] << 16) + - (tree[offset+2] << 8) + (tree[offset+3] << 0); + const qint32 child_off = qFromBigEndian(tree + offset); ret.reserve(child_count); for(int i = child_off; i < child_off+child_count; ++i) ret << name(i); @@ -935,20 +918,16 @@ public: } offset += 4; - const int version = (b[offset+0] << 24) + (b[offset+1] << 16) + - (b[offset+2] << 8) + (b[offset+3] << 0); + const int version = qFromBigEndian(b + offset); offset += 4; - const int tree_offset = (b[offset+0] << 24) + (b[offset+1] << 16) + - (b[offset+2] << 8) + (b[offset+3] << 0); + const int tree_offset = qFromBigEndian(b + offset); offset += 4; - const int data_offset = (b[offset+0] << 24) + (b[offset+1] << 16) + - (b[offset+2] << 8) + (b[offset+3] << 0); + const int data_offset = qFromBigEndian(b + offset); offset += 4; - const int name_offset = (b[offset+0] << 24) + (b[offset+1] << 16) + - (b[offset+2] << 8) + (b[offset+3] << 0); + const int name_offset = qFromBigEndian(b + offset); offset += 4; // Some sanity checking for sizes. This is _not_ a security measure. From 34be7dc9d09c45a5e47a13716ee4db70f95dabcf Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 23 Nov 2016 11:50:35 +0100 Subject: [PATCH 084/174] Optimize fontdatabase fallbacksForFamily Short-cut the case-insensitive string comparison when lengths doesn't match. This reduces the time spend in ucstricmp from 8% during start-up of the textedit example, to under 1%. Change-Id: Ib3a92900b330453289ec9eff4830dfac6a9a5da2 Reviewed-by: Thiago Macieira --- src/gui/text/qfontdatabase.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index d2da24ca94..5145385fdc 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -406,9 +406,14 @@ QtFontFoundry *QtFontFamily::foundry(const QString &f, bool create) return foundries[count++]; } +static inline bool equalsCaseInsensitive(const QString &a, const QString &b) +{ + return a.size() == b.size() && a.compare(b, Qt::CaseInsensitive) == 0; +} + bool QtFontFamily::matchesFamilyName(const QString &familyName) const { - return name.compare(familyName, Qt::CaseInsensitive) == 0 || aliases.contains(familyName, Qt::CaseInsensitive); + return equalsCaseInsensitive(name, familyName) || aliases.contains(familyName, Qt::CaseInsensitive); } void QtFontFamily::ensurePopulated() From 4f896ba34e0f56e492da19c6d1353ac4ba4c7b2e Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Wed, 23 Nov 2016 11:39:31 +0100 Subject: [PATCH 085/174] ICC: Fix MySQL driver build In function `QMYSQLDriver::formatValue(QSqlField const&, bool) const': qsql_mysql.cpp:1569: undefined reference to `QString::operator=( QLatin1String) Change-Id: I56104cdd53fdc083670510f24b735cf05948f156 Reviewed-by: Samuel Gaist Reviewed-by: Milian Wolff Reviewed-by: Thiago Macieira --- src/sql/drivers/mysql/qsql_mysql.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp index c26c03ad07..4e86a0bd4e 100644 --- a/src/sql/drivers/mysql/qsql_mysql.cpp +++ b/src/sql/drivers/mysql/qsql_mysql.cpp @@ -1566,7 +1566,7 @@ QString QMYSQLDriver::formatValue(const QSqlField &field, bool trimStrings) cons Q_D(const QMYSQLDriver); QString r; if (field.isNull()) { - r = QLatin1String("NULL"); + r = QStringLiteral("NULL"); } else { switch(field.type()) { case QVariant::Double: From 72ed34b792f5acca5e0ada3b3d753b7a16274ff6 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 17 Nov 2016 13:23:47 +0100 Subject: [PATCH 086/174] Don't set platform specific QT_NO_FOO defines in qglobal.h They should be enabled/disabled through the configuration system. Remove some unused defines, and move one define from qglobal.h to a proper feature definition in Qt Gui. Change-Id: Ie8d5bff9712ba745af60b42ceca3f0440bed2706 Reviewed-by: Thiago Macieira --- src/corelib/configure.json | 8 +++++- src/corelib/global/qglobal.h | 26 ------------------- src/gui/configure.json | 7 +++++ src/network/configure.json | 2 ++ .../genericunix/qgenericunixservices.cpp | 3 ++- 5 files changed, 18 insertions(+), 28 deletions(-) diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 5017f4652a..0d1954c3a8 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -396,13 +396,17 @@ "label": "QSharedMemory", "purpose": "Provides access to a shared memory segment.", "section": "Kernel", + "condition": "!config.vxworks", "output": [ "publicFeature", "feature" ] }, "systemsemaphore": { "label": "QSystemSemaphore", "purpose": "Provides a general counting system semaphore.", "section": "Kernel", - "condition": "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix", + "condition": [ + "!config.integrity && !config.vxworks", + "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix" + ], "output": [ "publicFeature", "feature" ] }, "xmlstream": { @@ -442,6 +446,7 @@ "label": "QProcess", "purpose": "Supports external process invocation.", "section": "File I/O", + "condition": "!config.winrt && !config.uikit && !config.integrity && !config.vxworks", "output": [ "publicFeature", "feature" ] }, "temporaryfile": { @@ -466,6 +471,7 @@ "label": "QFileSystemWatcher", "purpose": "Provides an interface for monitoring files and directories for modifications.", "section": "File I/O", + "condition": "!config.winrt", "output": [ "publicFeature", "feature" ] }, "filesystemiterator": { diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 99be82f8c3..1737f58c87 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -619,32 +619,6 @@ private: class QDataStream; -#if defined(Q_OS_VXWORKS) -# define QT_NO_CRASHHANDLER // no popen -# define QT_NO_PROCESS // no exec*, no fork -# define QT_NO_SHAREDMEMORY // only POSIX, no SysV and in the end... -# define QT_NO_SYSTEMSEMAPHORE // not needed at all in a flat address space -#endif - -#if defined(Q_OS_WINRT) -# define QT_NO_FILESYSTEMWATCHER -# define QT_NO_NETWORKPROXY -# define QT_NO_PROCESS -# define QT_NO_SOCKETNOTIFIER -# define QT_NO_SOCKS5 -#endif - -#if defined(QT_PLATFORM_UIKIT) -# define QT_NO_PROCESS -#endif - -#if defined(Q_OS_INTEGRITY) -# define QT_NO_CRASHHANDLER // no popen -# define QT_NO_PROCESS // no exec*, no fork -# define QT_NO_SYSTEMSEMAPHORE // not needed at all in a single AddressSpace -# define QT_NO_MULTIPROCESS // no system -#endif - inline void qt_noop(void) {} /* These wrap try/catch so we can switch off exceptions later. diff --git a/src/gui/configure.json b/src/gui/configure.json index 6fba8173b4..1f5011617c 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -964,6 +964,13 @@ "section": "Utilities", "condition": "features.properties", "output": [ "publicFeature", "feature" ] + }, + "multiprocess": { + "label": "Multi process", + "description": "Provides support for detecting the desktop environment, launching external processes and opening URLs.", + "section": "Utilities", + "condition": "!config.integrity", + "output": [ "privateFeature" ] } }, diff --git a/src/network/configure.json b/src/network/configure.json index 30a1c39c0c..1e08aa7c49 100644 --- a/src/network/configure.json +++ b/src/network/configure.json @@ -207,12 +207,14 @@ "label": "QNetworkProxy", "purpose": "Provides network proxy support.", "section": "Networking", + "condition": "!config.winrt", "output": [ "publicFeature", "feature" ] }, "socks5": { "label": "SOCKS5", "purpose": "Provides SOCKS5 support in QNetworkProxy.", "section": "Networking", + "condition": "!config.winrt", "output": [ "publicFeature", "feature" ] }, "networkinterface": { diff --git a/src/platformsupport/services/genericunix/qgenericunixservices.cpp b/src/platformsupport/services/genericunix/qgenericunixservices.cpp index 5242f00193..a24ab82057 100644 --- a/src/platformsupport/services/genericunix/qgenericunixservices.cpp +++ b/src/platformsupport/services/genericunix/qgenericunixservices.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qgenericunixservices_p.h" +#include #include #include @@ -48,7 +49,7 @@ QT_BEGIN_NAMESPACE -#ifndef QT_NO_MULTIPROCESS +#if QT_CONFIG(multiprocess) enum { debug = 0 }; From 0861c2176c6dc1c69b733c1a843c2db5ec8ea786 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 18 Nov 2016 13:39:32 +0100 Subject: [PATCH 087/174] Use harfbuzz feature to check for HarfBuzz instead of defining a special macro for it. Change-Id: I715380717f7d871571f663be30b73f7d95d83d71 Reviewed-by: Konstantin Ritt --- src/gui/text/qfontengine.cpp | 10 +++++----- src/gui/text/qharfbuzzng_p.h | 3 +++ src/gui/text/qtextengine.cpp | 19 ++++++++++--------- src/gui/text/qtextengine_p.h | 2 +- src/gui/text/text.pri | 4 +--- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 74ea8d15b7..a7d7185a7e 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -53,7 +53,7 @@ #include #include -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) # include "qharfbuzzng_p.h" # include #endif @@ -93,7 +93,7 @@ static inline bool qSafeFromBigEndian(const uchar *source, const uchar *end, T * // Harfbuzz helper functions -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) Q_GLOBAL_STATIC_WITH_ARGS(bool, useHarfbuzzNG,(qgetenv("QT_HARFBUZZ") != "old")) bool qt_useHarfbuzzNG() @@ -296,7 +296,7 @@ QFixed QFontEngine::underlinePosition() const void *QFontEngine::harfbuzzFont() const { Q_ASSERT(type() != QFontEngine::Multi); -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) if (qt_useHarfbuzzNG()) return hb_qt_font_get_for_engine(const_cast(this)); #endif @@ -331,7 +331,7 @@ void *QFontEngine::harfbuzzFont() const void *QFontEngine::harfbuzzFace() const { Q_ASSERT(type() != QFontEngine::Multi); -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) if (qt_useHarfbuzzNG()) return hb_qt_face_get_for_engine(const_cast(this)); #endif @@ -363,7 +363,7 @@ bool QFontEngine::supportsScript(QChar::Script script) const return true; } -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) if (qt_useHarfbuzzNG()) { #if defined(Q_OS_DARWIN) // in AAT fonts, 'gsub' table is effectively replaced by 'mort'/'morx' table diff --git a/src/gui/text/qharfbuzzng_p.h b/src/gui/text/qharfbuzzng_p.h index 95a21eedb6..fabf222bae 100644 --- a/src/gui/text/qharfbuzzng_p.h +++ b/src/gui/text/qharfbuzzng_p.h @@ -53,6 +53,9 @@ // #include + +QT_REQUIRE_CONFIG(harfbuzz); + #include #include diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 742b01dd1f..67cafa53fe 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -37,6 +37,7 @@ ** ****************************************************************************/ +#include #include "qdebug.h" #include "qtextformat.h" #include "qtextformat_p.h" @@ -837,7 +838,7 @@ enum JustificationClass { Justification_Arabic_Kashida = 13 // User-inserted Kashida(U+0640) }; -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) /* Adds an inter character justification opportunity after the number or letter @@ -916,7 +917,7 @@ static inline void qt_getJustificationOpportunities(const ushort *string, int le qt_getDefaultJustificationOpportunities(string, length, g, log_clusters, spaceAs); } -#endif // QT_ENABLE_HARFBUZZ_NG +#endif // harfbuzz // shape all the items that intersect with the line, taking tab widths into account to find out what text actually fits in the line. @@ -950,7 +951,7 @@ void QTextEngine::shapeLine(const QScriptLine &line) } } -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) extern bool qt_useHarfbuzzNG(); // defined in qfontengine.cpp #endif @@ -1063,7 +1064,7 @@ void QTextEngine::shapeText(int item) const letterSpacing *= font.d->dpi / qt_defaultDpiY(); } -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) if (Q_LIKELY(qt_useHarfbuzzNG())) si.num_glyphs = shapeTextWithHarfbuzzNG(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled, letterSpacing != 0); else @@ -1079,7 +1080,7 @@ void QTextEngine::shapeText(int item) const QGlyphLayout glyphs = shapedGlyphs(&si); -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) if (Q_LIKELY(qt_useHarfbuzzNG())) qt_getJustificationOpportunities(string, itemLength, si, glyphs, logClusters(&si)); #endif @@ -1119,7 +1120,7 @@ void QTextEngine::shapeText(int item) const si.width += glyphs.advances[i] * !glyphs.attributes[i].dontPrint; } -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) QT_BEGIN_INCLUDE_NAMESPACE @@ -1313,7 +1314,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, return glyphs_shaped; } -#endif // QT_ENABLE_HARFBUZZ_NG +#endif // harfbuzz QT_BEGIN_INCLUDE_NAMESPACE @@ -1669,7 +1670,7 @@ void QTextEngine::itemize() const analysis->flags = QScriptAnalysis::None; break; } -#ifndef QT_ENABLE_HARFBUZZ_NG +#if !QT_CONFIG(harfbuzz) analysis->script = hbscript_to_script(script_to_hbscript(analysis->script)); #endif ++uc; @@ -1678,7 +1679,7 @@ void QTextEngine::itemize() const if (option.flags() & QTextOption::ShowLineAndParagraphSeparators) { (analysis-1)->flags = QScriptAnalysis::LineOrParagraphSeparator; // to exclude it from width } -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) analysis = scriptAnalysis.data(); if (qt_useHarfbuzzNG()) { // ### pretend HB-old behavior for now diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index 160e9ce490..f49e2638f5 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -649,7 +649,7 @@ private: void setBoundary(int strPos) const; void addRequiredBoundaries() const; void shapeText(int item) const; -#ifdef QT_ENABLE_HARFBUZZ_NG +#if QT_CONFIG(harfbuzz) int shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *string, int itemLength, diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri index a15793ec2f..efd041a5af 100644 --- a/src/gui/text/text.pri +++ b/src/gui/text/text.pri @@ -78,9 +78,7 @@ SOURCES += \ HEADERS += \ text/qplatformfontdatabase.h -qtConfig(harfbuzz)|qtConfig(system-harfbuzz) { - DEFINES += QT_ENABLE_HARFBUZZ_NG - +qtConfig(harfbuzz) { QMAKE_USE_PRIVATE += harfbuzz SOURCES += text/qharfbuzzng.cpp From 5bd2d6afec935a9eb4cf39af830f450f89f7202a Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 24 Nov 2016 10:54:03 +0200 Subject: [PATCH 088/174] Remove nokia reference in example mimetype Change-Id: I45c01fd57171f4ba6ea195d7ad3ae988a1797acb Reviewed-by: Oswald Buddenhagen Reviewed-by: David Faure --- src/corelib/mimetypes/qmimedatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp index 5c272d420b..91b50494d0 100644 --- a/src/corelib/mimetypes/qmimedatabase.cpp +++ b/src/corelib/mimetypes/qmimedatabase.cpp @@ -257,7 +257,7 @@ bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent) \code - + Qt qmake Profile From 17d72c783747dd8d9ce767002988d5d5a54a790e Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Sat, 19 Nov 2016 08:55:33 +0200 Subject: [PATCH 089/174] Android: All gcc flags should be set for clang too gcc-base-unix.conf must be included before clang.conf because clang.conf doesn't set all the needed flags. Change-Id: I71f95732d0d245096b575c91610800d91c6aa5d7 Reviewed-by: Vyacheslav Koscheev Reviewed-by: Oswald Buddenhagen --- mkspecs/android-clang/qmake.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/mkspecs/android-clang/qmake.conf b/mkspecs/android-clang/qmake.conf index c33bbe7eed..3e621c7d77 100644 --- a/mkspecs/android-clang/qmake.conf +++ b/mkspecs/android-clang/qmake.conf @@ -6,6 +6,7 @@ QMAKE_COMPILER = gcc clang llvm CONFIG += android_install unversioned_soname unversioned_libname plugin_with_soname android_deployment_settings include(../common/linux.conf) +include(../common/gcc-base-unix.conf) include(../common/clang.conf) include(../common/android-base-head.conf) From 600c5a7e1bb59f97205e0a50ccc05937a31b9480 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 15 Nov 2016 14:43:45 +0100 Subject: [PATCH 090/174] Document third-party code in Cocoa QPA plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I2c30f5da25c83d6129403cb9b745a2f17fd6fd9e Reviewed-by: Topi Reiniö --- src/plugins/platforms/cocoa/COCOA_LICENSE.txt | 29 +++++++++++++++++++ .../platforms/cocoa/qt_attribution.json | 13 +++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/plugins/platforms/cocoa/COCOA_LICENSE.txt create mode 100644 src/plugins/platforms/cocoa/qt_attribution.json diff --git a/src/plugins/platforms/cocoa/COCOA_LICENSE.txt b/src/plugins/platforms/cocoa/COCOA_LICENSE.txt new file mode 100644 index 0000000000..8c08f48528 --- /dev/null +++ b/src/plugins/platforms/cocoa/COCOA_LICENSE.txt @@ -0,0 +1,29 @@ +Copyright (c) 2007-2008, Apple, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Apple, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/plugins/platforms/cocoa/qt_attribution.json b/src/plugins/platforms/cocoa/qt_attribution.json new file mode 100644 index 0000000000..37c0937f29 --- /dev/null +++ b/src/plugins/platforms/cocoa/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "cocoa-platform-plugin", + "Name": "Cocoa Platform Plugin", + "QDocModule": "qtgui", + "QtUsage": "Code used in the Qt Platform Abstraction (QPA) for macOS.", + "Files": "qcocoaapplication.h qcocoaapplication.mm qcocoaapplicationdelegate.h qcocoaapplicationdelegate.mm qcocoaeventdispatcher.h qcocoaeventdispatcher.mm qcocoaintrospection.h qcocoaintrospection.mm qcocoasystemtrayicon.mm qmacdefines_mac.h", + + "Description": "Allows Qt to integrate into Apple's Cocoa API.", + "LicenseId": "BSD-3-Clause", + "License": "BSD 3-clause \"New\" or \"Revised\" License", + "LicenseFile": "COCOA_LICENSE.txt", + "Copyright": "Copyright (c) 2007-2008, Apple, Inc." +} From 8a2f5445231fc871a9fd88dec5569deb3104983d Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 25 Nov 2016 10:49:44 +0100 Subject: [PATCH 091/174] tst_qsql.cpp: Remove deprecated module include Fix warning: include/QtSql/qsql.h:4:4: warning: #warning Header is deprecated. Please include instead. [-Wcpp] Change-Id: I254c6ac9ddb0f49a7f4dc8b3de44fd1010f6243e Reviewed-by: Andy Shaw --- tests/auto/sql/kernel/qsql/tst_qsql.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/auto/sql/kernel/qsql/tst_qsql.cpp b/tests/auto/sql/kernel/qsql/tst_qsql.cpp index 282fed2584..2ce43b85a7 100644 --- a/tests/auto/sql/kernel/qsql/tst_qsql.cpp +++ b/tests/auto/sql/kernel/qsql/tst_qsql.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include From 5cd4001bf2a7f0894c6ac269860e833b02df6cde Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev Date: Fri, 25 Nov 2016 13:12:54 +0300 Subject: [PATCH 092/174] Use separate Qt5Config.cmake inside build directory Qt5Config restricts search paths of Qt components to ${_qt5_install_prefix} to prevent accidentally using system Qt modules in case of restricted Qt configuration. However this does not work properly when Qt is used without installation, in particular when building cmake-based QtWebKit as a Qt submodule, because ${_qt5_install_prefix} resolves to QtBase and does not contain components from other modules. This patch changes search path from ${_qt5_install_prefix} to all qt5 subdirectories. Change-Id: Icf01a256097710889573ad69d847b9c3bffa1449 Reviewed-by: Kevin Funk Reviewed-by: Oswald Buddenhagen --- src/corelib/Qt5Config.cmake.in | 12 ++++++++--- src/corelib/Qt5ModuleLocation.cmake.in | 15 +++++++++++++ .../Qt5ModuleLocationForInstall.cmake.in | 4 ++++ src/corelib/corelib.pro | 21 +++++++++++++++++-- 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 src/corelib/Qt5ModuleLocation.cmake.in create mode 100644 src/corelib/Qt5ModuleLocationForInstall.cmake.in diff --git a/src/corelib/Qt5Config.cmake.in b/src/corelib/Qt5Config.cmake.in index a872d0e917..75b53485b7 100644 --- a/src/corelib/Qt5Config.cmake.in +++ b/src/corelib/Qt5Config.cmake.in @@ -22,18 +22,24 @@ get_filename_component(_qt5_install_prefix \"${CMAKE_CURRENT_LIST_DIR}/..\" ABSO set(_Qt5_NOTFOUND_MESSAGE) +include(${CMAKE_CURRENT_LIST_DIR}/Qt5ModuleLocation.cmake) + foreach(module ${Qt5_FIND_COMPONENTS}) find_package(Qt5${module} ${_Qt5_FIND_PARTS_QUIET} ${_Qt5_FIND_PARTS_REQUIRED} - PATHS \"${_qt5_install_prefix}\" NO_DEFAULT_PATH + PATHS ${_qt5_module_paths} NO_DEFAULT_PATH ) if (NOT Qt5${module}_FOUND) + string(CONFIGURE ${_qt5_module_location_template} _expected_module_location @ONLY) + if (Qt5_FIND_REQUIRED_${module}) - set(_Qt5_NOTFOUND_MESSAGE \"${_Qt5_NOTFOUND_MESSAGE}Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_qt5_install_prefix}/Qt5${module}/Qt5${module}Config.cmake\\\"\\n\") + set(_Qt5_NOTFOUND_MESSAGE \"${_Qt5_NOTFOUND_MESSAGE}Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_expected_module_location}\\\"\\n\") elseif(NOT Qt5_FIND_QUIETLY) - message(WARNING \"Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_qt5_install_prefix}/Qt5${module}/Qt5${module}Config.cmake\\\"\") + message(WARNING \"Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_expected_module_location}\\\"\") endif() + + unset(_expected_module_location) endif() endforeach() diff --git a/src/corelib/Qt5ModuleLocation.cmake.in b/src/corelib/Qt5ModuleLocation.cmake.in new file mode 100644 index 0000000000..5065ada56e --- /dev/null +++ b/src/corelib/Qt5ModuleLocation.cmake.in @@ -0,0 +1,15 @@ +!!IF !isEmpty(_QMAKE_SUPER_CACHE_) +get_filename_component(_qt5_root_dir \"${CMAKE_CURRENT_LIST_DIR}/../../../..\" ABSOLUTE) + +file(GLOB qtmodules ${_qt5_root_dir} "${_qt5_root_dir}/*") +foreach(qtmodule ${qtmodules}) + if(IS_DIRECTORY ${qtmodule}) + list(APPEND _qt5_module_paths ${qtmodule}) + endif() +endforeach() +!!ELSE +set(_qt5_root_dir ${_qt5_install_prefix}) +set(_qt5_module_paths ${_qt5_install_prefix}) +!!ENDIF + +set(_qt5_module_location_template ${_qt5_root_dir}) diff --git a/src/corelib/Qt5ModuleLocationForInstall.cmake.in b/src/corelib/Qt5ModuleLocationForInstall.cmake.in new file mode 100644 index 0000000000..e401b1fe34 --- /dev/null +++ b/src/corelib/Qt5ModuleLocationForInstall.cmake.in @@ -0,0 +1,4 @@ +set(_qt5_root_dir ${_qt5_install_prefix}) +set(_qt5_module_paths ${_qt5_install_prefix}) + +set(_qt5_module_location_template ${_qt5_install_prefix}/Qt5@module@/Qt5@module@Config.cmake) diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 616a9641a1..0bd7c9b99d 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -93,6 +93,12 @@ ctest_macros_file.CONFIG = verbatim cmake_umbrella_config_file.input = $$PWD/Qt5Config.cmake.in cmake_umbrella_config_file.output = $$DESTDIR/cmake/Qt5/Qt5Config.cmake +cmake_umbrella_config_module_location.input = $$PWD/Qt5ModuleLocation.cmake.in +cmake_umbrella_config_module_location.output = $$DESTDIR/cmake/Qt5/Qt5ModuleLocation.cmake + +cmake_umbrella_config_module_location_for_install.input = $$PWD/Qt5ModuleLocationForInstall.cmake.in +cmake_umbrella_config_module_location_for_install.output = $$DESTDIR/cmake/install/Qt5/Qt5ModuleLocation.cmake + cmake_umbrella_config_version_file.input = $$PWD/../../mkspecs/features/data/cmake/Qt5ConfigVersion.cmake.in cmake_umbrella_config_version_file.output = $$DESTDIR/cmake/Qt5/Qt5ConfigVersion.cmake @@ -119,10 +125,21 @@ contains(CMAKE_INSTALL_DATA_DIR, "^\\.\\./.*"):!isEmpty(CMAKE_INSTALL_DATA_DIR) cmake_extras_mkspec_dir_for_install.input = $$PWD/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in cmake_extras_mkspec_dir_for_install.output = $$DESTDIR/cmake/install/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake -cmake_qt5_umbrella_module_files.files = $$cmake_umbrella_config_file.output $$cmake_umbrella_config_version_file.output +cmake_qt5_umbrella_module_files.files = \ + $$cmake_umbrella_config_file.output \ + $$cmake_umbrella_config_version_file.output \ + $$cmake_umbrella_config_module_location_for_install.output + cmake_qt5_umbrella_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5 -QMAKE_SUBSTITUTES += ctest_macros_file cmake_umbrella_config_file cmake_umbrella_config_version_file cmake_extras_mkspec_dir cmake_extras_mkspec_dir_for_install +QMAKE_SUBSTITUTES += \ + ctest_macros_file \ + cmake_umbrella_config_file \ + cmake_umbrella_config_module_location \ + cmake_umbrella_config_module_location_for_install \ + cmake_umbrella_config_version_file \ + cmake_extras_mkspec_dir \ + cmake_extras_mkspec_dir_for_install ctest_qt5_module_files.files += $$ctest_macros_file.output $$cmake_extras_mkspec_dir_for_install.output From 032971af2f15de231658eebdb12e5f821132238e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 25 Nov 2016 12:56:07 +0100 Subject: [PATCH 093/174] tests/manual,auto/qstorageinfo: Use function pointer in print helper Fix warning about unused variable printer in auto-test and redirects output to qInfo() as intended. Amends change a26435d65ceac5d714d5cc7d5af2326e162d7a41. Change-Id: Ia72a93267a54b9c4f9ef37fa058b95ef586ecc75 Reviewed-by: Simon Hausmann --- tests/manual/qstorageinfo/printvolumes.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/manual/qstorageinfo/printvolumes.cpp b/tests/manual/qstorageinfo/printvolumes.cpp index 1b1660b433..6089d5120a 100644 --- a/tests/manual/qstorageinfo/printvolumes.cpp +++ b/tests/manual/qstorageinfo/printvolumes.cpp @@ -42,17 +42,17 @@ void printVolumes(const QList &volumes, int (*printer)(const char // 214958080 39088272 4096 / // /dev/disk1s2 (hfs) RW 488050672 419909696 4096 Macintosh HD2 /Volumes/Macintosh HD2 - printf("Filesystem (Type) Size Available BSize Label Mounted on\n"); + printer("Filesystem (Type) Size Available BSize Label Mounted on\n"); foreach (const QStorageInfo &info, volumes) { QByteArray fsAndType = info.device(); if (info.fileSystemType() != fsAndType) fsAndType += " (" + info.fileSystemType() + ')'; - printf("%-19s R%c ", fsAndType.constData(), info.isReadOnly() ? 'O' : 'W'); + printer("%-19s R%c ", fsAndType.constData(), info.isReadOnly() ? 'O' : 'W'); if (fsAndType.size() > 19) - printf("\n%23s", ""); + printer("\n%23s", ""); - printf("%10llu %10llu %5u ", info.bytesTotal() / 1024, info.bytesFree() / 1024, info.blockSize()); - printf("%-16s %s\n", qPrintable(info.name()), qPrintable(info.rootPath())); + printer("%10llu %10llu %5u ", info.bytesTotal() / 1024, info.bytesFree() / 1024, info.blockSize()); + printer("%-16s %s\n", qPrintable(info.name()), qPrintable(info.rootPath())); } } From 38259594e2cbb371a34942e98ab4fca1028fd497 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 24 Nov 2016 14:19:12 +0100 Subject: [PATCH 094/174] fix use of $$QMAKE_QMAKE, take 2 we can't use $(QMAKE) after all, as this breaks with the visual studio generator. so massage $$QMAKE_QMAKE into the final form manually instead. supersedes 591d9588f in amending 2b6bcd5ff. Change-Id: I8c7a6c43f9668d88c1cc968dbf5614240f16239a Reviewed-by: Joerg Bornemann --- mkspecs/features/moc.prf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mkspecs/features/moc.prf b/mkspecs/features/moc.prf index bdb4eb49ec..dc14d71db7 100644 --- a/mkspecs/features/moc.prf +++ b/mkspecs/features/moc.prf @@ -32,7 +32,8 @@ if(gcc|intel_icl|msvc):!rim_qcc:!uikit { 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 { - moc_predefs.commands += $$QMAKE_CXX -Bx$(QMAKE) $$QMAKE_CXXFLAGS -E ${QMAKE_FILE_IN} 2>NUL >${QMAKE_FILE_OUT} + moc_predefs.commands += $$QMAKE_CXX -Bx$$shell_quote($$shell_path($$QMAKE_QMAKE)) $$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 From f91bbd243890511c99a084a478e7abe96d334860 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 24 Nov 2016 17:01:24 +0100 Subject: [PATCH 095/174] make handling of qml module search path saner excise knowledge of QTREPOS from qt.prf - this is a private variable of the qt build system which the public functions should not know anything about. instead, move this handling to a function in qt_build_config.prf (where QTREPOS comes from in the first place), and call it from qt_app.prf and qt_example_installs.prf (which should be the only consumers within qt). qt.prf now also checks that the qml install dir actually exists, which is not the case during a modular prefix build of qtdeclarative. not really incidentally, this fixes modular static builds of qtdeclarative. Task-number: QTBUG-57308 Change-Id: I31465b9cd400483264fc236934c6f9f26a5fdd73 Reviewed-by: Simon Hausmann --- mkspecs/features/qt.prf | 9 ++------- mkspecs/features/qt_app.prf | 2 ++ mkspecs/features/qt_build_config.prf | 16 ++++++++++++++++ mkspecs/features/qt_example_installs.prf | 3 +++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index 9bf0d2fad3..98f794c485 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -194,13 +194,8 @@ qt_module_deps = $$resolve_depends(qt_module_deps, "QT.") # static builds: link qml import plugins into the app. contains(qt_module_deps, qml): \ qtConfig(static):contains(TEMPLATE, .*app):!host_build:!no_import_scan { - !isEmpty(QTREPOS) { - for (qrep, QTREPOS): \ - exists($$qrep/qml): \ - QMLPATHS += $$qrep/qml - } else { - QMLPATHS += $$[QT_INSTALL_QML/get] - } + exists($$[QT_INSTALL_QML/get]): \ + QMLPATHS *= $$[QT_INSTALL_QML/get] # run qmlimportscanner qtPrepareTool(QMLIMPORTSCANNER, qmlimportscanner, , system) diff --git a/mkspecs/features/qt_app.prf b/mkspecs/features/qt_app.prf index 87e32d6d42..cb84ae0da8 100644 --- a/mkspecs/features/qt_app.prf +++ b/mkspecs/features/qt_app.prf @@ -37,6 +37,8 @@ INSTALLS += target load(qt_targets) load(qt_common) +qtSetQmlPath() + no_launch_target: return() load(resolve_target) diff --git a/mkspecs/features/qt_build_config.prf b/mkspecs/features/qt_build_config.prf index 95e63ecae0..3762c14f98 100644 --- a/mkspecs/features/qt_build_config.prf +++ b/mkspecs/features/qt_build_config.prf @@ -52,6 +52,22 @@ QMAKE_DIR_REPLACE_SANE = PRECOMPILED_DIR OBJECTS_DIR MOC_DIR RCC_DIR UI_DIR unset(modpath) } +defineTest(qtSetQmlPath) { + !qtConfig(static)|host_build|no_import_scan: \ + return() + deps = $$replace(QT, -private$, _private) + deps = $$resolve_depends(deps, "QT.") + !contains(deps, qml): \ + return() + + isEmpty(QTREPOS): \ + QTREPOS = $$shadowed($$dirname(_QMAKE_CONF_)) + for (qrep, QTREPOS): \ + exists($$qrep/qml): \ + QMLPATHS += $$qrep/qml + export(QMLPATHS) +} + # Apply extra compiler flags passed via configure last. CONFIG = qt_build_extra $$CONFIG diff --git a/mkspecs/features/qt_example_installs.prf b/mkspecs/features/qt_example_installs.prf index 4c68cfd72f..0a008374e5 100644 --- a/mkspecs/features/qt_example_installs.prf +++ b/mkspecs/features/qt_example_installs.prf @@ -9,6 +9,9 @@ # We mean it. # +contains(TEMPLATE, .*app): \ + qtSetQmlPath() + contains(TEMPLATE, "vc.*"): return() defineTest(addInstallFiles) { From 011aeb131ed904d948b69d6444ff58cdbfd4990c Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Wed, 23 Nov 2016 02:02:53 +0300 Subject: [PATCH 096/174] Examples: Remove a redundant virtual specifier for overriders It's a good practice to use override without virtual: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rh-override Change-Id: I5c2d73600e6c706424589c0487133c03a4ef3629 Reviewed-by: Friedemann Kleint --- .../widgets/animation/appchooser/main.cpp | 6 ++-- .../widgets/animation/moveblocks/main.cpp | 10 +++--- examples/widgets/animation/states/main.cpp | 2 +- .../widgets/animation/stickman/graphicsview.h | 2 +- .../widgets/animation/stickman/lifecycle.cpp | 4 +-- .../widgets/animation/stickman/rectbutton.h | 6 ++-- .../widgets/animation/stickman/stickman.h | 4 +-- examples/widgets/animation/sub-attaq/boat.h | 2 +- examples/widgets/animation/sub-attaq/boat_p.h | 6 ++-- examples/widgets/animation/sub-attaq/states.h | 6 ++-- .../widgets/animation/sub-attaq/submarine.h | 2 +- .../widgets/graphicsview/boxes/glbuffers.h | 12 +++---- examples/widgets/graphicsview/boxes/qtbox.h | 32 +++++++++---------- examples/widgets/graphicsview/boxes/scene.h | 22 ++++++------- .../graphicsview/dragdroprobot/main.cpp | 2 +- .../graphicsview/weatheranchorlayout/main.cpp | 2 +- .../frozencolumn/freezetablewidget.h | 4 +-- examples/widgets/richtext/textedit/textedit.h | 2 +- .../widgets/statemachine/factorial/main.cpp | 8 ++--- .../widgets/statemachine/pingpong/main.cpp | 6 ++-- .../statemachine/trafficlight/main.cpp | 2 +- 21 files changed, 71 insertions(+), 71 deletions(-) diff --git a/examples/widgets/animation/appchooser/main.cpp b/examples/widgets/animation/appchooser/main.cpp index c9821450c9..71c869f6a2 100644 --- a/examples/widgets/animation/appchooser/main.cpp +++ b/examples/widgets/animation/appchooser/main.cpp @@ -67,12 +67,12 @@ public: painter->drawPixmap(QPointF(), p); } - virtual void mousePressEvent(QGraphicsSceneMouseEvent *) override + void mousePressEvent(QGraphicsSceneMouseEvent *) override { emit clicked(); } - virtual void setGeometry(const QRectF &rect) override + void setGeometry(const QRectF &rect) override { QGraphicsWidget::setGeometry(rect); @@ -98,7 +98,7 @@ public: { } - virtual void resizeEvent(QResizeEvent *) override + void resizeEvent(QResizeEvent *) override { fitInView(sceneRect(), Qt::KeepAspectRatio); } diff --git a/examples/widgets/animation/moveblocks/main.cpp b/examples/widgets/animation/moveblocks/main.cpp index f85211ef88..a9b95808a5 100644 --- a/examples/widgets/animation/moveblocks/main.cpp +++ b/examples/widgets/animation/moveblocks/main.cpp @@ -98,14 +98,14 @@ public: protected: //![14] - virtual bool eventTest(QEvent *event) override + bool eventTest(QEvent *event) override { return (event->type() == QEvent::Type(StateSwitchEvent::StateSwitchType)) && (static_cast(event)->rand() == m_rand); } //![14] - virtual void onTransition(QEvent *) override {} + void onTransition(QEvent *) override {} private: int m_rand; @@ -122,7 +122,7 @@ public: //![10] //![11] - virtual void onEntry(QEvent *) override + void onEntry(QEvent *) override { int n; while ((n = (qrand() % m_stateCount + 1)) == m_lastIndex) @@ -130,7 +130,7 @@ public: m_lastIndex = n; machine()->postEvent(new StateSwitchEvent(n)); } - virtual void onExit(QEvent *) override {} + void onExit(QEvent *) override {} //![11] //![12] @@ -174,7 +174,7 @@ public: } protected: - virtual void resizeEvent(QResizeEvent *event) override + void resizeEvent(QResizeEvent *event) override { fitInView(scene()->sceneRect()); QGraphicsView::resizeEvent(event); diff --git a/examples/widgets/animation/states/main.cpp b/examples/widgets/animation/states/main.cpp index a3c7256933..14d193c301 100644 --- a/examples/widgets/animation/states/main.cpp +++ b/examples/widgets/animation/states/main.cpp @@ -79,7 +79,7 @@ public: { } - virtual void resizeEvent(QResizeEvent *) override + void resizeEvent(QResizeEvent *) override { fitInView(sceneRect(), Qt::KeepAspectRatio); } diff --git a/examples/widgets/animation/stickman/graphicsview.h b/examples/widgets/animation/stickman/graphicsview.h index 4b9b8fc028..56396bb780 100644 --- a/examples/widgets/animation/stickman/graphicsview.h +++ b/examples/widgets/animation/stickman/graphicsview.h @@ -61,7 +61,7 @@ public: GraphicsView(QWidget *parent = 0); protected: - virtual void resizeEvent(QResizeEvent *event) override; + void resizeEvent(QResizeEvent *event) override; void keyPressEvent(QKeyEvent *) override; signals: diff --git a/examples/widgets/animation/stickman/lifecycle.cpp b/examples/widgets/animation/stickman/lifecycle.cpp index 0ece4f3932..253af22b2d 100644 --- a/examples/widgets/animation/stickman/lifecycle.cpp +++ b/examples/widgets/animation/stickman/lifecycle.cpp @@ -70,7 +70,7 @@ public: setTargetState(target); } - virtual bool eventTest(QEvent *e) override + bool eventTest(QEvent *e) override { if (QSignalTransition::eventTest(e)) { QVariant key = static_cast(e)->arguments().at(0); @@ -95,7 +95,7 @@ public: startTimer(1000); } - virtual bool eventTest(QEvent *e) override + bool eventTest(QEvent *e) override { return QEventTransition::eventTest(e) && ((qrand() % 50) == 0); } diff --git a/examples/widgets/animation/stickman/rectbutton.h b/examples/widgets/animation/stickman/rectbutton.h index 864a2c179e..ab47bad0f7 100644 --- a/examples/widgets/animation/stickman/rectbutton.h +++ b/examples/widgets/animation/stickman/rectbutton.h @@ -60,13 +60,13 @@ public: RectButton(QString buttonText); ~RectButton(); - virtual QRectF boundingRect() const override; - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QRectF boundingRect() const override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; protected: QString m_ButtonText; - virtual void mousePressEvent (QGraphicsSceneMouseEvent *event) override; + void mousePressEvent (QGraphicsSceneMouseEvent *event) override; signals: void clicked(); diff --git a/examples/widgets/animation/stickman/stickman.h b/examples/widgets/animation/stickman/stickman.h index b5fbd14872..f2311a0358 100644 --- a/examples/widgets/animation/stickman/stickman.h +++ b/examples/widgets/animation/stickman/stickman.h @@ -69,8 +69,8 @@ public: StickMan(); ~StickMan(); - virtual QRectF boundingRect() const override; - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QRectF boundingRect() const override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; int nodeCount() const; Node *node(int idx) const; diff --git a/examples/widgets/animation/sub-attaq/boat.h b/examples/widgets/animation/sub-attaq/boat.h index 24b004a108..a75e2b1474 100644 --- a/examples/widgets/animation/sub-attaq/boat.h +++ b/examples/widgets/animation/sub-attaq/boat.h @@ -86,7 +86,7 @@ public: void updateBoatMovement(); - virtual int type() const override; + int type() const override; signals: void boatDestroyed(); diff --git a/examples/widgets/animation/sub-attaq/boat_p.h b/examples/widgets/animation/sub-attaq/boat_p.h index 5cad6bde96..de11ff9555 100644 --- a/examples/widgets/animation/sub-attaq/boat_p.h +++ b/examples/widgets/animation/sub-attaq/boat_p.h @@ -81,7 +81,7 @@ public: { } protected: - virtual bool eventTest(QEvent *event) override + bool eventTest(QEvent *event) override { if (!QKeyEventTransition::eventTest(event)) return false; @@ -100,7 +100,7 @@ public: { } protected: - virtual bool eventTest(QEvent *event) override + bool eventTest(QEvent *event) override { if (!QKeyEventTransition::eventTest(event)) return false; @@ -131,7 +131,7 @@ public: { } protected: - virtual bool eventTest(QEvent *event) override + bool eventTest(QEvent *event) override { if (!QKeyEventTransition::eventTest(event)) return false; diff --git a/examples/widgets/animation/sub-attaq/states.h b/examples/widgets/animation/sub-attaq/states.h index 1d50abbf02..cd68e319c2 100644 --- a/examples/widgets/animation/sub-attaq/states.h +++ b/examples/widgets/animation/sub-attaq/states.h @@ -152,7 +152,7 @@ class UpdateScoreTransition : public QSignalTransition public: UpdateScoreTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target); protected: - virtual bool eventTest(QEvent *event) override; + bool eventTest(QEvent *event) override; private: PlayState * game; GraphicsScene *scene; @@ -164,7 +164,7 @@ class WinTransition : public QSignalTransition public: WinTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target); protected: - virtual bool eventTest(QEvent *event) override; + bool eventTest(QEvent *event) override; private: PlayState * game; GraphicsScene *scene; @@ -176,7 +176,7 @@ private: public: CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key); protected: - virtual bool eventTest(QEvent *event) override; + bool eventTest(QEvent *event) override; private: PlayState *game; }; diff --git a/examples/widgets/animation/sub-attaq/submarine.h b/examples/widgets/animation/sub-attaq/submarine.h index abfdca6195..d145c9cbee 100644 --- a/examples/widgets/animation/sub-attaq/submarine.h +++ b/examples/widgets/animation/sub-attaq/submarine.h @@ -81,7 +81,7 @@ public: void launchTorpedo(int speed); void destroy(); - virtual int type() const override; + int type() const override; QGraphicsRotation *rotation() const { return graphicsRotation; } diff --git a/examples/widgets/graphicsview/boxes/glbuffers.h b/examples/widgets/graphicsview/boxes/glbuffers.h index 0c2ff43c7e..0b80c8c4ae 100644 --- a/examples/widgets/graphicsview/boxes/glbuffers.h +++ b/examples/widgets/graphicsview/boxes/glbuffers.h @@ -110,8 +110,8 @@ public: GLTexture2D(int width, int height); explicit GLTexture2D(const QString& fileName, int width = 0, int height = 0); void load(int width, int height, QRgb *data); - virtual void bind() override; - virtual void unbind() override; + void bind() override; + void unbind() override; }; class GLTexture3D : public GLTexture @@ -121,8 +121,8 @@ public: // TODO: Implement function below //GLTexture3D(const QString& fileName, int width = 0, int height = 0); void load(int width, int height, int depth, QRgb *data); - virtual void bind() override; - virtual void unbind() override; + void bind() override; + void unbind() override; }; class GLTextureCube : public GLTexture @@ -131,8 +131,8 @@ public: GLTextureCube(int size); explicit GLTextureCube(const QStringList& fileNames, int size = 0); void load(int size, int face, QRgb *data); - virtual void bind() override; - virtual void unbind() override; + void bind() override; + void unbind() override; }; // TODO: Define and implement class below diff --git a/examples/widgets/graphicsview/boxes/qtbox.h b/examples/widgets/graphicsview/boxes/qtbox.h index e283dccfb4..f8ee9bdb0a 100644 --- a/examples/widgets/graphicsview/boxes/qtbox.h +++ b/examples/widgets/graphicsview/boxes/qtbox.h @@ -63,18 +63,18 @@ public: ItemBase(int size, int x, int y); virtual ~ItemBase(); - virtual QRectF boundingRect() const override; - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QRectF boundingRect() const override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; protected: virtual ItemBase *createNew(int size, int x, int y) = 0; - virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; - virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - virtual void keyPressEvent(QKeyEvent *event) override; - virtual void wheelEvent(QGraphicsSceneWheelEvent *event) override; - virtual int type() const override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; + void mousePressEvent(QGraphicsSceneMouseEvent *event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + void wheelEvent(QGraphicsSceneWheelEvent *event) override; + int type() const override; bool isInResizeArea(const QPointF &pos); static void duplicateSelectedItems(QGraphicsScene *scene); @@ -92,9 +92,9 @@ class QtBox : public ItemBase public: QtBox(int size, int x, int y); virtual ~QtBox(); - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; protected: - virtual ItemBase *createNew(int size, int x, int y) override; + ItemBase *createNew(int size, int x, int y) override; private: QVector3D m_vertices[8]; QVector3D m_texCoords[4]; @@ -106,9 +106,9 @@ class CircleItem : public ItemBase { public: CircleItem(int size, int x, int y); - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; protected: - virtual ItemBase *createNew(int size, int x, int y) override; + ItemBase *createNew(int size, int x, int y) override; QColor m_color; }; @@ -117,9 +117,9 @@ class SquareItem : public ItemBase { public: SquareItem(int size, int x, int y); - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; protected: - virtual ItemBase *createNew(int size, int x, int y) override; + ItemBase *createNew(int size, int x, int y) override; QPixmap m_image; }; diff --git a/examples/widgets/graphicsview/boxes/scene.h b/examples/widgets/graphicsview/boxes/scene.h index b76fb1057c..3f367a8dce 100644 --- a/examples/widgets/graphicsview/boxes/scene.h +++ b/examples/widgets/graphicsview/boxes/scene.h @@ -87,7 +87,7 @@ public slots: signals: void colorChanged(QRgb color, int id); protected: - virtual void mousePressEvent(QMouseEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; void setColor(QRgb color); // also emits colorChanged() private: QGraphicsScene *m_dialogParentScene; @@ -120,9 +120,9 @@ class GraphicsWidget : public QGraphicsProxyWidget public: GraphicsWidget() : QGraphicsProxyWidget(0, Qt::Window) {} protected: - virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - virtual void resizeEvent(QGraphicsSceneResizeEvent *event) override; - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; + void resizeEvent(QGraphicsSceneResizeEvent *event) override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; }; class TwoSidedGraphicsWidget : public QObject @@ -162,7 +162,7 @@ signals: void shaderChanged(int); void doubleClicked(); protected: - virtual void mouseDoubleClickEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; QVector m_parameterNames; QComboBox *m_textureCombo; @@ -189,7 +189,7 @@ signals: void doubleClicked(); void newItemTriggered(ItemDialog::ItemType type); protected: - virtual void mouseDoubleClickEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; }; class Scene : public QGraphicsScene @@ -198,7 +198,7 @@ class Scene : public QGraphicsScene public: Scene(int width, int height, int maxTextureSize); ~Scene(); - virtual void drawBackground(QPainter *painter, const QRectF &rect) override; + void drawBackground(QPainter *painter, const QRectF &rect) override; public slots: void setShader(int index); @@ -214,10 +214,10 @@ protected: void defaultStates(); void renderCubemaps(); - virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - virtual void wheelEvent(QGraphicsSceneWheelEvent * event) override; + void mousePressEvent(QGraphicsSceneMouseEvent *event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + void wheelEvent(QGraphicsSceneWheelEvent * event) override; private: void initGL(); QPointF pixelPosToViewPos(const QPointF& p); diff --git a/examples/widgets/graphicsview/dragdroprobot/main.cpp b/examples/widgets/graphicsview/dragdroprobot/main.cpp index ff3758ac60..20cec92d26 100644 --- a/examples/widgets/graphicsview/dragdroprobot/main.cpp +++ b/examples/widgets/graphicsview/dragdroprobot/main.cpp @@ -63,7 +63,7 @@ public: } protected: - virtual void resizeEvent(QResizeEvent *) override + void resizeEvent(QResizeEvent *) override { } }; diff --git a/examples/widgets/graphicsview/weatheranchorlayout/main.cpp b/examples/widgets/graphicsview/weatheranchorlayout/main.cpp index ec1f73bf9c..81db2780b4 100644 --- a/examples/widgets/graphicsview/weatheranchorlayout/main.cpp +++ b/examples/widgets/graphicsview/weatheranchorlayout/main.cpp @@ -69,7 +69,7 @@ public: { } - virtual void resizeEvent(QResizeEvent *event) override + void resizeEvent(QResizeEvent *event) override { w->setGeometry(0, 0, event->size().width(), event->size().height()); } diff --git a/examples/widgets/itemviews/frozencolumn/freezetablewidget.h b/examples/widgets/itemviews/frozencolumn/freezetablewidget.h index 51c46fb7e7..69a90dab54 100644 --- a/examples/widgets/itemviews/frozencolumn/freezetablewidget.h +++ b/examples/widgets/itemviews/frozencolumn/freezetablewidget.h @@ -63,8 +63,8 @@ public: protected: - virtual void resizeEvent(QResizeEvent *event) override; - virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; + void resizeEvent(QResizeEvent *event) override; + QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible) override; private: diff --git a/examples/widgets/richtext/textedit/textedit.h b/examples/widgets/richtext/textedit/textedit.h index e5f04e706c..ae0b13a4cc 100644 --- a/examples/widgets/richtext/textedit/textedit.h +++ b/examples/widgets/richtext/textedit/textedit.h @@ -78,7 +78,7 @@ public slots: void fileNew(); protected: - virtual void closeEvent(QCloseEvent *e) override; + void closeEvent(QCloseEvent *e) override; private slots: void fileOpen(); diff --git a/examples/widgets/statemachine/factorial/main.cpp b/examples/widgets/statemachine/factorial/main.cpp index d0d61cb7df..919988051f 100644 --- a/examples/widgets/statemachine/factorial/main.cpp +++ b/examples/widgets/statemachine/factorial/main.cpp @@ -103,7 +103,7 @@ public: : QSignalTransition(fact, SIGNAL(xChanged(int))), m_fact(fact) {} - virtual bool eventTest(QEvent *e) override + bool eventTest(QEvent *e) override { if (!QSignalTransition::eventTest(e)) return false; @@ -111,7 +111,7 @@ public: return se->arguments().at(0).toInt() > 1; } - virtual void onTransition(QEvent *e) override + void onTransition(QEvent *e) override { QStateMachine::SignalEvent *se = static_cast(e); int x = se->arguments().at(0).toInt(); @@ -133,7 +133,7 @@ public: : QSignalTransition(fact, SIGNAL(xChanged(int))), m_fact(fact) {} - virtual bool eventTest(QEvent *e) override + bool eventTest(QEvent *e) override { if (!QSignalTransition::eventTest(e)) return false; @@ -141,7 +141,7 @@ public: return se->arguments().at(0).toInt() <= 1; } - virtual void onTransition(QEvent *) override + void onTransition(QEvent *) override { fprintf(stdout, "%d\n", m_fact->property("fac").toInt()); } diff --git a/examples/widgets/statemachine/pingpong/main.cpp b/examples/widgets/statemachine/pingpong/main.cpp index 8c3b9f674b..354f1d245b 100644 --- a/examples/widgets/statemachine/pingpong/main.cpp +++ b/examples/widgets/statemachine/pingpong/main.cpp @@ -75,7 +75,7 @@ public: : QState(parent) {} protected: - virtual void onEntry(QEvent *) override + void onEntry(QEvent *) override { machine()->postEvent(new PingEvent()); fprintf(stdout, "ping?\n"); @@ -93,7 +93,7 @@ protected: virtual bool eventTest(QEvent *e) override { return (e->type() == QEvent::User+3); } - virtual void onTransition(QEvent *) override + void onTransition(QEvent *) override { machine()->postDelayedEvent(new PingEvent(), 500); fprintf(stdout, "ping?\n"); @@ -111,7 +111,7 @@ protected: virtual bool eventTest(QEvent *e) override { return (e->type() == QEvent::User+2); } - virtual void onTransition(QEvent *) override + void onTransition(QEvent *) override { machine()->postDelayedEvent(new PongEvent(), 500); fprintf(stdout, "pong!\n"); diff --git a/examples/widgets/statemachine/trafficlight/main.cpp b/examples/widgets/statemachine/trafficlight/main.cpp index 143f2a9324..21df91d8b0 100644 --- a/examples/widgets/statemachine/trafficlight/main.cpp +++ b/examples/widgets/statemachine/trafficlight/main.cpp @@ -74,7 +74,7 @@ public slots: void turnOn() { setOn(true); } protected: - virtual void paintEvent(QPaintEvent *) override + void paintEvent(QPaintEvent *) override { if (!m_on) return; From 40c9e9dc5f31a4063a71e90208b5bf976977b054 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 23 Nov 2016 15:39:57 -0800 Subject: [PATCH 097/174] Add a macros for disabling deprecated declaration warnings This is the only warning we disable in a lot of places in Qt 5.8 source code. If other warnings become common, we can add macros for them too. Change-Id: Iaeecaffe26af4535b416fffd1489d1968e29c52a Reviewed-by: Oswald Buddenhagen Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/global/qcompilerdetection.h | 6 ++++++ src/corelib/tools/qalgorithms.h | 3 +-- src/gui/image/qimage.h | 3 +-- src/testlib/qxctestlogger.mm | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index d1d5373146..d978c141a4 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -1273,6 +1273,7 @@ # define QT_WARNING_DISABLE_INTEL(number) __pragma(warning(disable: number)) # define QT_WARNING_DISABLE_CLANG(text) # define QT_WARNING_DISABLE_GCC(text) +# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1786) #elif defined(Q_CC_INTEL) /* icc: Intel compiler on Linux or OS X */ # define QT_WARNING_PUSH QT_DO_PRAGMA(warning(push)) @@ -1281,6 +1282,7 @@ # define QT_WARNING_DISABLE_MSVC(number) # define QT_WARNING_DISABLE_CLANG(text) # define QT_WARNING_DISABLE_GCC(text) +# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1786) #elif defined(Q_CC_MSVC) && _MSC_VER >= 1500 && !defined(Q_CC_CLANG) # undef QT_DO_PRAGMA /* not needed */ # define QT_WARNING_PUSH __pragma(warning(push)) @@ -1289,6 +1291,7 @@ # define QT_WARNING_DISABLE_INTEL(number) # define QT_WARNING_DISABLE_CLANG(text) # define QT_WARNING_DISABLE_GCC(text) +# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_MSVC(4996) #elif defined(Q_CC_CLANG) # define QT_WARNING_PUSH QT_DO_PRAGMA(clang diagnostic push) # define QT_WARNING_POP QT_DO_PRAGMA(clang diagnostic pop) @@ -1296,6 +1299,7 @@ # define QT_WARNING_DISABLE_GCC(text) # define QT_WARNING_DISABLE_INTEL(number) # define QT_WARNING_DISABLE_MSVC(number) +# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_CLANG("-Wdeprecated-declarations") #elif defined(Q_CC_GNU) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) # define QT_WARNING_PUSH QT_DO_PRAGMA(GCC diagnostic push) # define QT_WARNING_POP QT_DO_PRAGMA(GCC diagnostic pop) @@ -1303,6 +1307,7 @@ # define QT_WARNING_DISABLE_CLANG(text) # define QT_WARNING_DISABLE_INTEL(number) # define QT_WARNING_DISABLE_MSVC(number) +# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") #else // All other compilers, GCC < 4.6 and MSVC < 2008 # define QT_WARNING_DISABLE_GCC(text) # define QT_WARNING_PUSH @@ -1311,6 +1316,7 @@ # define QT_WARNING_DISABLE_MSVC(number) # define QT_WARNING_DISABLE_CLANG(text) # define QT_WARNING_DISABLE_GCC(text) +# define QT_WARNING_DISABLE_DEPRECATED #endif /* diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h index 38753a6726..303374b06d 100644 --- a/src/corelib/tools/qalgorithms.h +++ b/src/corelib/tools/qalgorithms.h @@ -48,8 +48,7 @@ QT_BEGIN_NAMESPACE QT_WARNING_PUSH -QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") -QT_WARNING_DISABLE_CLANG("-Wdeprecated-declarations") +QT_WARNING_DISABLE_DEPRECATED /* Warning: The contents of QAlgorithmsPrivate is not a part of the public Qt API diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h index 91aaf673d0..fd2298561e 100644 --- a/src/gui/image/qimage.h +++ b/src/gui/image/qimage.h @@ -381,8 +381,7 @@ inline void QImage::setPixelColor(const QPoint &pt, const QColor &c) { setPixelC #if QT_DEPRECATED_SINCE(5, 0) QT_WARNING_PUSH -QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") -QT_WARNING_DISABLE_MSVC(4996) +QT_WARNING_DISABLE_DEPRECATED inline QString QImage::text(const char* key, const char* lang) const { diff --git a/src/testlib/qxctestlogger.mm b/src/testlib/qxctestlogger.mm index ffabe88db2..62fd73070f 100644 --- a/src/testlib/qxctestlogger.mm +++ b/src/testlib/qxctestlogger.mm @@ -66,7 +66,7 @@ QT_WARNING_PUSH // Ignore XCTestProbe deprecation -QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") +QT_WARNING_DISABLE_DEPRECATED // --------------------------------------------------------- From 277208c169e94ebb8eb1a1c9bd46a844f50aa5f9 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 23 Nov 2016 15:41:18 -0800 Subject: [PATCH 098/174] moc: disable deprecated warnings in generated code Code generated by moc very often calls deprecated functions, like deprecated slots, signals and property getters and setters. There's no way around that unless the class in question is willing to break binary compatibility, so those warnings are actually harmless. Change-Id: Iaeecaffe26af4535b416fffd1489d1a98ef8b34a Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/tools/moc/moc.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 3bd87e1f01..89bf2bd6a1 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1002,12 +1002,17 @@ void Moc::generate(FILE *out) fprintf(out, "#endif\n\n"); fprintf(out, "QT_BEGIN_MOC_NAMESPACE\n"); + fprintf(out, "QT_WARNING_PUSH\n"); + fprintf(out, "QT_WARNING_DISABLE_DEPRECATED\n"); + fputs("", out); for (i = 0; i < classList.size(); ++i) { Generator generator(&classList[i], metaTypes, knownQObjectClasses, knownGadgets, out); generator.generateCode(); } + fputs("", out); + fprintf(out, "QT_WARNING_POP\n"); fprintf(out, "QT_END_MOC_NAMESPACE\n"); } From 49cdf51ac97d12749e770d792124b7f06d5fd9ca Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 25 Nov 2016 11:58:12 +0100 Subject: [PATCH 099/174] Fix some warnings in tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ../tst_qfile.cpp: In member function 'void tst_QFile::handle()': ../tst_qfile.cpp:2661:38: warning: ignoring return value of 'ssize_t read(int, void*, size_t)', declared with attribute warn_unused_result [-Wunused-result] tst_qstatictext.cpp:862:58: warning: unused parameter 'textItem' [-Wunused-parameter] ../tst_qtcpsocket.cpp: In member function 'void tst_QTcpSocket::abortiveClose()': ../tst_qtcpsocket.cpp:2254:90: warning: suggest parentheses around assignment used as truth value [-Wparentheses] Test.cpp: In member function 'void My4Socket::read()': Test.cpp:66:20: warning: 'reply' may be used uninitialized in this function [-Wmaybe-uninitialized] ../tst_qlocalsocket.cpp: In lambda function: ../tst_qlocalsocket.cpp:701:51: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] ../tst_qtcpserver.cpp: In member function 'void tst_QTcpServer::linkLocal()': ../tst_qtcpserver.cpp:935:92: warning: suggest parentheses around assignment used as truth value [-Wparentheses] ../tst_qtcpserver.cpp:940:92: warning: suggest parentheses around assignment used as truth value [-Wparentheses] Change-Id: Ic315069768bcb63a6b333c28ac65b0b992b0d43f Reviewed-by: Jędrzej Nowacki --- tests/auto/corelib/io/qfile/tst_qfile.cpp | 3 ++- tests/auto/gui/text/qstatictext/tst_qstatictext.cpp | 2 +- .../auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp | 2 +- tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp | 7 ++++--- tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp | 3 ++- tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp | 3 ++- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp index eeba882c70..287b8aebd8 100644 --- a/tests/auto/corelib/io/qfile/tst_qfile.cpp +++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp @@ -2658,7 +2658,8 @@ void tst_QFile::handle() QVERIFY(fd > 2); QCOMPARE(int(file.handle()), fd); char c = '\0'; - QT_READ(int(file.handle()), &c, 1); + const auto readResult = QT_READ(int(file.handle()), &c, 1); + QCOMPARE(readResult, static_cast(1)); QCOMPARE(c, '/'); // test if the QFile and the handle remain in sync diff --git a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp index b3d1b75a42..9f84f64ee9 100644 --- a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp +++ b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp @@ -859,7 +859,7 @@ void tst_QStaticText::textDocumentColor() class TestPaintEngine: public QPaintEngine { public: - void drawTextItem(const QPointF &p, const QTextItem &textItem) Q_DECL_OVERRIDE + void drawTextItem(const QPointF &p, const QTextItem &) Q_DECL_OVERRIDE { differentVerticalPositions.insert(qRound(p.y())); } diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index 8cc06a77ba..74bffef4f4 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -698,7 +698,7 @@ void tst_QLocalSocket::simpleCommandProtocol2() QObject::connect(localSocketRead, &QLocalSocket::readyRead, [&] { forever { - if (localSocketRead->bytesAvailable() < sizeof(qint64)) + if (localSocketRead->bytesAvailable() < qint64(sizeof(qint64))) return; if (blockSize == 0) { diff --git a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp index 5a0baf73b5..4bbd0662e4 100644 --- a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp +++ b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp @@ -929,15 +929,16 @@ void tst_QTcpServer::linkLocal() //each server should have two connections foreach (QTcpServer* server, servers) { - QTcpSocket* remote; //qDebug() << "checking for connections" << server->serverAddress() << ":" << server->serverPort(); QVERIFY(server->waitForNewConnection(5000)); - QVERIFY(remote = server->nextPendingConnection()); + QTcpSocket* remote = server->nextPendingConnection(); + QVERIFY(remote != nullptr); remote->close(); delete remote; if (!server->hasPendingConnections()) QVERIFY(server->waitForNewConnection(5000)); - QVERIFY(remote = server->nextPendingConnection()); + remote = server->nextPendingConnection(); + QVERIFY(remote != nullptr); remote->close(); delete remote; QVERIFY(!server->hasPendingConnections()); diff --git a/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp b/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp index 407d244f15..ed61db1a13 100644 --- a/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp +++ b/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp @@ -47,7 +47,8 @@ void My4Socket::read(void) { QDataStream in(this); - quint32 num, reply; + quint32 num = 0; + quint32 reply = 0; while (bytesAvailable()) { in >> num; diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp index fb6b0c6e32..fe1057bdde 100644 --- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp +++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp @@ -2251,7 +2251,8 @@ void tst_QTcpSocket::abortiveClose() enterLoop(10); QVERIFY(server.hasPendingConnections()); - QVERIFY(tmpSocket = server.nextPendingConnection()); + tmpSocket = server.nextPendingConnection(); + QVERIFY(tmpSocket != nullptr); qRegisterMetaType("QAbstractSocket::SocketError"); QSignalSpy readyReadSpy(clientSocket, SIGNAL(readyRead())); From 7eb4be9db89d40ea2cc090e7a562bdd588708607 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Sun, 13 Nov 2016 16:19:55 +0300 Subject: [PATCH 100/174] QStringRef: de-duplicate lastIndexOf code Change-Id: Id6d804b2ab4c9c763d7ec9cb66c255ed0b4f785d Reviewed-by: Thiago Macieira --- src/corelib/tools/qstring.cpp | 77 ++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 4262899e02..eef375fe72 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -3260,6 +3260,23 @@ static int lastIndexOfHelper(const ushort *haystack, int from, const ushort *nee return -1; } +static inline int lastIndexOfHelper( + const QStringRef &haystack, int from, const QStringRef &needle, Qt::CaseSensitivity cs) +{ + return lastIndexOfHelper(reinterpret_cast(haystack.unicode()), from, + reinterpret_cast(needle.unicode()), needle.size(), cs); +} + +static inline int lastIndexOfHelper( + const QStringRef &haystack, int from, QLatin1String needle, Qt::CaseSensitivity cs) +{ + const int size = needle.size(); + QVarLengthArray s(size); + qt_from_latin1(s.data(), needle.latin1(), size); + return lastIndexOfHelper(reinterpret_cast(haystack.unicode()), from, + s.data(), size, cs); +} + /*! Returns the index position of the last occurrence of the string \a str in this string, searching backward from index position \a @@ -9816,6 +9833,27 @@ int QStringRef::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const return qt_last_index_of(unicode(), size(), ch, from, cs); } +template +static int last_index_of_impl(const QStringRef &haystack, int from, const T &needle, Qt::CaseSensitivity cs) +{ + const int sl = needle.size(); + if (sl == 1) + return haystack.lastIndexOf(needle.at(0), from, cs); + + const int l = haystack.size(); + if (from < 0) + from += l; + int delta = l - sl; + if (from == l && sl == 0) + return from; + if (uint(from) >= uint(l) || delta < 0) + return -1; + if (from > delta) + from = delta; + + return lastIndexOfHelper(haystack, from, needle, cs); +} + /*! \since 4.8 \overload lastIndexOf() @@ -9833,25 +9871,7 @@ int QStringRef::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const */ int QStringRef::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const { - const int sl = str.size(); - if (sl == 1) - return lastIndexOf(str.at(0), from, cs); - - const int l = size(); - if (from < 0) - from += l; - int delta = l - sl; - if (from == l && sl == 0) - return from; - if (uint(from) >= uint(l) || delta < 0) - return -1; - if (from > delta) - from = delta; - - QVarLengthArray s(sl); - qt_from_latin1(s.data(), str.latin1(), sl); - - return lastIndexOfHelper(reinterpret_cast(unicode()), from, s.data(), sl, cs); + return last_index_of_impl(*this, from, str, cs); } /*! @@ -9871,24 +9891,7 @@ int QStringRef::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) */ int QStringRef::lastIndexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const { - const int sl = str.size(); - if (sl == 1) - return lastIndexOf(str.at(0), from, cs); - - const int l = size(); - if (from < 0) - from += l; - int delta = l - sl; - if (from == l && sl == 0) - return from; - if (uint(from) >= uint(l) || delta < 0) - return -1; - if (from > delta) - from = delta; - - return lastIndexOfHelper(reinterpret_cast(unicode()), from, - reinterpret_cast(str.unicode()), - str.size(), cs); + return last_index_of_impl(*this, from, str, cs); } /*! From a103992f49045323a3aaa4970eb1ee5f65a378dd Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 24 Nov 2016 12:17:55 +0100 Subject: [PATCH 101/174] Fixed build using Visual Studio 2017 As _BitScanForward and friends are not marked constexpr in Visual Studio, functions using these may not be marked either. Task-number: QTBUG-57086 Change-Id: I29cfa4459580b5740f1011e7f39309844518ce03 Reviewed-by: Thiago Macieira Reviewed-by: Erik Verbruggen --- src/corelib/tools/qalgorithms.h | 36 +++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h index 303374b06d..7e846956f5 100644 --- a/src/corelib/tools/qalgorithms.h +++ b/src/corelib/tools/qalgorithms.h @@ -589,15 +589,16 @@ Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NO return __builtin_popcountll(v); } #elif defined(Q_CC_MSVC) && !defined(Q_OS_WINCE) && !defined(Q_PROCESSOR_ARM) +#define QT_POPCOUNT_CONSTEXPR #define QT_HAS_BUILTIN_CTZ -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE unsigned long qt_builtin_ctz(quint32 val) +Q_ALWAYS_INLINE unsigned long qt_builtin_ctz(quint32 val) { unsigned long result; _BitScanForward(&result, val); return result; } #define QT_HAS_BUILTIN_CLZ -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE unsigned long qt_builtin_clz(quint32 val) +Q_ALWAYS_INLINE unsigned long qt_builtin_clz(quint32 val) { unsigned long result; _BitScanReverse(&result, val); @@ -610,7 +611,7 @@ Q_DECL_CONSTEXPR Q_ALWAYS_INLINE unsigned long qt_builtin_clz(quint32 val) #if Q_PROCESSOR_WORDSIZE == 8 // These are only defined for 64bit builds. #define QT_HAS_BUILTIN_CTZLL -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE unsigned long qt_builtin_ctzll(quint64 val) +Q_ALWAYS_INLINE unsigned long qt_builtin_ctzll(quint64 val) { unsigned long result; _BitScanForward64(&result, val); @@ -618,7 +619,7 @@ Q_DECL_CONSTEXPR Q_ALWAYS_INLINE unsigned long qt_builtin_ctzll(quint64 val) } // MSVC calls it _BitScanReverse and returns the carry flag, which we don't need #define QT_HAS_BUILTIN_CLZLL -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE unsigned long qt_builtin_clzll(quint64 val) +Q_ALWAYS_INLINE unsigned long qt_builtin_clzll(quint64 val) { unsigned long result; _BitScanReverse64(&result, val); @@ -628,31 +629,31 @@ Q_DECL_CONSTEXPR Q_ALWAYS_INLINE unsigned long qt_builtin_clzll(quint64 val) } #endif // MSVC 64bit # define QT_HAS_BUILTIN_CTZS -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) Q_DECL_NOTHROW +Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) Q_DECL_NOTHROW { return qt_builtin_ctz(v); } #define QT_HAS_BUILTIN_CLZS -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW +Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW { return qt_builtin_clz(v) - 16U; } #define QALGORITHMS_USE_BUILTIN_POPCOUNT -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) Q_DECL_NOTHROW +Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) Q_DECL_NOTHROW { return __popcnt(v); } -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) Q_DECL_NOTHROW +Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) Q_DECL_NOTHROW { return __popcnt16(v); } -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) Q_DECL_NOTHROW +Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) Q_DECL_NOTHROW { return __popcnt16(v); } #if Q_PROCESSOR_WORDSIZE == 8 #define QALGORITHMS_USE_BUILTIN_POPCOUNTLL -Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW +Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW { return __popcnt64(v); } @@ -660,9 +661,13 @@ Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NO #endif // MSVC #endif // QT_HAS_CONSTEXPR_BUILTINS +#ifndef QT_POPCOUNT_CONSTEXPR +#define QT_POPCOUNT_CONSTEXPR Q_DECL_CONSTEXPR +#endif + } //namespace QAlgorithmsPrivate -Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint32 v) Q_DECL_NOTHROW +Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint32 v) Q_DECL_NOTHROW { #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT return QAlgorithmsPrivate::qt_builtin_popcount(v); @@ -675,7 +680,7 @@ Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint32 v) Q #endif } -Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint8 v) Q_DECL_NOTHROW +Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint8 v) Q_DECL_NOTHROW { #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT return QAlgorithmsPrivate::qt_builtin_popcount(v); @@ -685,7 +690,7 @@ Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint8 v) Q_ #endif } -Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint16 v) Q_DECL_NOTHROW +Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint16 v) Q_DECL_NOTHROW { #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT return QAlgorithmsPrivate::qt_builtin_popcount(v); @@ -696,7 +701,7 @@ Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint16 v) Q #endif } -Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint64 v) Q_DECL_NOTHROW +Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint64 v) Q_DECL_NOTHROW { #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNTLL return QAlgorithmsPrivate::qt_builtin_popcountll(v); @@ -711,7 +716,7 @@ Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(quint64 v) Q #endif } -Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(long unsigned int v) Q_DECL_NOTHROW +Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(long unsigned int v) Q_DECL_NOTHROW { return qPopulationCount(static_cast(v)); } @@ -719,6 +724,7 @@ Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qPopulationCount(long unsigne #if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) #undef QALGORITHMS_USE_BUILTIN_POPCOUNT #endif +#undef QT_POPCOUNT_CONSTEXPR Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint32 v) Q_DECL_NOTHROW { From c050a1bdea993df5634fec9ed05f682cf5a81691 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Sun, 27 Nov 2016 12:45:37 +0300 Subject: [PATCH 102/174] Examples: Remove more redundant virtual specifiers for overriders Change-Id: I3e378c656a2651fb7031b6cf6a6939dfc5576519 Reviewed-by: Friedemann Kleint --- examples/widgets/graphicsview/boxes/glbuffers.h | 2 +- examples/widgets/graphicsview/boxes/scene.h | 4 ++-- examples/widgets/statemachine/pingpong/main.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/widgets/graphicsview/boxes/glbuffers.h b/examples/widgets/graphicsview/boxes/glbuffers.h index 0b80c8c4ae..03c24a91d3 100644 --- a/examples/widgets/graphicsview/boxes/glbuffers.h +++ b/examples/widgets/graphicsview/boxes/glbuffers.h @@ -146,7 +146,7 @@ public: void begin(int face); // end rendering void end(); - virtual bool failed() const override {return m_failed || m_fbo.failed();} + bool failed() const override { return m_failed || m_fbo.failed(); } static void getViewMatrix(QMatrix4x4& mat, int face); static void getProjectionMatrix(QMatrix4x4& mat, float nearZ, float farZ); diff --git a/examples/widgets/graphicsview/boxes/scene.h b/examples/widgets/graphicsview/boxes/scene.h index 3f367a8dce..a2ba1d0b5a 100644 --- a/examples/widgets/graphicsview/boxes/scene.h +++ b/examples/widgets/graphicsview/boxes/scene.h @@ -81,7 +81,7 @@ class ColorEdit : public ParameterEdit public: ColorEdit(QRgb initialColor, int id); QRgb color() const {return m_color;} - virtual void emitChange() override { emit colorChanged(m_color, m_id); } + void emitChange() override { emit colorChanged(m_color, m_id); } public slots: void editDone(); signals: @@ -103,7 +103,7 @@ class FloatEdit : public ParameterEdit public: FloatEdit(float initialValue, int id); float value() const {return m_value;} - virtual void emitChange() override { emit valueChanged(m_value, m_id); } + void emitChange() override { emit valueChanged(m_value, m_id); } public slots: void editDone(); signals: diff --git a/examples/widgets/statemachine/pingpong/main.cpp b/examples/widgets/statemachine/pingpong/main.cpp index 354f1d245b..c09060c502 100644 --- a/examples/widgets/statemachine/pingpong/main.cpp +++ b/examples/widgets/statemachine/pingpong/main.cpp @@ -90,7 +90,7 @@ public: PongTransition() {} protected: - virtual bool eventTest(QEvent *e) override { + bool eventTest(QEvent *e) override { return (e->type() == QEvent::User+3); } void onTransition(QEvent *) override @@ -108,7 +108,7 @@ public: PingTransition() {} protected: - virtual bool eventTest(QEvent *e) override { + bool eventTest(QEvent *e) override { return (e->type() == QEvent::User+2); } void onTransition(QEvent *) override From 7adbdddbb6b6977e8b86ea0bf6262721d0c6ef6e Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Thu, 24 Nov 2016 02:28:39 +0300 Subject: [PATCH 103/174] QtWidgets: Add missing override Change-Id: I991659db5510acbbb44d0f5987edc213acf62a74 Reviewed-by: Marc Mutz --- src/widgets/dialogs/qdialog.h | 18 ++--- .../graphicsview/qgraphicsproxywidget_p.h | 2 +- src/widgets/itemviews/qabstractitemview_p.h | 14 ++-- src/widgets/itemviews/qheaderview_p.h | 2 +- src/widgets/itemviews/qitemeditorfactory.h | 4 +- src/widgets/itemviews/qlistview_p.h | 70 +++++++++---------- src/widgets/itemviews/qlistwidget_p.h | 26 +++---- src/widgets/itemviews/qtablewidget_p.h | 38 +++++----- src/widgets/itemviews/qtreeview_p.h | 14 ++-- src/widgets/kernel/qlayoutitem.h | 46 ++++++------ src/widgets/util/qflickgesture_p.h | 6 +- src/widgets/widgets/qabstractspinbox.h | 40 +++++------ src/widgets/widgets/qabstractspinbox_p.h | 4 +- src/widgets/widgets/qcombobox_p.h | 46 ++++++------ src/widgets/widgets/qdatetimeedit.h | 26 +++---- src/widgets/widgets/qdatetimeedit_p.h | 8 +-- src/widgets/widgets/qmacnativewidget_mac.h | 4 +- src/widgets/widgets/qmdisubwindow_p.h | 2 +- src/widgets/widgets/qmenubar.h | 36 +++++----- src/widgets/widgets/qspinbox.h | 10 +-- 20 files changed, 208 insertions(+), 208 deletions(-) diff --git a/src/widgets/dialogs/qdialog.h b/src/widgets/dialogs/qdialog.h index 265790b0e5..d88ff4a841 100644 --- a/src/widgets/dialogs/qdialog.h +++ b/src/widgets/dialogs/qdialog.h @@ -65,7 +65,7 @@ public: int result() const; - void setVisible(bool visible); + void setVisible(bool visible) override; void setOrientation(Qt::Orientation orientation); Qt::Orientation orientation() const; @@ -73,8 +73,8 @@ public: void setExtension(QWidget* extension); QWidget* extension() const; - QSize sizeHint() const; - QSize minimumSizeHint() const; + QSize sizeHint() const override; + QSize minimumSizeHint() const override; void setSizeGripEnabled(bool); bool isSizeGripEnabled() const; @@ -99,14 +99,14 @@ public Q_SLOTS: protected: QDialog(QDialogPrivate &, QWidget *parent, Qt::WindowFlags f = Qt::WindowFlags()); - void keyPressEvent(QKeyEvent *); - void closeEvent(QCloseEvent *); - void showEvent(QShowEvent *); - void resizeEvent(QResizeEvent *); + void keyPressEvent(QKeyEvent *) override; + void closeEvent(QCloseEvent *) override; + void showEvent(QShowEvent *) override; + void resizeEvent(QResizeEvent *) override; #ifndef QT_NO_CONTEXTMENU - void contextMenuEvent(QContextMenuEvent *); + void contextMenuEvent(QContextMenuEvent *) override; #endif - bool eventFilter(QObject *, QEvent *); + bool eventFilter(QObject *, QEvent *) override; void adjustPosition(QWidget*); private: Q_DECLARE_PRIVATE(QDialog) diff --git a/src/widgets/graphicsview/qgraphicsproxywidget_p.h b/src/widgets/graphicsview/qgraphicsproxywidget_p.h index 0797ba7066..4624772993 100644 --- a/src/widgets/graphicsview/qgraphicsproxywidget_p.h +++ b/src/widgets/graphicsview/qgraphicsproxywidget_p.h @@ -80,7 +80,7 @@ public: void embedSubWindow(QWidget *); void unembedSubWindow(QWidget *); - bool isProxyWidget() const; + bool isProxyWidget() const override; QPointer widget; QPointer lastWidgetUnderMouse; diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h index f8ada6df08..d21ae573cd 100644 --- a/src/widgets/itemviews/qabstractitemview_p.h +++ b/src/widgets/itemviews/qabstractitemview_p.h @@ -93,12 +93,12 @@ class QEmptyModel : public QAbstractItemModel { public: explicit QEmptyModel(QObject *parent = 0) : QAbstractItemModel(parent) {} - QModelIndex index(int, int, const QModelIndex &) const { return QModelIndex(); } - QModelIndex parent(const QModelIndex &) const { return QModelIndex(); } - int rowCount(const QModelIndex &) const { return 0; } - int columnCount(const QModelIndex &) const { return 0; } - bool hasChildren(const QModelIndex &) const { return false; } - QVariant data(const QModelIndex &, int) const { return QVariant(); } + QModelIndex index(int, int, const QModelIndex &) const override { return QModelIndex(); } + QModelIndex parent(const QModelIndex &) const override { return QModelIndex(); } + int rowCount(const QModelIndex &) const override { return 0; } + int columnCount(const QModelIndex &) const override { return 0; } + bool hasChildren(const QModelIndex &) const override { return false; } + QVariant data(const QModelIndex &, int) const override { return QVariant(); } }; class Q_AUTOTEST_EXPORT QAbstractItemViewPrivate : public QAbstractScrollAreaPrivate @@ -323,7 +323,7 @@ public: } // reimplemented from QAbstractScrollAreaPrivate - virtual QPoint contentsOffset() const { + QPoint contentsOffset() const override { Q_Q(const QAbstractItemView); return QPoint(q->horizontalOffset(), q->verticalOffset()); } diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h index 0356d79ff7..6affe7af95 100644 --- a/src/widgets/itemviews/qheaderview_p.h +++ b/src/widgets/itemviews/qheaderview_p.h @@ -117,7 +117,7 @@ public: void resizeSections(QHeaderView::ResizeMode globalMode, bool useGlobalMode = false); void _q_sectionsRemoved(const QModelIndex &,int,int); void _q_layoutAboutToBeChanged(); - void _q_layoutChanged(); + void _q_layoutChanged() override; bool isSectionSelected(int section) const; bool isFirstVisibleSection(int section) const; diff --git a/src/widgets/itemviews/qitemeditorfactory.h b/src/widgets/itemviews/qitemeditorfactory.h index 785d4d84ea..dea9bce794 100644 --- a/src/widgets/itemviews/qitemeditorfactory.h +++ b/src/widgets/itemviews/qitemeditorfactory.h @@ -81,8 +81,8 @@ public: inline QStandardItemEditorCreator() : propertyName(T::staticMetaObject.userProperty().name()) {} - inline QWidget *createWidget(QWidget *parent) const { return new T(parent); } - inline QByteArray valuePropertyName() const { return propertyName; } + inline QWidget *createWidget(QWidget *parent) const override { return new T(parent); } + inline QByteArray valuePropertyName() const override { return propertyName; } private: QByteArray propertyName; diff --git a/src/widgets/itemviews/qlistview_p.h b/src/widgets/itemviews/qlistview_p.h index 42cb6b4eef..07cbd4036c 100644 --- a/src/widgets/itemviews/qlistview_p.h +++ b/src/widgets/itemviews/qlistview_p.h @@ -209,24 +209,24 @@ public: int batchSavedPosition; //reimplementations - int itemIndex(const QListViewItem &item) const { return item.indexHint; } - QListViewItem indexToListViewItem(const QModelIndex &index) const; - bool doBatchedItemLayout(const QListViewLayoutInfo &info, int max); - void clear(); - void setRowCount(int rowCount) { flowPositions.resize(rowCount); } - QVector intersectingSet(const QRect &area) const; - void dataChanged(const QModelIndex &, const QModelIndex &); + int itemIndex(const QListViewItem &item) const override { return item.indexHint; } + QListViewItem indexToListViewItem(const QModelIndex &index) const override; + bool doBatchedItemLayout(const QListViewLayoutInfo &info, int max) override; + void clear() override; + void setRowCount(int rowCount) override { flowPositions.resize(rowCount); } + QVector intersectingSet(const QRect &area) const override; + void dataChanged(const QModelIndex &, const QModelIndex &) override; int horizontalScrollToValue(int index, QListView::ScrollHint hint, - bool leftOf, bool rightOf,const QRect &area, const QRect &rect) const; + bool leftOf, bool rightOf,const QRect &area, const QRect &rect) const override; int verticalScrollToValue(int index, QListView::ScrollHint hint, - bool above, bool below, const QRect &area, const QRect &rect) const; - void scrollContentsBy(int dx, int dy, bool scrollElasticBand); - QRect mapToViewport(const QRect &rect) const; - int horizontalOffset() const; - int verticalOffset() const; - void updateHorizontalScrollBar(const QSize &step); - void updateVerticalScrollBar(const QSize &step); + bool above, bool below, const QRect &area, const QRect &rect) const override; + void scrollContentsBy(int dx, int dy, bool scrollElasticBand) override; + QRect mapToViewport(const QRect &rect) const override; + int horizontalOffset() const override; + int verticalOffset() const override; + void updateHorizontalScrollBar(const QSize &step) override; + void updateVerticalScrollBar(const QSize &step) override; #ifndef QT_NO_DRAGANDDROP // The next two methods are to be used on LefToRight flow only. @@ -261,24 +261,24 @@ public: QVector *interSectingVector; //used from within intersectingSet //reimplementations - int itemIndex(const QListViewItem &item) const; - QListViewItem indexToListViewItem(const QModelIndex &index) const; - bool doBatchedItemLayout(const QListViewLayoutInfo &info, int max); - void clear(); - void setRowCount(int rowCount); - QVector intersectingSet(const QRect &area) const; + int itemIndex(const QListViewItem &item) const override; + QListViewItem indexToListViewItem(const QModelIndex &index) const override; + bool doBatchedItemLayout(const QListViewLayoutInfo &info, int max) override; + void clear() override; + void setRowCount(int rowCount) override; + QVector intersectingSet(const QRect &area) const override; - void scrollContentsBy(int dx, int dy, bool scrollElasticBand); - void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); - void appendHiddenRow(int row); - void removeHiddenRow(int row); - void setPositionForIndex(const QPoint &position, const QModelIndex &index); + void scrollContentsBy(int dx, int dy, bool scrollElasticBand) override; + void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) override; + void appendHiddenRow(int row) override; + void removeHiddenRow(int row) override; + void setPositionForIndex(const QPoint &position, const QModelIndex &index) override; #ifndef QT_NO_DRAGANDDROP - bool filterDragMoveEvent(QDragMoveEvent *); - bool filterDragLeaveEvent(QDragLeaveEvent *); - bool filterDropEvent(QDropEvent *e); - bool filterStartDrag(Qt::DropActions); + bool filterDragMoveEvent(QDragMoveEvent *) override; + bool filterDragLeaveEvent(QDragLeaveEvent *) override; + bool filterDropEvent(QDropEvent *e) override; + bool filterStartDrag(Qt::DropActions) override; #endif private: @@ -349,18 +349,18 @@ public: QModelIndex closestIndex(const QRect &target, const QVector &candidates) const; QSize itemSize(const QStyleOptionViewItem &option, const QModelIndex &index) const; - bool selectionAllowed(const QModelIndex &index) const + bool selectionAllowed(const QModelIndex &index) const override { if (viewMode == QListView::ListMode && !showElasticBand) return index.isValid(); return true; } int horizontalScrollToValue(const QModelIndex &index, const QRect &rect, QListView::ScrollHint hint) const; int verticalScrollToValue(const QModelIndex &index, const QRect &rect, QListView::ScrollHint hint) const; QItemSelection selection(const QRect &rect) const; - void selectAll(QItemSelectionModel::SelectionFlags command); + void selectAll(QItemSelectionModel::SelectionFlags command) override; #ifndef QT_NO_DRAGANDDROP - virtual QAbstractItemView::DropIndicatorPosition position(const QPoint &pos, const QRect &rect, const QModelIndex &idx) const; - bool dropOn(QDropEvent *event, int *row, int *col, QModelIndex *index); + QAbstractItemView::DropIndicatorPosition position(const QPoint &pos, const QRect &rect, const QModelIndex &idx) const override; + bool dropOn(QDropEvent *event, int *row, int *col, QModelIndex *index) override; #endif inline void setGridSize(const QSize &size) { grid = size; } @@ -383,7 +383,7 @@ public: void scrollElasticBandBy(int dx, int dy); - QItemViewPaintPairs draggablePaintPairs(const QModelIndexList &indexes, QRect *r) const; + QItemViewPaintPairs draggablePaintPairs(const QModelIndexList &indexes, QRect *r) const override; void emitIndexesMoved(const QModelIndexList &indexes) { emit q_func()->indexesMoved(indexes); } diff --git a/src/widgets/itemviews/qlistwidget_p.h b/src/widgets/itemviews/qlistwidget_p.h index eaddfc6e6e..0594fd511e 100644 --- a/src/widgets/itemviews/qlistwidget_p.h +++ b/src/widgets/itemviews/qlistwidget_p.h @@ -93,22 +93,22 @@ public: QListWidgetItem *take(int row); void move(int srcRow, int dstRow); - int rowCount(const QModelIndex &parent = QModelIndex()) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; QModelIndex index(QListWidgetItem *item) const; - QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const; + QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; - QMap itemData(const QModelIndex &index) const; + QMap itemData(const QModelIndex &index) const override; - bool insertRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()); - bool removeRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()); + bool insertRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; + bool removeRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; - Qt::ItemFlags flags(const QModelIndex &index) const; + Qt::ItemFlags flags(const QModelIndex &index) const override; - void sort(int column, Qt::SortOrder order); + void sort(int column, Qt::SortOrder order) override; void ensureSorted(int column, Qt::SortOrder order, int start, int end); static bool itemLessThan(const QPair &left, const QPair &right); @@ -122,12 +122,12 @@ public: void itemChanged(QListWidgetItem *item); // dnd - QStringList mimeTypes() const; - QMimeData *mimeData(const QModelIndexList &indexes) const; + QStringList mimeTypes() const override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; #ifndef QT_NO_DRAGANDDROP bool dropMimeData(const QMimeData *data, Qt::DropAction action, - int row, int column, const QModelIndex &parent); - Qt::DropActions supportedDropActions() const; + int row, int column, const QModelIndex &parent) override; + Qt::DropActions supportedDropActions() const override; #endif QMimeData *internalMimeData() const; diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 313577befe..2db7337cd6 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -99,11 +99,11 @@ public: QTableModel(int rows, int columns, QTableWidget *parent); ~QTableModel(); - bool insertRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()); - bool insertColumns(int column, int count = 1, const QModelIndex &parent = QModelIndex()); + bool insertRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; + bool insertColumns(int column, int count = 1, const QModelIndex &parent = QModelIndex()) override; - bool removeRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()); - bool removeColumns(int column, int count = 1, const QModelIndex &parent = QModelIndex()); + bool removeRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override; + bool removeColumns(int column, int count = 1, const QModelIndex &parent = QModelIndex()) override; void setItem(int row, int column, QTableWidgetItem *item); QTableWidgetItem *takeItem(int row, int column); @@ -118,7 +118,7 @@ public: QTableWidgetItem *horizontalHeaderItem(int section); QTableWidgetItem *verticalHeaderItem(int section); - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override { return QAbstractTableModel::index(row, column, parent); } QModelIndex index(const QTableWidgetItem *item) const; @@ -126,21 +126,21 @@ public: void setRowCount(int rows); void setColumnCount(int columns); - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); - bool setItemData(const QModelIndex &index, const QMap &roles); + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + bool setItemData(const QModelIndex &index, const QMap &roles) override; - QMap itemData(const QModelIndex &index) const; + QMap itemData(const QModelIndex &index) const override; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role); + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) override; - Qt::ItemFlags flags(const QModelIndex &index) const; + Qt::ItemFlags flags(const QModelIndex &index) const override; - void sort(int column, Qt::SortOrder order); + void sort(int column, Qt::SortOrder order) override; static bool itemLessThan(const QPair &left, const QPair &right); static bool itemGreaterThan(const QPair &left, @@ -167,11 +167,11 @@ public: void setItemPrototype(const QTableWidgetItem *item); // dnd - QStringList mimeTypes() const; - QMimeData *mimeData(const QModelIndexList &indexes) const; + QStringList mimeTypes() const override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, - int row, int column, const QModelIndex &parent); - Qt::DropActions supportedDropActions() const; + int row, int column, const QModelIndex &parent) override; + Qt::DropActions supportedDropActions() const override; QMimeData *internalMimeData() const; diff --git a/src/widgets/itemviews/qtreeview_p.h b/src/widgets/itemviews/qtreeview_p.h index 56f3340966..63af41292b 100644 --- a/src/widgets/itemviews/qtreeview_p.h +++ b/src/widgets/itemviews/qtreeview_p.h @@ -102,8 +102,8 @@ public: return logicalIndex == logicalIndexForTree(); } - QItemViewPaintPairs draggablePaintPairs(const QModelIndexList &indexes, QRect *r) const; - void adjustViewOptionsForIndex(QStyleOptionViewItem *option, const QModelIndex ¤t) const; + QItemViewPaintPairs draggablePaintPairs(const QModelIndexList &indexes, QRect *r) const override; + void adjustViewOptionsForIndex(QStyleOptionViewItem *option, const QModelIndex ¤t) const override; #ifndef QT_NO_ANIMATION struct AnimatedOperation : public QVariantAnimation @@ -115,8 +115,8 @@ public: AnimatedOperation() : item(0) { setEasingCurve(QEasingCurve::InOutQuad); } int top() const { return startValue().toInt(); } QRect rect() const { QRect rect = viewport->rect(); rect.moveTop(top()); return rect; } - void updateCurrentValue(const QVariant &) { viewport->update(rect()); } - void updateState(State state, State) { if (state == Stopped) before = after = QPixmap(); } + void updateCurrentValue(const QVariant &) override { viewport->update(rect()); } + void updateState(State state, State) override { if (state == Stopped) before = after = QPixmap(); } } animatedOperation; void prepareAnimatedOperation(int item, QVariantAnimation::Direction d); void beginAnimatedOperation(); @@ -128,11 +128,11 @@ public: void expand(int item, bool emitSignal); void collapse(int item, bool emitSignal); - void _q_columnsAboutToBeRemoved(const QModelIndex &, int, int); - void _q_columnsRemoved(const QModelIndex &, int, int); + void _q_columnsAboutToBeRemoved(const QModelIndex &, int, int) override; + void _q_columnsRemoved(const QModelIndex &, int, int) override; void _q_modelAboutToBeReset(); void _q_sortIndicatorChanged(int column, Qt::SortOrder order); - void _q_modelDestroyed(); + void _q_modelDestroyed() override; void layout(int item, bool recusiveExpanding = false, bool afterIsUninitialized = false); diff --git a/src/widgets/kernel/qlayoutitem.h b/src/widgets/kernel/qlayoutitem.h index 6f701b9f82..059ff2d470 100644 --- a/src/widgets/kernel/qlayoutitem.h +++ b/src/widgets/kernel/qlayoutitem.h @@ -101,14 +101,14 @@ public: void changeSize(int w, int h, QSizePolicy::Policy hData = QSizePolicy::Minimum, QSizePolicy::Policy vData = QSizePolicy::Minimum); - QSize sizeHint() const; - QSize minimumSize() const; - QSize maximumSize() const; - Qt::Orientations expandingDirections() const; - bool isEmpty() const; - void setGeometry(const QRect&); - QRect geometry() const; - QSpacerItem *spacerItem(); + QSize sizeHint() const override; + QSize minimumSize() const override; + QSize maximumSize() const override; + Qt::Orientations expandingDirections() const override; + bool isEmpty() const override; + void setGeometry(const QRect&) override; + QRect geometry() const override; + QSpacerItem *spacerItem() override; QSizePolicy sizePolicy() const { return sizeP; } private: @@ -126,18 +126,18 @@ public: explicit QWidgetItem(QWidget *w) : wid(w) { } ~QWidgetItem(); - QSize sizeHint() const; - QSize minimumSize() const; - QSize maximumSize() const; - Qt::Orientations expandingDirections() const; - bool isEmpty() const; - void setGeometry(const QRect&); - QRect geometry() const; - virtual QWidget *widget(); + QSize sizeHint() const override; + QSize minimumSize() const override; + QSize maximumSize() const override; + Qt::Orientations expandingDirections() const override; + bool isEmpty() const override; + void setGeometry(const QRect&) override; + QRect geometry() const override; + QWidget *widget() override; - bool hasHeightForWidth() const; - int heightForWidth(int) const; - QSizePolicy::ControlTypes controlTypes() const; + bool hasHeightForWidth() const override; + int heightForWidth(int) const override; + QSizePolicy::ControlTypes controlTypes() const override; protected: QWidget *wid; }; @@ -148,10 +148,10 @@ public: explicit QWidgetItemV2(QWidget *widget); ~QWidgetItemV2(); - QSize sizeHint() const; - QSize minimumSize() const; - QSize maximumSize() const; - int heightForWidth(int width) const; + QSize sizeHint() const override; + QSize minimumSize() const override; + QSize maximumSize() const override; + int heightForWidth(int width) const override; private: enum { Dirty = -123, HfwCacheMaxSize = 3 }; diff --git a/src/widgets/util/qflickgesture_p.h b/src/widgets/util/qflickgesture_p.h index fa70806ef7..74a0f2a0f3 100644 --- a/src/widgets/util/qflickgesture_p.h +++ b/src/widgets/util/qflickgesture_p.h @@ -97,9 +97,9 @@ class QFlickGestureRecognizer : public QGestureRecognizer public: QFlickGestureRecognizer(Qt::MouseButton button); - QGesture *create(QObject *target); - QGestureRecognizer::Result recognize(QGesture *state, QObject *watched, QEvent *event); - void reset(QGesture *state); + QGesture *create(QObject *target) override; + QGestureRecognizer::Result recognize(QGesture *state, QObject *watched, QEvent *event) override; + void reset(QGesture *state) override; private: Qt::MouseButton button; // NoButton == Touch diff --git a/src/widgets/widgets/qabstractspinbox.h b/src/widgets/widgets/qabstractspinbox.h index d93489e663..ac46894a27 100644 --- a/src/widgets/widgets/qabstractspinbox.h +++ b/src/widgets/widgets/qabstractspinbox.h @@ -117,12 +117,12 @@ public: void setGroupSeparatorShown(bool shown); bool isGroupSeparatorShown() const; - QSize sizeHint() const; - QSize minimumSizeHint() const; + QSize sizeHint() const override; + QSize minimumSizeHint() const override; void interpretText(); - bool event(QEvent *event); + bool event(QEvent *event) override; - QVariant inputMethodQuery(Qt::InputMethodQuery) const; + QVariant inputMethodQuery(Qt::InputMethodQuery) const override; virtual QValidator::State validate(QString &input, int &pos) const; virtual void fixup(QString &input) const; @@ -134,24 +134,24 @@ public Q_SLOTS: void selectAll(); virtual void clear(); protected: - void resizeEvent(QResizeEvent *event); - void keyPressEvent(QKeyEvent *event); - void keyReleaseEvent(QKeyEvent *event); + void resizeEvent(QResizeEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + void keyReleaseEvent(QKeyEvent *event) override; #ifndef QT_NO_WHEELEVENT - void wheelEvent(QWheelEvent *event); + void wheelEvent(QWheelEvent *event) override; #endif - void focusInEvent(QFocusEvent *event); - void focusOutEvent(QFocusEvent *event); - void contextMenuEvent(QContextMenuEvent *event); - void changeEvent(QEvent *event); - void closeEvent(QCloseEvent *event); - void hideEvent(QHideEvent *event); - void mousePressEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void timerEvent(QTimerEvent *event); - void paintEvent(QPaintEvent *event); - void showEvent(QShowEvent *event); + void focusInEvent(QFocusEvent *event) override; + void focusOutEvent(QFocusEvent *event) override; + void contextMenuEvent(QContextMenuEvent *event) override; + void changeEvent(QEvent *event) override; + void closeEvent(QCloseEvent *event) override; + void hideEvent(QHideEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void timerEvent(QTimerEvent *event) override; + void paintEvent(QPaintEvent *event) override; + void showEvent(QShowEvent *event) override; void initStyleOption(QStyleOptionSpinBox *option) const; QLineEdit *lineEdit() const; diff --git a/src/widgets/widgets/qabstractspinbox_p.h b/src/widgets/widgets/qabstractspinbox_p.h index 47ca10a183..5ec59d899b 100644 --- a/src/widgets/widgets/qabstractspinbox_p.h +++ b/src/widgets/widgets/qabstractspinbox_p.h @@ -156,8 +156,8 @@ class QSpinBoxValidator : public QValidator { public: QSpinBoxValidator(QAbstractSpinBox *qptr, QAbstractSpinBoxPrivate *dptr); - QValidator::State validate(QString &input, int &) const; - void fixup(QString &) const; + QValidator::State validate(QString &input, int &) const override; + void fixup(QString &) const override; private: QAbstractSpinBox *qptr; QAbstractSpinBoxPrivate *dptr; diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h index 7ca077abf9..6c36359f81 100644 --- a/src/widgets/widgets/qcombobox_p.h +++ b/src/widgets/widgets/qcombobox_p.h @@ -86,13 +86,13 @@ public: QComboBoxListView(QComboBox *cmb = 0) : combo(cmb) {} protected: - void resizeEvent(QResizeEvent *event) + void resizeEvent(QResizeEvent *event) override { resizeContents(viewport()->width(), contentsSize().height()); QListView::resizeEvent(event); } - QStyleOptionViewItem viewOptions() const + QStyleOptionViewItem viewOptions() const override { QStyleOptionViewItem option = QListView::viewOptions(); option.showDecorationSelected = true; @@ -101,7 +101,7 @@ protected: return option; } - void paintEvent(QPaintEvent *e) + void paintEvent(QPaintEvent *e) override { if (combo) { QStyleOptionComboBox opt; @@ -142,7 +142,7 @@ public: setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); setAttribute(Qt::WA_NoMousePropagation); } - QSize sizeHint() const { + QSize sizeHint() const override { return QSize(20, style()->pixelMetric(QStyle::PM_MenuScrollerHeight)); } @@ -156,14 +156,14 @@ protected: fast = false; } - void enterEvent(QEvent *) { + void enterEvent(QEvent *) override { startTimer(); } - void leaveEvent(QEvent *) { + void leaveEvent(QEvent *) override { stopTimer(); } - void timerEvent(QTimerEvent *e) { + void timerEvent(QTimerEvent *e) override { if (e->timerId() == timer.timerId()) { emit doScroll(sliderAction); if (fast) { @@ -172,11 +172,11 @@ protected: } } } - void hideEvent(QHideEvent *) { + void hideEvent(QHideEvent *) override { stopTimer(); } - void mouseMoveEvent(QMouseEvent *e) + void mouseMoveEvent(QMouseEvent *e) override { // Enable fast scrolling if the cursor is directly above or below the popup. const int mouseX = e->pos().x(); @@ -188,7 +188,7 @@ protected: fast = horizontallyInside && verticallyOutside; } - void paintEvent(QPaintEvent *) { + void paintEvent(QPaintEvent *) override { QPainter p(this); QStyleOptionMenuItem menuOpt; menuOpt.init(this); @@ -235,15 +235,15 @@ public Q_SLOTS: void viewDestroyed(); protected: - void changeEvent(QEvent *e); - bool eventFilter(QObject *o, QEvent *e); - void mousePressEvent(QMouseEvent *e); - void mouseReleaseEvent(QMouseEvent *e); - void showEvent(QShowEvent *e); - void hideEvent(QHideEvent *e); - void timerEvent(QTimerEvent *timerEvent); - void leaveEvent(QEvent *e); - void resizeEvent(QResizeEvent *e); + void changeEvent(QEvent *e) override; + bool eventFilter(QObject *o, QEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + void showEvent(QShowEvent *e) override; + void hideEvent(QHideEvent *e) override; + void timerEvent(QTimerEvent *timerEvent) override; + void leaveEvent(QEvent *e) override; + void resizeEvent(QResizeEvent *e) override; QStyleOptionComboBox comboStyleOption() const; Q_SIGNALS: @@ -270,13 +270,13 @@ public: protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const { + const QModelIndex &index) const override { QStyleOptionMenuItem opt = getStyleOption(option, index); painter->fillRect(option.rect, opt.palette.background()); mCombo->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, mCombo); } QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const { + const QModelIndex &index) const override { QStyleOptionMenuItem opt = getStyleOption(option, index); return mCombo->style()->sizeFromContents( QStyle::CT_MenuItem, &opt, option.rect.size(), mCombo); @@ -309,7 +309,7 @@ public: protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const { + const QModelIndex &index) const override { if (isSeparator(index)) { QRect rect = option.rect; if (const QAbstractItemView *view = qobject_cast(option.widget)) @@ -323,7 +323,7 @@ protected: } QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const { + const QModelIndex &index) const override { if (isSeparator(index)) { int pm = mCombo->style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, mCombo); return QSize(pm, pm); diff --git a/src/widgets/widgets/qdatetimeedit.h b/src/widgets/widgets/qdatetimeedit.h index c261ce369b..5c9f4e0f9d 100644 --- a/src/widgets/widgets/qdatetimeedit.h +++ b/src/widgets/widgets/qdatetimeedit.h @@ -159,12 +159,12 @@ public: Qt::TimeSpec timeSpec() const; void setTimeSpec(Qt::TimeSpec spec); - QSize sizeHint() const; + QSize sizeHint() const override; - virtual void clear(); - virtual void stepBy(int steps); + void clear() override; + void stepBy(int steps) override; - bool event(QEvent *event); + bool event(QEvent *event) override; Q_SIGNALS: void dateTimeChanged(const QDateTime &dateTime); void timeChanged(const QTime &time); @@ -176,20 +176,20 @@ public Q_SLOTS: void setTime(const QTime &time); protected: - virtual void keyPressEvent(QKeyEvent *event); + void keyPressEvent(QKeyEvent *event) override; #ifndef QT_NO_WHEELEVENT - virtual void wheelEvent(QWheelEvent *event); + void wheelEvent(QWheelEvent *event) override; #endif - virtual void focusInEvent(QFocusEvent *event); - virtual bool focusNextPrevChild(bool next); - virtual QValidator::State validate(QString &input, int &pos) const; - virtual void fixup(QString &input) const; + void focusInEvent(QFocusEvent *event) override; + bool focusNextPrevChild(bool next) override; + QValidator::State validate(QString &input, int &pos) const override; + void fixup(QString &input) const override; virtual QDateTime dateTimeFromText(const QString &text) const; virtual QString textFromDateTime(const QDateTime &dt) const; - virtual StepEnabled stepEnabled() const; - virtual void mousePressEvent(QMouseEvent *event); - virtual void paintEvent(QPaintEvent *event); + StepEnabled stepEnabled() const override; + void mousePressEvent(QMouseEvent *event) override; + void paintEvent(QPaintEvent *event) override; void initStyleOption(QStyleOptionSpinBox *option) const; QDateTimeEdit(const QVariant &val, QVariant::Type parserType, QWidget *parent = Q_NULLPTR); diff --git a/src/widgets/widgets/qdatetimeedit_p.h b/src/widgets/widgets/qdatetimeedit_p.h index 6889bda041..730aa0f0b2 100644 --- a/src/widgets/widgets/qdatetimeedit_p.h +++ b/src/widgets/widgets/qdatetimeedit_p.h @@ -167,10 +167,10 @@ private Q_SLOTS: void dateSelectionChanged(); protected: - void hideEvent(QHideEvent *); - void mousePressEvent(QMouseEvent *e); - void mouseReleaseEvent(QMouseEvent *); - bool event(QEvent *e); + void hideEvent(QHideEvent *) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *) override; + bool event(QEvent *e) override; private: QCalendarWidget *verifyCalendarInstance(); diff --git a/src/widgets/widgets/qmacnativewidget_mac.h b/src/widgets/widgets/qmacnativewidget_mac.h index 84389f16df..a8faffd6be 100644 --- a/src/widgets/widgets/qmacnativewidget_mac.h +++ b/src/widgets/widgets/qmacnativewidget_mac.h @@ -54,11 +54,11 @@ public: QMacNativeWidget(NSView *parentView = Q_NULLPTR); ~QMacNativeWidget(); - QSize sizeHint() const; + QSize sizeHint() const override; NSView *nativeView() const; protected: - bool event(QEvent *ev); + bool event(QEvent *ev) override; }; QT_END_NAMESPACE diff --git a/src/widgets/widgets/qmdisubwindow_p.h b/src/widgets/widgets/qmdisubwindow_p.h index 650d3b0bfb..33fa73eb0d 100644 --- a/src/widgets/widgets/qmdisubwindow_p.h +++ b/src/widgets/widgets/qmdisubwindow_p.h @@ -80,7 +80,7 @@ public: mdiChild = child; } - void *qt_metacast(const char *classname) + void *qt_metacast(const char *classname) override { if (classname && strcmp(classname, "ControlElement") == 0) return this; diff --git a/src/widgets/widgets/qmenubar.h b/src/widgets/widgets/qmenubar.h index ec15155710..7ad205b77a 100644 --- a/src/widgets/widgets/qmenubar.h +++ b/src/widgets/widgets/qmenubar.h @@ -86,9 +86,9 @@ public: void setDefaultUp(bool); bool isDefaultUp() const; - QSize sizeHint() const; - QSize minimumSizeHint() const; - int heightForWidth(int) const; + QSize sizeHint() const override; + QSize minimumSizeHint() const override; + int heightForWidth(int) const override; QRect actionGeometry(QAction *) const; QAction *actionAt(const QPoint &) const; @@ -104,27 +104,27 @@ public: void setNativeMenuBar(bool nativeMenuBar); QPlatformMenuBar *platformMenuBar(); public Q_SLOTS: - virtual void setVisible(bool visible); + void setVisible(bool visible) override; Q_SIGNALS: void triggered(QAction *action); void hovered(QAction *action); protected: - void changeEvent(QEvent *); - void keyPressEvent(QKeyEvent *); - void mouseReleaseEvent(QMouseEvent *); - void mousePressEvent(QMouseEvent *); - void mouseMoveEvent(QMouseEvent *); - void leaveEvent(QEvent *); - void paintEvent(QPaintEvent *); - void resizeEvent(QResizeEvent *); - void actionEvent(QActionEvent *); - void focusOutEvent(QFocusEvent *); - void focusInEvent(QFocusEvent *); - void timerEvent(QTimerEvent *); - bool eventFilter(QObject *, QEvent *); - bool event(QEvent *); + void changeEvent(QEvent *) override; + void keyPressEvent(QKeyEvent *) override; + void mouseReleaseEvent(QMouseEvent *) override; + void mousePressEvent(QMouseEvent *) override; + void mouseMoveEvent(QMouseEvent *) override; + void leaveEvent(QEvent *) override; + void paintEvent(QPaintEvent *) override; + void resizeEvent(QResizeEvent *) override; + void actionEvent(QActionEvent *) override; + void focusOutEvent(QFocusEvent *) override; + void focusInEvent(QFocusEvent *) override; + void timerEvent(QTimerEvent *) override; + bool eventFilter(QObject *, QEvent *) override; + bool event(QEvent *) override; void initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const; private: diff --git a/src/widgets/widgets/qspinbox.h b/src/widgets/widgets/qspinbox.h index 2e77f0be7a..2eb12fd90d 100644 --- a/src/widgets/widgets/qspinbox.h +++ b/src/widgets/widgets/qspinbox.h @@ -91,11 +91,11 @@ public: void setDisplayIntegerBase(int base); protected: - bool event(QEvent *event); - virtual QValidator::State validate(QString &input, int &pos) const; + bool event(QEvent *event) override; + QValidator::State validate(QString &input, int &pos) const override; virtual int valueFromText(const QString &text) const; virtual QString textFromValue(int val) const; - virtual void fixup(QString &str) const; + void fixup(QString &str) const override; public Q_SLOTS: @@ -151,10 +151,10 @@ public: int decimals() const; void setDecimals(int prec); - virtual QValidator::State validate(QString &input, int &pos) const; + QValidator::State validate(QString &input, int &pos) const override; virtual double valueFromText(const QString &text) const; virtual QString textFromValue(double val) const; - virtual void fixup(QString &str) const; + void fixup(QString &str) const override; public Q_SLOTS: void setValue(double val); From 33c50e910c6f8ed68994e4968389603ddb8bc6f7 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 29 Nov 2016 13:21:43 +0100 Subject: [PATCH 104/174] Fix tst_QString::sprintf() Compare to QLatin1String and use reinterpret_cast to fix MSVC warning: tst_qstring.cpp(1271): warning C4312: 'type cast': conversion from 'unsigned int' to 'void *' of greater size Change-Id: I4f26d72f0fad59e09636fe609a2772309a688e5c Reviewed-by: Marc Mutz --- .../auto/corelib/tools/qstring/tst_qstring.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp index a0a872710c..414ba2d8cf 100644 --- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp @@ -1255,6 +1255,11 @@ void tst_QString::fill() QCOMPARE(f, QLatin1String("FFF")); } +static inline const void *ptrValue(quintptr v) +{ + return reinterpret_cast(v); +} + void tst_QString::sprintf() { QString a; @@ -1266,21 +1271,21 @@ void tst_QString::sprintf() QCOMPARE(a.sprintf("X%9iY", 50000 ), QLatin1String("X 50000Y")); QCOMPARE(a.sprintf("X%-9sY","hello"), QLatin1String("Xhello Y")); QCOMPARE(a.sprintf("X%-9iY", 50000 ), QLatin1String("X50000 Y")); - QCOMPARE(a.sprintf("%lf", 1.23), QString("1.230000")); - QCOMPARE(a.sprintf("%lf", 1.23456789), QString("1.234568")); - QCOMPARE(a.sprintf("%p", (void *)0xbfffd350), QString("0xbfffd350")); - QCOMPARE(a.sprintf("%p", (void *)0), QString("0x0")); + QCOMPARE(a.sprintf("%lf", 1.23), QLatin1String("1.230000")); + QCOMPARE(a.sprintf("%lf", 1.23456789), QLatin1String("1.234568")); + QCOMPARE(a.sprintf("%p", ptrValue(0xbfffd350)), QLatin1String("0xbfffd350")); + QCOMPARE(a.sprintf("%p", ptrValue(0)), QLatin1String("0x0")); int i = 6; long l = -2; float f = 4.023f; QString S1; S1.sprintf("%d %ld %f",i,l,f); - QCOMPARE(S1,QString("6 -2 4.023000")); + QCOMPARE(S1, QLatin1String("6 -2 4.023000")); double d = -514.25683; S1.sprintf("%f",d); - QCOMPARE(S1, QString("-514.256830")); + QCOMPARE(S1, QLatin1String("-514.256830")); } void tst_QString::sprintfS() From c2446cb7df1466e9252f691567133295e4101c44 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 29 Nov 2016 13:08:51 +0100 Subject: [PATCH 105/174] qdbusxml2cpp: Add application name and input file to warnings Make it possible to identify its warnings in log files, like: qdbusxml2cpp: Got unknown type `(s)' processing '../org.qtproject.QtDBus.Pinger.xml' You should add to the XML description qdbusxml2cpp: Got unknown type `(s)' processing '../org.qtproject.QtDBus.Pinger.xml' You should add to the XML description Change-Id: I242d9316b317de0164af2725b7836551f2f69037 Reviewed-by: Rolf Eike Beer Reviewed-by: Thiago Macieira --- src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp | 37 +++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp index bd94017821..2f9721b175 100644 --- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp +++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp @@ -98,7 +98,8 @@ static QDBusIntrospection::Interfaces readInput() // already XML return QDBusIntrospection::parseInterfaces(QString::fromUtf8(data)); - fprintf(stderr, "Cannot process input: '%s'. Stop.\n", qPrintable(inputFile)); + fprintf(stderr, "%s: Cannot process input: '%s'. Stop.\n", + PROGRAMNAME, qPrintable(inputFile)); exit(1); } @@ -225,7 +226,8 @@ static QByteArray qtTypeName(const QString &signature, const QDBusIntrospection: if (qttype.isEmpty()) { if (!isSignal || qstrcmp(direction, "Out") == 0) { - fprintf(stderr, "Got unknown type `%s'\n", qPrintable(signature)); + fprintf(stderr, "%s: Got unknown type `%s' processing '%s'\n", + PROGRAMNAME, qPrintable(signature), qPrintable(inputFile)); fprintf(stderr, "You should add \"/> to the XML description\n", qPrintable(annotationName)); } @@ -236,8 +238,10 @@ static QByteArray qtTypeName(const QString &signature, const QDBusIntrospection: exit(1); } - fprintf(stderr, "Warning: deprecated annotation '%s' found; suggest updating to '%s'\n", - qPrintable(oldAnnotationName), qPrintable(annotationName)); + fprintf(stderr, "%s: Warning: deprecated annotation '%s' found while processing '%s'; " + "suggest updating to '%s'\n", + PROGRAMNAME, qPrintable(oldAnnotationName), qPrintable(inputFile), + qPrintable(annotationName)); return qttype.toLatin1(); } @@ -357,8 +361,10 @@ static QString propertyGetter(const QDBusIntrospection::Property &property) getter = property.annotations.value(QLatin1String("com.trolltech.QtDBus.propertyGetter")); if (!getter.isEmpty()) { - fprintf(stderr, "Warning: deprecated annotation 'com.trolltech.QtDBus.propertyGetter' found;" - " suggest updating to 'org.qtproject.QtDBus.PropertyGetter'\n"); + fprintf(stderr, "%s: Warning: deprecated annotation 'com.trolltech.QtDBus.propertyGetter' found" + " while processing '%s';" + " suggest updating to 'org.qtproject.QtDBus.PropertyGetter'\n", + PROGRAMNAME, qPrintable(inputFile)); return getter; } @@ -375,8 +381,10 @@ static QString propertySetter(const QDBusIntrospection::Property &property) setter = property.annotations.value(QLatin1String("com.trolltech.QtDBus.propertySetter")); if (!setter.isEmpty()) { - fprintf(stderr, "Warning: deprecated annotation 'com.trolltech.QtDBus.propertySetter' found;" - " suggest updating to 'org.qtproject.QtDBus.PropertySetter'\n"); + fprintf(stderr, "%s: Warning: deprecated annotation 'com.trolltech.QtDBus.propertySetter' found" + " while processing '%s';" + " suggest updating to 'org.qtproject.QtDBus.PropertySetter'\n", + PROGRAMNAME, qPrintable(inputFile)); return setter; } @@ -426,8 +434,8 @@ static bool openFile(const QString &fileName, QFile &file) } if (!isOk) - fprintf(stderr, "Unable to open '%s': %s\n", qPrintable(fileName), - qPrintable(file.errorString())); + fprintf(stderr, "%s: Unable to open '%s': %s\n", + PROGRAMNAME, qPrintable(fileName), qPrintable(file.errorString())); return isOk; } @@ -566,8 +574,9 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf bool isNoReply = method.annotations.value(QLatin1String(ANNOTATION_NO_WAIT)) == QLatin1String("true"); if (isNoReply && !method.outputArgs.isEmpty()) { - fprintf(stderr, "warning: method %s in interface %s is marked 'no-reply' but has output arguments.\n", - qPrintable(method.name), qPrintable(interface->name)); + fprintf(stderr, "%s: warning while processing '%s': method %s in interface %s is marked 'no-reply' but has output arguments.\n", + PROGRAMNAME, qPrintable(inputFile), qPrintable(method.name), + qPrintable(interface->name)); continue; } @@ -893,8 +902,8 @@ static void writeAdaptor(const QString &filename, const QDBusIntrospection::Inte bool isNoReply = method.annotations.value(QLatin1String(ANNOTATION_NO_WAIT)) == QLatin1String("true"); if (isNoReply && !method.outputArgs.isEmpty()) { - fprintf(stderr, "warning: method %s in interface %s is marked 'no-reply' but has output arguments.\n", - qPrintable(method.name), qPrintable(interface->name)); + fprintf(stderr, "%s: warning while processing '%s': method %s in interface %s is marked 'no-reply' but has output arguments.\n", + PROGRAMNAME, qPrintable(inputFile), qPrintable(method.name), qPrintable(interface->name)); continue; } From e3ad43843a6ddb20c901b6fba85c12fb0e6c5651 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Sun, 27 Nov 2016 11:00:50 +0300 Subject: [PATCH 106/174] Android: Add missing override Change-Id: I70b802517d8f7d129ffb71dc3e92cb2458a55acc Reviewed-by: BogDan Vatra --- .../android/androidplatformplugin.cpp | 2 +- .../qandroidassetsfileenginehandler.cpp | 34 +++++++++---------- .../android/qandroidassetsfileenginehandler.h | 2 +- .../android/qandroideventdispatcher.h | 2 +- .../platforms/android/qandroidinputcontext.h | 22 ++++++------ .../android/qandroidplatformaccessibility.h | 2 +- .../android/qandroidplatformbackingstore.h | 8 ++--- .../android/qandroidplatformclipboard.h | 6 ++-- .../android/qandroidplatformdialoghelpers.h | 8 ++--- .../android/qandroidplatformfontdatabase.h | 10 +++--- .../android/qandroidplatformintegration.h | 34 +++++++++---------- .../platforms/android/qandroidplatformmenu.h | 28 +++++++-------- .../android/qandroidplatformmenubar.h | 10 +++--- .../android/qandroidplatformmenuitem.h | 28 +++++++-------- .../android/qandroidplatformopenglcontext.h | 6 ++-- .../android/qandroidplatformopenglwindow.h | 8 ++--- .../android/qandroidplatformscreen.h | 22 ++++++------ .../android/qandroidplatformservices.h | 6 ++-- .../platforms/android/qandroidplatformtheme.h | 18 +++++----- .../android/qandroidplatformwindow.h | 22 ++++++------ .../platforms/android/qandroidsystemlocale.h | 4 +-- 21 files changed, 141 insertions(+), 141 deletions(-) diff --git a/src/plugins/platforms/android/androidplatformplugin.cpp b/src/plugins/platforms/android/androidplatformplugin.cpp index 8e365e9a59..297e167f47 100644 --- a/src/plugins/platforms/android/androidplatformplugin.cpp +++ b/src/plugins/platforms/android/androidplatformplugin.cpp @@ -47,7 +47,7 @@ class QAndroidPlatformIntegrationPlugin: public QPlatformIntegrationPlugin Q_OBJECT Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "android.json") public: - QPlatformIntegration *create(const QString &key, const QStringList ¶mList); + QPlatformIntegration *create(const QString &key, const QStringList ¶mList) override; }; diff --git a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp index 7e8e1ba9c5..e1dcebfa4c 100644 --- a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp +++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp @@ -75,12 +75,12 @@ public: m_path = path; } - virtual QFileInfo currentFileInfo() const + QFileInfo currentFileInfo() const override { return QFileInfo(currentFilePath()); } - virtual QString currentFileName() const + QString currentFileName() const override { if (m_index < 0 || m_index >= m_items.size()) return QString(); @@ -95,12 +95,12 @@ public: return m_path + currentFileName(); } - virtual bool hasNext() const + bool hasNext() const override { return m_items.size() && (m_index < m_items.size() - 1); } - virtual QString next() + QString next() override { if (!hasNext()) return QString(); @@ -137,12 +137,12 @@ public: close(); } - virtual bool open(QIODevice::OpenMode openMode) + bool open(QIODevice::OpenMode openMode) override { return m_assetFile != 0 && (openMode & QIODevice::WriteOnly) == 0; } - virtual bool close() + bool close() override { if (m_assetFile) { AAsset_close(m_assetFile); @@ -152,50 +152,50 @@ public: return false; } - virtual qint64 size() const + qint64 size() const override { if (m_assetFile) return AAsset_getLength(m_assetFile); return -1; } - virtual qint64 pos() const + qint64 pos() const override { if (m_assetFile) return AAsset_seek(m_assetFile, 0, SEEK_CUR); return -1; } - virtual bool seek(qint64 pos) + bool seek(qint64 pos) override { if (m_assetFile) return pos == AAsset_seek(m_assetFile, pos, SEEK_SET); return false; } - virtual qint64 read(char *data, qint64 maxlen) + qint64 read(char *data, qint64 maxlen) override { if (m_assetFile) return AAsset_read(m_assetFile, data, maxlen); return -1; } - virtual bool isSequential() const + bool isSequential() const override { return false; } - virtual bool caseSensitive() const + bool caseSensitive() const override { return true; } - virtual bool isRelativePath() const + bool isRelativePath() const override { return false; } - virtual FileFlags fileFlags(FileFlags type = FileInfoAll) const + FileFlags fileFlags(FileFlags type = FileInfoAll) const override { FileFlags flags(ReadOwnerPerm|ReadUserPerm|ReadGroupPerm|ReadOtherPerm|ExistsFlag); if (m_assetFile) @@ -206,7 +206,7 @@ public: return type & flags; } - virtual QString fileName(FileName file = DefaultName) const + QString fileName(FileName file = DefaultName) const override { int pos; switch (file) { @@ -231,7 +231,7 @@ public: } } - virtual void setFileName(const QString &file) + void setFileName(const QString &file) override { if (file == m_fileName) return; @@ -243,7 +243,7 @@ public: close(); } - virtual Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) + Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override { if (!m_assetDir.isNull()) return new AndroidAbstractFileEngineIterator(filters, filterNames, m_assetDir, m_fileName); diff --git a/src/plugins/platforms/android/qandroidassetsfileenginehandler.h b/src/plugins/platforms/android/qandroidassetsfileenginehandler.h index b09d8090a4..f99dc9a11a 100644 --- a/src/plugins/platforms/android/qandroidassetsfileenginehandler.h +++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.h @@ -55,7 +55,7 @@ class AndroidAssetsFileEngineHandler: public QAbstractFileEngineHandler public: AndroidAssetsFileEngineHandler(); virtual ~AndroidAssetsFileEngineHandler(); - QAbstractFileEngine *create(const QString &fileName) const; + QAbstractFileEngine *create(const QString &fileName) const override; private: void prepopulateCache() const; diff --git a/src/plugins/platforms/android/qandroideventdispatcher.h b/src/plugins/platforms/android/qandroideventdispatcher.h index 86a7e460b3..057a1660c9 100644 --- a/src/plugins/platforms/android/qandroideventdispatcher.h +++ b/src/plugins/platforms/android/qandroideventdispatcher.h @@ -56,7 +56,7 @@ public: void goingToStop(bool stop); protected: - bool processEvents(QEventLoop::ProcessEventsFlags flags); + bool processEvents(QEventLoop::ProcessEventsFlags flags) override; private: QAtomicInt m_stopRequest; diff --git a/src/plugins/platforms/android/qandroidinputcontext.h b/src/plugins/platforms/android/qandroidinputcontext.h index 8a33ff71cc..ce0ec8724c 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.h +++ b/src/plugins/platforms/android/qandroidinputcontext.h @@ -80,21 +80,21 @@ public: QAndroidInputContext(); ~QAndroidInputContext(); static QAndroidInputContext * androidInputContext(); - bool isValid() const { return true; } + bool isValid() const override { return true; } - void reset(); - void commit(); - void update(Qt::InputMethodQueries queries); - void invokeAction(QInputMethod::Action action, int cursorPosition); - QRectF keyboardRect() const; - bool isAnimating() const; - void showInputPanel(); - void hideInputPanel(); - bool isInputPanelVisible() const; + void reset() override; + void commit() override; + void update(Qt::InputMethodQueries queries) override; + void invokeAction(QInputMethod::Action action, int cursorPosition) override; + QRectF keyboardRect() const override; + bool isAnimating() const override; + void showInputPanel() override; + void hideInputPanel() override; + bool isInputPanelVisible() const override; bool isComposing() const; void clear(); - void setFocusObject(QObject *object); + void setFocusObject(QObject *object) override; void sendShortcut(const QKeySequence &); //---------------// diff --git a/src/plugins/platforms/android/qandroidplatformaccessibility.h b/src/plugins/platforms/android/qandroidplatformaccessibility.h index 3a428ca1ad..8216c05fa6 100644 --- a/src/plugins/platforms/android/qandroidplatformaccessibility.h +++ b/src/plugins/platforms/android/qandroidplatformaccessibility.h @@ -51,7 +51,7 @@ public: QAndroidPlatformAccessibility(); ~QAndroidPlatformAccessibility(); - virtual void notifyAccessibilityUpdate(QAccessibleEvent *event); + void notifyAccessibilityUpdate(QAccessibleEvent *event) override; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/android/qandroidplatformbackingstore.h b/src/plugins/platforms/android/qandroidplatformbackingstore.h index e4a161d608..a3a65aa30e 100644 --- a/src/plugins/platforms/android/qandroidplatformbackingstore.h +++ b/src/plugins/platforms/android/qandroidplatformbackingstore.h @@ -50,10 +50,10 @@ class QAndroidPlatformBackingStore : public QPlatformBackingStore { public: explicit QAndroidPlatformBackingStore(QWindow *window); - virtual QPaintDevice *paintDevice(); - virtual void flush(QWindow *window, const QRegion ®ion, const QPoint &offset); - virtual void resize(const QSize &size, const QRegion &staticContents); - QImage toImage() const { return m_image; } + QPaintDevice *paintDevice() override; + void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) override; + void resize(const QSize &size, const QRegion &staticContents) override; + QImage toImage() const override { return m_image; } void setBackingStore(QWindow *window); protected: QImage m_image; diff --git a/src/plugins/platforms/android/qandroidplatformclipboard.h b/src/plugins/platforms/android/qandroidplatformclipboard.h index 47976c1693..dfc3629c10 100644 --- a/src/plugins/platforms/android/qandroidplatformclipboard.h +++ b/src/plugins/platforms/android/qandroidplatformclipboard.h @@ -51,9 +51,9 @@ class QAndroidPlatformClipboard: public QPlatformClipboard public: QAndroidPlatformClipboard(); - virtual QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard); - virtual void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard); - virtual bool supportsMode(QClipboard::Mode mode) const; + QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) override; + void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard) override; + bool supportsMode(QClipboard::Mode mode) const override; private: QMimeData m_mimeData; diff --git a/src/plugins/platforms/android/qandroidplatformdialoghelpers.h b/src/plugins/platforms/android/qandroidplatformdialoghelpers.h index 5c3aef2bc1..694b4c7580 100644 --- a/src/plugins/platforms/android/qandroidplatformdialoghelpers.h +++ b/src/plugins/platforms/android/qandroidplatformdialoghelpers.h @@ -53,11 +53,11 @@ class QAndroidPlatformMessageDialogHelper: public QPlatformMessageDialogHelper Q_OBJECT public: QAndroidPlatformMessageDialogHelper(); - void exec(); + void exec() override; bool show(Qt::WindowFlags windowFlags, - Qt::WindowModality windowModality, - QWindow *parent); - void hide(); + Qt::WindowModality windowModality, + QWindow *parent) override; + void hide() override; public slots: void dialogResult(int buttonID); diff --git a/src/plugins/platforms/android/qandroidplatformfontdatabase.h b/src/plugins/platforms/android/qandroidplatformfontdatabase.h index b20fd75cb2..533d6e50a9 100644 --- a/src/plugins/platforms/android/qandroidplatformfontdatabase.h +++ b/src/plugins/platforms/android/qandroidplatformfontdatabase.h @@ -47,12 +47,12 @@ QT_BEGIN_NAMESPACE class QAndroidPlatformFontDatabase: public QBasicFontDatabase { public: - QString fontDir() const; - void populateFontDatabase(); + QString fontDir() const override; + void populateFontDatabase() override; QStringList fallbacksForFamily(const QString &family, - QFont::Style style, - QFont::StyleHint styleHint, - QChar::Script script) const; + QFont::Style style, + QFont::StyleHint styleHint, + QChar::Script script) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/android/qandroidplatformintegration.h b/src/plugins/platforms/android/qandroidplatformintegration.h index bda0bee9ad..2337801250 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.h +++ b/src/plugins/platforms/android/qandroidplatformintegration.h @@ -63,7 +63,7 @@ struct AndroidStyle; class QAndroidPlatformNativeInterface: public QPlatformNativeInterface { public: - void *nativeResourceForIntegration(const QByteArray &resource); + void *nativeResourceForIntegration(const QByteArray &resource) override; std::shared_ptr m_androidStyle; }; @@ -75,39 +75,39 @@ public: QAndroidPlatformIntegration(const QStringList ¶mList); ~QAndroidPlatformIntegration(); - bool hasCapability(QPlatformIntegration::Capability cap) const; + bool hasCapability(QPlatformIntegration::Capability cap) const override; - QPlatformWindow *createPlatformWindow(QWindow *window) const; - QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const; - QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const; - QAbstractEventDispatcher *createEventDispatcher() const; + QPlatformWindow *createPlatformWindow(QWindow *window) const override; + QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const override; + QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const override; + QAbstractEventDispatcher *createEventDispatcher() const override; QAndroidPlatformScreen *screen() { return m_primaryScreen; } - QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const override; virtual void setDesktopSize(int width, int height); virtual void setDisplayMetrics(int width, int height); void setScreenSize(int width, int height); bool isVirtualDesktop() { return true; } - QPlatformFontDatabase *fontDatabase() const; + QPlatformFontDatabase *fontDatabase() const override; #ifndef QT_NO_CLIPBOARD - QPlatformClipboard *clipboard() const; + QPlatformClipboard *clipboard() const override; #endif - QPlatformInputContext *inputContext() const; - QPlatformNativeInterface *nativeInterface() const; - QPlatformServices *services() const; + QPlatformInputContext *inputContext() const override; + QPlatformNativeInterface *nativeInterface() const override; + QPlatformServices *services() const override; #ifndef QT_NO_ACCESSIBILITY - virtual QPlatformAccessibility *accessibility() const; + virtual QPlatformAccessibility *accessibility() const override; #endif - QVariant styleHint(StyleHint hint) const; - Qt::WindowState defaultWindowState(Qt::WindowFlags flags) const; + QVariant styleHint(StyleHint hint) const override; + Qt::WindowState defaultWindowState(Qt::WindowFlags flags) const override; - QStringList themeNames() const; - QPlatformTheme *createPlatformTheme(const QString &name) const; + QStringList themeNames() const override; + QPlatformTheme *createPlatformTheme(const QString &name) const override; static void setDefaultDisplayMetrics(int gw, int gh, int sw, int sh, int width, int height); static void setDefaultDesktopSize(int gw, int gh); diff --git a/src/plugins/platforms/android/qandroidplatformmenu.h b/src/plugins/platforms/android/qandroidplatformmenu.h index cb1b431d31..00968672c5 100644 --- a/src/plugins/platforms/android/qandroidplatformmenu.h +++ b/src/plugins/platforms/android/qandroidplatformmenu.h @@ -56,25 +56,25 @@ public: QAndroidPlatformMenu(); ~QAndroidPlatformMenu(); - void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before); - void removeMenuItem(QPlatformMenuItem *menuItem); - void syncMenuItem(QPlatformMenuItem *menuItem); - void syncSeparatorsCollapsible(bool enable); + void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before) override; + void removeMenuItem(QPlatformMenuItem *menuItem) override; + void syncMenuItem(QPlatformMenuItem *menuItem) override; + void syncSeparatorsCollapsible(bool enable) override; - void setTag(quintptr tag); - quintptr tag() const; - void setText(const QString &text); + void setTag(quintptr tag) override; + quintptr tag() const override; + void setText(const QString &text) override; QString text() const; - void setIcon(const QIcon &icon); + void setIcon(const QIcon &icon) override; QIcon icon() const; - void setEnabled(bool enabled); - bool isEnabled() const; - void setVisible(bool visible); + void setEnabled(bool enabled) override; + bool isEnabled() const override; + void setVisible(bool visible) override; bool isVisible() const; - void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item); + void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) override; - QPlatformMenuItem *menuItemAt(int position) const; - QPlatformMenuItem *menuItemForTag(quintptr tag) const; + QPlatformMenuItem *menuItemAt(int position) const override; + QPlatformMenuItem *menuItemForTag(quintptr tag) const override; PlatformMenuItemsType menuItems() const; QMutex *menuItemsMutex(); diff --git a/src/plugins/platforms/android/qandroidplatformmenubar.h b/src/plugins/platforms/android/qandroidplatformmenubar.h index d98d02d5de..0316ea9362 100644 --- a/src/plugins/platforms/android/qandroidplatformmenubar.h +++ b/src/plugins/platforms/android/qandroidplatformmenubar.h @@ -55,11 +55,11 @@ public: QAndroidPlatformMenuBar(); ~QAndroidPlatformMenuBar(); - void insertMenu(QPlatformMenu *menu, QPlatformMenu *before); - void removeMenu(QPlatformMenu *menu); - void syncMenu(QPlatformMenu *menu); - void handleReparent(QWindow *newParentWindow); - QPlatformMenu *menuForTag(quintptr tag) const; + void insertMenu(QPlatformMenu *menu, QPlatformMenu *before) override; + void removeMenu(QPlatformMenu *menu) override; + void syncMenu(QPlatformMenu *menu) override; + void handleReparent(QWindow *newParentWindow) override; + QPlatformMenu *menuForTag(quintptr tag) const override; QWindow *parentWindow() const; PlatformMenusType menus() const; diff --git a/src/plugins/platforms/android/qandroidplatformmenuitem.h b/src/plugins/platforms/android/qandroidplatformmenuitem.h index e843c9eedc..be5240cfa6 100644 --- a/src/plugins/platforms/android/qandroidplatformmenuitem.h +++ b/src/plugins/platforms/android/qandroidplatformmenuitem.h @@ -49,41 +49,41 @@ class QAndroidPlatformMenuItem: public QPlatformMenuItem { public: QAndroidPlatformMenuItem(); - void setTag(quintptr tag); - quintptr tag() const; + void setTag(quintptr tag) override; + quintptr tag() const override; - void setText(const QString &text); + void setText(const QString &text) override; QString text() const; - void setIcon(const QIcon &icon); + void setIcon(const QIcon &icon) override; QIcon icon() const; - void setMenu(QPlatformMenu *menu); + void setMenu(QPlatformMenu *menu) override; QAndroidPlatformMenu *menu() const; - void setVisible(bool isVisible); + void setVisible(bool isVisible) override; bool isVisible() const; - void setIsSeparator(bool isSeparator); + void setIsSeparator(bool isSeparator) override; bool isSeparator() const; - void setFont(const QFont &font); + void setFont(const QFont &font) override; - void setRole(MenuRole role); + void setRole(MenuRole role) override; MenuRole role() const; - void setCheckable(bool checkable); + void setCheckable(bool checkable) override; bool isCheckable() const; - void setChecked(bool isChecked); + void setChecked(bool isChecked) override; bool isChecked() const; - void setShortcut(const QKeySequence &shortcut); + void setShortcut(const QKeySequence &shortcut) override; - void setEnabled(bool enabled); + void setEnabled(bool enabled) override; bool isEnabled() const; - void setIconSize(int size); + void setIconSize(int size) override; private: quintptr m_tag; diff --git a/src/plugins/platforms/android/qandroidplatformopenglcontext.h b/src/plugins/platforms/android/qandroidplatformopenglcontext.h index d3f6cf13a4..87a0829655 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglcontext.h +++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.h @@ -49,11 +49,11 @@ class QAndroidPlatformOpenGLContext : public QEGLPlatformContext { public: QAndroidPlatformOpenGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display); - void swapBuffers(QPlatformSurface *surface); - bool makeCurrent(QPlatformSurface *surface); + void swapBuffers(QPlatformSurface *surface) override; + bool makeCurrent(QPlatformSurface *surface) override; private: - virtual EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface); + EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface) override; static bool needsFBOReadBackWorkaround(); }; diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.h b/src/plugins/platforms/android/qandroidplatformopenglwindow.h index c7cb881973..12e86b3db4 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglwindow.h +++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.h @@ -56,18 +56,18 @@ public: explicit QAndroidPlatformOpenGLWindow(QWindow *window, EGLDisplay display); ~QAndroidPlatformOpenGLWindow(); - void setGeometry(const QRect &rect); + void setGeometry(const QRect &rect) override; EGLSurface eglSurface(EGLConfig config); - QSurfaceFormat format() const; + QSurfaceFormat format() const override; bool checkNativeSurface(EGLConfig config); - void applicationStateChanged(Qt::ApplicationState); + void applicationStateChanged(Qt::ApplicationState) override; void repaint(const QRegion ®ion) Q_DECL_OVERRIDE; protected: - virtual void surfaceChanged(JNIEnv *jniEnv, jobject surface, int w, int h); + void surfaceChanged(JNIEnv *jniEnv, jobject surface, int w, int h) override; void createEgl(EGLConfig config); void clearEgl(); diff --git a/src/plugins/platforms/android/qandroidplatformscreen.h b/src/plugins/platforms/android/qandroidplatformscreen.h index 6e601d5f87..923c9e8832 100644 --- a/src/plugins/platforms/android/qandroidplatformscreen.h +++ b/src/plugins/platforms/android/qandroidplatformscreen.h @@ -63,14 +63,14 @@ public: QAndroidPlatformScreen(); ~QAndroidPlatformScreen(); - QRect geometry() const { return QRect(QPoint(), m_size); } - QRect availableGeometry() const { return m_availableGeometry; } - int depth() const { return m_depth; } - QImage::Format format() const { return m_format; } - QSizeF physicalSize() const { return m_physicalSize; } + QRect geometry() const override { return QRect(QPoint(), m_size); } + QRect availableGeometry() const override { return m_availableGeometry; } + int depth() const override { return m_depth; } + QImage::Format format() const override { return m_format; } + QSizeF physicalSize() const override { return m_physicalSize; } inline QWindow *topWindow() const; - QWindow *topLevelAt(const QPoint & p) const; + QWindow *topLevelAt(const QPoint & p) const override; // compositor api void addWindow(QAndroidPlatformWindow *window); @@ -100,11 +100,11 @@ protected: QSizeF m_physicalSize; private: - QDpi logicalDpi() const; - qreal pixelDensity() const; - Qt::ScreenOrientation orientation() const; - Qt::ScreenOrientation nativeOrientation() const; - void surfaceChanged(JNIEnv *env, jobject surface, int w, int h); + QDpi logicalDpi() const override; + qreal pixelDensity() const override; + Qt::ScreenOrientation orientation() const override; + Qt::ScreenOrientation nativeOrientation() const override; + void surfaceChanged(JNIEnv *env, jobject surface, int w, int h) override; void releaseSurface(); void applicationStateChanged(Qt::ApplicationState); diff --git a/src/plugins/platforms/android/qandroidplatformservices.h b/src/plugins/platforms/android/qandroidplatformservices.h index 5cdc3e95b2..6f2f0a394f 100644 --- a/src/plugins/platforms/android/qandroidplatformservices.h +++ b/src/plugins/platforms/android/qandroidplatformservices.h @@ -49,9 +49,9 @@ class QAndroidPlatformServices: public QPlatformServices { public: QAndroidPlatformServices(); - bool openUrl(const QUrl &url); - bool openDocument(const QUrl &url); - QByteArray desktopEnvironment() const; + bool openUrl(const QUrl &url) override; + bool openDocument(const QUrl &url) override; + QByteArray desktopEnvironment() const override; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/android/qandroidplatformtheme.h b/src/plugins/platforms/android/qandroidplatformtheme.h index b4d8fa35b1..7405c3cdbd 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.h +++ b/src/plugins/platforms/android/qandroidplatformtheme.h @@ -65,16 +65,16 @@ class QAndroidPlatformTheme: public QPlatformTheme { public: QAndroidPlatformTheme(QAndroidPlatformNativeInterface * androidPlatformNativeInterface); - virtual QPlatformMenuBar *createPlatformMenuBar() const; - virtual QPlatformMenu *createPlatformMenu() const; - virtual QPlatformMenuItem *createPlatformMenuItem() const; - virtual void showPlatformMenuBar(); - virtual const QPalette *palette(Palette type = SystemPalette) const; - virtual const QFont *font(Font type = SystemFont) const; - virtual QVariant themeHint(ThemeHint hint) const; + QPlatformMenuBar *createPlatformMenuBar() const override; + QPlatformMenu *createPlatformMenu() const override; + QPlatformMenuItem *createPlatformMenuItem() const override; + void showPlatformMenuBar() override; + const QPalette *palette(Palette type = SystemPalette) const override; + const QFont *font(Font type = SystemFont) const override; + QVariant themeHint(ThemeHint hint) const override; QString standardButtonText(int button) const Q_DECL_OVERRIDE; - virtual bool usePlatformNativeDialog(DialogType type) const; - virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const; + bool usePlatformNativeDialog(DialogType type) const override; + QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const override; private: diff --git a/src/plugins/platforms/android/qandroidplatformwindow.h b/src/plugins/platforms/android/qandroidplatformwindow.h index 8d69532d08..87e5cbaa4f 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.h +++ b/src/plugins/platforms/android/qandroidplatformwindow.h @@ -54,21 +54,21 @@ class QAndroidPlatformWindow: public QPlatformWindow public: explicit QAndroidPlatformWindow(QWindow *window); - void lower(); - void raise(); + void lower() override; + void raise() override; - void setVisible(bool visible); + void setVisible(bool visible) override; - void setWindowState(Qt::WindowState state); - void setWindowFlags(Qt::WindowFlags flags); + void setWindowState(Qt::WindowState state) override; + void setWindowFlags(Qt::WindowFlags flags) override; Qt::WindowFlags windowFlags() const; - void setParent(const QPlatformWindow *window); - WId winId() const { return m_windowId; } + void setParent(const QPlatformWindow *window) override; + WId winId() const override { return m_windowId; } QAndroidPlatformScreen *platformScreen() const; - void propagateSizeHints(); - void requestActivateWindow(); + void propagateSizeHints() override; + void requestActivateWindow() override; void updateStatusBarVisibility(); inline bool isRaster() const { if ((window()->flags() & Qt::ForeignWindow) == Qt::ForeignWindow) @@ -77,7 +77,7 @@ public: return window()->surfaceType() == QSurface::RasterSurface || window()->surfaceType() == QSurface::RasterGLSurface; } - bool isExposed() const; + bool isExposed() const override; virtual void applicationStateChanged(Qt::ApplicationState); @@ -87,7 +87,7 @@ public: virtual void repaint(const QRegion &) { } protected: - void setGeometry(const QRect &rect); + void setGeometry(const QRect &rect) override; protected: Qt::WindowFlags m_windowFlags; diff --git a/src/plugins/platforms/android/qandroidsystemlocale.h b/src/plugins/platforms/android/qandroidsystemlocale.h index 26af1ee51d..bc96d2e8f6 100644 --- a/src/plugins/platforms/android/qandroidsystemlocale.h +++ b/src/plugins/platforms/android/qandroidsystemlocale.h @@ -50,8 +50,8 @@ class QAndroidSystemLocale : public QSystemLocale public: QAndroidSystemLocale(); - virtual QVariant query(QueryType type, QVariant in) const; - virtual QLocale fallbackUiLocale() const; + QVariant query(QueryType type, QVariant in) const override; + QLocale fallbackUiLocale() const override; private: void getLocaleFromJava() const; From 4c375f75e0ed38d297dc44746e2e00f34f98269b Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Tue, 29 Nov 2016 14:23:34 +0300 Subject: [PATCH 107/174] Android: Use override instead of Q_DECL_OVERRIDE ... for consistency. Change-Id: I37afaff6f7512a1cd09f0f31996b9bedc6cb3bab Reviewed-by: BogDan Vatra --- .../android/qandroidplatformforeignwindow.h | 12 ++++++------ .../platforms/android/qandroidplatformopenglwindow.h | 2 +- .../platforms/android/qandroidplatformtheme.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugins/platforms/android/qandroidplatformforeignwindow.h b/src/plugins/platforms/android/qandroidplatformforeignwindow.h index 100e0adcdf..d42c36dcee 100644 --- a/src/plugins/platforms/android/qandroidplatformforeignwindow.h +++ b/src/plugins/platforms/android/qandroidplatformforeignwindow.h @@ -51,12 +51,12 @@ class QAndroidPlatformForeignWindow : public QAndroidPlatformWindow public: explicit QAndroidPlatformForeignWindow(QWindow *window); ~QAndroidPlatformForeignWindow(); - void lower() Q_DECL_OVERRIDE; - void raise() Q_DECL_OVERRIDE; - void setGeometry(const QRect &rect) Q_DECL_OVERRIDE; - void setVisible(bool visible) Q_DECL_OVERRIDE; - void applicationStateChanged(Qt::ApplicationState state) Q_DECL_OVERRIDE; - void setParent(const QPlatformWindow *window) Q_DECL_OVERRIDE; + void lower() override; + void raise() override; + void setGeometry(const QRect &rect) override; + void setVisible(bool visible) override; + void applicationStateChanged(Qt::ApplicationState state) override; + void setParent(const QPlatformWindow *window) override; private: int m_surfaceId; diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.h b/src/plugins/platforms/android/qandroidplatformopenglwindow.h index 12e86b3db4..d3072f766d 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglwindow.h +++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.h @@ -64,7 +64,7 @@ public: void applicationStateChanged(Qt::ApplicationState) override; - void repaint(const QRegion ®ion) Q_DECL_OVERRIDE; + void repaint(const QRegion ®ion) override; protected: void surfaceChanged(JNIEnv *jniEnv, jobject surface, int w, int h) override; diff --git a/src/plugins/platforms/android/qandroidplatformtheme.h b/src/plugins/platforms/android/qandroidplatformtheme.h index 7405c3cdbd..b49d2516f1 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.h +++ b/src/plugins/platforms/android/qandroidplatformtheme.h @@ -72,7 +72,7 @@ public: const QPalette *palette(Palette type = SystemPalette) const override; const QFont *font(Font type = SystemFont) const override; QVariant themeHint(ThemeHint hint) const override; - QString standardButtonText(int button) const Q_DECL_OVERRIDE; + QString standardButtonText(int button) const override; bool usePlatformNativeDialog(DialogType type) const override; QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const override; From 1155ca10f8e329d253f7dd58dad396321116798c Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 23 Nov 2016 11:13:48 +0100 Subject: [PATCH 108/174] QSettings: Avoid unneeded sync() on destruction ... if sync() has already been called manually. Change-Id: I11bd6810aa3c1065a72ffaa2001d1bdbf8bf9c89 Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- src/corelib/io/qsettings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index 480a777457..8c67d97afa 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -2705,6 +2705,7 @@ void QSettings::sync() { Q_D(QSettings); d->sync(); + d->pendingChanges = false; } /*! From 94b83ae14201e9c28b9f4817ee020814300860aa Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 25 Nov 2016 18:29:49 +0100 Subject: [PATCH 109/174] Fix bilinear sampling of more than 8x rotated transforms The check for 8x zoom was inverted and checked for 1/8x zoom. Change-Id: I45156db709bab6b702769c2a70d4d2af51b5533a Reviewed-by: Eirik Aavitsland Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/gui/painting/qdrawhelper.cpp | 4 ++-- tests/auto/other/lancelot/scripts/pixmap_rotation.qps | 5 +++-- tests/auto/other/lancelot/scripts/pixmap_rotation2.qps | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 tests/auto/other/lancelot/scripts/pixmap_rotation2.qps diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 656b04fdf3..724af095ad 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -2231,7 +2231,7 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c } } } else { //rotation - if (std::abs(data->m11) > 8 || std::abs(data->m22) > 8) { + if (std::abs(data->m11) < (1./8.) || std::abs(data->m22) < (1./8.)) { //if we are zooming more than 8 times, we use 8bit precision for the position. while (b < end) { int x1 = (fx >> 16); @@ -2717,7 +2717,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper layout->convertToARGB32PM(buf1, buf1, len * 2, clut, 0); layout->convertToARGB32PM(buf2, buf2, len * 2, clut, 0); - if (std::abs(data->m11) > 8 || std::abs(data->m22) > 8) { + if (std::abs(data->m11) < (1./8.) || std::abs(data->m22) < (1./8.)) { //if we are zooming more than 8 times, we use 8bit precision for the position. for (int i = 0; i < len; ++i) { int distx = (fracX & 0x0000ffff) >> 8; diff --git a/tests/auto/other/lancelot/scripts/pixmap_rotation.qps b/tests/auto/other/lancelot/scripts/pixmap_rotation.qps index 2f1ffb53e6..8427af85af 100644 --- a/tests/auto/other/lancelot/scripts/pixmap_rotation.qps +++ b/tests/auto/other/lancelot/scripts/pixmap_rotation.qps @@ -22,9 +22,10 @@ end_block resetMatrix translate 340 120 +setRenderHint SmoothPixmapTransformation repeat_block drawing resetMatrix -drawText 50 240 "Normal X form" -drawText 270 240 "Smooth xform" \ No newline at end of file +drawText 50 240 "Normal Xform" +drawText 270 240 "Smooth Xform" diff --git a/tests/auto/other/lancelot/scripts/pixmap_rotation2.qps b/tests/auto/other/lancelot/scripts/pixmap_rotation2.qps new file mode 100644 index 0000000000..dfb93fe09c --- /dev/null +++ b/tests/auto/other/lancelot/scripts/pixmap_rotation2.qps @@ -0,0 +1,8 @@ +# Version: 1 +# CheckVsReference: 1% + +setRenderHint SmoothPixmapTransformation +translate 400 -120 +rotate 45 +scale 400 400 +drawImage solid2x2.png 0 0 From c1093e2d2adc0963a6853b84dc8c34c3333c6f6e Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 29 Nov 2016 15:17:57 +0100 Subject: [PATCH 110/174] Tweak wording of QNetworkProxy doc for SOCKS5 It was phrased for an out-of-date version of Qt. Adapt phrasing to be future-proof. Reflow text. Change-Id: Ic026a7719ba6fb1de2830358a75cd6f30c5f8897 Reviewed-by: Timur Pocheptsov Reviewed-by: Thiago Macieira --- src/network/kernel/qnetworkproxy.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp index 94719e9c2d..ce491e0fcb 100644 --- a/src/network/kernel/qnetworkproxy.cpp +++ b/src/network/kernel/qnetworkproxy.cpp @@ -82,7 +82,9 @@ \section1 SOCKS5 - The SOCKS5 support in Qt 4 is based on \l{http://www.rfc-editor.org/rfc/rfc1928.txt}{RFC 1928} and \l{http://www.rfc-editor.org/rfc/rfc1929.txt}{RFC 1929}. + The SOCKS5 support since Qt 4 is based on + \l{http://www.rfc-editor.org/rfc/rfc1928.txt}{RFC 1928} and + \l{http://www.rfc-editor.org/rfc/rfc1929.txt}{RFC 1929}. The supported authentication methods are no authentication and username/password authentication. Both IPv4 and IPv6 are supported. Domain names are resolved through the SOCKS5 server if From 6aa2d49d5f98d8e23a32555a45c58dc4c7c4bb69 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 25 Nov 2016 09:50:13 +0100 Subject: [PATCH 111/174] tst_qchar: Silence deprecation warning Change-Id: I248d815862a4172ceae6ba45391cba0a30b8e1ae Reviewed-by: Marc Mutz --- tests/auto/corelib/tools/qchar/tst_qchar.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/auto/corelib/tools/qchar/tst_qchar.cpp b/tests/auto/corelib/tools/qchar/tst_qchar.cpp index 92585fd471..fb436b67d6 100644 --- a/tests/auto/corelib/tools/qchar/tst_qchar.cpp +++ b/tests/auto/corelib/tools/qchar/tst_qchar.cpp @@ -72,6 +72,9 @@ private slots: void unicodeVersion(); }; +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED + void tst_QChar::operator_eqeq_int() { { @@ -96,6 +99,8 @@ void tst_QChar::operator_eqeq_int() } } +QT_WARNING_POP + void tst_QChar::operators_data() { QTest::addColumn("lhs"); From 1e303601a7355fb8282f0fcc3a8c4e86de944448 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 29 Nov 2016 12:38:51 +0100 Subject: [PATCH 112/174] Fix warnings in tests (MinGW/MSCV) tst_qtcpsocket.cpp:606:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] tst_qtcpsocket.cpp:670:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] tst_qfile.cpp(2661): warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) tst_qarraydata.cpp(760): warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) main.cpp:40:33: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result] Change-Id: I80ccef29b71af6a2c3d45a79aedaeb37f49bba72 Reviewed-by: Marc Mutz Reviewed-by: Frederik Gladhorn --- tests/auto/corelib/io/qfile/tst_qfile.cpp | 5 +++-- tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp | 4 ++-- tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp | 4 ++-- .../qprocess_and_guieventloop/write-read-write/main.cpp | 4 +++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp index 287b8aebd8..2ef4c2c6a1 100644 --- a/tests/auto/corelib/io/qfile/tst_qfile.cpp +++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp @@ -2618,9 +2618,10 @@ void tst_QFile::appendAndRead() // Write blocks and read them back for (int j = 0; j < 18; ++j) { - writeFile.write(QByteArray(1 << j, '@')); + const int size = 1 << j; + writeFile.write(QByteArray(size, '@')); writeFile.flush(); - QCOMPARE(readFile.read(1 << j).size(), 1 << j); + QCOMPARE(readFile.read(size).size(), size); } readFile.close(); diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index 0c41f66357..3be8379d29 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -751,8 +751,8 @@ void tst_QArrayData::alignment_data() { QTest::addColumn("alignment"); - for (int i = 1; i < 10; ++i) { - size_t alignment = 1u << i; + for (size_t i = 1; i < 10; ++i) { + size_t alignment = size_t(1u) << i; QTest::newRow(qPrintable(QString::number(alignment))) << alignment; } } diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp index fe1057bdde..9fd5620cec 100644 --- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp +++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp @@ -603,7 +603,7 @@ void tst_QTcpSocket::bind() if (port) QCOMPARE(int(boundPort), port); fd = socket->socketDescriptor(); - QVERIFY(fd != INVALID_SOCKET); + QVERIFY(fd != qintptr(INVALID_SOCKET)); } else { QVERIFY(!socket->bind(addr, port)); QCOMPARE(socket->localPort(), quint16(0)); @@ -667,7 +667,7 @@ void tst_QTcpSocket::bindThenResolveHost() QCOMPARE(socket->state(), QAbstractSocket::BoundState); quint16 boundPort = socket->localPort(); qintptr fd = socket->socketDescriptor(); - QVERIFY(fd != INVALID_SOCKET); + QVERIFY(fd != quint16(INVALID_SOCKET)); dummySocket.close(); diff --git a/tests/auto/other/qprocess_and_guieventloop/write-read-write/main.cpp b/tests/auto/other/qprocess_and_guieventloop/write-read-write/main.cpp index 46002dd326..5e75f7db3c 100644 --- a/tests/auto/other/qprocess_and_guieventloop/write-read-write/main.cpp +++ b/tests/auto/other/qprocess_and_guieventloop/write-read-write/main.cpp @@ -37,7 +37,9 @@ int main(int, char **argv) fflush(stdout); // wait for a newline - fgets(buf, sizeof buf, stdin); + const char *result = fgets(buf, sizeof buf, stdin); + if (result != buf) + return -1; puts(msg); fflush(stdout); From 0c8f3229de8ec4a8e70d4b41672074b94a45b1fe Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 18 Nov 2016 12:57:53 +0100 Subject: [PATCH 113/174] Clean up config handling of logging backends Turn them into proper private features, and remove setting of defines in the pri file. Change-Id: Iafc11e93d4a9349bf15971dc1adac9a828ea03f6 Reviewed-by: Oswald Buddenhagen --- src/corelib/configure.json | 7 +++---- src/corelib/global/global.pri | 12 ++---------- src/corelib/global/qconfig-bootstrapped.h | 3 +++ src/corelib/global/qlogging.cpp | 23 ++++++++++++----------- 4 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 0d1954c3a8..89f824d880 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -289,7 +289,7 @@ "label": "journald", "autoDetect": false, "condition": "libs.journald", - "output": [ "privateConfig" ] + "output": [ "privateFeature" ] }, "std-atomic64": { "label": "64 bit atomic operations", @@ -363,14 +363,13 @@ "slog2": { "label": "slog2", "condition": "libs.slog2", - "emitIf": "config.qnx", - "output": [ "privateConfig" ] + "output": [ "privateFeature" ] }, "syslog": { "label": "syslog", "autoDetect": false, "condition": "tests.syslog", - "output": [ "privateConfig" ] + "output": [ "privateFeature" ] }, "threadsafe-cloexec": { "label": "Threadsafe pipe creation", diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri index f74662b464..36655ca1dd 100644 --- a/src/corelib/global/global.pri +++ b/src/corelib/global/global.pri @@ -47,19 +47,11 @@ if(linux*|hurd*):!cross_compile:!static:!*-armcc* { DEFINES += ELF_INTERPRETER=\\\"$$system(LC_ALL=C readelf -l /bin/ls | perl -n -e \'$$prog\')\\\" } -slog2 { +qtConfig(slog2): \ LIBS_PRIVATE += -lslog2 - DEFINES += QT_USE_SLOG2 -} -journald { +qtConfig(journald): \ QMAKE_USE_PRIVATE += journald - DEFINES += QT_USE_JOURNALD -} - -syslog { - DEFINES += QT_USE_SYSLOG -} gcc:ltcg { versiontagging_compiler.commands = $$QMAKE_CXX -c $(CXXFLAGS) $(INCPATH) diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h index 4629a57485..0cbd52c205 100644 --- a/src/corelib/global/qconfig-bootstrapped.h +++ b/src/corelib/global/qconfig-bootstrapped.h @@ -69,10 +69,13 @@ #define QT_CRYPTOGRAPHICHASH_ONLY_SHA1 #define QT_NO_DATASTREAM #define QT_FEATURE_iconv -1 +#define QT_FEATURE_journald -1 #define QT_NO_LIBRARY #define QT_FEATURE_library -1 #define QT_NO_QOBJECT #define QT_NO_SYSTEMLOCALE +#define QT_FEATURE_slog2 -1 +#define QT_FEATURE_syslog -1 #define QT_NO_THREAD #define QT_FEATURE_timezone -1 #define QT_FEATURE_topleveldomain -1 diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index f344873276..0506d372b6 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -39,6 +39,7 @@ ** ****************************************************************************/ +#include "qglobal_p.h" #include "qlogging.h" #include "qlist.h" #include "qbytearray.h" @@ -59,7 +60,7 @@ #ifdef Q_OS_WIN #include #endif -#ifdef QT_USE_SLOG2 +#if QT_CONFIG(slog2) #include #endif @@ -67,12 +68,12 @@ #include #endif -#if defined(QT_USE_JOURNALD) && !defined(QT_BOOTSTRAPPED) +#if QT_CONFIG(journald) # define SD_JOURNAL_SUPPRESS_LOCATION # include # include #endif -#if defined(QT_USE_SYSLOG) && !defined(QT_BOOTSTRAPPED) +#if QT_CONFIG(syslog) # include #endif #ifdef Q_OS_UNIX @@ -93,7 +94,7 @@ # endif #endif -#if defined(QT_USE_SLOG2) +#if QT_CONFIG(slog2) extern char *__progname; #endif @@ -1281,7 +1282,7 @@ static QString formatBacktraceForLogMessage(const QMessagePattern::BacktracePara } #endif // QLOGGING_HAVE_BACKTRACE && !QT_BOOTSTRAPPED -#if defined(QT_USE_SLOG2) +#if QT_CONFIG(slog2) #ifndef QT_LOG_CODE #define QT_LOG_CODE 9000 #endif @@ -1330,7 +1331,7 @@ static void slog2_default_handler(QtMsgType msgType, const char *message) //writes to the slog2 buffer slog2c(NULL, QT_LOG_CODE, severity, message); } -#endif // QT_USE_SLOG2 +#endif // slog2 Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern) @@ -1479,7 +1480,7 @@ static QBasicAtomicPointer msgHandler = Q_BASIC_A // pointer to QtMessageHandler debug handler (with context) static QBasicAtomicPointer messageHandler = Q_BASIC_ATOMIC_INITIALIZER(qDefaultMessageHandler); -#if defined(QT_USE_JOURNALD) && !defined(QT_BOOTSTRAPPED) +#if QT_CONFIG(journald) static void systemd_default_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &message) @@ -1513,7 +1514,7 @@ static void systemd_default_message_handler(QtMsgType type, } #endif -#ifdef QT_USE_SYSLOG +#if QT_CONFIG(syslog) static void syslog_default_message_handler(QtMsgType type, const char *message) { int priority = LOG_INFO; // Informational @@ -1577,14 +1578,14 @@ static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &con logMessage.append(QLatin1Char('\n')); OutputDebugString(reinterpret_cast(logMessage.utf16())); return; -#elif defined(QT_USE_SLOG2) +#elif QT_CONFIG(slog2) logMessage.append(QLatin1Char('\n')); slog2_default_handler(type, logMessage.toLocal8Bit().constData()); return; -#elif defined(QT_USE_JOURNALD) && !defined(QT_BOOTSTRAPPED) +#elif QT_CONFIG(journald) systemd_default_message_handler(type, context, logMessage); return; -#elif defined(QT_USE_SYSLOG) && !defined(QT_BOOTSTRAPPED) +#elif QT_CONFIG(syslog) syslog_default_message_handler(type, logMessage.toUtf8().constData()); return; #elif defined(Q_OS_ANDROID) From e3555fe9705a44072a05b95cca36579745e14125 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 18 Nov 2016 13:32:19 +0100 Subject: [PATCH 114/174] Properly use QT_CONFIG macro to check for ICU And remove the QT_USE_ICU define. Change-Id: I8134ee18af7c90ed7070926ca31b3a57b3ec37dd Reviewed-by: Oswald Buddenhagen --- src/corelib/codecs/qtextcodec.cpp | 18 +++++++++--------- src/corelib/global/qconfig-bootstrapped.h | 1 + src/corelib/tools/qcollator_p.h | 6 +++--- src/corelib/tools/qlocale.cpp | 4 ++-- src/corelib/tools/qlocale_p.h | 2 +- src/corelib/tools/qstring.cpp | 4 ++-- src/corelib/tools/qtimezone.cpp | 12 ++++++------ src/corelib/tools/qtimezoneprivate.cpp | 2 +- src/corelib/tools/qtimezoneprivate_p.h | 12 ++++++------ src/corelib/tools/qtimezoneprivate_tz.cpp | 20 ++++++++++---------- src/corelib/tools/tools.pri | 1 - 11 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index 0c9036aadf..aed3532024 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -58,7 +58,7 @@ #if !defined(QT_BOOTSTRAPPED) # include "qtsciicodec_p.h" # include "qisciicodec_p.h" -#if defined(QT_USE_ICU) +#if QT_CONFIG(icu) #include "qicucodec_p.h" #else #if QT_CONFIG(iconv) @@ -79,7 +79,7 @@ # endif // !Q_OS_INTEGRITY #endif // !QT_NO_BIG_CODECS -#endif // QT_USE_ICU +#endif // icu #endif // QT_BOOTSTRAPPED #include "qmutex.h" @@ -99,7 +99,7 @@ typedef QList::ConstIterator ByteArrayListConstIt; Q_GLOBAL_STATIC_WITH_ARGS(QMutex, textCodecsMutex, (QMutex::Recursive)); QMutex *qTextCodecsMutex() { return textCodecsMutex(); } -#if !defined(QT_USE_ICU) +#if !QT_CONFIG(icu) static char qtolower(char c) { if (c >= 'A' && c <= 'Z') return c + 0x20; return c; } static bool qisalnum(char c) @@ -306,7 +306,7 @@ static void setup() } #else static void setup() {} -#endif // QT_USE_ICU +#endif // icu /*! \enum QTextCodec::ConversionFlag @@ -519,7 +519,7 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name) return 0; setup(); -#ifndef QT_USE_ICU +#if !QT_CONFIG(icu) QTextCodecCache *cache = &globalData->codecCache; QTextCodec *codec; if (cache) { @@ -586,7 +586,7 @@ QTextCodec* QTextCodec::codecForMib(int mib) } } -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) return QIcuCodec::codecForMibUnlocked(mib); #else return 0; @@ -618,7 +618,7 @@ QList QTextCodec::availableCodecs() codecs += (*it)->aliases(); } -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) codecs += QIcuCodec::availableCodecs(); #endif @@ -634,7 +634,7 @@ QList QTextCodec::availableCodecs() */ QList QTextCodec::availableMibs() { -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) return QIcuCodec::availableMibs(); #else QMutexLocker locker(textCodecsMutex()); @@ -688,7 +688,7 @@ QTextCodec* QTextCodec::codecForLocale() QTextCodec *codec = globalData->codecForLocale.loadAcquire(); if (!codec) { -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) textCodecsMutex()->lock(); codec = QIcuCodec::defaultCodecUnlocked(); textCodecsMutex()->unlock(); diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h index 0cbd52c205..d0e45478cc 100644 --- a/src/corelib/global/qconfig-bootstrapped.h +++ b/src/corelib/global/qconfig-bootstrapped.h @@ -69,6 +69,7 @@ #define QT_CRYPTOGRAPHICHASH_ONLY_SHA1 #define QT_NO_DATASTREAM #define QT_FEATURE_iconv -1 +#define QT_FEATURE_icu -1 #define QT_FEATURE_journald -1 #define QT_NO_LIBRARY #define QT_FEATURE_library -1 diff --git a/src/corelib/tools/qcollator_p.h b/src/corelib/tools/qcollator_p.h index fbbce00676..423ba0325a 100644 --- a/src/corelib/tools/qcollator_p.h +++ b/src/corelib/tools/qcollator_p.h @@ -55,7 +55,7 @@ #include #include "qcollator.h" #include -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) #include #elif defined(Q_OS_OSX) #include @@ -65,7 +65,7 @@ QT_BEGIN_NAMESPACE -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) typedef UCollator *CollatorType; typedef QByteArray CollatorKeyType; @@ -90,7 +90,7 @@ class Q_CORE_EXPORT QCollatorPrivate public: QAtomicInt ref; QLocale locale; -#if defined(Q_OS_WIN) && !defined(QT_USE_ICU) +#if defined(Q_OS_WIN) && !QT_CONFIG(icu) #ifdef USE_COMPARESTRINGEX QString localeName; #else diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index 847fc2d55e..f499681ca9 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -2431,7 +2431,7 @@ Qt::LayoutDirection QLocale::textDirection() const */ QString QLocale::toUpper(const QString &str) const { -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) bool ok = true; QString result = QIcu::toUpper(d->bcp47Name('_'), str, &ok); if (ok) @@ -2455,7 +2455,7 @@ QString QLocale::toUpper(const QString &str) const */ QString QLocale::toLower(const QString &str) const { -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) bool ok = true; const QString result = QIcu::toLower(d->bcp47Name('_'), str, &ok); if (ok) diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h index c83c9d3333..20eff8fd64 100644 --- a/src/corelib/tools/qlocale_p.h +++ b/src/corelib/tools/qlocale_p.h @@ -134,7 +134,7 @@ Q_DECLARE_TYPEINFO(QSystemLocale::QueryType, Q_PRIMITIVE_TYPE); Q_DECLARE_TYPEINFO(QSystemLocale::CurrencyToStringArgument, Q_MOVABLE_TYPE); #endif -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) namespace QIcu { QString toUpper(const QByteArray &localeId, const QString &str, bool *ok); QString toLower(const QByteArray &localeId, const QString &str, bool *ok); diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index eef375fe72..8888eced87 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -5575,7 +5575,7 @@ int QString::localeAwareCompare(const QString &other) const return localeAwareCompare_helper(constData(), length(), other.constData(), other.length()); } -#if defined(QT_USE_ICU) && !defined(Q_OS_WIN32) && !defined(Q_OS_DARWIN) +#if QT_CONFIG(icu) && !defined(Q_OS_WIN32) && !defined(Q_OS_DARWIN) Q_GLOBAL_STATIC(QThreadStorage, defaultCollator) #endif @@ -5621,7 +5621,7 @@ int QString::localeAwareCompare_helper(const QChar *data1, int length1, CFRelease(thisString); CFRelease(otherString); return result; -#elif defined(QT_USE_ICU) +#elif QT_CONFIG(icu) if (!defaultCollator()->hasLocalData()) defaultCollator()->setLocalData(QCollator()); return defaultCollator()->localData().compare(data1, length1, data2, length2); diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp index e423d9af0c..359c2d0bdb 100644 --- a/src/corelib/tools/qtimezone.cpp +++ b/src/corelib/tools/qtimezone.cpp @@ -54,11 +54,11 @@ QT_BEGIN_NAMESPACE static QTimeZonePrivate *newBackendTimeZone() { #ifdef QT_NO_SYSTEMLOCALE -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) return new QIcuTimeZonePrivate(); #else return new QUtcTimeZonePrivate(); -#endif // QT_USE_ICU +#endif #else #if defined Q_OS_MAC return new QMacTimeZonePrivate(); @@ -69,7 +69,7 @@ static QTimeZonePrivate *newBackendTimeZone() // Registry based timezone backend not available on WinRT #elif defined Q_OS_WIN return new QWinTimeZonePrivate(); -#elif defined QT_USE_ICU +#elif QT_CONFIG(icu) return new QIcuTimeZonePrivate(); #else return new QUtcTimeZonePrivate(); @@ -81,11 +81,11 @@ static QTimeZonePrivate *newBackendTimeZone() static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId) { #ifdef QT_NO_SYSTEMLOCALE -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) return new QIcuTimeZonePrivate(ianaId); #else return new QUtcTimeZonePrivate(ianaId); -#endif // QT_USE_ICU +#endif #else #if defined Q_OS_MAC return new QMacTimeZonePrivate(ianaId); @@ -96,7 +96,7 @@ static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId) // Registry based timezone backend not available on WinRT #elif defined Q_OS_WIN return new QWinTimeZonePrivate(ianaId); -#elif defined QT_USE_ICU +#elif QT_CONFIG(icu) return new QIcuTimeZonePrivate(ianaId); #else return new QUtcTimeZonePrivate(ianaId); diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp index 56da197542..2ff03eddec 100644 --- a/src/corelib/tools/qtimezoneprivate.cpp +++ b/src/corelib/tools/qtimezoneprivate.cpp @@ -590,7 +590,7 @@ template<> QTimeZonePrivate *QSharedDataPointer::clone() } /* - UTC Offset implementation, used when QT_NO_SYSTEMLOCALE set and QT_USE_ICU not set, + UTC Offset implementation, used when QT_NO_SYSTEMLOCALE set and ICU is not being used, or for QDateTimes with a Qt:Spec of Qt::OffsetFromUtc. */ diff --git a/src/corelib/tools/qtimezoneprivate_p.h b/src/corelib/tools/qtimezoneprivate_p.h index d7fbb12344..d06784b0f9 100644 --- a/src/corelib/tools/qtimezoneprivate_p.h +++ b/src/corelib/tools/qtimezoneprivate_p.h @@ -56,9 +56,9 @@ #include "qlocale_p.h" #include "qvector.h" -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) #include -#endif // QT_USE_ICU +#endif #ifdef Q_OS_MAC #ifdef __OBJC__ @@ -227,7 +227,7 @@ private: int m_offsetFromUtc; }; -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate Q_DECL_FINAL : public QTimeZonePrivate { public: @@ -268,7 +268,7 @@ private: UCalendar *m_ucal; }; -#endif // QT_USE_ICU +#endif #if defined Q_OS_UNIX && !defined Q_OS_MAC && !defined Q_OS_ANDROID struct QTzTransitionTime @@ -337,9 +337,9 @@ private: QVector m_tranTimes; QVector m_tranRules; QList m_abbreviations; -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) mutable QSharedDataPointer m_icu; -#endif // QT_USE_ICU +#endif QByteArray m_posixRule; }; #endif // Q_OS_UNIX diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp index 96d04df0e2..10b61c3a40 100644 --- a/src/corelib/tools/qtimezoneprivate_tz.cpp +++ b/src/corelib/tools/qtimezoneprivate_tz.cpp @@ -598,18 +598,18 @@ static QVector calculatePosixTransitions(const QByteArra // Create the system default time zone QTzTimeZonePrivate::QTzTimeZonePrivate() -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) : m_icu(0) -#endif // QT_USE_ICU +#endif { init(systemTimeZoneId()); } // Create a named time zone QTzTimeZonePrivate::QTzTimeZonePrivate(const QByteArray &ianaId) -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) : m_icu(0) -#endif // QT_USE_ICU +#endif { init(ianaId); } @@ -617,9 +617,9 @@ QTzTimeZonePrivate::QTzTimeZonePrivate(const QByteArray &ianaId) QTzTimeZonePrivate::QTzTimeZonePrivate(const QTzTimeZonePrivate &other) : QTimeZonePrivate(other), m_tranTimes(other.m_tranTimes), m_tranRules(other.m_tranRules), m_abbreviations(other.m_abbreviations), -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) m_icu(other.m_icu), -#endif // QT_USE_ICU +#endif m_posixRule(other.m_posixRule) { } @@ -778,7 +778,7 @@ QString QTzTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch, QTimeZone::NameType nameType, const QLocale &locale) const { -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) if (!m_icu) m_icu = new QIcuTimeZonePrivate(m_id); // TODO small risk may not match if tran times differ due to outdated files @@ -788,7 +788,7 @@ QString QTzTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch, #else Q_UNUSED(nameType) Q_UNUSED(locale) -#endif // QT_USE_ICU +#endif return abbreviation(atMSecsSinceEpoch); } @@ -796,7 +796,7 @@ QString QTzTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, const QLocale &locale) const { -#ifdef QT_USE_ICU +#if QT_CONFIG(icu) if (!m_icu) m_icu = new QIcuTimeZonePrivate(m_id); // TODO small risk may not match if tran times differ due to outdated files @@ -807,7 +807,7 @@ QString QTzTimeZonePrivate::displayName(QTimeZone::TimeType timeType, Q_UNUSED(timeType) Q_UNUSED(nameType) Q_UNUSED(locale) -#endif // QT_USE_ICU +#endif // If no ICU available then have to use abbreviations instead // Abbreviations don't have GenericTime if (timeType == QTimeZone::GenericTime) diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index fb80bbd6b8..fa8e07abbc 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -144,7 +144,6 @@ qtConfig(icu) { SOURCES += tools/qlocale_icu.cpp \ tools/qcollator_icu.cpp - DEFINES += QT_USE_ICU } else: win32 { SOURCES += tools/qcollator_win.cpp } else: macx { From 7d12ef183ee6b7909c451a3042ecf8b1fc20f87f Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 18 Nov 2016 14:10:35 +0100 Subject: [PATCH 115/174] Clean up style selection code Turn styles into proper features and test for them using qtConfig/QT_CONFIG. Change-Id: I7e28785a46723364b90d8aa286f4d6e5ab085651 Reviewed-by: Oswald Buddenhagen --- src/widgets/configure.json | 12 ++-- src/widgets/dialogs/qwizard.cpp | 55 ++++++++++--------- src/widgets/dialogs/qwizard_win.cpp | 7 ++- src/widgets/dialogs/qwizard_win_p.h | 4 +- .../graphicsview/qgraphicswidget_p.cpp | 2 +- src/widgets/itemviews/qtreeview.cpp | 2 +- src/widgets/styles/qandroidstyle.cpp | 4 +- src/widgets/styles/qandroidstyle_p.h | 4 +- src/widgets/styles/qfusionstyle.cpp | 4 +- src/widgets/styles/qfusionstyle_p.h | 4 +- src/widgets/styles/qfusionstyle_p_p.h | 4 +- src/widgets/styles/qmacstyle_mac_p.h | 2 +- src/widgets/styles/qstylefactory.cpp | 34 ++++++------ src/widgets/styles/qstyleoption.cpp | 5 +- src/widgets/styles/qwindowsstyle.cpp | 4 +- src/widgets/styles/qwindowsstyle_p.h | 4 +- src/widgets/styles/qwindowsstyle_p_p.h | 4 +- src/widgets/styles/qwindowsvistastyle.cpp | 2 +- src/widgets/styles/qwindowsvistastyle_p.h | 4 +- src/widgets/styles/qwindowsvistastyle_p_p.h | 4 +- src/widgets/styles/qwindowsxpstyle.cpp | 2 +- src/widgets/styles/qwindowsxpstyle_p.h | 4 +- src/widgets/styles/qwindowsxpstyle_p_p.h | 4 +- src/widgets/styles/styles.pri | 38 ++++--------- src/widgets/widgets/qcombobox.cpp | 2 +- src/widgets/widgets/qmdiarea.cpp | 2 +- src/widgets/widgets/qmdisubwindow.cpp | 24 ++++---- 27 files changed, 115 insertions(+), 126 deletions(-) diff --git a/src/widgets/configure.json b/src/widgets/configure.json index b241fcdf11..1e72b61886 100644 --- a/src/widgets/configure.json +++ b/src/widgets/configure.json @@ -44,31 +44,31 @@ }, "style-fusion": { "label": "Fusion", - "output": [ "styles" ] + "output": [ "privateFeature", "styles" ] }, "style-mac": { "label": "macOS", "condition": "config.osx", - "output": [ "styles" ] + "output": [ "privateFeature", "styles" ] }, "style-windows": { "label": "Windows", - "output": [ "styles" ] + "output": [ "privateFeature", "styles" ] }, "style-windowsxp": { "label": "WindowsXP", "condition": "features.style-windows && config.win32 && !config.winrt && tests.uxtheme", - "output": [ "styles" ] + "output": [ "privateFeature", "styles" ] }, "style-windowsvista": { "label": "WindowsVista", "condition": "features.style-windowsxp", - "output": [ "styles" ] + "output": [ "privateFeature", "styles" ] }, "style-android": { "label": "Android", "autoDetect": "config.android", - "output": [ "styles" ] + "output": [ "privateFeature", "styles" ] }, "style-stylesheet": { "label": "QStyleSheetStyle", diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp index bcad069b50..9153d7ea41 100644 --- a/src/widgets/dialogs/qwizard.cpp +++ b/src/widgets/dialogs/qwizard.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qwizard.h" +#include #ifndef QT_NO_WIZARD @@ -61,7 +62,7 @@ #include #include #include -#elif !defined(QT_NO_STYLE_WINDOWSVISTA) +#elif QT_CONFIG(style_windowsvista) #include "qwizard_win_p.h" #include "qtimer.h" #endif @@ -295,7 +296,7 @@ public: protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) private: bool vistaDisabled() const; #endif @@ -342,7 +343,7 @@ QWizardHeader::QWizardHeader(QWidget *parent) layout->addWidget(logoLabel, 1, 5, 5, 1); } -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) bool QWizardHeader::vistaDisabled() const { bool styleDisabled = false; @@ -362,7 +363,7 @@ void QWizardHeader::setup(const QWizardLayoutInfo &info, const QString &title, Qt::TextFormat titleFormat, Qt::TextFormat subTitleFormat) { bool modern = ((info.wizStyle == QWizard::ModernStyle) -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) || ((info.wizStyle == QWizard::AeroStyle && QVistaHelper::vistaState() == QVistaHelper::Classic) || vistaDisabled()) #endif @@ -525,7 +526,7 @@ void QWizardPagePrivate::_q_updateCachedCompleteState() class QWizardAntiFlickerWidget : public QWidget { public: -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) QWizardPrivate *wizardPrivate; QWizardAntiFlickerWidget(QWizard *wizard, QWizardPrivate *wizardPrivate) : QWidget(wizard) @@ -572,7 +573,7 @@ public: , titleLabel(0) , subTitleLabel(0) , bottomRuler(0) -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) , vistaHelper(0) , vistaInitPending(false) , vistaState(QVistaHelper::Dirty) @@ -586,7 +587,7 @@ public: { std::fill(btns, btns + QWizard::NButtons, static_cast(0)); -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based)) vistaInitPending = true; @@ -611,7 +612,7 @@ public: void setButtonLayout(const QWizard::WizardButton *array, int size); bool buttonLayoutContains(QWizard::WizardButton which); void updatePixmap(QWizard::WizardPixmap which); -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) bool vistaDisabled() const; bool isVistaThemeEnabled(QVistaHelper::VistaState state) const; bool handleAeroStyleChange(); @@ -677,7 +678,7 @@ public: QHBoxLayout *buttonLayout; QGridLayout *mainLayout; -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) QVistaHelper *vistaHelper; bool vistaInitPending; QVistaHelper::VistaState vistaState; @@ -692,7 +693,7 @@ public: static QString buttonDefaultText(int wstyle, int which, const QWizardPrivate *wizardPrivate) { -#if defined(QT_NO_STYLE_WINDOWSVISTA) +#if !QT_CONFIG(style_windowsvista) Q_UNUSED(wizardPrivate); #endif const bool macStyle = (wstyle == QWizard::MacStyle); @@ -730,7 +731,7 @@ void QWizardPrivate::init() opts = QWizard::HelpButtonOnRight; } -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) vistaHelper = new QVistaHelper(q); #endif @@ -959,7 +960,7 @@ QWizardLayoutInfo QWizardPrivate::layoutInfoForCurrentPage() info.wizStyle = wizStyle; if (info.wizStyle == QWizard::AeroStyle -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) && (QVistaHelper::vistaState() == QVistaHelper::Classic || vistaDisabled()) #endif ) @@ -1337,7 +1338,7 @@ void QWizardPrivate::updateMinMaxSizes(const QWizardLayoutInfo &info) Q_Q(QWizard); int extraHeight = 0; -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) if (isVistaThemeEnabled()) extraHeight = vistaHelper->titleBarSize() + vistaHelper->topOffset(); #endif @@ -1560,7 +1561,7 @@ void QWizardPrivate::updatePixmap(QWizard::WizardPixmap which) } } -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) bool QWizardPrivate::vistaDisabled() const { Q_Q(const QWizard); @@ -1642,7 +1643,7 @@ bool QWizardPrivate::handleAeroStyleChange() bool QWizardPrivate::isVistaThemeEnabled() const { -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) return isVistaThemeEnabled(QVistaHelper::VistaAero) || isVistaThemeEnabled(QVistaHelper::VistaBasic); #else @@ -1720,7 +1721,7 @@ void QWizardPrivate::_q_updateButtonStates() if (QPushButton *finishPush = qobject_cast(btn.finish)) finishPush->setDefault(!canContinue && useDefault); -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) if (isVistaThemeEnabled()) { vistaHelper->backButton()->setEnabled(btn.back->isEnabled()); vistaHelper->backButton()->setVisible(backButtonVisible); @@ -1788,7 +1789,7 @@ QPixmap QWizardPrivate::findDefaultBackgroundPixmap() #endif -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) void QWizardAntiFlickerWidget::paintEvent(QPaintEvent *) { if (wizardPrivate->isVistaThemeEnabled()) { @@ -2556,7 +2557,7 @@ void QWizard::setWizardStyle(WizardStyle style) const bool styleChange = style != d->wizStyle; -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) const bool aeroStyleChange = d->vistaInitPending || d->vistaStateChanged || (styleChange && (style == AeroStyle || d->wizStyle == AeroStyle)); d->vistaStateChanged = false; @@ -2564,14 +2565,14 @@ void QWizard::setWizardStyle(WizardStyle style) #endif if (styleChange -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) || aeroStyleChange #endif ) { d->disableUpdates(); d->wizStyle = style; d->updateButtonTexts(); -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) if (aeroStyleChange) { //Send a resizeevent since the antiflicker widget probably needs a new size //because of the backbutton in the window title @@ -2582,7 +2583,7 @@ void QWizard::setWizardStyle(WizardStyle style) d->updateLayout(); updateGeometry(); d->enableUpdates(); -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) // Delay initialization when activating Aero style fails due to missing native window. if (aeroStyleChange && !d->handleAeroStyleChange() && d->wizStyle == AeroStyle) d->vistaInitPending = true; @@ -2816,7 +2817,7 @@ void QWizard::setButton(WizardButton which, QAbstractButton *button) QAbstractButton *QWizard::button(WizardButton which) const { Q_D(const QWizard); -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) if (d->wizStyle == AeroStyle && which == BackButton) return d->vistaHelper->backButton(); #endif @@ -3176,7 +3177,7 @@ bool QWizard::event(QEvent *event) d->setStyle(style()); d->updateLayout(); } -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) else if (event->type() == QEvent::Show && d->vistaInitPending) { d->vistaInitPending = false; // Do not force AeroStyle when in Classic theme. @@ -3211,7 +3212,7 @@ void QWizard::resizeEvent(QResizeEvent *event) { Q_D(QWizard); int heightOffset = 0; -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) if (d->isVistaThemeEnabled()) { heightOffset = d->vistaHelper->topOffset(); if (d->isVistaThemeEnabled(QVistaHelper::VistaAero)) @@ -3219,7 +3220,7 @@ void QWizard::resizeEvent(QResizeEvent *event) } #endif d->antiFlickerWidget->resize(event->size().width(), event->size().height() - heightOffset); -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) if (d->isVistaThemeEnabled()) d->vistaHelper->resizeEvent(event); #endif @@ -3240,7 +3241,7 @@ void QWizard::paintEvent(QPaintEvent * event) QPainter painter(this); painter.drawPixmap(0, (height() - backgroundPixmap.height()) / 2, backgroundPixmap); } -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) else if (d->isVistaThemeEnabled()) { if (d->isVistaThemeEnabled(QVistaHelper::VistaBasic)) { QPainter painter(this); @@ -3260,7 +3261,7 @@ void QWizard::paintEvent(QPaintEvent * event) */ bool QWizard::nativeEvent(const QByteArray &eventType, void *message, long *result) { -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) Q_D(QWizard); if (d->isVistaThemeEnabled() && eventType == "windows_generic_MSG") { MSG *windowsMessage = static_cast(message); diff --git a/src/widgets/dialogs/qwizard_win.cpp b/src/widgets/dialogs/qwizard_win.cpp index 9d8e7c4b66..80e37dab25 100644 --- a/src/widgets/dialogs/qwizard_win.cpp +++ b/src/widgets/dialogs/qwizard_win.cpp @@ -38,7 +38,10 @@ ****************************************************************************/ #ifndef QT_NO_WIZARD -#ifndef QT_NO_STYLE_WINDOWSVISTA + +#include + +#if QT_CONFIG(style_windowsvista) #include "qwizard_win_p.h" #include @@ -722,6 +725,6 @@ int QVistaHelper::topOffset() QT_END_NAMESPACE -#endif // QT_NO_STYLE_WINDOWSVISTA +#endif // style_windowsvista #endif // QT_NO_WIZARD diff --git a/src/widgets/dialogs/qwizard_win_p.h b/src/widgets/dialogs/qwizard_win_p.h index 288e7adaf5..bbba53b879 100644 --- a/src/widgets/dialogs/qwizard_win_p.h +++ b/src/widgets/dialogs/qwizard_win_p.h @@ -54,7 +54,7 @@ #include #ifndef QT_NO_WIZARD -#ifndef QT_NO_STYLE_WINDOWSVISTA +#if QT_CONFIG(style_windowsvista) #include #include @@ -156,6 +156,6 @@ private: QT_END_NAMESPACE -#endif // QT_NO_STYLE_WINDOWSVISTA +#endif // style_windowsvista #endif // QT_NO_WIZARD #endif // QWIZARD_WIN_P_H diff --git a/src/widgets/graphicsview/qgraphicswidget_p.cpp b/src/widgets/graphicsview/qgraphicswidget_p.cpp index 46d2a4c1aa..660620a5d9 100644 --- a/src/widgets/graphicsview/qgraphicswidget_p.cpp +++ b/src/widgets/graphicsview/qgraphicswidget_p.cpp @@ -52,7 +52,7 @@ #include #include #include -#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && QT_CONFIG(style_mac) # include #endif diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index 2d1d1f43d0..9583dd9657 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -2194,7 +2194,7 @@ QModelIndex QTreeView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifie return QModelIndex(); } int vi = -1; -#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && QT_CONFIG(style_mac) // Selection behavior is slightly different on the Mac. if (d->selectionMode == QAbstractItemView::ExtendedSelection && d->selectionModel diff --git a/src/widgets/styles/qandroidstyle.cpp b/src/widgets/styles/qandroidstyle.cpp index 743166549b..b37dffbe80 100644 --- a/src/widgets/styles/qandroidstyle.cpp +++ b/src/widgets/styles/qandroidstyle.cpp @@ -39,7 +39,7 @@ #include "qandroidstyle_p.h" -#if !defined(QT_NO_STYLE_ANDROID) || defined(QT_PLUGIN) +#if QT_CONFIG(style_android) || defined(QT_PLUGIN) #include #include @@ -1807,4 +1807,4 @@ QRect QAndroidStyle::AndroidSpinnerControl::subControlRect(const QStyleOptionCom QT_END_NAMESPACE -#endif // !defined(QT_NO_STYLE_ANDROID) || defined(QT_PLUGIN) +#endif // QT_CONFIG(style_android) || defined(QT_PLUGIN) diff --git a/src/widgets/styles/qandroidstyle_p.h b/src/widgets/styles/qandroidstyle_p.h index 4649d90852..caff0afada 100644 --- a/src/widgets/styles/qandroidstyle_p.h +++ b/src/widgets/styles/qandroidstyle_p.h @@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE -#if !defined(QT_NO_STYLE_ANDROID) +#if QT_CONFIG(style_android) class Q_WIDGETS_EXPORT QAndroidStyle : public QFusionStyle { @@ -388,7 +388,7 @@ private: AndroidCompoundButtonControl *checkBoxControl; }; -#endif // QT_NO_STYLE_ANDROID +#endif // style_android QT_END_NAMESPACE diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp index 3473ec7fb0..74e4d53dca 100644 --- a/src/widgets/styles/qfusionstyle.cpp +++ b/src/widgets/styles/qfusionstyle.cpp @@ -40,7 +40,7 @@ #include "qfusionstyle_p.h" #include "qfusionstyle_p_p.h" -#if !defined(QT_NO_STYLE_FUSION) || defined(QT_PLUGIN) +#if QT_CONFIG(style_fusion) || defined(QT_PLUGIN) #include "qcommonstyle_p.h" #include #include @@ -3746,4 +3746,4 @@ QT_END_NAMESPACE #include "moc_qfusionstyle_p.cpp" -#endif // QT_NO_STYLE_FUSION || QT_PLUGIN +#endif // style_fusion|| QT_PLUGIN diff --git a/src/widgets/styles/qfusionstyle_p.h b/src/widgets/styles/qfusionstyle_p.h index 126fb96e78..aac27e51ab 100644 --- a/src/widgets/styles/qfusionstyle_p.h +++ b/src/widgets/styles/qfusionstyle_p.h @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE -#if !defined(QT_NO_STYLE_FUSION) +#if QT_CONFIG(style_fusion) class QFusionStylePrivate; class QFusionStyle : public QCommonStyle @@ -110,7 +110,7 @@ protected: }; -#endif // QT_NO_STYLE_FUSION +#endif // style_fusion QT_END_NAMESPACE diff --git a/src/widgets/styles/qfusionstyle_p_p.h b/src/widgets/styles/qfusionstyle_p_p.h index 8d1d27d244..169fd9a407 100644 --- a/src/widgets/styles/qfusionstyle_p_p.h +++ b/src/widgets/styles/qfusionstyle_p_p.h @@ -57,7 +57,7 @@ #include #include "private/qguiapplication_p.h" -#ifndef QT_NO_STYLE_FUSION +#if QT_CONFIG(style_fusion) QT_BEGIN_NAMESPACE @@ -147,6 +147,6 @@ public: QT_END_NAMESPACE -#endif // QT_NO_STYLE_FUSION +#endif // style_fusion #endif //QFUSIONSTYLE_P_P_H diff --git a/src/widgets/styles/qmacstyle_mac_p.h b/src/widgets/styles/qmacstyle_mac_p.h index 459784c538..3642424a14 100644 --- a/src/widgets/styles/qmacstyle_mac_p.h +++ b/src/widgets/styles/qmacstyle_mac_p.h @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) class QPalette; diff --git a/src/widgets/styles/qstylefactory.cpp b/src/widgets/styles/qstylefactory.cpp index 09cccff4e8..8dc603f8e6 100644 --- a/src/widgets/styles/qstylefactory.cpp +++ b/src/widgets/styles/qstylefactory.cpp @@ -44,20 +44,20 @@ #include "qapplication.h" #include "qwindowsstyle_p.h" -#ifndef QT_NO_STYLE_FUSION +#if QT_CONFIG(style_fusion) #include "qfusionstyle_p.h" -#ifndef QT_NO_STYLE_ANDROID +#if QT_CONFIG(style_android) #include "qandroidstyle_p.h" #endif #endif -#ifndef QT_NO_STYLE_WINDOWSXP +#if QT_CONFIG(style_windowsxp) #include "qwindowsxpstyle_p.h" #endif -#ifndef QT_NO_STYLE_WINDOWSVISTA +#if QT_CONFIG(style_windowsvista) #include "qwindowsvistastyle_p.h" #endif -#if !defined(QT_NO_STYLE_MAC) && defined(Q_OS_MAC) +#if QT_CONFIG(style_mac) # include "qmacstyle_mac_p.h" #endif @@ -103,32 +103,32 @@ QStyle *QStyleFactory::create(const QString& key) { QStyle *ret = 0; QString style = key.toLower(); -#ifndef QT_NO_STYLE_WINDOWS +#if QT_CONFIG(style_windows) if (style == QLatin1String("windows")) ret = new QWindowsStyle; else #endif -#ifndef QT_NO_STYLE_WINDOWSXP +#if QT_CONFIG(style_windowsxp) if (style == QLatin1String("windowsxp")) ret = new QWindowsXPStyle; else #endif -#ifndef QT_NO_STYLE_WINDOWSVISTA +#if QT_CONFIG(style_windowsvista) if (style == QLatin1String("windowsvista")) ret = new QWindowsVistaStyle; else #endif -#ifndef QT_NO_STYLE_FUSION +#if QT_CONFIG(style_fusion) if (style == QLatin1String("fusion")) ret = new QFusionStyle; else #endif -#ifndef QT_NO_STYLE_ANDROID +#if QT_CONFIG(style_android) if (style == QLatin1String("android")) ret = new QAndroidStyle; else #endif -#ifndef QT_NO_STYLE_MAC +#if QT_CONFIG(style_mac) if (style.startsWith(QLatin1String("macintosh"))) { ret = new QMacStyle; # if 0 // Used to be included in Qt4 for Q_WS_MAC @@ -160,29 +160,29 @@ QStringList QStyleFactory::keys() const PluginKeyMap::const_iterator cend = keyMap.constEnd(); for (PluginKeyMap::const_iterator it = keyMap.constBegin(); it != cend; ++it) list.append(it.value()); -#ifndef QT_NO_STYLE_WINDOWS +#if QT_CONFIG(style_windows) if (!list.contains(QLatin1String("Windows"))) list << QLatin1String("Windows"); #endif -#ifndef QT_NO_STYLE_WINDOWSXP +#if QT_CONFIG(style_windowsxp) if (!list.contains(QLatin1String("WindowsXP")) && (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based))) list << QLatin1String("WindowsXP"); #endif -#ifndef QT_NO_STYLE_WINDOWSVISTA +#if QT_CONFIG(style_windowsvista) if (!list.contains(QLatin1String("WindowsVista")) && (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based))) list << QLatin1String("WindowsVista"); #endif -#ifndef QT_NO_STYLE_ANDROID +#if QT_CONFIG(style_android) if (!list.contains(QLatin1String("Android"))) list << QLatin1String("Android"); #endif -#ifndef QT_NO_STYLE_FUSION +#if QT_CONFIG(style_fusion) if (!list.contains(QLatin1String("Fusion"))) list << QLatin1String("Fusion"); #endif -#ifndef QT_NO_STYLE_MAC +#if QT_CONFIG(style_mac) QString mstyle = QLatin1String("Macintosh"); # if 0 // Used to be included in Qt4 for Q_WS_MAC mstyle += QLatin1String(" (aqua)"); diff --git a/src/widgets/styles/qstyleoption.cpp b/src/widgets/styles/qstyleoption.cpp index 83739655af..c12b3285f1 100644 --- a/src/widgets/styles/qstyleoption.cpp +++ b/src/widgets/styles/qstyleoption.cpp @@ -37,9 +37,10 @@ ** ****************************************************************************/ +#include #include "qstyleoption.h" #include "qapplication.h" -#ifdef Q_OS_MAC +#if QT_CONFIG(style_mac) # include "qmacstyle_mac_p.h" #endif #include @@ -204,7 +205,7 @@ void QStyleOption::init(const QWidget *widget) if (!(state & QStyle::State_Active) && !qt_mac_can_clickThrough(widget)) state &= ~QStyle::State_Enabled; #endif -#if defined(Q_OS_OSX) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) switch (QMacStyle::widgetSizePolicy(widget)) { case QMacStyle::SizeSmall: state |= QStyle::State_Small; diff --git a/src/widgets/styles/qwindowsstyle.cpp b/src/widgets/styles/qwindowsstyle.cpp index e3bf28608c..a8ee881a30 100644 --- a/src/widgets/styles/qwindowsstyle.cpp +++ b/src/widgets/styles/qwindowsstyle.cpp @@ -40,7 +40,7 @@ #include "qwindowsstyle_p.h" #include "qwindowsstyle_p_p.h" -#if !defined(QT_NO_STYLE_WINDOWS) || defined(QT_PLUGIN) +#if QT_CONFIG(style_windows) || defined(QT_PLUGIN) #include "qapplication.h" #include "qbitmap.h" @@ -2407,4 +2407,4 @@ QT_END_NAMESPACE #include "moc_qwindowsstyle_p.cpp" -#endif // QT_NO_STYLE_WINDOWS +#endif // style_windows diff --git a/src/widgets/styles/qwindowsstyle_p.h b/src/widgets/styles/qwindowsstyle_p.h index 5d68bfeba0..a1d65610ff 100644 --- a/src/widgets/styles/qwindowsstyle_p.h +++ b/src/widgets/styles/qwindowsstyle_p.h @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE -#if !defined(QT_NO_STYLE_WINDOWS) +#if QT_CONFIG(style_windows) class QWindowsStylePrivate; @@ -106,7 +106,7 @@ private: Q_DECLARE_PRIVATE(QWindowsStyle) }; -#endif // QT_NO_STYLE_WINDOWS +#endif // style_windows QT_END_NAMESPACE diff --git a/src/widgets/styles/qwindowsstyle_p_p.h b/src/widgets/styles/qwindowsstyle_p_p.h index 0c23f4b4a8..5023fd1042 100644 --- a/src/widgets/styles/qwindowsstyle_p_p.h +++ b/src/widgets/styles/qwindowsstyle_p_p.h @@ -55,7 +55,7 @@ #include "qwindowsstyle_p.h" #include "qcommonstyle_p.h" -#ifndef QT_NO_STYLE_WINDOWS +#if QT_CONFIG(style_windows) #include QT_BEGIN_NAMESPACE @@ -103,7 +103,7 @@ private: QT_END_NAMESPACE -#endif // QT_NO_STYLE_WINDOWS +#endif // style_windows #endif //QWINDOWSSTYLE_P_P_H ; diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp index bf5aad0187..7759df9959 100644 --- a/src/widgets/styles/qwindowsvistastyle.cpp +++ b/src/widgets/styles/qwindowsvistastyle.cpp @@ -46,7 +46,7 @@ #include #include -#if !defined(QT_NO_STYLE_WINDOWSVISTA) || defined(QT_PLUGIN) +#if QT_CONFIG(style_windowsvista) || defined(QT_PLUGIN) QT_BEGIN_NAMESPACE diff --git a/src/widgets/styles/qwindowsvistastyle_p.h b/src/widgets/styles/qwindowsvistastyle_p.h index 0289f404dd..8fbd1dc380 100644 --- a/src/widgets/styles/qwindowsvistastyle_p.h +++ b/src/widgets/styles/qwindowsvistastyle_p.h @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) class QWindowsVistaStylePrivate; class QWindowsVistaStyle : public QWindowsXPStyle @@ -103,7 +103,7 @@ private: Q_DECLARE_PRIVATE(QWindowsVistaStyle) friend class QStyleFactory; }; -#endif //QT_NO_STYLE_WINDOWSVISTA +#endif // style_windowsvista QT_END_NAMESPACE diff --git a/src/widgets/styles/qwindowsvistastyle_p_p.h b/src/widgets/styles/qwindowsvistastyle_p_p.h index 4ca47fec2c..18b6f9c3f7 100644 --- a/src/widgets/styles/qwindowsvistastyle_p_p.h +++ b/src/widgets/styles/qwindowsvistastyle_p_p.h @@ -54,7 +54,7 @@ #include #include "qwindowsvistastyle_p.h" -#if !defined(QT_NO_STYLE_WINDOWSVISTA) +#if QT_CONFIG(style_windowsvista) #include #include #include @@ -177,6 +177,6 @@ public: QT_END_NAMESPACE -#endif // QT_NO_STYLE_WINDOWSVISTA +#endif // style_windowsvista #endif // QWINDOWSVISTASTYLE_P_P_H diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp index 4ce359a7c4..f999d823e0 100644 --- a/src/widgets/styles/qwindowsxpstyle.cpp +++ b/src/widgets/styles/qwindowsxpstyle.cpp @@ -39,7 +39,7 @@ #include "qwindowsxpstyle_p.h" #include "qwindowsxpstyle_p_p.h" -#if !defined(QT_NO_STYLE_WINDOWSXP) || defined(QT_PLUGIN) +#if QT_CONFIG(style_windowsxp) || defined(QT_PLUGIN) #include #include diff --git a/src/widgets/styles/qwindowsxpstyle_p.h b/src/widgets/styles/qwindowsxpstyle_p.h index 088178cb5a..62e3af927c 100644 --- a/src/widgets/styles/qwindowsxpstyle_p.h +++ b/src/widgets/styles/qwindowsxpstyle_p.h @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE -#if !defined(QT_NO_STYLE_WINDOWSXP) +#if QT_CONFIG(style_windowsxp) class QWindowsXPStylePrivate; class QWindowsXPStyle : public QWindowsStyle @@ -102,7 +102,7 @@ private: friend class QStyleFactory; }; -#endif // QT_NO_STYLE_WINDOWSXP +#endif // style_windowsxp QT_END_NAMESPACE diff --git a/src/widgets/styles/qwindowsxpstyle_p_p.h b/src/widgets/styles/qwindowsxpstyle_p_p.h index d6702c8803..fb5210cb07 100644 --- a/src/widgets/styles/qwindowsxpstyle_p_p.h +++ b/src/widgets/styles/qwindowsxpstyle_p_p.h @@ -94,7 +94,7 @@ QT_BEGIN_NAMESPACE // Uncomment define below to build debug assisting code, and output // #define DEBUG_XP_STYLE -#if !defined(QT_NO_STYLE_WINDOWSXP) +#if QT_CONFIG(style_windowsxp) // Declarations ----------------------------------------------------------------------------------- class XPThemeData @@ -338,7 +338,7 @@ inline QMarginsF XPThemeData::themeMargins(const QWidget *w, QPainter *p, int th return theme.margins(propId); } -#endif // QT_NO_STYLE_WINDOWS +#endif // style_windows QT_END_NAMESPACE diff --git a/src/widgets/styles/styles.pri b/src/widgets/styles/styles.pri index 69e13fb6ec..481123f0d4 100644 --- a/src/widgets/styles/styles.pri +++ b/src/widgets/styles/styles.pri @@ -37,51 +37,35 @@ RESOURCES += styles/qstyle.qrc include($$OUT_PWD/qtwidgets-config.pri) -contains( styles, mac ) { +qtConfig(style-mac) { HEADERS += \ styles/qmacstyle_mac_p.h \ styles/qmacstyle_mac_p_p.h OBJECTIVE_SOURCES += styles/qmacstyle_mac.mm LIBS_PRIVATE += -framework Carbon -} else { - DEFINES += QT_NO_STYLE_MAC } -contains( styles, windowsvista ) { - HEADERS += styles/qwindowsvistastyle_p.h - HEADERS += styles/qwindowsvistastyle_p_p.h +qtConfig(style-windowsvista) { + HEADERS += styles/qwindowsvistastyle_p.h styles/qwindowsvistastyle_p_p.h SOURCES += styles/qwindowsvistastyle.cpp -} else { - DEFINES += QT_NO_STYLE_WINDOWSVISTA } -contains( styles, windowsxp ) { - HEADERS += styles/qwindowsxpstyle_p.h - HEADERS += styles/qwindowsxpstyle_p_p.h +qtConfig(style-windowsxp) { + HEADERS += styles/qwindowsxpstyle_p.h styles/qwindowsxpstyle_p_p.h SOURCES += styles/qwindowsxpstyle.cpp -} else { - DEFINES += QT_NO_STYLE_WINDOWSXP } -contains( styles, windows ) { - HEADERS += styles/qwindowsstyle_p.h - HEADERS += styles/qwindowsstyle_p_p.h +qtConfig(style-windows) { + HEADERS += styles/qwindowsstyle_p.h styles/qwindowsstyle_p_p.h SOURCES += styles/qwindowsstyle.cpp -} else { - DEFINES += QT_NO_STYLE_WINDOWS } -contains( styles, fusion ) { - HEADERS += styles/qfusionstyle_p.h - HEADERS += styles/qfusionstyle_p_p.h - SOURCES += styles/qfusionstyle.cpp -} else { - DEFINES += QT_NO_STYLE_FUSION +qtConfig(style-fusion) { + HEADERS += styles/qfusionstyle_p.h styles/qfusionstyle_p_p.h + SOURCES += styles/qfusionstyle.cpp } -contains( styles, android ) { +qtConfig(style-android) { HEADERS += styles/qandroidstyle_p.h SOURCES += styles/qandroidstyle.cpp -} else { - DEFINES += QT_NO_STYLE_ANDROID } diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 4358e568bf..abb24a7f1e 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -66,7 +66,7 @@ #include #include #include -#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_EFFECTS) && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_EFFECTS) && QT_CONFIG(style_mac) #include #include #include diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp index 183f1c2848..9b39743281 100644 --- a/src/widgets/widgets/qmdiarea.cpp +++ b/src/widgets/widgets/qmdiarea.cpp @@ -160,7 +160,7 @@ #include #include -#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && QT_CONFIG(style_mac) #include #endif #include diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp index 2fff2fc729..a627c86871 100644 --- a/src/widgets/widgets/qmdisubwindow.cpp +++ b/src/widgets/widgets/qmdisubwindow.cpp @@ -158,7 +158,7 @@ #include #include #include -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) #include #endif #include @@ -295,7 +295,7 @@ static void showToolTip(QHelpEvent *helpEvent, QWidget *widget, const QStyleOpti Q_ASSERT(helpEvent->type() == QEvent::ToolTip); Q_ASSERT(widget); -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) // Native Mac windows don't show tool tip. if (qobject_cast(widget->style())) return; @@ -1076,7 +1076,7 @@ void QMdiSubWindowPrivate::updateCursor() { #ifndef QT_NO_CURSOR Q_Q(QMdiSubWindow); -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) if (qobject_cast(q->style())) return; #endif @@ -1504,7 +1504,7 @@ void QMdiSubWindowPrivate::processClickedSubControl() q->showNormal(); break; case QStyle::SC_TitleBarMinButton: -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) if (qobject_cast(q->style())) { if (q->isMinimized()) q->showNormal(); @@ -1521,7 +1521,7 @@ void QMdiSubWindowPrivate::processClickedSubControl() q->showNormal(); break; case QStyle::SC_TitleBarMaxButton: -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) if (qobject_cast(q->style())) { if (q->isMaximized()) q->showNormal(); @@ -1568,7 +1568,7 @@ QRegion QMdiSubWindowPrivate::getRegion(Operation operation) const } QRegion region; -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) if (qobject_cast(q->style())) return region; #endif @@ -1775,7 +1775,7 @@ bool QMdiSubWindowPrivate::drawTitleBarWhenMaximized() const if (isChildOfTabbedQMdiArea(q)) return false; -#if defined(Q_OS_DARWIN) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) Q_UNUSED(isChildOfQMdiSubWindow); return true; #else @@ -2191,7 +2191,7 @@ void QMdiSubWindowPrivate::setSizeGrip(QSizeGrip *newSizeGrip) return; newSizeGrip->setFixedSize(newSizeGrip->sizeHint()); bool putSizeGripInLayout = layout ? true : false; -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) if (qobject_cast(q->style())) putSizeGripInLayout = false; #endif @@ -2843,7 +2843,7 @@ bool QMdiSubWindow::event(QEvent *event) d->isMaximizeMode = false; d->isWidgetHiddenByUs = false; if (!parent()) { -#if !defined(QT_NO_SIZEGRIP) && defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if !defined(QT_NO_SIZEGRIP) && QT_CONFIG(style_mac) if (qobject_cast(style())) delete d->sizeGrip; #endif @@ -2938,7 +2938,7 @@ void QMdiSubWindow::showEvent(QShowEvent *showEvent) return; } -#if !defined(QT_NO_SIZEGRIP) && defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if !defined(QT_NO_SIZEGRIP) && QT_CONFIG(style_mac) if (qobject_cast(style()) && !d->sizeGrip && !(windowFlags() & Qt::FramelessWindowHint)) { d->setSizeGrip(new QSizeGrip(this)); @@ -3333,7 +3333,7 @@ void QMdiSubWindow::mouseMoveEvent(QMouseEvent *mouseEvent) hoverRegion += style()->subControlRect(QStyle::CC_TitleBar, &options, d->hoveredSubControl, this); } -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) if (qobject_cast(style()) && !hoverRegion.isEmpty()) hoverRegion += QRegion(0, 0, width(), d->titleBarHeight(options)); #endif @@ -3543,7 +3543,7 @@ QSize QMdiSubWindow::minimumSizeHint() const int sizeGripHeight = 0; if (d->sizeGrip && d->sizeGrip->isVisibleTo(const_cast(this))) sizeGripHeight = d->sizeGrip->height(); -#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC) +#if QT_CONFIG(style_mac) else if (parent() && qobject_cast(style()) && !d->sizeGrip) sizeGripHeight = style()->pixelMetric(QStyle::PM_SizeGripSize, 0, this); #endif From 7d6d70afe7ee7045e866a0507dc3986666b16e8f Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Sun, 27 Nov 2016 14:35:53 +0300 Subject: [PATCH 116/174] QtConcurrent: Add missing override Change-Id: Ib8064a3c7bae68885b1adb78a55c69f7697e10db Reviewed-by: Marc Mutz --- src/concurrent/qtconcurrentfilterkernel.h | 28 ++-- src/concurrent/qtconcurrentiteratekernel.h | 6 +- src/concurrent/qtconcurrentmapkernel.h | 22 +-- src/concurrent/qtconcurrentreducekernel.h | 2 +- src/concurrent/qtconcurrentrunbase.h | 6 +- .../qtconcurrentstoredfunctioncall.h | 148 +++++++++--------- 6 files changed, 106 insertions(+), 106 deletions(-) diff --git a/src/concurrent/qtconcurrentfilterkernel.h b/src/concurrent/qtconcurrentfilterkernel.h index 1e875e3d38..bd474fc0c9 100644 --- a/src/concurrent/qtconcurrentfilterkernel.h +++ b/src/concurrent/qtconcurrentfilterkernel.h @@ -96,7 +96,7 @@ public: reducer(OrderedReduce) { } - bool runIteration(typename Sequence::const_iterator it, int index, T *) + bool runIteration(typename Sequence::const_iterator it, int index, T *) override { IntermediateResults results; results.begin = index; @@ -109,7 +109,7 @@ public: return false; } - bool runIterations(typename Sequence::const_iterator sequenceBeginIterator, int begin, int end, T *) + bool runIterations(typename Sequence::const_iterator sequenceBeginIterator, int begin, int end, T *) override { IntermediateResults results; results.begin = begin; @@ -129,18 +129,18 @@ public: return false; } - void finish() + void finish() override { reducer.finish(reduce, reducedResult); sequence = reducedResult; } - inline bool shouldThrottleThread() + inline bool shouldThrottleThread() override { return IterateKernelType::shouldThrottleThread() || reducer.shouldThrottle(); } - inline bool shouldStartThread() + inline bool shouldStartThread() override { return IterateKernelType::shouldStartThread() && reducer.shouldStartThread(); } @@ -183,7 +183,7 @@ public: { } #endif - bool runIteration(Iterator it, int index, ReducedResultType *) + bool runIteration(Iterator it, int index, ReducedResultType *) override { IntermediateResults::value_type> results; results.begin = index; @@ -196,7 +196,7 @@ public: return false; } - bool runIterations(Iterator sequenceBeginIterator, int begin, int end, ReducedResultType *) + bool runIterations(Iterator sequenceBeginIterator, int begin, int end, ReducedResultType *) override { IntermediateResults::value_type> results; results.begin = begin; @@ -215,24 +215,24 @@ public: return false; } - void finish() + void finish() override { reducer.finish(reduce, reducedResult); } - inline bool shouldThrottleThread() + inline bool shouldThrottleThread() override { return IterateKernelType::shouldThrottleThread() || reducer.shouldThrottle(); } - inline bool shouldStartThread() + inline bool shouldStartThread() override { return IterateKernelType::shouldStartThread() && reducer.shouldStartThread(); } typedef ReducedResultType ReturnType; typedef ReducedResultType ResultType; - ReducedResultType *result() + ReducedResultType *result() override { return &reducedResult; } @@ -255,14 +255,14 @@ public: : IterateKernelType(begin, end), keep(_keep) { } - void start() + void start() override { if (this->futureInterface) this->futureInterface->setFilterMode(true); IterateKernelType::start(); } - bool runIteration(Iterator it, int index, T *) + bool runIteration(Iterator it, int index, T *) override { if (keep(*it)) this->reportResult(&(*it), index); @@ -271,7 +271,7 @@ public: return false; } - bool runIterations(Iterator sequenceBeginIterator, int begin, int end, T *) + bool runIterations(Iterator sequenceBeginIterator, int begin, int end, T *) override { const int count = end - begin; IntermediateResults::value_type> results; diff --git a/src/concurrent/qtconcurrentiteratekernel.h b/src/concurrent/qtconcurrentiteratekernel.h index b4360abd26..dbd000e8ba 100644 --- a/src/concurrent/qtconcurrentiteratekernel.h +++ b/src/concurrent/qtconcurrentiteratekernel.h @@ -197,14 +197,14 @@ public: virtual bool runIterations(Iterator _begin, int beginIndex, int endIndex, T *results) { Q_UNUSED(_begin); Q_UNUSED(beginIndex); Q_UNUSED(endIndex); Q_UNUSED(results); return false; } - void start() + void start() override { progressReportingEnabled = this->isProgressReportingEnabled(); if (progressReportingEnabled && iterationCount > 0) this->setProgressRange(0, iterationCount); } - bool shouldStartThread() + bool shouldStartThread() override { if (forIteration) return (currentIndex.load() < iterationCount) && !this->shouldThrottleThread(); @@ -212,7 +212,7 @@ public: return (iteratorThreads.load() == 0); } - ThreadFunctionResult threadFunction() + ThreadFunctionResult threadFunction() override { if (forIteration) return this->forThreadFunction(); diff --git a/src/concurrent/qtconcurrentmapkernel.h b/src/concurrent/qtconcurrentmapkernel.h index ad5ef93684..fa162f7c34 100644 --- a/src/concurrent/qtconcurrentmapkernel.h +++ b/src/concurrent/qtconcurrentmapkernel.h @@ -64,13 +64,13 @@ public: : IterateKernel(begin, end), map(_map) { } - bool runIteration(Iterator it, int, void *) + bool runIteration(Iterator it, int, void *) override { map(*it); return false; } - bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, void *) + bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, void *) override { Iterator it = sequenceBeginIterator; std::advance(it, beginIndex); @@ -108,7 +108,7 @@ public: : reducedResult(initialValue), map(_map), reduce(_reduce) { } - bool runIteration(Iterator it, int index, ReducedResultType *) + bool runIteration(Iterator it, int index, ReducedResultType *) override { IntermediateResults results; results.begin = index; @@ -119,7 +119,7 @@ public: return false; } - bool runIterations(Iterator sequenceBeginIterator, int begin, int end, ReducedResultType *) + bool runIterations(Iterator sequenceBeginIterator, int begin, int end, ReducedResultType *) override { IntermediateResults results; results.begin = begin; @@ -137,23 +137,23 @@ public: return false; } - void finish() + void finish() override { reducer.finish(reduce, reducedResult); } - bool shouldThrottleThread() + bool shouldThrottleThread() override { return IterateKernel::shouldThrottleThread() || reducer.shouldThrottle(); } - bool shouldStartThread() + bool shouldStartThread() override { return IterateKernel::shouldStartThread() && reducer.shouldStartThread(); } typedef ReducedResultType ResultType; - ReducedResultType *result() + ReducedResultType *result() override { return &reducedResult; } @@ -171,13 +171,13 @@ public: MappedEachKernel(Iterator begin, Iterator end, MapFunctor _map) : IterateKernel(begin, end), map(_map) { } - bool runIteration(Iterator it, int, T *result) + bool runIteration(Iterator it, int, T *result) override { *result = map(*it); return true; } - bool runIterations(Iterator sequenceBeginIterator, int begin, int end, T *results) + bool runIterations(Iterator sequenceBeginIterator, int begin, int end, T *results) override { Iterator it = sequenceBeginIterator; @@ -216,7 +216,7 @@ struct SequenceHolder1 : public Base Sequence sequence; - void finish() + void finish() override { Base::finish(); // Clear the sequence to make sure all temporaries are destroyed diff --git a/src/concurrent/qtconcurrentreducekernel.h b/src/concurrent/qtconcurrentreducekernel.h index 2cbf30dffb..c5003a2a0e 100644 --- a/src/concurrent/qtconcurrentreducekernel.h +++ b/src/concurrent/qtconcurrentreducekernel.h @@ -230,7 +230,7 @@ struct SequenceHolder2 : public Base Sequence sequence; - void finish() + void finish() override { Base::finish(); // Clear the sequence to make sure all temporaries are destroyed diff --git a/src/concurrent/qtconcurrentrunbase.h b/src/concurrent/qtconcurrentrunbase.h index 734fd54f70..303838b73e 100644 --- a/src/concurrent/qtconcurrentrunbase.h +++ b/src/concurrent/qtconcurrentrunbase.h @@ -88,7 +88,7 @@ public: return theFuture; } - void run() {} + void run() override {} virtual void runFunctor() = 0; }; @@ -96,7 +96,7 @@ template class RunFunctionTask : public RunFunctionTaskBase { public: - void run() + void run() override { if (this->isCanceled()) { this->reportFinished(); @@ -124,7 +124,7 @@ template <> class RunFunctionTask : public RunFunctionTaskBase { public: - void run() + void run() override { if (this->isCanceled()) { this->reportFinished(); diff --git a/src/concurrent/qtconcurrentstoredfunctioncall.h b/src/concurrent/qtconcurrentstoredfunctioncall.h index 0afce17f74..750ece1ef1 100644 --- a/src/concurrent/qtconcurrentstoredfunctioncall.h +++ b/src/concurrent/qtconcurrentstoredfunctioncall.h @@ -57,7 +57,7 @@ struct StoredFunctorCall0: public RunFunctionTask { inline StoredFunctorCall0(FunctionPointer _function) : function(_function) {} - void runFunctor() { this->result = function(); } + void runFunctor() override { this->result = function(); } FunctionPointer function; }; @@ -67,7 +67,7 @@ struct StoredFunctorCall0: public RunFunctionTask { inline StoredFunctorCall0(FunctionPointer _function) : function(_function) {} - void runFunctor() { function(); } + void runFunctor() override { function(); } FunctionPointer function; }; @@ -77,7 +77,7 @@ struct StoredFunctorPointerCall0: public RunFunctionTask { inline StoredFunctorPointerCall0(FunctionPointer * _function) : function(_function) {} - void runFunctor() { this->result =(*function)(); } + void runFunctor() override { this->result =(*function)(); } FunctionPointer * function; }; @@ -87,7 +87,7 @@ struct VoidStoredFunctorPointerCall0: public RunFunctionTask { inline VoidStoredFunctorPointerCall0(FunctionPointer * _function) : function(_function) {} - void runFunctor() {(*function)(); } + void runFunctor() override { (*function)(); } FunctionPointer * function; }; @@ -106,7 +106,7 @@ public: StoredMemberFunctionCall0(T (Class::*_fn)() , const Class &_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(); } @@ -122,7 +122,7 @@ public: VoidStoredMemberFunctionCall0(T (Class::*_fn)() , const Class &_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { (object.*fn)(); } @@ -145,7 +145,7 @@ public: StoredConstMemberFunctionCall0(T (Class::*_fn)() const, const Class &_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(); } @@ -161,7 +161,7 @@ public: VoidStoredConstMemberFunctionCall0(T (Class::*_fn)() const, const Class &_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { (object.*fn)(); } @@ -184,7 +184,7 @@ public: StoredMemberFunctionPointerCall0(T (Class::*_fn)() , Class *_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(); } @@ -200,7 +200,7 @@ public: VoidStoredMemberFunctionPointerCall0(T (Class::*_fn)() , Class *_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { (object->*fn)(); } @@ -223,7 +223,7 @@ public: StoredConstMemberFunctionPointerCall0(T (Class::*_fn)() const, Class const *_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(); } @@ -239,7 +239,7 @@ public: VoidStoredConstMemberFunctionPointerCall0(T (Class::*_fn)() const, Class const *_object) : fn(_fn), object(_object){ } - void runFunctor() + void runFunctor() override { (object->*fn)(); } @@ -260,7 +260,7 @@ struct StoredFunctorCall1: public RunFunctionTask { inline StoredFunctorCall1(FunctionPointer _function, const Arg1 &_arg1) : function(_function), arg1(_arg1) {} - void runFunctor() { this->result = function(arg1); } + void runFunctor() override { this->result = function(arg1); } FunctionPointer function; Arg1 arg1; }; @@ -270,7 +270,7 @@ struct StoredFunctorCall1: public RunFunctionTask { inline StoredFunctorPointerCall1(FunctionPointer * _function, const Arg1 &_arg1) : function(_function), arg1(_arg1) {} - void runFunctor() { this->result =(*function)(arg1); } + void runFunctor() override { this->result =(*function)(arg1); } FunctionPointer * function; Arg1 arg1; }; @@ -290,7 +290,7 @@ struct VoidStoredFunctorPointerCall1: public RunFunctionTask { inline VoidStoredFunctorPointerCall1(FunctionPointer * _function, const Arg1 &_arg1) : function(_function), arg1(_arg1) {} - void runFunctor() {(*function)(arg1); } + void runFunctor() override { (*function)(arg1); } FunctionPointer * function; Arg1 arg1; }; @@ -309,7 +309,7 @@ public: StoredMemberFunctionCall1(T (Class::*_fn)(Param1) , const Class &_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1); } @@ -325,7 +325,7 @@ public: VoidStoredMemberFunctionCall1(T (Class::*_fn)(Param1) , const Class &_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1); } @@ -348,7 +348,7 @@ public: StoredConstMemberFunctionCall1(T (Class::*_fn)(Param1) const, const Class &_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1); } @@ -364,7 +364,7 @@ public: VoidStoredConstMemberFunctionCall1(T (Class::*_fn)(Param1) const, const Class &_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1); } @@ -387,7 +387,7 @@ public: StoredMemberFunctionPointerCall1(T (Class::*_fn)(Param1) , Class *_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1); } @@ -403,7 +403,7 @@ public: VoidStoredMemberFunctionPointerCall1(T (Class::*_fn)(Param1) , Class *_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1); } @@ -426,7 +426,7 @@ public: StoredConstMemberFunctionPointerCall1(T (Class::*_fn)(Param1) const, Class const *_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1); } @@ -442,7 +442,7 @@ public: VoidStoredConstMemberFunctionPointerCall1(T (Class::*_fn)(Param1) const, Class const *_object, const Arg1 &_arg1) : fn(_fn), object(_object), arg1(_arg1){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1); } @@ -463,7 +463,7 @@ struct StoredFunctorCall2: public RunFunctionTask { inline StoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2) : function(_function), arg1(_arg1), arg2(_arg2) {} - void runFunctor() { this->result = function(arg1, arg2); } + void runFunctor() override { this->result = function(arg1, arg2); } FunctionPointer function; Arg1 arg1; Arg2 arg2; }; @@ -473,7 +473,7 @@ struct StoredFunctorCall2: public RunFunction { inline StoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2) : function(_function), arg1(_arg1), arg2(_arg2) {} - void runFunctor() { function(arg1, arg2); } + void runFunctor() override { function(arg1, arg2); } FunctionPointer function; Arg1 arg1; Arg2 arg2; }; @@ -483,7 +483,7 @@ struct StoredFunctorPointerCall2: public RunFunctionTask { inline StoredFunctorPointerCall2(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2) : function(_function), arg1(_arg1), arg2(_arg2) {} - void runFunctor() { this->result =(*function)(arg1, arg2); } + void runFunctor() override { this->result =(*function)(arg1, arg2); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; }; @@ -493,7 +493,7 @@ struct VoidStoredFunctorPointerCall2: public RunFunctionTask { inline VoidStoredFunctorPointerCall2(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2) : function(_function), arg1(_arg1), arg2(_arg2) {} - void runFunctor() {(*function)(arg1, arg2); } + void runFunctor() override { (*function)(arg1, arg2); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; }; @@ -512,7 +512,7 @@ public: StoredMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2); } @@ -528,7 +528,7 @@ public: VoidStoredMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2); } @@ -551,7 +551,7 @@ public: StoredConstMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2); } @@ -567,7 +567,7 @@ public: VoidStoredConstMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2); } @@ -590,7 +590,7 @@ public: StoredMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2); } @@ -606,7 +606,7 @@ public: VoidStoredMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2); } @@ -629,7 +629,7 @@ public: StoredConstMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2); } @@ -645,7 +645,7 @@ public: VoidStoredConstMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2); } @@ -666,7 +666,7 @@ struct StoredFunctorCall3: public RunFunctionTask { inline StoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {} - void runFunctor() { this->result = function(arg1, arg2, arg3); } + void runFunctor() override { this->result = function(arg1, arg2, arg3); } FunctionPointer function; Arg1 arg1; Arg2 arg2; Arg3 arg3; }; @@ -676,7 +676,7 @@ struct StoredFunctorCall3: public RunFu { inline StoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {} - void runFunctor() { function(arg1, arg2, arg3); } + void runFunctor() override { function(arg1, arg2, arg3); } FunctionPointer function; Arg1 arg1; Arg2 arg2; Arg3 arg3; }; @@ -686,7 +686,7 @@ struct StoredFunctorPointerCall3: public RunFunctionTask { inline StoredFunctorPointerCall3(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {} - void runFunctor() { this->result =(*function)(arg1, arg2, arg3); } + void runFunctor() override { this->result =(*function)(arg1, arg2, arg3); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; Arg3 arg3; }; @@ -696,7 +696,7 @@ struct VoidStoredFunctorPointerCall3: public RunFunctionTask { inline VoidStoredFunctorPointerCall3(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {} - void runFunctor() {(*function)(arg1, arg2, arg3); } + void runFunctor() override { (*function)(arg1, arg2, arg3); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; Arg3 arg3; }; @@ -715,7 +715,7 @@ public: StoredMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2, arg3); } @@ -731,7 +731,7 @@ public: VoidStoredMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2, arg3); } @@ -754,7 +754,7 @@ public: StoredConstMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2, arg3); } @@ -770,7 +770,7 @@ public: VoidStoredConstMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2, arg3); } @@ -793,7 +793,7 @@ public: StoredMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2, arg3); } @@ -809,7 +809,7 @@ public: VoidStoredMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2, arg3); } @@ -832,7 +832,7 @@ public: StoredConstMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2, arg3); } @@ -848,7 +848,7 @@ public: VoidStoredConstMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2, arg3); } @@ -869,7 +869,7 @@ struct StoredFunctorCall4: public RunFunctionTask { inline StoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {} - void runFunctor() { this->result = function(arg1, arg2, arg3, arg4); } + void runFunctor() override { this->result = function(arg1, arg2, arg3, arg4); } FunctionPointer function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; }; @@ -879,7 +879,7 @@ struct StoredFunctorCall4: public { inline StoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {} - void runFunctor() { function(arg1, arg2, arg3, arg4); } + void runFunctor() override { function(arg1, arg2, arg3, arg4); } FunctionPointer function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; }; @@ -889,7 +889,7 @@ struct StoredFunctorPointerCall4: public RunFunctionTask { inline StoredFunctorPointerCall4(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {} - void runFunctor() { this->result =(*function)(arg1, arg2, arg3, arg4); } + void runFunctor() override { this->result =(*function)(arg1, arg2, arg3, arg4); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; }; @@ -899,7 +899,7 @@ struct VoidStoredFunctorPointerCall4: public RunFunctionTask { inline VoidStoredFunctorPointerCall4(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {} - void runFunctor() {(*function)(arg1, arg2, arg3, arg4); } + void runFunctor() override { (*function)(arg1, arg2, arg3, arg4); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; }; @@ -918,7 +918,7 @@ public: StoredMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2, arg3, arg4); } @@ -934,7 +934,7 @@ public: VoidStoredMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2, arg3, arg4); } @@ -957,7 +957,7 @@ public: StoredConstMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2, arg3, arg4); } @@ -973,7 +973,7 @@ public: VoidStoredConstMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2, arg3, arg4); } @@ -996,7 +996,7 @@ public: StoredMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2, arg3, arg4); } @@ -1012,7 +1012,7 @@ public: VoidStoredMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2, arg3, arg4); } @@ -1035,7 +1035,7 @@ public: StoredConstMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2, arg3, arg4); } @@ -1051,7 +1051,7 @@ public: VoidStoredConstMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2, arg3, arg4); } @@ -1072,7 +1072,7 @@ struct StoredFunctorCall5: public RunFunctionTask { inline StoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {} - void runFunctor() { this->result = function(arg1, arg2, arg3, arg4, arg5); } + void runFunctor() override { this->result = function(arg1, arg2, arg3, arg4, arg5); } FunctionPointer function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5; }; @@ -1082,7 +1082,7 @@ struct StoredFunctorCall5: { inline StoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {} - void runFunctor() { function(arg1, arg2, arg3, arg4, arg5); } + void runFunctor() override { function(arg1, arg2, arg3, arg4, arg5); } FunctionPointer function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5; }; @@ -1092,7 +1092,7 @@ struct StoredFunctorPointerCall5: public RunFunctionTask { inline StoredFunctorPointerCall5(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {} - void runFunctor() { this->result =(*function)(arg1, arg2, arg3, arg4, arg5); } + void runFunctor() override { this->result =(*function)(arg1, arg2, arg3, arg4, arg5); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5; }; @@ -1102,7 +1102,7 @@ struct VoidStoredFunctorPointerCall5: public RunFunctionTask { inline VoidStoredFunctorPointerCall5(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {} - void runFunctor() {(*function)(arg1, arg2, arg3, arg4, arg5); } + void runFunctor() override {(*function)(arg1, arg2, arg3, arg4, arg5); } FunctionPointer * function; Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5; }; @@ -1121,7 +1121,7 @@ public: StoredMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1137,7 +1137,7 @@ public: VoidStoredMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) , const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1160,7 +1160,7 @@ public: StoredConstMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { this->result = (object.*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1176,7 +1176,7 @@ public: VoidStoredConstMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { (object.*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1199,7 +1199,7 @@ public: StoredMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1215,7 +1215,7 @@ public: VoidStoredMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) , Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1238,7 +1238,7 @@ public: StoredConstMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { this->result = (object->*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1254,7 +1254,7 @@ public: VoidStoredConstMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ } - void runFunctor() + void runFunctor() override { (object->*fn)(arg1, arg2, arg3, arg4, arg5); } @@ -1276,7 +1276,7 @@ class StoredFunctorCall : public RunFunctionTask { public: StoredFunctorCall(const Functor &f) : functor(f) { } - void runFunctor() + void runFunctor() override { this->result = functor(); } @@ -1288,7 +1288,7 @@ class StoredFunctorCall : public RunFunctionTask { public: StoredFunctorCall(const Functor &f) : functor(f) { } - void runFunctor() + void runFunctor() override { functor(); } From 5a1ff374858879eeb10d62ddfd353b0e66ca49b4 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Sun, 27 Nov 2016 11:30:47 +0300 Subject: [PATCH 117/174] QNX: Add missing override Change-Id: Idb6216a645f7c9791674d16665331a63da46b132 Reviewed-by: Edward Welbourne Reviewed-by: James McDonnell --- src/plugins/platforms/qnx/main.h | 2 +- src/plugins/platforms/qnx/qqnxclipboard.cpp | 6 ++--- src/plugins/platforms/qnx/qqnxclipboard.h | 4 ++-- src/plugins/platforms/qnx/qqnxcursor.h | 6 ++--- src/plugins/platforms/qnx/qqnxeglwindow.h | 6 ++--- src/plugins/platforms/qnx/qqnxglcontext.h | 12 +++++----- .../platforms/qnx/qqnxinputcontext_imf.h | 24 +++++++++---------- .../platforms/qnx/qqnxinputcontext_noimf.h | 18 +++++++------- src/plugins/platforms/qnx/qqnxintegration.h | 24 +++++++++---------- .../platforms/qnx/qqnxnativeinterface.h | 12 +++++----- src/plugins/platforms/qnx/qqnxnavigatorpps.h | 2 +- .../platforms/qnx/qqnxrasterbackingstore.h | 12 +++++----- src/plugins/platforms/qnx/qqnxrasterwindow.h | 6 ++--- src/plugins/platforms/qnx/qqnxscreen.h | 24 +++++++++---------- .../platforms/qnx/qqnxscreeneventhandler.h | 2 +- .../platforms/qnx/qqnxscreeneventthread.h | 2 +- src/plugins/platforms/qnx/qqnxservices.h | 4 ++-- .../platforms/qnx/qqnxvirtualkeyboardpps.h | 6 ++--- src/plugins/platforms/qnx/qqnxwindow.h | 22 ++++++++--------- 19 files changed, 97 insertions(+), 97 deletions(-) diff --git a/src/plugins/platforms/qnx/main.h b/src/plugins/platforms/qnx/main.h index 8d99d2432e..5d5bf95686 100644 --- a/src/plugins/platforms/qnx/main.h +++ b/src/plugins/platforms/qnx/main.h @@ -46,7 +46,7 @@ class QQnxIntegrationPlugin : public QPlatformIntegrationPlugin Q_OBJECT Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "qnx.json") public: - QPlatformIntegration *create(const QString&, const QStringList&); + QPlatformIntegration *create(const QString&, const QStringList&) override; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/qnx/qqnxclipboard.cpp b/src/plugins/platforms/qnx/qqnxclipboard.cpp index 0d2cc45c30..78174549b1 100644 --- a/src/plugins/platforms/qnx/qqnxclipboard.cpp +++ b/src/plugins/platforms/qnx/qqnxclipboard.cpp @@ -103,14 +103,14 @@ public: qClipboardDebug() << "formats=" << m_formatsToCheck; } - bool hasFormat(const QString &mimetype) const + bool hasFormat(const QString &mimetype) const override { const bool result = is_clipboard_format_present(mimetype.toUtf8().constData()) == 0; qClipboardDebug() << "mimetype=" << mimetype << "result=" << result; return result; } - QStringList formats() const + QStringList formats() const override { QStringList result; @@ -141,7 +141,7 @@ public: } protected: - QVariant retrieveData(const QString &mimetype, QVariant::Type preferredType) const + QVariant retrieveData(const QString &mimetype, QVariant::Type preferredType) const override { qClipboardDebug() << "mimetype=" << mimetype << "preferredType=" << preferredType; if (is_clipboard_format_present(mimetype.toUtf8().constData()) != 0) diff --git a/src/plugins/platforms/qnx/qqnxclipboard.h b/src/plugins/platforms/qnx/qqnxclipboard.h index 5113742087..b9466214f8 100644 --- a/src/plugins/platforms/qnx/qqnxclipboard.h +++ b/src/plugins/platforms/qnx/qqnxclipboard.h @@ -52,8 +52,8 @@ class QQnxClipboard : public QPlatformClipboard public: QQnxClipboard(); ~QQnxClipboard(); - QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard); - void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard); + QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) override; + void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard) override; private: class MimeData; diff --git a/src/plugins/platforms/qnx/qqnxcursor.h b/src/plugins/platforms/qnx/qqnxcursor.h index 5c0d582107..9559bfb4ce 100644 --- a/src/plugins/platforms/qnx/qqnxcursor.h +++ b/src/plugins/platforms/qnx/qqnxcursor.h @@ -50,11 +50,11 @@ public: QQnxCursor(); #if !defined(QT_NO_CURSOR) - void changeCursor(QCursor *windowCursor, QWindow *window); + void changeCursor(QCursor *windowCursor, QWindow *window) override; #endif - void setPos(const QPoint &pos); + void setPos(const QPoint &pos) override; - QPoint pos() const; + QPoint pos() const override; private: QPoint m_pos; diff --git a/src/plugins/platforms/qnx/qqnxeglwindow.h b/src/plugins/platforms/qnx/qqnxeglwindow.h index 943ae44bd9..183be11ddc 100644 --- a/src/plugins/platforms/qnx/qqnxeglwindow.h +++ b/src/plugins/platforms/qnx/qqnxeglwindow.h @@ -61,11 +61,11 @@ public: void setPlatformOpenGLContext(QQnxGLContext *platformOpenGLContext); QQnxGLContext *platformOpenGLContext() const { return m_platformOpenGLContext; } - void setGeometry(const QRect &rect); + void setGeometry(const QRect &rect) override; protected: - int pixelFormat() const; - void resetBuffers(); + int pixelFormat() const override; + void resetBuffers() override; private: QSize m_requestedBufferSize; diff --git a/src/plugins/platforms/qnx/qqnxglcontext.h b/src/plugins/platforms/qnx/qqnxglcontext.h index 74cd3b4c48..6e5408e8bf 100644 --- a/src/plugins/platforms/qnx/qqnxglcontext.h +++ b/src/plugins/platforms/qnx/qqnxglcontext.h @@ -64,13 +64,13 @@ public: void requestSurfaceChange(); - bool makeCurrent(QPlatformSurface *surface); - void doneCurrent(); - void swapBuffers(QPlatformSurface *surface); - QFunctionPointer getProcAddress(const char *procName); + bool makeCurrent(QPlatformSurface *surface) override; + void doneCurrent() override; + void swapBuffers(QPlatformSurface *surface) override; + QFunctionPointer getProcAddress(const char *procName) override; - virtual QSurfaceFormat format() const { return m_windowFormat; } - bool isSharing() const; + virtual QSurfaceFormat format() const override { return m_windowFormat; } + bool isSharing() const override; static EGLDisplay getEglDisplay(); EGLConfig getEglConfig() const { return m_eglConfig;} diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_imf.h b/src/plugins/platforms/qnx/qqnxinputcontext_imf.h index c4c2057059..e758ae5bf3 100644 --- a/src/plugins/platforms/qnx/qqnxinputcontext_imf.h +++ b/src/plugins/platforms/qnx/qqnxinputcontext_imf.h @@ -71,22 +71,22 @@ public: Reverted, }; - bool isValid() const; + bool isValid() const override; - bool filterEvent(const QEvent *event); - QRectF keyboardRect() const; - void reset(); - void commit(); - void update(Qt::InputMethodQueries); - bool handleKeyboardEvent(int flags, int sym, int mod, int scan, int cap, int sequenceId); + bool filterEvent(const QEvent *event) override; + QRectF keyboardRect() const override; + void reset() override; + void commit() override; + void update(Qt::InputMethodQueries) override; + bool handleKeyboardEvent(int flags, int sym, int mod, int scan, int cap, int sequenceId) override; - void showInputPanel(); - void hideInputPanel(); - bool isInputPanelVisible() const; + void showInputPanel() override; + void hideInputPanel() override; + bool isInputPanelVisible() const override; - QLocale locale() const; - void setFocusObject(QObject *object); + QLocale locale() const override; + void setFocusObject(QObject *object) override; static void setHighlightColor(int index, const QColor &color); diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h b/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h index aab8dabedf..8d6104af80 100644 --- a/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h +++ b/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h @@ -56,19 +56,19 @@ public: explicit QQnxInputContext(QQnxIntegration *integration, QQnxAbstractVirtualKeyboard &keyboard); ~QQnxInputContext(); - bool isValid() const; + bool isValid() const override; - void reset(); - bool filterEvent( const QEvent *event ); - QRectF keyboardRect() const; + void reset() override; + bool filterEvent(const QEvent *event) override; + QRectF keyboardRect() const override; bool handleKeyboardEvent(int flags, int sym, int mod, int scan, int cap); - void showInputPanel(); - void hideInputPanel(); - bool isInputPanelVisible() const; + void showInputPanel() override; + void hideInputPanel() override; + bool isInputPanelVisible() const override; - QLocale locale() const; - void setFocusObject(QObject *object); + QLocale locale() const override; + void setFocusObject(QObject *object) override; private Q_SLOTS: void keyboardHeightChanged(); diff --git a/src/plugins/platforms/qnx/qqnxintegration.h b/src/plugins/platforms/qnx/qqnxintegration.h index f543b0d102..6f2af82100 100644 --- a/src/plugins/platforms/qnx/qqnxintegration.h +++ b/src/plugins/platforms/qnx/qqnxintegration.h @@ -89,38 +89,38 @@ public: explicit QQnxIntegration(const QStringList ¶mList); ~QQnxIntegration(); - bool hasCapability(QPlatformIntegration::Capability cap) const; + bool hasCapability(QPlatformIntegration::Capability cap) const override; - QPlatformWindow *createPlatformWindow(QWindow *window) const; - QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const; + QPlatformWindow *createPlatformWindow(QWindow *window) const override; + QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const override; #if !defined(QT_NO_OPENGL) - QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const; + QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const override; #endif #if defined(QQNX_PPS) - QPlatformInputContext *inputContext() const; + QPlatformInputContext *inputContext() const override; #endif void moveToScreen(QWindow *window, int screen); bool supportsNavigatorEvents() const; - QAbstractEventDispatcher *createEventDispatcher() const; + QAbstractEventDispatcher *createEventDispatcher() const override; - QPlatformFontDatabase *fontDatabase() const { return m_fontDatabase; } + QPlatformFontDatabase *fontDatabase() const override { return m_fontDatabase; } - QPlatformNativeInterface *nativeInterface() const; + QPlatformNativeInterface *nativeInterface() const override; #if !defined(QT_NO_CLIPBOARD) - QPlatformClipboard *clipboard() const; + QPlatformClipboard *clipboard() const override; #endif #if !defined(QT_NO_DRAGANDDROP) - QPlatformDrag *drag() const; + QPlatformDrag *drag() const override; #endif - QVariant styleHint(StyleHint hint) const; + QVariant styleHint(StyleHint hint) const override; - QPlatformServices *services() const; + QPlatformServices *services() const override; static QWindow *window(screen_window_t qnxWindow); diff --git a/src/plugins/platforms/qnx/qqnxnativeinterface.h b/src/plugins/platforms/qnx/qqnxnativeinterface.h index 26e34b9d54..25f1c29b02 100644 --- a/src/plugins/platforms/qnx/qqnxnativeinterface.h +++ b/src/plugins/platforms/qnx/qqnxnativeinterface.h @@ -50,16 +50,16 @@ class QQnxNativeInterface : public QPlatformNativeInterface { public: QQnxNativeInterface(QQnxIntegration *integration); - void *nativeResourceForWindow(const QByteArray &resource, QWindow *window); - void *nativeResourceForScreen(const QByteArray &resource, QScreen *screen); - void *nativeResourceForIntegration(const QByteArray &resource); + void *nativeResourceForWindow(const QByteArray &resource, QWindow *window) override; + void *nativeResourceForScreen(const QByteArray &resource, QScreen *screen) override; + void *nativeResourceForIntegration(const QByteArray &resource) override; #if !defined(QT_NO_OPENGL) - void *nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context); + void *nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context) override; #endif - void setWindowProperty(QPlatformWindow *window, const QString &name, const QVariant &value); - NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource); + void setWindowProperty(QPlatformWindow *window, const QString &name, const QVariant &value) override; + NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) override; private: QQnxIntegration *m_integration; diff --git a/src/plugins/platforms/qnx/qqnxnavigatorpps.h b/src/plugins/platforms/qnx/qqnxnavigatorpps.h index 08315f166f..3c818f51a6 100644 --- a/src/plugins/platforms/qnx/qqnxnavigatorpps.h +++ b/src/plugins/platforms/qnx/qqnxnavigatorpps.h @@ -54,7 +54,7 @@ public: ~QQnxNavigatorPps(); protected: - bool requestInvokeUrl(const QByteArray &encodedUrl); + bool requestInvokeUrl(const QByteArray &encodedUrl) override; private: bool openPpsConnection(); diff --git a/src/plugins/platforms/qnx/qqnxrasterbackingstore.h b/src/plugins/platforms/qnx/qqnxrasterbackingstore.h index e4ac8f02b1..96ac193dda 100644 --- a/src/plugins/platforms/qnx/qqnxrasterbackingstore.h +++ b/src/plugins/platforms/qnx/qqnxrasterbackingstore.h @@ -54,12 +54,12 @@ public: QQnxRasterBackingStore(QWindow *window); ~QQnxRasterBackingStore(); - QPaintDevice *paintDevice(); - void flush(QWindow *window, const QRegion ®ion, const QPoint &offset); - void resize(const QSize &size, const QRegion &staticContents); - bool scroll(const QRegion &area, int dx, int dy); - void beginPaint(const QRegion ®ion); - void endPaint(); + QPaintDevice *paintDevice() override; + void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) override; + void resize(const QSize &size, const QRegion &staticContents) override; + bool scroll(const QRegion &area, int dx, int dy) override; + void beginPaint(const QRegion ®ion) override; + void endPaint() override; private: QQnxRasterWindow *platformWindow() const; diff --git a/src/plugins/platforms/qnx/qqnxrasterwindow.h b/src/plugins/platforms/qnx/qqnxrasterwindow.h index 53ab29e443..99396efd57 100644 --- a/src/plugins/platforms/qnx/qqnxrasterwindow.h +++ b/src/plugins/platforms/qnx/qqnxrasterwindow.h @@ -58,13 +58,13 @@ public: bool hasBuffers() const { return !bufferSize().isEmpty(); } - void setParent(const QPlatformWindow *window); + void setParent(const QPlatformWindow *window) override; void adjustBufferSize(); protected: - int pixelFormat() const; - void resetBuffers(); + int pixelFormat() const override; + void resetBuffers() override; // Copies content from the previous buffer (back buffer) to the current buffer (front buffer) void blitPreviousToCurrent(const QRegion ®ion, int dx, int dy, bool flush=false); diff --git a/src/plugins/platforms/qnx/qqnxscreen.h b/src/plugins/platforms/qnx/qqnxscreen.h index b7264d0973..8a498434aa 100644 --- a/src/plugins/platforms/qnx/qqnxscreen.h +++ b/src/plugins/platforms/qnx/qqnxscreen.h @@ -71,26 +71,26 @@ public: QQnxScreen(screen_context_t context, screen_display_t display, bool primaryScreen); ~QQnxScreen(); - QPixmap grabWindow(WId window, int x, int y, int width, int height) const; + QPixmap grabWindow(WId window, int x, int y, int width, int height) const override; - QRect geometry() const { return m_currentGeometry; } - QRect availableGeometry() const; - int depth() const; - QImage::Format format() const { return (depth() == 32) ? QImage::Format_RGB32 : QImage::Format_RGB16; } - QSizeF physicalSize() const { return m_currentPhysicalSize; } + QRect geometry() const override { return m_currentGeometry; } + QRect availableGeometry() const override; + int depth() const override; + QImage::Format format() const override { return (depth() == 32) ? QImage::Format_RGB32 : QImage::Format_RGB16; } + QSizeF physicalSize() const override { return m_currentPhysicalSize; } - qreal refreshRate() const; + qreal refreshRate() const override; - Qt::ScreenOrientation nativeOrientation() const; - Qt::ScreenOrientation orientation() const; + Qt::ScreenOrientation nativeOrientation() const override; + Qt::ScreenOrientation orientation() const override; - QWindow *topLevelAt(const QPoint &point) const; + QWindow *topLevelAt(const QPoint &point) const override; bool isPrimaryScreen() const { return m_primaryScreen; } int rotation() const { return m_currentRotation; } - QString name() const { return m_name; } + QString name() const override { return m_name; } int nativeFormat() const { return (depth() == 32) ? SCREEN_FORMAT_RGBA8888 : SCREEN_FORMAT_RGB565; } screen_display_t nativeDisplay() const { return m_display; } @@ -111,7 +111,7 @@ public: QQnxWindow *rootWindow() const; void setRootWindow(QQnxWindow*); - QPlatformCursor *cursor() const; + QPlatformCursor *cursor() const override; Q_SIGNALS: void foreignWindowCreated(void *window); diff --git a/src/plugins/platforms/qnx/qqnxscreeneventhandler.h b/src/plugins/platforms/qnx/qqnxscreeneventhandler.h index 6b234e8d8f..80798a8a2d 100644 --- a/src/plugins/platforms/qnx/qqnxscreeneventhandler.h +++ b/src/plugins/platforms/qnx/qqnxscreeneventhandler.h @@ -75,7 +75,7 @@ Q_SIGNALS: void windowClosed(void *window); protected: - void timerEvent(QTimerEvent *event); + void timerEvent(QTimerEvent *event) override; #if defined(QQNX_SCREENEVENTTHREAD) private Q_SLOTS: diff --git a/src/plugins/platforms/qnx/qqnxscreeneventthread.h b/src/plugins/platforms/qnx/qqnxscreeneventthread.h index b672fcf991..140f53aa50 100644 --- a/src/plugins/platforms/qnx/qqnxscreeneventthread.h +++ b/src/plugins/platforms/qnx/qqnxscreeneventthread.h @@ -65,7 +65,7 @@ public: void unlock(); protected: - void run(); + void run() override; Q_SIGNALS: void eventPending(); diff --git a/src/plugins/platforms/qnx/qqnxservices.h b/src/plugins/platforms/qnx/qqnxservices.h index 94dd5dc0b4..cbf029fdb9 100644 --- a/src/plugins/platforms/qnx/qqnxservices.h +++ b/src/plugins/platforms/qnx/qqnxservices.h @@ -52,8 +52,8 @@ public: explicit QQnxServices(QQnxAbstractNavigator *navigator); ~QQnxServices(); - bool openUrl(const QUrl &url); - bool openDocument(const QUrl &url); + bool openUrl(const QUrl &url) override; + bool openDocument(const QUrl &url) override; private: bool navigatorInvoke(const QUrl &url); diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.h b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.h index 8580ee151b..51d55a2036 100644 --- a/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.h +++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.h @@ -56,14 +56,14 @@ public: QQnxVirtualKeyboardPps(); ~QQnxVirtualKeyboardPps(); - bool showKeyboard(); - bool hideKeyboard(); + bool showKeyboard() override; + bool hideKeyboard() override; public Q_SLOTS: void start(); protected: - void applyKeyboardOptions(); + void applyKeyboardOptions() override; private Q_SLOTS: void ppsDataReady(); diff --git a/src/plugins/platforms/qnx/qqnxwindow.h b/src/plugins/platforms/qnx/qqnxwindow.h index 2e636c7e3e..e248e04462 100644 --- a/src/plugins/platforms/qnx/qqnxwindow.h +++ b/src/plugins/platforms/qnx/qqnxwindow.h @@ -67,13 +67,13 @@ public: QQnxWindow(QWindow *window, screen_context_t context, bool needRootWindow); virtual ~QQnxWindow(); - void setGeometry(const QRect &rect); - void setVisible(bool visible); - void setOpacity(qreal level); + void setGeometry(const QRect &rect) override; + void setVisible(bool visible) override; + void setOpacity(qreal level) override; - bool isExposed() const; + bool isExposed() const override; - WId winId() const { return window()->type() == Qt::Desktop ? -1 : (WId)m_window; } + WId winId() const override { return window()->type() == Qt::Desktop ? -1 : (WId)m_window; } screen_window_t nativeHandle() const { return m_window; } void setBufferSize(const QSize &size); @@ -81,14 +81,14 @@ public: void setScreen(QQnxScreen *platformScreen); - void setParent(const QPlatformWindow *window); - void raise(); - void lower(); - void requestActivateWindow(); - void setWindowState(Qt::WindowState state); + void setParent(const QPlatformWindow *window) override; + void raise() override; + void lower() override; + void requestActivateWindow() override; + void setWindowState(Qt::WindowState state) override; void setExposed(bool exposed); - void propagateSizeHints(); + void propagateSizeHints() override; void setMMRendererWindowName(const QString &name); void setMMRendererWindow(screen_window_t handle); From 97b8fdab7d3604294476bf566b024ecbd5b412b0 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 25 Nov 2016 10:55:46 +0100 Subject: [PATCH 118/174] Fix clipping of fetchTransformed Bound x and y to the clipping rect instead of the texture rect. This has minor effects on lancelot, but all within the 5% fuzz. Change-Id: Ia6141e4f7649dad53211bd959af1bce48372e26d Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/gui/painting/qdrawhelper.cpp | 60 +++++++++++++++++++------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 724af095ad..64956d342d 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -1562,8 +1562,12 @@ static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, int y, int x, int length) { Q_STATIC_ASSERT(blendType == BlendTransformed || blendType == BlendTransformedTiled); - int image_width = data->texture.width; - int image_height = data->texture.height; + const int image_width = data->texture.width; + const int image_height = data->texture.height; + const int image_x1 = data->texture.x1; + const int image_y1 = data->texture.y1; + const int image_x2 = data->texture.x2 - 1; + const int image_y2 = data->texture.y2 - 1; const qreal cx = x + qreal(0.5); const qreal cy = y + qreal(0.5); @@ -1596,8 +1600,8 @@ static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, if (px < 0) px += image_width; if (py < 0) py += image_height; } else { - px = qBound(0, px, image_width - 1); - py = qBound(0, py, image_height - 1); + px = qBound(image_x1, px, image_x2); + py = qBound(image_y1, py, image_y2); } *b = fetch(data->texture.scanLine(py), px); @@ -1627,8 +1631,8 @@ static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, if (px < 0) px += image_width; if (py < 0) py += image_height; } else { - px = qBound(0, px, image_width - 1); - py = qBound(0, py, image_height - 1); + px = qBound(image_x1, px, image_x2); + py = qBound(image_y1, py, image_y2); } *b = fetch(data->texture.scanLine(py), px); @@ -1649,8 +1653,12 @@ template /* either BlendTransformed or BlendTransfo static const QRgba64 *QT_FASTCALL fetchTransformed64(QRgba64 *buffer, const Operator *, const QSpanData *data, int y, int x, int length) { - int image_width = data->texture.width; - int image_height = data->texture.height; + const int image_width = data->texture.width; + const int image_height = data->texture.height; + const int image_x1 = data->texture.x1; + const int image_y1 = data->texture.y1; + const int image_x2 = data->texture.x2 - 1; + const int image_y2 = data->texture.y2 - 1; const qreal cx = x + qreal(0.5); const qreal cy = y + qreal(0.5); @@ -1687,8 +1695,8 @@ static const QRgba64 *QT_FASTCALL fetchTransformed64(QRgba64 *buffer, const Oper if (px < 0) px += image_width; if (py < 0) py += image_height; } else { - px = qBound(0, px, image_width - 1); - py = qBound(0, py, image_height - 1); + px = qBound(image_x1, px, image_x2); + py = qBound(image_y1, py, image_y2); } buffer32[j] = fetch(data->texture.scanLine(py), px); @@ -1728,8 +1736,8 @@ static const QRgba64 *QT_FASTCALL fetchTransformed64(QRgba64 *buffer, const Oper if (px < 0) px += image_width; if (py < 0) py += image_height; } else { - px = qBound(0, px, image_width - 1); - py = qBound(0, py, image_height - 1); + px = qBound(image_x1, px, image_x2); + py = qBound(image_y1, py, image_y2); } buffer32[j] = fetch(data->texture.scanLine(py), px); @@ -4628,8 +4636,10 @@ static void blend_transformed_argb(int count, const QSpan *spans, void *userData CompositionFunction func = functionForMode[data->rasterBuffer->compositionMode]; uint buffer[buffer_size]; - int image_width = data->texture.width; - int image_height = data->texture.height; + const int image_x1 = data->texture.x1; + const int image_y1 = data->texture.y1; + const int image_x2 = data->texture.x2 - 1; + const int image_y2 = data->texture.y2 - 1; if (data->fast_matrix) { // The increment pr x in the scanline @@ -4656,8 +4666,8 @@ static void blend_transformed_argb(int count, const QSpan *spans, void *userData const uint *end = buffer + l; uint *b = buffer; while (b < end) { - int px = qBound(0, x >> 16, image_width - 1); - int py = qBound(0, y >> 16, image_height - 1); + int px = qBound(image_x1, x >> 16, image_x2); + int py = qBound(image_y1, y >> 16, image_y2); *b = reinterpret_cast(data->texture.scanLine(py))[px]; x += fdx; @@ -4696,8 +4706,8 @@ static void blend_transformed_argb(int count, const QSpan *spans, void *userData const qreal iw = w == 0 ? 1 : 1 / w; const qreal tx = x * iw; const qreal ty = y * iw; - const int px = qBound(0, int(tx) - (tx < 0), image_width - 1); - const int py = qBound(0, int(ty) - (ty < 0), image_height - 1); + const int px = qBound(image_x1, int(tx) - (tx < 0), image_x2); + const int py = qBound(image_y1, int(ty) - (ty < 0), image_y2); *b = reinterpret_cast(data->texture.scanLine(py))[px]; x += fdx; @@ -4729,8 +4739,10 @@ static void blend_transformed_rgb565(int count, const QSpan *spans, void *userDa } quint16 buffer[buffer_size]; - const int image_width = data->texture.width; - const int image_height = data->texture.height; + const int image_x1 = data->texture.x1; + const int image_y1 = data->texture.y1; + const int image_x2 = data->texture.x2 - 1; + const int image_y2 = data->texture.y2 - 1; if (data->fast_matrix) { // The increment pr x in the scanline @@ -4768,8 +4780,8 @@ static void blend_transformed_rgb565(int count, const QSpan *spans, void *userDa const quint16 *end = b + l; while (b < end) { - const int px = qBound(0, x >> 16, image_width - 1); - const int py = qBound(0, y >> 16, image_height - 1); + const int px = qBound(image_x1, x >> 16, image_x2); + const int py = qBound(image_y1, y >> 16, image_y2); *b = ((const quint16 *)data->texture.scanLine(py))[px]; ++b; @@ -4827,8 +4839,8 @@ static void blend_transformed_rgb565(int count, const QSpan *spans, void *userDa const qreal tx = x * iw; const qreal ty = y * iw; - const int px = qBound(0, int(tx) - (tx < 0), image_width - 1); - const int py = qBound(0, int(ty) - (ty < 0), image_height - 1); + const int px = qBound(image_x1, int(tx) - (tx < 0), image_x2); + const int py = qBound(image_y1, int(ty) - (ty < 0), image_y2); *b = ((const quint16 *)data->texture.scanLine(py))[px]; ++b; From 2fd3d8ea9e3e1829653942431070a83569bab6eb Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 30 Sep 2016 15:16:55 +0200 Subject: [PATCH 119/174] tests/auto/widgets: use QCOMPARE(., nullptr) .. instead of manually casted 0s. QCOMPARE(., nullptr) was added for Qt 5.8. Make use of the new API. In tst_qwidget.cpp, as a drive-by, change qApp->focusWidget() -> QApplication::focusWidget() Change-Id: I1331b8916b026d48e01534d1ed0b3d72f3f3d50c Reviewed-by: Friedemann Kleint --- .../dialogs/qfiledialog/tst_qfiledialog.cpp | 6 +- .../qfilesystemmodel/tst_qfilesystemmodel.cpp | 2 +- .../widgets/dialogs/qwizard/tst_qwizard.cpp | 2 +- .../tst_qgraphicsgridlayout.cpp | 4 +- .../qgraphicsitem/tst_qgraphicsitem.cpp | 214 +++++++++--------- .../tst_qgraphicsitemanimation.cpp | 6 +- .../qgraphicslayout/tst_qgraphicslayout.cpp | 6 +- .../tst_qgraphicslayoutitem.cpp | 2 +- .../tst_qgraphicslinearlayout.cpp | 2 +- .../tst_qgraphicsproxywidget.cpp | 4 +- .../qgraphicsscene/tst_qgraphicsscene.cpp | 24 +- .../qgraphicsview/tst_qgraphicsview.cpp | 8 +- .../qgraphicswidget/tst_qgraphicswidget.cpp | 34 +-- .../tst_qabstractitemview.cpp | 2 +- .../itemviews/qcolumnview/tst_qcolumnview.cpp | 6 +- .../tst_qdatawidgetmapper.cpp | 10 +- .../itemviews/qlistwidget/tst_qlistwidget.cpp | 12 +- .../qtablewidget/tst_qtablewidget.cpp | 4 +- .../itemviews/qtreeview/tst_qtreeview.cpp | 14 +- .../itemviews/qtreewidget/tst_qtreewidget.cpp | 18 +- .../tst_qtreewidgetitemiterator.cpp | 4 +- .../widgets/kernel/qlayout/tst_qlayout.cpp | 2 +- .../qstackedlayout/tst_qstackedlayout.cpp | 6 +- .../widgets/kernel/qwidget/tst_qwidget.cpp | 56 ++--- .../qwindowcontainer/tst_qwindowcontainer.cpp | 2 +- .../styles/qstyleoption/tst_qstyleoption.cpp | 2 +- .../util/qundogroup/tst_qundogroup.cpp | 14 +- .../widgets/qcombobox/tst_qcombobox.cpp | 6 +- .../widgets/qdockwidget/tst_qdockwidget.cpp | 4 +- .../auto/widgets/widgets/qmenu/tst_qmenu.cpp | 4 +- 30 files changed, 240 insertions(+), 240 deletions(-) diff --git a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp index 741b5e8aae..c9aef497af 100644 --- a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp +++ b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp @@ -1026,17 +1026,17 @@ void tst_QFiledialog::viewMode() void tst_QFiledialog::proxymodel() { QFileDialog fd; - QCOMPARE(fd.proxyModel(), (QAbstractProxyModel*)0); + QCOMPARE(fd.proxyModel(), nullptr); fd.setProxyModel(0); - QCOMPARE(fd.proxyModel(), (QAbstractProxyModel*)0); + QCOMPARE(fd.proxyModel(), nullptr); QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(&fd); fd.setProxyModel(proxyModel); QCOMPARE(fd.proxyModel(), (QAbstractProxyModel *)proxyModel); fd.setProxyModel(0); - QCOMPARE(fd.proxyModel(), (QAbstractProxyModel*)0); + QCOMPARE(fd.proxyModel(), nullptr); } void tst_QFiledialog::setEmptyNameFilter() diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp index 0bb2c50b9d..31df66e312 100644 --- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp +++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp @@ -135,7 +135,7 @@ tst_QFileSystemModel::tst_QFileSystemModel() : model(0) void tst_QFileSystemModel::init() { cleanup(); - QCOMPARE(model, (QFileSystemModel*)0); + QCOMPARE(model, nullptr); model = new QFileSystemModel; } diff --git a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp index 2a629c3ff0..db86fba59c 100644 --- a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp +++ b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp @@ -2400,7 +2400,7 @@ void tst_QWizard::removePage() QCOMPARE(arguments.at(0).toInt(), 3); QVERIFY(wizard.visitedPages().empty()); QVERIFY(wizard.pageIds().empty()); - QCOMPARE(wizard.currentPage(), static_cast(0)); + QCOMPARE(wizard.currentPage(), nullptr); } void tst_QWizard::sideWidget() diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp index f5b2269297..9d4b640272 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp @@ -1073,7 +1073,7 @@ void tst_QGraphicsGridLayout::itemAt() } else { const QByteArray message = "QGraphicsGridLayout::itemAt: invalid index " + QByteArray::number(i); QTest::ignoreMessage(QtWarningMsg, message.constData()); - QCOMPARE(layout->itemAt(i), static_cast(0)); + QCOMPARE(layout->itemAt(i), nullptr); } } delete widget; @@ -1102,7 +1102,7 @@ void tst_QGraphicsGridLayout::removeAt() QGraphicsLayoutItem *item0 = layout->itemAt(0); QCOMPARE(item0->parentLayoutItem(), static_cast(layout)); layout->removeAt(0); - QCOMPARE(item0->parentLayoutItem(), static_cast(0)); + QCOMPARE(item0->parentLayoutItem(), nullptr); QCOMPARE(layout->count(), 0); QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::removeAt: invalid index 0").toLatin1().constData()); layout->removeAt(0); diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 96a76d885d..96827022a8 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -486,7 +486,7 @@ void tst_QGraphicsItem::construction() ((QGraphicsEllipseItem *)item)->setPen(QPen(Qt::black, 0)); QCOMPARE(int(item->type()), int(QGraphicsEllipseItem::Type)); QCOMPARE(qgraphicsitem_cast(item), (QGraphicsEllipseItem *)item); - QCOMPARE(qgraphicsitem_cast(item), (QGraphicsRectItem *)0); + QCOMPARE(qgraphicsitem_cast(item), nullptr); QCOMPARE(item->flags(), 0); break; case 1: @@ -494,7 +494,7 @@ void tst_QGraphicsItem::construction() ((QGraphicsLineItem *)item)->setPen(QPen(Qt::black, 0)); QCOMPARE(int(item->type()), int(QGraphicsLineItem::Type)); QCOMPARE(qgraphicsitem_cast(item), (QGraphicsLineItem *)item); - QCOMPARE(qgraphicsitem_cast(item), (QGraphicsRectItem *)0); + QCOMPARE(qgraphicsitem_cast(item), nullptr); QCOMPARE(item->flags(), 0); break; case 2: @@ -502,14 +502,14 @@ void tst_QGraphicsItem::construction() ((QGraphicsPathItem *)item)->setPen(QPen(Qt::black, 0)); QCOMPARE(int(item->type()), int(QGraphicsPathItem::Type)); QCOMPARE(qgraphicsitem_cast(item), (QGraphicsPathItem *)item); - QCOMPARE(qgraphicsitem_cast(item), (QGraphicsRectItem *)0); + QCOMPARE(qgraphicsitem_cast(item), nullptr); QCOMPARE(item->flags(), 0); break; case 3: item = new QGraphicsPixmapItem; QCOMPARE(int(item->type()), int(QGraphicsPixmapItem::Type)); QCOMPARE(qgraphicsitem_cast(item), (QGraphicsPixmapItem *)item); - QCOMPARE(qgraphicsitem_cast(item), (QGraphicsRectItem *)0); + QCOMPARE(qgraphicsitem_cast(item), nullptr); QCOMPARE(item->flags(), 0); break; case 4: @@ -517,7 +517,7 @@ void tst_QGraphicsItem::construction() ((QGraphicsPolygonItem *)item)->setPen(QPen(Qt::black, 0)); QCOMPARE(int(item->type()), int(QGraphicsPolygonItem::Type)); QCOMPARE(qgraphicsitem_cast(item), (QGraphicsPolygonItem *)item); - QCOMPARE(qgraphicsitem_cast(item), (QGraphicsRectItem *)0); + QCOMPARE(qgraphicsitem_cast(item), nullptr); QCOMPARE(item->flags(), 0); break; case 5: @@ -525,14 +525,14 @@ void tst_QGraphicsItem::construction() ((QGraphicsRectItem *)item)->setPen(QPen(Qt::black, 0)); QCOMPARE(int(item->type()), int(QGraphicsRectItem::Type)); QCOMPARE(qgraphicsitem_cast(item), (QGraphicsRectItem *)item); - QCOMPARE(qgraphicsitem_cast(item), (QGraphicsLineItem *)0); + QCOMPARE(qgraphicsitem_cast(item), nullptr); QCOMPARE(item->flags(), 0); break; case 6: item = new QGraphicsTextItem; QCOMPARE(int(item->type()), int(QGraphicsTextItem::Type)); QCOMPARE(qgraphicsitem_cast(item), (QGraphicsTextItem *)item); - QCOMPARE(qgraphicsitem_cast(item), (QGraphicsRectItem *)0); + QCOMPARE(qgraphicsitem_cast(item), nullptr); // This is the only item that uses an extended style option. QCOMPARE(item->flags(), QGraphicsItem::GraphicsItemFlags(QGraphicsItem::ItemUsesExtendedStyleOption)); break; @@ -541,8 +541,8 @@ void tst_QGraphicsItem::construction() break; } - QCOMPARE(item->scene(), (QGraphicsScene *)0); - QCOMPARE(item->parentItem(), (QGraphicsItem *)0); + QCOMPARE(item->scene(), nullptr); + QCOMPARE(item->parentItem(), nullptr); QVERIFY(item->childItems().isEmpty()); QVERIFY(item->isVisible()); QVERIFY(item->isEnabled()); @@ -640,7 +640,7 @@ void tst_QGraphicsItem::destruction() QGraphicsScene scene; QGraphicsItem *parent = new QGraphicsRectItem; Item *child = new Item; - QCOMPARE(child->parentItem(), (QGraphicsItem *)0); + QCOMPARE(child->parentItem(), nullptr); child->setParentItem(parent); QCOMPARE(child->parentItem(), parent); scene.addItem(parent); @@ -669,7 +669,7 @@ void tst_QGraphicsItem::destruction() scene.addItem(parent); QCOMPARE(child->scene(), &scene); scene.removeItem(parent); - QCOMPARE(child->scene(), (QGraphicsScene *)0); + QCOMPARE(child->scene(), nullptr); delete parent; QCOMPARE(itemDeleted, 5); } @@ -678,14 +678,14 @@ void tst_QGraphicsItem::destruction() QGraphicsItem *parent = new QGraphicsRectItem; Item *child = new Item; child->setParentItem(parent); - QCOMPARE(child->scene(), (QGraphicsScene *)0); - QCOMPARE(parent->scene(), (QGraphicsScene *)0); + QCOMPARE(child->scene(), nullptr); + QCOMPARE(parent->scene(), nullptr); scene.addItem(parent); QCOMPARE(child->scene(), &scene); scene.removeItem(child); - QCOMPARE(child->scene(), (QGraphicsScene *)0); + QCOMPARE(child->scene(), nullptr); QCOMPARE(parent->scene(), &scene); - QCOMPARE(child->parentItem(), (QGraphicsItem *)0); + QCOMPARE(child->parentItem(), nullptr); QVERIFY(parent->childItems().isEmpty()); delete parent; QCOMPARE(itemDeleted, 5); @@ -799,7 +799,7 @@ void tst_QGraphicsItem::deleteChildItem() void tst_QGraphicsItem::scene() { QGraphicsRectItem *item = new QGraphicsRectItem; - QCOMPARE(item->scene(), (QGraphicsScene *)0); + QCOMPARE(item->scene(), nullptr); QGraphicsScene scene; scene.addItem(item); @@ -810,7 +810,7 @@ void tst_QGraphicsItem::scene() QCOMPARE(item->scene(), (QGraphicsScene *)&scene2); scene2.removeItem(item); - QCOMPARE(item->scene(), (QGraphicsScene *)0); + QCOMPARE(item->scene(), nullptr); delete item; } @@ -818,14 +818,14 @@ void tst_QGraphicsItem::scene() void tst_QGraphicsItem::parentItem() { QGraphicsRectItem item; - QCOMPARE(item.parentItem(), (QGraphicsItem *)0); + QCOMPARE(item.parentItem(), nullptr); QGraphicsRectItem *item2 = new QGraphicsRectItem(QRectF(), &item); QCOMPARE(item2->parentItem(), (QGraphicsItem *)&item); item2->setParentItem(&item); QCOMPARE(item2->parentItem(), (QGraphicsItem *)&item); item2->setParentItem(0); - QCOMPARE(item2->parentItem(), (QGraphicsItem *)0); + QCOMPARE(item2->parentItem(), nullptr); delete item2; } @@ -837,7 +837,7 @@ void tst_QGraphicsItem::setParentItem() QCOMPARE(item->scene(), &scene); const QScopedPointer child(new QGraphicsRectItem); - QCOMPARE(child->scene(), (QGraphicsScene *)0); + QCOMPARE(child->scene(), nullptr); // This implicitly adds the item to the parent's scene child->setParentItem(item.data()); @@ -850,7 +850,7 @@ void tst_QGraphicsItem::setParentItem() // Add the child back to the parent, then remove the parent from the scene child->setParentItem(item.data()); scene.removeItem(item.data()); - QCOMPARE(child->scene(), (QGraphicsScene *)0); + QCOMPARE(child->scene(), nullptr); } void tst_QGraphicsItem::children() @@ -917,7 +917,7 @@ void tst_QGraphicsItem::flags() event.setButton(Qt::LeftButton); event.setButtons(Qt::LeftButton); QApplication::sendEvent(&scene, &event); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); // mouse grabber is reset + QCOMPARE(scene.mouseGrabberItem(), nullptr); // mouse grabber is reset QGraphicsSceneMouseEvent event2(QEvent::GraphicsSceneMouseMove); event2.setScenePos(QPointF(10, 10)); @@ -930,7 +930,7 @@ void tst_QGraphicsItem::flags() event3.setScenePos(QPointF(10, 10)); event3.setButtons(0); QApplication::sendEvent(&scene, &event3); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); item->setFlag(QGraphicsItem::ItemIsMovable, true); QGraphicsSceneMouseEvent event4(QEvent::GraphicsSceneMousePress); @@ -1122,9 +1122,9 @@ void tst_QGraphicsItem::visible() QApplication::sendEvent(&scene, &event); QCOMPARE(scene.mouseGrabberItem(), item); item->setVisible(false); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); item->setVisible(true); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); item->setFlag(QGraphicsItem::ItemIsFocusable); item->setFocus(); @@ -1378,12 +1378,12 @@ void tst_QGraphicsItem::enabled() event.setButton(Qt::LeftButton); event.setScenePos(QPointF(0, 0)); QApplication::sendEvent(&scene, &event); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); item->setEnabled(true); QApplication::sendEvent(&scene, &event); QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)item); item->setEnabled(false); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); } void tst_QGraphicsItem::explicitlyEnabled() @@ -1888,7 +1888,7 @@ void tst_QGraphicsItem::acceptedMouseButtons() QApplication::sendEvent(&scene, &event); QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)item2); item2->setAcceptedMouseButtons(0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QApplication::sendEvent(&scene, &event); QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)item1); } @@ -2069,8 +2069,8 @@ void tst_QGraphicsItem::hasFocus() scene2.addItem(line); QVERIFY(!line->hasFocus()); - QCOMPARE(scene.focusItem(), (QGraphicsItem *)0); - QCOMPARE(scene2.focusItem(), (QGraphicsItem *)0); + QCOMPARE(scene.focusItem(), nullptr); + QCOMPARE(scene2.focusItem(), nullptr); line->setFocus(); QVERIFY(line->hasFocus()); @@ -3137,7 +3137,7 @@ void tst_QGraphicsItem::commonAncestorItem() grandPa->setParentItem(ancestor); QCOMPARE(grandMa->commonAncestorItem(grandMa), grandMa); - QCOMPARE(grandMa->commonAncestorItem(0), (QGraphicsItem *)0); + QCOMPARE(grandMa->commonAncestorItem(0), nullptr); QCOMPARE(grandMa->commonAncestorItem(grandPa), ancestor); QCOMPARE(grandPa->commonAncestorItem(grandMa), ancestor); QCOMPARE(grandPa->commonAncestorItem(husband), grandPa); @@ -3556,9 +3556,9 @@ void tst_QGraphicsItem::group() parent->setPos(25, 25); child->setPos(25, 25); - QCOMPARE(parent->group(), (QGraphicsItemGroup *)0); - QCOMPARE(parent2->group(), (QGraphicsItemGroup *)0); - QCOMPARE(child->group(), (QGraphicsItemGroup *)0); + QCOMPARE(parent->group(), nullptr); + QCOMPARE(parent2->group(), nullptr); + QCOMPARE(child->group(), nullptr); QGraphicsView view(&scene); view.show(); @@ -3620,8 +3620,8 @@ void tst_QGraphicsItem::setGroup() QGraphicsItemGroup group2; const QScopedPointer rect(new QGraphicsRectItem); - QCOMPARE(rect->group(), (QGraphicsItemGroup *)0); - QCOMPARE(rect->parentItem(), (QGraphicsItem *)0); + QCOMPARE(rect->group(), nullptr); + QCOMPARE(rect->parentItem(), nullptr); rect->setGroup(&group1); QCOMPARE(rect->group(), &group1); QCOMPARE(rect->parentItem(), (QGraphicsItem *)&group1); @@ -3629,8 +3629,8 @@ void tst_QGraphicsItem::setGroup() QCOMPARE(rect->group(), &group2); QCOMPARE(rect->parentItem(), (QGraphicsItem *)&group2); rect->setGroup(0); - QCOMPARE(rect->group(), (QGraphicsItemGroup *)0); - QCOMPARE(rect->parentItem(), (QGraphicsItem *)0); + QCOMPARE(rect->group(), nullptr); + QCOMPARE(rect->parentItem(), nullptr); } void tst_QGraphicsItem::setGroup2() @@ -3679,14 +3679,14 @@ void tst_QGraphicsItem::nestedGroups() QCOMPARE(rect->group(), group1); QCOMPARE(rect2->group(), group1); QCOMPARE(group1->group(), group2); - QCOMPARE(group2->group(), (QGraphicsItemGroup *)0); + QCOMPARE(group2->group(), nullptr); QGraphicsScene scene; scene.addItem(group1); QCOMPARE(rect->group(), group1); QCOMPARE(rect2->group(), group1); - QCOMPARE(group1->group(), (QGraphicsItemGroup *)0); + QCOMPARE(group1->group(), nullptr); QVERIFY(group2->childItems().isEmpty()); delete group2; @@ -4769,8 +4769,8 @@ void tst_QGraphicsItem::itemChange() QCOMPARE(tester.changes.size(), ++changeCount); QCOMPARE(tester.changes.last(), QGraphicsItem::ItemParentChange); QCOMPARE(qvariant_cast(tester.values.last()), (QGraphicsItem *)&testerHelper); - QCOMPARE(qvariant_cast(tester.oldValues.last()), (QGraphicsItem *)0); - QCOMPARE(tester.parentItem(), (QGraphicsItem *)0); + QCOMPARE(qvariant_cast(tester.oldValues.last()), nullptr); + QCOMPARE(tester.parentItem(), nullptr); } { // ItemOpacityChange @@ -4866,7 +4866,7 @@ void tst_QGraphicsItem::itemChange() QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemSceneHasChanged); // Item's old value was 0 // Item's current value is scene - QCOMPARE(qvariant_cast(tester.oldValues.last()), (QGraphicsScene *)0); + QCOMPARE(qvariant_cast(tester.oldValues.last()), nullptr); QCOMPARE(qvariant_cast(tester.values.last()), (QGraphicsScene *)&scene); scene2.addItem(&tester); ++changeCount; // ItemSceneChange (0) was: (scene) @@ -4884,14 +4884,14 @@ void tst_QGraphicsItem::itemChange() // Item's last current value is 0 QCOMPARE(qvariant_cast(tester.oldValues.at(tester.oldValues.size() - 2)), (QGraphicsScene *)&scene); - QCOMPARE(qvariant_cast(tester.oldValues.at(tester.oldValues.size() - 1)), (QGraphicsScene *)0); - QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 4)), (QGraphicsScene *)0); - QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 3)), (QGraphicsScene *)0); + QCOMPARE(qvariant_cast(tester.oldValues.at(tester.oldValues.size() - 1)), nullptr); + QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 4)), nullptr); + QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 3)), nullptr); QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)&scene2); QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)&scene2); // Item's last old value was 0 // Item's last current value is scene2 - QCOMPARE(qvariant_cast(tester.oldValues.last()), (QGraphicsScene *)0); + QCOMPARE(qvariant_cast(tester.oldValues.last()), nullptr); QCOMPARE(qvariant_cast(tester.values.last()), (QGraphicsScene *)&scene2); scene2.removeItem(&tester); @@ -4899,14 +4899,14 @@ void tst_QGraphicsItem::itemChange() ++changeCount; // ItemSceneHasChanged (0) QCOMPARE(tester.changes.size(), changeCount); - QCOMPARE(tester.scene(), (QGraphicsScene *)0); + QCOMPARE(tester.scene(), nullptr); QCOMPARE(tester.changes.at(tester.changes.size() - 2), QGraphicsItem::ItemSceneChange); QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemSceneHasChanged); // Item's last old value was scene2 // Item's last current value is 0 QCOMPARE(qvariant_cast(tester.oldValues.last()), (QGraphicsScene *)&scene2); - QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 2)), (QGraphicsScene *)0); - QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 1)), (QGraphicsScene *)0); + QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 2)), nullptr); + QCOMPARE(qvariant_cast(tester.values.at(tester.values.size() - 1)), nullptr); tester.itemSceneChangeTargetScene = &scene; scene2.addItem(&tester); @@ -4925,7 +4925,7 @@ void tst_QGraphicsItem::itemChange() scene.removeItem(&tester); ++changeCount; // ItemSceneChange ++changeCount; // ItemSceneHasChanged - QCOMPARE(tester.scene(), (QGraphicsScene *)0); + QCOMPARE(tester.scene(), nullptr); } { // ItemToolTipChange/ItemToolTipHasChanged @@ -6505,7 +6505,7 @@ void tst_QGraphicsItem::task240400_clickOnTextItem() if (flags || textFlags) QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)item); else - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); { QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease); event.setScenePos(item->sceneBoundingRect().topLeft() + QPointF(0.1, 0.1)); @@ -6532,7 +6532,7 @@ void tst_QGraphicsItem::task240400_clickOnTextItem() if (flags || textFlags) QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)item); else - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); { QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease); event.setScenePos(item->sceneBoundingRect().center()); @@ -8454,17 +8454,17 @@ void tst_QGraphicsItem::focusProxy() QTest::ignoreMessage(QtWarningMsg, err.toLatin1().constData()); item2->setFocusProxy(item); // fails QCOMPARE(item->focusProxy(), (QGraphicsItem *)item2); - QCOMPARE(item2->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(item2->focusProxy(), nullptr); // Try to assign self as focus proxy QTest::ignoreMessage(QtWarningMsg, "QGraphicsItem::setFocusProxy: cannot assign self as focus proxy"); item->setFocusProxy(item); // fails QCOMPARE(item->focusProxy(), (QGraphicsItem *)item2); - QCOMPARE(item2->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(item2->focusProxy(), nullptr); // Reset the focus proxy item->setFocusProxy(0); - QCOMPARE(item->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(item->focusProxy(), nullptr); QVERIFY(!item->hasFocus()); QVERIFY(item2->hasFocus()); @@ -8472,7 +8472,7 @@ void tst_QGraphicsItem::focusProxy() item->setFocusProxy(item2); QCOMPARE(item->focusProxy(), (QGraphicsItem *)item2); delete item2; - QCOMPARE(item->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(item->focusProxy(), nullptr); // Test event delivery item2 = scene.addRect(0, 0, 10, 10); @@ -8502,11 +8502,11 @@ void tst_QGraphicsItem::focusProxy() item3->setFocusProxy(item2); // item and item3 use item2 as proxy QCOMPARE(item->focusProxy(), item2); - QCOMPARE(item2->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(item2->focusProxy(), nullptr); QCOMPARE(item3->focusProxy(), item2); delete item2; - QCOMPARE(item->focusProxy(), (QGraphicsItem *)0); - QCOMPARE(item3->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(item->focusProxy(), nullptr); + QCOMPARE(item3->focusProxy(), nullptr); } void tst_QGraphicsItem::subFocus() @@ -8557,8 +8557,8 @@ void tst_QGraphicsItem::subFocus() // readd them. Now the subfocus should kick in and give // text2 focus. scene.removeItem(text); - QCOMPARE(text->focusItem(), (QGraphicsItem *)0); - QCOMPARE(text2->focusItem(), (QGraphicsItem *)0); + QCOMPARE(text->focusItem(), nullptr); + QCOMPARE(text2->focusItem(), nullptr); text2->setFocus(); QCOMPARE(text->focusItem(), (QGraphicsItem *)text2); QCOMPARE(text2->focusItem(), (QGraphicsItem *)text2); @@ -8596,9 +8596,9 @@ void tst_QGraphicsItem::subFocus() QVERIFY(rect3->hasFocus()); delete rect2; - QCOMPARE(text->focusItem(), (QGraphicsItem *)0); - QCOMPARE(text2->focusItem(), (QGraphicsItem *)0); - QCOMPARE(rect->focusItem(), (QGraphicsItem *)0); + QCOMPARE(text->focusItem(), nullptr); + QCOMPARE(text2->focusItem(), nullptr); + QCOMPARE(rect->focusItem(), nullptr); } void tst_QGraphicsItem::focusProxyDeletion() @@ -8609,7 +8609,7 @@ void tst_QGraphicsItem::focusProxyDeletion() QCOMPARE(rect->focusProxy(), (QGraphicsItem *)rect2); delete rect2; - QCOMPARE(rect->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(rect->focusProxy(), nullptr); rect2 = new QGraphicsRectItem; rect->setFocusProxy(rect2); @@ -8623,12 +8623,12 @@ void tst_QGraphicsItem::focusProxyDeletion() scene->addItem(rect); scene->addItem(rect2); delete rect2; - QCOMPARE(rect->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(rect->focusProxy(), nullptr); rect2 = new QGraphicsRectItem; QTest::ignoreMessage(QtWarningMsg, "QGraphicsItem::setFocusProxy: focus proxy must be in same scene"); rect->setFocusProxy(rect2); - QCOMPARE(rect->focusProxy(), (QGraphicsItem *)0); + QCOMPARE(rect->focusProxy(), nullptr); scene->addItem(rect2); rect->setFocusProxy(rect2); QCOMPARE(rect->focusProxy(), (QGraphicsItem *)rect2); @@ -9003,7 +9003,7 @@ void tst_QGraphicsItem::activate() QVERIFY(rect3->isActive()); scene.removeItem(rect3); QVERIFY(!rect3->isActive()); // no panel is active anymore - QCOMPARE(scene.activePanel(), (QGraphicsItem *)0); + QCOMPARE(scene.activePanel(), nullptr); scene.addItem(rect3); QVERIFY(rect3->isActive()); // second panel item is activated @@ -9043,7 +9043,7 @@ void tst_QGraphicsItem::activate() QVERIFY(!rect4->isActive()); QVERIFY(!rect5->isActive()); QVERIFY(!rect6->isActive()); - QCOMPARE(scene.activePanel(), (QGraphicsItem *)0); + QCOMPARE(scene.activePanel(), nullptr); // Controlling auto-activation when the scene changes activation. rect4->setActive(true); @@ -9071,7 +9071,7 @@ void tst_QGraphicsItem::setActivePanelOnInactiveScene() EventSpy sceneActivationChangeSpy(&scene, QEvent::ActivationChange); scene.setActivePanel(panel); - QCOMPARE(scene.activePanel(), (QGraphicsItem *)0); + QCOMPARE(scene.activePanel(), nullptr); QCOMPARE(itemActivateSpy.count(), 0); QCOMPARE(itemDeactivateSpy.count(), 0); QCOMPARE(panelActivateSpy.count(), 0); @@ -9350,7 +9350,7 @@ void tst_QGraphicsItem::focusScope() QCOMPARE(scope3->focusItem(), (QGraphicsItem *)scope3); QCOMPARE(scope1->focusScopeItem(), (QGraphicsItem *)scope2); QCOMPARE(scope2->focusScopeItem(), (QGraphicsItem *)scope3); - QCOMPARE(scope3->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope3->focusScopeItem(), nullptr); scene.addItem(scope1); @@ -9363,7 +9363,7 @@ void tst_QGraphicsItem::focusScope() QCOMPARE(scope3->focusItem(), (QGraphicsItem *)scope3); QCOMPARE(scope1->focusScopeItem(), (QGraphicsItem *)scope2); QCOMPARE(scope2->focusScopeItem(), (QGraphicsItem *)scope3); - QCOMPARE(scope3->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope3->focusScopeItem(), nullptr); QVERIFY(scope3->hasFocus()); @@ -9445,8 +9445,8 @@ void tst_QGraphicsItem::focusScope() rect4->setParentItem(0); QVERIFY(rect5->hasFocus()); - QCOMPARE(scope3->focusScopeItem(), (QGraphicsItem *)0); - QCOMPARE(scope3->focusItem(), (QGraphicsItem *)0); + QCOMPARE(scope3->focusScopeItem(), nullptr); + QCOMPARE(scope3->focusItem(), nullptr); QVERIFY(!scope3->hasFocus()); QGraphicsRectItem *rectA = new QGraphicsRectItem; @@ -9501,7 +9501,7 @@ void tst_QGraphicsItem::focusScope2() siblingChild2->setParentItem(siblingFocusScope); QCOMPARE(siblingFocusScope->focusScopeItem(), (QGraphicsItem *)siblingChild1); - QCOMPARE(siblingFocusScope->focusItem(), (QGraphicsItem *)0); + QCOMPARE(siblingFocusScope->focusItem(), nullptr); QGraphicsItem *root = new QGraphicsRectItem; rootFocusScope->setParentItem(root); @@ -9526,7 +9526,7 @@ void tst_QGraphicsItem::focusScope2() QVERIFY(!siblingChild2->hasFocus()); QVERIFY(!siblingChild2->focusItem()); QCOMPARE(siblingFocusScope->focusScopeItem(), (QGraphicsItem *)siblingChild2); - QCOMPARE(siblingFocusScope->focusItem(), (QGraphicsItem *)0); + QCOMPARE(siblingFocusScope->focusItem(), nullptr); // Set focus on the scope; focus is forwarded to the focus scope item. siblingFocusScope->setFocus(); @@ -9571,7 +9571,7 @@ void tst_QGraphicsItem::focusScopeItemChangedWhileScopeDoesntHaveFocus() FocusScopeItem *child1 = new FocusScopeItem(&rect); FocusScopeItem *child2 = new FocusScopeItem(&rect); - QCOMPARE(rect.focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(rect.focusScopeItem(), nullptr); QCOMPARE(child1->focusScopeChanged, 0); QCOMPARE(child2->focusScopeChanged, 0); child1->setFocus(); @@ -9587,7 +9587,7 @@ void tst_QGraphicsItem::focusScopeItemChangedWhileScopeDoesntHaveFocus() QCOMPARE(child1->focusScopeChanged, 3); QCOMPARE(child2->focusScopeChanged, 2); child1->clearFocus(); - QCOMPARE(rect.focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(rect.focusScopeItem(), nullptr); QCOMPARE(child1->focusScopeChanged, 4); QCOMPARE(child2->focusScopeChanged, 2); } @@ -10245,7 +10245,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 0); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // releasing goes nowhere sendMouseRelease(&scene, QPoint(-25, -25)); @@ -10255,7 +10255,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 0); QCOMPARE(rect2Spy.counts[QEvent::GraphicsSceneMouseRelease], 0); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // pressing mouse on rect1 starts implicit grab on rect2 (since it is modal) sendMouseClick(&scene, QPoint(-25, -25)); @@ -10285,7 +10285,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 2); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // rect1 does *not* re-grab when rect2 is no longer modal rect2->setPanelModality(QGraphicsItem::NonModal); @@ -10293,7 +10293,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 2); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // release goes nowhere sendMouseRelease(&scene, QPoint(-25, -25)); @@ -10302,7 +10302,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 2); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); } { // repeat the test using PanelModal @@ -10325,7 +10325,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 0); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // releasing goes nowhere sendMouseRelease(&scene, QPoint(-25, -25)); @@ -10335,7 +10335,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 0); QCOMPARE(rect2Spy.counts[QEvent::GraphicsSceneMouseRelease], 0); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // pressing mouse on rect1 starts implicit grab on rect2 (since it is modal) sendMouseClick(&scene, QPoint(-25, -25)); @@ -10365,7 +10365,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 2); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // rect1 does *not* re-grab when rect2 is no longer modal rect2->setPanelModality(QGraphicsItem::NonModal); @@ -10373,7 +10373,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 2); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // release goes nowhere sendMouseRelease(&scene, QPoint(-25, -25)); @@ -10382,7 +10382,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect1Spy.counts[QEvent::UngrabMouse], 2); QCOMPARE(rect2Spy.counts[QEvent::GrabMouse], 1); QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); } { @@ -10430,7 +10430,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect3Spy.counts[QEvent::GrabMouse], 1); QCOMPARE(rect3Spy.counts[QEvent::GraphicsSceneMouseRelease], 1); QCOMPARE(rect3Spy.counts[QEvent::UngrabMouse], 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); rect2->setPanelModality(QGraphicsItem::NonModal); @@ -10472,7 +10472,7 @@ void tst_QGraphicsItem::modality_mouseGrabber() QCOMPARE(rect2Spy.counts[QEvent::UngrabMouse], 0); QCOMPARE(rect3Spy.counts[QEvent::GrabMouse], 2); QCOMPARE(rect3Spy.counts[QEvent::UngrabMouse], 2); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); } } @@ -10512,7 +10512,7 @@ void tst_QGraphicsItem::modality_clickFocus() // clicking on rect1 should not set it's focus item rect1->clearFocus(); sendMouseClick(&scene, QPointF(-25, -25)); - QCOMPARE(rect1->focusItem(), (QGraphicsItem *) 0); + QCOMPARE(rect1->focusItem(), nullptr); QCOMPARE(rect1Spy.counts[QEvent::FocusIn], 1); QCOMPARE(rect1Spy.counts[QEvent::FocusOut], 1); QCOMPARE(rect2Spy.counts[QEvent::FocusIn], 0); @@ -10531,7 +10531,7 @@ void tst_QGraphicsItem::modality_clickFocus() rect1->setActive(true); rect1->clearFocus(); sendMouseClick(&scene, QPointF(-25, -25)); - QCOMPARE(scene.focusItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.focusItem(), nullptr); QCOMPARE(rect1Spy.counts[QEvent::FocusIn], 2); QCOMPARE(rect1Spy.counts[QEvent::FocusOut], 2); QCOMPARE(rect2Spy.counts[QEvent::FocusIn], 1); @@ -10539,7 +10539,7 @@ void tst_QGraphicsItem::modality_clickFocus() // focus doesn't change when leaving modality either rect2->setPanelModality(QGraphicsItem::NonModal); - QCOMPARE(scene.focusItem(), (QGraphicsItem *) 0); + QCOMPARE(scene.focusItem(), nullptr); QCOMPARE(rect1Spy.counts[QEvent::FocusIn], 2); QCOMPARE(rect1Spy.counts[QEvent::FocusOut], 2); QCOMPARE(rect2Spy.counts[QEvent::FocusIn], 1); @@ -10938,7 +10938,7 @@ void tst_QGraphicsItem::focusHandling() switch (expectedFocusItem) { case 0: - QCOMPARE(scene.focusItem(), static_cast(0)); + QCOMPARE(scene.focusItem(), nullptr); break; case 1: QCOMPARE(scene.focusItem(), focusableUnder); @@ -11304,7 +11304,7 @@ void tst_QGraphicsItem::QT_2649_focusScope() scope->setFocus(); subFocusItem->setParentItem(scope); QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusScopeItem(), nullptr); QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); @@ -11312,9 +11312,9 @@ void tst_QGraphicsItem::QT_2649_focusScope() rootItem->setFlags(QGraphicsItem::ItemIsFocusable); scope->setParentItem(rootItem); QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(rootItem->focusScopeItem(), nullptr); QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusScopeItem(), nullptr); QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); @@ -11327,19 +11327,19 @@ void tst_QGraphicsItem::QT_2649_focusScope() QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(rootItem->focusScopeItem(), nullptr); QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusScopeItem(), nullptr); QVERIFY(subFocusItem->hasFocus()); scope->hide(); - QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)0); - QCOMPARE(scope->focusItem(), (QGraphicsItem *)0); - QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)0); - QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(rootItem->focusItem(), nullptr); + QCOMPARE(scope->focusItem(), nullptr); + QCOMPARE(subFocusItem->focusItem(), nullptr); + QCOMPARE(rootItem->focusScopeItem(), nullptr); QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusScopeItem(), nullptr); QVERIFY(!subFocusItem->hasFocus()); scope->show(); @@ -11347,9 +11347,9 @@ void tst_QGraphicsItem::QT_2649_focusScope() QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(rootItem->focusScopeItem(), nullptr); QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); - QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusScopeItem(), nullptr); QVERIFY(subFocusItem->hasFocus()); // This should not crash diff --git a/tests/auto/widgets/graphicsview/qgraphicsitemanimation/tst_qgraphicsitemanimation.cpp b/tests/auto/widgets/graphicsview/qgraphicsitemanimation/tst_qgraphicsitemanimation.cpp index acdd3cff81..dfb2752ee0 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitemanimation/tst_qgraphicsitemanimation.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitemanimation/tst_qgraphicsitemanimation.cpp @@ -151,7 +151,7 @@ void tst_QGraphicsItemAnimation::overwriteValueForStep() void tst_QGraphicsItemAnimation::setTimeLine() { QGraphicsItemAnimation animation; - QCOMPARE(animation.timeLine(), (QTimeLine *)0); + QCOMPARE(animation.timeLine(), nullptr); QPointer line1 = new QTimeLine; animation.setTimeLine(line1); @@ -161,7 +161,7 @@ void tst_QGraphicsItemAnimation::setTimeLine() QCOMPARE(animation.timeLine(), (QTimeLine *)line1); animation.setTimeLine(0); - QCOMPARE(animation.timeLine(), (QTimeLine *)0); + QCOMPARE(animation.timeLine(), nullptr); QVERIFY(!line1); QTimeLine *line2 = new QTimeLine; @@ -169,7 +169,7 @@ void tst_QGraphicsItemAnimation::setTimeLine() QCOMPARE(animation.timeLine(), (QTimeLine *)line2); delete line2; - QCOMPARE(animation.timeLine(), (QTimeLine *)0); + QCOMPARE(animation.timeLine(), nullptr); } QTEST_MAIN(tst_QGraphicsItemAnimation) diff --git a/tests/auto/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp b/tests/auto/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp index 87cd032ad0..cfc18c6e32 100644 --- a/tests/auto/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp @@ -186,10 +186,10 @@ void tst_QGraphicsLayout::automaticReparenting() l1->addItem(w1); QGraphicsWidget *w2 = new QGraphicsWidget(); l1->addItem(w2); - QCOMPARE(w1->parentItem(), static_cast(0)); - QCOMPARE(w2->parentItem(), static_cast(0)); + QCOMPARE(w1->parentItem(), nullptr); + QCOMPARE(w2->parentItem(), nullptr); scene.addItem(w1); - QCOMPARE(w1->parentItem(), static_cast(0)); + QCOMPARE(w1->parentItem(), nullptr); window->setLayout(l1); QCOMPARE(w1->parentItem(), static_cast(window)); QCOMPARE(w2->parentItem(), static_cast(window)); diff --git a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp index 9b52366855..5b0ceabe62 100644 --- a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp @@ -94,7 +94,7 @@ void tst_QGraphicsLayoutItem::qgraphicslayoutitem() QCOMPARE(layoutItem.isLayout(), false); layoutItem.maximumSize(); layoutItem.minimumSize(); - QCOMPARE(layoutItem.parentLayoutItem(), (QGraphicsLayoutItem*)0); + QCOMPARE(layoutItem.parentLayoutItem(), nullptr); layoutItem.preferredSize(); layoutItem.sizePolicy(); layoutItem.sizeHint(Qt::MinimumSize); diff --git a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp index 5794c32803..322af7c236 100644 --- a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp @@ -800,7 +800,7 @@ void tst_QGraphicsLinearLayout::removeAt() QCOMPARE(wParent, static_cast(&layout)); layout.removeAt(removeItemAt); wParent = w->parentLayoutItem(); - QCOMPARE(wParent, static_cast(0)); + QCOMPARE(wParent, nullptr); delete w; } QCOMPARE(layout.count(), itemCount + layoutCount - (w ? 1 : 0)); diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp index d99c056abe..65c9938f89 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp @@ -482,7 +482,7 @@ void tst_QGraphicsProxyWidget::setWidget() QCOMPARE((qreal)bottom, rbottom); } else { // proxy shouldn't mess with the widget if it can't insert it. - QCOMPARE(proxy->widget(), (QWidget*)0); + QCOMPARE(proxy->widget(), nullptr); QCOMPARE(proxy->acceptHoverEvents(), false); if (subWidget) { QVERIFY(!subWidget->testAttribute(Qt::WA_DontShowOnScreen)); @@ -493,7 +493,7 @@ void tst_QGraphicsProxyWidget::setWidget() } if (widgetExists) { - QCOMPARE(existingSubWidget->parent(), static_cast(0)); + QCOMPARE(existingSubWidget->parent(), nullptr); QVERIFY(!existingSubWidget->testAttribute(Qt::WA_DontShowOnScreen)); QVERIFY(!existingSubWidget->testAttribute(Qt::WA_QuitOnClose)); } diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp index d95f6e408e..7615c5e821 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp @@ -1539,22 +1539,22 @@ void tst_QGraphicsScene::mouseGrabberItem() QApplication::sendEvent(&scene, &moveEvent); QCOMPARE(scene.mouseGrabberItem(), item); item->setVisible(false); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QApplication::sendEvent(&scene, &pressEvent); QCOMPARE(scene.mouseGrabberItem(), item2); item2->setVisible(false); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QApplication::sendEvent(&scene, &moveEvent); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); item2->setVisible(true); QApplication::sendEvent(&scene, &moveEvent); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QApplication::sendEvent(&scene, &pressEvent); QApplication::sendEvent(&scene, &moveEvent); QCOMPARE(scene.mouseGrabberItem(), item2); scene.removeItem(item2); delete item2; - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); } void tst_QGraphicsScene::hoverEvents_siblings() @@ -1757,7 +1757,7 @@ void tst_QGraphicsScene::createItemGroup() // These share no common parent group = scene.createItemGroup(children3); - QCOMPARE(group->parentItem(), (QGraphicsItem *)0); + QCOMPARE(group->parentItem(), nullptr); scene.destroyItemGroup(group); // Make children3 children of parent3 @@ -1886,7 +1886,7 @@ void tst_QGraphicsScene::mouseEventPropagation() QCOMPARE(c->eventTypes.size(), 0); QCOMPARE(b->eventTypes.size(), 0); QCOMPARE(a->eventTypes.size(), 0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); d->setAcceptedMouseButtons(Qt::RightButton); @@ -1927,7 +1927,7 @@ void tst_QGraphicsScene::mouseEventPropagation() QCOMPARE(c->eventTypes.at(5), QEvent::UngrabMouse); QCOMPARE(b->eventTypes.size(), 0); QCOMPARE(a->eventTypes.size(), 0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // Disabled items eat events. c should not get this. d->setEnabled(false); @@ -1939,7 +1939,7 @@ void tst_QGraphicsScene::mouseEventPropagation() QCOMPARE(c->eventTypes.size(), 6); QCOMPARE(b->eventTypes.size(), 0); QCOMPARE(a->eventTypes.size(), 0); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // Send a left press. This goes to c. pressEvent.setButton(Qt::LeftButton); @@ -4609,7 +4609,7 @@ void tst_QGraphicsScene::focusItemChangedSignal() QList arguments = spy.takeFirst(); QCOMPARE(arguments.size(), 3); QCOMPARE(qvariant_cast(arguments.at(0)), (QGraphicsItem *)topLevelItem2); - QCOMPARE(qvariant_cast(arguments.at(1)), (QGraphicsItem *)0); + QCOMPARE(qvariant_cast(arguments.at(1)), nullptr); QCOMPARE(qvariant_cast(arguments.at(2)), Qt::OtherFocusReason); QVERIFY(topLevelItem2->hasFocus()); @@ -4617,7 +4617,7 @@ void tst_QGraphicsScene::focusItemChangedSignal() QCOMPARE(spy.count(), 1); arguments = spy.takeFirst(); QCOMPARE(arguments.size(), 3); - QCOMPARE(qvariant_cast(arguments.at(0)), (QGraphicsItem *)0); + QCOMPARE(qvariant_cast(arguments.at(0)), nullptr); QCOMPARE(qvariant_cast(arguments.at(1)), (QGraphicsItem *)topLevelItem2); QCOMPARE(qvariant_cast(arguments.at(2)), Qt::OtherFocusReason); @@ -4626,7 +4626,7 @@ void tst_QGraphicsScene::focusItemChangedSignal() arguments = spy.takeFirst(); QCOMPARE(arguments.size(), 3); QCOMPARE(qvariant_cast(arguments.at(0)), (QGraphicsItem *)topLevelItem2); - QCOMPARE(qvariant_cast(arguments.at(1)), (QGraphicsItem *)0); + QCOMPARE(qvariant_cast(arguments.at(1)), nullptr); QCOMPARE(qvariant_cast(arguments.at(2)), Qt::MenuBarFocusReason); for (int i = 0; i < 3; ++i) { diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index 2e76ea3bb3..c8bdcbde09 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -489,7 +489,7 @@ void tst_QGraphicsView::scene() QCOMPARE(view.scene(), &scene); } - QCOMPARE(view.scene(), (QGraphicsScene *)0); + QCOMPARE(view.scene(), nullptr); } void tst_QGraphicsView::setScene() @@ -529,9 +529,9 @@ void tst_QGraphicsView::deleteScene() QGraphicsView view3(scene); view3.show(); delete scene; - QCOMPARE(view1.scene(), (QGraphicsScene *)0); - QCOMPARE(view2.scene(), (QGraphicsScene *)0); - QCOMPARE(view3.scene(), (QGraphicsScene *)0); + QCOMPARE(view1.scene(), nullptr); + QCOMPARE(view2.scene(), nullptr); + QCOMPARE(view3.scene(), nullptr); } void tst_QGraphicsView::sceneRect() diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp index 9e390e45a6..1be17b552e 100644 --- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp @@ -287,14 +287,14 @@ void tst_QGraphicsWidget::qgraphicswidget() QVERIFY(!widget.isWindow()); QCOMPARE(widget.boundingRect(), QRectF(0, 0, 0, 0)); - QCOMPARE(widget.focusWidget(), (QGraphicsWidget*)0); + QCOMPARE(widget.focusWidget(), nullptr); QCOMPARE(widget.focusPolicy(), Qt::NoFocus); QCOMPARE(widget.font(), QFont()); QCOMPARE(widget.geometry(), QRectF(widget.pos(), widget.size())); - QCOMPARE(widget.layout(), (QGraphicsLayout*)0); + QCOMPARE(widget.layout(), nullptr); QCOMPARE(widget.layoutDirection(), Qt::LeftToRight); QCOMPARE(widget.palette(), QPalette()); - QCOMPARE(widget.parentWidget(), (QGraphicsWidget*)0); + QCOMPARE(widget.parentWidget(), nullptr); QCOMPARE(widget.rect(), QRectF(QPointF(), widget.size())); QCOMPARE(widget.size(), QSizeF(0, 0)); QVERIFY(widget.style() != (QStyle*)0); @@ -415,7 +415,7 @@ void tst_QGraphicsWidget::focusWidget_data() void tst_QGraphicsWidget::focusWidget() { SubQGraphicsWidget *parent = new SubQGraphicsWidget; - QCOMPARE(parent->focusWidget(), (QGraphicsWidget *)0); + QCOMPARE(parent->focusWidget(), nullptr); QGraphicsScene scene; QEvent windowActivate(QEvent::WindowActivate); qApp->sendEvent(&scene, &windowActivate); @@ -1131,7 +1131,7 @@ void tst_QGraphicsWidget::layout() { SubQGraphicsWidget widget; widget.setContentsMargins(10, 5, 50, 100); - QCOMPARE(widget.layout(), (QGraphicsLayout *)0); + QCOMPARE(widget.layout(), nullptr); QFETCH(int, childCount); QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; @@ -1292,9 +1292,9 @@ void tst_QGraphicsWidget::parentWidget() SubQGraphicsWidget widgetChild(&standAlongWidget); SubQGraphicsWidget itemChild(&standAlongItem); - QCOMPARE(standAlongWidget.parentWidget(), (QGraphicsWidget*)0); + QCOMPARE(standAlongWidget.parentWidget(), nullptr); QCOMPARE(widgetChild.parentWidget(), static_cast(&standAlongWidget)); - QCOMPARE(itemChild.parentWidget(), (QGraphicsWidget*)0); + QCOMPARE(itemChild.parentWidget(), nullptr); for (int i = 0; i < childrenCount; ++i) { SubQGraphicsWidget *item = new SubQGraphicsWidget(&standAlongWidget); @@ -1497,7 +1497,7 @@ void tst_QGraphicsWidget::setTabOrderAndReparent() w[2]->setFocus(); QVERIFY2(compareFocusChain(&view, w + 2, w + 3, &errorMessage), errorMessage.constData()); w[2]->setParentItem(p); - QCOMPARE(scene.focusItem(), static_cast(0)); + QCOMPARE(scene.focusItem(), nullptr); scene.addItem(p); p->setFocus(); @@ -2117,7 +2117,7 @@ void tst_QGraphicsWidget::explicitMouseGrabber() QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); QCOMPARE(widgetGrabEventSpy.count(), 1); widget->ungrabMouse(); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QCOMPARE(widgetUngrabEventSpy.count(), 1); // Grab while grabbing @@ -2165,7 +2165,7 @@ void tst_QGraphicsWidget::explicitMouseGrabber() QCOMPARE(widgetGrabEventSpy.count(), 4); QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); widget->ungrabMouse(); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // Out of order ungrab widget->grabMouse(); @@ -2210,7 +2210,7 @@ void tst_QGraphicsWidget::implicitMouseGrabber() event.setScenePos(QPointF(50, 50)); qApp->sendEvent(&scene, &event); } - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QCOMPARE(widgetGrabEventSpy.count(), 1); QCOMPARE(widgetUngrabEventSpy.count(), 1); @@ -2238,7 +2238,7 @@ void tst_QGraphicsWidget::implicitMouseGrabber() QCOMPARE(widgetUngrabEventSpy.count(), 1); widget->ungrabMouse(); QCOMPARE(widgetUngrabEventSpy.count(), 2); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // Implicit mouse grabber tries to explicitly grab the mouse { @@ -2263,7 +2263,7 @@ void tst_QGraphicsWidget::implicitMouseGrabber() QCOMPARE(widgetGrabEventSpy.count(), 3); QCOMPARE(widgetUngrabEventSpy.count(), 2); widget->ungrabMouse(); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QCOMPARE(widgetGrabEventSpy.count(), 3); QCOMPARE(widgetUngrabEventSpy.count(), 3); @@ -2293,7 +2293,7 @@ void tst_QGraphicsWidget::implicitMouseGrabber() scene.removeItem(widget); QCOMPARE(widgetUngrabEventSpy.count(), 4); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); } class GrabOnPressItem : public QGraphicsRectItem @@ -2367,7 +2367,7 @@ void tst_QGraphicsWidget::doubleClickAfterExplicitMouseGrab() event.setScenePos(QPointF(50, 50)); qApp->sendEvent(&scene, &event); } - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QCOMPARE(item->nrelease, 1); QCOMPARE(item->nungrab, 1); { @@ -2389,7 +2389,7 @@ void tst_QGraphicsWidget::doubleClickAfterExplicitMouseGrab() event.setScenePos(QPointF(50, 50)); qApp->sendEvent(&scene, &event); } - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); QCOMPARE(item->nrelease, 2); QCOMPARE(item->nungrab, 2); } @@ -2411,7 +2411,7 @@ void tst_QGraphicsWidget::popupMouseGrabber() // Hiding it loses the grab again. widget->hide(); QCOMPARE(widgetUngrabEventSpy.count(), 1); - QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); + QCOMPARE(scene.mouseGrabberItem(), nullptr); // Showing it grabs the mouse again widget->show(); diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp index 5567641dde..bd6733e2d0 100644 --- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp +++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp @@ -558,7 +558,7 @@ void tst_QAbstractItemView::noModel() view.setModel(0); // Due to the model is removed, this will generate a valueChanged signal on both scrollbars. (value to 0) QApplication::processEvents(); - QCOMPARE(view.model(), (QAbstractItemModel*)0); + QCOMPARE(view.model(), nullptr); } void tst_QAbstractItemView::dragSelect() diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp index e6c4ab44f8..62acf49f4a 100644 --- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp +++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp @@ -770,15 +770,15 @@ void tst_QColumnView::gripMoved() void tst_QColumnView::preview() { QColumnView view; - QCOMPARE(view.previewWidget(), (QWidget*)0); + QCOMPARE(view.previewWidget(), nullptr); TreeModel model; view.setModel(&model); - QCOMPARE(view.previewWidget(), (QWidget*)0); + QCOMPARE(view.previewWidget(), nullptr); QModelIndex home = model.index(0, 0); QVERIFY(home.isValid()); QVERIFY(model.hasChildren(home)); view.setCurrentIndex(home); - QCOMPARE(view.previewWidget(), (QWidget*)0); + QCOMPARE(view.previewWidget(), nullptr); QModelIndex file; QVERIFY(model.rowCount(home) > 0); diff --git a/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp b/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp index ea88020a56..5ab0a226b7 100644 --- a/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp +++ b/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp @@ -79,7 +79,7 @@ void tst_QDataWidgetMapper::setModel() { QDataWidgetMapper mapper; - QCOMPARE(mapper.model(), (QAbstractItemModel *)0); + QCOMPARE(mapper.model(), nullptr); { // let the model go out of scope firstma QStandardItemModel model; @@ -87,7 +87,7 @@ void tst_QDataWidgetMapper::setModel() QCOMPARE(mapper.model(), static_cast(&model)); } - QCOMPARE(mapper.model(), (QAbstractItemModel *)0); + QCOMPARE(mapper.model(), nullptr); { // let the mapper go out of scope first QStandardItemModel model2; @@ -263,7 +263,7 @@ void tst_QDataWidgetMapper::addMapping() QCOMPARE(edit2.text(), QString("item 0 2")); } // let the edit go out of scope - QCOMPARE(mapper.mappedWidgetAt(2), (QWidget *)0); + QCOMPARE(mapper.mappedWidgetAt(2), nullptr); mapper.toLast(); } @@ -400,7 +400,7 @@ void tst_QDataWidgetMapper::mappedWidgetAt() QLineEdit lineEdit1; QLineEdit lineEdit2; - QCOMPARE(mapper.mappedWidgetAt(432312), (QWidget*)0); + QCOMPARE(mapper.mappedWidgetAt(432312), nullptr); mapper.addMapping(&lineEdit1, 1); mapper.addMapping(&lineEdit2, 2); @@ -410,7 +410,7 @@ void tst_QDataWidgetMapper::mappedWidgetAt() mapper.addMapping(&lineEdit2, 4242); - QCOMPARE(mapper.mappedWidgetAt(2), (QWidget*)0); + QCOMPARE(mapper.mappedWidgetAt(2), nullptr); QCOMPARE(mapper.mappedWidgetAt(4242), static_cast(&lineEdit2)); } diff --git a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp index f8ab64e4d6..eb93e4c167 100644 --- a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp +++ b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp @@ -193,7 +193,7 @@ void tst_QListWidget::init() void tst_QListWidget::checkDefaultValues() { - QCOMPARE(testWidget->currentItem(), (QListWidgetItem *)0); + QCOMPARE(testWidget->currentItem(), nullptr); QCOMPARE(testWidget->currentRow(), -1); QCOMPARE(testWidget->count(), 0); } @@ -413,7 +413,7 @@ void tst_QListWidget::currentItem() if (currentIndex.isValid()) QCOMPARE(testWidget->currentItem(), testWidget->item(currentIndex.row())); else - QCOMPARE(testWidget->currentItem(), (QListWidgetItem*)0); + QCOMPARE(testWidget->currentItem(), nullptr); } void tst_QListWidget::currentRow() @@ -631,7 +631,7 @@ void tst_QListWidget::item() QListWidgetItem *item = testWidget->item(row); if (outOfBounds) { - QCOMPARE(item, static_cast(0)); + QCOMPARE(item, nullptr); QCOMPARE(testWidget->count(), 3); } else { QCOMPARE(item->text(), QStringLiteral("item") + QString::number(row)); @@ -664,7 +664,7 @@ void tst_QListWidget::takeItem() QListWidgetItem *item = testWidget->takeItem(row); if (outOfBounds) { - QCOMPARE(item, static_cast(0)); + QCOMPARE(item, nullptr); QCOMPARE(testWidget->count(), 3); } else { QCOMPARE(item->text(), QStringLiteral("item") + QString::number(row)); @@ -1445,11 +1445,11 @@ void tst_QListWidget::itemWidget() QListWidgetItem *item = new QListWidgetItem(&list); - QCOMPARE(list.itemWidget(item), static_cast(0)); + QCOMPARE(list.itemWidget(item), nullptr); list.setItemWidget(item, &widget); QCOMPARE(list.itemWidget(item), &widget); list.removeItemWidget(item); - QCOMPARE(list.itemWidget(item), static_cast(0)); + QCOMPARE(list.itemWidget(item), nullptr); } #ifndef Q_OS_MAC diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp index a86ffbc30d..4d4a95b3f5 100644 --- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp +++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp @@ -809,13 +809,13 @@ void tst_QTableWidget::itemOwnership() headerItem = new QObjectTableItem(); testWidget->setVerticalHeaderItem(0, headerItem); delete headerItem; - QCOMPARE(testWidget->verticalHeaderItem(0), (QTableWidgetItem *)0); + QCOMPARE(testWidget->verticalHeaderItem(0), nullptr); //delete horizontal headeritem from outside headerItem = new QObjectTableItem(); testWidget->setHorizontalHeaderItem(0, headerItem); delete headerItem; - QCOMPARE(testWidget->horizontalHeaderItem(0), (QTableWidgetItem *)0); + QCOMPARE(testWidget->horizontalHeaderItem(0), nullptr); //setItem item = new QObjectTableItem(); diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp index c7b7ffaf95..80ef0879cc 100644 --- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp +++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp @@ -1107,10 +1107,10 @@ void tst_QTreeView::setModel() { QTreeView view; view.show(); - QCOMPARE(view.model(), (QAbstractItemModel*)0); - QCOMPARE(view.selectionModel(), (QItemSelectionModel*)0); - QCOMPARE(view.header()->model(), (QAbstractItemModel*)0); - QCOMPARE(view.header()->selectionModel(), (QItemSelectionModel*)0); + QCOMPARE(view.model(), nullptr); + QCOMPARE(view.selectionModel(), nullptr); + QCOMPARE(view.header()->model(), nullptr); + QCOMPARE(view.header()->selectionModel(), nullptr); for (int x = 0; x < 2; ++x) { QtTestModel *model = new QtTestModel(10, 8); @@ -1131,9 +1131,9 @@ void tst_QTreeView::setModel() QTRY_COMPARE(modelDestroyedSpy.count(), 0); view.setModel(0); - QCOMPARE(view.model(), (QAbstractItemModel*)0); + QCOMPARE(view.model(), nullptr); // ### shouldn't selectionModel also be 0 now? -// QCOMPARE(view.selectionModel(), (QItemSelectionModel*)0); +// QCOMPARE(view.selectionModel(), nullptr); delete model; } } @@ -1283,7 +1283,7 @@ void tst_QTreeView::noDelegate() QTreeView view; view.setModel(&model); view.setItemDelegate(0); - QCOMPARE(view.itemDelegate(), (QAbstractItemDelegate *)0); + QCOMPARE(view.itemDelegate(), nullptr); } void tst_QTreeView::noModel() diff --git a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp index f1e8c7c814..fcffaa0eb9 100644 --- a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp +++ b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp @@ -194,7 +194,7 @@ void tst_QTreeWidget::getSetCheck() QCOMPARE(obj1.headerItem(), var2); obj1.setHeaderItem((QTreeWidgetItem *)0); -// QCOMPARE(obj1.headerItem(), (QTreeWidgetItem *)0); +// QCOMPARE(obj1.headerItem(), nullptr); // QTreeWidgetItem * QTreeWidget::currentItem() // void QTreeWidget::setCurrentItem(QTreeWidgetItem *) @@ -203,7 +203,7 @@ void tst_QTreeWidget::getSetCheck() QCOMPARE(obj1.currentItem(), var3); obj1.setCurrentItem((QTreeWidgetItem *)0); - QCOMPARE(obj1.currentItem(), (QTreeWidgetItem *)0); + QCOMPARE(obj1.currentItem(), nullptr); } typedef QList IntList; @@ -285,9 +285,9 @@ void tst_QTreeWidget::addTopLevelItem() tree.addTopLevelItem(ti); QCOMPARE(tree.topLevelItemCount(), i+1); QCOMPARE(tree.topLevelItem(i), ti); - QCOMPARE(tree.topLevelItem(-1), static_cast(0)); + QCOMPARE(tree.topLevelItem(-1), nullptr); QCOMPARE(tree.indexOfTopLevelItem(ti), i); - QCOMPARE(ti->parent(), static_cast(0)); + QCOMPARE(ti->parent(), nullptr); tree.addTopLevelItem(ti); QCOMPARE(tree.topLevelItemCount(), i+1); tops.append(ti); @@ -419,7 +419,7 @@ void tst_QTreeWidget::currentItem() // can't set the headerItem to be the current item tree.setCurrentItem(tree.headerItem()); - QCOMPARE(tree.currentItem(), static_cast(0)); + QCOMPARE(tree.currentItem(), nullptr); } void tst_QTreeWidget::editItem_data() @@ -520,7 +520,7 @@ void tst_QTreeWidget::takeItem() int count = testWidget->topLevelItemCount(); QTreeWidgetItem *item = testWidget->takeTopLevelItem(index); if (outOfBounds) { - QCOMPARE(item, (QTreeWidgetItem *)0); + QCOMPARE(item, nullptr); QCOMPARE(count, testWidget->topLevelItemCount()); } else { QCOMPARE(item->text(0), QStringLiteral("top") + QString::number(index)); @@ -531,7 +531,7 @@ void tst_QTreeWidget::takeItem() int count = testWidget->topLevelItem(0)->childCount(); QTreeWidgetItem *item = testWidget->topLevelItem(0)->takeChild(index); if (outOfBounds) { - QCOMPARE(item, (QTreeWidgetItem *)0); + QCOMPARE(item, nullptr); QCOMPARE(count, testWidget->topLevelItem(0)->childCount()); } else { QCOMPARE(item->text(0), QStringLiteral("child") + QString::number(index)); @@ -1664,8 +1664,8 @@ void tst_QTreeWidget::addChild() QCOMPARE(taken, children); QCOMPARE(item->childCount(), 0); for (int i = 0; i < taken.count(); ++i) { - QCOMPARE(taken.at(i)->parent(), static_cast(0)); - QCOMPARE(taken.at(i)->treeWidget(), static_cast(0)); + QCOMPARE(taken.at(i)->parent(), nullptr); + QCOMPARE(taken.at(i)->treeWidget(), nullptr); item->addChild(taken.at(i)); // re-add } diff --git a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp index f08e57c84b..c2c02f3766 100644 --- a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp +++ b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp @@ -1160,7 +1160,7 @@ void tst_QTreeWidgetItemIterator::updateIteratorAfterDeletedItem_and_ContinueIte delete item; it+=iterator_advance_after_removal; if (iterator_new_value.isNull()) { - QCOMPARE((*it), (QTreeWidgetItem*)0); + QCOMPARE((*it), nullptr); } else { QCOMPARE((*it)->text(0), iterator_new_value); } @@ -1202,7 +1202,7 @@ void tst_QTreeWidgetItemIterator::initializeIterator() QTreeWidget tw; QTreeWidgetItemIterator it(&tw); - QCOMPARE((*it), static_cast(0)); + QCOMPARE((*it), nullptr); } void tst_QTreeWidgetItemIterator::sortingEnabled() diff --git a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp index 47fc002196..829d0ea098 100644 --- a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp +++ b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp @@ -297,7 +297,7 @@ void tst_QLayout::warnIfWrongParent() QHBoxLayout lay; lay.setParent(&root); QTest::ignoreMessage(QtWarningMsg, "QLayout::parentWidget: A layout can only have another layout as a parent."); - QCOMPARE(lay.parentWidget(), static_cast(0)); + QCOMPARE(lay.parentWidget(), nullptr); } void tst_QLayout::controlTypes() diff --git a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp index badeca69bb..835b6ca799 100644 --- a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp +++ b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp @@ -122,7 +122,7 @@ void tst_QStackedLayout::testCase() // Nothing in layout QCOMPARE(testLayout->currentIndex(), -1); - QCOMPARE(testLayout->currentWidget(), static_cast(0)); + QCOMPARE(testLayout->currentWidget(), nullptr); QCOMPARE(testLayout->count(), 0); // One widget added to layout @@ -163,7 +163,7 @@ void tst_QStackedLayout::testCase() QCOMPARE(spy.at(0).at(0).toInt(), -1); spy.clear(); QCOMPARE(testLayout->currentIndex(), -1); - QCOMPARE(testLayout->currentWidget(), static_cast(0)); + QCOMPARE(testLayout->currentWidget(), nullptr); QCOMPARE(testLayout->count(), 0); // Another widget inserted at current index. @@ -217,7 +217,7 @@ void tst_QStackedLayout::testCase() QVERIFY(w3->isVisible()); testLayout->removeWidget(w3); QCOMPARE(testLayout->currentIndex(), -1); - QCOMPARE(testLayout->currentWidget(), static_cast(0)); + QCOMPARE(testLayout->currentWidget(), nullptr); } void tst_QStackedLayout::deleteCurrent() diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 0c25a01ba0..731a8c5d91 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -2188,8 +2188,8 @@ void tst_QWidget::showMinimizedKeepsFocus() QTRY_COMPARE(qApp->focusWidget(), child); delete child; - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(qApp->focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); } //testing reparenting the focus widget @@ -2207,8 +2207,8 @@ void tst_QWidget::showMinimizedKeepsFocus() child->setParent(0); QScopedPointer childGuard(child); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(qApp->focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); } //testing setEnabled(false) @@ -2225,8 +2225,8 @@ void tst_QWidget::showMinimizedKeepsFocus() QTRY_COMPARE(qApp->focusWidget(), child); child->setEnabled(false); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(qApp->focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); } //testing clearFocus @@ -2245,14 +2245,14 @@ void tst_QWidget::showMinimizedKeepsFocus() QTRY_COMPARE(qApp->focusWidget(), child); child->clearFocus(); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(qApp->focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); window.showMinimized(); QTest::qWait(30); QTRY_VERIFY(window.isMinimized()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QTRY_COMPARE(qApp->focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QTRY_COMPARE(QApplication::focusWidget(), nullptr); window.showNormal(); qApp->setActiveWindow(&window); @@ -5260,12 +5260,12 @@ void tst_QWidget::setFocus() child1.setFocus(); QVERIFY(!child1.hasFocus()); QCOMPARE(window.focusWidget(), &child1); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(QApplication::focusWidget(), nullptr); child2.setFocus(); QVERIFY(!child2.hasFocus()); QCOMPARE(window.focusWidget(), &child2); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(QApplication::focusWidget(), nullptr); } { @@ -5294,12 +5294,12 @@ void tst_QWidget::setFocus() child1.setFocus(); QVERIFY(!child1.hasFocus()); QCOMPARE(window.focusWidget(), &child1); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(QApplication::focusWidget(), nullptr); child2.setFocus(); QVERIFY(!child2.hasFocus()); QCOMPARE(window.focusWidget(), &child2); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(QApplication::focusWidget(), nullptr); } { @@ -5355,8 +5355,8 @@ void tst_QWidget::setFocus() child1.setFocus(); QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); child1.show(); QApplication::processEvents(); @@ -5396,33 +5396,33 @@ void tst_QWidget::setFocus() child1.setFocus(); QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); child1.hide(); QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); child1.show(); QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); child2.setFocus(); QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); child2.hide(); QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); child2.show(); QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast(0)); - QCOMPARE(QApplication::focusWidget(), static_cast(0)); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); } } diff --git a/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp b/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp index 406b21ccf6..5e3868ea8f 100644 --- a/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp +++ b/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp @@ -161,7 +161,7 @@ void tst_QWindowContainer::testOwnership() delete container; - QCOMPARE(window.data(), (QWindow *) 0); + QCOMPARE(window.data(), nullptr); } diff --git a/tests/auto/widgets/styles/qstyleoption/tst_qstyleoption.cpp b/tests/auto/widgets/styles/qstyleoption/tst_qstyleoption.cpp index 883336b28f..1d46886d1c 100644 --- a/tests/auto/widgets/styles/qstyleoption/tst_qstyleoption.cpp +++ b/tests/auto/widgets/styles/qstyleoption/tst_qstyleoption.cpp @@ -121,7 +121,7 @@ void tst_QStyleOption::qstyleoptioncast() // Cast a null pointer castOption = qstyleoption_cast((QStyleOption*)0); - QCOMPARE(castOption,(QStyleOption*)0); + QCOMPARE(castOption, nullptr); // Deallocate delete testOption; diff --git a/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp b/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp index 99d067b7d7..f5cf9d7750 100644 --- a/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp +++ b/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp @@ -215,7 +215,7 @@ void tst_QUndoGroup::setActive() QUndoGroup group; QUndoStack stack1(&group), stack2(&group); - QCOMPARE(group.activeStack(), (QUndoStack*)0); + QCOMPARE(group.activeStack(), nullptr); QCOMPARE(stack1.isActive(), false); QCOMPARE(stack2.isActive(), false); @@ -238,13 +238,13 @@ void tst_QUndoGroup::setActive() QCOMPARE(stack3.isActive(), false); group.removeStack(&stack2); - QCOMPARE(group.activeStack(), (QUndoStack*)0); + QCOMPARE(group.activeStack(), nullptr); QCOMPARE(stack1.isActive(), false); QCOMPARE(stack2.isActive(), true); QCOMPARE(stack3.isActive(), false); group.removeStack(&stack2); - QCOMPARE(group.activeStack(), (QUndoStack*)0); + QCOMPARE(group.activeStack(), nullptr); QCOMPARE(stack1.isActive(), false); QCOMPARE(stack2.isActive(), true); QCOMPARE(stack3.isActive(), false); @@ -280,7 +280,7 @@ void tst_QUndoGroup::deleteStack() QUndoStack *stack1 = new QUndoStack(&group); QCOMPARE(group.stacks(), QList() << stack1); - QCOMPARE(group.activeStack(), (QUndoStack*)0); + QCOMPARE(group.activeStack(), nullptr); stack1->setActive(); QCOMPARE(group.activeStack(), stack1); @@ -299,17 +299,17 @@ void tst_QUndoGroup::deleteStack() delete stack1; QCOMPARE(group.stacks(), QList() << stack3); - QCOMPARE(group.activeStack(), (QUndoStack*)0); + QCOMPARE(group.activeStack(), nullptr); stack3->setActive(false); - QCOMPARE(group.activeStack(), (QUndoStack*)0); + QCOMPARE(group.activeStack(), nullptr); stack3->setActive(true); QCOMPARE(group.activeStack(), stack3); group.removeStack(stack3); QCOMPARE(group.stacks(), QList()); - QCOMPARE(group.activeStack(), (QUndoStack*)0); + QCOMPARE(group.activeStack(), nullptr); delete stack3; } diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index edaf033678..122d320d18 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -305,17 +305,17 @@ void tst_QComboBox::getSetCheck() obj1.setValidator(var9); QCOMPARE(obj1.validator(), (const QValidator *)var9); obj1.setValidator((QValidator *)0); - QCOMPARE(obj1.validator(), (const QValidator *)0); + QCOMPARE(obj1.validator(), nullptr); delete var9; // QAbstractItemDelegate * QComboBox::itemDelegate() // void QComboBox::setItemDelegate(QAbstractItemDelegate *) MyAbstractItemDelegate *var10 = new MyAbstractItemDelegate; obj1.setItemDelegate(var10); - QCOMPARE(obj1.itemDelegate(), (QAbstractItemDelegate *)var10); + QCOMPARE(obj1.itemDelegate(), nullptr); QTest::ignoreMessage(QtWarningMsg, "QComboBox::setItemDelegate: cannot set a 0 delegate"); obj1.setItemDelegate((QAbstractItemDelegate *)0); - QCOMPARE(obj1.itemDelegate(), (QAbstractItemDelegate *)var10); + QCOMPARE(obj1.itemDelegate(), nullptr); // delete var10; // No delete, since QComboBox takes ownership // QAbstractItemModel * QComboBox::model() diff --git a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp index cb55bd32b0..1a1023208a 100644 --- a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp +++ b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp @@ -857,8 +857,8 @@ void tst_QDockWidget::task165177_deleteFocusWidget() qApp->processEvents(); dw->setFloating(true); delete ledit; - QCOMPARE(mw.focusWidget(), (QWidget *)0); - QCOMPARE(dw->focusWidget(), (QWidget *)0); + QCOMPARE(mw.focusWidget(), nullptr); + QCOMPARE(dw->focusWidget(), nullptr); } void tst_QDockWidget::task169808_setFloating() diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index cb7643d1ac..3218b8ac68 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -388,7 +388,7 @@ void tst_QMenu::keyboardNavigation() #ifndef Q_OS_MAC QEXPECT_FAIL("shortcut0", "QTBUG-22449: QMenu doesn't remove highlight if a menu item is activated by a shortcut", Abort); #endif - QCOMPARE(menus[expected_menu]->activeAction(), (QAction *)0); + QCOMPARE(menus[expected_menu]->activeAction(), nullptr); } else { QCOMPARE(menus[expected_menu]->activeAction(), builtins[expected_action]); } @@ -396,7 +396,7 @@ void tst_QMenu::keyboardNavigation() if (expected_highlighted) QCOMPARE(menus[expected_menu]->activeAction(), highlighted); else - QCOMPARE(highlighted, (QAction *)0); + QCOMPARE(highlighted, nullptr); } #ifdef Q_OS_MAC From 0cdae477e32a312a02eb6be4d82ed1731f617170 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 23 Jul 2016 22:25:26 +0300 Subject: [PATCH 120/174] QListViewItem: add constexpr This class is just a record with a bit of functionality on it. To prevent pessimizing it compared to a C struct with the same contents, mark all operations constexpr and remove the point- less copy ctor (the generated one is just fine). Converge on passing QRect, QSize, QPoint by value. Was mixed cref and value passing before. Saves ~1KiB each in text and data size on an UBSan build, somewhat less, of course, on a normal one. Change-Id: Ibae16792d822ff183a0c542380501978f2108d93 Reviewed-by: Thiago Macieira --- src/widgets/itemviews/qlistview_p.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/widgets/itemviews/qlistview_p.h b/src/widgets/itemviews/qlistview_p.h index 07cbd4036c..47effcdfd9 100644 --- a/src/widgets/itemviews/qlistview_p.h +++ b/src/widgets/itemviews/qlistview_p.h @@ -69,28 +69,28 @@ class QListViewItem friend class QListModeViewBase; friend class QIconModeViewBase; public: - inline QListViewItem() + Q_DECL_CONSTEXPR QListViewItem() : x(-1), y(-1), w(0), h(0), indexHint(-1), visited(0xffff) {} - inline QListViewItem(QRect r, int i) + Q_DECL_CONSTEXPR QListViewItem(QRect r, int i) : x(r.x()), y(r.y()), w(qMin(r.width(), SHRT_MAX)), h(qMin(r.height(), SHRT_MAX)), indexHint(i), visited(0xffff) {} - inline bool operator==(const QListViewItem &other) const { + Q_DECL_CONSTEXPR bool operator==(const QListViewItem &other) const { return (x == other.x && y == other.y && w == other.w && h == other.h && indexHint == other.indexHint); } - inline bool operator!=(const QListViewItem &other) const + Q_DECL_CONSTEXPR bool operator!=(const QListViewItem &other) const { return !(*this == other); } - inline bool isValid() const + Q_DECL_CONSTEXPR bool isValid() const { return rect().isValid() && (indexHint > -1); } - inline void invalidate() + Q_DECL_RELAXED_CONSTEXPR void invalidate() { x = -1; y = -1; w = 0; h = 0; } - inline void resize(const QSize &size) + Q_DECL_RELAXED_CONSTEXPR void resize(QSize size) { w = qMin(size.width(), SHRT_MAX); h = qMin(size.height(), SHRT_MAX); } - inline void move(const QPoint &position) + Q_DECL_RELAXED_CONSTEXPR void move(QPoint position) { x = position.x(); y = position.y(); } - inline int width() const { return w; } - inline int height() const { return h; } + Q_DECL_CONSTEXPR int width() const { return w; } + Q_DECL_CONSTEXPR int height() const { return h; } private: - inline QRect rect() const + Q_DECL_CONSTEXPR QRect rect() const { return QRect(x, y, w, h); } int x, y; short w, h; From 8f2088db171a6941feb1903a2912a8b7fdf3a9ec Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 24 Nov 2016 15:44:57 +0100 Subject: [PATCH 121/174] winrt: Check for removed timers after sending events After all the check makes sense here. If a timer was removed as a result of sendEvent and it was not at the end of the list the list is not shrunk but the timer info's id is just set to INVALID_TIMER_ID. Additionally the timer's object should be fetched before we unlock the locker as timerIdToObject is changed in removeTimer and we might access a nullptr if the timer has been removed. Reverts c83ba01f7bc542368973f3f24dfb59c6052dd78a Task-number: QTBUG-56756 Change-Id: Ib1a04c02fbfcf4c939b4891d42f954dc9e87149e Reviewed-by: Maurice Kalinowski --- src/corelib/kernel/qeventdispatcher_winrt.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp index ff397fc750..33753ed507 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt.cpp +++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp @@ -166,7 +166,7 @@ private: timerIdToHandle.insert(id, handle); timerIdToCancelHandle.insert(id, cancelHandle); } - timerIdToObject.insert(id, obj); + const quint64 targetTime = qt_msectime() + interval; const WinRTTimerInfo info(id, interval, type, obj, targetTime); QMutexLocker locker(&timerInfoLock); @@ -587,15 +587,18 @@ bool QEventDispatcherWinRT::event(QEvent *e) break; info.inEvent = true; + QObject *timerObj = d->timerIdToObject.value(id); locker.unlock(); QTimerEvent te(id); - QCoreApplication::sendEvent(d->timerIdToObject.value(id), &te); + QCoreApplication::sendEvent(timerObj, &te); locker.relock(); - // The timer might have been removed in the meanwhile - if (id >= d->timerInfos.size()) + // The timer might have been removed in the meanwhile. If the timer was + // the last one in the list, id is bigger than the list's size. + // Otherwise, the id will just be set to INVALID_TIMER_ID. + if (id >= d->timerInfos.size() || info.timerId == INVALID_TIMER_ID) break; if (info.interval == 0 && info.inEvent) { From b82650891ee594628fb1bd150408a23a37217e72 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 18 Nov 2016 13:22:25 +0100 Subject: [PATCH 122/174] Use poll related features properly And get rid of related DEFINES in the pri file Change-Id: I54cf25b7cb447af22b410213759044e8018939a6 Reviewed-by: Oswald Buddenhagen --- src/corelib/kernel/kernel.pri | 3 --- src/corelib/kernel/qcore_unix.cpp | 14 +++++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri index 7799113d30..61d0f2bdf1 100644 --- a/src/corelib/kernel/kernel.pri +++ b/src/corelib/kernel/kernel.pri @@ -151,9 +151,6 @@ unix|integrity { kernel/qtimerinfo_unix_p.h qtConfig(poll_select): SOURCES += kernel/qpoll.cpp - qtConfig(poll_poll): DEFINES += QT_HAVE_POLL - qtConfig(poll_ppoll): DEFINES += QT_HAVE_POLL QT_HAVE_PPOLL - qtConfig(poll_pollts): DEFINES += QT_HAVE_POLL QT_HAVE_POLLTS qtConfig(glib) { SOURCES += \ diff --git a/src/corelib/kernel/qcore_unix.cpp b/src/corelib/kernel/qcore_unix.cpp index 2042964427..686143f8c7 100644 --- a/src/corelib/kernel/qcore_unix.cpp +++ b/src/corelib/kernel/qcore_unix.cpp @@ -38,6 +38,7 @@ ** ****************************************************************************/ +#include #include "qcore_unix_p.h" #include "qelapsedtimer.h" @@ -49,9 +50,8 @@ QT_BEGIN_NAMESPACE -#if !defined(QT_HAVE_PPOLL) && defined(QT_HAVE_POLLTS) -# define ppoll pollts -# define QT_HAVE_PPOLL +#if QT_CONFIG(poll_pollts) +# define ppoll pollts #endif static inline bool time_update(struct timespec *tv, const struct timespec &start, @@ -64,7 +64,7 @@ static inline bool time_update(struct timespec *tv, const struct timespec &start return tv->tv_sec >= 0; } -#if !defined(QT_HAVE_PPOLL) && defined(QT_HAVE_POLL) +#if QT_CONFIG(poll_poll) static inline int timespecToMillisecs(const struct timespec *ts) { return (ts == NULL) ? -1 : @@ -77,9 +77,9 @@ int qt_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts); static inline int qt_ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts) { -#if defined(QT_HAVE_PPOLL) - return ::ppoll(fds, nfds, timeout_ts, Q_NULLPTR); -#elif defined(QT_HAVE_POLL) +#if QT_CONFIG(poll_ppoll) || QT_CONFIG(poll_pollts) + return ::ppoll(fds, nfds, timeout_ts, nullptr); +#elif QT_CONFIG(poll_poll) return ::poll(fds, nfds, timespecToMillisecs(timeout_ts)); #else return qt_poll(fds, nfds, timeout_ts); From 5ac33fff0f38ee8a363f8e2dc5a8306c05af0db6 Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Tue, 29 Nov 2016 13:58:56 +0100 Subject: [PATCH 123/174] QCommandLineOption: Remove excess close parenthesis from a warning Change-Id: Iff197a2a00b686ad2d29a1e156389bec4639f3c0 Reviewed-by: Marc Mutz Reviewed-by: Thiago Macieira --- src/corelib/tools/qcommandlineoption.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qcommandlineoption.h b/src/corelib/tools/qcommandlineoption.h index 4dcae03ad9..276be042de 100644 --- a/src/corelib/tools/qcommandlineoption.h +++ b/src/corelib/tools/qcommandlineoption.h @@ -94,7 +94,7 @@ public: void setFlags(Flags aflags); #if QT_DEPRECATED_SINCE(5, 8) - QT_DEPRECATED_X("Use setFlags() with HiddenFromHelp)") + QT_DEPRECATED_X("Use setFlags() with HiddenFromHelp") void setHidden(bool hidden); QT_DEPRECATED_X("Use flags() and HiddenFromHelp") bool isHidden() const; From 0a2759e8f8c0fa295eff1a5bb5aefd074851d5d6 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 30 Nov 2016 11:16:38 +0100 Subject: [PATCH 124/174] tst_QTextStream: Use casts instead of Q_UINT64_C for negative values cast to quint64 Q_UINT64_C appends a literal, which causes warnings: tst_qtextstream.cpp(2026): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2030): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2031): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2032): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2289): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2309): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2329): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2355): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2381): warning C4146: unary minus operator applied to unsigned type, result still unsigned tst_qtextstream.cpp(2411): warning C4146: unary minus operator applied to unsigned type, result still unsigned Change-Id: I69ac87c224b75aff059477362d8a317c7e766ec2 Reviewed-by: Maurice Kalinowski --- .../io/qtextstream/tst_qtextstream.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp index 9533989b9d..7f29e2a7d7 100644 --- a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp +++ b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp @@ -2023,13 +2023,13 @@ void tst_QTextStream::generateNaturalNumbersData(bool for_QString) QTest::newRow("2147483648") << QByteArray("2147483648") << Q_UINT64_C(2147483648); QTest::newRow("-2147483646") << QByteArray("-2147483646") << qulonglong(-2147483646); QTest::newRow("-2147483647") << QByteArray("-2147483647") << qulonglong(-2147483647); - QTest::newRow("-2147483648") << QByteArray("-2147483648") << Q_UINT64_C(-2147483648); + QTest::newRow("-2147483648") << QByteArray("-2147483648") << quint64(-2147483648LL); QTest::newRow("4294967296") << QByteArray("4294967296") << Q_UINT64_C(4294967296); QTest::newRow("4294967297") << QByteArray("4294967297") << Q_UINT64_C(4294967297); QTest::newRow("4294967298") << QByteArray("4294967298") << Q_UINT64_C(4294967298); - QTest::newRow("-4294967296") << QByteArray("-4294967296") << Q_UINT64_C(-4294967296); - QTest::newRow("-4294967297") << QByteArray("-4294967297") << Q_UINT64_C(-4294967297); - QTest::newRow("-4294967298") << QByteArray("-4294967298") << Q_UINT64_C(-4294967298); + QTest::newRow("-4294967296") << QByteArray("-4294967296") << quint64(-4294967296); + QTest::newRow("-4294967297") << QByteArray("-4294967297") << quint64(-4294967297); + QTest::newRow("-4294967298") << QByteArray("-4294967298") << quint64(-4294967298); QTest::newRow("9223372036854775807") << QByteArray("9223372036854775807") << Q_UINT64_C(9223372036854775807); QTest::newRow("9223372036854775808") << QByteArray("9223372036854775808") << Q_UINT64_C(9223372036854775808); QTest::newRow("9223372036854775809") << QByteArray("9223372036854775809") << Q_UINT64_C(9223372036854775809); @@ -2286,7 +2286,7 @@ void tst_QTextStream::signedShort_write_operator_ToDevice_data() QTest::newRow("0") << Q_UINT64_C(0) << QByteArray("0") << QByteArray("0"); QTest::newRow("1") << Q_UINT64_C(1) << QByteArray("1") << QByteArray("1"); - QTest::newRow("-1") << Q_UINT64_C(-1) << QByteArray("-1") << QByteArray("-1"); + QTest::newRow("-1") << quint64(-1) << QByteArray("-1") << QByteArray("-1"); QTest::newRow("32767") << Q_UINT64_C(32767) << QByteArray("32767") << QByteArray("32,767"); QTest::newRow("32768") << Q_UINT64_C(32768) << QByteArray("-32768") << QByteArray("-32,768"); QTest::newRow("32769") << Q_UINT64_C(32769) << QByteArray("-32767") << QByteArray("-32,767"); @@ -2306,7 +2306,7 @@ void tst_QTextStream::unsignedShort_write_operator_ToDevice_data() QTest::newRow("0") << Q_UINT64_C(0) << QByteArray("0") << QByteArray("0"); QTest::newRow("1") << Q_UINT64_C(1) << QByteArray("1") << QByteArray("1"); - QTest::newRow("-1") << Q_UINT64_C(-1) << QByteArray("65535") << QByteArray("65,535"); + QTest::newRow("-1") << quint64(-1) << QByteArray("65535") << QByteArray("65,535"); QTest::newRow("32767") << Q_UINT64_C(32767) << QByteArray("32767") << QByteArray("32,767"); QTest::newRow("32768") << Q_UINT64_C(32768) << QByteArray("32768") << QByteArray("32,768"); QTest::newRow("32769") << Q_UINT64_C(32769) << QByteArray("32769") << QByteArray("32,769"); @@ -2326,7 +2326,7 @@ void tst_QTextStream::signedInt_write_operator_ToDevice_data() QTest::newRow("0") << Q_UINT64_C(0) << QByteArray("0") << QByteArray("0"); QTest::newRow("1") << Q_UINT64_C(1) << QByteArray("1") << QByteArray("1"); - QTest::newRow("-1") << Q_UINT64_C(-1) << QByteArray("-1") << QByteArray("-1"); + QTest::newRow("-1") << quint64(-1) << QByteArray("-1") << QByteArray("-1"); QTest::newRow("32767") << Q_UINT64_C(32767) << QByteArray("32767") << QByteArray("32,767"); QTest::newRow("32768") << Q_UINT64_C(32768) << QByteArray("32768") << QByteArray("32,768"); QTest::newRow("32769") << Q_UINT64_C(32769) << QByteArray("32769") << QByteArray("32,769"); @@ -2352,7 +2352,7 @@ void tst_QTextStream::unsignedInt_write_operator_ToDevice_data() QTest::newRow("0") << Q_UINT64_C(0) << QByteArray("0") << QByteArray("0"); QTest::newRow("1") << Q_UINT64_C(1) << QByteArray("1") << QByteArray("1"); - QTest::newRow("-1") << Q_UINT64_C(-1) << QByteArray("4294967295") << QByteArray("4,294,967,295"); + QTest::newRow("-1") << quint64(-1) << QByteArray("4294967295") << QByteArray("4,294,967,295"); QTest::newRow("32767") << Q_UINT64_C(32767) << QByteArray("32767") << QByteArray("32,767"); QTest::newRow("32768") << Q_UINT64_C(32768) << QByteArray("32768") << QByteArray("32,768"); QTest::newRow("32769") << Q_UINT64_C(32769) << QByteArray("32769") << QByteArray("32,769"); @@ -2378,7 +2378,7 @@ void tst_QTextStream::qlonglong_write_operator_ToDevice_data() QTest::newRow("0") << Q_UINT64_C(0) << QByteArray("0") << QByteArray("0"); QTest::newRow("1") << Q_UINT64_C(1) << QByteArray("1") << QByteArray("1"); - QTest::newRow("-1") << Q_UINT64_C(-1) << QByteArray("-1") << QByteArray("-1"); + QTest::newRow("-1") << quint64(-1) << QByteArray("-1") << QByteArray("-1"); QTest::newRow("32767") << Q_UINT64_C(32767) << QByteArray("32767") << QByteArray("32,767"); QTest::newRow("32768") << Q_UINT64_C(32768) << QByteArray("32768") << QByteArray("32,768"); QTest::newRow("32769") << Q_UINT64_C(32769) << QByteArray("32769") << QByteArray("32,769"); @@ -2408,7 +2408,7 @@ void tst_QTextStream::qulonglong_write_operator_ToDevice_data() QTest::newRow("0") << Q_UINT64_C(0) << QByteArray("0") << QByteArray("0"); QTest::newRow("1") << Q_UINT64_C(1) << QByteArray("1") << QByteArray("1"); - QTest::newRow("-1") << Q_UINT64_C(-1) << QByteArray("18446744073709551615") << QByteArray("18,446,744,073,709,551,615"); + QTest::newRow("-1") << quint64(-1) << QByteArray("18446744073709551615") << QByteArray("18,446,744,073,709,551,615"); QTest::newRow("32767") << Q_UINT64_C(32767) << QByteArray("32767") << QByteArray("32,767"); QTest::newRow("32768") << Q_UINT64_C(32768) << QByteArray("32768") << QByteArray("32,768"); QTest::newRow("32769") << Q_UINT64_C(32769) << QByteArray("32769") << QByteArray("32,769"); From aac3a4c032d3aa96c8c25402bbc72c78348401d0 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Wed, 30 Nov 2016 12:47:22 +0300 Subject: [PATCH 125/174] winrt: Replace Q_DECL_OVERRIDE by override We can use 'override' keyword directly since Qt 5.7. Change-Id: I31127478a0a96798a4e018d9996842204e307552 Reviewed-by: Maurice Kalinowski --- .../winrt/qwinrtfontdatabase_p.h | 14 ++++---- .../platforms/winrt/qwinrtbackingstore.h | 2 +- src/plugins/platforms/winrt/qwinrtclipboard.h | 6 ++-- src/plugins/platforms/winrt/qwinrtdrag.h | 10 +++--- .../platforms/winrt/qwinrteglcontext.h | 12 +++---- .../platforms/winrt/qwinrtfiledialoghelper.h | 20 +++++------ .../platforms/winrt/qwinrtfileengine.h | 34 +++++++++---------- .../platforms/winrt/qwinrtintegration.h | 32 ++++++++--------- src/plugins/platforms/winrt/qwinrtscreen.h | 20 +++++------ src/plugins/platforms/winrt/qwinrttheme.h | 2 +- src/plugins/platforms/winrt/qwinrtwindow.h | 6 ++-- 11 files changed, 79 insertions(+), 79 deletions(-) diff --git a/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h b/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h index 9559bac0a8..e0971c4e95 100644 --- a/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h @@ -72,14 +72,14 @@ class QWinRTFontDatabase : public QBasicFontDatabase public: QString fontDir() const; ~QWinRTFontDatabase(); - QFont defaultFont() const Q_DECL_OVERRIDE; - bool fontsAlwaysScalable() const Q_DECL_OVERRIDE; - void populateFontDatabase() Q_DECL_OVERRIDE; - void populateFamily(const QString &familyName) Q_DECL_OVERRIDE; - QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE; + QFont defaultFont() const override; + bool fontsAlwaysScalable() const override; + void populateFontDatabase() override; + void populateFamily(const QString &familyName) override; + QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) override; QStringList fallbacksForFamily(const QString &family, QFont::Style style, - QFont::StyleHint styleHint, QChar::Script script) const Q_DECL_OVERRIDE; - void releaseHandle(void *handle) Q_DECL_OVERRIDE; + QFont::StyleHint styleHint, QChar::Script script) const override; + void releaseHandle(void *handle) override; private: QHash m_fonts; QHash m_fontFamilies; diff --git a/src/plugins/platforms/winrt/qwinrtbackingstore.h b/src/plugins/platforms/winrt/qwinrtbackingstore.h index 41b27debcc..bfd0e34b9b 100644 --- a/src/plugins/platforms/winrt/qwinrtbackingstore.h +++ b/src/plugins/platforms/winrt/qwinrtbackingstore.h @@ -63,7 +63,7 @@ public: void endPaint(); void flush(QWindow *window, const QRegion ®ion, const QPoint &offset); void resize(const QSize &size, const QRegion &staticContents); - QImage toImage() const Q_DECL_OVERRIDE; + QImage toImage() const override; private: bool initialize(); diff --git a/src/plugins/platforms/winrt/qwinrtclipboard.h b/src/plugins/platforms/winrt/qwinrtclipboard.h index 3e6ee109fd..2e3e2b834d 100644 --- a/src/plugins/platforms/winrt/qwinrtclipboard.h +++ b/src/plugins/platforms/winrt/qwinrtclipboard.h @@ -64,9 +64,9 @@ class QWinRTClipboard: public QPlatformClipboard public: QWinRTClipboard(); - QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) Q_DECL_OVERRIDE; - void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard) Q_DECL_OVERRIDE; - bool supportsMode(QClipboard::Mode mode) const Q_DECL_OVERRIDE; + QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) override; + void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard) override; + bool supportsMode(QClipboard::Mode mode) const override; HRESULT onContentChanged(IInspectable *, IInspectable *); private: diff --git a/src/plugins/platforms/winrt/qwinrtdrag.h b/src/plugins/platforms/winrt/qwinrtdrag.h index 97079d831b..dad3e9892d 100644 --- a/src/plugins/platforms/winrt/qwinrtdrag.h +++ b/src/plugins/platforms/winrt/qwinrtdrag.h @@ -75,9 +75,9 @@ public: QWinRTInternalMimeData(); virtual ~QWinRTInternalMimeData(); - bool hasFormat_sys(const QString &mimetype) const Q_DECL_OVERRIDE; - QStringList formats_sys() const Q_DECL_OVERRIDE; - QVariant retrieveData_sys(const QString &mimetype, QVariant::Type preferredType) const Q_DECL_OVERRIDE; + bool hasFormat_sys(const QString &mimetype) const override; + QStringList formats_sys() const override; + QVariant retrieveData_sys(const QString &mimetype, QVariant::Type preferredType) const override; void setDataView(const Microsoft::WRL::ComPtr &d); private: @@ -91,8 +91,8 @@ public: virtual ~QWinRTDrag(); static QWinRTDrag *instance(); - QMimeData *platformDropData(void) Q_DECL_OVERRIDE; - Qt::DropAction drag(QDrag *) Q_DECL_OVERRIDE; + QMimeData *platformDropData(void) override; + Qt::DropAction drag(QDrag *) override; void setDropTarget(QWindow *target); diff --git a/src/plugins/platforms/winrt/qwinrteglcontext.h b/src/plugins/platforms/winrt/qwinrteglcontext.h index 12b6238cb1..5c75aa90d0 100644 --- a/src/plugins/platforms/winrt/qwinrteglcontext.h +++ b/src/plugins/platforms/winrt/qwinrteglcontext.h @@ -52,14 +52,14 @@ public: explicit QWinRTEGLContext(QOpenGLContext *context); ~QWinRTEGLContext(); - void initialize() Q_DECL_OVERRIDE; + void initialize() override; - bool makeCurrent(QPlatformSurface *windowSurface) Q_DECL_OVERRIDE; - void doneCurrent() Q_DECL_OVERRIDE; - void swapBuffers(QPlatformSurface *windowSurface) Q_DECL_OVERRIDE; + bool makeCurrent(QPlatformSurface *windowSurface) override; + void doneCurrent() override; + void swapBuffers(QPlatformSurface *windowSurface) override; - QSurfaceFormat format() const Q_DECL_OVERRIDE; - QFunctionPointer getProcAddress(const char *procName) Q_DECL_OVERRIDE; + QSurfaceFormat format() const override; + QFunctionPointer getProcAddress(const char *procName) override; static EGLDisplay display(); private: diff --git a/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h b/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h index f88bed76ae..1ff2249bcb 100644 --- a/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h +++ b/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h @@ -72,20 +72,20 @@ public: explicit QWinRTFileDialogHelper(); ~QWinRTFileDialogHelper(); - void exec() Q_DECL_OVERRIDE; - bool show(Qt::WindowFlags, Qt::WindowModality, QWindow *) Q_DECL_OVERRIDE; - void hide() Q_DECL_OVERRIDE; + void exec() override; + bool show(Qt::WindowFlags, Qt::WindowModality, QWindow *) override; + void hide() override; #ifdef Q_OS_WINPHONE - bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE; + bool eventFilter(QObject *o, QEvent *e) override; #endif - bool defaultNameFilterDisables() const Q_DECL_OVERRIDE { return false; } - void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; - QUrl directory() const Q_DECL_OVERRIDE; + bool defaultNameFilterDisables() const override { return false; } + void setDirectory(const QUrl &directory) override; + QUrl directory() const override; void selectFile(const QUrl &saveFileName); - QList selectedFiles() const Q_DECL_OVERRIDE; - void setFilter() Q_DECL_OVERRIDE { } - void selectNameFilter(const QString &selectedNameFilter) Q_DECL_OVERRIDE; + QList selectedFiles() const override; + void setFilter() override { } + void selectNameFilter(const QString &selectedNameFilter) override; QString selectedNameFilter() const; #ifndef Q_OS_WINPHONE diff --git a/src/plugins/platforms/winrt/qwinrtfileengine.h b/src/plugins/platforms/winrt/qwinrtfileengine.h index 70d5aea30d..73ff54b0c8 100644 --- a/src/plugins/platforms/winrt/qwinrtfileengine.h +++ b/src/plugins/platforms/winrt/qwinrtfileengine.h @@ -58,7 +58,7 @@ class QWinRTFileEngineHandler : public QAbstractFileEngineHandler public: QWinRTFileEngineHandler(); ~QWinRTFileEngineHandler(); - QAbstractFileEngine *create(const QString &fileName) const Q_DECL_OVERRIDE; + QAbstractFileEngine *create(const QString &fileName) const override; static void registerFile(const QString &fileName, ABI::Windows::Storage::IStorageItem *file); static ABI::Windows::Storage::IStorageItem *registeredFile(const QString &fileName); @@ -75,23 +75,23 @@ public: QWinRTFileEngine(const QString &fileName, ABI::Windows::Storage::IStorageItem *file); ~QWinRTFileEngine(); - bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE; - bool close() Q_DECL_OVERRIDE; - bool flush() Q_DECL_OVERRIDE; - qint64 size() const Q_DECL_OVERRIDE; - qint64 pos() const Q_DECL_OVERRIDE; - bool seek(qint64 pos) Q_DECL_OVERRIDE; - bool remove() Q_DECL_OVERRIDE; - bool copy(const QString &newName) Q_DECL_OVERRIDE; - bool rename(const QString &newName) Q_DECL_OVERRIDE; - bool renameOverwrite(const QString &newName) Q_DECL_OVERRIDE; - FileFlags fileFlags(FileFlags type=FileInfoAll) const Q_DECL_OVERRIDE; - bool setPermissions(uint perms) Q_DECL_OVERRIDE; - QString fileName(FileName type=DefaultName) const Q_DECL_OVERRIDE; - QDateTime fileTime(FileTime type) const Q_DECL_OVERRIDE; + bool open(QIODevice::OpenMode openMode) override; + bool close() override; + bool flush() override; + qint64 size() const override; + qint64 pos() const override; + bool seek(qint64 pos) override; + bool remove() override; + bool copy(const QString &newName) override; + bool rename(const QString &newName) override; + bool renameOverwrite(const QString &newName) override; + FileFlags fileFlags(FileFlags type=FileInfoAll) const override; + bool setPermissions(uint perms) override; + QString fileName(FileName type=DefaultName) const override; + QDateTime fileTime(FileTime type) const override; - qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE; - qint64 write(const char *data, qint64 len) Q_DECL_OVERRIDE; + qint64 read(char *data, qint64 maxlen) override; + qint64 write(const char *data, qint64 len) override; private: QScopedPointer d_ptr; diff --git a/src/plugins/platforms/winrt/qwinrtintegration.h b/src/plugins/platforms/winrt/qwinrtintegration.h index 7b4d5531fc..e22532a266 100644 --- a/src/plugins/platforms/winrt/qwinrtintegration.h +++ b/src/plugins/platforms/winrt/qwinrtintegration.h @@ -85,28 +85,28 @@ public: bool succeeded() const; - bool hasCapability(QPlatformIntegration::Capability cap) const Q_DECL_OVERRIDE; - QVariant styleHint(StyleHint hint) const Q_DECL_OVERRIDE; + bool hasCapability(QPlatformIntegration::Capability cap) const override; + QVariant styleHint(StyleHint hint) const override; - QPlatformWindow *createPlatformWindow(QWindow *window) const Q_DECL_OVERRIDE; - QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const Q_DECL_OVERRIDE; - QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const Q_DECL_OVERRIDE; - QAbstractEventDispatcher *createEventDispatcher() const Q_DECL_OVERRIDE; - void initialize() Q_DECL_OVERRIDE; - QPlatformFontDatabase *fontDatabase() const Q_DECL_OVERRIDE; - QPlatformInputContext *inputContext() const Q_DECL_OVERRIDE; - QPlatformServices *services() const Q_DECL_OVERRIDE; - QPlatformClipboard *clipboard() const Q_DECL_OVERRIDE; + QPlatformWindow *createPlatformWindow(QWindow *window) const override; + QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const override; + QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const override; + QAbstractEventDispatcher *createEventDispatcher() const override; + void initialize() override; + QPlatformFontDatabase *fontDatabase() const override; + QPlatformInputContext *inputContext() const override; + QPlatformServices *services() const override; + QPlatformClipboard *clipboard() const override; #ifndef QT_NO_DRAGANDDROP - QPlatformDrag *drag() const Q_DECL_OVERRIDE; + QPlatformDrag *drag() const override; #endif - Qt::KeyboardModifiers queryKeyboardModifiers() const Q_DECL_OVERRIDE; + Qt::KeyboardModifiers queryKeyboardModifiers() const override; - QStringList themeNames() const Q_DECL_OVERRIDE; - QPlatformTheme *createPlatformTheme(const QString &name) const Q_DECL_OVERRIDE; + QStringList themeNames() const override; + QPlatformTheme *createPlatformTheme(const QString &name) const override; - QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const override; private: #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) HRESULT onBackButtonPressed(IInspectable *, ABI::Windows::Phone::UI::Input::IBackPressedEventArgs *args); diff --git a/src/plugins/platforms/winrt/qwinrtscreen.h b/src/plugins/platforms/winrt/qwinrtscreen.h index e489e208d5..2f1112472c 100644 --- a/src/plugins/platforms/winrt/qwinrtscreen.h +++ b/src/plugins/platforms/winrt/qwinrtscreen.h @@ -89,19 +89,19 @@ public: explicit QWinRTScreen(); ~QWinRTScreen(); - QRect geometry() const Q_DECL_OVERRIDE; - QRect availableGeometry() const Q_DECL_OVERRIDE; - int depth() const Q_DECL_OVERRIDE; - QImage::Format format() const Q_DECL_OVERRIDE; - QSizeF physicalSize() const Q_DECL_OVERRIDE; - QDpi logicalDpi() const Q_DECL_OVERRIDE; - qreal pixelDensity() const Q_DECL_OVERRIDE; + QRect geometry() const override; + QRect availableGeometry() const override; + int depth() const override; + QImage::Format format() const override; + QSizeF physicalSize() const override; + QDpi logicalDpi() const override; + qreal pixelDensity() const override; qreal scaleFactor() const; - QPlatformCursor *cursor() const Q_DECL_OVERRIDE; + QPlatformCursor *cursor() const override; Qt::KeyboardModifiers keyboardModifiers() const; - Qt::ScreenOrientation nativeOrientation() const Q_DECL_OVERRIDE; - Qt::ScreenOrientation orientation() const Q_DECL_OVERRIDE; + Qt::ScreenOrientation nativeOrientation() const override; + Qt::ScreenOrientation orientation() const override; QWindow *topWindow() const; QWindow *windowAt(const QPoint &pos); diff --git a/src/plugins/platforms/winrt/qwinrttheme.h b/src/plugins/platforms/winrt/qwinrttheme.h index bd244f9fdb..6ad22a4188 100644 --- a/src/plugins/platforms/winrt/qwinrttheme.h +++ b/src/plugins/platforms/winrt/qwinrttheme.h @@ -57,7 +57,7 @@ public: bool usePlatformNativeDialog(DialogType type) const; QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const; - const QPalette *palette(Palette type = SystemPalette) const Q_DECL_OVERRIDE; + const QPalette *palette(Palette type = SystemPalette) const override; static QVariant styleHint(QPlatformIntegration::StyleHint hint); QVariant themeHint(ThemeHint hint) const override; diff --git a/src/plugins/platforms/winrt/qwinrtwindow.h b/src/plugins/platforms/winrt/qwinrtwindow.h index 48e092d455..95caf66c3d 100644 --- a/src/plugins/platforms/winrt/qwinrtwindow.h +++ b/src/plugins/platforms/winrt/qwinrtwindow.h @@ -65,10 +65,10 @@ public: void raise(); void lower(); - WId winId() const Q_DECL_OVERRIDE; + WId winId() const override; - qreal devicePixelRatio() const Q_DECL_OVERRIDE; - void setWindowState(Qt::WindowState state) Q_DECL_OVERRIDE; + qreal devicePixelRatio() const override; + void setWindowState(Qt::WindowState state) override; EGLSurface eglSurface() const; void createEglSurface(EGLDisplay display, EGLConfig config); From 1a0e690d50ff3b99a8a2e785c711b43f71de8459 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Sun, 27 Nov 2016 11:22:44 +0300 Subject: [PATCH 126/174] winrt: Add missing override Change-Id: I2f257756bc606f8eb5cad2afe67b90810a2e394c Reviewed-by: Maurice Kalinowski --- .../winrt/qwinrtfontdatabase.cpp | 22 +++++++++---------- .../winrt/qwinrtfontdatabase_p.h | 2 +- src/plugins/platforms/winrt/main.cpp | 2 +- .../platforms/winrt/qwinrtbackingstore.h | 10 ++++----- src/plugins/platforms/winrt/qwinrtcursor.h | 4 ++-- .../platforms/winrt/qwinrteventdispatcher.h | 4 ++-- .../platforms/winrt/qwinrtfiledialoghelper.h | 4 ++-- .../platforms/winrt/qwinrtinputcontext.h | 8 +++---- .../winrt/qwinrtmessagedialoghelper.h | 6 ++--- src/plugins/platforms/winrt/qwinrtservices.h | 4 ++-- src/plugins/platforms/winrt/qwinrttheme.h | 4 ++-- src/plugins/platforms/winrt/qwinrtwindow.h | 16 +++++++------- 12 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase.cpp b/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase.cpp index f214184c36..9f4b182ece 100644 --- a/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase.cpp @@ -129,6 +129,17 @@ static QFontDatabase::WritingSystem writingSystemFromUnicodeRange(const DWRITE_U return QFontDatabase::Other; } +QWinRTFontDatabase::~QWinRTFontDatabase() +{ + qCDebug(lcQpaFonts) << __FUNCTION__; + + foreach (IDWriteFontFile *fontFile, m_fonts.keys()) + fontFile->Release(); + + foreach (IDWriteFontFamily *fontFamily, m_fontFamilies) + fontFamily->Release(); +} + QString QWinRTFontDatabase::fontDir() const { qCDebug(lcQpaFonts) << __FUNCTION__; @@ -146,17 +157,6 @@ QString QWinRTFontDatabase::fontDir() const return fontDirectory; } -QWinRTFontDatabase::~QWinRTFontDatabase() -{ - qCDebug(lcQpaFonts) << __FUNCTION__; - - foreach (IDWriteFontFile *fontFile, m_fonts.keys()) - fontFile->Release(); - - foreach (IDWriteFontFamily *fontFamily, m_fontFamilies) - fontFamily->Release(); -} - QFont QWinRTFontDatabase::defaultFont() const { return QFont(QStringLiteral("Segoe UI")); diff --git a/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h b/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h index e0971c4e95..3b803d7613 100644 --- a/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h @@ -70,8 +70,8 @@ struct FontDescription class QWinRTFontDatabase : public QBasicFontDatabase { public: - QString fontDir() const; ~QWinRTFontDatabase(); + QString fontDir() const override; QFont defaultFont() const override; bool fontsAlwaysScalable() const override; void populateFontDatabase() override; diff --git a/src/plugins/platforms/winrt/main.cpp b/src/plugins/platforms/winrt/main.cpp index a0b31e0e25..5d0d9e94eb 100644 --- a/src/plugins/platforms/winrt/main.cpp +++ b/src/plugins/platforms/winrt/main.cpp @@ -50,7 +50,7 @@ class QWinRTIntegrationPlugin : public QPlatformIntegrationPlugin public: QStringList keys() const; - QPlatformIntegration *create(const QString&, const QStringList&); + QPlatformIntegration *create(const QString&, const QStringList&) override; }; QStringList QWinRTIntegrationPlugin::keys() const diff --git a/src/plugins/platforms/winrt/qwinrtbackingstore.h b/src/plugins/platforms/winrt/qwinrtbackingstore.h index bfd0e34b9b..cd05faa63e 100644 --- a/src/plugins/platforms/winrt/qwinrtbackingstore.h +++ b/src/plugins/platforms/winrt/qwinrtbackingstore.h @@ -58,11 +58,11 @@ class QWinRTBackingStore : public QPlatformBackingStore public: explicit QWinRTBackingStore(QWindow *window); ~QWinRTBackingStore(); - QPaintDevice *paintDevice(); - void beginPaint(const QRegion &); - void endPaint(); - void flush(QWindow *window, const QRegion ®ion, const QPoint &offset); - void resize(const QSize &size, const QRegion &staticContents); + QPaintDevice *paintDevice() override; + void beginPaint(const QRegion &) override; + void endPaint() override; + void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) override; + void resize(const QSize &size, const QRegion &staticContents) override; QImage toImage() const override; private: diff --git a/src/plugins/platforms/winrt/qwinrtcursor.h b/src/plugins/platforms/winrt/qwinrtcursor.h index baf902c7af..7f579f1531 100644 --- a/src/plugins/platforms/winrt/qwinrtcursor.h +++ b/src/plugins/platforms/winrt/qwinrtcursor.h @@ -51,9 +51,9 @@ public: explicit QWinRTCursor(); ~QWinRTCursor(); #ifndef QT_NO_CURSOR - void changeCursor(QCursor * windowCursor, QWindow *window); + void changeCursor(QCursor * windowCursor, QWindow *window) override; #endif - QPoint pos() const; + QPoint pos() const override; private: QScopedPointer d_ptr; diff --git a/src/plugins/platforms/winrt/qwinrteventdispatcher.h b/src/plugins/platforms/winrt/qwinrteventdispatcher.h index c04e9fca12..4c5c19c6b0 100644 --- a/src/plugins/platforms/winrt/qwinrteventdispatcher.h +++ b/src/plugins/platforms/winrt/qwinrteventdispatcher.h @@ -51,8 +51,8 @@ public: explicit QWinRTEventDispatcher(QObject *parent = 0); protected: - bool hasPendingEvents(); - bool sendPostedEvents(QEventLoop::ProcessEventsFlags flags); + bool hasPendingEvents() override; + bool sendPostedEvents(QEventLoop::ProcessEventsFlags flags) override; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h b/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h index 1ff2249bcb..413dee7459 100644 --- a/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h +++ b/src/plugins/platforms/winrt/qwinrtfiledialoghelper.h @@ -82,11 +82,11 @@ public: bool defaultNameFilterDisables() const override { return false; } void setDirectory(const QUrl &directory) override; QUrl directory() const override; - void selectFile(const QUrl &saveFileName); + void selectFile(const QUrl &saveFileName) override; QList selectedFiles() const override; void setFilter() override { } void selectNameFilter(const QString &selectedNameFilter) override; - QString selectedNameFilter() const; + QString selectedNameFilter() const override; #ifndef Q_OS_WINPHONE HRESULT onSingleFilePicked(ABI::Windows::Foundation::IAsyncOperation *, diff --git a/src/plugins/platforms/winrt/qwinrtinputcontext.h b/src/plugins/platforms/winrt/qwinrtinputcontext.h index 9d5c4187e2..13a0088ddc 100644 --- a/src/plugins/platforms/winrt/qwinrtinputcontext.h +++ b/src/plugins/platforms/winrt/qwinrtinputcontext.h @@ -70,13 +70,13 @@ class QWinRTInputContext : public QPlatformInputContext public: explicit QWinRTInputContext(QWinRTScreen *); - QRectF keyboardRect() const; + QRectF keyboardRect() const override; - bool isInputPanelVisible() const; + bool isInputPanelVisible() const override; #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) - void showInputPanel(); - void hideInputPanel(); + void showInputPanel() override; + void hideInputPanel() override; #endif private slots: diff --git a/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.h b/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.h index 439e8f592f..14b6d4b715 100644 --- a/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.h +++ b/src/plugins/platforms/winrt/qwinrtmessagedialoghelper.h @@ -69,11 +69,11 @@ public: explicit QWinRTMessageDialogHelper(const QWinRTTheme *theme); ~QWinRTMessageDialogHelper(); - void exec(); + void exec() override; bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, - QWindow *parent); - void hide(); + QWindow *parent) override; + void hide() override; private: HRESULT onCompleted(ABI::Windows::Foundation::IAsyncOperation *asyncInfo, diff --git a/src/plugins/platforms/winrt/qwinrtservices.h b/src/plugins/platforms/winrt/qwinrtservices.h index 1adc6c381c..80b9a6c92a 100644 --- a/src/plugins/platforms/winrt/qwinrtservices.h +++ b/src/plugins/platforms/winrt/qwinrtservices.h @@ -52,8 +52,8 @@ public: explicit QWinRTServices(); ~QWinRTServices(); - bool openUrl(const QUrl &url); - bool openDocument(const QUrl &url); + bool openUrl(const QUrl &url) override; + bool openDocument(const QUrl &url) override; private: QScopedPointer d_ptr; diff --git a/src/plugins/platforms/winrt/qwinrttheme.h b/src/plugins/platforms/winrt/qwinrttheme.h index 6ad22a4188..cc5fc851e7 100644 --- a/src/plugins/platforms/winrt/qwinrttheme.h +++ b/src/plugins/platforms/winrt/qwinrttheme.h @@ -54,8 +54,8 @@ class QWinRTTheme : public QPlatformTheme public: QWinRTTheme(); - bool usePlatformNativeDialog(DialogType type) const; - QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const; + bool usePlatformNativeDialog(DialogType type) const override; + QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const override; const QPalette *palette(Palette type = SystemPalette) const override; diff --git a/src/plugins/platforms/winrt/qwinrtwindow.h b/src/plugins/platforms/winrt/qwinrtwindow.h index 95caf66c3d..968edcfa85 100644 --- a/src/plugins/platforms/winrt/qwinrtwindow.h +++ b/src/plugins/platforms/winrt/qwinrtwindow.h @@ -56,14 +56,14 @@ public: QWinRTWindow(QWindow *window); ~QWinRTWindow(); - QSurfaceFormat format() const; - bool isActive() const; - bool isExposed() const; - void setGeometry(const QRect &rect); - void setVisible(bool visible); - void setWindowTitle(const QString &title); - void raise(); - void lower(); + QSurfaceFormat format() const override; + bool isActive() const override; + bool isExposed() const override; + void setGeometry(const QRect &rect) override; + void setVisible(bool visible) override; + void setWindowTitle(const QString &title) override; + void raise() override; + void lower() override; WId winId() const override; From 5b65698248325576faa03a2bb78d17349a33a194 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Tue, 29 Nov 2016 16:43:42 +0100 Subject: [PATCH 127/174] Close popups when blocked by modal dialog Don't block the event that Qt depends on to close popups. Task-number: QTBUG-57292 Change-Id: Ida1f928b81868f68a7b1e19cd0b83485d2a7232e Reviewed-by: Lars Knoll --- src/gui/kernel/qguiapplication.cpp | 2 +- src/gui/kernel/qguiapplication_p.h | 1 + src/widgets/kernel/qapplication_p.h | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 7beab72ab0..c189c5b068 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1914,7 +1914,7 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo QMouseEvent ev(type, localPoint, localPoint, globalPoint, button, buttons, e->modifiers, e->source); ev.setTimestamp(e->timestamp); - if (window->d_func()->blockedByModalWindow) { + if (window->d_func()->blockedByModalWindow && !qApp->d_func()->popupActive()) { // a modal window is blocking this window, don't allow mouse events through return; } diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index e1a35e048c..0d62490c75 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -199,6 +199,7 @@ public: static void hideModalWindow(QWindow *window); static void updateBlockedStatus(QWindow *window); virtual bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = 0) const; + virtual bool popupActive() { return false; } static Qt::MouseButtons buttons; static ulong mousePressTime; diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index 3bef773187..73c75bbc14 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -164,6 +164,7 @@ public: #endif static bool inPopupMode(); + bool popupActive() Q_DECL_OVERRIDE { return inPopupMode(); } void closePopup(QWidget *popup); void openPopup(QWidget *popup); static void setFocusWidget(QWidget *focus, Qt::FocusReason reason); From 4a7f3c327b851f0b118b7d84ce00b53f3f1df712 Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Thu, 24 Nov 2016 20:35:19 +0100 Subject: [PATCH 128/174] Doc: Fix QVariant::Type QVariant::QString does not exist Task-number: QTBUG-56586 Change-Id: Ic5fe81fc4fc3553f9b755e067ed73c4d1bba9add Reviewed-by: Venugopal Shivashankar Reviewed-by: Timur Pocheptsov --- src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp b/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp index fdcbdc603c..a4513a55a9 100644 --- a/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp +++ b/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp @@ -69,7 +69,7 @@ myCustomObject->doSomething(); // trigger emission of the signal QList arguments = spy.takeFirst(); QVERIFY(arguments.at(0).type() == QVariant::Int); -QVERIFY(arguments.at(1).type() == QVariant::QString); +QVERIFY(arguments.at(1).type() == QVariant::String); QVERIFY(arguments.at(2).type() == QVariant::double); //! [1] From 1e4054ce2f4f7b488b5d4963f32d4025e20cf537 Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Fri, 18 Nov 2016 14:05:34 +0100 Subject: [PATCH 129/174] Add -Wdouble-promotion to headersclean Fixes: warning: implicit conversion from 'float' to 'double' to match other operand of binary expression [-Wdouble-promotion] Task-number: QTBUG-57068 Change-Id: I897a341aca83873bc6abd256a82a3b9f09409833 Reviewed-by: Thiago Macieira --- mkspecs/features/qt_module_headers.prf | 11 +++++++ src/gui/math3d/qmatrix4x4.h | 42 ++++++++++++++------------ src/gui/math3d/qquaternion.h | 5 +-- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf index 790a4ee29e..a0be15c4a0 100644 --- a/mkspecs/features/qt_module_headers.prf +++ b/mkspecs/features/qt_module_headers.prf @@ -204,9 +204,20 @@ headersclean:!internal_module { !contains(QT_ARCH, arm):!contains(QT_ARCH, mips): \ hcleanFLAGS += -Wcast-align + greaterThan(QT_CLANG_MAJOR_VERSION, 3) { + hcleanFLAGS += -Wdouble-promotion + } greaterThan(QT_CLANG_MAJOR_VERSION, 2):greaterThan(QT_CLANG_MINOR_VERSION, 7) { + hcleanFLAGS += -Wdouble-promotion + } + !clang { # options accepted only by GCC + greaterThan(QT_GCC_MAJOR_VERSION, 4) { + hcleanFLAGS += -Wdouble-promotion + } greaterThan(QT_GCC_MAJOR_VERSION, 3):greaterThan(QT_GCC_MINOR_VERSION, 4) { + hcleanFLAGS += -Wdouble-promotion + } c++11 { # only enabled for actual c++11 builds due to # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52806 diff --git a/src/gui/math3d/qmatrix4x4.h b/src/gui/math3d/qmatrix4x4.h index 19540308a1..e143884f9d 100644 --- a/src/gui/math3d/qmatrix4x4.h +++ b/src/gui/math3d/qmatrix4x4.h @@ -867,9 +867,9 @@ inline QPointF operator*(const QPointF& point, const QMatrix4x4& matrix) yin * matrix.m[3][1] + matrix.m[3][3]; if (w == 1.0f) { - return QPointF(float(x), float(y)); + return QPointF(qreal(x), qreal(y)); } else { - return QPointF(float(x / w), float(y / w)); + return QPointF(qreal(x / w), qreal(y / w)); } } @@ -907,33 +907,35 @@ inline QPoint operator*(const QMatrix4x4& matrix, const QPoint& point) inline QPointF operator*(const QMatrix4x4& matrix, const QPointF& point) { - float xin, yin; - float x, y, w; + qreal xin, yin; + qreal x, y, w; xin = point.x(); yin = point.y(); if (matrix.flagBits == QMatrix4x4::Identity) { return point; } else if (matrix.flagBits < QMatrix4x4::Rotation2D) { // Translation | Scale - return QPointF(xin * matrix.m[0][0] + matrix.m[3][0], - yin * matrix.m[1][1] + matrix.m[3][1]); + return QPointF(xin * qreal(matrix.m[0][0]) + qreal(matrix.m[3][0]), + yin * qreal(matrix.m[1][1]) + qreal(matrix.m[3][1])); } else if (matrix.flagBits < QMatrix4x4::Perspective) { - return QPointF(xin * matrix.m[0][0] + yin * matrix.m[1][0] + matrix.m[3][0], - xin * matrix.m[0][1] + yin * matrix.m[1][1] + matrix.m[3][1]); + return QPointF(xin * qreal(matrix.m[0][0]) + yin * qreal(matrix.m[1][0]) + + qreal(matrix.m[3][0]), + xin * qreal(matrix.m[0][1]) + yin * qreal(matrix.m[1][1]) + + qreal(matrix.m[3][1])); } else { - x = xin * matrix.m[0][0] + - yin * matrix.m[1][0] + - matrix.m[3][0]; - y = xin * matrix.m[0][1] + - yin * matrix.m[1][1] + - matrix.m[3][1]; - w = xin * matrix.m[0][3] + - yin * matrix.m[1][3] + - matrix.m[3][3]; - if (w == 1.0f) { - return QPointF(float(x), float(y)); + x = xin * qreal(matrix.m[0][0]) + + yin * qreal(matrix.m[1][0]) + + qreal(matrix.m[3][0]); + y = xin * qreal(matrix.m[0][1]) + + yin * qreal(matrix.m[1][1]) + + qreal(matrix.m[3][1]); + w = xin * qreal(matrix.m[0][3]) + + yin * qreal(matrix.m[1][3]) + + qreal(matrix.m[3][3]); + if (w == 1.0) { + return QPointF(qreal(x), qreal(y)); } else { - return QPointF(float(x / w), float(y / w)); + return QPointF(qreal(x / w), qreal(y / w)); } } } diff --git a/src/gui/math3d/qquaternion.h b/src/gui/math3d/qquaternion.h index 21b051e08e..808e0ee6d7 100644 --- a/src/gui/math3d/qquaternion.h +++ b/src/gui/math3d/qquaternion.h @@ -202,7 +202,8 @@ inline QQuaternion QQuaternion::inverted() const double(yp) * double(yp) + double(zp) * double(zp); if (!qFuzzyIsNull(len)) - return QQuaternion(wp / len, -xp / len, -yp / len, -zp / len); + return QQuaternion(double(wp) / len, double(-xp) / len, + double(-yp) / len, double(-zp) / len); return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f); } @@ -251,7 +252,7 @@ inline const QQuaternion operator*(const QQuaternion &q1, const QQuaternion& q2) float zz = (q1.wp + q1.yp) * (q2.wp - q2.zp); float ww = (q1.zp + q1.xp) * (q2.xp + q2.yp); float xx = ww + yy + zz; - float qq = 0.5 * (xx + (q1.zp - q1.xp) * (q2.xp - q2.yp)); + float qq = 0.5f * (xx + (q1.zp - q1.xp) * (q2.xp - q2.yp)); float w = qq - ww + (q1.zp - q1.yp) * (q2.yp - q2.zp); float x = qq - xx + (q1.xp + q1.wp) * (q2.xp + q2.wp); From e3ca4287d99a8b1a5769c19b97679cd95b4e83e4 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 28 Nov 2016 14:26:40 +0100 Subject: [PATCH 130/174] qmake: fix execution of depend_command in directories with funny names it's wrong to use the escape function for makefiles, as the command goes directly to a popen() call. Task-number: QTBUG-57343 Change-Id: I34a8e4d8fb406303c593e7c1e24019e0f756e7f8 Reviewed-by: Jake Petroules --- qmake/generators/makefile.cpp | 2 +- qmake/generators/win32/msvc_objectmodel.cpp | 7 ++++++- qmake/generators/win32/msvc_vcproj.cpp | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 4450e619b9..1ba2587bd0 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -1839,7 +1839,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) QString dep_cd_cmd; if (!tmp_dep_cmd.isEmpty()) { dep_cd_cmd = QLatin1String("cd ") - + escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false)) + + IoUtils::shellQuote(Option::fixPathToLocalOS(Option::output_dir, false)) + QLatin1String(" && "); } const ProStringList &vars = project->values(ProKey(*it + ".variables")); diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index fb9c4f354d..2c57fcc2f5 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -29,10 +29,15 @@ #include "msvc_objectmodel.h" #include "msvc_vcproj.h" #include "msvc_vcxproj.h" + +#include + #include #include #include +using namespace QMakeInternal; + QT_BEGIN_NAMESPACE // XML Tags --------------------------------------------------------- @@ -2318,7 +2323,7 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info) tmp_dep_cmd, inFile, out, MakefileGenerator::LocalShell); if(Project->canExecute(dep_cmd)) { dep_cmd.prepend(QLatin1String("cd ") - + Project->escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false)) + + IoUtils::shellQuote(Option::fixPathToLocalOS(Option::output_dir, false)) + QLatin1String(" && ")); if (FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), QT_POPEN_READ)) { QString indeps; diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 7b3d7fd160..018c70089d 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -29,16 +29,22 @@ #include "msvc_vcproj.h" #include "option.h" #include "xmloutput.h" + +#include + #include #include #include #include #include #include + #include //#define DEBUG_SOLUTION_GEN +using namespace QMakeInternal; + QT_BEGIN_NAMESPACE // Filter GUIDs (Do NOT change these!) ------------------------------ const char _GUIDSourceFiles[] = "{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"; @@ -1550,7 +1556,7 @@ void VcprojGenerator::initResourceFiles() dep_cmd = Option::fixPathToLocalOS(dep_cmd, true, false); if(canExecute(dep_cmd)) { dep_cmd.prepend(QLatin1String("cd ") - + escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false)) + + IoUtils::shellQuote(Option::fixPathToLocalOS(Option::output_dir, false)) + QLatin1String(" && ")); if (FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), QT_POPEN_READ)) { QString indeps; From f88f405401cc5dcb98cce37f3237bf37b51f77af Mon Sep 17 00:00:00 2001 From: Dmitry Shachnev Date: Tue, 15 Nov 2016 17:04:36 +0300 Subject: [PATCH 131/174] Add a test case for removing a submenu from the menubar If 5ca9631d3a0717afb066471ed5eb3b3ed9a9c08a is reverted, this test segfaults on Unity most of the times. Task-number: QTBUG-55966 Change-Id: Ice59842e0a1a7930e3cd10c4c7319ef033fe6a58 Reviewed-by: Shawn Rutledge --- .../widgets/widgets/qmenubar/tst_qmenubar.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp index 3a4c4545df..a5b33ed8e7 100644 --- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp @@ -133,6 +133,7 @@ private slots: #ifdef Q_OS_MACOS void taskQTBUG56275_reinsertMenuInParentlessQMenuBar(); #endif + void taskQTBUG55966_subMenuRemoved(); void platformMenu(); @@ -1541,5 +1542,22 @@ void tst_QMenuBar::taskQTBUG56275_reinsertMenuInParentlessQMenuBar() } #endif // Q_OS_MACOS +void tst_QMenuBar::taskQTBUG55966_subMenuRemoved() +{ + QMainWindow window; + QMenuBar *menubar = window.menuBar(); + QMenu *parentMenu = menubar->addMenu("Parent menu"); + + QAction *action = parentMenu->addAction("Action in parent menu"); + QMenu *subMenu = new QMenu("Submenu"); + action->setMenu(subMenu); + delete subMenu; + + window.show(); + QApplication::setActiveWindow(&window); + QVERIFY(QTest::qWaitForWindowActive(&window)); + QTest::qWait(500); +} + QTEST_MAIN(tst_QMenuBar) #include "tst_qmenubar.moc" From ed6f1290262af7a5e64c732d91df52e5968e1067 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Fri, 25 Nov 2016 13:52:55 +0300 Subject: [PATCH 132/174] QtTest: Add missing override Change-Id: Ibb924f11b82577fb67aa7a1a30b81f4d8d7d36fc Reviewed-by: hjk --- src/testlib/qbenchmarkevent_p.h | 18 +++++++------- src/testlib/qbenchmarktimemeasurers_p.h | 32 ++++++++++++------------- src/testlib/qbenchmarkvalgrind_p.h | 16 ++++++------- src/testlib/qplaintestlogger_p.h | 14 +++++------ src/testlib/qteamcitylogger_p.h | 14 +++++------ src/testlib/qtestcase.cpp | 2 +- src/testlib/qtestevent.h | 16 ++++++------- src/testlib/qtesteventloop.h | 2 +- src/testlib/qxmltestlogger_p.h | 14 +++++------ src/testlib/qxunittestlogger_p.h | 14 +++++------ 10 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/testlib/qbenchmarkevent_p.h b/src/testlib/qbenchmarkevent_p.h index 8231b57127..af42a17141 100644 --- a/src/testlib/qbenchmarkevent_p.h +++ b/src/testlib/qbenchmarkevent_p.h @@ -63,15 +63,15 @@ class QBenchmarkEvent : public QBenchmarkMeasurerBase, public QAbstractNativeEve public: QBenchmarkEvent(); ~QBenchmarkEvent(); - void start(); - qint64 checkpoint(); - qint64 stop(); - bool isMeasurementAccepted(qint64 measurement); - int adjustIterationCount(int suggestion); - int adjustMedianCount(int suggestion); - bool repeatCount() { return 1; } - QTest::QBenchmarkMetric metricType(); - virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result); + void start() override; + qint64 checkpoint() override; + qint64 stop() override; + bool isMeasurementAccepted(qint64 measurement) override; + int adjustIterationCount(int suggestion) override; + int adjustMedianCount(int suggestion) override; + bool repeatCount() override { return 1; } + QTest::QBenchmarkMetric metricType() override; + bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; qint64 eventCounter; }; diff --git a/src/testlib/qbenchmarktimemeasurers_p.h b/src/testlib/qbenchmarktimemeasurers_p.h index e5ffb1157d..f268669e2f 100644 --- a/src/testlib/qbenchmarktimemeasurers_p.h +++ b/src/testlib/qbenchmarktimemeasurers_p.h @@ -60,14 +60,14 @@ QT_BEGIN_NAMESPACE class QBenchmarkTimeMeasurer : public QBenchmarkMeasurerBase { public: - void start(); - qint64 checkpoint(); - qint64 stop(); - bool isMeasurementAccepted(qint64 measurement); - int adjustIterationCount(int sugestion); - int adjustMedianCount(int suggestion); - bool needsWarmupIteration(); - QTest::QBenchmarkMetric metricType(); + void start() override; + qint64 checkpoint() override; + qint64 stop() override; + bool isMeasurementAccepted(qint64 measurement) override; + int adjustIterationCount(int sugestion) override; + int adjustMedianCount(int suggestion) override; + bool needsWarmupIteration() override; + QTest::QBenchmarkMetric metricType() override; private: QElapsedTimer time; }; @@ -77,14 +77,14 @@ private: class QBenchmarkTickMeasurer : public QBenchmarkMeasurerBase { public: - void start(); - qint64 checkpoint(); - qint64 stop(); - bool isMeasurementAccepted(qint64 measurement); - int adjustIterationCount(int); - int adjustMedianCount(int suggestion); - bool needsWarmupIteration(); - QTest::QBenchmarkMetric metricType(); + void start() override; + qint64 checkpoint() override; + qint64 stop() override; + bool isMeasurementAccepted(qint64 measurement) override; + int adjustIterationCount(int) override; + int adjustMedianCount(int suggestion) override; + bool needsWarmupIteration() override; + QTest::QBenchmarkMetric metricType() override; private: CycleCounterTicks startTicks; }; diff --git a/src/testlib/qbenchmarkvalgrind_p.h b/src/testlib/qbenchmarkvalgrind_p.h index dd7e7381c1..69219b9a65 100644 --- a/src/testlib/qbenchmarkvalgrind_p.h +++ b/src/testlib/qbenchmarkvalgrind_p.h @@ -76,14 +76,14 @@ public: class QBenchmarkCallgrindMeasurer : public QBenchmarkMeasurerBase { public: - void start(); - qint64 checkpoint(); - qint64 stop(); - bool isMeasurementAccepted(qint64 measurement); - int adjustIterationCount(int); - int adjustMedianCount(int); - bool needsWarmupIteration(); - QTest::QBenchmarkMetric metricType(); + void start() override; + qint64 checkpoint() override; + qint64 stop() override; + bool isMeasurementAccepted(qint64 measurement) override; + int adjustIterationCount(int) override; + int adjustMedianCount(int) override; + bool needsWarmupIteration() override; + QTest::QBenchmarkMetric metricType() override; }; QT_END_NAMESPACE diff --git a/src/testlib/qplaintestlogger_p.h b/src/testlib/qplaintestlogger_p.h index efa79e550d..93d3c7143a 100644 --- a/src/testlib/qplaintestlogger_p.h +++ b/src/testlib/qplaintestlogger_p.h @@ -61,18 +61,18 @@ public: QPlainTestLogger(const char *filename); ~QPlainTestLogger(); - void startLogging(); - void stopLogging(); + void startLogging() override; + void stopLogging() override; - void enterTestFunction(const char *function); - void leaveTestFunction(); + void enterTestFunction(const char *function) override; + void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0); - void addBenchmarkResult(const QBenchmarkResult &result); + const char *file = 0, int line = 0) override; + void addBenchmarkResult(const QBenchmarkResult &result) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0); + const char *file = 0, int line = 0) override; private: void printMessage(const char *type, const char *msg, const char *file = 0, int line = 0); diff --git a/src/testlib/qteamcitylogger_p.h b/src/testlib/qteamcitylogger_p.h index b8fad3ae34..219aeb5ceb 100644 --- a/src/testlib/qteamcitylogger_p.h +++ b/src/testlib/qteamcitylogger_p.h @@ -63,18 +63,18 @@ public: QTeamCityLogger(const char *filename); ~QTeamCityLogger(); - void startLogging(); - void stopLogging(); + void startLogging() override; + void stopLogging() override; - void enterTestFunction(const char *function); - void leaveTestFunction(); + void enterTestFunction(const char *function) override; + void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0); - void addBenchmarkResult(const QBenchmarkResult &result); + const char *file = 0, int line = 0) override; + void addBenchmarkResult(const QBenchmarkResult &result) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0); + const char *file = 0, int line = 0) override; private: QString currTestFuncName; diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 1c13f8edc2..f2a962408e 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -925,7 +925,7 @@ public: waitCondition.wakeAll(); } - void run() { + void run() override { QMutexLocker locker(&mutex); waitCondition.wakeAll(); while (1) { diff --git a/src/testlib/qtestevent.h b/src/testlib/qtestevent.h index 63b7401e6f..159e3e01ff 100644 --- a/src/testlib/qtestevent.h +++ b/src/testlib/qtestevent.h @@ -79,10 +79,10 @@ public: inline QTestKeyEvent(QTest::KeyAction action, char ascii, Qt::KeyboardModifiers modifiers, int delay) : _action(action), _delay(delay), _modifiers(modifiers), _ascii(ascii), _key(Qt::Key_unknown) {} - inline QTestEvent *clone() const { return new QTestKeyEvent(*this); } + inline QTestEvent *clone() const override { return new QTestKeyEvent(*this); } #ifdef QT_WIDGETS_LIB - inline void simulate(QWidget *w) + inline void simulate(QWidget *w) override { if (_ascii == 0) QTest::keyEvent(_action, w, _key, _modifiers, _delay); @@ -104,10 +104,10 @@ class QTestKeyClicksEvent: public QTestEvent public: inline QTestKeyClicksEvent(const QString &keys, Qt::KeyboardModifiers modifiers, int delay) : _keys(keys), _modifiers(modifiers), _delay(delay) {} - inline QTestEvent *clone() const { return new QTestKeyClicksEvent(*this); } + inline QTestEvent *clone() const override { return new QTestKeyClicksEvent(*this); } #ifdef QT_WIDGETS_LIB - inline void simulate(QWidget *w) + inline void simulate(QWidget *w) override { QTest::keyClicks(w, _keys, _modifiers, _delay); } @@ -125,10 +125,10 @@ public: inline QTestMouseEvent(QTest::MouseAction action, Qt::MouseButton button, Qt::KeyboardModifiers modifiers, QPoint position, int delay) : _action(action), _button(button), _modifiers(modifiers), _pos(position), _delay(delay) {} - inline QTestEvent *clone() const { return new QTestMouseEvent(*this); } + inline QTestEvent *clone() const override { return new QTestMouseEvent(*this); } #ifdef QT_WIDGETS_LIB - inline void simulate(QWidget *w) + inline void simulate(QWidget *w) override { QTest::mouseEvent(_action, w, _button, _modifiers, _pos, _delay); } @@ -148,10 +148,10 @@ class QTestDelayEvent: public QTestEvent { public: inline QTestDelayEvent(int msecs): _delay(msecs) {} - inline QTestEvent *clone() const { return new QTestDelayEvent(*this); } + inline QTestEvent *clone() const override { return new QTestDelayEvent(*this); } #ifdef QT_WIDGETS_LIB - inline void simulate(QWidget * /*w*/) { QTest::qWait(_delay); } + inline void simulate(QWidget * /*w*/) override { QTest::qWait(_delay); } #endif private: diff --git a/src/testlib/qtesteventloop.h b/src/testlib/qtesteventloop.h index 032c95d692..bcf4a4be2d 100644 --- a/src/testlib/qtesteventloop.h +++ b/src/testlib/qtesteventloop.h @@ -80,7 +80,7 @@ public Q_SLOTS: inline void exitLoop(); protected: - inline void timerEvent(QTimerEvent *e); + inline void timerEvent(QTimerEvent *e) override; private: bool inLoop; diff --git a/src/testlib/qxmltestlogger_p.h b/src/testlib/qxmltestlogger_p.h index c6461387b2..b85742f939 100644 --- a/src/testlib/qxmltestlogger_p.h +++ b/src/testlib/qxmltestlogger_p.h @@ -64,18 +64,18 @@ public: QXmlTestLogger(XmlMode mode, const char *filename); ~QXmlTestLogger(); - void startLogging(); - void stopLogging(); + void startLogging() override; + void stopLogging() override; - void enterTestFunction(const char *function); - void leaveTestFunction(); + void enterTestFunction(const char *function) override; + void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0); - void addBenchmarkResult(const QBenchmarkResult &result); + const char *file = 0, int line = 0) override; + void addBenchmarkResult(const QBenchmarkResult &result) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0); + const char *file = 0, int line = 0) override; static int xmlCdata(QTestCharBuffer *dest, char const* src); static int xmlQuote(QTestCharBuffer *dest, char const* src); diff --git a/src/testlib/qxunittestlogger_p.h b/src/testlib/qxunittestlogger_p.h index 50f26c317b..8fb01fbe61 100644 --- a/src/testlib/qxunittestlogger_p.h +++ b/src/testlib/qxunittestlogger_p.h @@ -64,19 +64,19 @@ class QXunitTestLogger : public QAbstractTestLogger QXunitTestLogger(const char *filename); ~QXunitTestLogger(); - void startLogging(); - void stopLogging(); + void startLogging() override; + void stopLogging() override; - void enterTestFunction(const char *function); - void leaveTestFunction(); + void enterTestFunction(const char *function) override; + void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0); - void addBenchmarkResult(const QBenchmarkResult &result); + const char *file = 0, int line = 0) override; + void addBenchmarkResult(const QBenchmarkResult &result) override; void addTag(QTestElement* element); void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0); + const char *file = 0, int line = 0) override; private: QTestElement *listOfTestcases; From 7183fc8f0d2d1e16c52fe78d029ee9fa13868b79 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Sat, 26 Nov 2016 12:40:58 +0300 Subject: [PATCH 133/174] Add missing override into Qt modules Change-Id: I014ac8c7b590c77b054fbb01f0ab5601c44ca88e Reviewed-by: hjk --- src/network/socket/qabstractsocket_p.h | 12 ++++---- src/network/socket/qlocalsocket_p.h | 4 +-- src/network/socket/qnativesocketengine.cpp | 6 ++-- .../gl2paintengineex/qglgradientcache_p.h | 4 +-- src/opengl/qglpixelbuffer_p.h | 10 +++---- .../dialogs/qabstractprintdialog.h | 2 +- .../kernel/qpaintengine_alpha_p.h | 16 +++++----- .../kernel/qpaintengine_preview_p.h | 30 +++++++++---------- src/sql/models/qsqlrelationaldelegate.h | 4 +-- 9 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h index 1578d7bb35..8a96cb9d48 100644 --- a/src/network/socket/qabstractsocket_p.h +++ b/src/network/socket/qabstractsocket_p.h @@ -72,13 +72,13 @@ public: virtual ~QAbstractSocketPrivate(); // from QAbstractSocketEngineReceiver - inline void readNotification() { canReadNotification(); } - inline void writeNotification() { canWriteNotification(); } - inline void exceptionNotification() {} - inline void closeNotification() { canCloseNotification(); } - void connectionNotification(); + inline void readNotification() override { canReadNotification(); } + inline void writeNotification() override { canWriteNotification(); } + inline void exceptionNotification() override {} + inline void closeNotification() override { canCloseNotification(); } + void connectionNotification() override; #ifndef QT_NO_NETWORKPROXY - inline void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) { + inline void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) override { Q_Q(QAbstractSocket); q->proxyAuthenticationRequired(proxy, authenticator); } diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h index 560d74328e..9da37d2af3 100644 --- a/src/network/socket/qlocalsocket_p.h +++ b/src/network/socket/qlocalsocket_p.h @@ -99,12 +99,12 @@ public: QTcpSocket::setSocketError(error); } - inline qint64 readData(char *data, qint64 maxSize) + inline qint64 readData(char *data, qint64 maxSize) override { return QTcpSocket::readData(data, maxSize); } - inline qint64 writeData(const char *data, qint64 maxSize) + inline qint64 writeData(const char *data, qint64 maxSize) override { return QTcpSocket::writeData(data, maxSize); } diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp index 11d19682d8..928c7fc68f 100644 --- a/src/network/socket/qnativesocketengine.cpp +++ b/src/network/socket/qnativesocketengine.cpp @@ -1230,7 +1230,7 @@ public: { engine = parent; } protected: - bool event(QEvent *); + bool event(QEvent *) override; QNativeSocketEngine *engine; }; @@ -1262,7 +1262,7 @@ public: : QSocketNotifier(fd, QSocketNotifier::Write, parent) { engine = parent; } protected: - bool event(QEvent *); + bool event(QEvent *) override; QNativeSocketEngine *engine; }; @@ -1286,7 +1286,7 @@ public: : QSocketNotifier(fd, QSocketNotifier::Exception, parent) { engine = parent; } protected: - bool event(QEvent *); + bool event(QEvent *) override; QNativeSocketEngine *engine; }; diff --git a/src/opengl/gl2paintengineex/qglgradientcache_p.h b/src/opengl/gl2paintengineex/qglgradientcache_p.h index 1333df316b..3c9da982e9 100644 --- a/src/opengl/gl2paintengineex/qglgradientcache_p.h +++ b/src/opengl/gl2paintengineex/qglgradientcache_p.h @@ -83,8 +83,8 @@ public: GLuint getBuffer(const QGradient &gradient, qreal opacity); inline int paletteSize() const { return 1024; } - void invalidateResource(); - void freeResource(QOpenGLContext *ctx); + void invalidateResource() override; + void freeResource(QOpenGLContext *ctx) override; private: inline int maxCacheSize() const { return 60; } diff --git a/src/opengl/qglpixelbuffer_p.h b/src/opengl/qglpixelbuffer_p.h index 6416e41773..9125fcfb4b 100644 --- a/src/opengl/qglpixelbuffer_p.h +++ b/src/opengl/qglpixelbuffer_p.h @@ -63,11 +63,11 @@ class QOpenGLFramebufferObject; class QGLPBufferGLPaintDevice : public QGLPaintDevice { public: - virtual QPaintEngine* paintEngine() const {return pbuf->paintEngine();} - virtual QSize size() const {return pbuf->size();} - virtual QGLContext* context() const; - virtual void beginPaint(); - virtual void endPaint(); + QPaintEngine* paintEngine() const override {return pbuf->paintEngine();} + QSize size() const override {return pbuf->size();} + QGLContext* context() const override; + void beginPaint() override; + void endPaint() override; void setPBuffer(QGLPixelBuffer* pb); void setFbo(GLuint fbo); private: diff --git a/src/printsupport/dialogs/qabstractprintdialog.h b/src/printsupport/dialogs/qabstractprintdialog.h index e8eee2ca9c..f18406af4b 100644 --- a/src/printsupport/dialogs/qabstractprintdialog.h +++ b/src/printsupport/dialogs/qabstractprintdialog.h @@ -83,7 +83,7 @@ public: explicit QAbstractPrintDialog(QPrinter *printer, QWidget *parent = Q_NULLPTR); ~QAbstractPrintDialog(); - virtual int exec() = 0; + int exec() override = 0; // obsolete void addEnabledOption(PrintDialogOption option); diff --git a/src/printsupport/kernel/qpaintengine_alpha_p.h b/src/printsupport/kernel/qpaintengine_alpha_p.h index b5ba98bf88..efae442690 100644 --- a/src/printsupport/kernel/qpaintengine_alpha_p.h +++ b/src/printsupport/kernel/qpaintengine_alpha_p.h @@ -67,18 +67,18 @@ class Q_PRINTSUPPORT_EXPORT QAlphaPaintEngine : public QPaintEngine public: ~QAlphaPaintEngine(); - virtual bool begin(QPaintDevice *pdev); - virtual bool end(); + bool begin(QPaintDevice *pdev) override; + bool end() override; - virtual void updateState(const QPaintEngineState &state); + void updateState(const QPaintEngineState &state) override; - virtual void drawPath(const QPainterPath &path); + void drawPath(const QPainterPath &path) override; - virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode); + void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override; - virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr); - virtual void drawTextItem(const QPointF &p, const QTextItem &textItem); - virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s); + void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override; + void drawTextItem(const QPointF &p, const QTextItem &textItem) override; + void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s) override; protected: QAlphaPaintEngine(QAlphaPaintEnginePrivate &data, PaintEngineFeatures devcaps = 0); diff --git a/src/printsupport/kernel/qpaintengine_preview_p.h b/src/printsupport/kernel/qpaintengine_preview_p.h index 6277451bfa..31b3142cb6 100644 --- a/src/printsupport/kernel/qpaintengine_preview_p.h +++ b/src/printsupport/kernel/qpaintengine_preview_p.h @@ -69,33 +69,33 @@ public: QPreviewPaintEngine(); ~QPreviewPaintEngine(); - bool begin(QPaintDevice *dev); - bool end(); + bool begin(QPaintDevice *dev) override; + bool end() override; - void updateState(const QPaintEngineState &state); + void updateState(const QPaintEngineState &state) override; - void drawPath(const QPainterPath &path); - void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode); - void drawTextItem(const QPointF &p, const QTextItem &textItem); + void drawPath(const QPainterPath &path) override; + void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override; + void drawTextItem(const QPointF &p, const QTextItem &textItem) override; - void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr); - void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p); + void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override; + void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p) override; QList pages(); - QPaintEngine::Type type() const { return Picture; } + QPaintEngine::Type type() const override { return Picture; } void setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine); - void setProperty(PrintEnginePropertyKey key, const QVariant &value); - QVariant property(PrintEnginePropertyKey key) const; + void setProperty(PrintEnginePropertyKey key, const QVariant &value) override; + QVariant property(PrintEnginePropertyKey key) const override; - bool newPage(); - bool abort(); + bool newPage() override; + bool abort() override; - int metric(QPaintDevice::PaintDeviceMetric) const; + int metric(QPaintDevice::PaintDeviceMetric) const override; - QPrinter::PrinterState printerState() const; + QPrinter::PrinterState printerState() const override; }; QT_END_NAMESPACE diff --git a/src/sql/models/qsqlrelationaldelegate.h b/src/sql/models/qsqlrelationaldelegate.h index e98bf28d3b..f295de7396 100644 --- a/src/sql/models/qsqlrelationaldelegate.h +++ b/src/sql/models/qsqlrelationaldelegate.h @@ -65,7 +65,7 @@ explicit QSqlRelationalDelegate(QObject *aParent = 0) QWidget *createEditor(QWidget *aParent, const QStyleOptionViewItem &option, - const QModelIndex &index) const + const QModelIndex &index) const override { const QSqlRelationalTableModel *sqlModel = qobject_cast(index.model()); QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0; @@ -80,7 +80,7 @@ QWidget *createEditor(QWidget *aParent, return combo; } -void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override { if (!index.isValid()) return; From 15b0b3db29636a94f98f5c7cd6d7a33c15bd6421 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Wed, 30 Nov 2016 13:15:38 +0300 Subject: [PATCH 134/174] xcb: Replace Q_DECL_OVERRIDE by override We can use 'override' directly since Qt 5.7. Also remove redundant 'virtual' keywords. Change-Id: Ia40be0e1e60e51f9d043ab575fd6b9305ea620b0 Reviewed-by: Shawn Rutledge --- .../xcb_egl/qxcbeglintegration.h | 10 +-- .../xcb_egl/qxcbeglnativeinterfacehandler.h | 6 +- .../gl_integrations/xcb_egl/qxcbeglwindow.h | 6 +- .../gl_integrations/xcb_glx/qglxintegration.h | 18 ++-- .../xcb_glx/qxcbglxintegration.h | 14 +-- .../xcb_glx/qxcbglxnativeinterfacehandler.h | 2 +- .../gl_integrations/xcb_glx/qxcbglxwindow.h | 2 +- .../platforms/xcb/qxcbbackingstore.cpp | 12 +-- src/plugins/platforms/xcb/qxcbbackingstore.h | 18 ++-- src/plugins/platforms/xcb/qxcbclipboard.cpp | 8 +- src/plugins/platforms/xcb/qxcbclipboard.h | 8 +- src/plugins/platforms/xcb/qxcbconnection.h | 4 +- src/plugins/platforms/xcb/qxcbcursor.h | 6 +- src/plugins/platforms/xcb/qxcbdrag.cpp | 6 +- src/plugins/platforms/xcb/qxcbdrag.h | 18 ++-- src/plugins/platforms/xcb/qxcbintegration.h | 44 +++++----- src/plugins/platforms/xcb/qxcbmain.cpp | 2 +- .../platforms/xcb/qxcbnativeinterface.h | 24 +++--- src/plugins/platforms/xcb/qxcbscreen.h | 28 +++--- .../platforms/xcb/qxcbsessionmanager.h | 16 ++-- .../platforms/xcb/qxcbsystemtraytracker.h | 2 +- src/plugins/platforms/xcb/qxcbwindow.h | 86 +++++++++---------- src/plugins/platforms/xcb/qxcbxsettings.h | 2 +- 23 files changed, 171 insertions(+), 171 deletions(-) diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.h b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.h index 0cb4a878a1..54a9f5cd83 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.h @@ -62,13 +62,13 @@ public: QXcbEglIntegration(); ~QXcbEglIntegration(); - bool initialize(QXcbConnection *connection) Q_DECL_OVERRIDE; + bool initialize(QXcbConnection *connection) override; - QXcbWindow *createWindow(QWindow *window) const Q_DECL_OVERRIDE; - QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const Q_DECL_OVERRIDE; - QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; + QXcbWindow *createWindow(QWindow *window) const override; + QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const override; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const override; - bool supportsThreadedOpenGL() const Q_DECL_OVERRIDE { return true; } + bool supportsThreadedOpenGL() const override { return true; } EGLDisplay eglDisplay() const { return m_egl_display; } void *xlib_display() const; diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.h b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.h index 6e717e4491..7c83d0e240 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglnativeinterfacehandler.h @@ -55,9 +55,9 @@ public: QXcbEglNativeInterfaceHandler(QXcbNativeInterface *nativeInterface); - QPlatformNativeInterface::NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) const Q_DECL_OVERRIDE; - QPlatformNativeInterface::NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource) const Q_DECL_OVERRIDE; - QPlatformNativeInterface::NativeResourceForWindowFunction nativeResourceFunctionForWindow(const QByteArray &resource) const Q_DECL_OVERRIDE; + QPlatformNativeInterface::NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) const override; + QPlatformNativeInterface::NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource) const override; + QPlatformNativeInterface::NativeResourceForWindowFunction nativeResourceFunctionForWindow(const QByteArray &resource) const override; private: static void *eglDisplay(); static void *eglDisplayForWindow(QWindow *window); diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.h b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.h index 48fc6dce70..3090cef735 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.h @@ -59,11 +59,11 @@ public: QXcbEglIntegration *glIntegration() const { return m_glIntegration; } protected: - void create() Q_DECL_OVERRIDE; - void resolveFormat(const QSurfaceFormat &format) Q_DECL_OVERRIDE; + void create() override; + void resolveFormat(const QSurfaceFormat &format) override; #ifdef XCB_USE_XLIB - const xcb_visualtype_t *createVisual() Q_DECL_OVERRIDE; + const xcb_visualtype_t *createVisual() override; #endif private: diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h index bf1f1b324b..3dfe0ac618 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h @@ -60,14 +60,14 @@ public: const QVariant &nativeHandle); ~QGLXContext(); - bool makeCurrent(QPlatformSurface *surface) Q_DECL_OVERRIDE; - void doneCurrent() Q_DECL_OVERRIDE; - void swapBuffers(QPlatformSurface *surface) Q_DECL_OVERRIDE; - QFunctionPointer getProcAddress(const char *procName) Q_DECL_OVERRIDE; + bool makeCurrent(QPlatformSurface *surface) override; + void doneCurrent() override; + void swapBuffers(QPlatformSurface *surface) override; + QFunctionPointer getProcAddress(const char *procName) override; - QSurfaceFormat format() const Q_DECL_OVERRIDE; - bool isSharing() const Q_DECL_OVERRIDE; - bool isValid() const Q_DECL_OVERRIDE; + QSurfaceFormat format() const override; + bool isSharing() const override; + bool isValid() const override; GLXContext glxContext() const { return m_context; } GLXFBConfig glxConfig() const { return m_config; } @@ -100,8 +100,8 @@ public: explicit QGLXPbuffer(QOffscreenSurface *offscreenSurface); ~QGLXPbuffer(); - QSurfaceFormat format() const Q_DECL_OVERRIDE { return m_format; } - bool isValid() const Q_DECL_OVERRIDE { return m_pbuffer != 0; } + QSurfaceFormat format() const override { return m_format; } + bool isValid() const override { return m_pbuffer != 0; } GLXPbuffer pbuffer() const { return m_pbuffer; } diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h index 8f04db31b2..26cb233a59 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.h @@ -52,15 +52,15 @@ public: QXcbGlxIntegration(); ~QXcbGlxIntegration(); - bool initialize(QXcbConnection *connection) Q_DECL_OVERRIDE; - bool handleXcbEvent(xcb_generic_event_t *event, uint responseType) Q_DECL_OVERRIDE; + bool initialize(QXcbConnection *connection) override; + bool handleXcbEvent(xcb_generic_event_t *event, uint responseType) override; - QXcbWindow *createWindow(QWindow *window) const Q_DECL_OVERRIDE; - QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const Q_DECL_OVERRIDE; - QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; + QXcbWindow *createWindow(QWindow *window) const override; + QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const override; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const override; - virtual bool supportsThreadedOpenGL() const Q_DECL_OVERRIDE; - virtual bool supportsSwitchableWidgetComposition() const Q_DECL_OVERRIDE; + bool supportsThreadedOpenGL() const override; + bool supportsSwitchableWidgetComposition() const override; private: QXcbConnection *m_connection; diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxnativeinterfacehandler.h b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxnativeinterfacehandler.h index 1748f2298c..d877732725 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxnativeinterfacehandler.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxnativeinterfacehandler.h @@ -53,7 +53,7 @@ public: }; QXcbGlxNativeInterfaceHandler(QXcbNativeInterface *nativeInterface); - QPlatformNativeInterface::NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource) const Q_DECL_OVERRIDE; + QPlatformNativeInterface::NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource) const override; private: static void *glxContextForContext(QOpenGLContext *context); diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.h b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.h index 9519245130..14b2d5e6eb 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.h @@ -52,7 +52,7 @@ public: ~QXcbGlxWindow(); protected: - const xcb_visualtype_t *createVisual() Q_DECL_OVERRIDE; + const xcb_visualtype_t *createVisual() override; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp index 3d09b1c139..f095288221 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp +++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp @@ -122,7 +122,7 @@ public: , m_image(image) { } - bool doLock(AccessTypes access, const QRect &rect) Q_DECL_OVERRIDE + bool doLock(AccessTypes access, const QRect &rect) override { Q_UNUSED(rect); if (access & ~(QPlatformGraphicsBuffer::SWReadAccess | QPlatformGraphicsBuffer::SWWriteAccess)) @@ -131,13 +131,13 @@ public: m_access_lock |= access; return true; } - void doUnlock() Q_DECL_OVERRIDE { m_access_lock = None; } + void doUnlock() override { m_access_lock = None; } - const uchar *data() const Q_DECL_OVERRIDE { return m_image->bits(); } - uchar *data() Q_DECL_OVERRIDE { return m_image->bits(); } - int bytesPerLine() const Q_DECL_OVERRIDE { return m_image->bytesPerLine(); } + const uchar *data() const override { return m_image->bits(); } + uchar *data() override { return m_image->bits(); } + int bytesPerLine() const override { return m_image->bytesPerLine(); } - Origin origin() const Q_DECL_OVERRIDE { return QPlatformGraphicsBuffer::OriginTopLeft; } + Origin origin() const override { return QPlatformGraphicsBuffer::OriginTopLeft; } private: AccessTypes m_access_lock; QImage *m_image; diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.h b/src/plugins/platforms/xcb/qxcbbackingstore.h index 6af679d28a..2985432b7f 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.h +++ b/src/plugins/platforms/xcb/qxcbbackingstore.h @@ -57,22 +57,22 @@ public: QXcbBackingStore(QWindow *widget); ~QXcbBackingStore(); - QPaintDevice *paintDevice() Q_DECL_OVERRIDE; - void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) Q_DECL_OVERRIDE; + QPaintDevice *paintDevice() override; + void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) override; #ifndef QT_NO_OPENGL void composeAndFlush(QWindow *window, const QRegion ®ion, const QPoint &offset, QPlatformTextureList *textures, QOpenGLContext *context, - bool translucentBackground) Q_DECL_OVERRIDE; + bool translucentBackground) override; #endif - QImage toImage() const Q_DECL_OVERRIDE; + QImage toImage() const override; - QPlatformGraphicsBuffer *graphicsBuffer() const Q_DECL_OVERRIDE; + QPlatformGraphicsBuffer *graphicsBuffer() const override; - void resize(const QSize &size, const QRegion &staticContents) Q_DECL_OVERRIDE; - bool scroll(const QRegion &area, int dx, int dy) Q_DECL_OVERRIDE; + void resize(const QSize &size, const QRegion &staticContents) override; + bool scroll(const QRegion &area, int dx, int dy) override; - void beginPaint(const QRegion &) Q_DECL_OVERRIDE; - void endPaint() Q_DECL_OVERRIDE; + void beginPaint(const QRegion &) override; + void endPaint() override; private: QXcbShmImage *m_image; diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp index 38e91cc9f6..cee011bbdf 100644 --- a/src/plugins/platforms/xcb/qxcbclipboard.cpp +++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp @@ -90,7 +90,7 @@ public: } protected: - QStringList formats_sys() const Q_DECL_OVERRIDE + QStringList formats_sys() const override { if (isEmpty()) return QStringList(); @@ -120,13 +120,13 @@ protected: return formatList; } - bool hasFormat_sys(const QString &format) const Q_DECL_OVERRIDE + bool hasFormat_sys(const QString &format) const override { QStringList list = formats(); return list.contains(format); } - QVariant retrieveData_sys(const QString &fmt, QVariant::Type requestedType) const Q_DECL_OVERRIDE + QVariant retrieveData_sys(const QString &fmt, QVariant::Type requestedType) const override { if (fmt.isEmpty() || isEmpty()) return QByteArray(); @@ -238,7 +238,7 @@ public: } protected: - void timerEvent(QTimerEvent *ev) Q_DECL_OVERRIDE + void timerEvent(QTimerEvent *ev) override { if (ev->timerId() == abort_timer) { // this can happen when the X client we are sending data diff --git a/src/plugins/platforms/xcb/qxcbclipboard.h b/src/plugins/platforms/xcb/qxcbclipboard.h index ffd565c56f..a0a4f4e5a1 100644 --- a/src/plugins/platforms/xcb/qxcbclipboard.h +++ b/src/plugins/platforms/xcb/qxcbclipboard.h @@ -59,11 +59,11 @@ public: QXcbClipboard(QXcbConnection *connection); ~QXcbClipboard(); - QMimeData *mimeData(QClipboard::Mode mode) Q_DECL_OVERRIDE; - void setMimeData(QMimeData *data, QClipboard::Mode mode) Q_DECL_OVERRIDE; + QMimeData *mimeData(QClipboard::Mode mode) override; + void setMimeData(QMimeData *data, QClipboard::Mode mode) override; - bool supportsMode(QClipboard::Mode mode) const Q_DECL_OVERRIDE; - bool ownsMode(QClipboard::Mode mode) const Q_DECL_OVERRIDE; + bool supportsMode(QClipboard::Mode mode) const override; + bool ownsMode(QClipboard::Mode mode) const override; QXcbScreen *screen() const; diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index f6ba828a15..cb337ea0da 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -315,7 +315,7 @@ class QXcbEventReader : public QThread public: QXcbEventReader(QXcbConnection *connection); - void run() Q_DECL_OVERRIDE; + void run() override; QXcbEventArray *lock(); void unlock(); @@ -519,7 +519,7 @@ public: #endif protected: - bool event(QEvent *e) Q_DECL_OVERRIDE; + bool event(QEvent *e) override; public slots: void flush() { xcb_flush(m_connection); } diff --git a/src/plugins/platforms/xcb/qxcbcursor.h b/src/plugins/platforms/xcb/qxcbcursor.h index 3284a9e3e1..c15225f6d2 100644 --- a/src/plugins/platforms/xcb/qxcbcursor.h +++ b/src/plugins/platforms/xcb/qxcbcursor.h @@ -76,10 +76,10 @@ public: QXcbCursor(QXcbConnection *conn, QXcbScreen *screen); ~QXcbCursor(); #ifndef QT_NO_CURSOR - void changeCursor(QCursor *cursor, QWindow *widget) Q_DECL_OVERRIDE; + void changeCursor(QCursor *cursor, QWindow *widget) override; #endif - QPoint pos() const Q_DECL_OVERRIDE; - void setPos(const QPoint &pos) Q_DECL_OVERRIDE; + QPoint pos() const override; + void setPos(const QPoint &pos) override; static void queryPointer(QXcbConnection *c, QXcbVirtualDesktop **virtualDesktop, QPoint *pos, int *keybMask = 0); diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp index 4915bb1b11..494cecb3d1 100644 --- a/src/plugins/platforms/xcb/qxcbdrag.cpp +++ b/src/plugins/platforms/xcb/qxcbdrag.cpp @@ -130,9 +130,9 @@ public: ~QXcbDropData(); protected: - bool hasFormat_sys(const QString &mimeType) const Q_DECL_OVERRIDE; - QStringList formats_sys() const Q_DECL_OVERRIDE; - QVariant retrieveData_sys(const QString &mimeType, QVariant::Type type) const Q_DECL_OVERRIDE; + bool hasFormat_sys(const QString &mimeType) const override; + QStringList formats_sys() const override; + QVariant retrieveData_sys(const QString &mimeType, QVariant::Type type) const override; QVariant xdndObtainData(const QByteArray &format, QVariant::Type requestedType) const; diff --git a/src/plugins/platforms/xcb/qxcbdrag.h b/src/plugins/platforms/xcb/qxcbdrag.h index cb6e95cc9a..2d152edf76 100644 --- a/src/plugins/platforms/xcb/qxcbdrag.h +++ b/src/plugins/platforms/xcb/qxcbdrag.h @@ -74,14 +74,14 @@ public: QXcbDrag(QXcbConnection *c); ~QXcbDrag(); - virtual QMimeData *platformDropData() Q_DECL_OVERRIDE; - bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE; + QMimeData *platformDropData() override; + bool eventFilter(QObject *o, QEvent *e) override; - void startDrag() Q_DECL_OVERRIDE; - void cancel() Q_DECL_OVERRIDE; - void move(const QPoint &globalPos) Q_DECL_OVERRIDE; - void drop(const QPoint &globalPos) Q_DECL_OVERRIDE; - void endDrag() Q_DECL_OVERRIDE; + void startDrag() override; + void cancel() override; + void move(const QPoint &globalPos) override; + void drop(const QPoint &globalPos) override; + void endDrag() override; void handleEnter(QPlatformWindow *window, const xcb_client_message_event_t *event, xcb_window_t proxy = 0); void handlePosition(QPlatformWindow *w, const xcb_client_message_event_t *event); @@ -93,13 +93,13 @@ public: void handleFinished(const xcb_client_message_event_t *event); bool dndEnable(QXcbWindow *win, bool on); - bool ownsDragObject() const Q_DECL_OVERRIDE; + bool ownsDragObject() const override; void updatePixmap(); xcb_timestamp_t targetTime() { return target_time; } protected: - void timerEvent(QTimerEvent* e) Q_DECL_OVERRIDE; + void timerEvent(QTimerEvent* e) override; private: friend class QXcbDropData; diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h index 34dd44d491..f8034f436f 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.h +++ b/src/plugins/platforms/xcb/qxcbintegration.h @@ -60,57 +60,57 @@ public: QXcbIntegration(const QStringList ¶meters, int &argc, char **argv); ~QXcbIntegration(); - QPlatformWindow *createPlatformWindow(QWindow *window) const Q_DECL_OVERRIDE; + QPlatformWindow *createPlatformWindow(QWindow *window) const override; #ifndef QT_NO_OPENGL - QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const Q_DECL_OVERRIDE; + QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const override; #endif - QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const Q_DECL_OVERRIDE; + QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const override; - QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const override; - bool hasCapability(Capability cap) const Q_DECL_OVERRIDE; - QAbstractEventDispatcher *createEventDispatcher() const Q_DECL_OVERRIDE; - void initialize() Q_DECL_OVERRIDE; + bool hasCapability(Capability cap) const override; + QAbstractEventDispatcher *createEventDispatcher() const override; + void initialize() override; void moveToScreen(QWindow *window, int screen); - QPlatformFontDatabase *fontDatabase() const Q_DECL_OVERRIDE; + QPlatformFontDatabase *fontDatabase() const override; - QPlatformNativeInterface *nativeInterface()const Q_DECL_OVERRIDE; + QPlatformNativeInterface *nativeInterface()const override; #ifndef QT_NO_CLIPBOARD - QPlatformClipboard *clipboard() const Q_DECL_OVERRIDE; + QPlatformClipboard *clipboard() const override; #endif #ifndef QT_NO_DRAGANDDROP - QPlatformDrag *drag() const Q_DECL_OVERRIDE; + QPlatformDrag *drag() const override; #endif - QPlatformInputContext *inputContext() const Q_DECL_OVERRIDE; + QPlatformInputContext *inputContext() const override; #ifndef QT_NO_ACCESSIBILITY - QPlatformAccessibility *accessibility() const Q_DECL_OVERRIDE; + QPlatformAccessibility *accessibility() const override; #endif - QPlatformServices *services() const Q_DECL_OVERRIDE; + QPlatformServices *services() const override; - Qt::KeyboardModifiers queryKeyboardModifiers() const Q_DECL_OVERRIDE; - QList possibleKeys(const QKeyEvent *e) const Q_DECL_OVERRIDE; + Qt::KeyboardModifiers queryKeyboardModifiers() const override; + QList possibleKeys(const QKeyEvent *e) const override; - QStringList themeNames() const Q_DECL_OVERRIDE; - QPlatformTheme *createPlatformTheme(const QString &name) const Q_DECL_OVERRIDE; - QVariant styleHint(StyleHint hint) const Q_DECL_OVERRIDE; + QStringList themeNames() const override; + QPlatformTheme *createPlatformTheme(const QString &name) const override; + QVariant styleHint(StyleHint hint) const override; QXcbConnection *defaultConnection() const { return m_connections.first(); } QByteArray wmClass() const; #if !defined(QT_NO_SESSIONMANAGER) && defined(XCB_USE_SM) - QPlatformSessionManager *createPlatformSessionManager(const QString &id, const QString &key) const Q_DECL_OVERRIDE; + QPlatformSessionManager *createPlatformSessionManager(const QString &id, const QString &key) const override; #endif - void sync() Q_DECL_OVERRIDE; + void sync() override; - void beep() const Q_DECL_OVERRIDE; + void beep() const override; static QXcbIntegration *instance() { return m_instance; } diff --git a/src/plugins/platforms/xcb/qxcbmain.cpp b/src/plugins/platforms/xcb/qxcbmain.cpp index ab55bb7691..f8cb9a9269 100644 --- a/src/plugins/platforms/xcb/qxcbmain.cpp +++ b/src/plugins/platforms/xcb/qxcbmain.cpp @@ -47,7 +47,7 @@ class QXcbIntegrationPlugin : public QPlatformIntegrationPlugin Q_OBJECT Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "xcb.json") public: - QPlatformIntegration *create(const QString&, const QStringList&, int &, char **) Q_DECL_OVERRIDE; + QPlatformIntegration *create(const QString&, const QStringList&, int &, char **) override; }; QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const QStringList& parameters, int &argc, char **argv) diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h index acecbf4116..a830829311 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.h +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h @@ -78,22 +78,22 @@ public: QXcbNativeInterface(); - void *nativeResourceForIntegration(const QByteArray &resource) Q_DECL_OVERRIDE; - void *nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context) Q_DECL_OVERRIDE; - void *nativeResourceForScreen(const QByteArray &resource, QScreen *screen) Q_DECL_OVERRIDE; - void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) Q_DECL_OVERRIDE; - void *nativeResourceForBackingStore(const QByteArray &resource, QBackingStore *backingStore) Q_DECL_OVERRIDE; + void *nativeResourceForIntegration(const QByteArray &resource) override; + void *nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context) override; + void *nativeResourceForScreen(const QByteArray &resource, QScreen *screen) override; + void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) override; + void *nativeResourceForBackingStore(const QByteArray &resource, QBackingStore *backingStore) override; #ifndef QT_NO_CURSOR - void *nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor) Q_DECL_OVERRIDE; + void *nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor) override; #endif - NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) Q_DECL_OVERRIDE; - NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource) Q_DECL_OVERRIDE; - NativeResourceForScreenFunction nativeResourceFunctionForScreen(const QByteArray &resource) Q_DECL_OVERRIDE; - NativeResourceForWindowFunction nativeResourceFunctionForWindow(const QByteArray &resource) Q_DECL_OVERRIDE; - NativeResourceForBackingStoreFunction nativeResourceFunctionForBackingStore(const QByteArray &resource) Q_DECL_OVERRIDE; + NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) override; + NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource) override; + NativeResourceForScreenFunction nativeResourceFunctionForScreen(const QByteArray &resource) override; + NativeResourceForWindowFunction nativeResourceFunctionForWindow(const QByteArray &resource) override; + NativeResourceForBackingStoreFunction nativeResourceFunctionForBackingStore(const QByteArray &resource) override; - QFunctionPointer platformFunction(const QByteArray &function) const Q_DECL_OVERRIDE; + QFunctionPointer platformFunction(const QByteArray &function) const override; inline const QByteArray &genericEventFilterType() const { return m_genericEventFilterType; } diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index 0d32c3d624..627397fcaf 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -115,24 +115,24 @@ public: QString getOutputName(xcb_randr_get_output_info_reply_t *outputInfo); - QPixmap grabWindow(WId window, int x, int y, int width, int height) const Q_DECL_OVERRIDE; + QPixmap grabWindow(WId window, int x, int y, int width, int height) const override; - QWindow *topLevelAt(const QPoint &point) const Q_DECL_OVERRIDE; + QWindow *topLevelAt(const QPoint &point) const override; - QRect geometry() const Q_DECL_OVERRIDE { return m_geometry; } - QRect availableGeometry() const Q_DECL_OVERRIDE {return m_availableGeometry;} - int depth() const Q_DECL_OVERRIDE { return screen()->root_depth; } - QImage::Format format() const Q_DECL_OVERRIDE; - QSizeF physicalSize() const Q_DECL_OVERRIDE { return m_sizeMillimeters; } + QRect geometry() const override { return m_geometry; } + QRect availableGeometry() const override {return m_availableGeometry;} + int depth() const override { return screen()->root_depth; } + QImage::Format format() const override; + QSizeF physicalSize() const override { return m_sizeMillimeters; } QSize virtualSize() const { return m_virtualSize; } QSizeF physicalVirtualSize() const { return m_virtualSizeMillimeters; } QDpi virtualDpi() const; - QDpi logicalDpi() const Q_DECL_OVERRIDE; - qreal pixelDensity() const Q_DECL_OVERRIDE; - QPlatformCursor *cursor() const Q_DECL_OVERRIDE; - qreal refreshRate() const Q_DECL_OVERRIDE { return m_refreshRate; } - Qt::ScreenOrientation orientation() const Q_DECL_OVERRIDE { return m_orientation; } - QList virtualSiblings() const Q_DECL_OVERRIDE { return m_virtualDesktop->screens(); } + QDpi logicalDpi() const override; + qreal pixelDensity() const override; + QPlatformCursor *cursor() const override; + qreal refreshRate() const override { return m_refreshRate; } + Qt::ScreenOrientation orientation() const override { return m_orientation; } + QList virtualSiblings() const override { return m_virtualDesktop->screens(); } QXcbVirtualDesktop *virtualDesktop() const { return m_virtualDesktop; } void setPrimary(bool primary) { m_primary = primary; } @@ -161,7 +161,7 @@ public: const xcb_visualtype_t *visualForId(xcb_visualid_t) const; quint8 depthOfVisual(xcb_visualid_t) const; - QString name() const Q_DECL_OVERRIDE { return m_outputName; } + QString name() const override { return m_outputName; } void handleScreenChange(xcb_randr_screen_change_notify_event_t *change_event); void updateGeometry(const QRect &geom, uint8_t rotation); diff --git a/src/plugins/platforms/xcb/qxcbsessionmanager.h b/src/plugins/platforms/xcb/qxcbsessionmanager.h index a184282034..0ad9445361 100644 --- a/src/plugins/platforms/xcb/qxcbsessionmanager.h +++ b/src/plugins/platforms/xcb/qxcbsessionmanager.h @@ -69,17 +69,17 @@ public: void setSessionId(const QString &id) { m_sessionId = id; } void setSessionKey(const QString &key) { m_sessionKey = key; } - bool allowsInteraction() Q_DECL_OVERRIDE; - bool allowsErrorInteraction() Q_DECL_OVERRIDE; - void release() Q_DECL_OVERRIDE; + bool allowsInteraction() override; + bool allowsErrorInteraction() override; + void release() override; - void cancel() Q_DECL_OVERRIDE; + void cancel() override; - void setManagerProperty(const QString &name, const QString &value) Q_DECL_OVERRIDE; - void setManagerProperty(const QString &name, const QStringList &value) Q_DECL_OVERRIDE; + void setManagerProperty(const QString &name, const QString &value) override; + void setManagerProperty(const QString &name, const QStringList &value) override; - bool isPhase2() const Q_DECL_OVERRIDE; - void requestPhase2() Q_DECL_OVERRIDE; + bool isPhase2() const override; + void requestPhase2() override; void exitEventLoop(); diff --git a/src/plugins/platforms/xcb/qxcbsystemtraytracker.h b/src/plugins/platforms/xcb/qxcbsystemtraytracker.h index 5cca4782aa..a6131e6d0e 100644 --- a/src/plugins/platforms/xcb/qxcbsystemtraytracker.h +++ b/src/plugins/platforms/xcb/qxcbsystemtraytracker.h @@ -61,7 +61,7 @@ public: void notifyManagerClientMessageEvent(const xcb_client_message_event_t *); - void handleDestroyNotifyEvent(const xcb_destroy_notify_event_t *) Q_DECL_OVERRIDE; + void handleDestroyNotifyEvent(const xcb_destroy_notify_event_t *) override; bool visualHasAlphaChannel(); signals: diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 92f3f7a67c..3d8d21be6b 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -76,75 +76,75 @@ public: QXcbWindow(QWindow *window); ~QXcbWindow(); - void setGeometry(const QRect &rect) Q_DECL_OVERRIDE; + void setGeometry(const QRect &rect) override; - QMargins frameMargins() const Q_DECL_OVERRIDE; + QMargins frameMargins() const override; - void setVisible(bool visible) Q_DECL_OVERRIDE; - void setWindowFlags(Qt::WindowFlags flags) Q_DECL_OVERRIDE; - void setWindowState(Qt::WindowState state) Q_DECL_OVERRIDE; - WId winId() const Q_DECL_OVERRIDE; - void setParent(const QPlatformWindow *window) Q_DECL_OVERRIDE; + void setVisible(bool visible) override; + void setWindowFlags(Qt::WindowFlags flags) override; + void setWindowState(Qt::WindowState state) override; + WId winId() const override; + void setParent(const QPlatformWindow *window) override; - bool isExposed() const Q_DECL_OVERRIDE; - bool isEmbedded(const QPlatformWindow *parentWindow = 0) const Q_DECL_OVERRIDE; - QPoint mapToGlobal(const QPoint &pos) const Q_DECL_OVERRIDE; - QPoint mapFromGlobal(const QPoint &pos) const Q_DECL_OVERRIDE; + bool isExposed() const override; + bool isEmbedded(const QPlatformWindow *parentWindow = 0) const override; + QPoint mapToGlobal(const QPoint &pos) const override; + QPoint mapFromGlobal(const QPoint &pos) const override; - void setWindowTitle(const QString &title) Q_DECL_OVERRIDE; + void setWindowTitle(const QString &title) override; void setWindowIconText(const QString &title); - void setWindowIcon(const QIcon &icon) Q_DECL_OVERRIDE; - void raise() Q_DECL_OVERRIDE; - void lower() Q_DECL_OVERRIDE; - void propagateSizeHints() Q_DECL_OVERRIDE; + void setWindowIcon(const QIcon &icon) override; + void raise() override; + void lower() override; + void propagateSizeHints() override; - void requestActivateWindow() Q_DECL_OVERRIDE; + void requestActivateWindow() override; - bool setKeyboardGrabEnabled(bool grab) Q_DECL_OVERRIDE; - bool setMouseGrabEnabled(bool grab) Q_DECL_OVERRIDE; + bool setKeyboardGrabEnabled(bool grab) override; + bool setMouseGrabEnabled(bool grab) override; void setCursor(xcb_cursor_t cursor, bool isBitmapCursor); - QSurfaceFormat format() const Q_DECL_OVERRIDE; + QSurfaceFormat format() const override; - void windowEvent(QEvent *event) Q_DECL_OVERRIDE; + void windowEvent(QEvent *event) override; - bool startSystemResize(const QPoint &pos, Qt::Corner corner) Q_DECL_OVERRIDE; + bool startSystemResize(const QPoint &pos, Qt::Corner corner) override; - void setOpacity(qreal level) Q_DECL_OVERRIDE; - void setMask(const QRegion ®ion) Q_DECL_OVERRIDE; + void setOpacity(qreal level) override; + void setMask(const QRegion ®ion) override; - void setAlertState(bool enabled) Q_DECL_OVERRIDE; - bool isAlertState() const Q_DECL_OVERRIDE { return m_alertState; } + void setAlertState(bool enabled) override; + bool isAlertState() const override { return m_alertState; } xcb_window_t xcb_window() const { return m_window; } uint depth() const { return m_depth; } QImage::Format imageFormat() const { return m_imageFormat; } bool imageNeedsRgbSwap() const { return m_imageRgbSwap; } - bool handleGenericEvent(xcb_generic_event_t *event, long *result) Q_DECL_OVERRIDE; + bool handleGenericEvent(xcb_generic_event_t *event, long *result) override; - void handleExposeEvent(const xcb_expose_event_t *event) Q_DECL_OVERRIDE; - void handleClientMessageEvent(const xcb_client_message_event_t *event) Q_DECL_OVERRIDE; - void handleConfigureNotifyEvent(const xcb_configure_notify_event_t *event) Q_DECL_OVERRIDE; - void handleMapNotifyEvent(const xcb_map_notify_event_t *event) Q_DECL_OVERRIDE; - void handleUnmapNotifyEvent(const xcb_unmap_notify_event_t *event) Q_DECL_OVERRIDE; - void handleButtonPressEvent(const xcb_button_press_event_t *event) Q_DECL_OVERRIDE; - void handleButtonReleaseEvent(const xcb_button_release_event_t *event) Q_DECL_OVERRIDE; - void handleMotionNotifyEvent(const xcb_motion_notify_event_t *event) Q_DECL_OVERRIDE; + void handleExposeEvent(const xcb_expose_event_t *event) override; + void handleClientMessageEvent(const xcb_client_message_event_t *event) override; + void handleConfigureNotifyEvent(const xcb_configure_notify_event_t *event) override; + void handleMapNotifyEvent(const xcb_map_notify_event_t *event) override; + void handleUnmapNotifyEvent(const xcb_unmap_notify_event_t *event) override; + void handleButtonPressEvent(const xcb_button_press_event_t *event) override; + void handleButtonReleaseEvent(const xcb_button_release_event_t *event) override; + void handleMotionNotifyEvent(const xcb_motion_notify_event_t *event) override; - void handleEnterNotifyEvent(const xcb_enter_notify_event_t *event) Q_DECL_OVERRIDE; - void handleLeaveNotifyEvent(const xcb_leave_notify_event_t *event) Q_DECL_OVERRIDE; - void handleFocusInEvent(const xcb_focus_in_event_t *event) Q_DECL_OVERRIDE; - void handleFocusOutEvent(const xcb_focus_out_event_t *event) Q_DECL_OVERRIDE; - void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) Q_DECL_OVERRIDE; + void handleEnterNotifyEvent(const xcb_enter_notify_event_t *event) override; + void handleLeaveNotifyEvent(const xcb_leave_notify_event_t *event) override; + void handleFocusInEvent(const xcb_focus_in_event_t *event) override; + void handleFocusOutEvent(const xcb_focus_out_event_t *event) override; + void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) override; #ifdef XCB_USE_XINPUT22 void handleXIMouseButtonState(const xcb_ge_event_t *); - void handleXIMouseEvent(xcb_ge_event_t *, Qt::MouseEventSource source = Qt::MouseEventNotSynthesized) Q_DECL_OVERRIDE; - void handleXIEnterLeave(xcb_ge_event_t *) Q_DECL_OVERRIDE; + void handleXIMouseEvent(xcb_ge_event_t *, Qt::MouseEventSource source = Qt::MouseEventNotSynthesized) override; + void handleXIEnterLeave(xcb_ge_event_t *) override; #endif - QXcbWindow *toWindow() Q_DECL_OVERRIDE; + QXcbWindow *toWindow() override; void handleMouseEvent(xcb_timestamp_t time, const QPoint &local, const QPoint &global, Qt::KeyboardModifiers modifiers, Qt::MouseEventSource source); diff --git a/src/plugins/platforms/xcb/qxcbxsettings.h b/src/plugins/platforms/xcb/qxcbxsettings.h index ff1932734a..ab1f784274 100644 --- a/src/plugins/platforms/xcb/qxcbxsettings.h +++ b/src/plugins/platforms/xcb/qxcbxsettings.h @@ -61,7 +61,7 @@ public: void removeCallbackForHandle(const QByteArray &property, void *handle); void removeCallbackForHandle(void *handle); - void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) Q_DECL_OVERRIDE; + void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) override; private: QXcbXSettingsPrivate *d_ptr; }; From 65d48808775d4c32b4be05798207f728d165bbfa Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Mon, 28 Nov 2016 14:47:29 +0300 Subject: [PATCH 135/174] xcb: Remove unused QXcbGlIntegrationFactory::keys() This static method was introduced in 8758f532ae6209bcf9447e27edc4fd412c0f173d and was unused even then. Change-Id: Id0d409b7fade977bbbabfcdee0c432b7058f8ace Reviewed-by: Shawn Rutledge --- .../qxcbglintegrationfactory.cpp | 23 ------------------- .../qxcbglintegrationfactory.h | 1 - 2 files changed, 24 deletions(-) diff --git a/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.cpp b/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.cpp index 8e1688dbe8..6650ca44ae 100644 --- a/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.cpp @@ -55,29 +55,6 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, directLoader, (QXcbGlIntegrationFactoryInterface_iid, QLatin1String(""), Qt::CaseInsensitive)) #endif // !QT_NO_LIBRARY -QStringList QXcbGlIntegrationFactory::keys(const QString &pluginPath) -{ - QStringList list; -#ifndef QT_NO_LIBRARY - if (!pluginPath.isEmpty()) { - QCoreApplication::addLibraryPath(pluginPath); - list = directLoader()->keyMap().values(); - if (!list.isEmpty()) { - const QString postFix = QStringLiteral(" (from ") - + QDir::toNativeSeparators(pluginPath) - + QLatin1Char(')'); - const QStringList::iterator end = list.end(); - for (QStringList::iterator it = list.begin(); it != end; ++it) - (*it).append(postFix); - } - } -#else - Q_UNUSED(pluginPath); -#endif - list.append(loader()->keyMap().values()); - return list; -} - QXcbGlIntegration *QXcbGlIntegrationFactory::create(const QString &platform, const QString &pluginPath) { #ifndef QT_NO_LIBRARY diff --git a/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.h b/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.h index 633b11a505..c4aa0a3d8d 100644 --- a/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.h +++ b/src/plugins/platforms/xcb/gl_integrations/qxcbglintegrationfactory.h @@ -49,7 +49,6 @@ class QXcbGlIntegration; class QXcbGlIntegrationFactory { public: - static QStringList keys(const QString &pluginPath = QString()); static QXcbGlIntegration *create(const QString &name, const QString &platformPluginPath = QString()); }; From fec08545ff0b4fb2ce68a7d7502273a599472141 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 18 Oct 2016 17:44:54 +0300 Subject: [PATCH 136/174] QVariant: optimize convert() for bool case Do not create QByteArray from const char* to compare with other QByteArray, because there is an overloaded operator==. So avoid needless allocations. Reorder condition, because isEmpty() method is cheaper than string compare. Change-Id: I8d2c8a0fb247528d9ce485007431167372d62bff Reviewed-by: Edward Welbourne --- src/corelib/kernel/qvariant.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index ccfa7d0d38..0ffc22d810 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -319,7 +319,7 @@ template inline bool qt_convertToBool(const QVariant::Private *const d) { TInput str = v_cast(d)->toLower(); - return !(str == LiteralWrapper("0") || str == LiteralWrapper("false") || str.isEmpty()); + return !(str.isEmpty() || str == LiteralWrapper("0") || str == LiteralWrapper("false")); } /*! @@ -700,7 +700,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) bool *b = static_cast(result); switch(d->type) { case QVariant::ByteArray: - *b = qt_convertToBool(d); + *b = qt_convertToBool(d); break; case QVariant::String: *b = qt_convertToBool(d); From 2503a1e9e7a33c9a69eb134ba59711078255ca4c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 1 Dec 2016 12:51:02 +0100 Subject: [PATCH 137/174] Fix tst_QComboBox::getSetCheck() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change 2fd3d8ea9e3e1829653942431070a83569bab6eb broke the QCOMPARE() in there, partially revert. Change-Id: I8f572b9d82ad1c6b5448504eda7cc2fa53fa3d3d Reviewed-by: Jędrzej Nowacki --- tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index 122d320d18..3afdc0a12a 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -312,10 +312,10 @@ void tst_QComboBox::getSetCheck() // void QComboBox::setItemDelegate(QAbstractItemDelegate *) MyAbstractItemDelegate *var10 = new MyAbstractItemDelegate; obj1.setItemDelegate(var10); - QCOMPARE(obj1.itemDelegate(), nullptr); + QCOMPARE(obj1.itemDelegate(), var10); QTest::ignoreMessage(QtWarningMsg, "QComboBox::setItemDelegate: cannot set a 0 delegate"); obj1.setItemDelegate((QAbstractItemDelegate *)0); - QCOMPARE(obj1.itemDelegate(), nullptr); + QCOMPARE(obj1.itemDelegate(), var10); // delete var10; // No delete, since QComboBox takes ownership // QAbstractItemModel * QComboBox::model() From 1670bc751e7f7f3fddf92870b9a4da5f38ab93a9 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 1 Dec 2016 10:51:13 +0100 Subject: [PATCH 138/174] eglfs: make it possible to configure the EGLStream FIFO length MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Setting QT_QPA_EGLFS_STREAM_FIFO_LENGTH to a >= 1 value changes from mailbox to FIFO mode, with the specified length. [ChangeLog][Platform Specific Changes][Linux] Added an option to switch from mailbox to FIFO mode in eglfs' EGLStream backend. This is done by setting the environment variable QT_QPA_EGLFS_STREAM_FIFO_LENGTH to a >= 1 value, the desired length of the FIFO queue. Change-Id: Ib98e2ff805f8c00ca2e224d1db5b9c1b2c9a04f0 Done-with: Pasi Petajajarvi Reviewed-by: Pasi Petäjäjärvi --- .../qeglfskmsegldeviceintegration.cpp | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp index d0c9c9565e..977b318ad9 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp @@ -129,10 +129,16 @@ void QEglJetsonTK1Window::resetSurface() qCDebug(qLcEglfsKmsDebug, "Creating stream"); EGLDisplay display = screen()->display(); - EGLOutputLayerEXT layer = EGL_NO_OUTPUT_LAYER_EXT; - EGLint count; + EGLint streamAttribs[3]; + int streamAttribCount = 0; + int fifoLength = qEnvironmentVariableIntValue("QT_QPA_EGLFS_STREAM_FIFO_LENGTH"); + if (fifoLength > 0) { + streamAttribs[streamAttribCount++] = EGL_STREAM_FIFO_LENGTH_KHR; + streamAttribs[streamAttribCount++] = fifoLength; + } + streamAttribs[streamAttribCount++] = EGL_NONE; - m_egl_stream = m_integration->m_funcs->create_stream(display, Q_NULLPTR); + m_egl_stream = m_integration->m_funcs->create_stream(display, streamAttribs); if (m_egl_stream == EGL_NO_STREAM_KHR) { qWarning("resetSurface: Couldn't create EGLStream for native window"); return; @@ -140,6 +146,16 @@ void QEglJetsonTK1Window::resetSurface() qCDebug(qLcEglfsKmsDebug, "Created stream %p on display %p", m_egl_stream, display); + EGLint count; + if (m_integration->m_funcs->query_stream(display, m_egl_stream, EGL_STREAM_FIFO_LENGTH_KHR, &count)) { + if (count > 0) + qCDebug(qLcEglfsKmsDebug, "Using EGLStream FIFO mode with %d frames", count); + else + qCDebug(qLcEglfsKmsDebug, "Using EGLStream mailbox mode"); + } else { + qCDebug(qLcEglfsKmsDebug, "Could not query number of EGLStream FIFO frames"); + } + if (!m_integration->m_funcs->get_output_layers(display, Q_NULLPTR, Q_NULLPTR, 0, &count) || count == 0) { qWarning("No output layers found"); return; @@ -159,6 +175,7 @@ void QEglJetsonTK1Window::resetSurface() Q_ASSERT(cur_screen); qCDebug(qLcEglfsKmsDebug, "Searching for id: %d", cur_screen->output().crtc_id); + EGLOutputLayerEXT layer = EGL_NO_OUTPUT_LAYER_EXT; for (int i = 0; i < actualCount; ++i) { EGLAttrib id; if (m_integration->m_funcs->query_output_layer_attrib(display, layers[i], EGL_DRM_CRTC_EXT, &id)) { From b4c7d4f4b382f10c91152acb43b349bc3a5ecc90 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Mon, 28 Nov 2016 11:44:22 +0100 Subject: [PATCH 139/174] Remove unused VCFilterFile::additionalFile Change-Id: I67716404d38f41ee4f558dc5d82c9ae80a6956f1 Reviewed-by: Oswald Buddenhagen --- qmake/generators/win32/msvc_objectmodel.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index e97996120f..4055bb625e 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -912,24 +912,20 @@ struct VCFilterFile { excludeFromBuild = false; } VCFilterFile(const QString &filename, bool exclude = false ) { file = filename; excludeFromBuild = exclude; } - VCFilterFile(const QString &filename, const QString &additional, bool exclude = false ) - { file = filename; excludeFromBuild = exclude; additionalFile = additional; } + bool operator==(const VCFilterFile &other){ return file == other.file - && additionalFile == other.additionalFile && excludeFromBuild == other.excludeFromBuild; } bool excludeFromBuild; QString file; - QString additionalFile; // For tools like MOC }; #ifndef QT_NO_DEBUG_OUTPUT inline QDebug operator<<(QDebug dbg, const VCFilterFile &p) { dbg.nospace() << "VCFilterFile(file(" << p.file - << ") additionalFile(" << p.additionalFile << ") excludeFromBuild(" << p.excludeFromBuild << "))" << endl; return dbg.space(); } From b83884a4e67d7f0e8a6bc9bc5b48ebc34daf6bfd Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Mon, 28 Nov 2016 11:51:27 +0100 Subject: [PATCH 140/174] Remove superfluous VCFilterFile::operator== The default-generated operator is fine. Change-Id: I9acb310aaf551d8da3c0fd9aea65d77ee62a45b4 Reviewed-by: Oswald Buddenhagen --- qmake/generators/win32/msvc_objectmodel.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 4055bb625e..b07898562e 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -913,11 +913,6 @@ struct VCFilterFile VCFilterFile(const QString &filename, bool exclude = false ) { file = filename; excludeFromBuild = exclude; } - bool operator==(const VCFilterFile &other){ - return file == other.file - && excludeFromBuild == other.excludeFromBuild; - } - bool excludeFromBuild; QString file; }; From 5f6800c220d0c0e24e0cd4ac3e4a6bb78d45cb6d Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Mon, 28 Nov 2016 15:03:50 +0100 Subject: [PATCH 141/174] Do not write empty custom build tool on VCConfiguration level This is superfluous. Change-Id: Iac96938c6a7e899244534747a2f8a60bdbbdeb62 Reviewed-by: Oswald Buddenhagen Reviewed-by: Joerg Bornemann --- qmake/generators/win32/msvc_objectmodel.cpp | 2 -- qmake/generators/win32/msvc_objectmodel.h | 1 - 2 files changed, 3 deletions(-) diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 2c57fcc2f5..2d8d1fed0a 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -2149,7 +2149,6 @@ VCConfiguration::VCConfiguration() compiler.config = this; linker.config = this; idl.config = this; - custom.config = this; } // VCFilter --------------------------------------------------------- @@ -2872,7 +2871,6 @@ void VCProjectWriter::write(XmlOutput &xml, const VCConfiguration &tool) << attrE(_UseOfMfc, tool.UseOfMfc) << attrT(_WholeProgramOptimization, tool.WholeProgramOptimization); write(xml, tool.compiler); - write(xml, tool.custom); if (tool.ConfigurationType == typeStaticLibrary) write(xml, tool.librarian); else diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index b07898562e..f9734e8e1b 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -896,7 +896,6 @@ public: VCLinkerTool linker; VCLibrarianTool librarian; VCManifestTool manifestTool; - VCCustomBuildTool custom; VCMIDLTool idl; VCPostBuildEventTool postBuild; VCPreBuildEventTool preBuild; From 9067a7f59c54a3dfab914b842b009b8346ae384c Mon Sep 17 00:00:00 2001 From: Dmitry Shachnev Date: Sat, 5 Nov 2016 20:44:36 +0300 Subject: [PATCH 142/174] dbustray: Handle StatusNotifierWatcher appearing and disappearing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the StatusNotifierWatcher disappears and then appears again, we need to register our tray icon again with it. To do this, split the “register with watcher” part into a separate method, and call it when m_dbusWatcher emits its serviceRegistered() signal. Change-Id: Id5fc8ac81b5038a61b678514dabd3eb9c8f1c106 Reviewed-by: Thiago Macieira Reviewed-by: Shawn Rutledge --- .../genericunix/dbusmenu/qdbusmenuconnection.cpp | 9 ++++++--- .../genericunix/dbusmenu/qdbusmenuconnection_p.h | 2 ++ .../themes/genericunix/dbustray/qdbustrayicon.cpp | 11 +++++++++++ .../themes/genericunix/dbustray/qdbustrayicon_p.h | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection.cpp b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection.cpp index a9d758209a..352e4dfd56 100644 --- a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection.cpp +++ b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection.cpp @@ -119,13 +119,16 @@ bool QDBusMenuConnection::registerTrayIcon(QDBusTrayIcon *item) if (item->menu()) registerTrayIconMenu(item); + return registerTrayIconWithWatcher(item); +} + +bool QDBusMenuConnection::registerTrayIconWithWatcher(QDBusTrayIcon *item) +{ QDBusMessage registerMethod = QDBusMessage::createMethodCall( StatusNotifierWatcherService, StatusNotifierWatcherPath, StatusNotifierWatcherService, QLatin1String("RegisterStatusNotifierItem")); registerMethod.setArguments(QVariantList() << item->instanceId()); - success = m_connection.callWithCallback(registerMethod, this, SIGNAL(trayIconRegistered()), SLOT(dbusError(QDBusError))); - - return success; + return m_connection.callWithCallback(registerMethod, this, SIGNAL(trayIconRegistered()), SLOT(dbusError(QDBusError))); } bool QDBusMenuConnection::unregisterTrayIcon(QDBusTrayIcon *item) diff --git a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h index ae0595ae3b..c7c3f4bc5b 100644 --- a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h +++ b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h @@ -69,11 +69,13 @@ class QDBusMenuConnection : public QObject public: QDBusMenuConnection(QObject *parent = 0, const QString &serviceName = QString()); QDBusConnection connection() const { return m_connection; } + QDBusServiceWatcher *dbusWatcher() const { return m_dbusWatcher; } bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; } #ifndef QT_NO_SYSTEMTRAYICON bool registerTrayIconMenu(QDBusTrayIcon *item); void unregisterTrayIconMenu(QDBusTrayIcon *item); bool registerTrayIcon(QDBusTrayIcon *item); + bool registerTrayIconWithWatcher(QDBusTrayIcon *item); bool unregisterTrayIcon(QDBusTrayIcon *item); #endif // QT_NO_SYSTEMTRAYICON diff --git a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon.cpp b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon.cpp index a686a33464..5c4157c206 100644 --- a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon.cpp +++ b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon.cpp @@ -116,6 +116,8 @@ void QDBusTrayIcon::init() { qCDebug(qLcTray) << "registering" << m_instanceId; m_registered = dBusConnection()->registerTrayIcon(this); + QObject::connect(dBusConnection()->dbusWatcher(), &QDBusServiceWatcher::serviceRegistered, + this, &QDBusTrayIcon::watcherServiceRegistered); } void QDBusTrayIcon::cleanup() @@ -130,6 +132,15 @@ void QDBusTrayIcon::cleanup() m_registered = false; } +void QDBusTrayIcon::watcherServiceRegistered(const QString &serviceName) +{ + Q_UNUSED(serviceName); + // We have the icon registered, but the watcher has restarted or + // changed, so we need to tell it about our icon again + if (m_registered) + dBusConnection()->registerTrayIconWithWatcher(this); +} + void QDBusTrayIcon::attentionTimerExpired() { m_messageTitle = QString(); diff --git a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h index 234ff60584..ff1a7ae532 100644 --- a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h +++ b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h @@ -133,6 +133,7 @@ private Q_SLOTS: void attentionTimerExpired(); void actionInvoked(uint id, const QString &action); void notificationClosed(uint id, uint reason); + void watcherServiceRegistered(const QString &serviceName); private: void setStatus(const QString &status); From b1789d8c0086537afbe0ecc605bcc7a8170c08dc Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 1 Dec 2016 13:40:38 +0100 Subject: [PATCH 143/174] Add EGL_STREAM_FIFO_LENGTH to the helper header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parent patch introducing usage of this attribute did not add it to the EGLStream support header. This is likely not fatal, but follow the practice of defining the constants ourselves, in case they are not present. Change-Id: Ib16f9809f9c6a212570c49472bb840183232e68a Reviewed-by: Pasi Petäjäjärvi --- src/platformsupport/eglconvenience/qeglstreamconvenience_p.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h b/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h index 6c84f29613..8c802a0ca1 100644 --- a/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h +++ b/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h @@ -105,6 +105,10 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLS typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); #endif +#ifndef EGL_KHR_stream_fifo +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#endif + #ifndef EGL_KHR_stream_producer_eglsurface #define EGL_STREAM_BIT_KHR 0x0800 typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); From 09d481987bc94b28252923f9ab7c5b9183d7bf74 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 1 Dec 2016 13:59:15 +0100 Subject: [PATCH 144/174] eglfs: improve EGLStream logging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make it possible to identify from the logs that QT_QPA_EGLFS_LAYER_INDEX was set, in order to help troubleshooting. Change-Id: Ic22825e5df9f0eeb31f817f398b9f6c000c3a00f Reviewed-by: Pasi Petäjäjärvi --- .../eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp index 977b318ad9..b443a724ec 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp @@ -193,8 +193,10 @@ void QEglJetsonTK1Window::resetSurface() QByteArray reqLayerIndex = qgetenv("QT_QPA_EGLFS_LAYER_INDEX"); if (!reqLayerIndex.isEmpty()) { int idx = reqLayerIndex.toInt(); - if (idx >= 0 && idx < layers.count()) + if (idx >= 0 && idx < layers.count()) { + qCDebug(qLcEglfsKmsDebug, "EGLOutput layer index override = %d", idx); layer = layers[idx]; + } } if (layer == EGL_NO_OUTPUT_LAYER_EXT) { From 8d0854c2bd7cf371883726cacb3f8c8549a11eac Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 1 Dec 2016 15:51:47 +0100 Subject: [PATCH 145/174] eglfs: allow forcing an explicit connector index on DRM/KMS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a QT_QPA_EGLFS_KMS_CONNECTOR_INDEX environment variable that applies both to the GBM and EGLDevice backends. Instead of specifying all uninteresting outputs as "off" in the config file in QT_QPA_EGLFS_KMS_CONFIG, this variable provides a shortcut to force one single connector and ignore all others in embedded systems with a fixed connector configuration. The index must be between 0 and DRM connector count - 1. Task-number: QTBUG-57386 Change-Id: I3f9562f48bf6b2ffaf9a0cc232e09a7e0c15645b Reviewed-by: Pasi Petäjäjärvi --- .../eglfs_kms_support/qeglfskmsdevice.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp index f6b58d1ba6..b3c1fbb1bd 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp @@ -399,7 +399,20 @@ void QEglFSKmsDevice::createScreens() QVector screens; + int wantedConnectorIndex = -1; + bool ok; + int idx = qEnvironmentVariableIntValue("QT_QPA_EGLFS_KMS_CONNECTOR_INDEX", &ok); + if (ok) { + if (idx >= 0 && idx < resources->count_connectors) + wantedConnectorIndex = idx; + else + qWarning("Invalid connector index %d", idx); + } + for (int i = 0; i < resources->count_connectors; i++) { + if (wantedConnectorIndex >= 0 && i != wantedConnectorIndex) + continue; + drmModeConnectorPtr connector = drmModeGetConnector(m_dri_fd, resources->connectors[i]); if (!connector) continue; From f30b88846566bc1254e5e6d61077092cdaeba409 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 2 Dec 2016 10:39:35 +0100 Subject: [PATCH 146/174] eglfs: allow forcing an overlay plane MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a QT_QPA_EGLFS_KMS_PLANE_INDEX environment variable that applies both to the GBM and EGLDevice backends. When set to a value between 0 and the number of planes on the connector - 1, the chosen overlay plane will be used for output, meaning there will be a drmModeSetPlane to configure, and, in case of EGLDevice, the plane's corresponding EGL layer will get chosen instead of the CRTC's. Task-number: QTBUG-57386 Change-Id: I12c89472ea5730987052f39211fadc597d1302ef Reviewed-by: Pasi Petäjäjärvi --- .../eglfs_kms/qeglfskmsgbmscreen.cpp | 37 ++++++++++++++----- .../qeglfskmsegldeviceintegration.cpp | 15 +++++--- .../qeglfskmsegldevicescreen.cpp | 35 +++++++++++++----- .../eglfs_kms_support/qeglfskmsdevice.cpp | 27 +++++++++++++- .../eglfs_kms_support/qeglfskmsscreen.h | 3 ++ 5 files changed, 89 insertions(+), 28 deletions(-) diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp index bed775ff81..d4df0dc66e 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp @@ -181,24 +181,41 @@ void QEglFSKmsGbmScreen::flip() FrameBuffer *fb = framebufferForBufferObject(m_gbm_bo_next); - if (!output().mode_set) { - int ret = drmModeSetCrtc(device()->fd(), - output().crtc_id, + QEglFSKmsOutput &op(output()); + const int fd = device()->fd(); + const uint32_t w = op.modes[op.mode].hdisplay; + const uint32_t h = op.modes[op.mode].vdisplay; + + if (!op.mode_set) { + int ret = drmModeSetCrtc(fd, + op.crtc_id, fb->fb, 0, 0, - &output().connector_id, 1, - &output().modes[output().mode]); + &op.connector_id, 1, + &op.modes[op.mode]); - if (ret) { - qErrnoWarning("Could not set DRM mode!"); + if (ret == -1) { + qErrnoWarning(errno, "Could not set DRM mode!"); } else { - output().mode_set = true; + op.mode_set = true; setPowerState(PowerStateOn); + + if (!op.plane_set) { + op.plane_set = true; + if (op.wants_plane) { + int ret = drmModeSetPlane(fd, op.plane_id, op.crtc_id, + uint32_t(-1), 0, + 0, 0, w, h, + 0 << 16, 0 << 16, w << 16, h << 16); + if (ret == -1) + qErrnoWarning(errno, "drmModeSetPlane failed"); + } + } } } - int ret = drmModePageFlip(device()->fd(), - output().crtc_id, + int ret = drmModePageFlip(fd, + op.crtc_id, fb->fb, DRM_MODE_PAGE_FLIP_EVENT, this); diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp index b443a724ec..cf1de71831 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp @@ -39,11 +39,11 @@ ****************************************************************************/ #include "qeglfskmsegldeviceintegration.h" +#include "qeglfskmsegldevice.h" +#include "qeglfskmsegldevicescreen.h" #include #include "private/qeglfswindow_p.h" #include "private/qeglfscursor_p.h" -#include "qeglfskmsegldevice.h" -#include "qeglfskmsscreen.h" #include #include @@ -171,20 +171,23 @@ void QEglJetsonTK1Window::resetSurface() return; } - QEglFSKmsScreen *cur_screen = static_cast(screen()); + QEglFSKmsEglDeviceScreen *cur_screen = static_cast(screen()); Q_ASSERT(cur_screen); - qCDebug(qLcEglfsKmsDebug, "Searching for id: %d", cur_screen->output().crtc_id); + QEglFSKmsOutput &output(cur_screen->output()); + const uint32_t wantedId = !output.wants_plane ? output.crtc_id : output.plane_id; + qCDebug(qLcEglfsKmsDebug, "Searching for id: %d", wantedId); EGLOutputLayerEXT layer = EGL_NO_OUTPUT_LAYER_EXT; for (int i = 0; i < actualCount; ++i) { EGLAttrib id; if (m_integration->m_funcs->query_output_layer_attrib(display, layers[i], EGL_DRM_CRTC_EXT, &id)) { qCDebug(qLcEglfsKmsDebug, " [%d] layer %p - crtc %d", i, layers[i], (int) id); - if (id == EGLAttrib(cur_screen->output().crtc_id)) + if (id == EGLAttrib(wantedId)) layer = layers[i]; } else if (m_integration->m_funcs->query_output_layer_attrib(display, layers[i], EGL_DRM_PLANE_EXT, &id)) { - // Not used yet, just for debugging. qCDebug(qLcEglfsKmsDebug, " [%d] layer %p - plane %d", i, layers[i], (int) id); + if (id == EGLAttrib(wantedId)) + layer = layers[i]; } else { qCDebug(qLcEglfsKmsDebug, " [%d] layer %p - unknown", i, layers[i]); } diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp index 1f672afeb4..3935c99b9e 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp @@ -67,13 +67,16 @@ QPlatformCursor *QEglFSKmsEglDeviceScreen::cursor() const void QEglFSKmsEglDeviceScreen::waitForFlip() { - if (!output().mode_set) { - output().mode_set = true; + QEglFSKmsOutput &op(output()); + const int fd = device()->fd(); + const uint32_t w = op.modes[op.mode].hdisplay; + const uint32_t h = op.modes[op.mode].vdisplay; - drmModeCrtcPtr currentMode = drmModeGetCrtc(device()->fd(), output().crtc_id); - const bool alreadySet = currentMode - && currentMode->width == output().modes[output().mode].hdisplay - && currentMode->height == output().modes[output().mode].vdisplay; + if (!op.mode_set) { + op.mode_set = true; + + drmModeCrtcPtr currentMode = drmModeGetCrtc(fd, op.crtc_id); + const bool alreadySet = currentMode && currentMode->width == w && currentMode->height == h; if (currentMode) drmModeFreeCrtc(currentMode); if (alreadySet) { @@ -87,14 +90,26 @@ void QEglFSKmsEglDeviceScreen::waitForFlip() } qCDebug(qLcEglfsKmsDebug, "Setting mode"); - int ret = drmModeSetCrtc(device()->fd(), output().crtc_id, + int ret = drmModeSetCrtc(fd, op.crtc_id, uint32_t(-1), 0, 0, - &output().connector_id, 1, - &output().modes[output().mode]); + &op.connector_id, 1, + &op.modes[op.mode]); if (ret) - qFatal("drmModeSetCrtc failed"); + qErrnoWarning(errno, "drmModeSetCrtc failed"); } + if (!op.plane_set) { + op.plane_set = true; + + if (op.wants_plane) { + qCDebug(qLcEglfsKmsDebug, "Setting plane %u", op.plane_id); + int ret = drmModeSetPlane(fd, op.plane_id, op.crtc_id, uint32_t(-1), 0, + 0, 0, w, h, + 0 << 16, 0 << 16, w << 16, h << 16); + if (ret == -1) + qErrnoWarning(errno, "drmModeSetPlane failed"); + } + } } QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp index b3c1fbb1bd..75dd083750 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp @@ -329,9 +329,32 @@ QEglFSKmsScreen *QEglFSKmsDevice::createScreenForConnector(drmModeResPtr resourc drmModeGetCrtc(m_dri_fd, crtc_id), modes, connector->subpixel, - connectorProperty(connector, QByteArrayLiteral("DPMS")) + connectorProperty(connector, QByteArrayLiteral("DPMS")), + false, + 0, + false }; + bool ok; + int idx = qEnvironmentVariableIntValue("QT_QPA_EGLFS_KMS_PLANE_INDEX", &ok); + if (ok) { + drmModePlaneRes *planeResources = drmModeGetPlaneResources(m_dri_fd); + if (planeResources) { + if (idx >= 0 && idx < int(planeResources->count_planes)) { + drmModePlane *plane = drmModeGetPlane(m_dri_fd, planeResources->planes[idx]); + if (plane) { + output.wants_plane = true; + output.plane_id = plane->plane_id; + qCDebug(qLcEglfsKmsDebug, "Forcing plane index %d, plane id %u (belongs to crtc id %u)", + idx, plane->plane_id, plane->crtc_id); + drmModeFreePlane(plane); + } + } else { + qWarning("Invalid plane index %d, must be between 0 and %u", idx, planeResources->count_planes - 1); + } + } + } + m_crtc_allocator |= (1 << output.crtc_id); m_connector_allocator |= (1 << output.connector_id); @@ -406,7 +429,7 @@ void QEglFSKmsDevice::createScreens() if (idx >= 0 && idx < resources->count_connectors) wantedConnectorIndex = idx; else - qWarning("Invalid connector index %d", idx); + qWarning("Invalid connector index %d, must be between 0 and %u", idx, resources->count_connectors - 1); } for (int i = 0; i < resources->count_connectors; i++) { diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h index 2b6a0ffe6c..fa331f0931 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h @@ -67,6 +67,9 @@ struct QEglFSKmsOutput QList modes; int subpixel; drmModePropertyPtr dpms_prop; + bool wants_plane; + uint32_t plane_id; + bool plane_set; }; class Q_EGLFS_EXPORT QEglFSKmsScreen : public QEglFSScreen From 5cc1265c340656b02f3bd2fccbadd29a21aa8704 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Thu, 1 Dec 2016 12:49:02 +0200 Subject: [PATCH 147/174] Add ASTC compression Change-Id: I7ae3b02579eb844f109c25a0dd5467748813a558 Reviewed-by: Laszlo Agocs --- src/gui/opengl/qopengltexture.cpp | 170 ++++++++++++++++++++++++++++++ src/gui/opengl/qopengltexture.h | 28 +++++ 2 files changed, 198 insertions(+) diff --git a/src/gui/opengl/qopengltexture.cpp b/src/gui/opengl/qopengltexture.cpp index 0a46eea85d..c9b08f60b1 100644 --- a/src/gui/opengl/qopengltexture.cpp +++ b/src/gui/opengl/qopengltexture.cpp @@ -410,6 +410,34 @@ static bool isSizedTextureFormat(QOpenGLTexture::TextureFormat internalFormat) case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2: case QOpenGLTexture::RGBA8_ETC2_EAC: case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC: + case QOpenGLTexture::RGBA_ASTC_4x4: + case QOpenGLTexture::RGBA_ASTC_5x4: + case QOpenGLTexture::RGBA_ASTC_5x5: + case QOpenGLTexture::RGBA_ASTC_6x5: + case QOpenGLTexture::RGBA_ASTC_6x6: + case QOpenGLTexture::RGBA_ASTC_8x5: + case QOpenGLTexture::RGBA_ASTC_8x6: + case QOpenGLTexture::RGBA_ASTC_8x8: + case QOpenGLTexture::RGBA_ASTC_10x5: + case QOpenGLTexture::RGBA_ASTC_10x6: + case QOpenGLTexture::RGBA_ASTC_10x8: + case QOpenGLTexture::RGBA_ASTC_10x10: + case QOpenGLTexture::RGBA_ASTC_12x10: + case QOpenGLTexture::RGBA_ASTC_12x12: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12: return true; case QOpenGLTexture::RGB8_ETC1: @@ -703,6 +731,36 @@ static QOpenGLTexture::PixelFormat pixelFormatCompatibleWithInternalFormat(QOpen case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC: return QOpenGLTexture::RGBA; + case QOpenGLTexture::RGBA_ASTC_4x4: + case QOpenGLTexture::RGBA_ASTC_5x4: + case QOpenGLTexture::RGBA_ASTC_5x5: + case QOpenGLTexture::RGBA_ASTC_6x5: + case QOpenGLTexture::RGBA_ASTC_6x6: + case QOpenGLTexture::RGBA_ASTC_8x5: + case QOpenGLTexture::RGBA_ASTC_8x6: + case QOpenGLTexture::RGBA_ASTC_8x8: + case QOpenGLTexture::RGBA_ASTC_10x5: + case QOpenGLTexture::RGBA_ASTC_10x6: + case QOpenGLTexture::RGBA_ASTC_10x8: + case QOpenGLTexture::RGBA_ASTC_10x10: + case QOpenGLTexture::RGBA_ASTC_12x10: + case QOpenGLTexture::RGBA_ASTC_12x12: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12: + return QOpenGLTexture::RGBA; + case QOpenGLTexture::DepthFormat: return QOpenGLTexture::Depth; @@ -859,6 +917,34 @@ static QOpenGLTexture::PixelType pixelTypeCompatibleWithInternalFormat(QOpenGLTe case QOpenGLTexture::RGBA8_ETC2_EAC: case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC: case QOpenGLTexture::RGB8_ETC1: + case QOpenGLTexture::RGBA_ASTC_4x4: + case QOpenGLTexture::RGBA_ASTC_5x4: + case QOpenGLTexture::RGBA_ASTC_5x5: + case QOpenGLTexture::RGBA_ASTC_6x5: + case QOpenGLTexture::RGBA_ASTC_6x6: + case QOpenGLTexture::RGBA_ASTC_8x5: + case QOpenGLTexture::RGBA_ASTC_8x6: + case QOpenGLTexture::RGBA_ASTC_8x8: + case QOpenGLTexture::RGBA_ASTC_10x5: + case QOpenGLTexture::RGBA_ASTC_10x6: + case QOpenGLTexture::RGBA_ASTC_10x8: + case QOpenGLTexture::RGBA_ASTC_10x10: + case QOpenGLTexture::RGBA_ASTC_12x10: + case QOpenGLTexture::RGBA_ASTC_12x12: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12: return QOpenGLTexture::UInt8; case QOpenGLTexture::DepthFormat: @@ -977,6 +1063,34 @@ static bool isCompressedFormat(QOpenGLTexture::TextureFormat internalFormat) case QOpenGLTexture::RGBA8_ETC2_EAC: case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC: case QOpenGLTexture::RGB8_ETC1: + case QOpenGLTexture::RGBA_ASTC_4x4: + case QOpenGLTexture::RGBA_ASTC_5x4: + case QOpenGLTexture::RGBA_ASTC_5x5: + case QOpenGLTexture::RGBA_ASTC_6x5: + case QOpenGLTexture::RGBA_ASTC_6x6: + case QOpenGLTexture::RGBA_ASTC_8x5: + case QOpenGLTexture::RGBA_ASTC_8x6: + case QOpenGLTexture::RGBA_ASTC_8x8: + case QOpenGLTexture::RGBA_ASTC_10x5: + case QOpenGLTexture::RGBA_ASTC_10x6: + case QOpenGLTexture::RGBA_ASTC_10x8: + case QOpenGLTexture::RGBA_ASTC_10x10: + case QOpenGLTexture::RGBA_ASTC_12x10: + case QOpenGLTexture::RGBA_ASTC_12x12: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12: return true; case QOpenGLTexture::DepthFormat: @@ -2037,6 +2151,34 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target \value RGBA8_ETC2_EAC Equivalent to GL_COMPRESSED_RGBA8_ETC2_EAC \value SRGB8_Alpha8_ETC2_EAC Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC \value RGB8_ETC1 Equivalent to GL_ETC1_RGB8_OES + \value RGBA_ASTC_4x4 Equivalent to GL_COMPRESSED_RGBA_ASTC_4x4_KHR + \value RGBA_ASTC_5x4 Equivalent to GL_COMPRESSED_RGBA_ASTC_5x4_KHR + \value RGBA_ASTC_5x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_5x5_KHR + \value RGBA_ASTC_6x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_6x5_KHR + \value RGBA_ASTC_6x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_6x6_KHR + \value RGBA_ASTC_8x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x5_KHR + \value RGBA_ASTC_8x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x6_KHR + \value RGBA_ASTC_8x8 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x8_KHR + \value RGBA_ASTC_10x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x5_KHR + \value RGBA_ASTC_10x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x6_KHR + \value RGBA_ASTC_10x8 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x8_KHR + \value RGBA_ASTC_10x10 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x10_KHR + \value RGBA_ASTC_12x10 Equivalent to GL_COMPRESSED_RGBA_ASTC_12x10_KHR + \value RGBA_ASTC_12x12 Equivalent to GL_COMPRESSED_RGBA_ASTC_12x12_KHR + \value SRGB8_Alpha8_ASTC_4x4 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR + \value SRGB8_Alpha8_ASTC_5x4 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR + \value SRGB8_Alpha8_ASTC_5x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR + \value SRGB8_Alpha8_ASTC_6x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR + \value SRGB8_Alpha8_ASTC_6x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR + \value SRGB8_Alpha8_ASTC_8x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR + \value SRGB8_Alpha8_ASTC_8x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR + \value SRGB8_Alpha8_ASTC_8x8 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR + \value SRGB8_Alpha8_ASTC_10x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR + \value SRGB8_Alpha8_ASTC_10x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR + \value SRGB8_Alpha8_ASTC_10x8 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR + \value SRGB8_Alpha8_ASTC_10x10 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR + \value SRGB8_Alpha8_ASTC_12x10 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR + \value SRGB8_Alpha8_ASTC_12x12 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR \value SRGB8 Equivalent to GL_SRGB8 \value SRGB8_Alpha8 Equivalent to GL_SRGB8_ALPHA8 @@ -2592,6 +2734,34 @@ void QOpenGLTexture::setFormat(TextureFormat format) case RGBAFormat: case LuminanceFormat: case LuminanceAlphaFormat: + case QOpenGLTexture::RGBA_ASTC_4x4: + case QOpenGLTexture::RGBA_ASTC_5x4: + case QOpenGLTexture::RGBA_ASTC_5x5: + case QOpenGLTexture::RGBA_ASTC_6x5: + case QOpenGLTexture::RGBA_ASTC_6x6: + case QOpenGLTexture::RGBA_ASTC_8x5: + case QOpenGLTexture::RGBA_ASTC_8x6: + case QOpenGLTexture::RGBA_ASTC_8x8: + case QOpenGLTexture::RGBA_ASTC_10x5: + case QOpenGLTexture::RGBA_ASTC_10x6: + case QOpenGLTexture::RGBA_ASTC_10x8: + case QOpenGLTexture::RGBA_ASTC_10x10: + case QOpenGLTexture::RGBA_ASTC_12x10: + case QOpenGLTexture::RGBA_ASTC_12x12: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10: + case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12: d->formatClass = FormatClass_Unique; break; } diff --git a/src/gui/opengl/qopengltexture.h b/src/gui/opengl/qopengltexture.h index 0a948488a6..d0a3bfec8b 100644 --- a/src/gui/opengl/qopengltexture.h +++ b/src/gui/opengl/qopengltexture.h @@ -208,6 +208,34 @@ public: RGBA8_ETC2_EAC = 0x9278, // GL_COMPRESSED_RGBA8_ETC2_EAC SRGB8_Alpha8_ETC2_EAC = 0x9279, // GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC RGB8_ETC1 = 0x8D64, // GL_ETC1_RGB8_OES + RGBA_ASTC_4x4 = 0x93B0, // GL_COMPRESSED_RGBA_ASTC_4x4_KHR + RGBA_ASTC_5x4 = 0x93B1, // GL_COMPRESSED_RGBA_ASTC_5x4_KHR + RGBA_ASTC_5x5 = 0x93B2, // GL_COMPRESSED_RGBA_ASTC_5x5_KHR + RGBA_ASTC_6x5 = 0x93B3, // GL_COMPRESSED_RGBA_ASTC_6x5_KHR + RGBA_ASTC_6x6 = 0x93B4, // GL_COMPRESSED_RGBA_ASTC_6x6_KHR + RGBA_ASTC_8x5 = 0x93B5, // GL_COMPRESSED_RGBA_ASTC_8x5_KHR + RGBA_ASTC_8x6 = 0x93B6, // GL_COMPRESSED_RGBA_ASTC_8x6_KHR + RGBA_ASTC_8x8 = 0x93B7, // GL_COMPRESSED_RGBA_ASTC_8x8_KHR + RGBA_ASTC_10x5 = 0x93B8, // GL_COMPRESSED_RGBA_ASTC_10x5_KHR + RGBA_ASTC_10x6 = 0x93B9, // GL_COMPRESSED_RGBA_ASTC_10x6_KHR + RGBA_ASTC_10x8 = 0x93BA, // GL_COMPRESSED_RGBA_ASTC_10x8_KHR + RGBA_ASTC_10x10 = 0x93BB, // GL_COMPRESSED_RGBA_ASTC_10x10_KHR + RGBA_ASTC_12x10 = 0x93BC, // GL_COMPRESSED_RGBA_ASTC_12x10_KHR + RGBA_ASTC_12x12 = 0x93BD, // GL_COMPRESSED_RGBA_ASTC_12x12_KHR + SRGB8_Alpha8_ASTC_4x4 = 0x93D0, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR + SRGB8_Alpha8_ASTC_5x4 = 0x93D1, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR + SRGB8_Alpha8_ASTC_5x5 = 0x93D2, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR + SRGB8_Alpha8_ASTC_6x5 = 0x93D3, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR + SRGB8_Alpha8_ASTC_6x6 = 0x93D4, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR + SRGB8_Alpha8_ASTC_8x5 = 0x93D5, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR + SRGB8_Alpha8_ASTC_8x6 = 0x93D6, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR + SRGB8_Alpha8_ASTC_8x8 = 0x93D7, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR + SRGB8_Alpha8_ASTC_10x5 = 0x93D8, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR + SRGB8_Alpha8_ASTC_10x6 = 0x93D9, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR + SRGB8_Alpha8_ASTC_10x8 = 0x93DA, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR + SRGB8_Alpha8_ASTC_10x10 = 0x93DB, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR + SRGB8_Alpha8_ASTC_12x10 = 0x93DC, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR + SRGB8_Alpha8_ASTC_12x12 = 0x93DD, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR // sRGB formats SRGB8 = 0x8C41, // GL_SRGB8 From e3b6f6d16577c74433de1ca9e15402cdf285abca Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 18 Nov 2016 16:33:12 +0100 Subject: [PATCH 148/174] Fix blending of RGB32 on RGB32 with partial opacity The alpha channel of an RGB32 image was not properly ignored when doing blending with partial opacity. Now the alpha value is properly ignored, which is both more correct and faster. This also makes SSE2 and AVX2 implementations match NEON which was already doing the right thing (though had dead code for doing it wrong). Change-Id: I4613b8d70ed8c2e36ced10baaa7a4a55bd36a940 Reviewed-by: Eirik Aavitsland --- src/gui/painting/qblendfunctions.cpp | 30 +++++++++++-------- src/gui/painting/qdrawhelper_avx2.cpp | 8 ++--- src/gui/painting/qdrawhelper_neon.cpp | 2 -- src/gui/painting/qdrawhelper_sse2.cpp | 11 +++---- .../gui/painting/qpainter/tst_qpainter.cpp | 20 +++++++++++++ 5 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/gui/painting/qblendfunctions.cpp b/src/gui/painting/qblendfunctions.cpp index 0a5d458532..a4a091a29f 100644 --- a/src/gui/painting/qblendfunctions.cpp +++ b/src/gui/painting/qblendfunctions.cpp @@ -385,19 +385,25 @@ void qt_blend_rgb32_on_rgb32(uchar *destPixels, int dbpl, destPixels, dbpl, srcPixels, sbpl, w, h, const_alpha); fflush(stdout); #endif - - if (const_alpha != 256) { - qt_blend_argb32_on_argb32(destPixels, dbpl, srcPixels, sbpl, w, h, const_alpha); - return; - } - const uint *src = (const uint *) srcPixels; uint *dst = (uint *) destPixels; - int len = w * 4; - for (int y=0; y> 8; + int ialpha = 255 - const_alpha; + for (int y=0; y Date: Tue, 29 Nov 2016 16:56:42 +0100 Subject: [PATCH 149/174] tst_qsqlquery.cpp: Refactor runIntegralTypesMysqlTest() Change 3370ab9119df09ca14f7d4641c555e60c1b3f478 introduced warnings from MSVC: tst_qsqlquery.cpp(4005): warning C4805: '==': unsafe mix of type 'const bool' and type 'int' in operation tst_qsqlquery.cpp(4059): note: see reference to function template instantiation 'void runIntegralTypesMysqlTest(QSqlDatabase &,const QString &,const QString &,const bool,const T,const T)' being compiled with [ T=bool ] tst_qsqlquery.cpp(4006): warning C4805: '==': unsafe mix of type 'const bool' and type 'int' in operation tst_qsqlquery.cpp(4006): warning C4804: '/': unsafe use of type 'bool' in operation tst_qsqlquery.cpp(4026): warning C4804: '+=': unsafe use of type 'bool' in operation Extract an overload taking a QVector of values and use that for the bool case instead of looping over min/max to generate a sequence of values for bool. Change-Id: I72583774e788b8df899f22ed1a64278217e664f6 Reviewed-by: Milian Wolff --- .../sql/kernel/qsqlquery/tst_qsqlquery.cpp | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp index 84e9643e77..8deb5ddf8f 100644 --- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp @@ -3995,35 +3995,29 @@ void tst_QSqlQuery::aggregateFunctionTypes() } template -void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, const QString &type, const bool withPreparedStatement, - const T min = std::numeric_limits::min(), const T max = std::numeric_limits::max()) +void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, + const QString &type, bool withPreparedStatement, + const QVector &values) { + QVector variantValues; + variantValues.reserve(values.size()); + QSqlQuery q(db); QVERIFY_SQL(q, exec("DROP TABLE IF EXISTS " + tableName)); QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id " + type + ')')); - const int steps = (max == min + 1) ? 2 : 20; - const T increment = (max == min + 1) ? 1 : (max / steps - min / steps); - - // insert some values - QVector values; - QVector variantValues; - values.resize(steps); - variantValues.resize(steps); - T v = min; if (withPreparedStatement) { QVERIFY_SQL(q, prepare("INSERT INTO " + tableName + " (id) VALUES (?)")); } for (int i = 0; i < values.size(); ++i) { + const T v = values.at(i); if (withPreparedStatement) { q.bindValue(0, v); QVERIFY_SQL(q, exec()); } else { QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (" + QString::number(v) + QLatin1Char(')'))); } - values[i] = v; - variantValues[i] = QVariant::fromValue(v); - v += increment; + variantValues.append(QVariant::fromValue(v)); } // ensure we can read them back properly @@ -4048,16 +4042,34 @@ void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, const QCOMPARE(actualVariantValues, variantValues); } +template +void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, + const QString &type, const bool withPreparedStatement, + const T min = std::numeric_limits::min(), + const T max = std::numeric_limits::max()) +{ + // insert some values + const int steps = 20; + const T increment = (max / steps - min / steps); + QVector values; + values.reserve(steps); + T v = min; + for (int i = 0; i < steps; ++i, v += increment) + values.append(v); + runIntegralTypesMysqlTest(db, tableName, type, withPreparedStatement, values); +} + void tst_QSqlQuery::integralTypesMysql() { QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QVector boolValues = QVector() << false << true; for (int i = 0; i < 2; ++i) { const bool withPreparedStatement = (i == 1); - runIntegralTypesMysqlTest(db, "tinyInt1Test", "TINYINT(1)", withPreparedStatement); - runIntegralTypesMysqlTest(db, "unsignedTinyInt1Test", "TINYINT(1) UNSIGNED", withPreparedStatement); + runIntegralTypesMysqlTest(db, "tinyInt1Test", "TINYINT(1)", withPreparedStatement, boolValues); + runIntegralTypesMysqlTest(db, "unsignedTinyInt1Test", "TINYINT(1) UNSIGNED", withPreparedStatement, boolValues); runIntegralTypesMysqlTest(db, "tinyIntTest", "TINYINT", withPreparedStatement); runIntegralTypesMysqlTest(db, "unsignedTinyIntTest", "TINYINT UNSIGNED", withPreparedStatement); runIntegralTypesMysqlTest(db, "smallIntTest", "SMALLINT", withPreparedStatement); From 6ff4d8c61afc2ede16d60195dc30ea6538e2d5c9 Mon Sep 17 00:00:00 2001 From: Kevin Funk Date: Mon, 5 Dec 2016 13:18:57 +0100 Subject: [PATCH 150/174] QTest::addColumn: Use nullptr instead of 0 Fixes -Wzero-as-null-pointer-constant warning in user code Change-Id: I59492633d14947e90e91efa7c4fcd14c33fa413e Reviewed-by: Marc Mutz Reviewed-by: Thiago Macieira --- src/testlib/qtestcase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index c3ccfc3f8c..4c226830e9 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -309,7 +309,7 @@ namespace QTest Q_TESTLIB_EXPORT void addColumnInternal(int id, const char *name); template - inline void addColumn(const char *name, T * = 0) + inline void addColumn(const char *name, T * = nullptr) { typedef std::is_same QIsSameTConstChar; Q_STATIC_ASSERT_X(!QIsSameTConstChar::value, "const char* is not allowed as a test data format."); From 3c4febf5571e2a34846e6377688676dbd034556b Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Mon, 5 Dec 2016 13:50:53 +0100 Subject: [PATCH 151/174] Fix using 0 as null pointer Fixes: error: zero as null pointer constant. Change-Id: I850d51075263dac6dd135d3cadc136cbd08b40ab Reviewed-by: Thiago Macieira --- src/dbus/qdbuspendingreply.h | 4 ++-- src/dbus/qdbusreply.h | 2 +- src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dbus/qdbuspendingreply.h b/src/dbus/qdbuspendingreply.h index 786eab2120..da29894d15 100644 --- a/src/dbus/qdbuspendingreply.h +++ b/src/dbus/qdbuspendingreply.h @@ -77,7 +77,7 @@ namespace QDBusPendingReplyTypes { typedef T1 Type; }; - template inline int metaTypeFor(T1 * = 0) + template inline int metaTypeFor(T1 * = nullptr) { return qMetaTypeId(); } // specialize for QVariant, allowing it to be used in place of QDBusVariant template<> inline int metaTypeFor(QVariant *) @@ -91,7 +91,7 @@ namespace QDBusPendingReplyTypes { enum { Total = Next::Total + 1 }; static inline void fillMetaTypes(int *p) { - *p = metaTypeFor(0); + *p = metaTypeFor(nullptr); Next::fillMetaTypes(++p); } }; diff --git a/src/dbus/qdbusreply.h b/src/dbus/qdbusreply.h index b6a454d240..227615024a 100644 --- a/src/dbus/qdbusreply.h +++ b/src/dbus/qdbusreply.h @@ -66,7 +66,7 @@ public: } inline QDBusReply& operator=(const QDBusMessage &reply) { - QVariant data(qMetaTypeId(), reinterpret_cast(0)); + QVariant data(qMetaTypeId(), nullptr); qDBusReplyFill(reply, m_error, data); m_data = qvariant_cast(data); return *this; diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp index 2f9721b175..cdf3ad3310 100644 --- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp +++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp @@ -514,7 +514,7 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf // constructors/destructors: hs << "public:" << endl - << " " << className << "(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0);" << endl + << " " << className << "(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);" << endl << endl << " ~" << className << "();" << endl << endl; From 0382bb2ab830898fa14b6e42d5ca1b105f6693a7 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Mon, 5 Dec 2016 22:04:25 +0000 Subject: [PATCH 152/174] Fix crash when dragging a tab off QDockWidgetGroupWindow Crashes later in QMainWindowLayout::hover() Change-Id: Ibf1085ebfa7b0edcbd1662b0300550788b7f9c33 Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/widgets/widgets/qdockwidget.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index 1df7259aba..c9cb826213 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -797,8 +797,10 @@ void QDockWidgetPrivate::endDrag(bool abort) if (abort || !mwLayout->plug(state->widgetItem)) { if (hasFeature(this, QDockWidget::DockWidgetFloatable)) { // This QDockWidget will now stay in the floating state. - if (state->ownWidgetItem) + if (state->ownWidgetItem) { delete state->widgetItem; + state->widgetItem = nullptr; + } mwLayout->restore(); QDockWidgetLayout *dwLayout = qobject_cast(layout); if (!dwLayout->nativeWindowDeco()) { From 506aa694a9e466f04c392d814b02c2130611dce6 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 16 Nov 2016 16:25:11 +0100 Subject: [PATCH 153/174] Cleanup convert_ARGB_to_ARGB_PM_inplace_sse2 Changes it to follow standard SIMD patterns so it can use ALIGNMENT_PROLOGUE_16BYTES and SIMD_EPILOGUE helpers. Should also improve performance by using aligned memory access. Change-Id: I14a48b82e3f3de83bd7572aa82bed07f28ad944c Reviewed-by: Erik Verbruggen --- src/gui/image/qimage_sse2.cpp | 59 ++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/gui/image/qimage_sse2.cpp b/src/gui/image/qimage_sse2.cpp index 0fb92e9d43..8f7195e0b5 100644 --- a/src/gui/image/qimage_sse2.cpp +++ b/src/gui/image/qimage_sse2.cpp @@ -51,51 +51,66 @@ bool convert_ARGB_to_ARGB_PM_inplace_sse2(QImageData *data, Qt::ImageConversionF { Q_ASSERT(data->format == QImage::Format_ARGB32 || data->format == QImage::Format_RGBA8888); - // extra pixels on each line - const int spare = data->width & 3; - // width in pixels of the pad at the end of each line - const int pad = (data->bytes_per_line >> 2) - data->width; - const int iter = data->width >> 2; - int height = data->height; + const int width = data->width; + const int height = data->height; + const int bpl = data->bytes_per_line; const __m128i alphaMask = _mm_set1_epi32(0xff000000); const __m128i nullVector = _mm_setzero_si128(); const __m128i half = _mm_set1_epi16(0x80); const __m128i colorMask = _mm_set1_epi32(0x00ff00ff); - __m128i *d = reinterpret_cast<__m128i*>(data->data); - while (height--) { - const __m128i *end = d + iter; - - for (; d != end; ++d) { - const __m128i srcVector = _mm_loadu_si128(d); + uchar *d = data->data; + for (int y = 0; y < height; ++y) { + int i = 0; + quint32 *d32 = reinterpret_cast(d); + ALIGNMENT_PROLOGUE_16BYTES(d, i, width) { + const quint32 p = d32[i]; + if (p <= 0x00ffffff) + d32[i] = 0; + else if (p < 0xff000000) + d32[i] = qPremultiply(p); + } + __m128i *d128 = reinterpret_cast<__m128i *>(d32 + i); + for (; i < (width - 3); i += 4) { + const __m128i srcVector = _mm_load_si128(d128); +#ifdef __SSE4_1__ + if (_mm_testc_si128(srcVector, alphaMask)) { + // opaque, data is unchanged + } else if (_mm_testz_si128(srcVector, alphaMask)) { + // fully transparent + _mm_store_si128(d128, nullVector); + } else { + const __m128i srcVectorAlpha = _mm_and_si128(srcVector, alphaMask); +#else const __m128i srcVectorAlpha = _mm_and_si128(srcVector, alphaMask); if (_mm_movemask_epi8(_mm_cmpeq_epi32(srcVectorAlpha, alphaMask)) == 0xffff) { // opaque, data is unchanged } else if (_mm_movemask_epi8(_mm_cmpeq_epi32(srcVectorAlpha, nullVector)) == 0xffff) { // fully transparent - _mm_storeu_si128(d, nullVector); + _mm_store_si128(d128, nullVector); } else { +#endif __m128i alphaChannel = _mm_srli_epi32(srcVector, 24); alphaChannel = _mm_or_si128(alphaChannel, _mm_slli_epi32(alphaChannel, 16)); __m128i result; BYTE_MUL_SSE2(result, srcVector, alphaChannel, colorMask, half); result = _mm_or_si128(_mm_andnot_si128(alphaMask, result), srcVectorAlpha); - _mm_storeu_si128(d, result); + _mm_store_si128(d128, result); } + d128++; } - QRgb *p = reinterpret_cast(d); - QRgb *pe = p+spare; - for (; p != pe; ++p) { - if (*p < 0x00ffffff) - *p = 0; - else if (*p < 0xff000000) - *p = qPremultiply(*p); + SIMD_EPILOGUE(i, width, 3) { + const quint32 p = d32[i]; + if (p <= 0x00ffffff) + d32[i] = 0; + else if (p < 0xff000000) + d32[i] = qPremultiply(p); } - d = reinterpret_cast<__m128i*>(p+pad); + d += bpl; } if (data->format == QImage::Format_ARGB32) From 141be52f2f5a0029a7ee4ca3ab211fd2576c02b1 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 30 Nov 2016 15:31:00 +0100 Subject: [PATCH 154/174] Merge the two features for shared memory Change-Id: Ic7bd27b289b755c801e3c510c44b2afe9a253bd8 Reviewed-by: Oswald Buddenhagen --- src/corelib/configure.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 89f824d880..c170b38977 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -355,11 +355,6 @@ "condition": "features.statemachine", "output": [ "publicFeature" ] }, - "sharedmemory": { - "label": "Enable QSharedMemory", - "condition": "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix", - "output": [ { "type": "define", "negative": true, "name": "QT_NO_SHAREDMEMORY" } ] - }, "slog2": { "label": "slog2", "condition": "libs.slog2", @@ -395,7 +390,9 @@ "label": "QSharedMemory", "purpose": "Provides access to a shared memory segment.", "section": "Kernel", - "condition": "!config.vxworks", + "condition": [ + "config.android || config.win32 || (!config.vxworks && (tests.ipc_sysv || tests.ipc_posix))" + ], "output": [ "publicFeature", "feature" ] }, "systemsemaphore": { From 86ccc843574eb57c6bb6d68e96c56b7cbcbb66f0 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Tue, 6 Dec 2016 23:59:40 +0300 Subject: [PATCH 155/174] eglfs: Add missing override Change-Id: I257cfb29b919de5d4876d39e0512815c6ed24a88 Reviewed-by: Laszlo Agocs --- .../eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp index f9924fe5ce..0a547b832f 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp @@ -55,7 +55,7 @@ public: EventReader(QEglFSX11Integration *integration) : m_integration(integration) { } - void run(); + void run() override; private: QEglFSX11Integration *m_integration; From 074b9f1eef6ec48ed66db14699dbc74141fa63b5 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 5 Dec 2016 16:13:40 +0100 Subject: [PATCH 156/174] Make reported build type match old configure Adds platform and CPU features to the reported build type, matching the format of the old configure. Started-by: Allan Sandfeld Jensen Change-Id: I6d93ec7416b38684da51af5238a5cf537810b21d Reviewed-by: Allan Sandfeld Jensen Reviewed-by: Thiago Macieira --- configure.pri | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/configure.pri b/configure.pri index 19719736a9..dc749cd6d4 100644 --- a/configure.pri +++ b/configure.pri @@ -510,12 +510,19 @@ defineTest(qtConfReport_buildParts) { qtConfReportPadded($${1}, $$qtConfEvaluate("tests.build_parts.value")) } +defineReplace(qtConfReportArch) { + arch = $$qtConfEvaluate('tests.$${1}.arch') + subarch = $$qtConfEvaluate('tests.$${1}.subarch') + isEmpty(subarch): subarch = + return("$$arch, CPU features: $$subarch") +} + defineTest(qtConfReport_buildTypeAndConfig) { !$$qtConfEvaluate("features.cross_compile") { - qtConfAddReport("Build type: $$qtConfEvaluate('tests.architecture.arch')") + qtConfAddReport("Build type: $$[QMAKE_SPEC] ($$qtConfReportArch(architecture))") } else { - qtConfAddReport("Building on: $$qtConfEvaluate('tests.host_architecture.arch')") - qtConfAddReport("Building for: $$qtConfEvaluate('tests.architecture.arch')") + qtConfAddReport("Building on: $$[QMAKE_SPEC] ($$qtConfReportArch(host_architecture))") + qtConfAddReport("Building for: $$[QMAKE_XSPEC] ($$qtConfReportArch(architecture))") } qtConfAddReport() qtConfAddReport("Configuration: $$eval($${currentConfig}.output.privatePro.append.CONFIG) $$eval($${currentConfig}.output.publicPro.append.QT_CONFIG)") From f882d2f443a8950a2f784fa91b3ff10a645577f7 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 7 Dec 2016 13:03:44 +0100 Subject: [PATCH 157/174] Fix qdrawhelper function toRGB64 The function was incorrectly handling green and blue color channels causing them to be dropped. This affects drawing non 32-bit images onto 10-bit per color channels formats such as RGB30. Change-Id: I9211e253b1a9da0dada5c418d592a8f531265989 Reviewed-by: Eirik Aavitsland --- src/gui/painting/qdrawhelper.cpp | 4 ++-- .../auto/gui/painting/qpainter/tst_qpainter.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 64956d342d..8700a0fce1 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -217,8 +217,8 @@ static const QRgba64 *QT_FASTCALL convertToRGB64(QRgba64 *buffer, const uint *sr uint green = (src[i] >> greenShift()) & greenMask; uint blue = (src[i] >> blueShift()) & blueMask; - red = ((red << redLeftShift) | (red >> redRightShift)) << 16; - green = ((green << greenLeftShift) | (green >> greenRightShift)) << 8; + red = ((red << redLeftShift) | (red >> redRightShift)); + green = ((green << greenLeftShift) | (green >> greenRightShift)); blue = (blue << blueLeftShift) | (blue >> blueRightShift); buffer[i] = QRgba64::fromRgba(red, green, blue, 255); } diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index c729b2f94c..cf4979e291 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -301,6 +301,7 @@ private slots: void QTBUG56252(); void blendNullRGB32(); + void toRGB64(); private: void fillData(); @@ -5159,6 +5160,21 @@ void tst_QPainter::blendNullRGB32() QVERIFY(image.pixel(i,0) != 0xffffffff); } +void tst_QPainter::toRGB64() +{ + QImage dst(10, 1, QImage::Format_BGR30); + QImage src(10, 1, QImage::Format_RGB16); + src.fill(Qt::white); + + QPainter paint(&dst); + paint.drawImage(0, 0, src); + paint.end(); + + for (int i=0; i < dst.width(); ++i) { + QVERIFY(dst.pixelColor(i,0) == QColor(Qt::white)); + } +} + QTEST_MAIN(tst_QPainter) #include "tst_qpainter.moc" From e2978d6097be2313e49c57ec14618033cbfa7414 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 18 Nov 2016 18:17:49 +0100 Subject: [PATCH 158/174] move license check to qmake-based configure system this also removes the need for passing pre-processed options via configure.cfg, so get rid of that. a somewhat unfortunate side effect is that the android-style-assets feature had to move back to the top level, as the licensing options depend on it. Started-by: Lars Knoll Change-Id: Id4d1e0ba18b3e3104400293b8f0c7f2f65e68dea Reviewed-by: Lars Knoll --- configure | 195 ++------------------------- configure.json | 12 ++ configure.pri | 166 ++++++++++++++++++++++- mkspecs/features/qt_configure.prf | 14 +- src/gui/configure.json | 6 - tools/configure/Makefile.mingw | 4 +- tools/configure/Makefile.win32 | 4 +- tools/configure/configure.pro | 4 +- tools/configure/configureapp.cpp | 216 ++---------------------------- tools/configure/configureapp.h | 6 - tools/configure/environment.cpp | 25 ---- tools/configure/environment.h | 1 - tools/configure/main.cpp | 7 - tools/configure/tools.cpp | 79 ----------- tools/configure/tools.h | 43 ------ 15 files changed, 213 insertions(+), 569 deletions(-) delete mode 100644 tools/configure/tools.cpp delete mode 100644 tools/configure/tools.h diff --git a/configure b/configure index bc18e614d2..48dea87fb7 100755 --- a/configure +++ b/configure @@ -400,13 +400,6 @@ UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -# detect the "echo without newline" style. usage: echo $ECHO_N "$ECHO_C" -if echo '\c' | grep '\c' >/dev/null; then - ECHO_N=-n -else - ECHO_C='\c' -fi - BUILD_ON_MAC=no if [ -d /System/Library/Frameworks/Carbon.framework ]; then BUILD_ON_MAC=yes @@ -469,7 +462,6 @@ unset QTDIR # initalize internal variables CFG_RELEASE_TOOLS=no -CFG_ANDROID_STYLE_ASSETS=yes XPLATFORM= # This seems to be the QMAKESPEC, like "linux-g++" XPLATFORM_MAC=no # Whether target platform is macOS, iOS, tvOS, or watchOS @@ -790,12 +782,6 @@ while [ "$#" -gt 0 ]; do android-toolchain-version) CFG_DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION="$VAL" ;; - android-style-assets) - # Required to be able to show the correct license text - if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then - CFG_ANDROID_STYLE_ASSETS="$VAL" - fi - ;; *) ;; esac @@ -1007,168 +993,6 @@ case "$XPLATFORM" in ;; esac -#------------------------------------------------------------------------------- -# check the license -#------------------------------------------------------------------------------- - -if [ "$COMMERCIAL_USER" = "ask" ]; then - while true; do - echo "Which edition of Qt do you want to use ?" - echo - echo "Type 'c' if you want to use the Commercial Edition." - echo "Type 'o' if you want to use the Open Source Edition." - echo - read commercial - echo - if [ "$commercial" = "c" ]; then - COMMERCIAL_USER="yes" - OPT_CMDLINE="$OPT_CMDLINE --commercial" - break - elif [ "$commercial" = "o" ]; then - COMMERCIAL_USER="no" - OPT_CMDLINE="$OPT_CMDLINE --opensource" - break - fi - done -fi - -if [ -f "$relpath"/LICENSE.PREVIEW.COMMERCIAL ] && [ $COMMERCIAL_USER = "yes" ]; then - # Commercial preview release - Licensee="Preview" - Edition="Preview" - EditionString="Technology Preview" -elif [ $COMMERCIAL_USER = "yes" ]; then - if [ $UNAME_SYSTEM = "Linux" ]; then - case "$PLATFORM" in - *-32) - Licheck=licheck32 - ;; - *-64) - Licheck=licheck64 - ;; - *) - if file -L /bin/sh | grep -q "64-bit" ; then - Licheck=licheck64 - else - Licheck=licheck32 - fi - ;; - esac - elif [ $UNAME_SYSTEM = "Darwin" ]; then - Licheck=licheck_mac - else - echo >&2 "Host operating system not supported by this edition of Qt." - exit 1 - fi - if [ -x "$relpath/bin/$Licheck" ]; then - LicheckOutput=`$relpath/bin/$Licheck $OPT_CONFIRM_LICENSE $relpath $outpath\ - $PLATFORM $XPLATFORM` - if [ $? -ne 0 ]; then - exit 1 - else - eval "$LicheckOutput" - fi - else - echo - echo "Error: This is the Open Source version of Qt." - echo "If you want to use Enterprise features of Qt," - echo "use the contact form at http://www.qt.io/contact-us" - echo "to purchase a license." - echo - exit 1 - fi -elif [ $COMMERCIAL_USER = "no" ]; then - # Open Source edition - may only be used under the terms of the LGPLv3 or GPLv2. - Licensee="Open Source" - Edition="OpenSource" - EditionString="Open Source" -fi - -if [ "$Edition" = "OpenSource" ] || [ "$Edition" = "Preview" ]; then - echo - echo "This is the Qt ${EditionString} Edition." - echo -fi - -if [ "$Edition" = "OpenSource" ]; then - while true; do - if [ "$CFG_ANDROID_STYLE_ASSETS" = "no" ] || [ "$XPLATFORM_ANDROID" = "no" ]; then - echo "You are licensed to use this software under the terms of" - echo "the GNU Lesser General Public License (LGPL) version 3." - echo "You are also licensed to use this software under the terms of" - echo "the GNU General Public License (GPL) version 2." - affix="either" - showGPL2="yes" - else - echo "You are licensed to use this software under the terms of" - echo "the GNU Lesser General Public License (LGPL) version 3." - showGPL2="no" - affix="the" - fi - - echo - if [ "$OPT_CONFIRM_LICENSE" = "yes" ]; then - echo "You have already accepted the terms of the $EditionString license." - acceptance=yes - else - if [ -f "$relpath/LICENSE.LGPL3" ]; then - echo "Type 'L' to view the GNU Lesser General Public License version 3." - fi - if [ "$showGPL2" = "yes" ]; then - echo "Type 'G' to view the GNU General Public License version 2." - fi - echo "Type 'yes' to accept this license offer." - echo "Type 'no' to decline this license offer." - echo - echo $ECHO_N "Do you accept the terms of $affix license? $ECHO_C" - read acceptance - fi - echo - if [ "$acceptance" = "yes" ] || [ "$acceptance" = "y" ]; then - break - elif [ "$acceptance" = "no" ]; then - echo "You are not licensed to use this software." - echo - exit 1 - elif [ "$acceptance" = "L" ]; then - more "$relpath/LICENSE.LGPL3" - elif [ "$acceptance" = "G" ] && [ "$showGPL2" = "yes" ]; then - more "$relpath/LICENSE.GPL2" - fi - done -elif [ "$Edition" = "Preview" ]; then - TheLicense=`head -n 1 "$relpath/LICENSE.PREVIEW.COMMERCIAL"` - while true; do - - if [ "$OPT_CONFIRM_LICENSE" = "yes" ]; then - echo "You have already accepted the terms of the $EditionString license." - acceptance=yes - else - echo "You are licensed to use this software under the terms of" - echo "the $TheLicense" - echo - echo "Type '?' to read the Preview License." - echo "Type 'yes' to accept this license offer." - echo "Type 'no' to decline this license offer." - echo - echo $ECHO_N "Do you accept the terms of the license? $ECHO_C" - read acceptance - fi - echo - if [ "$acceptance" = "yes" ]; then - break - elif [ "$acceptance" = "no" ] ;then - echo "You are not licensed to use this software." - echo - exit 0 - elif [ "$acceptance" = "?" ]; then - more "$relpath/LICENSE.PREVIEW.COMMERCIAL" - fi - done -fi - #------------------------------------------------------------------------------- # command line and environment validation #------------------------------------------------------------------------------- @@ -1805,16 +1629,6 @@ fi # run configure tests #------------------------------------------------------------------------------- -# copy some variables that are still being computed in the shell script into an input file for configure -# This should go away in the future - -cat > "$outpath/config.tests/configure.cfg" </dev/null 2>&1; then + OPT_CMDLINE="$OPT_CMDLINE +-opensource" + else + OPT_CMDLINE="$OPT_CMDLINE +-commercial" + fi + fi if [ "$OPT_CONFIRM_LICENSE" = "no" ]; then OPT_CMDLINE="$OPT_CMDLINE -confirm-license" diff --git a/configure.json b/configure.json index f774291d22..5a5536936a 100644 --- a/configure.json +++ b/configure.json @@ -56,6 +56,7 @@ "android-toolchain-version": "string", "accessibility": "boolean", + "android-style-assets": "boolean", "avx": "boolean", "avx2": "boolean", "avx512": { "type": "boolean", "name": "avx512f" }, @@ -417,6 +418,12 @@ }, "features": { + "android-style-assets": { + "label": "Android Style Assets", + "condition": "config.android", + "output": [ "privateFeature" ], + "comment": "This belongs into gui, but the license check needs it here already." + }, "shared": { "label": "Building shared libraries", "condition": "!config.uikit && !config.integrity", @@ -962,6 +969,11 @@ }, "earlyReport": [ + { + "type": "fatal", + "condition": "!call.licenseCheck", + "message": "You are not licensed to use this software." + }, { "type": "warning", "condition": "input.debug_and_release == 'yes' && !config.darwin && !config.win32", diff --git a/configure.pri b/configure.pri index dc749cd6d4..526b09e965 100644 --- a/configure.pri +++ b/configure.pri @@ -1,3 +1,7 @@ +# this must be done outside any function +QT_SOURCE_TREE = $$PWD +QT_BUILD_TREE = $$shadowed($$PWD) + # custom command line handling defineTest(qtConfCommandline_qmakeArgs) { @@ -63,6 +67,165 @@ defineReplace(qtConfFunc_crossCompile) { return(false) } +defineReplace(qtConfFunc_licenseCheck) { + exists($$QT_SOURCE_TREE/LICENSE.LGPL3)|exists($$QT_SOURCE_TREE/LICENSE.GPL2): \ + hasOpenSource = true + else: \ + hasOpenSource = false + exists($$QT_SOURCE_TREE/LICENSE.PREVIEW.COMMERCIAL)|exists($$QT_SOURCE_TREE/bin/licheck*): \ + hasCommercial = true + else: \ + hasCommercial = false + + commercial = $$config.input.commercial + isEmpty(commercial) { + $$hasOpenSource { + $$hasCommercial { + logn() + logn("Selecting Qt Edition.") + logn() + logn("Type 'c' if you want to use the Commercial Edition.") + logn("Type 'o' if you want to use the Open Source Edition.") + logn() + for(ever) { + val = $$lower($$prompt("Which edition of Qt do you want to use? ", false)) + equals(val, c) { + commercial = yes + } else: equals(val, o) { + commercial = no + } else { + next() + } + break() + } + } else { + commercial = no + } + } else { + !$$hasCommercial: \ + qtConfFatalError("No license files and no licheck executables found." \ + "Cannot proceed. Try re-installing Qt.") + commercial = yes + } + } + + equals(commercial, no) { + !$$hasOpenSource: \ + qtConfFatalError("This is the Qt Commercial Edition." \ + "Cannot proceed with -opensource.") + + logn() + logn("This is the Qt Open Source Edition.") + + EditionString = "Open Source" + config.input.qt_edition = OpenSource + export(config.input.qt_edition) + } else { + !$$hasCommercial: \ + qtConfFatalError("This is the Qt Open Source Edition." \ + "Cannot proceed with -commercial.") + + exists($$QT_SOURCE_TREE/LICENSE.PREVIEW.COMMERCIAL) { + logn() + logn("This is the Qt Technology Preview Edition.") + + EditionString = "Technology Preview" + config.input.qt_edition = Preview + export(config.input.qt_edition) + } else { + equals(QMAKE_HOST.os, Linux) { + equals(QMAKE_HOST.arch, x86): \ + Licheck = licheck32 + else: \ + Licheck = licheck64 + } else: equals(QMAKE_HOST.os, Darwin) { + Licheck = licheck_mac + } else: equals(QMAKE_HOST.os, Windows) { + Licheck = licheck.exe + } else { + qtConfFatalError("Host operating system not supported by this edition of Qt.") + } + + !qtRunLoggedCommand("$$system_quote($$QT_SOURCE_TREE/bin/$$Licheck) \ + $$eval(config.input.confirm-license) \ + $$system_quote($$QT_SOURCE_TREE) $$system_quote($$QT_BUILD_TREE) \ + $$[QMAKE_SPEC] $$[QMAKE_XSPEC]", \ + LicheckOutput): \ + return(false) + eval($$LicheckOutput) + config.input.qt_edition = $$Edition + config.input.qt_licheck = $$Licheck + config.input.qt_release_date = $$ReleaseDate + export(config.input.qt_edition) + export(config.input.qt_licheck) + export(config.input.qt_release_date) + return(true) + } + } + + !isEmpty(config.input.confirm-license) { + logn() + logn("You have already accepted the terms of the $$EditionString license.") + return(true) + } + + affix = the + equals(commercial, no) { + theLicense = "GNU Lesser General Public License (LGPL) version 3" + showWhat = "Type 'L' to view the GNU Lesser General Public License version 3 (LGPLv3)." + gpl2Ok = false + winrt { + notTheLicense = "Note: GPL version 2 is not available on WinRT." + } else: $$qtConfEvaluate("features.android-style-assets") { + notTheLicense = "Note: GPL version 2 is not available due to using Android style assets." + } else { + theLicense += "or the GNU General Public License (GPL) version 2" + showWhat += "Type 'G' to view the GNU General Public License version 2 (GPLv2)." + gpl2Ok = true + affix = either + } + } else { + theLicense = $$cat($$QT_SOURCE_TREE/LICENSE.PREVIEW.COMMERCIAL, lines) + theLicense = $$first(theLicense) + showWhat = "Type '?' to view the $${theLicense}." + } + msg = \ + " " \ + "You are licensed to use this software under the terms of" \ + "the "$$theLicense"." \ + $$notTheLicense \ + " " \ + $$showWhat \ + "Type 'y' to accept this license offer." \ + "Type 'n' to decline this license offer." \ + " " + + for(ever) { + logn($$join(msg, $$escape_expand(\\n))) + for(ever) { + val = $$lower($$prompt("Do you accept the terms of $$affix license? ", false)) + equals(val, y)|equals(val, yes) { + logn() + return(true) + } else: equals(val, n)|equals(val, no) { + return(false) + } else: equals(commercial, yes):equals(val, ?) { + licenseFile = $$QT_SOURCE_TREE/LICENSE.PREVIEW.COMMERCIAL + } else: equals(commercial, no):equals(val, l) { + licenseFile = $$QT_SOURCE_TREE/LICENSE.LGPL3 + } else: equals(commercial, no):equals(val, g):$$gpl2Ok { + licenseFile = $$QT_SOURCE_TREE/LICENSE.GPL2 + } else { + next() + } + break() + } + system("more $$system_quote($$system_path($$licenseFile))") + logn() + logn() + } +} + # custom tests defineTest(qtConfTest_architecture) { @@ -559,6 +722,3 @@ discard_from($$[QT_HOST_DATA/get]/mkspecs/qmodule.pri) QMAKE_POST_CONFIGURE += \ "include(\$\$[QT_HOST_DATA/get]/mkspecs/qconfig.pri)" \ "include(\$\$[QT_HOST_DATA/get]/mkspecs/qmodule.pri)" - -# load and process input from configure.sh/.exe -include($$shadowed($$PWD)/config.tests/configure.cfg) diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index eaaa161270..74ad611ee5 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -28,6 +28,12 @@ defineTest(qtConfAddError) { } } +defineTest(qtConfFatalError) { + qtConfAddError($$1, $$2) + qtConfPrintReport() + error() +} + defineTest(qtConfCommandlineSetInput) { arg = $${1} val = $${2} @@ -778,9 +784,7 @@ defineTest(qtConfTest_compile) { defineTest(qtConfTest_verifySpec) { qtConfTest_compile($$1): return(true) - qtConfAddError("Cannot compile a minimal program. The toolchain or QMakeSpec is broken.", log) - qtConfPrintReport() - error() + qtConfFatalError("Cannot compile a minimal program. The toolchain or QMakeSpec is broken.", log) } defineTest(qtConfTest_files) { @@ -1310,6 +1314,10 @@ defineTest(qtConfReport_error) { qtConfAddError($${1}, log) } +defineTest(qtConfReport_fatal) { + qtConfFatalError($${1}) +} + defineTest(qtConfCreateReportRecurse) { equals(2, false) { indent = "" diff --git a/src/gui/configure.json b/src/gui/configure.json index 1f5011617c..f4171a8e9f 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -7,7 +7,6 @@ "commandline": { "options": { - "android-style-assets": "boolean", "angle": "boolean", "direct2d": "boolean", "directfb": "boolean", @@ -413,11 +412,6 @@ "condition": "features.accessibility && features.xcb && features.dbus", "output": [ "privateFeature", "feature" ] }, - "android-style-assets": { - "label": "Android Style Assets", - "condition": "config.android", - "output": [ "privateFeature" ] - }, "angle": { "label": "ANGLE", "autoDetect": "features.opengles2 || features.opengl-dynamic", diff --git a/tools/configure/Makefile.mingw b/tools/configure/Makefile.mingw index ff960115f9..b61dc38de4 100644 --- a/tools/configure/Makefile.mingw +++ b/tools/configure/Makefile.mingw @@ -18,7 +18,6 @@ OBJECTS = \ main.o \ configureapp.o \ environment.o \ - tools.o \ qarraydata.o \ qbytearray.o \ qbytearraymatcher.o \ @@ -116,9 +115,8 @@ $(PCH): $(CONFSRC)/configure_pch.h VPATH = $(CONFSRC):$(TOOLSRC)/shared/windows:$(CORESRC)/global:$(CORESRC)/kernel:$(CORESRC)/tools:$(CORESRC)/codecs:$(CORESRC)/io:$(CORESRC)/xml:$(CORESRC)/plugin main.o: $(CONFSRC)/configureapp.h -configureapp.o: $(CONFSRC)/configureapp.h $(CONFSRC)/environment.h $(CONFSRC)/tools.h +configureapp.o: $(CONFSRC)/configureapp.h $(CONFSRC)/environment.h environment.o: $(CONFSRC)/environment.h -tools.o: $(CONFSRC)/tools.h # Make sure qstring_compat.obj isn't compiled with PCH enabled qstring_compat.o: $(CORESRC)/tools/qstring_compat.cpp diff --git a/tools/configure/Makefile.win32 b/tools/configure/Makefile.win32 index 8ed2ffd23f..8864d6fc8f 100644 --- a/tools/configure/Makefile.win32 +++ b/tools/configure/Makefile.win32 @@ -23,7 +23,6 @@ OBJECTS = \ main.obj \ configureapp.obj \ environment.obj \ - tools.obj \ qarraydata.obj \ qbytearray.obj \ qbytearraymatcher.obj \ @@ -97,9 +96,8 @@ $(PCH): $(CONFSRC)\configure_pch.h $(OBJECTS): $(PCH) main.obj: $(CONFSRC)\main.cpp $(CONFSRC)\configureapp.h $(PCH) -configureapp.obj: $(CONFSRC)\configureapp.cpp $(CONFSRC)\configureapp.h $(CONFSRC)\environment.h $(CONFSRC)\tools.h $(PCH) +configureapp.obj: $(CONFSRC)\configureapp.cpp $(CONFSRC)\configureapp.h $(CONFSRC)\environment.h $(PCH) environment.obj: $(CONFSRC)\environment.cpp $(CONFSRC)\environment.h $(PCH) -tools.obj: $(CONFSRC)\tools.cpp $(CONFSRC)\tools.h $(PCH) registry.obj: $(TOOLSRC)\shared\windows\registry.cpp $(PCH) qarraydata.obj: $(CORESRC)\tools\qarraydata.cpp $(PCH) qbytearray.obj: $(CORESRC)\tools\qbytearray.cpp $(PCH) diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro index 9149a30e3e..93e6a197a2 100644 --- a/tools/configure/configure.pro +++ b/tools/configure/configure.pro @@ -31,7 +31,7 @@ INCLUDEPATH += \ $$QT_BUILD_TREE/include/QtCore/$$QT.core.VERSION/QtCore \ $$QT_SOURCE_TREE/tools/shared -HEADERS = configureapp.h environment.h tools.h\ +HEADERS = configureapp.h environment.h \ $$QT_SOURCE_TREE/src/corelib/tools/qarraydata.h \ $$QT_SOURCE_TREE/src/corelib/tools/qbytearray.h \ $$QT_SOURCE_TREE/src/corelib/tools/qarraydatapointer.h \ @@ -80,7 +80,7 @@ HEADERS = configureapp.h environment.h tools.h\ $$QT_SOURCE_TREE/tools/shared/windows/registry_p.h -SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \ +SOURCES = main.cpp configureapp.cpp environment.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qbytearray.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qarraydata.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qbytearraymatcher.cpp \ diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 841aa66b8f..fc66220335 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -29,7 +29,6 @@ #include "configureapp.h" #include "environment.h" -#include "tools.h" #include #include @@ -46,7 +45,6 @@ #include #include #include -#include QT_BEGIN_NAMESPACE @@ -66,13 +64,6 @@ std::ostream &operator<<(std::ostream &s, const QString &val) { using namespace std; -static inline void promptKeyPress() -{ - cout << "(Press any key to continue...)"; - if (_getch() == 3) // _Any_ keypress w/no echo(eat for stdout) - exit(0); // Exit cleanly for Ctrl+C -} - Configure::Configure(int& argc, char** argv) { int i; @@ -183,7 +174,6 @@ void Configure::parseCmdLine() if (j == argCount) break; dictionary["XQMAKESPEC"] = configCmdLine.at(j); - applySpecSpecifics(); break; } } @@ -419,12 +409,6 @@ void Configure::parseCmdLine() break; dictionary[ "ANDROID_NDK_TOOLCHAIN_VERSION" ] = configCmdLine.at(i); } - - else if (configCmdLine.at(i) == "-no-android-style-assets") { - dictionary[ "ANDROID_STYLE_ASSETS" ] = "no"; - } else if (configCmdLine.at(i) == "-android-style-assets") { - dictionary[ "ANDROID_STYLE_ASSETS" ] = "yes"; - } } // Ensure that QMAKESPEC exists in the mkspecs folder @@ -495,16 +479,6 @@ void Configure::parseCmdLine() } } -/*! - Modifies the default configuration based on given -platform option. - Eg. switches to different default styles for Windows CE. -*/ -void Configure::applySpecSpecifics() -{ - if (platform() == ANDROID) - dictionary["ANDROID_STYLE_ASSETS"] = "yes"; -} - void Configure::prepareConfigTests() { // Generate an empty .qmake.cache file for config.tests @@ -914,16 +888,6 @@ void Configure::buildQmake() void Configure::configure() { - FileWriter ci(buildPath + "/config.tests/configure.cfg"); - ci << "# Feature defaults set by configure command line\n" - << "config.input.qt_edition = " << dictionary["EDITION"] << "\n" - << "config.input.qt_licheck = " << dictionary["LICHECK"] << "\n" - << "config.input.qt_release_date = " << dictionary["RELEASEDATE"]; - if (!ci.flush()) { - dictionary[ "DONE" ] = "error"; - return; - } - QStringList args; args << buildPath + "/bin/qmake" << sourcePathMangled @@ -941,155 +905,6 @@ void Configure::configure() saveCmdLine(); } -bool Configure::showLicense(QString orgLicenseFile) -{ - bool showGpl2 = true; - QString licenseFile = orgLicenseFile; - QString theLicense; - if (dictionary["EDITION"] == "OpenSource") { - if (platform() != WINDOWS_RT - && (platform() != ANDROID || dictionary["ANDROID_STYLE_ASSETS"] == "no")) { - theLicense = "GNU Lesser General Public License (LGPL) version 3\n" - "or the GNU General Public License (GPL) version 2"; - } else { - theLicense = "GNU Lesser General Public License (LGPL) version 3"; - showGpl2 = false; - } - } else { - // the first line of the license file tells us which license it is - QFile file(licenseFile); - if (!file.open(QFile::ReadOnly)) { - cout << "Failed to load LICENSE file" << endl; - return false; - } - theLicense = file.readLine().trimmed(); - } - - forever { - char accept = '?'; - cout << "You are licensed to use this software under the terms of" << endl - << "the " << theLicense << "." << endl - << endl; - if (dictionary["EDITION"] == "OpenSource") { - cout << "Type 'L' to view the GNU Lesser General Public License version 3 (LGPLv3)." << endl; - if (showGpl2) - cout << "Type 'G' to view the GNU General Public License version 2 (GPLv2)." << endl; - } else { - cout << "Type '?' to view the " << theLicense << "." << endl; - } - cout << "Type 'y' to accept this license offer." << endl - << "Type 'n' to decline this license offer." << endl - << endl - << "Do you accept the terms of the license?" << endl; - cin >> accept; - accept = tolower(accept); - - if (accept == 'y') { - configCmdLine << "-confirm-license"; - return true; - } else if (accept == 'n') { - return false; - } else { - if (dictionary["EDITION"] == "OpenSource") { - if (accept == 'l') - licenseFile = orgLicenseFile + "/LICENSE.LGPL3"; - else - licenseFile = orgLicenseFile + "/LICENSE.GPL2"; - } - // Get console line height, to fill the screen properly - int i = 0, screenHeight = 25; // default - CONSOLE_SCREEN_BUFFER_INFO consoleInfo; - HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE); - if (GetConsoleScreenBufferInfo(stdOut, &consoleInfo)) - screenHeight = consoleInfo.srWindow.Bottom - - consoleInfo.srWindow.Top - - 1; // Some overlap for context - - // Prompt the license content to the user - QFile file(licenseFile); - if (!file.open(QFile::ReadOnly)) { - cout << "Failed to load LICENSE file" << licenseFile << endl; - return false; - } - QStringList licenseContent = QString(file.readAll()).split('\n'); - while (i < licenseContent.size()) { - cout << licenseContent.at(i) << endl; - if (++i % screenHeight == 0) { - promptKeyPress(); - cout << "\r"; // Overwrite text above - } - } - } - } -} - -void Configure::readLicense() -{ - dictionary["PLATFORM NAME"] = platformName(); - dictionary["LICENSE FILE"] = sourcePath; - - bool openSource = false; - bool hasOpenSource = QFile::exists(dictionary["LICENSE FILE"] + "/LICENSE.LGPL3") || QFile::exists(dictionary["LICENSE FILE"] + "/LICENSE.GPL2"); - if (dictionary["BUILDTYPE"] == "commercial") { - openSource = false; - } else if (dictionary["BUILDTYPE"] == "opensource") { - openSource = true; - } else if (hasOpenSource) { // No Open Source? Just display the commercial license right away - forever { - char accept = '?'; - cout << "Which edition of Qt do you want to use ?" << endl; - cout << "Type 'c' if you want to use the Commercial Edition." << endl; - cout << "Type 'o' if you want to use the Open Source Edition." << endl; - cin >> accept; - accept = tolower(accept); - - if (accept == 'c') { - openSource = false; - break; - } else if (accept == 'o') { - openSource = true; - break; - } - } - } - if (hasOpenSource && openSource) { - cout << endl << "This is the " << dictionary["PLATFORM NAME"] << " Open Source Edition." << endl << endl; - dictionary["LICENSEE"] = "Open Source"; - dictionary["EDITION"] = "OpenSource"; - } else if (openSource) { - cout << endl << "Cannot find the GPL license files! Please download the Open Source version of the library." << endl; - dictionary["DONE"] = "error"; - return; - } else { - QString tpLicense = sourcePath + "/LICENSE.PREVIEW.COMMERCIAL"; - if (QFile::exists(tpLicense)) { - cout << endl << "This is the Qt Preview Edition." << endl << endl; - - dictionary["EDITION"] = "Preview"; - dictionary["LICENSE FILE"] = tpLicense; - } else { - Tools::checkLicense(dictionary, sourcePath, buildPath); - } - } - - if (dictionary["LICENSE_CONFIRMED"] != "yes") { - if (!showLicense(dictionary["LICENSE FILE"])) { - cout << "Configuration aborted since license was not accepted" << endl; - dictionary["DONE"] = "error"; - return; - } - } else if (dictionary["LICHECK"].isEmpty()) { // licheck executable shows license - cout << "You have already accepted the terms of the license." << endl << endl; - } - - if (dictionary["BUILDTYPE"] == "none") { - if (openSource) - configCmdLine << "-opensource"; - else - configCmdLine << "-commercial"; - } -} - bool Configure::reloadCmdLine(int idx) { QFile inFile(buildPathMangled + "/config.opt"); @@ -1112,6 +927,20 @@ bool Configure::reloadCmdLine(int idx) void Configure::saveCmdLine() { if (dictionary[ "REDO" ] != "yes") { + if (dictionary["BUILDTYPE"] == "none") { + bool openSource = false; + QFile inFile(buildPath + "/mkspecs/qconfig.pri"); + if (inFile.open(QFile::ReadOnly | QFile::Text)) { + QTextStream inStream(&inFile); + while (!inStream.atEnd()) { + if (inStream.readLine() == "QT_EDITION = OpenSource") + openSource = true; + } + } + configCmdLine.append(openSource ? "-opensource" : "-commercial"); + } + if (dictionary["LICENSE_CONFIRMED"] != "yes") + configCmdLine.append("-confirm-license"); QFile outFile(buildPathMangled + "/config.opt"); if (outFile.open(QFile::WriteOnly | QFile::Text)) { QTextStream outStream(&outFile); @@ -1134,23 +963,6 @@ bool Configure::isOk() return (dictionary[ "DONE" ] != "error"); } -QString Configure::platformName() const -{ - switch (platform()) { - default: - case WINDOWS: - return QStringLiteral("Qt for Windows"); - case WINDOWS_RT: - return QStringLiteral("Qt for Windows Runtime"); - case QNX: - return QStringLiteral("Qt for QNX"); - case ANDROID: - return QStringLiteral("Qt for Android"); - case OTHER: - return QStringLiteral("Qt for ???"); - } -} - int Configure::platform() const { const QString xQMakeSpec = dictionary.value("XQMAKESPEC"); diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h index c8d4d3df53..b007f3c487 100644 --- a/tools/configure/configureapp.h +++ b/tools/configure/configureapp.h @@ -54,14 +54,10 @@ public: void generateQDevicePri(); void prepareConfigTests(); - bool showLicense(QString licenseFile); - void readLicense(); - bool isDone(); bool isOk(); int platform() const; - QString platformName() const; private: int verbose; @@ -86,8 +82,6 @@ private: bool reloadCmdLine(int idx); void saveCmdLine(); - - void applySpecSpecifics(); }; class FileWriter : public QTextStream diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp index e585b16ea7..260af276fa 100644 --- a/tools/configure/environment.cpp +++ b/tools/configure/environment.cpp @@ -378,29 +378,4 @@ int Environment::execute(QStringList arguments, const QStringList &additionalEnv return exitCode; } -/*! - Executes \a command with _popen() and returns the stdout of the command. - - Taken from qmake's system() command. -*/ -QString Environment::execute(const QString &command, int *returnCode) -{ - QString output; - FILE *proc = _popen(command.toLatin1().constData(), "r"); - char buff[256]; - while (proc && !feof(proc)) { - int read_in = int(fread(buff, 1, 255, proc)); - if (!read_in) - break; - buff[read_in] = '\0'; - output += buff; - } - if (proc) { - int r = _pclose(proc); - if (returnCode) - *returnCode = r; - } - return output; -} - QT_END_NAMESPACE diff --git a/tools/configure/environment.h b/tools/configure/environment.h index aa8e7fd8bc..8415fa10a6 100644 --- a/tools/configure/environment.h +++ b/tools/configure/environment.h @@ -52,7 +52,6 @@ public: static QString detectQMakeSpec(); static int execute(QStringList arguments, const QStringList &additionalEnv, const QStringList &removeEnv); - static QString execute(const QString &command, int *returnCode = 0); private: static Compiler detectedCompiler; diff --git a/tools/configure/main.cpp b/tools/configure/main.cpp index 91a99c16c2..f6c2722529 100644 --- a/tools/configure/main.cpp +++ b/tools/configure/main.cpp @@ -45,13 +45,6 @@ int runConfigure( int argc, char** argv ) if (!app.isOk()) return 3; - // Read license now, and exit if it doesn't pass. - // This lets the user see the command-line options of configure - // without having to load and parse the license file. - app.readLicense(); - if (!app.isOk()) - return 3; - // Source file with path settings. Needed by qmake. app.generateQConfigCpp(); diff --git a/tools/configure/tools.cpp b/tools/configure/tools.cpp deleted file mode 100644 index 5ba7125975..0000000000 --- a/tools/configure/tools.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the tools applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "tools.h" -#include "environment.h" - -#include -#include -#include -#include - -#include - -std::ostream &operator<<(std::ostream &s, const QString &val); -using namespace std; - -void Tools::checkLicense(QMap &dictionary, - const QString &sourcePath, const QString &buildPath) -{ - dictionary["LICHECK"] = "licheck.exe"; - - const QString licenseChecker = - QDir::toNativeSeparators(sourcePath + "/bin/licheck.exe"); - - if (QFile::exists(licenseChecker)) { - const QString qMakeSpec = - QDir::toNativeSeparators(dictionary.value("QMAKESPEC")); - const QString xQMakeSpec = - QDir::toNativeSeparators(dictionary.value("XQMAKESPEC")); - - QString command = QString("%1 %2 %3 %4 %5 %6") - .arg(licenseChecker, - dictionary.value("LICENSE_CONFIRMED", "no"), - QDir::toNativeSeparators(sourcePath), - QDir::toNativeSeparators(buildPath), - qMakeSpec, xQMakeSpec); - - int returnValue = 0; - QString licheckOutput = Environment::execute(command, &returnValue); - - if (returnValue) { - dictionary["DONE"] = "error"; - } else { - foreach (const QString &var, licheckOutput.split('\n')) - dictionary[var.section('=', 0, 0).toUpper()] = var.section('=', 1, 1); - dictionary["LICENSE_CONFIRMED"] = "yes"; - } - } else { - cout << endl << "Error: Could not find licheck.exe" << endl - << "Try re-installing." << endl << endl; - dictionary["DONE"] = "error"; - } -} - diff --git a/tools/configure/tools.h b/tools/configure/tools.h deleted file mode 100644 index 17dcc88518..0000000000 --- a/tools/configure/tools.h +++ /dev/null @@ -1,43 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the tools applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef _TOOLS_H_ -#define _TOOLS_H_ - -#include -#include - -class Tools -{ -public: - static void checkLicense(QMap &dictionary, - const QString &sourcePath, const QString &buildPath); -}; - -#endif // _TOOLS_H_ - From d829dd3f445afae8c74630c4c8b93347b4a7c7bd Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 7 Dec 2016 13:08:44 +0100 Subject: [PATCH 159/174] Fix inconsistent alpha masking in qConvertARGB32PMToARGB64PM_sse2 The prolog and epilog did not force RGB32 to be converted to RGB64 with alpha fully defined like the middle optimized part. Change-Id: If7c4829f2239f9a3c524f78b9ce269e2b0b5b150 Reviewed-by: Eirik Aavitsland --- src/gui/painting/qdrawhelper.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 8700a0fce1..ff7c8dfc28 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -580,6 +580,8 @@ static inline void qConvertARGB32PMToARGB64PM_sse2(QRgba64 *buffer, const uint * int i = 0; for (; ((uintptr_t)buffer & 0xf) && i < count; ++i) { uint s = *src++; + if (maskAlpha) + s = s | 0xff000000; if (RGBA) s = RGBA2ARGB(s); *buffer++ = QRgba64::fromArgb32(s); @@ -605,6 +607,8 @@ static inline void qConvertARGB32PMToARGB64PM_sse2(QRgba64 *buffer, const uint * SIMD_EPILOGUE(i, count, 3) { uint s = *src++; + if (maskAlpha) + s = s | 0xff000000; if (RGBA) s = RGBA2ARGB(s); *buffer++ = QRgba64::fromArgb32(s); From 2488f34ecfd68702b5508c50cca3fb8e967ac8ea Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Thu, 25 Feb 2016 14:39:51 +0300 Subject: [PATCH 160/174] xcb: Adapt QXcbWindow::startSystemResize() for touch events Window managers typically grab the pointer after receiving the _NET_WM_MOVERESIZE event. But they fail to do it for touch sequences which have a receiver. So we should reject the touch sequence before sending _NET_WM_MOVERESIZE event. QSizeGrip calls startSystemResize() on MouseButtonPress event which is synthesized by Qt on TouchBegin. We can find the id of the touch point by comparing coordinates of the synthesized MouseButtonPress event with coordinates of all TouchBegin events. Then we use this id to reject the touch sequence (it's possible only after receiving XI_TouchUpdate). Change-Id: I26519840cd221e28b0be7854e4617c9aba4b0817 Task-number: QTBUG-51385 Reviewed-by: Shawn Rutledge --- src/plugins/platforms/xcb/qxcbconnection.h | 9 +++++ .../platforms/xcb/qxcbconnection_xi2.cpp | 40 ++++++++++++++++++- src/plugins/platforms/xcb/qxcbwindow.cpp | 12 +++++- src/plugins/platforms/xcb/qxcbwindow.h | 2 + 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index cb337ea0da..60f0f487c5 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -504,6 +504,7 @@ public: #endif #ifdef XCB_USE_XINPUT22 + bool startSystemResizeForTouchBegin(xcb_window_t window, const QPoint &point, Qt::Corner corner); bool xi2SetMouseGrabEnabled(xcb_window_t w, bool grab); #endif Qt::MouseButton xiToQtMouseButton(uint32_t b); @@ -639,6 +640,14 @@ private: QXcbEventReader *m_reader; #if defined(XCB_USE_XINPUT2) QHash m_touchDevices; +#ifdef XCB_USE_XINPUT22 + struct StartSystemResizeInfo { + xcb_window_t window; + uint16_t deviceid; + uint32_t pointid; + Qt::Corner corner; + } m_startSystemResizeInfo; +#endif #endif #ifdef Q_XCB_DEBUG struct CallInfo { diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp index 93f8db92bf..0ace79a4f5 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp @@ -61,9 +61,9 @@ struct XInput2TouchDeviceData { XIDeviceInfo *xiDeviceInfo; QTouchDevice *qtTouchDevice; QHash touchPoints; + QHash pointPressedPosition; // in screen coordinates where each point was pressed // Stuff that is relevant only for touchpads - QHash pointPressedPosition; // in screen coordinates where each point was pressed QPointF firstPressedPosition; // in screen coordinates where the first point was pressed QPointF firstPressedNormalPosition; // device coordinates (0 to 1, 0 to 1) where the first point was pressed QSizeF size; // device size in mm @@ -93,6 +93,7 @@ void QXcbConnection::initializeXInput2() if (m_xi2Enabled) { #ifdef XCB_USE_XINPUT22 qCDebug(lcQpaXInputDevices, "XInput version %d.%d is available and Qt supports 2.2 or greater", xiMajor, m_xi2Minor); + m_startSystemResizeInfo.window = XCB_NONE; #else qCDebug(lcQpaXInputDevices, "XInput version %d.%d is available and Qt supports 2.0", xiMajor, m_xi2Minor); #endif @@ -714,7 +715,21 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo touchPoint.state = Qt::TouchPointMoved; } else if (touchPoint.area.center() != QPoint(x, y)) { touchPoint.state = Qt::TouchPointMoved; - dev->pointPressedPosition[touchPoint.id] = QPointF(x, y); + if (dev->qtTouchDevice->type() == QTouchDevice::TouchPad) + dev->pointPressedPosition[touchPoint.id] = QPointF(x, y); + } + + if (dev->qtTouchDevice->type() == QTouchDevice::TouchScreen && + xiDeviceEvent->event == m_startSystemResizeInfo.window && + xiDeviceEvent->sourceid == m_startSystemResizeInfo.deviceid && + xiDeviceEvent->detail == m_startSystemResizeInfo.pointid) { + QXcbWindow *window = platformWindowFromId(m_startSystemResizeInfo.window); + if (window) { + XIAllowTouchEvents(static_cast(m_xlib_display), xiDeviceEvent->deviceid, + xiDeviceEvent->detail, xiDeviceEvent->event, XIRejectTouch); + window->doStartSystemResize(QPoint(x, y), m_startSystemResizeInfo.corner); + m_startSystemResizeInfo.window = XCB_NONE; + } } break; case XI_TouchEnd: @@ -745,6 +760,27 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo touchPoint.state = Qt::TouchPointStationary; } +bool QXcbConnection::startSystemResizeForTouchBegin(xcb_window_t window, const QPoint &point, Qt::Corner corner) +{ + QHash::const_iterator devIt = m_touchDevices.constBegin(); + for (; devIt != m_touchDevices.constEnd(); ++devIt) { + XInput2TouchDeviceData *deviceData = devIt.value(); + if (deviceData->qtTouchDevice->type() == QTouchDevice::TouchScreen) { + QHash::const_iterator pointIt = deviceData->pointPressedPosition.constBegin(); + for (; pointIt != deviceData->pointPressedPosition.constEnd(); ++pointIt) { + if (pointIt.value().toPoint() == point) { + m_startSystemResizeInfo.window = window; + m_startSystemResizeInfo.deviceid = devIt.key(); + m_startSystemResizeInfo.pointid = pointIt.key(); + m_startSystemResizeInfo.corner = corner; + return true; + } + } + } + } + return false; +} + bool QXcbConnection::xi2SetMouseGrabEnabled(xcb_window_t w, bool grab) { if (grab && !canGrab()) diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 0c8e78491e..5fa8541f26 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -2738,13 +2738,23 @@ bool QXcbWindow::startSystemResize(const QPoint &pos, Qt::Corner corner) const xcb_atom_t moveResize = connection()->atom(QXcbAtom::_NET_WM_MOVERESIZE); if (!connection()->wmSupport()->isSupportedByWM(moveResize)) return false; + const QPoint globalPos = window()->mapToGlobal(pos); +#ifdef XCB_USE_XINPUT22 + if (connection()->startSystemResizeForTouchBegin(m_window, globalPos, corner)) + return true; +#endif + return doStartSystemResize(globalPos, corner); +} + +bool QXcbWindow::doStartSystemResize(const QPoint &globalPos, Qt::Corner corner) +{ + const xcb_atom_t moveResize = connection()->atom(QXcbAtom::_NET_WM_MOVERESIZE); xcb_client_message_event_t xev; xev.response_type = XCB_CLIENT_MESSAGE; xev.type = moveResize; xev.sequence = 0; xev.window = xcb_window(); xev.format = 32; - const QPoint globalPos = window()->mapToGlobal(pos); xev.data.data32[0] = globalPos.x(); xev.data.data32[1] = globalPos.y(); const bool bottom = corner == Qt::BottomRightCorner || corner == Qt::BottomLeftCorner; diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 3d8d21be6b..089df8f3f6 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -178,6 +178,8 @@ public: QXcbScreen *xcbScreen() const; + bool doStartSystemResize(const QPoint &globalPos, Qt::Corner corner); + virtual void create(); virtual void destroy(); From 50cb2687b2864acf66586fab9dd56716ebda4e9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 2 Dec 2016 12:44:16 +0100 Subject: [PATCH 161/174] UIKit: Improve handling of private system fonts / fallback fonts Commit 2bc7a40048 taught the CoreText font database to populate the families lazily, and in the process added a guard to ensure that we didn't populate internal fonts (prefixed with a '.'), as these fonts would then show up in font selection dialogs. Commit 909d3f5c7 then added support for private fonts, by making it possible to filter out any private fonts from font selection daialogs. But the guard was not removed, so we were still not populating these fonts. This guard has been removed, and the filtering function has been updated to include the conditions of the guard. Next, commit e5e93345c5 used [UIFont fontNamesForFamilyName:] to verify that each family that we registered with the font database would also have matching fonts when finally populated. This is not the right approach, as [UIFont fontNamesForFamilyName:] does not handle internal fonts. Instead we trust what CTFontDescriptorCreateMatchingFontDescriptors() gives us, but make sure to register the resulting font descriptors with the original/originating font family, instead of the one we pull out of the font descriptor. Finally, as of iOS 10, we can use CTFontManagerCopyAvailableFontFamilyNames instead of [UIFont familyNames], which gives us all of the internal font families like on macOS, instead of just the user-visible families. For earlier iOS versions we manually add '.PhoneFallback', as we know it will be available even if not listed in [UIFont familyNames]. The end result is that we register and populate families like '.PhoneFallback', which is critical to supporting more esoteric writing systems. The check in tst_QFont that styles for a given family is not empty has been removed, as we can't guarantee that on all platforms, which is also documented for QFontDatabase::styles(). Task-number: QTBUG-45746 Task-number: QTBUG-50624 Change-Id: I04674dcb2bb36b4cdf5646d540c35727ff3daaad Reviewed-by: Jake Petroules --- .../mac/qcoretextfontdatabase.mm | 37 +++++++++---------- .../mac/qcoretextfontdatabase_p.h | 2 +- tests/auto/gui/text/qfont/tst_qfont.cpp | 1 - 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm index 78a0c4d0c9..1e29b12ec4 100644 --- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm @@ -189,11 +189,16 @@ QCoreTextFontDatabase::~QCoreTextFontDatabase() static CFArrayRef availableFamilyNames() { -#if defined(Q_OS_OSX) - return CTFontManagerCopyAvailableFontFamilyNames(); -#elif defined(QT_PLATFORM_UIKIT) - return (CFArrayRef) [[UIFont familyNames] retain]; +#if QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(1060, 100000, 100000, 30000) + if (&CTFontManagerCopyAvailableFontFamilyNames) + return CTFontManagerCopyAvailableFontFamilyNames(); #endif +#if defined(QT_PLATFORM_UIKIT) + CFMutableArrayRef familyNames = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, (CFArrayRef)[UIFont familyNames]); + CFArrayAppendValue(familyNames, CFSTR(".PhoneFallback")); + return familyNames; +#endif + Q_UNREACHABLE(); } void QCoreTextFontDatabase::populateFontDatabase() @@ -207,17 +212,6 @@ void QCoreTextFontDatabase::populateFontDatabase() for (int i = 0; i < numberOfFamilies; ++i) { CFStringRef familyNameRef = (CFStringRef) CFArrayGetValueAtIndex(familyNames, i); QString familyName = QString::fromCFString(familyNameRef); - - // Don't populate internal fonts - if (familyName.startsWith(QLatin1Char('.')) || familyName == QLatin1String("LastResort")) - continue; - -#if defined(Q_OS_IOS) || defined(Q_OS_TVOS) - // Skip font families with no corresponding fonts - if (![UIFont fontNamesForFamilyName:(NSString*)familyNameRef].count) - continue; -#endif - QPlatformFontDatabase::registerFontFamily(familyName); #if defined(Q_OS_OSX) @@ -250,7 +244,7 @@ void QCoreTextFontDatabase::populateFamily(const QString &familyName) const int numFonts = CFArrayGetCount(matchingFonts); for (int i = 0; i < numFonts; ++i) - populateFromDescriptor(CTFontDescriptorRef(CFArrayGetValueAtIndex(matchingFonts, i))); + populateFromDescriptor(CTFontDescriptorRef(CFArrayGetValueAtIndex(matchingFonts, i)), familyName); } struct FontDescription { @@ -352,13 +346,18 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd) } } -void QCoreTextFontDatabase::populateFromDescriptor(CTFontDescriptorRef font) +void QCoreTextFontDatabase::populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName) { FontDescription fd; getFontDescription(font, &fd); + // Note: The familyName we are registering, and the family name of the font descriptor, may not + // match, as CTFontDescriptorCreateMatchingFontDescriptors will return descriptors for replacement + // fonts if a font family does not have any fonts available on the system. + QString family = !familyName.isNull() ? familyName : static_cast(fd.familyName); + CFRetain(font); - QPlatformFontDatabase::registerFont(fd.familyName, fd.styleName, fd.foundryName, fd.weight, fd.style, fd.stretch, + QPlatformFontDatabase::registerFont(family, fd.styleName, fd.foundryName, fd.weight, fd.style, fd.stretch, true /* antialiased */, true /* scalable */, fd.pixelSize, fd.fixedPitch, fd.writingSystems, (void *) font); } @@ -699,7 +698,7 @@ QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData bool QCoreTextFontDatabase::isPrivateFontFamily(const QString &family) const { - if (family.startsWith(QLatin1Char('.'))) + if (family.startsWith(QLatin1Char('.')) || family == QLatin1String("LastResort")) return true; return QPlatformFontDatabase::isPrivateFontFamily(family); diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h index 1bc3522bda..3b1be2e6a1 100644 --- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h @@ -92,7 +92,7 @@ public: const QHash &themeFonts() const; private: - void populateFromDescriptor(CTFontDescriptorRef font); + void populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName = QString()); #ifndef QT_NO_FREETYPE bool m_useFreeType; diff --git a/tests/auto/gui/text/qfont/tst_qfont.cpp b/tests/auto/gui/text/qfont/tst_qfont.cpp index ca984a26a5..a6d8944656 100644 --- a/tests/auto/gui/text/qfont/tst_qfont.cpp +++ b/tests/auto/gui/text/qfont/tst_qfont.cpp @@ -130,7 +130,6 @@ void tst_QFont::italicOblique() QString family = *f_it; QStringList styles = fdb.styles(family); - QVERIFY(!styles.isEmpty()); QStringList::ConstIterator s_it, s_end = styles.end(); for (s_it = styles.begin(); s_it != s_end; ++s_it) { QString style = *s_it; From aec85a53df3dbe3047c6db0f6eb39cb161cd3e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 8 Dec 2016 14:07:25 +0100 Subject: [PATCH 162/174] Disable core dumps for selftests that are meant to be crashing Task-number: QTBUG-55155 Change-Id: I26a1461f35f916f3980fcb18cdddf3502e22fc90 Reviewed-by: Timur Pocheptsov --- src/testlib/qtestcase.cpp | 17 +++++++++++++++++ tests/auto/testlib/selftests/tst_selftests.cpp | 4 +++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index f2a962408e..7b76f1f970 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -99,6 +99,7 @@ #include #include #include +#include #endif #if defined(Q_OS_MACX) @@ -143,6 +144,22 @@ static bool debuggerPresent() #endif } +static void disableCoreDump() +{ + bool ok = false; + const int disableCoreDump = qEnvironmentVariableIntValue("QTEST_DISABLE_CORE_DUMP", &ok); + if (ok && disableCoreDump == 1) { +#if defined(Q_OS_UNIX) + struct rlimit limit; + limit.rlim_cur = 0; + limit.rlim_max = 0; + if (setrlimit(RLIMIT_CORE, &limit) != 0) + qWarning("Failed to disable core dumps: %d", errno); +#endif + } +} +Q_CONSTRUCTOR_FUNCTION(disableCoreDump); + static void stackTrace() { bool ok = false; diff --git a/tests/auto/testlib/selftests/tst_selftests.cpp b/tests/auto/testlib/selftests/tst_selftests.cpp index 0806077031..35b759bcc2 100644 --- a/tests/auto/testlib/selftests/tst_selftests.cpp +++ b/tests/auto/testlib/selftests/tst_selftests.cpp @@ -592,8 +592,10 @@ void tst_Selftests::doRunSubTest(QString const& subdir, QStringList const& logge QProcess proc; QProcessEnvironment environment = processEnvironment(); - if (crashes) + if (crashes) { + environment.insert("QTEST_DISABLE_CORE_DUMP", "1"); environment.insert("QTEST_DISABLE_STACK_DUMP", "1"); + } proc.setProcessEnvironment(environment); const QString path = subdir + QLatin1Char('/') + subdir; proc.start(path, arguments); From 2c9dc93696f32b798b872f931c102329d0ba7155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Fri, 2 Dec 2016 12:03:02 +0100 Subject: [PATCH 163/174] Cocoa: Unbreak app activation on macOS Sierra Previously, we would activate the application during QCocoaIntegration construction, which means at QApplication creation time. This now seems to interfere with application startup on macOS Sierra, where the application window ends up in an unfocused state. Move application activation to applicationDidFinishLaunching, at which point the Cocoa runtime should be completely initialized. Do this for 10.12+ only to avoid regressions/ test failures on previous versions. Change-Id: Ic5f150d53f06a302b53a3ba86a4a9b18bb2a1783 Task-number: QTBUG-57044 Reviewed-by: Timur Pocheptsov Reviewed-by: Qt CI Bot --- .../platforms/cocoa/qcocoaapplicationdelegate.mm | 14 +++++++++----- src/plugins/platforms/cocoa/qcocoaintegration.mm | 14 +++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index da755aa189..7368aabf7d 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm @@ -282,14 +282,18 @@ QT_END_NAMESPACE { Q_UNUSED(aNotification); inLaunch = false; - // qt_release_apple_event_handler(); - - // Insert code here to initialize your application + if (qEnvironmentVariableIsEmpty("QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM")) { + if (QSysInfo::macVersion() >= QSysInfo::MV_10_12) { + // Move the application window to front to avoid launching behind the terminal. + // Ignoring other apps is neccessary (we must ignore the terminal), but makes + // Qt apps play slightly less nice with other apps when lanching from Finder + // (See the activateIgnoringOtherApps docs.) + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + } + } } - - - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { Q_UNUSED(filenames); diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index 92fffb4d15..18340f4ee1 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -312,11 +312,15 @@ QCocoaIntegration::QCocoaIntegration(const QStringList ¶mList) // see the function implementation for exceptions.) qt_mac_transformProccessToForegroundApplication(); - // Move the application window to front to avoid launching behind the terminal. - // Ignoring other apps is neccessary (we must ignore the terminal), but makes - // Qt apps play slightly less nice with other apps when lanching from Finder - // (See the activateIgnoringOtherApps docs.) - [cocoaApplication activateIgnoringOtherApps : YES]; + // Move the application window to front to make it take focus, also when launching + // from the terminal. On 10.12+ this call has been moved to applicationDidFinishLauching + // to work around issues with loss of focus at startup. + if (QSysInfo::macVersion() < QSysInfo::MV_10_12) { + // Ignoring other apps is neccessary (we must ignore the terminal), but makes + // Qt apps play slightly less nice with other apps when lanching from Finder + // (See the activateIgnoringOtherApps docs.) + [cocoaApplication activateIgnoringOtherApps : YES]; + } } // ### For AA_MacPluginApplication we don't want to load the menu nib. From b0c321a8db7b75d740d968c6a583473600faf990 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 22 Nov 2016 14:52:18 -0800 Subject: [PATCH 164/174] Don't crash on QVLA construction from an empty std::initializer_list The C++ standard says in [support.initlist.access]/1: constexpr const E* begin() const noexcept; Returns: A pointer to the beginning of the array. If size() == 0 the values of begin() and end() are unspecified but they shall be identical. So we can't assume it's non-null. I didn't want to remove the Q_ASSERT, so passing a non-null pointer to append() remains required. This patch simply won't call append() if the initializer list is empty. This was already tested, but the failure is with a compiler that is not part of the Qt CI. Task-number: QTBUG-57277 Change-Id: Iaeecaffe26af4535b416fffd1489806872b412ee Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/tools/qvarlengtharray.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h index c3ac104399..1530299303 100644 --- a/src/corelib/tools/qvarlengtharray.h +++ b/src/corelib/tools/qvarlengtharray.h @@ -76,7 +76,8 @@ public: QVarLengthArray(std::initializer_list args) : a(Prealloc), s(0), ptr(reinterpret_cast(array)) { - append(args.begin(), args.size()); + if (args.size()) + append(args.begin(), args.size()); } #endif From 8005e0652c367c5e8c780a298d9fee4ce18a370a Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 6 Dec 2016 08:17:30 +0100 Subject: [PATCH 165/174] QAndroidPlatformOpenGLContext: fix adopting of existing native contexts Change-Id: I854bbc511d89578c6a893015b21358f08ed8f5a6 Reviewed-by: Laszlo Agocs Reviewed-by: J-P Nurmi Reviewed-by: BogDan Vatra --- .../platforms/android/qandroidplatformintegration.cpp | 6 +++++- .../platforms/android/qandroidplatformopenglcontext.cpp | 5 +++-- .../platforms/android/qandroidplatformopenglcontext.h | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index 6669ee3176..de9e27e595 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -66,6 +66,8 @@ #include "qandroidplatformtheme.h" #include "qandroidsystemlocale.h" +#include + QT_BEGIN_NAMESPACE int QAndroidPlatformIntegration::m_defaultGeometryWidth = 320; @@ -251,7 +253,9 @@ QPlatformOpenGLContext *QAndroidPlatformIntegration::createPlatformOpenGLContext format.setRedBufferSize(8); format.setGreenBufferSize(8); format.setBlueBufferSize(8); - return new QAndroidPlatformOpenGLContext(format, context->shareHandle(), m_eglDisplay); + auto ctx = new QAndroidPlatformOpenGLContext(format, context->shareHandle(), m_eglDisplay, context->nativeHandle()); + context->setNativeHandle(QVariant::fromValue(QEGLNativeContext(ctx->eglContext(), m_eglDisplay))); + return ctx; } QPlatformOffscreenSurface *QAndroidPlatformIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const diff --git a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp index 2644fa27f6..eeec7a8106 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp +++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp @@ -49,8 +49,9 @@ QT_BEGIN_NAMESPACE -QAndroidPlatformOpenGLContext::QAndroidPlatformOpenGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display) - :QEGLPlatformContext(format, share, display) +QAndroidPlatformOpenGLContext::QAndroidPlatformOpenGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display, + const QVariant &nativeHandle) + :QEGLPlatformContext(format, share, display, nullptr, nativeHandle) { } diff --git a/src/plugins/platforms/android/qandroidplatformopenglcontext.h b/src/plugins/platforms/android/qandroidplatformopenglcontext.h index 87a0829655..3897b3166b 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglcontext.h +++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.h @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE class QAndroidPlatformOpenGLContext : public QEGLPlatformContext { public: - QAndroidPlatformOpenGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display); + QAndroidPlatformOpenGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display, const QVariant &nativeHandle); void swapBuffers(QPlatformSurface *surface) override; bool makeCurrent(QPlatformSurface *surface) override; From f7b44f879cdded7b2c6b604df873f7194e56a63a Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 29 Nov 2016 15:20:21 +0100 Subject: [PATCH 166/174] QDir::cleanPath(): Do not cd above root paths (UNC, WinRT) Calling QDir::cleanPath() on "//server/path/.." resulted in "/". Factor out a function to determine the root path part of an absolute path for later use, and handle some special cases: - Consider server name of "//server/path/.." as part of the prefix. - Check on the root path for WinRT. Task-number: QTBUG-53712 Change-Id: Ibddacf06212b6fc86fa74a5e4078df6cfd5b66f5 Reviewed-by: Oswald Buddenhagen Reviewed-by: Maurice Kalinowski Reviewed-by: Thiago Macieira --- src/corelib/io/qdir.cpp | 55 ++++++++++++++++--------- tests/auto/corelib/io/qdir/tst_qdir.cpp | 16 +++++-- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 91953ebf26..8f43b77bd5 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -80,6 +80,40 @@ static QString driveSpec(const QString &path) } #endif +enum { +#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) + OSSupportsUncPaths = true +#else + OSSupportsUncPaths = false +#endif +}; + +// Return the length of the root part of an absolute path, for use by cleanPath(), cd(). +static int rootLength(const QString &name, bool allowUncPaths) +{ + const int len = name.length(); + // starts with double slash + if (allowUncPaths && name.startsWith(QLatin1String("//"))) { + // Server name '//server/path' is part of the prefix. + const int nextSlash = name.indexOf(QLatin1Char('/'), 2); + return nextSlash >= 0 ? nextSlash + 1 : len; + } +#if defined(Q_OS_WINRT) + const QString rootPath = QDir::rootPath(); // rootPath contains the trailing slash + if (name.startsWith(rootPath, Qt::CaseInsensitive)) + return rootPath.size(); +#endif // Q_OS_WINRT +#if defined(Q_OS_WIN) + if (len >= 2 && name.at(1) == QLatin1Char(':')) { + // Handle a possible drive letter + return len > 2 && name.at(2) == QLatin1Char('/') ? 3 : 2; + } +#endif + if (name.at(0) == QLatin1Char('/')) + return 1; + return 0; +} + //************* QDirPrivate QDirPrivate::QDirPrivate(const QString &path, const QStringList &nameFilters_, QDir::SortFlags sort_, QDir::Filters filters_) : QSharedData() @@ -2066,19 +2100,7 @@ Q_AUTOTEST_EXPORT QString qt_normalizePathSegments(const QString &name, bool all const QChar *prefix = p; int up = 0; - int prefixLength = 0; - - if (allowUncPaths && len >= 2 && p[1].unicode() == '/' && p[0].unicode() == '/') { - // starts with double slash - prefixLength = 2; -#ifdef Q_OS_WIN - } else if (len >= 2 && p[1].unicode() == ':') { - // remember the drive letter - prefixLength = (len > 2 && p[2].unicode() == '/') ? 3 : 2; -#endif - } else if (p[0].unicode() == '/') { - prefixLength = 1; - } + const int prefixLength = rootLength(name, allowUncPaths); p += prefixLength; i -= prefixLength; @@ -2188,12 +2210,7 @@ QString QDir::cleanPath(const QString &path) if (dir_separator != QLatin1Char('/')) name.replace(dir_separator, QLatin1Char('/')); - bool allowUncPaths = false; -#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) //allow unc paths - allowUncPaths = true; -#endif - - QString ret = qt_normalizePathSegments(name, allowUncPaths); + QString ret = qt_normalizePathSegments(name, OSSupportsUncPaths); // Strip away last slash except for root directories if (ret.length() > 1 && ret.endsWith(QLatin1Char('/'))) { diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp index 294a53645e..fe12850476 100644 --- a/tests/auto/corelib/io/qdir/tst_qdir.cpp +++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp @@ -1149,6 +1149,8 @@ tst_QDir::cleanPath_data() QTest::newRow("data0") << "/Users/sam/troll/qt4.0//.." << "/Users/sam/troll"; QTest::newRow("data1") << "/Users/sam////troll/qt4.0//.." << "/Users/sam/troll"; QTest::newRow("data2") << "/" << "/"; + QTest::newRow("data2-up") << "/path/.." << "/"; + QTest::newRow("data2-above-root") << "/.." << "/.."; QTest::newRow("data3") << QDir::cleanPath("../.") << ".."; QTest::newRow("data4") << QDir::cleanPath("../..") << "../.."; #if defined(Q_OS_WIN) @@ -1178,13 +1180,19 @@ tst_QDir::cleanPath_data() QTest::newRow("data14") << "c://foo" << "c:/foo"; // Drive letters and unc path in one string -#ifndef Q_OS_WINRT -#ifdef Q_OS_WIN +#if defined(Q_OS_WINRT) + const QString root = QDir::rootPath(); // has trailing slash + QTest::newRow("root-up") << (root + "path/..") << root; + QTest::newRow("above-root") << (root + "..") << (root + ".."); +#elif defined(Q_OS_WIN) QTest::newRow("data15") << "//c:/foo" << "//c:/foo"; + QTest::newRow("drive-up") << "A:/path/.." << "A:/"; + QTest::newRow("drive-above-root") << "A:/.." << "A:/.."; + QTest::newRow("unc-server-up") << "//server/path/.." << "//server"; + QTest::newRow("unc-server-above-root") << "//server/.." << "//server/.."; #else QTest::newRow("data15") << "//c:/foo" << "/c:/foo"; -#endif -#endif // !Q_OS_WINRT +#endif // non-windows QTest::newRow("QTBUG-23892_0") << "foo/.." << "."; QTest::newRow("QTBUG-23892_1") << "foo/../" << "."; From 101449a4cfa9c0d216332c6dc8ba826e8109e09d Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 8 Jul 2016 15:30:45 +0200 Subject: [PATCH 167/174] QDir::cd(): Handle UNC server paths correctly Add a bool *ok out parameter to qt_normalizePathSegments() and return false when ".." are left over for an absolute path, indicating an attempt to change above root. Factor out static helper qt_cleanPath() to be able to pass the return value to QDir::cd() and return on failure from there. Amends change 63f634322b2c0f795bd424be9e51953a10c701de, which did not handle UNC paths. Task-number: QTBUG-53712 Change-Id: I3e63a5dd0259306a0b99145348d815899582f78e Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- src/corelib/io/qdir.cpp | 73 +++++++++++++------------ src/corelib/io/qurl.cpp | 3 +- tests/auto/corelib/io/qdir/tst_qdir.cpp | 7 ++- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 8f43b77bd5..437f774547 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -893,6 +893,8 @@ QString QDir::fromNativeSeparators(const QString &pathName) return pathName; } +static QString qt_cleanPath(const QString &path, bool *ok = nullptr); + /*! Changes the QDir's directory to \a dirName. @@ -913,32 +915,18 @@ bool QDir::cd(const QString &dirName) return true; QString newPath; if (isAbsolutePath(dirName)) { - newPath = cleanPath(dirName); + newPath = qt_cleanPath(dirName); } else { - if (isRoot()) - newPath = d->dirEntry.filePath(); - else - newPath = d->dirEntry.filePath() % QLatin1Char('/'); + newPath = d->dirEntry.filePath(); + if (!newPath.endsWith(QLatin1Char('/'))) + newPath += QLatin1Char('/'); newPath += dirName; if (dirName.indexOf(QLatin1Char('/')) >= 0 || dirName == QLatin1String("..") || d->dirEntry.filePath() == QLatin1String(".")) { - newPath = cleanPath(newPath); -#if defined (Q_OS_UNIX) - //After cleanPath() if path is "/.." or starts with "/../" it means trying to cd above root. - if (newPath.startsWith(QLatin1String("/../")) || newPath == QLatin1String("/..")) -#elif defined (Q_OS_WINRT) - const QString rootPath = QDir::rootPath(); - if (newPath.size() < rootPath.size() && rootPath.startsWith(newPath)) -#else - /* - cleanPath() already took care of replacing '\' with '/'. - We can't use startsWith here because the letter of the drive is unknown. - After cleanPath() if path is "[A-Z]:/.." or starts with "[A-Z]:/../" it means trying to cd above root. - */ - - if (newPath.midRef(1, 4) == QLatin1String(":/..") && (newPath.length() == 5 || newPath.at(5) == QLatin1Char('/'))) -#endif + bool ok; + newPath = qt_cleanPath(newPath, &ok); + if (!ok) return false; /* If newPath starts with .., we convert it to absolute to @@ -2085,10 +2073,14 @@ bool QDir::match(const QString &filter, const QString &fileName) This method is shared with QUrl, so it doesn't deal with QDir::separator(), nor does it remove the trailing slash, if any. */ -Q_AUTOTEST_EXPORT QString qt_normalizePathSegments(const QString &name, bool allowUncPaths) +Q_AUTOTEST_EXPORT QString qt_normalizePathSegments(const QString &name, bool allowUncPaths, + bool *ok = nullptr) { const int len = name.length(); + if (ok) + *ok = false; + if (len == 0) return name; @@ -2153,6 +2145,10 @@ Q_AUTOTEST_EXPORT QString qt_normalizePathSegments(const QString &name, bool all --up; } + // Indicate failure when ".." are left over for an absolute path. + if (ok) + *ok = prefixLength == 0 || up == 0; + // add remaining '..' while (up) { if (used != len && out[used].unicode() != '/') // is not empty and there isn't already a '/' @@ -2190,27 +2186,16 @@ Q_AUTOTEST_EXPORT QString qt_normalizePathSegments(const QString &name, bool all return ret; } -/*! - Returns \a path with directory separators normalized (converted to "/") and - redundant ones removed, and "."s and ".."s resolved (as far as possible). - - Symbolic links are kept. This function does not return the - canonical path, but rather the simplest version of the input. - For example, "./local" becomes "local", "local/../bin" becomes - "bin" and "/local/usr/../bin" becomes "/local/bin". - - \sa absolutePath(), canonicalPath() -*/ -QString QDir::cleanPath(const QString &path) +static QString qt_cleanPath(const QString &path, bool *ok) { if (path.isEmpty()) return path; QString name = path; - QChar dir_separator = separator(); + QChar dir_separator = QDir::separator(); if (dir_separator != QLatin1Char('/')) name.replace(dir_separator, QLatin1Char('/')); - QString ret = qt_normalizePathSegments(name, OSSupportsUncPaths); + QString ret = qt_normalizePathSegments(name, OSSupportsUncPaths, ok); // Strip away last slash except for root directories if (ret.length() > 1 && ret.endsWith(QLatin1Char('/'))) { @@ -2227,6 +2212,22 @@ QString QDir::cleanPath(const QString &path) return ret; } +/*! + Returns \a path with directory separators normalized (converted to "/") and + redundant ones removed, and "."s and ".."s resolved (as far as possible). + + Symbolic links are kept. This function does not return the + canonical path, but rather the simplest version of the input. + For example, "./local" becomes "local", "local/../bin" becomes + "bin" and "/local/usr/../bin" becomes "/local/bin". + + \sa absolutePath(), canonicalPath() +*/ +QString QDir::cleanPath(const QString &path) +{ + return qt_cleanPath(path); +} + /*! Returns \c true if \a path is relative; returns \c false if it is absolute. diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 60ce752eb6..066052ade9 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -417,7 +417,8 @@ #include "qurlquery.h" QT_BEGIN_NAMESPACE -extern QString qt_normalizePathSegments(const QString &name, bool allowUncPaths); // qdir.cpp +extern QString qt_normalizePathSegments(const QString &name, bool allowUncPaths, + bool *ok = nullptr); // qdir.cpp inline static bool isHex(char c) { diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp index fe12850476..b86c6e4dfa 100644 --- a/tests/auto/corelib/io/qdir/tst_qdir.cpp +++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp @@ -58,7 +58,8 @@ #ifdef QT_BUILD_INTERNAL QT_BEGIN_NAMESPACE -extern Q_AUTOTEST_EXPORT QString qt_normalizePathSegments(const QString &, bool); +extern Q_AUTOTEST_EXPORT QString + qt_normalizePathSegments(const QString &path, bool allowUncPaths, bool *ok = nullptr); QT_END_NAMESPACE #endif @@ -2246,6 +2247,10 @@ void tst_QDir::cdBelowRoot_data() const QString systemRoot = QString::fromLocal8Bit(qgetenv("SystemRoot")); QTest::newRow("windows-drive") << systemDrive << systemRoot.mid(3) << QDir::cleanPath(systemRoot); + const QString uncRoot = QStringLiteral("//") + QtNetworkSettings::winServerName(); + const QString testDirectory = QStringLiteral("testshare"); + QTest::newRow("windows-share") + << uncRoot << testDirectory << QDir::cleanPath(uncRoot + QLatin1Char('/') + testDirectory); #endif // Windows } From 87fefbc08e80119dba24767bfc9b6ecc64be5fcd Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Wed, 19 Oct 2016 12:49:52 +0300 Subject: [PATCH 168/174] Plugins: use QStringBuilder more Change-Id: I6f026b81fdc403d99d37dfa22ea6a27a95ead347 Reviewed-by: Thiago Macieira Reviewed-by: Edward Welbourne --- .../eglfs_kms_support/qeglfskmsdevice.cpp | 10 +++------- .../windows/accessible/qwindowsmsaaaccessible.cpp | 2 +- src/plugins/platforms/xcb/qxcbconnection.cpp | 3 +-- src/plugins/platforms/xcb/qxcbintegration.cpp | 8 ++------ 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp index 75dd083750..f372b9d156 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp @@ -108,14 +108,10 @@ static const char * const connector_type_names[] = { // must match DRM_MODE_CONN static QByteArray nameForConnector(const drmModeConnectorPtr connector) { - QByteArray connectorName("UNKNOWN"); - + const QByteArray id = QByteArray::number(connector->connector_type_id); if (connector->connector_type < ARRAY_LENGTH(connector_type_names)) - connectorName = connector_type_names[connector->connector_type]; - - connectorName += QByteArray::number(connector->connector_type_id); - - return connectorName; + return connector_type_names[connector->connector_type] + id; + return "UNKNOWN" + id; } static bool parseModeline(const QByteArray &text, drmModeModeInfoPtr mode) diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp index 9803dedb1e..85aab84c2c 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp @@ -890,7 +890,7 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accName(VARIANT varID, BST QString shortcut = accessible->text(QAccessible::Accelerator); if (!shortcut.isEmpty()) - name.append(QLatin1Char(' ') + shortcut); + name += QLatin1Char(' ') + shortcut; if (name.size()) { *pszName = QStringToBSTR(name); diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index 7bd233f387..9e275efa25 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -1996,8 +1996,7 @@ void QXcbConnection::initializeAllAtoms() { Q_ASSERT(i == QXcbAtom::NPredefinedAtoms); - QByteArray settings_atom_name("_QT_SETTINGS_TIMESTAMP_"); - settings_atom_name += m_displayName; + const QByteArray settings_atom_name = "_QT_SETTINGS_TIMESTAMP_" + m_displayName; names[i++] = settings_atom_name; xcb_intern_atom_cookie_t cookies[QXcbAtom::NAtoms]; diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index f4da7ba033..af9ffab8ae 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -447,12 +447,8 @@ QByteArray QXcbIntegration::wmClass() const className[0] = className.at(0).toUpper(); } - if (!name.isEmpty() && !className.isEmpty()) { - m_wmClass = name.toLocal8Bit(); - m_wmClass.append('\0'); - m_wmClass.append(className.toLocal8Bit()); - m_wmClass.append('\0'); - } + if (!name.isEmpty() && !className.isEmpty()) + m_wmClass = name.toLocal8Bit() + '\0' + className.toLocal8Bit() + '\0'; } return m_wmClass; } From 7896ae052ad2c0c6ae2ebfc64cc2f525185198a8 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Wed, 7 Dec 2016 13:12:26 +0100 Subject: [PATCH 169/174] Accept ZWNJ, ZWJ and PUA characters in input widgets Private Use Area characters are quite valid input characters when used in combination with a custom font. Joiners also serve an important language purpose in semitic writing systems. Note that there is a hack where we disregard any character produced using CTRL or CTRL+SHIFT specifically because of German keyboards. I have chosen to keep the hack in this patch to limit the change (though I have made an exception for ZWJ and ZWNJ since both are produced using Ctrl+Shift on Windows), but it will probably have to be reverted. [ChangeLog][QtWidgets][Input] Accept characters in Private Use Area, as well as zero-width joiners and zero-width non-joiners in input in QLineEdit and QTextEdit. Task-number: QTBUG-42074 Task-number: QTBUG-57003 Change-Id: I73f3b7d587a8670de24e902dc52a51f7721dba5a Reviewed-by: Simon Hausmann --- src/gui/text/qinputcontrol.cpp | 82 ++++++++++++++ src/gui/text/qinputcontrol_p.h | 76 +++++++++++++ src/gui/text/text.pri | 6 +- src/widgets/widgets/qwidgetlinecontrol.cpp | 18 ++-- src/widgets/widgets/qwidgetlinecontrol_p.h | 6 +- src/widgets/widgets/qwidgettextcontrol.cpp | 17 +-- src/widgets/widgets/qwidgettextcontrol_p.h | 3 +- .../gui/text/qinputcontrol/qinputcontrol.pro | 7 ++ .../text/qinputcontrol/tst_qinputcontrol.cpp | 100 ++++++++++++++++++ tests/auto/gui/text/text.pro | 3 +- 10 files changed, 289 insertions(+), 29 deletions(-) create mode 100644 src/gui/text/qinputcontrol.cpp create mode 100644 src/gui/text/qinputcontrol_p.h create mode 100644 tests/auto/gui/text/qinputcontrol/qinputcontrol.pro create mode 100644 tests/auto/gui/text/qinputcontrol/tst_qinputcontrol.cpp diff --git a/src/gui/text/qinputcontrol.cpp b/src/gui/text/qinputcontrol.cpp new file mode 100644 index 0000000000..c2c198866a --- /dev/null +++ b/src/gui/text/qinputcontrol.cpp @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qinputcontrol_p.h" +#include + +QT_BEGIN_NAMESPACE + +QInputControl::QInputControl(Type type, QObject *parent) + : QObject(parent) + , m_type(type) +{ +} + +QInputControl::QInputControl(Type type, QObjectPrivate &dd, QObject *parent) + : QObject(dd, parent) + , m_type(type) +{ +} + +bool QInputControl::isAcceptableInput(const QKeyEvent *event) const +{ + const QString text = event->text(); + if (text.isEmpty()) + return false; + + const QChar c = text.at(0); + + // ZWNJ and ZWJ. This needs to go before the next test, since CTRL+SHIFT is + // used to input it on Windows. + if (c == QChar(0x200C) || c == QChar(0x200D)) + return true; + + // QTBUG-35734: ignore Ctrl/Ctrl+Shift; accept only AltGr (Alt+Ctrl) on German keyboards + if (event->modifiers() == Qt::ControlModifier + || event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) { + return false; + } + + if (c.isPrint()) + return true; + + if (c.category() == QChar::Other_PrivateUse) + return true; + + if (m_type == TextEdit && c == QLatin1Char('\t')) + return true; + + return false; +} + +QT_END_NAMESPACE diff --git a/src/gui/text/qinputcontrol_p.h b/src/gui/text/qinputcontrol_p.h new file mode 100644 index 0000000000..3b46067ba9 --- /dev/null +++ b/src/gui/text/qinputcontrol_p.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QINPUTCONTROL_P_H +#define QINPUTCONTROL_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +QT_BEGIN_NAMESPACE + +class QKeyEvent; +class Q_GUI_EXPORT QInputControl : public QObject +{ + Q_OBJECT +public: + enum Type { + LineEdit, + TextEdit + }; + + explicit QInputControl(Type type, QObject *parent = nullptr); + + bool isAcceptableInput(const QKeyEvent *event) const; + +protected: + explicit QInputControl(Type type, QObjectPrivate &dd, QObject *parent = nullptr); + +private: + const Type m_type; +}; + +QT_END_NAMESPACE + +#endif // QINPUTCONTROL_P_H diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri index efd041a5af..abe20abe02 100644 --- a/src/gui/text/text.pri +++ b/src/gui/text/text.pri @@ -39,7 +39,8 @@ HEADERS += \ text/qrawfont_p.h \ text/qglyphrun.h \ text/qglyphrun_p.h \ - text/qdistancefield_p.h + text/qdistancefield_p.h \ + text/qinputcontrol_p.h SOURCES += \ text/qfont.cpp \ @@ -69,7 +70,8 @@ SOURCES += \ text/qstatictext.cpp \ text/qrawfont.cpp \ text/qglyphrun.cpp \ - text/qdistancefield.cpp + text/qdistancefield.cpp \ + text/qinputcontrol.cpp SOURCES += \ text/qfontengine_qpf2.cpp \ diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index 9b65dc43d1..a862274a3d 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp +++ b/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -1924,19 +1924,15 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event) unknown = false; } - // QTBUG-35734: ignore Ctrl/Ctrl+Shift; accept only AltGr (Alt+Ctrl) on German keyboards - if (unknown && !isReadOnly() - && event->modifiers() != Qt::ControlModifier - && event->modifiers() != (Qt::ControlModifier | Qt::ShiftModifier)) { - QString t = event->text(); - if (!t.isEmpty() && t.at(0).isPrint()) { - insert(t); + if (unknown + && !isReadOnly() + && isAcceptableInput(event)) { + insert(event->text()); #ifndef QT_NO_COMPLETER - complete(event->key()); + complete(event->key()); #endif - event->accept(); - return; - } + event->accept(); + return; } if (unknown) diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h index d4a4534fb5..b9340c0aff 100644 --- a/src/widgets/widgets/qwidgetlinecontrol_p.h +++ b/src/widgets/widgets/qwidgetlinecontrol_p.h @@ -64,6 +64,7 @@ #include "QtCore/qpoint.h" #include "QtWidgets/qcompleter.h" #include "QtCore/qthread.h" +#include "QtGui/private/qinputcontrol_p.h" #include "qplatformdefs.h" @@ -76,13 +77,14 @@ QT_BEGIN_NAMESPACE -class Q_WIDGETS_EXPORT QWidgetLineControl : public QObject +class Q_WIDGETS_EXPORT QWidgetLineControl : public QInputControl { Q_OBJECT public: QWidgetLineControl(const QString &txt = QString()) - : m_cursor(0), m_preeditCursor(0), m_cursorWidth(0), m_layoutDirection(Qt::LayoutDirectionAuto), + : QInputControl(LineEdit) + , m_cursor(0), m_preeditCursor(0), m_cursorWidth(0), m_layoutDirection(Qt::LayoutDirectionAuto), m_hideCursor(false), m_separator(0), m_readOnly(0), m_dragEnabled(0), m_echoMode(0), m_textDirty(0), m_selDirty(0), m_validInput(1), m_blinkStatus(0), m_blinkEnabled(false), m_blinkTimer(0), m_deleteAllTimer(0), diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index 47806a194e..f5672bd87a 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -848,21 +848,21 @@ void QWidgetTextControl::redo() } QWidgetTextControl::QWidgetTextControl(QObject *parent) - : QObject(*new QWidgetTextControlPrivate, parent) + : QInputControl(QInputControl::TextEdit, *new QWidgetTextControlPrivate, parent) { Q_D(QWidgetTextControl); d->init(); } QWidgetTextControl::QWidgetTextControl(const QString &text, QObject *parent) - : QObject(*new QWidgetTextControlPrivate, parent) + : QInputControl(QInputControl::TextEdit, *new QWidgetTextControlPrivate, parent) { Q_D(QWidgetTextControl); d->init(Qt::RichText, text); } QWidgetTextControl::QWidgetTextControl(QTextDocument *doc, QObject *parent) - : QObject(*new QWidgetTextControlPrivate, parent) + : QInputControl(QInputControl::TextEdit, *new QWidgetTextControlPrivate, parent) { Q_D(QWidgetTextControl); d->init(Qt::RichText, QString(), doc); @@ -1361,14 +1361,7 @@ void QWidgetTextControlPrivate::keyPressEvent(QKeyEvent *e) process: { - // QTBUG-35734: ignore Ctrl/Ctrl+Shift; accept only AltGr (Alt+Ctrl) on German keyboards - if (e->modifiers() == Qt::ControlModifier - || e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) { - e->ignore(); - return; - } - QString text = e->text(); - if (!text.isEmpty() && (text.at(0).isPrint() || text.at(0) == QLatin1Char('\t'))) { + if (q->isAcceptableInput(e)) { if (overwriteMode // no need to call deleteChar() if we have a selection, insertText // does it already @@ -1376,7 +1369,7 @@ process: && !cursor.atBlockEnd()) cursor.deleteChar(); - cursor.insertText(text); + cursor.insertText(e->text()); selectionChanged(); } else { e->ignore(); diff --git a/src/widgets/widgets/qwidgettextcontrol_p.h b/src/widgets/widgets/qwidgettextcontrol_p.h index b45f4fff74..f540a3c9ad 100644 --- a/src/widgets/widgets/qwidgettextcontrol_p.h +++ b/src/widgets/widgets/qwidgettextcontrol_p.h @@ -63,6 +63,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -75,7 +76,7 @@ class QAbstractScrollArea; class QEvent; class QTimerEvent; -class Q_WIDGETS_EXPORT QWidgetTextControl : public QObject +class Q_WIDGETS_EXPORT QWidgetTextControl : public QInputControl { Q_OBJECT Q_DECLARE_PRIVATE(QWidgetTextControl) diff --git a/tests/auto/gui/text/qinputcontrol/qinputcontrol.pro b/tests/auto/gui/text/qinputcontrol/qinputcontrol.pro new file mode 100644 index 0000000000..811c9aab90 --- /dev/null +++ b/tests/auto/gui/text/qinputcontrol/qinputcontrol.pro @@ -0,0 +1,7 @@ +CONFIG += testcase +TARGET = tst_qinputcontrol + +QT = core gui gui-private testlib + +SOURCES += \ + tst_qinputcontrol.cpp diff --git a/tests/auto/gui/text/qinputcontrol/tst_qinputcontrol.cpp b/tests/auto/gui/text/qinputcontrol/tst_qinputcontrol.cpp new file mode 100644 index 0000000000..ad5ba6affb --- /dev/null +++ b/tests/auto/gui/text/qinputcontrol/tst_qinputcontrol.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include +#include + +class tst_QInputControl: public QObject +{ + Q_OBJECT +private slots: + void isAcceptableInput_data(); + void isAcceptableInput(); + void tabOnlyAcceptableInputForTextEdit(); +}; + +void tst_QInputControl::isAcceptableInput_data() +{ + QTest::addColumn("text"); + QTest::addColumn("modifiers"); + QTest::addColumn("acceptable"); + + QTest::newRow("empty-string") << QString() << Qt::KeyboardModifiers() << false; + QTest::newRow("zwnj") << QString(QChar(0x200C)) << Qt::KeyboardModifiers() << true; + QTest::newRow("zwnj-with-ctrl") << QString(QChar(0x200C)) << Qt::KeyboardModifiers(Qt::ControlModifier) << true; + QTest::newRow("zwnj-with-ctrl-shift") << QString(QChar(0x200C)) << Qt::KeyboardModifiers(Qt::ControlModifier | Qt::ShiftModifier) << true; + QTest::newRow("zwj") << QString(QChar(0x200D)) << Qt::KeyboardModifiers() << true; + QTest::newRow("zwj-with-ctrl") << QString(QChar(0x200D)) << Qt::KeyboardModifiers(Qt::ControlModifier) << true; + QTest::newRow("zwj-with-ctrl-shift") << QString(QChar(0x200D)) << Qt::KeyboardModifiers(Qt::ControlModifier | Qt::ShiftModifier) << true; + QTest::newRow("printable-latin") << QString(QLatin1Char('a')) << Qt::KeyboardModifiers() << true; + QTest::newRow("printable-latin-with-ctrl") << QString(QLatin1Char('a')) << Qt::KeyboardModifiers(Qt::ControlModifier) << false; + QTest::newRow("printable-latin-with-ctrl-shift") << QString(QLatin1Char('a')) << Qt::KeyboardModifiers(Qt::ControlModifier | Qt::ShiftModifier) << false; + QTest::newRow("printable-hebrew") << QString(QChar(0x2135)) << Qt::KeyboardModifiers() << true; + QTest::newRow("private-use-area") << QString(QChar(0xE832)) << Qt::KeyboardModifiers() << true; + QTest::newRow("multiple-printable") << QStringLiteral("foobar") << Qt::KeyboardModifiers() << true; +} + +void tst_QInputControl::isAcceptableInput() +{ + QFETCH(QString, text); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(bool, acceptable); + + QKeyEvent keyEvent(QKeyEvent::KeyPress, Qt::Key_unknown, modifiers, text); + + { + QInputControl inputControl(QInputControl::TextEdit); + QCOMPARE(inputControl.isAcceptableInput(&keyEvent), acceptable); + } + + { + QInputControl inputControl(QInputControl::LineEdit); + QCOMPARE(inputControl.isAcceptableInput(&keyEvent), acceptable); + } +} + +void tst_QInputControl::tabOnlyAcceptableInputForTextEdit() +{ + QKeyEvent keyEvent(QKeyEvent::KeyPress, Qt::Key_unknown, Qt::KeyboardModifiers(), QLatin1String("\t")); + + { + QInputControl inputControl(QInputControl::TextEdit); + QCOMPARE(inputControl.isAcceptableInput(&keyEvent), true); + } + + { + QInputControl inputControl(QInputControl::LineEdit); + QCOMPARE(inputControl.isAcceptableInput(&keyEvent), false); + } +} + +QTEST_MAIN(tst_QInputControl) +#include "tst_qinputcontrol.moc" + diff --git a/tests/auto/gui/text/text.pro b/tests/auto/gui/text/text.pro index bb4984767f..d1a3eda4fc 100644 --- a/tests/auto/gui/text/text.pro +++ b/tests/auto/gui/text/text.pro @@ -23,7 +23,8 @@ SUBDIRS=\ qtextscriptengine \ qtexttable \ qzip \ - qtextodfwriter + qtextodfwriter \ + qinputcontrol win32:SUBDIRS -= qtextpiecetable From 888b3f504529274ffb799bcbe88023c79e13e451 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Fri, 9 Dec 2016 09:26:01 +0100 Subject: [PATCH 170/174] Fix compilation with -no-pch Q_UNUSED(cursor) was failing to compile when configured with -no-pch. Change-Id: I1da3c95c1636ca06f38a97052ee4360232520a8b Reviewed-by: Simon Hausmann --- src/gui/kernel/qplatformnativeinterface.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/kernel/qplatformnativeinterface.cpp b/src/gui/kernel/qplatformnativeinterface.cpp index f48e470d1b..6614d45b12 100644 --- a/src/gui/kernel/qplatformnativeinterface.cpp +++ b/src/gui/kernel/qplatformnativeinterface.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qplatformnativeinterface.h" +#include QT_BEGIN_NAMESPACE From 1da70af724e16caa6ce175630f13434fcded512b Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 1 Nov 2016 08:40:20 +0000 Subject: [PATCH 171/174] QMap: use std::less for defining an order between pointers Reinterpret_cast()ing a pointer to a suitably sized integer is not guaranteed to always give the same result for the same pointer (!). Therefore the resulting integers are not comparable in a meaningful way. std::less is supposed to be used to compare arbitrary pointers, so use it. (Hopefully and reasonably, under the hood std::less does exactly what we were doing, so this isn't BiC.) Change-Id: I9960b3d6e35657fe7a25b842054f5d338280e850 Reviewed-by: Thiago Macieira --- src/corelib/tools/qmap.cpp | 4 +++- src/corelib/tools/qmap.h | 11 ++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/corelib/tools/qmap.cpp b/src/corelib/tools/qmap.cpp index 406eb31923..94ed47f898 100644 --- a/src/corelib/tools/qmap.cpp +++ b/src/corelib/tools/qmap.cpp @@ -399,7 +399,9 @@ void QMapDataBase::freeData(QMapDataBase *d) With QMap, the items are always sorted by key. \li The key type of a QHash must provide operator==() and a global qHash(Key) function. The key type of a QMap must provide - operator<() specifying a total order. + operator<() specifying a total order. Since Qt 5.8.1 it is also safe + to use a pointer type as key, even if the underlying operator<() + does not provide a total order. \endlist Here's an example QMap with QString keys and \c int values: diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h index 96ce787446..3f4f034b4e 100644 --- a/src/corelib/tools/qmap.h +++ b/src/corelib/tools/qmap.h @@ -51,6 +51,7 @@ #include #include +#include #ifdef Q_COMPILER_INITIALIZER_LISTS #include @@ -61,11 +62,8 @@ QT_BEGIN_NAMESPACE /* QMap uses qMapLessThanKey() to compare keys. The default implementation uses operator<(). For pointer types, - qMapLessThanKey() casts the pointers to integers before it - compares them, because operator<() is undefined on pointers - that come from different memory blocks. (In practice, this - is only a problem when running a program such as - BoundsChecker.) + qMapLessThanKey() uses std::less (because operator<() on + pointers can be used only between pointers in the same array). */ template inline bool qMapLessThanKey(const Key &key1, const Key &key2) @@ -75,8 +73,7 @@ template inline bool qMapLessThanKey(const Key &key1, const Key &key template inline bool qMapLessThanKey(const Ptr *key1, const Ptr *key2) { - Q_STATIC_ASSERT(sizeof(quintptr) == sizeof(const Ptr *)); - return quintptr(key1) < quintptr(key2); + return std::less()(key1, key2); } struct QMapDataBase; From c131a83f420a3b24a0972efa351dc75df7ec739d Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Wed, 16 Nov 2016 17:33:12 +0100 Subject: [PATCH 172/174] Doc: update Qt Widgets examples - \image --> \borderedimage - update screenshot if required Change-Id: I0318b1df67154b70c061da7cbd509b8d5337b311 Reviewed-by: Venugopal Shivashankar --- doc/src/images/analogclock-example.png | Bin 14556 -> 6571 bytes doc/src/images/calculator-example.png | Bin 10742 -> 12653 bytes doc/src/images/calendarwidgetexample.png | Bin 38434 -> 20752 bytes doc/src/images/charactermap-example.png | Bin 27937 -> 16452 bytes doc/src/images/codeeditor-example.png | Bin 9202 -> 14994 bytes doc/src/images/digitalclock-example.png | Bin 6603 -> 1376 bytes doc/src/images/groupbox-example.png | Bin 18620 -> 9706 bytes doc/src/images/imageviewer-example.png | Bin 168586 -> 252124 bytes doc/src/images/lineedits-example.png | Bin 14584 -> 8237 bytes doc/src/images/movie-example.png | Bin 12361 -> 22648 bytes doc/src/images/scribble-example.png | Bin 19910 -> 5304 bytes doc/src/images/spinboxes-example.png | Bin 24842 -> 21874 bytes doc/src/images/styles-enabledwood.png | Bin 130767 -> 136903 bytes doc/src/images/tetrix-example.png | Bin 9980 -> 5396 bytes doc/src/images/wiggly-example.png | Bin 6546 -> 8456 bytes doc/src/images/windowflags-example.png | Bin 22945 -> 38998 bytes .../systray/doc/images/systemtray-editor.png | Bin 18147 -> 25407 bytes .../desktop/systray/doc/src/systray.qdoc | 5 +++-- .../widgets/doc/images/systemtray-editor.png | Bin 18147 -> 25407 bytes examples/widgets/doc/src/analogclock.qdoc | 3 ++- examples/widgets/doc/src/calculator.qdoc | 6 ++++-- examples/widgets/doc/src/calendarwidget.qdoc | 2 +- examples/widgets/doc/src/charactermap.qdoc | 3 ++- examples/widgets/doc/src/codeeditor.qdoc | 2 +- examples/widgets/doc/src/digitalclock.qdoc | 3 ++- examples/widgets/doc/src/groupbox.qdoc | 2 +- examples/widgets/doc/src/imageviewer.qdoc | 3 ++- examples/widgets/doc/src/lineedits.qdoc | 2 +- examples/widgets/doc/src/movie.qdoc | 2 +- examples/widgets/doc/src/shapedclock.qdoc | 2 +- examples/widgets/doc/src/sliders.qdoc | 3 ++- examples/widgets/doc/src/spinboxes.qdoc | 2 +- examples/widgets/doc/src/styles.qdoc | 3 ++- examples/widgets/doc/src/stylesheet.qdoc | 3 ++- examples/widgets/doc/src/tetrix.qdoc | 2 +- examples/widgets/doc/src/wiggly.qdoc | 3 ++- examples/widgets/doc/src/windowflags.qdoc | 3 ++- 37 files changed, 33 insertions(+), 21 deletions(-) diff --git a/doc/src/images/analogclock-example.png b/doc/src/images/analogclock-example.png index b195f8bf24b2a85b33afb95e25b69432849eb919..2319c2891b2a43a1849c3e2e23e2ca75465c2bb6 100644 GIT binary patch literal 6571 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 wU@Rt?gO9%RC9|t1GZ2rUj-g73j5dZ)H literal 14556 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 literal 10742 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 HRssJ3)-&>&&Z0wRcjG}7HDEhya~ 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�k6nu8EZSWGb35GFDS4!eg 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 TzyAcFpvX%rOO;7}3i|&5ciY~+ literal 27937 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 literal 9202 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 literal 6603 zcmX9@cUTk6*9|=&B@`ueLq}-=gg_wl-g^<1mq_nK2uPJG5Tq#8AV?>mNbl04QboFS zkS<+%`|^9f-DhTY=a1RD_ug~n?%6ma15Fw#Rw@7hK%=dtWJ;--jPxXMH-uUe0Kj6U zt)^@i@O$S;V1Su=y`s6_&QHjjwMAxl zgBNb-)3cnSA=w71)z#H9oQ;u@_tsch$mI!3qK32UGN412Iah&e))GeXnUQ31Susi+ z4}?U4I>97%043mgZ3Pa;t9>)s&8s5>DSSoOD~qh?4C8Ees8l8fJT*7h2YOCdn_v3x z@I?|qqTaB}9v)9V%T)-HmXt*O%u}`~e}wgK3om8y-%FTB$K-|c>?XQ>8pe_!u_!!? z(*TL2s#b@vce*$~IAKKXr5F~a@_nR0bEeMCNgS*q2}%~nlaY~aZf??i;Es-tCR|{u zUMp>r)F5u|B{*DP9IM9C&b0;}C21zvtI7FQ>k1ftkVo&%B9jyx#lcvElF`iyOT!C8 z=;LcyXTSil3%dVlfFvGP)B#?>LKC4>9i#(Mc2PhG7(#+4Cz4cojgr9=uT@u9FE86e zj)?++ujEup3k!K4JkT*8zt|!fYC1z%r*E^ry|5qX8FRv*41^Njyb%%-@`3fWTrbfn zc((fVQap@LNGQ6)EIPI0AK9rSL{ma{P1(C2c-sR`7~(E&ZY#`+dkTPc0m07fkiu>Z z6c1*MAR?Wza!QBB$TNYoI@@p8#T{yKeLp%+Q|Rv}^cI#o?@4!Wc5S{8il+iN)}(+; ztgQ!S1sJL_^)DhfR)op90GaOvk$R(2C8OHnn`31wbc*aLw4Cy=pc8lf(XE84+hoc@ zxA#;}D;-1hX;qq=@z@p-x-|?WIb1RZMAiYYb#}+ZX$B!7-w+cIOAq%iq=O6TRW94% zf4$9qRR29n%NK+~(-AUgIvDZCmSl(XIvK=qtHs{~#O+vfesz8aO?!#d z!#t`zXO_?}D}I2Bsr{f3v@=zu${p2%$3OiVY~4O1*e}n-U^`mcm_N*O9qB0mQpxX^ zi`AQ5fg=Hp;zU3n0A3aV!oyUs&?o?8(UW}k7iQKIOfMdkNm&u963M~;3)oqtYl%l3 zmh_OmAGYkx(4D`vqfr65e~8WW$D(R}Of?_-HPCKcUw008`JNyYj*ayT-WCsVlLqlD z?{Nk~2Ej$)9jda_g*<5moCY92e^xEE4= zmQ;P|(gt4V3~wu@11NXh@F)QxZ$N-Ut(p!nj~a+U90ee)8+Q?JdvZxN8PecQn(b=y zpYg#4)Uda=7og-)w$gof8Z@s)3ClGz=a4zM>8%v;n!`CH?aKVy2qjs+n!o&}_$UxF z&bq4b5@A|j&ocmC@0cqPIX{Jl&hn6xKz4UibjPFW{=;ZyQ9lc*DXAEszk7G}M3M3{ z;(D&wgW|K9seS?%Vrl7Q#72GT!|B8?Mg48&o&4sd^4o8-IA&e3qsXqS(q8^ zji|MrwO|v3=30s#3sI1U)0nK%wM_n_5&vCzsuBoEsfKBeXQRfW_rH?LD9nb%+)moF2A zg8+_rD;u4@*jrdYYva4`w%wn#NrDPX_)$X+*4e4otJl`j930TEd<&nhV+$^CY5OV= z4clL5JZ%nps}Lifymq_wsR59`eEB0n{y{JDM_#%dCkwQEo^zM6*s{9cW#DDq)^K_( zQy;fP4bw6gXrRe$+S;^!JK%I;kk#sSaC`DpX74Q~g`^;>4`k07OcX_{*<&XPZ(JnX zkol@>+w{PSdhzi&=BqH`3~jng0HV?)6hY!<(4M05^3a>pwr* z0tAI0>`pc~h0HnTiV7C7DNajoPis3k&}wrZeaJoOO7N<0`Rb>mV**4|KuCfA{i%Nj zMgky|f*oe7@5~>LKk$WC7%%^lB7>0(5e3|w_csQy9vU+Pd+X{Jrg-|N3-;Pa#hzdJ zxy{2v;LjgOtYFL1#zlwdxyj#-*j3f(B&B6a-u@jyy4-yrDN)yIq6}23$7=(1IggWg zP0wRw8Og=u5CaB+vr^u*uVDV#49WoDSUi2~-}?{t4|_TlSZcPikQ`xs~!5UB@D;f+IqMo53$ z(&4aFpbOpUz`K@ZCPjTO8=0l41r`D#+%~_mb|d>?C>uG&fN$vy!+)M^%9bzxX}+u% zyFA)zGq}@M+n#sSk}Ik=f3$W)5v1?^>0GVs%(Zi-{~j&;Yz!;L=(778mleoWJVE;U zi`wvq`EegL3O1wzdnxXImn}OsT>l{Zyy^XZjxyg8GQjod#h5IC%T$Fe|R`mtuxZ^Z- zkbmK0rN3MOvf|jrX3IViDk|K380-1O*Pr8TYg>V3vf(25@ta3|vkw&X&CP(sH8%|( z>iD4G=XgOpFJJ%=4sEu5g2$veGCtCxQn3xF%`P6|gdP6r9CZ{ARA@yzS@~o8Au?Cb zq~hLGn=yx;?y1)E?THx}9dd=8h){>qXz(5O(h3X$$hew7I}N{Y|dbH;K@JN1|~)= zXC)uA?@N!`)>q7UvR$t2 zZVsc9*07QWEGvLK3%HhRyt1EM=etaP<}^zcrc5BJi78?rT-^3zDdUhNk2bH+BFZ2* z*}>YFDWNx?q+2#AA)#v8etVm)C4{eFw)ogDCDB+C&%oeL`81*SON&yfnwfcGd^|%Z zcb}{Z7y^9$UN%AHCqz09l*nDKN4*ddmW-PJ$d zhHIi}_E?aSg>dm$pv!{L#c)hKhXx+z#7-o7y*l;r?YdO5P5sXNjok5Br|zZ#T*Ex~ z%KjNAQmV|Y(lbuOp#LNcUD!uf<{>d-Ww4s+d7b)1HYoJ<@ZU)Yx!VBTw}TQw8(WZ< z*RkYHdS^EVJiE2!`t}FYTJ3&@vAVGyziAu4Cajas%Z=f#gTA4cOG1(*Q?xP8wN~A= z4>hc?ey66>&dLHV-zA&jKq!n&`ec*h>gP|s-5eYoaMzZ#1m2`P2H3qbA;0T%^XRmR zBkajd>R`vVxFz=>kR9xemqp$3-w***ml=>4R33L<6jT++7y+2=GyrtTQg~}FzbF!+ zuIaU>H?Fx@E8B`MmolE8NB~9rGKnoNdxtW}Dt0L=D;rigodhhUe8a!7cr+*@9HkVn zj*awwzJ+0pu=vV-nPrH+tE_i8WtqVTmg*xZ)FK%SmYHJr8IqsiA|iVLSm$Q@!9v3S zlCg{t4SGkSGR1i3luv)OudnaQvK$dk_C%Sid49?+)_LKvOArM*Mc}Sjs20)08io>j z{FEd9QH*D5>l1M=Rde0ExZ{!b*3&8BMNFA!NnfMkZZ&Pzy*2W2Qg{|TxsRm?BU!0d z7_{~u2D%1dP%+z68=fb|&qY7;9l-`mQLuk3`}VHB5CCmS4=2Usqn$c>6g@ zvKh+8E<`6K364LETia~IuD0Nmp$b|QDcJ1CML)@uK0c=YM)$8w{6Iratt?JUZEGTpsPQ2$ znDG%W#sqJsMBP}*35l}9u&jqezfC=nTV7BH230WMw=FvI8`P`I>_fPk1bo@;q8iRg zrF-Dx<3k<^;Xc-Z)T+Ru)#m+pUe+ahdJ*-!@Np9EHQnS3LpYETsZLwAJ9^m2%#=8H zT@sb&4CUu@hu_zMi;8-#;1ku=)l+%ZaT6u4%0u@b9F1Jd4i^wupZvmI zf$9Pfo0WqSy7w|+>;5evr@M2Qsx2H2+0@j4**lte>~+05?G%zG4N)75c5rl*{-7jd z%46*AE?i{xy7WVdF_Su#eu}jQ-bDfVK%A_n`UrK{i%+1a3B@}(NeKHtH zI@+0P7+j#OH2|NRYkRSoI_FvGWxu%Go3PZX3kn5ZJeXDj<|qW!JM^a$lKj}UkbqOi z8g&c2_uFk26)k1uSDa``Fm+s99HW4N6l)@Mi5?#?jx$f;$S8M;ggQ3NEQDU}e16iR zp{W@=8Zqw5A@^b<`VKR|*g zWngA55!89k((+PTO8>ot0~J8{N%KE~b$-&RSy{57S7+Z5T8UCTV$JDbHtLwS0*0d2 z)qiHZ+Q*+6b%4EQ8xMX6j(y>0gEs8GC!NGcIdykzT~;l$Qd(x7;>=un?SX#zN>v?ckTs*IaFDl?98A~=g?s% z(@t$cr~Xa0%1s%CXJ=<+rX|g`pUE3_KMHZXdk=lG*d8l0Wn^Gb$-IlVnyL3d@6BJ| zT<%?BH2$QW)RE4()_Kk~`w=+2)AM_O|9knsLrty_CgHnc8X^xLZWCUTz+Z_y>*F<$ ze8H7(NpwU64$6}8dir|gHDI9g>0=Lfn|gQa4YmQt8XT@u3cTK0QSrAYjxll2No}fh zbXoLCbL|0VCrypju$ufkj_l7jY3I+hOGUZerMAe4!P%Q=r9p9-?pZxTZz?%3I7W?< zeDwdfqha?4{C1Ts);TRE`Q6bTQ@}9I`di*i+4Y2bB3ldXili^A)Kd$4dU_Bc7mJH( zKy4kJYzYUQ;Nak%qkHr2|F*^-{>vfQ|CV1rJ}K#RK^Etjr^)~je%g9QNZn{W<<59d zZKcoR&n53!pKlx-aDRE!8U`(z4xMO1t*`cH(1FG8D=LPK7VATzD3QUp*Qbh?e`{tM zypr6r(^2yTU-Rjv|L-vn2&Csd1_;q1e6*Vi=wK_VC&BtZP?J#53X6*R z!`MHv#U&)vOuLJ8J zaHVyPzLN*|*Ne^jJlHuc>*Db(5k z219L~uG*U8D8*V+UA;D(yHKQ?A?@*7ZJ!!GAwE8bwSg>vH=&z+8szc2)`ecphUuCe?*DfP zzE?Z5LlBT459FR(-*XKlB=l&B;i+S{XTvZ-pcpGP?vA0kyx6X!V}~t@ji&O_aLNbl zFLn|DM@dP!OqQ=vHE6UB|CYjEJ}&1z^+h4*UtJ?3k3t@z!{`WhE!nUd`X%e^Bq%IA=BLVIObGr48WM5}P!k<=9P{20hyv#2( zF!(~hn+LIXBs1zIPc?!0=VhDC(^wuNc}=C=e1h=a4gPz4Qu`iy zGuZVPC9HAu`bzZONgeO|LI1kh6}J?zNhy(9KvcKJhPxUv_P$$hZ6zN*yEqXH&9APO z=$X+Z_~7Gc0%4yb>@-1pZKte$nHou)9527UlA8ugITIwp$W}C(7Dm_C-_N$G9NduE z?kOU`9_U2NBX7Kr-bN z{6uteJvR&yb`zYE1=J`p%neogWcQ&B)22`OiJ&e7~En{pMmj z|7j6DfocUHeciEimgeTRWjNgL)<8)W=OL`@l8o=h&yPbn@C4SJ*G7SX=WjURpJQmO z(`DSJ@&t7jzJ>&y?sAB7rq;eZ-lE_NHsVVD{&0sM`fGXm-!MTv9ms^z1Ze5FkWSvQ z9FEBsJe@@ul2Fk{54wg&)4s9+Fzclj5-3>BmSQ4-wcvh(_LQ>~B!AldjaK_|qjTgf z(d($>L^c^|lQNy2IlD?qo1=qMc5?dcaFb@Q1w>@${%Lz90r$DVhuWW1LAIikgj8=o zUt`NmFVPs-L6<$bi`QB{PQSp0E28aTO zZ<~5jUL$m^gI<*##&8QFCJhHsEMkpwHIH$;YEOyh!XGs|IRzKH;Bce(D%#e0+|qtl~|;JE&;C#tXt; z6CWQR5fRba+B!Qs3u-Y9lp-EuKf$}b^B*+yx=TY3kMG#-5yxlFFdt#dRuOw+s4pT1 zf7LI_PrA78K06$NE=S}G{`eup!m3KaL^7TgltU4n)X+!ILA z6l<^d&hO^#J9l$8_s8yjK0D7oyYuYs^E^AVQHJ^&6r?PqczAdeTAHfHczF1zzeSGt z-rt`3o2+0wynA?tx~6KF{cS9IZw0ZqI5)Guv+?`)@5-{`pGWAM>#M6@I4tJy6nk`W zeulfaSVyhkuT!dW^;56HxF5_0DZ~5_F{ieH>p@W7PECQ^lo`?y9~LrkSO|Hf|P?8e-1u1)IHeM-QTsj!%L-j zurfB*(@%wukKXD$n2aSA{k&DKG8rTJbF<-S?wc~z)8&yKGTDr6^d18f+uqqJJ`o!g zC1q*x4+%2y?MBP-kpV1vb#!5g>9KPh2_5y(&3}MJQ`UVPTPk%gtpEh<|=nq5wDWFe=cXx zK6^DBt6Mv>>Qx0-_Af`&yqzm^pUtyE7HGgTRM03`h4=H~v4y<0nYg&P<<_8gI(*(L zY&(aDg_&XTPhDJIZCjHNh$Z9f$^y520VS7;nFQ-8W=_9g240Z>%k>zVn9a$_)uJHU zh6QSAYC7bN)z(ydNi#@t(-^;Vcd)lN3UAQ^+A$M}C8<9|?oJB(*S1C(zbTzbP0I-K zQ4N1VKHpiBZ1>y)C^1->`{8}4xUx-X>99jWrHGZcv9WPWkb<#UTwpL$TD*Ll4L8j;Cp?-M6LpiiGw1mXB$Z-{xb3sH(>2{KJy#K0q!f=(A(rw5;`z z9iA9bZ@;KZl=z_EiMMX;e=950ywt5l-a$dU1Kw&=Dw7B9POXrEjbLt_ot=*tf+LpA zHrm8j4D>1*A*9G7@Z9Hb?gQoD1N`QO5j!edH%mIAp2Ap1 zC7931Gp#P(tKpgMGT*+JYguo)fEsWQJP7d5HSskllE|RMZ1W3M6zyd$6su=F7dnf1 zx!QXGO6P|}a*NBwox9h*poq^jXK3|dNu#47pLZP88H_m7<{kUzDS8&sP)!)>jT)f6VZ9rv+_h}^1k^i&eD;4|I-J`Bh5+Z$MU;1tRVIr)>-a(_J5^q^ z=e+SaIw76!{J4Dat~g#n+VRVqmdEj-oQ>q z1~Cc@k?`_oGmqiQOSdoGpDWG^Jj^t*c~FW7dD1 z1Sr>&)+0MX1qx@K^1u2Aq}J_&R)`u#w>$Yq!)Zn!S*`fBuN36d#$nTYBOaBl2IFqe z#tisgGFZ$oOd+C_G@MOVGIE}5RbL-NN8dsugXP~ZUiF=cko52sU#2qY^-MTEOx#83 z_T7GNeml``h+_L?WQSM?Nn83Ffv&hG{i=_O7xW~llT42f@zsCHY`R~T_&usQ{MPXR zmIP>{_(&G$vd3I?eGFWB`H~qudzVO0@kFTklh5u)IqWECL?~wtjHM6BdXbMMV({`f zZ@K2vdVntR1=&wa`oGr1yG`5!v;yNYW3w-IG};3_RAHY8(>9j-8sIuFTXd=k5_;S3 zSB9MxJoX)!$;?;UMY*3Jmc~&_^0_^e(WcL$r!X$i8*b-s@}IIxQ9u-cB$eLR*}0>@ zo9#N7Q7=3$*!c+Hv_0ktw@E}$;GVfj(x!1808S*Dtl!6iZ}87)X2uc^Y&)o>eI04- zw#rj;=L9}uL`^tt8=`(OZqzS#BVs;b!6xP<*|8BLtF9K}l>skkPHUWMx(r8?6PY2- zM}F~N=y~LfUF)*GC%P@!ru;#l7@pF(O^o+tBE+z{SDFKWr+VEQ2f`;ogUiO97S`f> z+DGkO(O}H*xUWAthC=I6@h?vS(2i6jWv0tV5F~YRT+49D+vmbYtk0Nn3RXn%)7?Bq zr+04iD0rhE(x_u2F8p*qX<>ZRBe)mJ2KCO=mNRX+x0>?ap(QcnjyDOI4#>0vxrHN& znVr*||B|}qN*m@Kbzvj^d55aWPLR1m{$*e(z3s(4{-M`7AxG+0T$v|vEDnK}O=$I? zdEj564U#rP3+j&sKcpugfV^wZde?iu z3HesC9)Befk}WfPZ$vj_EYdo;2csZ{h}QTfsok}=4XqmUKYAA7Xx?!-<4cgdsQu2N zpUx!|7M;tTi)&%M)V^;#o@*9Pq;xgp)Cp%rbf18RER-=X)`lB2=?MKGsteNyMq8tf z1Ek9?-9P*``$Z#(vR^d8=hOfCZIfI>^2NBUd4HmXu5a{C*J;QvOmM6H=e(kaK!-wRxg+QwDmRgd2B zd@a&ejec%guRJsJI`aN*cqE29Mtkk&$W1}SYqz43j-cY$hohweOMn+AVX+%Ky`x|m%+JsAlZviov5 z@(yUtS5A#_ce{X^*xjF#-*vwjx_iDN8;4Q!(m8o8qEC)TpP&-;)Ik&EGm7cpy!W?z zASZC043>rJvyE}F>319Auy-7a1rUnzSHVB**89P#$tPKy8#O1xqmVS7fddon5}A?A z3@pr9eJ72k`R=>hbWiVdyeG0JnHI1+!mpl;9~h{*G0w?}L0vbyDB6CA@_1cuCPDy` zLH`qLt7#Uk#>e?En&V;g#}1i+%&mm*PvW6jq87ish#rym2+@-tNhccp`dhZ#62~xH z9yYdwd0g#6p;NTePn|?yv+Q;D&*`1&4e+S{@2T5=C3ONZ-Sx!(R((@k#9(6c#w!k1 z8T1({0+XU<$kq?`Yb@MYUlAZ!pB7MF7uHbdBE-=wcUypJc43GoG3)ceSOj2X!s+i7 z!$D+Y9U6$YodsEChK>uPqG&OxYTaNhN{2rvA;h%7wrKVs8&Rz8{_=s+1koieh zAN!3H^-qerzD&>TOf?P}u^2=DLQWP$Hy@~AYxgVxAsB<_XZNSp=Xb^ECyV>vtlG7z zAD;;H8s$#4STQL1zVSfz9U3L7;jv|?5yx!fr`LO}--jif-g?2DsK3(&;guZ!As^$C zah|wcN+NMM0tTk4F;$a4iQy2p#LoZ02@w4M8rVTD<|Ahl1^(SE{;--)qJZ*5yk@H? zlpN80m4`j9-Xjb{Rt+pWei^H7@j{qgPn>fMk<%~N6ARznVqo%nS?a%l7nR8S5E>Y1 z6SRFj+w$m3i|9=6>@hz=&y&J7%w?fdt>tae+M|xPsDPyD7>o zXXs6XA)hBKIsNk+oOXG0!2rJuiq-ZsVtl!OSMnEAo!gr~O*v*1g2P0OPSovUpzKORvDOF87E`MVKzM!L^}!IWFd8Dl`X#Iy;4zp#8Z6QUW=t+*AHQ-os}GVg~IM4 z{Y6Cxwo=zIuJ-F7Y@QUvWp7FTnaDJ-EWwdcy^34mRiQ7MpZc>bjmgi4n9c_mLLLX+ z=I$&@;m$#;tQ7J5OHJMkpB#bt)LtTfpdOayO5x3>$`@GEo+_@TxHglN^z^NSmXv== z)|GYv=_y>-$dpVXY=j+B67!rpMiJAC!}aiBlFUBYn=2*Dz)PA77d$-~J+*Xn+pv(z zb9FmJJ)qppdK6+(PkfD>>O@+tNx~~DZ0~y_E)HceM!73=;^iYI)a_-M;#juO_Bc&l zrADjRJpgveNxj{Q`F?@u##^|AkkjIc#r=Ak>R)e3>!W5@sS)+CuIM53-Cg3cgf*k7 z;J=1$cUCVlGW6nGV~bDV)Z4NI4H+}ok*`)y))N<|{7F<}8u+8vYuG?sC?C?JfM4`q zk@!D?=l>76i;#cLOTZM4&$Og7+FN*)9&;t!5znlwn98)Dn+@Hb<0%!A4IC-g(Fgb) zCYhxDzq_PS?}v9DUj`jA+(N@ca-khuw(iW85r5H4Q=8dP?Ue0e>;IyTJ$UaimkHgF z@0#52UcT{*eU|W7xlTwg&oQ9tWRiw-Q=JN=S1Lo4ys)tZ^w44l5G|VelrM5rn9#bj2#KsAQ;UYXO2 zn8_Wy`ZTw-`stCo{Vwsv(T8SOEd0pAqT1oImzTgank+2C>|x~NOojIoU|S_1sVCd4?y{b-%X%Q zkE0f)J-5xNat{&jdJ>OE^mN{$jkrY!_`Xcfs1_ZCy4ii5PZPO9%Jz7WBu}AP(&lJ* z*Y*W78b4~LwKhR@&Feg*8-Gvyb6AopA!I~*prx8i70MLdu6f-)pdcHv(3!_SdlA*6 z95yGI&`%#35N!RyY_!-L25M`h;i?MZU}2ZqfvkGJqxt%S?Gn`^NUDE~pf!)&0KN_^ zLH-Q-__|_hawLq_Ewq@Ka=s1&Gd3-AKW(CqeQ)MY|2z?nUx%$9G=2-OUZV?pUh&)t zu8ehHN!+8~*4l0ugUviLsj3{?YirsO1BkwMy(0~ybu>MOVd9Rp7VGVKbIK<5W$V?H zHuhZ(R&%7hmJQ!{H;QWJfe0W0^DR@Z05N#TYq3tLdM*L2pIoSlxs zXM)tN_(m{s$dH5qw85U`?aoToN!gq*++FWf?v(4aEjFYeZPw)mzm{E8G`$X+=^MSg zGvPrQ=$!>rw5(e`hKkS2yr+-$v&slU-O&m{3qgy;fovYG1U^S0fvNC;l%*{_B^y2i z-g@CDx*uF8m;sU^S7wTOUrIrIfH}}|%~_YZqw@%+efJ|j^Ywfqx+HYTJrQ`7 z>EalF3HTG1z=-ENw0}ris7aEHtwiRR7j`yaotGzCKlq%kx>^^!8m&rUL5=Nb1+S$X zC_oFy6ShTBRY)xG1IBW9+l%m7Cx3bb7Mymqz)Lab@|GfNYi)e9R!Bb=+{Xsi^@iCUA zB9zec>wP-wV_8?=kxPS6M&QWpt5R7oRHCQtIDm&}4h;Qy-xAW$v$C3Okv0x>T;Tav zs0t~@tN1mz`ypivp0y|0;*N$^T>eVzICiNDVm@nHSS=CA)AkfsZzrS z#K@jecks~N?3+xDZ0%xZ?3dtq?W!j-IS62nQKe^wV^7dpIBV-JXp;0wD%KVNi9ZL}5{4q+cX-5VA?atvoI;tuAUtDFNSMri~t-Vf4<2TX(*iTlnu*(82& zx(m||&hssryk;sD~eFYuu@7{i95tv%X>TRI6 zNJ`Bu8(}woL+|kHqulhGkDL^ubi-*fa`r2zj9C>WcRe75&N=EQFG!2gE(O%6-Lkl7WApA-~I&TKS#LZvF-Q}$M{G}xG+ff zFp5qy{4!dk41~M!OX+b$xT`M~2~4A2+LHuO2_o&6XIqOs)Ve;B2~GJx|4PEzzYG#kU&4c$pN#u&R+oAgMQ7(R^3ti)VpB;)gVXSE#OIU15FhLV*&WX zBKWB71~~9E#M}YOy950_NIRuZa&ADCeks6&u@qe*L@l>}^$f`F902XqsC735bJ!7cHN5#u$nUcigb7wyM z;b9@_MHV2qQ|ugR8M_bL9_;tpxBRXaFJv!6^G@AV;*^;h$^*@NaiEYbVx-T)?lBpA zmDX@1`OCo`Q2kck&IPeK^7*5zf6*}uzQuX+YGo(nt2x8RpT7sK-{A!gii;kfD(*x< zTJcdTV=O1!u&7u$0ufWz!2YRfnmI$vin%zk zaL+&`^R;FGps-$X(Uq-LR{jkgIukcUyU!y&hI45=Onq9z*^-EGYRg_60EqI z?S%=sF9hpcE+Q@p)`ZZ(&(o66V$=@!6W{g3LB?1EsaNyiFygm9PMcgtfpLU^)Pz^5KqC|3hsH=xDw8TTiu242A2g`yyt zh5R;wY!#Jzh5-49!$Vn9^Qi*pJAG3CI8*6?mcMu-11Ao9AoR+Vk$UA{objshY2_C> z!OW62%P_G;w%$n#k~;ahMag{v#`aSW>W5|?)X{swnfpDbyG#X8_XGR+Y&uB~>LS*- z#MXsJ)52fPm@WeMA`%Q681U*ho}H$R;>Id}w_d$=KmBQ%4|yV%jI3mw!npH(L^pCyY6)P5yxggd=t zL}9(2v%&Qgz8$6nbZm5@gXXdJgS}D+vT%jV94pX?_f*B-_2UUGhbFa7%QsLM`Y$*M zyo?Gr#WFt(f<{A=RXac%zTkZasWjl=X^U(6E#iL>yVsM7+aB0MCrd zk(nl>KxfVU_B-oa(!bbbceeguH6ZsQ@>@-nC=c zm%awx{Y_*qIv27ix-mNA#C>zjj)q%?bx9oqDdS*#xm0P&{<|LD;iwDLN@kL*6e>nY z$I#%L@1o8i;36=kD~5w(Sy;iEyyfq(iXqB~LBK&7C(QTz zo?>3X6LH_szL*U20ok*^lU$6ucfI0a;mm~`y>=>qvdmAk_B)SvOkOKkpQDfgNq1^x zkmf*HzN+t46Ea`XTno62>_W+`JF_xKNnjIwh0a>XqW^jOX$ey`H~geR)>1>&y#0S1 zPs;gu|FYvhuVV6trY-NwYj8Iaznrz+k=ybU}}Hdu?NLUm@z z#v>Q5vVbSrN7`Yyb(IWmEFOH4{YRq4ZhMv5w}7m{4&Yf|u}+$PWC`-U%4S?0?F%u!whXH|%CT^zRbm=iteig{3}_&6SKbQAUk41_SeI*{jZ_E7xZS(Oqc<}u zBEj^P>R+Ud9NMYqj0_FWl~h%~D=<;_pp|Bxu%8e7@pN9i&)Ae@3O~4|(R6mbxKOabre3q(gO9?I3L#k6i$?kI*dWR_@wx) z|M;iDvV5emeardArcM{4qw8&Z{&|k9-}!iA<~wD*U-UgW9f2hCe(6R)og>Ckbt_O3hQv=)S)K(f^=r*YZaFR}G1g#M)KD zv^LRMk!!mTY~D_~?S-wu#Bdm3e;Xv27z8`c9`r;yZBtf%;0Jw`^$+_8rp~E!<_F$m z9s|F{!;eLkX*MB1))p&0)5>*~L5f$TwxFSZs_Dr{m)9q4 zT+Nory^8l-51hzFh5ekZoZ!Hhq4#)y-Uu#T49$P{cDB@97hqp0GDR&HNi1k15X=(_ zf~3y>NCO;ejVcu@bSV$jh}CPQgvp?!a@uxPg~o4dN#IYjzQ-SF67frG<$B62jFx%i zJCQRB!q^M-|p49y{rH(vL|$vJGiI4$59H;GFTSm*Ns`k4>ZGOia>Fe zgaXAfo^+h~8n)mpy0-za*EWDry&9?4R$!e1=^)g=9%BG|tc&xJRDJK&>aVunmouSE zvV`|s*5X)bvp{u{(1m0B!dMe0n6lhskrsXltn{T5u0NMK%fcl{il;hAFV zD|_#yfnAxPDcz%_RG2u?%YtBM{C5}f{y$=sNN}7RNKsY{<$2(8>$6i_qRA_@{;e9y zC0ANdu|S=bOQ>Q#=nwgf#XXT0j|RLt5A?Nf@Vb7>AD*>sIJ=EeVd;i+g zR#v+|x9#mED$t&1G;);-gzTu^_wj4jOt)YB?H|6%V*{yWw*l9*_8C8?2Mt&+(a(nc zT{ZgQY^iHt&GxP-)6JSpD?l7(54`RM`q6^?|44JSSWSSA=zxn{87)~^L-*TOAW^7W zIo|W#-5q}zZ-(?UA-%XK!Uj7yZhIMz__c&cm-heNjs5j$b0AnXVX7OTCN;;U0!1@8 z1ugm)DFO`8*H!Rk6KTV-N%48e6GP(!fHpy{B`CLFC<5@Wi?j$wIxz#&oc@D+ATSE5 X-)CJ%5B~kbg{P&auL@Cq^ZCC4dhW%M literal 18620 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%0DB5ndD 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

Pg7F7&&Su4++Z*_chYOIl8*<1gNde^emBc7 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 literal 168586 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

K$jLu1S$Rl8he(cow3 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 diff --git a/doc/src/images/lineedits-example.png b/doc/src/images/lineedits-example.png index ff5e3184ad58b08fdceb9778d7a8620ce4f90405..6db951cd4a6e5dd5a93c33605a734cf3e22ff009 100644 GIT binary patch literal 8237 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 diff --git a/doc/src/images/scribble-example.png b/doc/src/images/scribble-example.png index 54091baa6b7110058b5f54dfd54a34a4e9bb1585..497865e44cd90ff819647ac22ed8c327c2f9afac 100644 GIT binary patch literal 5304 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 l_ua*jnz$PA%*c7Vjm{q* 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 diff --git a/doc/src/images/spinboxes-example.png b/doc/src/images/spinboxes-example.png index 14c42d24041855c8b476f7e0cac1fddc12a6546d..432ff10a9b6ce3ea823f2876c1a5b0a72d5af6c2 100644 GIT binary patch literal 21874 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 z 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 literal 24842 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 b2tPUEl}TN9on6Wg{mF(MLCtNYjP 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

4Ymm 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

-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 literal 130767 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≀A56Y)uxWZzU;2Ix2`_^ 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 diff --git a/doc/src/images/tetrix-example.png b/doc/src/images/tetrix-example.png index c9764dcccd5b8bb14e036701ce5715a8196f74a0..2c3dade394826d09de8394267ed742d7d3772777 100644 GIT binary patch literal 5396 zcmcgwcTiN{l13#5QDjttAP6d4kc@zUfTA*zM7Rt&Ns^2TB0|Pj{cH6RfWKl#ZI2nuLUePU+cW z4HA;`013%C7s?An&-b9axg;bPNYs@z6*sZViSe-n0>Pq_C>F%k-y7JR%(Tt*wUd*R z!-M_3o$Z6YT?>oOjg5`5v9YA2BnLa2WBk$f<_7-g@bvU_cYAAR>-Y9=T-axLb3yU*7vYK0PtIHr4ujI%l=ngO=q!DHYJ^ zaa)Ul;R!9JD+fv9%+~A5S+TE}t>rcrs|uPYDKX!p-n+U`vfHm!nhwJG&XLdyUZW5^ zPuhgt?%&voA6_&no@x3u?NK)+5kG+&N}MV8Gka}8d;KN-MJPg?3b&1$Sz9idm_69+ z67*~D!nAJAR$NgG@%QznysF<6{^D1LN|KZEXv{<8ThW&Hw|>Y_g@{qEZf~I`m&T@N z*Vm>8`un-xH|?&LGrUOIor>8UiC8SuGh*S;6~A!Zetk}M z@j#}Id#ZqDP;HXiYK_%MqA9NqsII1>rmC#S3A}s8;{mJl`#2dZuXa zFVRIU?VK|2TzuY&py0cqP0m;D1C%K&P$K}%T=jB=#lIQb8wFpmqhn0DpY6)F?`xMV zVAOKUG|K0oi*Nt|?j@3l26FXt%bd&SF#is4nbuqB zGN}MfK7B`Yg~AOFNMe+P6hd2dEW)uK8WCIpL-w zZ^Zf|Ika)vI+{Ii?!K>52|dR+&GC_yN%N)LtSwHAs~=jgA?B#Nm8q_+ePE_ORrK_h zz2~^*JAxSnX6SVA$pAI?O*7MDhDOf=G1~is(?7Q7@b$peB`sdo_E$pvzp~@5<&q>#)6}^6CjBYz{A$2CQ;=U=q%KE)qkLIF*SR+2B z?x)x!8biZ4Eq(Cqw^->WF<4JXFh9D5D)LYF?LchU+uMiA&G>uiW2It2l4Q1^)gAtg zgBFe4>n=m87V1OpKe0>Vigs41kdWzdhajo8rNguB`QsbJfV4=Eg7wpeLUCUui^hR^ z+U$guAg^AnO6q{o-mAyNlcM{Hw`z_2E>@HF{q&~ebmxu%?FI$iH)sF)_M(v*97Ov- z#702SZ3I=7?;L3Z%!sl^>bfg6vH(N+dQ8J=d?l$ZVTcZ_ojIQwEPZe^-`TAi)x;TK z9*ZhATlDBgMGD$7CR4fJ0eU<+0uj^T+;`iNCmgZpgM#hDO^7pW)t-C&Ok&y0ycI)N z;g9e@uEWY7!Ro0&G{gD7GyOySDBqQW$Ij1$HBcnUG->Y1-J;P77X+t$lVVcHJ;1=- z?>%WLnc6RiKBc|1!sajeahkU`<>y|7pV+l4%O0OZ?brwW{`!TfCdPz26ax0c{-F@X zdPj$%AWX-~+#Ff7XQXSLEB}T9W*q_nVJ7|%kPVo@Y)aB-KeVBFzKpb$Gteuq%nS?c znoiK9ADTb;?a{mPTuTPs?|wt?$m5L+>x{ivMKx1G=QPcspB<7spyvde(R3HIypq}TMp%Z8 zdNu3DIvsPhY~C_)eGWBPoo6w@W@yxHNMRt_la^3cY z$N>#NOCIq$jW^Q`;MPt+D43aBBhle4)WH9Z`q<|s0%CFiATPnC4(gU)aQELNH#;OF@aZbcfdHu0O@q)a&BxRA=fePph#^bFE+=%43&D9&@qeJ#cM*I#$M zN%7&LG=csgeFHOP=v7*PuKPg^hNmm37`?F+%j~CTiQDdPm|dJ;W{S)sweyEebKHI& z-Ss28ar#8GD~>0eS+nvUvh|x_3T}+?a{)Ls@y&<(SX4hn@negH{}B{zkuuJ*7lr6B ztbOJ6!8lt?rNOn7Ew&t&;_R$rozLU8y|5da;JHB_5|L)3EAF-}ObdFAK`WaLYZ0>- ztbQKFhO$@OoyTEI5TX}^!^$Q@J=yHj`r~zQ?{+-6g>$D$%hz#71J4-qth%cAfU{_kkOUc)G0Wt=0_)3vcFuo}%7KCFTD$J9+Z|8)oL%?b%BsJ_ zZSB8zYS&Kg;^k~u)3giEci3S>j^VS8)~7ZC`vdMV=rU=PXWc)jh~qI{bVV&x8y$5n zd_sJl-=ETt+}ufV{!%u{Wt=t`l(hInfE_y_I{a}>3G`5}=_}HU*Mf{igI0}$9>O|8 z!j|1tcRudtyJNca2mDpDhPS&J;V>n}$Ow=(?B38&fhpbBu>MC+Ziubfw;!y2NShiv z^PY|RAaQIs)4b>TqW}->b;17ZPceyZ5A z`Bw7mo06dz(yvV(cxzjN+^x||ZHr|5oGlj6Ir=60ouyTIog>vyA^jEXM>qZUYI}SM z#)B(I)b zmBaGx4>zD2M4H@Z!GbTew}1exgU`Dy!TE&UWna;*gTaj1a7fEDwO^+Y8zZy^x$pLf&%Rf6F79{6Hq-R46;)~dI`!tnIfLPws zCb)2l_89d`F4&R3F&X&Y7Xq851C9MlKaN8$?jafdAeOu^b%H7xcX2oa7{~ka-mOM6bfPRe7_{0YM31A%!XzSd(1cHC@84*?hzBmKV*;lIVS4P$a40TGhM`tWtdw(qhwKL-FcV@VA>q2An+$ak=1qfi4fr z1u#y@wbkLs!}s!FfZ=#}tgvo=n9r(7bIe<*sX^r#o8m3SoIqKcQ-2A@nZ)c4|Y0(eIq*I?MO|xkBjW345!%eXBPhTaM5}= zUp+MQEF1DpV+1aB+6zxt&(`f@T+;)1GZG+*z6gQ8m%~3OBa8~e(>%Dic^|?I08E!e z5rWTmo>wD^FI)G8LrW4W@=LPvVp?f9*Ik1lroa*g9=Na~J_lqVJ$OL4EkDHcu@%Z^ zj_&|DJq#LVBq_3_<~MbMQ=aka1@B}?t>j#KYWy&t;ZF9~*R`}FYd8ro(<&ivL=R|U zd};uQn#ouHxH62}Z>V$rVzb|-*mc+nHl2KB_6!8a4)J)OUw7=OJ-F9&gL$*1ZV*SZ zMEb5%eQl_>muWL&UlI9`%4>IXGs7t$i;^%OwzNN1ZMdH3fD%+pEr7gK7Hi>08OLgm z6leCPYd(GR3%|A`KO;_PQxQ6)19o|dbMS4aC{?-j{-~76v#l(ek{+Y!cEhd8dd$ei zYuHrkll|^1Xbt%~KR49(KEFZR!51mGt60`o0s|qVvb7(ItcIzDV%Btp$U=>u480yM z6;ES{Kv=!v9_OeR=koKNf|G6LmTOE>v+Mb1u7bi z4w8{^8fkea`JntF9#y7K+*0x72t1Q%WaUBic~667>~4|f(~*75kU$(X5_^t7SZ>n`h#Z5A>mBuzdnnG4Q*#`X>s6z|kidUWe7 zN%~<4gI*iG&^qT?y(z&QV4o=U?M+XT2%DEz=2ww>6<(ybdXaO~7j1fH9sS}lIhp?p zUdl%%2>6uL(&%?kkw*18wU1paTq+8cLLw)}!B!wK(1O zUSlJSK?l_qLJv>+0w6n6995?W75vw@-t0f;%QG#nbD~eKXjSP}cPYrY)V8_#`DL+! z!^dE!+& zM+aVVK>H9c&IR2hSqpP5g|?ER8hMz!2RP^3*blSHy^}cOuO6{|lu+I~T0GJC@Lb*p WzA^5az3o45A4-a4_ef|T^B)0_s literal 9980 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 z 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 diff --git a/doc/src/images/wiggly-example.png b/doc/src/images/wiggly-example.png index b20fbc445d3d585f6090736ee647e4029dc599cd..5ac0d856b3f5271a8ebdf0604d4654c632ffcbc3 100644 GIT binary patch literal 8456 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 ASpWb4 literal 6546 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 Ef+w5vNdN!< diff --git a/doc/src/images/windowflags-example.png b/doc/src/images/windowflags-example.png index 9028b9b0d1036b294bd41dae31ca0e759261facb..89730bcc7e929b2a70ce033abdde1e4fc9c5214d 100644 GIT binary patch literal 38998 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⪙<=oCH{S2Lcd6iU)J5EgYNaE5=Ds-u>Va6n_U4 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 literal 22945 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 diff --git a/examples/widgets/desktop/systray/doc/images/systemtray-editor.png b/examples/widgets/desktop/systray/doc/images/systemtray-editor.png index fb15dea8cb56f6e2d3f8be214e8de05df3735b7e..f7c23db28a942ea17f6aec31ee2dedfb6c4b9800 100644 GIT binary patch literal 25407 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 literal 18147 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 literal 18147 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 Date: Thu, 8 Dec 2016 15:36:07 +0100 Subject: [PATCH 173/174] Doc: added spec about parameter enable Err: Undocumented parameter 'enable' in QNetworkProxyFactory::setUseSystemConfiguration() Err: no such parameter 'editable' in QComboBox::setCompleter() Change-Id: Ib27b93cf74e97efd656eda1265003f33c6802005 Reviewed-by: Venugopal Shivashankar --- src/network/kernel/qnetworkproxy.cpp | 4 ++-- src/widgets/widgets/qcombobox.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp index ce491e0fcb..0be8a7f79e 100644 --- a/src/network/kernel/qnetworkproxy.cpp +++ b/src/network/kernel/qnetworkproxy.cpp @@ -1517,8 +1517,8 @@ bool QNetworkProxyFactory::usesSystemConfiguration() Enables the use of the platform-specific proxy settings, and only those. See systemProxyForQuery() for more information. - Calling setUseSystemConfiguration(\c{true}) will reset any proxy or - QNetworkProxyFactory already set. + Calling this function with \a enable set to \c true resets any proxy + or QNetworkProxyFactory that is already set. \note See the systemProxyForQuery() documentation for a list of limitations related to the use of system proxies. diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index abb24a7f1e..4519265fb8 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -1841,7 +1841,7 @@ QLineEdit *QComboBox::lineEdit() const Sets the \a validator to use instead of the current validator. - \note The validator is removed when the editable property becomes \c false. + \note The validator is removed when the \l editable property becomes \c false. */ void QComboBox::setValidator(const QValidator *v) @@ -1876,7 +1876,7 @@ const QValidator *QComboBox::validator() const By default, for an editable combo box, a QCompleter that performs case insensitive inline completion is automatically created. - \note The completer is removed when the \a editable property becomes \c false. + \note The completer is removed when the \l editable property becomes \c false. */ void QComboBox::setCompleter(QCompleter *c) { From 00c9ec63a552d040e851b561c11428fabf1a2b08 Mon Sep 17 00:00:00 2001 From: Lambert Duijst Date: Thu, 8 Dec 2016 11:07:07 +0100 Subject: [PATCH 174/174] Fix for horizontal scrollbars Horizontal scrollbars scroll in the wrong direction when the app has a stylesheet and the LayoutDirection is RightToLeft. Change-Id: I860cb733709e8d59a7b844f2b6ed1ee63410956e Reviewed-by: Friedemann Kleint --- src/widgets/styles/qstylesheetstyle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index 8e77ae0e44..d63c96bf0e 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -5542,9 +5542,9 @@ QRect QStyleSheetStyle::subControlRect(ComplexControl cc, const QStyleOptionComp } else { sliderlen = maxlen; } - + const int sliderPosition = sb->orientation == Qt::Horizontal && sb->direction == Qt::RightToLeft ? sb->maximum - sb->sliderPosition + sb->minimum : sb->sliderPosition; int sliderstart = (styleOptionSlider.orientation == Qt::Horizontal ? contentRect.left() : contentRect.top()) - + sliderPositionFromValue(sb->minimum, sb->maximum, sb->sliderPosition, + + sliderPositionFromValue(sb->minimum, sb->maximum, sliderPosition, maxlen - sliderlen, sb->upsideDown); QRect sr = (sb->orientation == Qt::Horizontal)

_bm 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:h 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