diff --git a/mkspecs/features/data/unix/findclasslist.pl b/mkspecs/features/data/unix/findclasslist.pl index ac010ae0a7..adec22d58d 100644 --- a/mkspecs/features/data/unix/findclasslist.pl +++ b/mkspecs/features/data/unix/findclasslist.pl @@ -1,7 +1,7 @@ #!/usr/bin/env perl ############################################################################# ## -## Copyright (C) 2015 Intel Corporation +## Copyright (C) 2016 Intel Corporation ## Contact: http://www.qt.io/licensing/ ## ## This file is part of the build configuration tools of the Qt Toolkit. @@ -33,40 +33,26 @@ ############################################################################# use strict; -my $syntax = "findclasslist.pl \n" . - "Replaces \@CLASSLIST\@ with the classes found in the header files\n"; - -die("Expected exactly one argument") if (@ARGV != 1); - -my @headers = (); - -# Expand contents of the command-line arguments file -open ARGFILE, "<$ARGV[0]" or die("Could not open arguments file $ARGV[0]: $!"); -while (my $line = ) { - chomp($line); - push @headers, $line; -} -close ARGFILE; +my $syntax = "findclasslist.pl\n" . + "Replaces each \@FILE:filename\@ in stdin with the classes found in that file\n"; $\ = $/; while () { chomp; - unless (/\@CLASSLIST\@/) { + unless (/\@FILE:(.*)\@/) { print; next; } - # Replace @CLASSLIST@ with the class list - for my $header (@headers) { - open HDR, "<$header" or die("Could not open header $header: $!"); - my $comment = " /* $header */"; - while (my $line = ) { - # Match a struct or class declaration, but not a forward declaration - $line =~ /^(?:struct|class) (?:Q_.*_EXPORT)? (\w+)(?!;)/ or next; - print $comment if $comment; - printf " *%d%s*;\n", length $1, $1; - $comment = 0; - } - close HDR; + # Replace this line with the class list + open HDR, "<$1" or die("Could not open header $1: $!"); + my $comment = " /* $1 */"; + while (my $line = ) { + # Match a struct or class declaration, but not a forward declaration + $line =~ /^(?:struct|class) (?:Q_.*_EXPORT)? (\w+)(?!;)/ or next; + print $comment if $comment; + printf " *%d%s*;\n", length $1, $1; + $comment = 0; } + close HDR; } diff --git a/mkspecs/features/qt_docs.prf b/mkspecs/features/qt_docs.prf index 37b2f06193..183d0c9502 100644 --- a/mkspecs/features/qt_docs.prf +++ b/mkspecs/features/qt_docs.prf @@ -11,13 +11,6 @@ !exists($$QMAKE_DOCS): error("Cannot find documentation specification file $$QMAKE_DOCS") -load(qt_build_paths) -QMAKE_DOCS_BASE_OUTDIR = $$MODULE_BASE_OUTDIR/doc - -QMAKE_DOCS_TARGET = $$replace(QMAKE_DOCS, ^(.*/)?(.*)\\.qdocconf$, \\2) -isEmpty(QMAKE_DOCS_TARGETDIR): QMAKE_DOCS_TARGETDIR = $$QMAKE_DOCS_TARGET -QMAKE_DOCS_OUTPUTDIR = $$QMAKE_DOCS_BASE_OUTDIR/$$QMAKE_DOCS_TARGETDIR - qtver.name = QT_VERSION qtver.value = $$VERSION isEmpty(qtver.value): qtver.value = $$MODULE_VERSION @@ -31,6 +24,21 @@ qtdocs.value = $$[QT_INSTALL_DOCS/src] QT_TOOL_ENV = qtver qtmver qtvertag qtdocs qtPrepareTool(QDOC, qdoc) QT_TOOL_ENV = + +!build_online_docs: qtPrepareTool(QHELPGENERATOR, qhelpgenerator) + +# qtPrepareTool() must be called outside a build pass, as it protects +# against concurrent wrapper creation by omitting it during build passes. +# However, creating the actual targets is reserved to the build passes. +debug_and_release:!build_pass: return() + +load(qt_build_paths) +QMAKE_DOCS_BASE_OUTDIR = $$MODULE_BASE_OUTDIR/doc + +QMAKE_DOCS_TARGET = $$replace(QMAKE_DOCS, ^(.*/)?(.*)\\.qdocconf$, \\2) +isEmpty(QMAKE_DOCS_TARGETDIR): QMAKE_DOCS_TARGETDIR = $$QMAKE_DOCS_TARGET +QMAKE_DOCS_OUTPUTDIR = $$QMAKE_DOCS_BASE_OUTDIR/$$QMAKE_DOCS_TARGETDIR + QDOC += -outputdir $$shell_quote($$QMAKE_DOCS_OUTPUTDIR) !build_online_docs: \ QDOC += -installdir $$shell_quote($$[QT_INSTALL_DOCS]) @@ -64,7 +72,6 @@ prepare_docs { } !build_online_docs { - qtPrepareTool(QHELPGENERATOR, qhelpgenerator) qch_docs.commands = $$QHELPGENERATOR $$shell_quote($$QMAKE_DOCS_OUTPUTDIR/$${QMAKE_DOCS_TARGET}.qhp) -o $$shell_quote($$QMAKE_DOCS_BASE_OUTDIR/$${QMAKE_DOCS_TARGET}.qch) inst_html_docs.files = $$QMAKE_DOCS_OUTPUTDIR diff --git a/mkspecs/features/qt_docs_targets.prf b/mkspecs/features/qt_docs_targets.prf index 89f080cc5e..1f9e2b0b47 100644 --- a/mkspecs/features/qt_docs_targets.prf +++ b/mkspecs/features/qt_docs_targets.prf @@ -29,17 +29,17 @@ QMAKE_EXTRA_TARGETS += docs contains(TEMPLATE, subdirs) { for(inst, DOC_TARGETS): \ prepareRecursiveTarget($$inst) -} else:debug_and_release:!build_pass { - sub = $$first(BUILDS) - for(inst, DOC_TARGETS) { - $${inst}.CONFIG = recursive - $${inst}.recurse = $$sub - } } else { - # apps and libs only generate docs if QMAKE_DOCS is set - !isEmpty(QMAKE_DOCS) { - # backwards compat hack - load(qt_docs) + debug_and_release:!build_pass { + sub = $$first(BUILDS) + for(inst, DOC_TARGETS) { + $${inst}.CONFIG = recursive + $${inst}.recurse = $$sub + } } + # Apps and libs request docs creation by setting QMAKE_DOCS. + # This is a backwards compat hack - technically, the modules which need it + # are supposed to load(qt_docs) themselves. + !isEmpty(QMAKE_DOCS): load(qt_docs) } QMAKE_EXTRA_TARGETS += $$DOC_TARGETS diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index 1dae370630..6ed75a4416 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -132,7 +132,6 @@ lib_bundle { } mac { - CONFIG += explicitlib macx-g++ { QMAKE_CFLAGS += -fconstant-cfstrings QMAKE_CXXFLAGS += -fconstant-cfstrings @@ -200,7 +199,10 @@ android: CONFIG += qt_android_deps no_linker_version_script verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API { *; };" } else { verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API {" \ - " qt_private_api_tag*;" "@CLASSLIST@" "};" + " qt_private_api_tag*;" + for(header, SYNCQT.PRIVATE_HEADER_FILES): \ + verscript_content += " @FILE:$${_PRO_FILE_PWD_}/$$header@" + verscript_content += "};" current = Qt_$$QT_MAJOR_VERSION verscript_content += "$$current { *; };" @@ -214,13 +216,12 @@ android: CONFIG += qt_android_deps no_linker_version_script else: verscript_content += "$$current {} $$previous;" } - # Add a post-processing step to replace the @CLASSLIST@ - verscriptprocess.commands = perl $${PWD}/data/unix/findclasslist.pl < $${verscript}.in $${verscript}.in.args > $@ + # Add a post-processing step to replace the @FILE:filename@ + verscriptprocess.commands = perl $${PWD}/data/unix/findclasslist.pl < $${verscript}.in > $@ verscriptprocess.target = $$verscript for(header, SYNCQT.PRIVATE_HEADER_FILES): \ verscriptprocess.depends += $${_PRO_FILE_PWD_}/$$header - write_file($${verscript}.in.args, verscriptprocess.depends)|error("Aborting.") - verscriptprocess.depends += $${verscript}.in $${verscript}.in.args + verscriptprocess.depends += $${verscript}.in QMAKE_EXTRA_TARGETS += verscriptprocess PRE_TARGETDEPS += $$verscript verscript = $${verscript}.in @@ -258,19 +259,18 @@ load(qt_targets) pclib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR pclib_replace.CONFIG = path QMAKE_PKGCONFIG_INSTALL_REPLACE += pclib_replace - - unix { - CONFIG += create_libtool explicitlib - host_build: \ - QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS] - else: \ - QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]" - ltlib_replace.match = $$lib_replace.match - !isEmpty(lib_replace.replace): \ - ltlib_replace.replace = $$QMAKE_LIBTOOL_LIBDIR - ltlib_replace.CONFIG = path - QMAKE_LIBTOOL_INSTALL_REPLACE += ltlib_replace - } +} +!lib_bundle:unix { + CONFIG += create_libtool + host_build: \ + QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS] + else: \ + QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]" + ltlib_replace.match = $$lib_replace.match + !isEmpty(lib_replace.replace): \ + ltlib_replace.replace = $$QMAKE_LIBTOOL_LIBDIR + ltlib_replace.CONFIG = path + QMAKE_LIBTOOL_INSTALL_REPLACE += ltlib_replace } contains(QT_PRODUCT, OpenSource.*):DEFINES *= QT_OPENSOURCE diff --git a/src/angle/src/config.pri b/src/angle/src/config.pri index be61282069..fddb395ab2 100644 --- a/src/angle/src/config.pri +++ b/src/angle/src/config.pri @@ -23,6 +23,7 @@ equals(QMAKE_HOST.os, Windows) { defineReplace(addGnuPath) { gnuPath = $$1 !isEmpty(gnuPath):!isEmpty(gnutools.name) { + QT_TOOL_NAME = $$1 qtAddToolEnv(gnuPath, gnutools) silent: gnuPath = @echo generating sources from ${QMAKE_FILE_IN} && $$gnuPath } diff --git a/src/corelib/Qt5CoreMacros.cmake b/src/corelib/Qt5CoreMacros.cmake index 0c33335ae9..9235641544 100644 --- a/src/corelib/Qt5CoreMacros.cmake +++ b/src/corelib/Qt5CoreMacros.cmake @@ -336,7 +336,7 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.9) set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_MINSIZEREL QT_NO_DEBUG) if (Qt5_POSITION_INDEPENDENT_CODE AND (CMAKE_VERSION VERSION_LESS 2.8.12 - AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\" + AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0))) set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE}) endif() diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 60d6d4b929..1efcce393d 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -152,9 +152,7 @@ to be consistent in pixels-per-point across devices rather than defining 1 point as 1/72 inch. - \value AA_X11InitThreads Calls \c XInitThreads() as part of the QApplication - construction in order to make Xlib calls thread-safe. This - attribute must be set before QApplication is constructed. + \value AA_X11InitThreads This value is obsolete and has no effect. \value AA_SynthesizeTouchForUnhandledMouseEvents All mouse events that are not accepted by the application will be translated diff --git a/src/corelib/io/qurlquery.h b/src/corelib/io/qurlquery.h index 16e186a79b..5386d97e09 100644 --- a/src/corelib/io/qurlquery.h +++ b/src/corelib/io/qurlquery.h @@ -121,7 +121,7 @@ inline QStringList QUrl::allQueryItemValues(const QString &key) const inline void QUrl::removeQueryItem(const QString &key) { QUrlQuery q(*this); q.removeQueryItem(key); setQuery(q); } inline void QUrl::removeAllQueryItems(const QString &key) -{ QUrlQuery q(*this); q.removeAllQueryItems(key); } +{ QUrlQuery q(*this); q.removeAllQueryItems(key); setQuery(q); } inline void QUrl::addEncodedQueryItem(const QByteArray &key, const QByteArray &value) { QUrlQuery q(*this); q.addQueryItem(fromEncodedComponent_helper(key), fromEncodedComponent_helper(value)); setQuery(q); } @@ -132,7 +132,7 @@ inline QByteArray QUrl::encodedQueryItemValue(const QByteArray &key) const inline void QUrl::removeEncodedQueryItem(const QByteArray &key) { QUrlQuery q(*this); q.removeQueryItem(fromEncodedComponent_helper(key)); setQuery(q); } inline void QUrl::removeAllEncodedQueryItems(const QByteArray &key) -{ QUrlQuery q(*this); q.removeAllQueryItems(fromEncodedComponent_helper(key)); } +{ QUrlQuery q(*this); q.removeAllQueryItems(fromEncodedComponent_helper(key)); setQuery(q); } inline void QUrl::setEncodedQueryItems(const QList > &qry) { diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 1e755cf5d8..1d7128721f 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -3437,7 +3437,7 @@ static int numericCompare(const QVariant::Private *d1, const QVariant::Private * Q_ASSERT(ok); qreal r2 = qConvertToRealNumber(d2, &ok); Q_ASSERT(ok); - if (qFuzzyCompare(r1, r2)) + if (r1 == r2 || qFuzzyCompare(r1, r2)) return 0; return r1 < r2 ? -1 : 1; } diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp index 1a4b41fee4..32e8a52a28 100644 --- a/src/corelib/thread/qthread_win.cpp +++ b/src/corelib/thread/qthread_win.cpp @@ -69,6 +69,30 @@ #ifndef QT_NO_THREAD QT_BEGIN_NAMESPACE +#ifdef Q_OS_WINRT +inline DWORD qWinRTTlsAlloc() { + return FlsAlloc(0); +} + +inline bool qWinRTTlsFree(DWORD dwTlsIndex) { + return FlsFree(dwTlsIndex); +} + +inline LPVOID qWinRTTlsGetValue(DWORD dwTlsIndex) { + return FlsGetValue(dwTlsIndex); +} + +inline bool qWinRTTlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { + return FlsSetValue(dwTlsIndex, lpTlsValue); +} + +#define TlsAlloc qWinRTTlsAlloc +#define TlsFree qWinRTTlsFree +#define TlsSetValue qWinRTTlsSetValue +#define TlsGetValue qWinRTTlsGetValue + +#endif // Q_OS_WINRT + void qt_watch_adopted_thread(const HANDLE adoptedThreadHandle, QThread *qthread); DWORD WINAPI qt_adopted_thread_watcher_function(LPVOID); diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 366ad5b02f..c4aa699992 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -585,7 +585,7 @@ int QDate::weekNumber(int *yearNumber) const Q_ASSERT(week == 52 || week == 53); } else if (week == 53) { // maybe first week of next year - int w = (yday - 365 - (QDate::isLeapYear(year + 1) ? 1 : 0) - wday + 10) / 7; + int w = (yday - 365 - (QDate::isLeapYear(year) ? 1 : 0) - wday + 10) / 7; if (w > 0) { ++year; week = w; diff --git a/src/dbus/qdbus_symbols_p.h b/src/dbus/qdbus_symbols_p.h index 67680f6b82..1991a462e9 100644 --- a/src/dbus/qdbus_symbols_p.h +++ b/src/dbus/qdbus_symbols_p.h @@ -286,8 +286,6 @@ DEFINEFUNC(const char* , dbus_message_get_sender, (DBusMessage *message), (message), return) DEFINEFUNC(dbus_uint32_t , dbus_message_get_serial, (DBusMessage *message), (message), return) -DEFINEFUNC(dbus_uint32_t , dbus_message_get_reply_serial, (DBusMessage *message), - (message), return) DEFINEFUNC(const char* , dbus_message_get_signature, (DBusMessage *message), (message), return) DEFINEFUNC(int , dbus_message_get_type, (DBusMessage *message), diff --git a/src/dbus/qdbuserror.cpp b/src/dbus/qdbuserror.cpp index 40e97ae483..d6a329cfe8 100644 --- a/src/dbus/qdbuserror.cpp +++ b/src/dbus/qdbuserror.cpp @@ -130,11 +130,11 @@ static const int errorMessages_indices[] = { 0, 6, 40, 76, 118, 153, 191, 231, 273, 313, 349, 384, 421, 461, 501, 540, 581, 617, 661, 705, 746, 789, 833, 874, - 916, 961, 1005, -1 + 916, 961, 1005 }; static const int errorMessages_count = sizeof errorMessages_indices / - sizeof errorMessages_indices[0] - 1; + sizeof errorMessages_indices[0]; static inline const char *get(QDBusError::ErrorType code) { diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 84bd90d06d..c4e506ff0e 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1818,8 +1818,8 @@ bool QDBusConnectionPrivate::send(const QDBusMessage& message) } q_dbus_message_set_no_reply(msg, true); // the reply would not be delivered to anything - emit messageNeedsSending(Q_NULLPTR, msg); qDBusDebug() << this << "sending message (no reply):" << message; + emit messageNeedsSending(Q_NULLPTR, msg); return true; } @@ -2018,8 +2018,8 @@ QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusM lastError = error; processFinishedCall(pcall); } else { - emit messageNeedsSending(pcall, msg, timeout); qDBusDebug() << this << "sending message:" << message; + emit messageNeedsSending(pcall, msg, timeout); } return pcall; } diff --git a/src/dbus/qdbusmessage.cpp b/src/dbus/qdbusmessage.cpp index 078442f3f1..32b7787514 100644 --- a/src/dbus/qdbusmessage.cpp +++ b/src/dbus/qdbusmessage.cpp @@ -188,12 +188,7 @@ DBusMessage *QDBusMessagePrivate::toDBusMessage(const QDBusMessage &message, QDB // check if everything is ok if (marshaller.ok) - { - QDBusMessage *m = (QDBusMessage*)&message; - q_dbus_message_ref(msg); - m->d_ptr->msg = msg; return msg; - } // not ok; q_dbus_message_unref(msg); @@ -322,16 +317,6 @@ QDBusMessage QDBusMessagePrivate::makeLocalReply(const QDBusConnectionPrivate &c return QDBusMessage(); // failed } -uint QDBusMessagePrivate::serial() -{ - return msg ? q_dbus_message_get_serial(msg) : reply ? q_dbus_message_get_serial(reply) : 0; -} - -uint QDBusMessagePrivate::replySerial() -{ - return msg ? q_dbus_message_get_reply_serial(msg) : reply ? q_dbus_message_get_reply_serial(reply) : 0; -} - /*! \class QDBusMessage \inmodule QtDBus @@ -647,32 +632,6 @@ QString QDBusMessage::signature() const return d_ptr->signature; } -/*! - Returns the serial of the message or 0 if undefined. - - The serial number is a unique identifier of a message coming from a - given connection. - - The serial is set to a non zero value after the message has been sent - over a D-Bus connection. -*/ -uint QDBusMessage::serial() const -{ - return d_ptr->serial(); -} - -/*! - Returns the serial of the message this is a reply to or 0 if undefined. - - The serial number is a unique identifier of a message coming from a - given connection and D-Bus messages of 'method return' or 'error' type - use them to match the reply to the method call message. -*/ -uint QDBusMessage::replySerial() const -{ - return d_ptr->replySerial(); -} - /*! Returns the flag that indicates if this message should see a reply or not. This is only meaningful for \l {MethodCallMessage}{method @@ -861,16 +820,10 @@ QDebug operator<<(QDebug dbg, const QDBusMessage &msg) msg.type() == QDBusMessage::SignalMessage) dbg.nospace() << ", path=" << msg.path() << ", interface=" << msg.interface() - << ", member=" << msg.member() - << ", serial=" << msg.serial(); + << ", member=" << msg.member(); if (msg.type() == QDBusMessage::ErrorMessage) dbg.nospace() << ", error name=" << msg.errorName() - << ", error message=" << msg.errorMessage() - << ", serial=" << msg.serial() - << ", reply serial=" << msg.replySerial(); - else if (msg.type() == QDBusMessage::ReplyMessage) - dbg.nospace() << ", serial=" << msg.serial() - << ", reply serial=" << msg.replySerial(); + << ", error message=" << msg.errorMessage(); dbg.nospace() << ", signature=" << msg.signature() << ", contents=("; debugVariantList(dbg, msg.arguments()); diff --git a/src/dbus/qdbusmessage.h b/src/dbus/qdbusmessage.h index f6538bd2cf..e85d600080 100644 --- a/src/dbus/qdbusmessage.h +++ b/src/dbus/qdbusmessage.h @@ -104,8 +104,6 @@ public: QString errorMessage() const; MessageType type() const; QString signature() const; - uint serial() const; - uint replySerial() const; bool isReplyRequired() const; diff --git a/src/dbus/qdbusmessage_p.h b/src/dbus/qdbusmessage_p.h index 0ad9924cac..5abd490502 100644 --- a/src/dbus/qdbusmessage_p.h +++ b/src/dbus/qdbusmessage_p.h @@ -93,8 +93,6 @@ public: const QDBusMessage &asSent); static QDBusMessage makeLocalReply(const QDBusConnectionPrivate &conn, const QDBusMessage &asSent); - uint serial(); - uint replySerial(); }; QT_END_NAMESPACE diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index a992ad6fea..6ec1eecfb1 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -4623,32 +4623,7 @@ QImage QImage::transformed(const QTransform &matrix, Qt::TransformationMode mode if (complex_xform || mode == Qt::SmoothTransformation) { if (d->format < QImage::Format_RGB32 || !hasAlphaChannel()) { - switch(d->format) { - case QImage::Format_RGB16: - target_format = Format_ARGB8565_Premultiplied; - break; - case QImage::Format_RGB555: - target_format = Format_ARGB8555_Premultiplied; - break; - case QImage::Format_RGB666: - target_format = Format_ARGB6666_Premultiplied; - break; - case QImage::Format_RGB444: - target_format = Format_ARGB4444_Premultiplied; - break; - case QImage::Format_RGBX8888: - target_format = Format_RGBA8888_Premultiplied; - break; - case QImage::Format_BGR30: - target_format = Format_A2BGR30_Premultiplied; - break; - case QImage::Format_RGB30: - target_format = Format_A2RGB30_Premultiplied; - break; - default: - target_format = Format_ARGB32_Premultiplied; - break; - } + target_format = qt_alphaVersion(d->format); } } diff --git a/src/gui/image/qimage_p.h b/src/gui/image/qimage_p.h index 3badda0864..f9ad6c0ac0 100644 --- a/src/gui/image/qimage_p.h +++ b/src/gui/image/qimage_p.h @@ -161,10 +161,45 @@ inline int qt_depthForFormat(QImage::Format format) } return depth; } + #if defined(_M_ARM) #pragma optimize("", on) #endif +inline QImage::Format qt_alphaVersion(QImage::Format format) +{ + switch (format) { + case QImage::Format_RGB16: + return QImage::Format_ARGB8565_Premultiplied; + case QImage::Format_RGB555: + return QImage::Format_ARGB8555_Premultiplied; + case QImage::Format_RGB666: + return QImage::Format_ARGB6666_Premultiplied; + case QImage::Format_RGB444: + return QImage::Format_ARGB4444_Premultiplied; + case QImage::Format_RGBX8888: + return QImage::Format_RGBA8888_Premultiplied; + case QImage::Format_BGR30: + return QImage::Format_A2BGR30_Premultiplied; + case QImage::Format_RGB30: + return QImage::Format_A2RGB30_Premultiplied; + default: + break; + } + return QImage::Format_ARGB32_Premultiplied; +} + +inline QImage::Format qt_alphaVersionForPainting(QImage::Format format) +{ + QImage::Format toFormat = qt_alphaVersion(format); +#if defined(__ARM_NEON__) || defined(__SSE2__) + // If we are switching depth anyway and we have optimized ARGB32PM routines, upgrade to that. + if (qt_depthForFormat(format) != qt_depthForFormat(toFormat)) + toFormat = QImage::Format_ARGB32_Premultiplied; +#endif + return toFormat; +} + QT_END_NAMESPACE #endif // QIMAGE_P_H diff --git a/src/gui/image/qpixmap_raster.cpp b/src/gui/image/qpixmap_raster.cpp index a2b84b358e..bbdf77355e 100644 --- a/src/gui/image/qpixmap_raster.cpp +++ b/src/gui/image/qpixmap_raster.cpp @@ -178,20 +178,7 @@ void QRasterPlatformPixmap::fill(const QColor &color) int alpha = color.alpha(); if (alpha != 255) { if (!image.hasAlphaChannel()) { - QImage::Format toFormat; -#if !(defined(__ARM_NEON__) || defined(__SSE2__)) - if (image.format() == QImage::Format_RGB16) - toFormat = QImage::Format_ARGB8565_Premultiplied; - else if (image.format() == QImage::Format_RGB666) - toFormat = QImage::Format_ARGB6666_Premultiplied; - else if (image.format() == QImage::Format_RGB555) - toFormat = QImage::Format_ARGB8555_Premultiplied; - else if (image.format() == QImage::Format_RGB444) - toFormat = QImage::Format_ARGB4444_Premultiplied; - else -#endif - toFormat = QImage::Format_ARGB32_Premultiplied; - + QImage::Format toFormat = qt_alphaVersionForPainting(image.format()); if (!image.isNull() && qt_depthForFormat(image.format()) == qt_depthForFormat(toFormat)) { image.detach(); image.d->format = toFormat; @@ -314,17 +301,7 @@ void QRasterPlatformPixmap::createPixmapForImage(QImage &sourceImage, Qt::ImageC : QImage::Format_RGB32; } else { QImage::Format opaqueFormat = QNativeImage::systemFormat(); - QImage::Format alphaFormat = QImage::Format_ARGB32_Premultiplied; - -#if !defined(__ARM_NEON__) && !defined(__SSE2__) - switch (opaqueFormat) { - case QImage::Format_RGB16: - alphaFormat = QImage::Format_ARGB8565_Premultiplied; - break; - default: // We don't care about the others... - break; - } -#endif + QImage::Format alphaFormat = qt_alphaVersionForPainting(opaqueFormat); if (!sourceImage.hasAlphaChannel()) { format = opaqueFormat; diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 651149c4c6..b8ab98e290 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -4193,7 +4193,7 @@ protected: void QGradientCache::generateGradientColorTable(const QGradient& gradient, QRgba64 *colorTable, int size, int opacity) const { - QGradientStops stops = gradient.stops(); + const QGradientStops stops = gradient.stops(); int stopCount = stops.count(); Q_ASSERT(stopCount > 0); diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 826ba6f3f9..6110131484 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -426,8 +426,8 @@ \value ReuseAddressHint Provides a hint to QAbstractSocket that it should try to rebind the service even if the address and port are already bound by - another socket. On Windows, this is equivalent to the SO_REUSEADDR - socket option. On Unix, this option is ignored. + another socket. On Windows and Unix, this is equivalent to the SO_REUSEADDR + socket option. \value DefaultForPlatform The default option for the current platform. On Unix and OS X, this is equivalent to (DontShareAddress diff --git a/src/platformsupport/clipboard/clipboard.pri b/src/platformsupport/clipboard/clipboard.pri index 2532430f1e..cb8315d003 100644 --- a/src/platformsupport/clipboard/clipboard.pri +++ b/src/platformsupport/clipboard/clipboard.pri @@ -1,5 +1,7 @@ mac { HEADERS += $$PWD/qmacmime_p.h OBJECTIVE_SOURCES += $$PWD/qmacmime.mm + + osx: LIBS_PRIVATE += -framework AppKit } diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm index a5c963a2d5..21248ddb86 100644 --- a/src/plugins/platforms/ios/qiosintegration.mm +++ b/src/plugins/platforms/ios/qiosintegration.mm @@ -107,7 +107,7 @@ QIOSIntegration::QIOSIntegration() m_touchDevice = new QTouchDevice; m_touchDevice->setType(QTouchDevice::TouchScreen); QTouchDevice::Capabilities touchCapabilities = QTouchDevice::Position | QTouchDevice::NormalizedPosition; - if ([mainScreen respondsToSelector:@selector(traitCollection)]) { + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_9_0) { if (mainScreen.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) touchCapabilities |= QTouchDevice::Pressure; } diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index 53b3d30327..4dd43be465 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -286,10 +286,14 @@ QTouchDevice *touchDevice = QIOSIntegration::instance()->touchDevice(); QTouchDevice::Capabilities touchCapabilities = touchDevice->capabilities(); - if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) - touchCapabilities |= QTouchDevice::Pressure; - else - touchCapabilities &= ~QTouchDevice::Pressure; + + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_9_0) { + if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) + touchCapabilities |= QTouchDevice::Pressure; + else + touchCapabilities &= ~QTouchDevice::Pressure; + } + touchDevice->setCapabilities(touchCapabilities); } diff --git a/src/plugins/platforms/windows/openglblacklists/default.json b/src/plugins/platforms/windows/openglblacklists/default.json index 2672711d3a..767eac161c 100644 --- a/src/plugins/platforms/windows/openglblacklists/default.json +++ b/src/plugins/platforms/windows/openglblacklists/default.json @@ -1,6 +1,6 @@ { "name": "Qt built-in GPU driver blacklist", - "version": "5.5", + "version": "5.6", "entries": [ { "id": 1, diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 217444d129..c954e0a96d 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -405,14 +405,29 @@ void QWindowsContext::setTabletAbsoluteRange(int a) #endif } +int QWindowsContext::processDpiAwareness() +{ +#ifndef Q_OS_WINCE + int result; + if (QWindowsContext::shcoredll.getProcessDpiAwareness + && SUCCEEDED(QWindowsContext::shcoredll.getProcessDpiAwareness(NULL, &result))) { + return result; + } +#endif // !Q_OS_WINCE + return -1; +} + void QWindowsContext::setProcessDpiAwareness(QtWindows::ProcessDpiAwareness dpiAwareness) { #ifndef Q_OS_WINCE qCDebug(lcQpaWindows) << __FUNCTION__ << dpiAwareness; if (QWindowsContext::shcoredll.isValid()) { const HRESULT hr = QWindowsContext::shcoredll.setProcessDpiAwareness(dpiAwareness); - if (FAILED(hr)) - qWarning() << "SetProcessDpiAwareness failed:" << QWindowsContext::comErrorString(hr); + if (FAILED(hr)) { + qWarning().noquote().nospace() << "SetProcessDpiAwareness(" + << dpiAwareness << ") failed: " << QWindowsContext::comErrorString(hr) + << ", using " << QWindowsContext::processDpiAwareness(); + } } else { if (dpiAwareness != QtWindows::ProcessDpiUnaware && QWindowsContext::user32dll.setProcessDPIAware) { if (!QWindowsContext::user32dll.setProcessDPIAware()) diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index d08fc8f726..14baec96d8 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -148,7 +148,7 @@ struct QWindowsShcoreDLL { void init(); inline bool isValid() const { return getProcessDpiAwareness && setProcessDpiAwareness && getDpiForMonitor; } - typedef HRESULT (WINAPI *GetProcessDpiAwareness)(HANDLE,int); + typedef HRESULT (WINAPI *GetProcessDpiAwareness)(HANDLE,int *); typedef HRESULT (WINAPI *SetProcessDpiAwareness)(int); typedef HRESULT (WINAPI *GetDpiForMonitor)(HMONITOR,int,UINT *,UINT *); @@ -219,6 +219,7 @@ public: void setTabletAbsoluteRange(int a); void setProcessDpiAwareness(QtWindows::ProcessDpiAwareness dpiAwareness); + static int processDpiAwareness(); // Returns a combination of SystemInfoFlags unsigned systemInfo() const; diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index f43265be67..b2781c8212 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -224,7 +224,8 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList ¶mL if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) { m_context.setProcessDpiAwareness(dpiAwareness); qCDebug(lcQpaWindows) - << __FUNCTION__ << "DpiAwareness=" << dpiAwareness; + << __FUNCTION__ << "DpiAwareness=" << dpiAwareness + << "effective process DPI awareness=" << QWindowsContext::processDpiAwareness(); } dpiAwarenessSet = true; } diff --git a/src/plugins/platforms/winrt/qwinrteglcontext.cpp b/src/plugins/platforms/winrt/qwinrteglcontext.cpp index 1008e1c5e8..8ca669141e 100644 --- a/src/plugins/platforms/winrt/qwinrteglcontext.cpp +++ b/src/plugins/platforms/winrt/qwinrteglcontext.cpp @@ -46,6 +46,7 @@ #define EGL_EGLEXT_PROTOTYPES #include +#include #include #include @@ -54,9 +55,6 @@ QT_BEGIN_NAMESPACE struct WinRTEGLDisplay { WinRTEGLDisplay() { - eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (Q_UNLIKELY(eglDisplay == EGL_NO_DISPLAY)) - qCritical("Failed to initialize EGL display: 0x%x", eglGetError()); } ~WinRTEGLDisplay() { eglTerminate(eglDisplay); @@ -117,9 +115,17 @@ void QWinRTEGLContext::initialize() if (Q_UNLIKELY(g->eglDisplay == EGL_NO_DISPLAY)) qCritical("Failed to initialize EGL display: 0x%x", eglGetError()); - if (Q_UNLIKELY(!eglInitialize(g->eglDisplay, nullptr, nullptr))) - qCritical("Failed to initialize EGL: 0x%x", eglGetError()); - + // eglInitialize checks for EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE + // which adds a suspending handler. This needs to be added from the Xaml + // thread itself, otherwise it will not be invoked. add_Suspending does + // not return an error unfortunately, so it silently fails and causes + // applications to not quit when the system wants to terminate the app + // after suspend. + hr = QEventDispatcherWinRT::runOnXamlThread([]() { + if (!eglInitialize(g->eglDisplay, nullptr, nullptr)) + qCritical("Failed to initialize EGL: 0x%x", eglGetError()); + return S_OK; + }); d->eglConfig = q_configFromGLFormat(g->eglDisplay, d->format); const EGLint flags = d->format.testOption(QSurfaceFormat::DebugContext) @@ -142,6 +148,9 @@ bool QWinRTEGLContext::makeCurrent(QPlatformSurface *windowSurface) Q_D(QWinRTEGLContext); Q_ASSERT(windowSurface->surface()->supportsOpenGL()); + if (windowSurface->surface()->surfaceClass() == QSurface::Offscreen) + return false; + QWinRTWindow *window = static_cast(windowSurface); if (window->eglSurface() == EGL_NO_SURFACE) window->createEglSurface(g->eglDisplay, d->eglConfig); diff --git a/src/plugins/platforms/winrt/qwinrtintegration.cpp b/src/plugins/platforms/winrt/qwinrtintegration.cpp index e94a0aa846..71e92f33ca 100644 --- a/src/plugins/platforms/winrt/qwinrtintegration.cpp +++ b/src/plugins/platforms/winrt/qwinrtintegration.cpp @@ -49,6 +49,8 @@ #include #include +#include + #include #include #include @@ -124,7 +126,7 @@ QWinRTIntegration::QWinRTIntegration() : d_ptr(new QWinRTIntegrationPrivate) IID_PPV_ARGS(&d->application)); Q_ASSERT_SUCCEEDED(hr); hr = d->application->add_Suspending(Callback(this, &QWinRTIntegration::onSuspended).Get(), - &d->applicationTokens[&ICoreApplication::remove_Resuming]); + &d->applicationTokens[&ICoreApplication::remove_Suspending]); Q_ASSERT_SUCCEEDED(hr); hr = d->application->add_Resuming(Callback(this, &QWinRTIntegration::onResume).Get(), &d->applicationTokens[&ICoreApplication::remove_Resuming]); @@ -180,10 +182,15 @@ QWinRTIntegration::~QWinRTIntegration() Q_ASSERT_SUCCEEDED(hr); } #endif + // Do not execute this on Windows Phone as the application is already + // shutting down and trying to unregister suspending/resume handler will + // cause exceptions and assert in debug mode +#ifndef Q_OS_WINPHONE for (QHash::const_iterator i = d->applicationTokens.begin(); i != d->applicationTokens.end(); ++i) { hr = (d->application.Get()->*i.key())(i.value()); Q_ASSERT_SUCCEEDED(hr); } +#endif destroyScreen(d->mainScreen); Windows::Foundation::Uninitialize(); } @@ -349,4 +356,14 @@ HRESULT QWinRTIntegration::onResume(IInspectable *, IInspectable *) return S_OK; } +QPlatformOffscreenSurface *QWinRTIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const +{ + // This is only used for shutdown of applications. + // In case we do not return an empty surface the scenegraph will try + // to create a new native window during application exit causing crashes + // or assertions. + return new QPlatformOffscreenSurface(surface); +} + + QT_END_NAMESPACE diff --git a/src/plugins/platforms/winrt/qwinrtintegration.h b/src/plugins/platforms/winrt/qwinrtintegration.h index 5456f6922f..31a3ce7c1c 100644 --- a/src/plugins/platforms/winrt/qwinrtintegration.h +++ b/src/plugins/platforms/winrt/qwinrtintegration.h @@ -98,6 +98,7 @@ public: QStringList themeNames() const Q_DECL_OVERRIDE; QPlatformTheme *createPlatformTheme(const QString &name) const Q_DECL_OVERRIDE; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; private: #ifdef Q_OS_WINPHONE HRESULT onBackButtonPressed(IInspectable *, ABI::Windows::Phone::UI::Input::IBackPressedEventArgs *args); diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp index a642443386..997aa0d86c 100644 --- a/src/plugins/platforms/winrt/qwinrtscreen.cpp +++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp @@ -779,6 +779,7 @@ void QWinRTScreen::addWindow(QWindow *window) d->visibleWindows.prepend(window); QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason); handleExpose(); + QWindowSystemInterface::flushWindowSystemEvents(); } void QWinRTScreen::removeWindow(QWindow *window) @@ -796,6 +797,7 @@ void QWinRTScreen::removeWindow(QWindow *window) if (wasTopWindow) QWindowSystemInterface::handleWindowActivated(window, Qt::OtherFocusReason); handleExpose(); + QWindowSystemInterface::flushWindowSystemEvents(); } void QWinRTScreen::raise(QWindow *window) diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp index 1825a463d0..006df320fe 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp +++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE @@ -172,6 +173,9 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI qWarning() << "QXcbBackingStore: Error while marking the shared memory segment to be destroyed"; } + if (QImage::toPixelFormat(format).alphaUsage() == QPixelFormat::IgnoresAlpha) + format = qt_alphaVersionForPainting(format); + m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, format); m_graphics_buffer = new QXcbShmGraphicsBuffer(&m_qimage); } diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index caddd2b2a5..f3d381b99e 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -70,7 +70,7 @@ QXcbVirtualDesktop::~QXcbVirtualDesktop() QXcbScreen *QXcbVirtualDesktop::screenAt(const QPoint &pos) const { foreach (QXcbScreen *screen, connection()->screens()) { - if (screen->virtualDesktop() == this && screen->nativeGeometry().contains(pos)) + if (screen->virtualDesktop() == this && screen->geometry().contains(pos)) return screen; } return Q_NULLPTR; @@ -198,17 +198,15 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe } else if (xineramaScreenInfo) { m_geometry = QRect(xineramaScreenInfo->x_org, xineramaScreenInfo->y_org, xineramaScreenInfo->width, xineramaScreenInfo->height); - m_nativeGeometry = m_geometry; m_availableGeometry = m_geometry & m_virtualDesktop->workArea(); m_sizeMillimeters = sizeInMillimeters(m_geometry.size(), virtualDpi()); if (xineramaScreenIdx > -1) m_outputName += QLatin1Char('-') + QString::number(xineramaScreenIdx); } - if (m_geometry.isEmpty()) { + if (m_geometry.isEmpty()) m_geometry = QRect(QPoint(), m_virtualSize); - m_nativeGeometry = QRect(QPoint(), m_virtualSize); - } + if (m_availableGeometry.isEmpty()) m_availableGeometry = m_geometry; @@ -557,7 +555,6 @@ void QXcbScreen::updateGeometry(const QRect &geom, uint8_t rotation) qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4); m_pixelDensity = qRound(dpi/96); m_geometry = QRect(xGeometry.topLeft(), xGeometry.size()); - m_nativeGeometry = QRect(xGeometry.topLeft(), xGeometry.size()); m_availableGeometry = xGeometry & m_virtualDesktop->workArea(); QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry); } @@ -828,9 +825,7 @@ QDebug operator<<(QDebug debug, const QXcbScreen *screen) debug << ", screenNumber=" << screen->screenNumber(); debug << ", virtualSize=" << screen->virtualSize().width() << 'x' << screen->virtualSize().height() << " ("; formatSizeF(debug, screen->virtualSize()); - debug << "), nativeGeometry="; - formatRect(debug, screen->nativeGeometry()); - debug << ", orientation=" << screen->orientation(); + debug << "), orientation=" << screen->orientation(); debug << ", depth=" << screen->depth(); debug << ", refreshRate=" << screen->refreshRate(); debug << ", root=" << hex << screen->root(); diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index dd7396aca2..f4de2b9dfd 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -114,7 +114,6 @@ public: QWindow *topLevelAt(const QPoint &point) const Q_DECL_OVERRIDE; QRect geometry() const Q_DECL_OVERRIDE { return m_geometry; } - QRect nativeGeometry() const { return m_nativeGeometry; } 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; @@ -186,7 +185,6 @@ private: QSizeF m_outputSizeMillimeters; QSizeF m_sizeMillimeters; QRect m_geometry; - QRect m_nativeGeometry; QRect m_availableGeometry; QSize m_virtualSize; QSizeF m_virtualSizeMillimeters; diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 587be22915..8d3aef8e07 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -167,7 +167,6 @@ public: virtual void create(); virtual void destroy(); - QXcbScreen *screenForNativeGeometry(const QRect &newGeometry) const; public Q_SLOTS: void updateSyncRequestCounter(); diff --git a/src/widgets/kernel/qdesktopwidget.cpp b/src/widgets/kernel/qdesktopwidget.cpp index b4cb3bae18..e85c6504a7 100644 --- a/src/widgets/kernel/qdesktopwidget.cpp +++ b/src/widgets/kernel/qdesktopwidget.cpp @@ -203,7 +203,7 @@ int QDesktopWidget::screenNumber(const QWidget *w) const return primaryScreen(); // If there is more than one virtual desktop - if (screens.count() != screens.first()->virtualSiblings().count()) { + if (screens.count() != screens.constFirst()->virtualSiblings().count()) { // Find the root widget, get a QScreen from it and use the // virtual siblings for checking the window position. const QWidget *root = w; diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp index 55ceeca919..3eeb6683b1 100644 --- a/src/widgets/util/qcompleter.cpp +++ b/src/widgets/util/qcompleter.cpp @@ -432,7 +432,7 @@ void QCompletionEngine::filter(const QStringList& parts) QModelIndex parent; for (int i = 0; i < curParts.count() - 1; i++) { - QString part = curParts[i]; + QString part = curParts.at(i); int emi = filter(part, parent, -1).exactMatchIndex; if (emi == -1) return; @@ -442,10 +442,10 @@ void QCompletionEngine::filter(const QStringList& parts) // Note that we set the curParent to a valid parent, even if we have no matches // When filtering is disabled, we show all the items under this parent curParent = parent; - if (curParts.last().isEmpty()) + if (curParts.constLast().isEmpty()) curMatch = QMatchData(QIndexMapper(0, model->rowCount(curParent) - 1), -1, false); else - curMatch = filter(curParts.last(), curParent, 1); // build at least one + curMatch = filter(curParts.constLast(), curParent, 1); // build at least one curRow = curMatch.isValid() ? 0 : -1; } diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp index e262f2db22..cad5e6f9e4 100644 --- a/src/widgets/widgets/qdialogbuttonbox.cpp +++ b/src/widgets/widgets/qdialogbuttonbox.cpp @@ -261,7 +261,7 @@ void QDialogButtonBoxPrivate::layoutButtons() if (center) buttonLayout->addStretch(); - QList acceptRoleList = buttonLists[QPlatformDialogHelper::AcceptRole]; + const QList &acceptRoleList = buttonLists[QPlatformDialogHelper::AcceptRole]; while (*currentLayout != QPlatformDialogHelper::EOL) { int role = (*currentLayout & ~QPlatformDialogHelper::Reverse); diff --git a/tests/auto/cmake/test_interface/CMakeLists.txt b/tests/auto/cmake/test_interface/CMakeLists.txt index a8af92da63..2af80ea448 100644 --- a/tests/auto/cmake/test_interface/CMakeLists.txt +++ b/tests/auto/cmake/test_interface/CMakeLists.txt @@ -8,6 +8,8 @@ find_package(Qt5Widgets) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") + add_executable(test_interface_exe WIN32 main.cpp mainwindow.cpp) # No need to specify include directories, compile definitions, the PIC flag, or to diff --git a/tests/auto/cmake/test_multiple_find_package/CMakeLists.txt b/tests/auto/cmake/test_multiple_find_package/CMakeLists.txt index c0fdfd6b9a..6b11c09e7b 100644 --- a/tests/auto/cmake/test_multiple_find_package/CMakeLists.txt +++ b/tests/auto/cmake/test_multiple_find_package/CMakeLists.txt @@ -9,5 +9,5 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") add_subdirectory(subdir1) -add_executable(exe1 "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp") -include_directories(${Qt5Core_INCLUDE_DIRS}) +add_executable(exe1 main.cpp) +target_link_libraries(exe1 Qt5::Core) diff --git a/tests/auto/cmake/test_multiple_find_package/subdir1/CMakeLists.txt b/tests/auto/cmake/test_multiple_find_package/subdir1/CMakeLists.txt index 0c7a113f50..dfcc35d735 100644 --- a/tests/auto/cmake/test_multiple_find_package/subdir1/CMakeLists.txt +++ b/tests/auto/cmake/test_multiple_find_package/subdir1/CMakeLists.txt @@ -2,4 +2,4 @@ find_package(Qt5Core REQUIRED) add_executable(exe2 "${CMAKE_CURRENT_SOURCE_DIR}/../main.cpp") -include_directories(${Qt5Core_INCLUDE_DIRS}) +target_link_libraries(exe2 Qt5::Core) diff --git a/tests/auto/cmake/test_platform_defs_include/CMakeLists.txt b/tests/auto/cmake/test_platform_defs_include/CMakeLists.txt index 2b32a419e7..e2f72842f6 100644 --- a/tests/auto/cmake/test_platform_defs_include/CMakeLists.txt +++ b/tests/auto/cmake/test_platform_defs_include/CMakeLists.txt @@ -11,3 +11,4 @@ add_definitions(${Qt5Core_DEFINITIONS}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") add_executable(myobject main.cpp) +target_link_libraries(myobject Qt5::Core) diff --git a/tests/auto/cmake/test_use_modules_function/CMakeLists.txt b/tests/auto/cmake/test_use_modules_function/CMakeLists.txt index bfcdd9d1d7..be05c75054 100644 --- a/tests/auto/cmake/test_use_modules_function/CMakeLists.txt +++ b/tests/auto/cmake/test_use_modules_function/CMakeLists.txt @@ -12,5 +12,7 @@ add_executable(three three.cpp) find_package(Qt5Core) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") + qt5_use_modules(two Test) qt5_use_modules(three Gui Test) diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 846f560214..bbca60a80e 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -1736,12 +1736,16 @@ void tst_QVariant::compareNumbers_data() const QTest::newRow("float3") << qVariantFromValue(0.f) << qVariantFromValue(-1.f) << +1; QTest::newRow("float4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.f) << -1; QTest::newRow("float5") << qVariantFromValue(0.f) << qVariantFromValue(-float(qInf())) << +1; + QTest::newRow("float6") << qVariantFromValue(-float(qInf())) << qVariantFromValue(-float(qInf())) << 0; + QTest::newRow("float7") << qVariantFromValue(float(qInf())) << qVariantFromValue(float(qInf())) << 0; QTest::newRow("double1") << qVariantFromValue(0.) << qVariantFromValue(0.) << 0; QTest::newRow("double2") << qVariantFromValue(-1.) << qVariantFromValue(0.) << -1; QTest::newRow("double3") << qVariantFromValue(0.) << qVariantFromValue(-1.) << +1; QTest::newRow("double4") << qVariantFromValue(-qInf()) << qVariantFromValue(0.) << -1; QTest::newRow("double5") << qVariantFromValue(0.) << qVariantFromValue(-qInf()) << +1; + QTest::newRow("double6") << qVariantFromValue(-double(qInf())) << qVariantFromValue(-qInf()) << 0; + QTest::newRow("double7") << qVariantFromValue(qInf()) << qVariantFromValue(qInf()) << 0; // mixed comparisons // fp + fp @@ -1750,6 +1754,8 @@ void tst_QVariant::compareNumbers_data() const QTest::newRow("float+double3") << qVariantFromValue(0.f) << qVariantFromValue(-1.) << +1; QTest::newRow("float+double4") << qVariantFromValue(-float(qInf())) << qVariantFromValue(0.) << -1; QTest::newRow("float+double5") << qVariantFromValue(0.f) << qVariantFromValue(-qInf()) << +1; + QTest::newRow("float+double6") << qVariantFromValue(-float(qInf())) << qVariantFromValue(qInf()) << 0; + QTest::newRow("float+double7") << qVariantFromValue(float(qInf())) << qVariantFromValue(qInf()) << 0; // fp + int QTest::newRow("float+int1") << qVariantFromValue(0.f) << qVariantFromValue(0) << 0; @@ -1760,6 +1766,7 @@ void tst_QVariant::compareNumbers_data() const QTest::newRow("double+int3") << qVariantFromValue(0.) << qVariantFromValue(-1) << +1; QTest::newRow("float+int4") << qVariantFromValue(1.5f) << qVariantFromValue(1) << +1; QTest::newRow("double+int4") << qVariantFromValue(1.5) << qVariantFromValue(1) << +1; + QTest::newRow("double+int5") << qVariantFromValue(qInf()) << qVariantFromValue(1) << +1; // fp + uint QTest::newRow("float+uint1") << qVariantFromValue(0.f) << qVariantFromValue(0U) << 0; diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp index 27988e5b5b..ba7586c3db 100644 --- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp +++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp @@ -392,16 +392,37 @@ void tst_QDate::weekNumber_data() QTest::addColumn("month"); QTest::addColumn("day"); - //next we fill it with data - QTest::newRow( "data0" ) << 10 << 2002 << 2002 << 3 << 8; - QTest::newRow( "data1" ) << 10 << 2002 << 2002 << 3 << 8; - QTest::newRow( "data2" ) << 52 << 1999 << 2000 << 1 << 1; - QTest::newRow( "data3" ) << 52 << 1999 << 1999 << 12 << 31; - QTest::newRow( "data4" ) << 1 << 2001 << 2001 << 1 << 1; - QTest::newRow( "data5" ) << 53 << 1998 << 1998 << 12 << 31; - QTest::newRow( "data6" ) << 1 << 1985 << 1984 << 12 << 31; - QTest::newRow( "data7" ) << 52 << 2006 << 2006 << 12 << 31; - QTest::newRow( "data8" ) << 53 << 2004 << 2005 << 1 << 1; + enum { Thursday = 4 }; + bool wasLastYearLong = false; // 1999 was not a long (53-week) year + bool isLongYear; + + // full 400-year cycle for Jan 1, 4 and Dec 28, 31 + for (int yr = 2000; yr < 2400; ++yr, wasLastYearLong = isLongYear) { + QByteArray yrstr = QByteArray::number(yr); + int wday = QDate(yr, 1, 1).dayOfWeek(); + + // the year is 53-week long if Jan 1 is Thursday or, if it's a leap year, a Wednesday + isLongYear = (wday == Thursday) || (QDate::isLeapYear(yr) && wday == Thursday - 1); + + // Jan 4 is always on week 1 + QTest::newRow(yrstr + "-01-04") << 1 << yr << yr << 1 << 4; + + // Dec 28 is always on the last week + QTest::newRow(yrstr + "-12-28") << (52 + isLongYear) << yr << yr << 12 << 28; + + // Jan 1 is on either on week 1 or on the last week of the previous year + QTest::newRow(yrstr + "-01-01") + << (wday <= Thursday ? 1 : 52 + wasLastYearLong) + << (wday <= Thursday ? yr : yr - 1) + << yr << 1 << 1; + + // Dec 31 is either on the last week or week 1 of the next year + wday = QDate(yr, 12, 31).dayOfWeek(); + QTest::newRow(yrstr + "-12-31") + << (wday >= Thursday ? 52 + isLongYear : 1) + << (wday >= Thursday ? yr : yr + 1) + << yr << 12 << 31; + } } void tst_QDate::weekNumber() diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index 906129d1af..0088820b41 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -68,6 +68,7 @@ private slots: void timeSpec(); void toTime_t_data(); void toTime_t(); + void daylightSavingsTimeChange_data(); void daylightSavingsTimeChange(); void springForward_data(); void springForward(); @@ -1563,36 +1564,47 @@ void tst_QDateTime::toTime_t() } } +void tst_QDateTime::daylightSavingsTimeChange_data() +{ + QTest::addColumn("inDST"); + QTest::addColumn("outDST"); + QTest::newRow("Autumn") << QDate(2006, 8, 1) << QDate(2006, 12, 1); + QTest::newRow("Spring") << QDate(2006, 5, 1) << QDate(2006, 2, 1); +} + void tst_QDateTime::daylightSavingsTimeChange() { - // This is a regression test for an old bug where starting with a date in - // DST and then moving to a date outside it (or vice-versa) caused 1-hour - // jumps in time when addSecs() was called. + // This has grown from a regression test for an old bug where starting with + // a date in DST and then moving to a date outside it (or vice-versa) caused + // 1-hour jumps in time when addSecs() was called. // // The bug was caused by QDateTime knowing more than it lets show. // Internally, if it knows, QDateTime stores a flag indicating if the time is // DST or not. If it doesn't, it sets to "LocalUnknown". The problem happened // because some functions did not reset the flag when moving in or out of DST. - // WARNING: This test only works if there's a Daylight Savings Time change - // in the current locale between 2006-11-06 and 2006-10-16 - // This is true for Central European Time + // WARNING: This only tests anything if there's a Daylight Savings Time change + // in the current locale between inDST and outDST. + // This is true for Central European Time and may be elsewhere. - if (!europeanTimeZone) - QSKIP("Not tested with timezone other than Central European (CET/CEST)"); + QFETCH(QDate, inDST); + QFETCH(QDate, outDST); - QDateTime dt = QDateTime(QDate(2006, 11, 6), QTime(0, 0, 0), Qt::LocalTime); - dt.setDate(QDate(2006, 10, 16)); + // First with simple construction + QDateTime dt = QDateTime(outDST, QTime(0, 0, 0), Qt::LocalTime); + int outDSTsecs = dt.toTime_t(); + + dt.setDate(inDST); dt = dt.addSecs(1); - QCOMPARE(dt.date(), QDate(2006, 10, 16)); - QCOMPARE(dt.time(), QTime(0, 0, 1)); + QCOMPARE(dt, QDateTime(inDST, QTime(0, 0, 1))); // now using fromTime_t - dt = QDateTime::fromTime_t(1162767600); // 2006-11-06 00:00:00 +0100 - dt.setDate(QDate(2006, 10, 16)); - dt = dt.addSecs (1); - QCOMPARE(dt.date(), QDate(2006, 10, 16)); - QCOMPARE(dt.time(), QTime(0, 0, 1)); + dt = QDateTime::fromTime_t(outDSTsecs); + QCOMPARE(dt, QDateTime(outDST, QTime(0, 0, 0))); + + dt.setDate(inDST); + dt = dt.addSecs(60); + QCOMPARE(dt, QDateTime(inDST, QTime(0, 1, 0))); } void tst_QDateTime::springForward_data() diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp index aa17d71d60..7cd8c875ec 100644 --- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp +++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp @@ -71,7 +71,6 @@ void tst_QDBusConnection::noConnection() QVERIFY(con.callWithCallback(msg, &spy, SLOT(asyncReply)) == 0); QDBusMessage reply = con.call(msg); - QCOMPARE(msg.serial(), reply.replySerial()); QCOMPARE(reply.type(), QDBusMessage::ErrorMessage); QDBusReply voidreply(reply); @@ -153,7 +152,6 @@ void tst_QDBusConnection::send() QDBusMessage reply = con.call(msg); - QCOMPARE(msg.serial(), reply.replySerial()); QCOMPARE(reply.arguments().count(), 1); QCOMPARE(reply.arguments().at(0).typeName(), "QStringList"); QVERIFY(reply.arguments().at(0).toStringList().contains(con.baseService())); @@ -173,7 +171,6 @@ void tst_QDBusConnection::sendWithGui() QDBusMessage reply = con.call(msg, QDBus::BlockWithGui); - QCOMPARE(msg.serial(), reply.replySerial()); QCOMPARE(reply.arguments().count(), 1); QCOMPARE(reply.arguments().at(0).typeName(), "QStringList"); QVERIFY(reply.arguments().at(0).toStringList().contains(con.baseService())); @@ -843,7 +840,6 @@ void tst_QDBusConnection::callSelf() QString(), "test3"); msg << 44; reply = connection.call(msg); - QCOMPARE(msg.serial(), reply.replySerial()); QCOMPARE(reply.arguments().value(0).toInt(), 45); } @@ -911,7 +907,6 @@ void tst_QDBusConnection::callSelfByAnotherName() QString(), "test0"); QDBusMessage reply = con.call(msg, QDBus::Block, 1000); - QCOMPARE(msg.serial(), reply.replySerial()); QCOMPARE(reply.type(), QDBusMessage::ReplyMessage); } @@ -927,7 +922,6 @@ void tst_QDBusConnection::multipleInterfacesInQObject() QDBusMessage msg = QDBusMessage::createMethodCall(con.baseService(), "/p1", "local.BaseObject", "anotherMethod"); QDBusMessage reply = con.call(msg, QDBus::Block); - QCOMPARE(msg.serial(), reply.replySerial()); QCOMPARE(reply.type(), QDBusMessage::ReplyMessage); QCOMPARE(reply.arguments().count(), 0); } @@ -1208,7 +1202,6 @@ void tst_QDBusConnection::callVirtualObjectLocal() QDBusMessage message = QDBusMessage::createMethodCall(con.baseService(), path, QString(), "hello"); QDBusMessage reply = con.call(message, QDBus::Block, 5000); - QCOMPARE(message.serial(), reply.replySerial()); QCOMPARE(obj.callCount, 1); QCOMPARE(obj.lastMessage.service(), con.baseService()); QCOMPARE(obj.lastMessage.interface(), QString()); diff --git a/tests/auto/gui/kernel/qclipboard/test/test.pro b/tests/auto/gui/kernel/qclipboard/test/test.pro index f27c582de2..40bf9c8d8e 100644 --- a/tests/auto/gui/kernel/qclipboard/test/test.pro +++ b/tests/auto/gui/kernel/qclipboard/test/test.pro @@ -3,6 +3,8 @@ SOURCES += ../tst_qclipboard.cpp TARGET = ../tst_qclipboard QT += testlib +osx: LIBS += -framework AppKit + win32 { CONFIG(debug, debug|release) { TARGET = ../../debug/tst_qclipboard diff --git a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp b/tests/auto/opengl/qglthreads/tst_qglthreads.cpp index 7b7064529f..1dafa2779c 100644 --- a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp +++ b/tests/auto/opengl/qglthreads/tst_qglthreads.cpp @@ -805,7 +805,6 @@ void tst_QGLThreads::painterOnFboInThread() int main(int argc, char **argv) { - QApplication::setAttribute(Qt::AA_X11InitThreads); QApplication app(argc, argv); QTEST_DISABLE_KEYPAD_NAVIGATION \ diff --git a/tests/auto/other/macgui/macgui.pro b/tests/auto/other/macgui/macgui.pro index b557806555..75e0d595cb 100644 --- a/tests/auto/other/macgui/macgui.pro +++ b/tests/auto/other/macgui/macgui.pro @@ -6,4 +6,6 @@ HEADERS += guitest.h QT = core-private widgets-private testlib +osx: LIBS += -framework ApplicationServices + requires(mac) diff --git a/tests/auto/widgets/widgets/qlineedit/qlineedit.pro b/tests/auto/widgets/widgets/qlineedit/qlineedit.pro index 715dcb9550..636208d67a 100644 --- a/tests/auto/widgets/widgets/qlineedit/qlineedit.pro +++ b/tests/auto/widgets/widgets/qlineedit/qlineedit.pro @@ -3,3 +3,4 @@ TARGET = tst_qlineedit QT += gui-private core-private widgets widgets-private testlib SOURCES += tst_qlineedit.cpp +osx: LIBS += -framework AppKit diff --git a/tests/auto/widgets/widgets/qplaintextedit/qplaintextedit.pro b/tests/auto/widgets/widgets/qplaintextedit/qplaintextedit.pro index e98bae2089..be4102ec75 100644 --- a/tests/auto/widgets/widgets/qplaintextedit/qplaintextedit.pro +++ b/tests/auto/widgets/widgets/qplaintextedit/qplaintextedit.pro @@ -9,3 +9,4 @@ INCLUDEPATH += ../ HEADERS += SOURCES += tst_qplaintextedit.cpp +osx: LIBS += -framework AppKit diff --git a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro index 6e0fff17d5..8b39ab59b7 100644 --- a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro +++ b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro @@ -4,3 +4,5 @@ TARGET = tst_qtextedit QT += widgets widgets-private gui-private core-private testlib SOURCES += tst_qtextedit.cpp + +osx: LIBS += -framework AppKit diff --git a/tests/manual/diaglib/nativewindowdump_win.cpp b/tests/manual/diaglib/nativewindowdump_win.cpp index e3885eb96d..b25f8aa864 100644 --- a/tests/manual/diaglib/nativewindowdump_win.cpp +++ b/tests/manual/diaglib/nativewindowdump_win.cpp @@ -48,9 +48,10 @@ namespace QtDiag { struct DumpContext { - DumpContext() : indentation(0) {} + DumpContext() : indentation(0), parent(0) {} int indentation; + HWND parent; QSharedPointer stream; }; @@ -64,11 +65,19 @@ static void formatNativeWindow(HWND hwnd, QTextStream &str) RECT rect; if (GetWindowRect(hwnd, &rect)) { str << ' ' << (rect.right - rect.left) << 'x' << (rect.bottom - rect.top) - << '+' << rect.left << '+' << rect.top; + << forcesign << rect.left << rect.top << noforcesign; } if (IsWindowVisible(hwnd)) str << " [visible]"; + wchar_t buf[512]; + if (GetWindowText(hwnd, buf, sizeof(buf)/sizeof(buf[0])) && buf[0]) + str << " title=\"" << QString::fromWCharArray(buf) << "\"/"; + else + str << ' '; + if (GetClassName(hwnd, buf, sizeof(buf)/sizeof(buf[0]))) + str << '"' << QString::fromWCharArray(buf) << '"'; + str << hex << showbase; if (const LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE)) { str << " style=" << style; @@ -121,13 +130,31 @@ static void formatNativeWindow(HWND hwnd, QTextStream &str) debugWinStyle(str, exStyle, WS_EX_COMPOSITED) debugWinStyle(str, exStyle, WS_EX_NOACTIVATE) } + + if (const ULONG_PTR classStyle = GetClassLongPtr(hwnd, GCL_STYLE)) { + str << " classStyle=" << classStyle; + debugWinStyle(str, classStyle, CS_BYTEALIGNCLIENT) + debugWinStyle(str, classStyle, CS_BYTEALIGNWINDOW) + debugWinStyle(str, classStyle, CS_CLASSDC) + debugWinStyle(str, classStyle, CS_DBLCLKS) + debugWinStyle(str, classStyle, CS_DROPSHADOW) + debugWinStyle(str, classStyle, CS_GLOBALCLASS) + debugWinStyle(str, classStyle, CS_HREDRAW) + debugWinStyle(str, classStyle, CS_NOCLOSE) + debugWinStyle(str, classStyle, CS_OWNDC) + debugWinStyle(str, classStyle, CS_PARENTDC) + debugWinStyle(str, classStyle, CS_SAVEBITS) + debugWinStyle(str, classStyle, CS_VREDRAW) + } + + if (const ULONG_PTR wndProc = GetClassLongPtr(hwnd, GCLP_WNDPROC)) + str << " wndProc=" << wndProc; + str << noshowbase << dec; - wchar_t buf[512]; - if (GetWindowText(hwnd, buf, sizeof(buf)/sizeof(buf[0]))) - str << " title=\"" << QString::fromWCharArray(buf) << '"'; - if (GetClassName(hwnd, buf, sizeof(buf)/sizeof(buf[0]))) - str << " class=\"" << QString::fromWCharArray(buf) << '"'; + if (GetWindowModuleFileName(hwnd, buf, sizeof(buf)/sizeof(buf[0]))) + str << " module=\"" << QString::fromWCharArray(buf) << '"'; + str << '\n'; } @@ -135,7 +162,11 @@ static void dumpNativeWindowRecursion(HWND hwnd, DumpContext *dc); BOOL CALLBACK dumpWindowEnumChildProc(HWND hwnd, LPARAM lParam) { - dumpNativeWindowRecursion(hwnd, reinterpret_cast(lParam)); + DumpContext *dumpContext = reinterpret_cast(lParam); + // EnumChildWindows enumerates grand children as well, skip these to + // get the hierarchical formatting right. + if (GetAncestor(hwnd, GA_PARENT) == dumpContext->parent) + dumpNativeWindowRecursion(hwnd, dumpContext); return TRUE; } @@ -145,6 +176,7 @@ static void dumpNativeWindowRecursion(HWND hwnd, DumpContext *dc) formatNativeWindow(hwnd, *dc->stream); DumpContext nextLevel = *dc; nextLevel.indentation += 2; + nextLevel.parent = hwnd; EnumChildWindows(hwnd, dumpWindowEnumChildProc, reinterpret_cast(&nextLevel)); }