From 700ea0af687d90ef98d3e9bee57e164174cce4e4 Mon Sep 17 00:00:00 2001 From: Frederik Schwarzer Date: Fri, 28 Oct 2016 11:39:34 +0200 Subject: [PATCH 001/136] QMainWindow: fix wording in apidoc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I5cb44bed7e946574eb3e08ff51948f901b2bb78c Reviewed-by: Topi Reiniö --- src/widgets/widgets/qmainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp index e454e3e991b..aefd0283055 100644 --- a/src/widgets/widgets/qmainwindow.cpp +++ b/src/widgets/widgets/qmainwindow.cpp @@ -320,7 +320,7 @@ void QMainWindowPrivate::init() direction. Two dock widgets may also be stacked on top of each other. A - QTabBar is then used to select which of the widgets that should be + QTabBar is then used to select which of the widgets should be displayed. We give an example of how to create and add dock widgets to a From 1df45820d4ccbb67b9ad0f3eed167342f2917cf8 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Fri, 23 Sep 2016 14:20:16 +0200 Subject: [PATCH 002/136] doc: Document two undocumented functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change provides missing documentation for two member functions of QString. QString QString::fromUtf16(const char16_t *str, int size) QString QString::fromUcs4(const char32_t *str, int size) Change-Id: I94a9437a457062e49e4457f5876e4d7c31fff24c Reviewed-by: André Hartmann Reviewed-by: Topi Reiniö --- src/corelib/tools/qstring.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index b7f83e4b9d7..645d213d821 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -4818,6 +4818,39 @@ QString QString::fromUtf16(const ushort *unicode, int size) return QUtf16::convertToUnicode((const char *)unicode, size*2, 0); } +/*! + \fn QString QString::fromUtf16(const char16_t *str, int size) + \since 5.3 + + Returns a QString initialized with the first \a size characters + of the Unicode string \a str (ISO-10646-UTF-16 encoded). + + If \a size is -1 (default), \a str must be terminated + with a 0. + + This function checks for a Byte Order Mark (BOM). If it is missing, + host byte order is assumed. + + This function is slow compared to the other Unicode conversions. + Use QString(const QChar *, int) or QString(const QChar *) if possible. + + QString makes a deep copy of the Unicode data. + + \sa utf16(), setUtf16(), fromStdU16String() +*/ + +/*! + \fn QString QString::fromUcs4(const char32_t *str, int size) + \since 5.3 + + Returns a QString initialized with the first \a size characters + of the Unicode string \a str (ISO-10646-UCS-4 encoded). + + If \a size is -1 (default), \a str must be terminated + with a 0. + + \sa toUcs4(), fromUtf16(), utf16(), setUtf16(), fromWCharArray(), fromStdU32String() +*/ /*! \since 4.2 From c34d289c449dc8624f31bade882d6f808dae20a1 Mon Sep 17 00:00:00 2001 From: Joni Poikelin Date: Wed, 12 Oct 2016 13:35:37 +0300 Subject: [PATCH 003/136] Fix building when lex source refers to a file generated by yacc Scan lex and yacc sources for dependencies as if they were C source code, which is close enough to reality. This will unfortunately result in the generated source files depending on the generated headers, while it should have been the object files created from these sources which have that dependency. But qmake cannot do better, and this is good enough. Task-number: QTBUG-56507 Change-Id: Ic3e1941bf2e2820bfddf99deba854e1e82f83669 Reviewed-by: Oswald Buddenhagen --- mkspecs/features/lex.prf | 1 + mkspecs/features/yacc.prf | 1 + 2 files changed, 2 insertions(+) diff --git a/mkspecs/features/lex.prf b/mkspecs/features/lex.prf index 16d3a6aa94f..7d8325bedb8 100644 --- a/mkspecs/features/lex.prf +++ b/mkspecs/features/lex.prf @@ -5,6 +5,7 @@ { lex.name = Lex ${QMAKE_FILE_IN} lex.input = LEXSOURCES + lex.dependency_type = TYPE_C lex_included { lex.CONFIG += no_link } else { diff --git a/mkspecs/features/yacc.prf b/mkspecs/features/yacc.prf index e78dd8cbb38..72cb5c2f3af 100644 --- a/mkspecs/features/yacc.prf +++ b/mkspecs/features/yacc.prf @@ -35,6 +35,7 @@ yacc_impl.name = source for ${QMAKE_FILE_IN} yacc_impl.input = YACCSOURCES yacc_impl.variable_out = GENERATED_SOURCES + yacc_impl.dependency_type = TYPE_C yacc_impl.commands = $$escape_expand(\\n) # We don't want any commands where, but if command is empty no rules are created yacc_impl.depends = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} # Make sure we depend on the step above yacc_impl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)} # Faked output from this step, output really created in step above From 99cebe717c5d92567a9ee1ca284b7c243ad38c68 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 31 Oct 2016 10:25:45 +0100 Subject: [PATCH 004/136] Update bookmarks in the XML bookmarks examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update URLs in jennifer.xbel and remove frank.xbel, which has too many outdated URLs Change-Id: I8cbc1e3988f45230f849e68202780c76cf4353d9 Reviewed-by: Topi Reiniö --- examples/xml/dombookmarks/frank.xbel | 230 --------------------- examples/xml/dombookmarks/jennifer.xbel | 62 ++---- examples/xml/saxbookmarks/frank.xbel | 230 --------------------- examples/xml/saxbookmarks/jennifer.xbel | 62 ++---- examples/xml/streambookmarks/frank.xbel | 230 --------------------- examples/xml/streambookmarks/jennifer.xbel | 62 ++---- 6 files changed, 57 insertions(+), 819 deletions(-) delete mode 100644 examples/xml/dombookmarks/frank.xbel delete mode 100644 examples/xml/saxbookmarks/frank.xbel delete mode 100644 examples/xml/streambookmarks/frank.xbel diff --git a/examples/xml/dombookmarks/frank.xbel b/examples/xml/dombookmarks/frank.xbel deleted file mode 100644 index 2fd5c2e09df..00000000000 --- a/examples/xml/dombookmarks/frank.xbel +++ /dev/null @@ -1,230 +0,0 @@ - - - - - Literate Programming - - Synopsis of Literate Programming - - - Literate Programming: Propaganda and Tools - - - Literate Programming by Henrik Turbell - - - Literate Programming Library - - - Literate Programming Basics - - - Literate Programming Overview - - - POD is not Literate Programming - - - Computers That We Can Count On - - - Literate Programming - Issues and Problems - - - Literate Programming - Wiki Pages - - - What is well-commented code? - - - Bibliography on literate programming - A searchable bibliography - - - Program comprehension and code reading bibliography - - - Elucidative Programming - - - AVL Trees (TexiWeb) - - - Literate Programming on Wikiverse - - - Physically Based Rendering: From Theory to Implementation - - - - Useful C++ Links - - STL - - STL Reference Documentation - - - STL Tutorial - - - STL Reference - - - - Qt - - Qt 2.3 Reference - - - Qt 3.3 Reference - - - Qt 4.0 Reference - - - Qt Home Page - - - - IOStreams - - IO Stream Library - - - Binary I/O - - - I/O Stream FAQ - - - - gdb - - GDB Tutorial - - - Debugging with GDB - - - GDB Quick Reference Page (PDF) (Handy) - - - - Classes and Constructors - - Constructor FAQ - - - Organizing Classes - - - - - Software Documentation or System Documentation - - The Almighty Thud - - - Microsoft Coding Techniques and Programming Practices - - - Software and Documentation - - - The Source Code is the Design - - - What is Software Design? - - - How To Write Unmaintainable Code - - - Self Documenting Program Code Remains a Distant Goal - - - Place Tab A in Slot B - - - UML Reference Card - - - - TeX Resources - - The TeX User's Group - - - MikTeX website - - - MetaPost website - - - HEVEA is a quite complete and fast LATEX to HTML translator - - - - Portable Document Format (PDF) - - Adobe - The postscript and PDF standards - - - Reference Manual Portable Document Format - - - Adobe Acrobat Software Development Kit - - - - Literature Sites - - Guide to Special Collections (Columbia University) - - - Literary Criticism on the Web from the Internet Public Library - - - Victorian Web. - - - Voice of the Shuttle. - - - Modernist Journals Project - - - Museum of American Poetics - - - Modern American Poetry - - - FindArticles.com - - - Literary History - - - Literary Encyclopedia - - - - The University of California Press - - - Wright American Fiction, 1851-1875 - - - Documenting the American South: Beginnings to 1920 - - - Electronic Text Center at the University of Virginia - - - The Schomburg Center for Research in Black Culture - - - Alex Catalogue of Electronic Texts. - - - diff --git a/examples/xml/dombookmarks/jennifer.xbel b/examples/xml/dombookmarks/jennifer.xbel index 74b7f1519f4..2501c118af0 100644 --- a/examples/xml/dombookmarks/jennifer.xbel +++ b/examples/xml/dombookmarks/jennifer.xbel @@ -3,60 +3,42 @@ Qt Resources - + + Qt home page + + Qt Partners - - Training Partners - - - Consultants and System Integrators - - - Technology Partners - - - Value Added Resellers (VARs) - - + + + Training + + + Qt 5 documentation + + + Frequently Asked Questions + Community Resources + + Qt Centre + QtForum.org - + The Independent Qt Tutorial - - French PROG.Qt - German Qt Forum Korean Qt Community Site - + Russian Qt Forum - - Digitalfanatics: The QT 4 Resource Center - - - QtQuestions - - - Qt Quarterly - - - Qt home page - - - Qt 4.0 documentation - - - Frequently Asked Questions - Online Dictionaries @@ -73,9 +55,6 @@ OneLook Dictionary Search - - The New English-German Dictionary - TU Chemnitz German-English Dictionary @@ -86,8 +65,5 @@ Dictionnaire de l'Académie Française - - Dictionnaire des synonymes - diff --git a/examples/xml/saxbookmarks/frank.xbel b/examples/xml/saxbookmarks/frank.xbel deleted file mode 100644 index 2fd5c2e09df..00000000000 --- a/examples/xml/saxbookmarks/frank.xbel +++ /dev/null @@ -1,230 +0,0 @@ - - - - - Literate Programming - - Synopsis of Literate Programming - - - Literate Programming: Propaganda and Tools - - - Literate Programming by Henrik Turbell - - - Literate Programming Library - - - Literate Programming Basics - - - Literate Programming Overview - - - POD is not Literate Programming - - - Computers That We Can Count On - - - Literate Programming - Issues and Problems - - - Literate Programming - Wiki Pages - - - What is well-commented code? - - - Bibliography on literate programming - A searchable bibliography - - - Program comprehension and code reading bibliography - - - Elucidative Programming - - - AVL Trees (TexiWeb) - - - Literate Programming on Wikiverse - - - Physically Based Rendering: From Theory to Implementation - - - - Useful C++ Links - - STL - - STL Reference Documentation - - - STL Tutorial - - - STL Reference - - - - Qt - - Qt 2.3 Reference - - - Qt 3.3 Reference - - - Qt 4.0 Reference - - - Qt Home Page - - - - IOStreams - - IO Stream Library - - - Binary I/O - - - I/O Stream FAQ - - - - gdb - - GDB Tutorial - - - Debugging with GDB - - - GDB Quick Reference Page (PDF) (Handy) - - - - Classes and Constructors - - Constructor FAQ - - - Organizing Classes - - - - - Software Documentation or System Documentation - - The Almighty Thud - - - Microsoft Coding Techniques and Programming Practices - - - Software and Documentation - - - The Source Code is the Design - - - What is Software Design? - - - How To Write Unmaintainable Code - - - Self Documenting Program Code Remains a Distant Goal - - - Place Tab A in Slot B - - - UML Reference Card - - - - TeX Resources - - The TeX User's Group - - - MikTeX website - - - MetaPost website - - - HEVEA is a quite complete and fast LATEX to HTML translator - - - - Portable Document Format (PDF) - - Adobe - The postscript and PDF standards - - - Reference Manual Portable Document Format - - - Adobe Acrobat Software Development Kit - - - - Literature Sites - - Guide to Special Collections (Columbia University) - - - Literary Criticism on the Web from the Internet Public Library - - - Victorian Web. - - - Voice of the Shuttle. - - - Modernist Journals Project - - - Museum of American Poetics - - - Modern American Poetry - - - FindArticles.com - - - Literary History - - - Literary Encyclopedia - - - - The University of California Press - - - Wright American Fiction, 1851-1875 - - - Documenting the American South: Beginnings to 1920 - - - Electronic Text Center at the University of Virginia - - - The Schomburg Center for Research in Black Culture - - - Alex Catalogue of Electronic Texts. - - - diff --git a/examples/xml/saxbookmarks/jennifer.xbel b/examples/xml/saxbookmarks/jennifer.xbel index d37b8224df8..2501c118af0 100644 --- a/examples/xml/saxbookmarks/jennifer.xbel +++ b/examples/xml/saxbookmarks/jennifer.xbel @@ -3,60 +3,42 @@ Qt Resources - + + Qt home page + + Qt Partners - - Training Partners - - - Consultants and System Integrators - - - Technology Partners - - - Value Added Resellers (VARs) - - + + + Training + + + Qt 5 documentation + + + Frequently Asked Questions + Community Resources + + Qt Centre + QtForum.org - + The Independent Qt Tutorial - - French PROG.Qt - German Qt Forum Korean Qt Community Site - + Russian Qt Forum - - Digitalfanatics: The QT 4 Resource Center - - - QtQuestions - - - Qt Quarterly - - - qt home page - - - Qt 4.0 documentation - - - Frequently Asked Questions - Online Dictionaries @@ -73,9 +55,6 @@ OneLook Dictionary Search - - The New English-German Dictionary - TU Chemnitz German-English Dictionary @@ -86,8 +65,5 @@ Dictionnaire de l'Académie Française - - Dictionnaire des synonymes - diff --git a/examples/xml/streambookmarks/frank.xbel b/examples/xml/streambookmarks/frank.xbel deleted file mode 100644 index 2fd5c2e09df..00000000000 --- a/examples/xml/streambookmarks/frank.xbel +++ /dev/null @@ -1,230 +0,0 @@ - - - - - Literate Programming - - Synopsis of Literate Programming - - - Literate Programming: Propaganda and Tools - - - Literate Programming by Henrik Turbell - - - Literate Programming Library - - - Literate Programming Basics - - - Literate Programming Overview - - - POD is not Literate Programming - - - Computers That We Can Count On - - - Literate Programming - Issues and Problems - - - Literate Programming - Wiki Pages - - - What is well-commented code? - - - Bibliography on literate programming - A searchable bibliography - - - Program comprehension and code reading bibliography - - - Elucidative Programming - - - AVL Trees (TexiWeb) - - - Literate Programming on Wikiverse - - - Physically Based Rendering: From Theory to Implementation - - - - Useful C++ Links - - STL - - STL Reference Documentation - - - STL Tutorial - - - STL Reference - - - - Qt - - Qt 2.3 Reference - - - Qt 3.3 Reference - - - Qt 4.0 Reference - - - Qt Home Page - - - - IOStreams - - IO Stream Library - - - Binary I/O - - - I/O Stream FAQ - - - - gdb - - GDB Tutorial - - - Debugging with GDB - - - GDB Quick Reference Page (PDF) (Handy) - - - - Classes and Constructors - - Constructor FAQ - - - Organizing Classes - - - - - Software Documentation or System Documentation - - The Almighty Thud - - - Microsoft Coding Techniques and Programming Practices - - - Software and Documentation - - - The Source Code is the Design - - - What is Software Design? - - - How To Write Unmaintainable Code - - - Self Documenting Program Code Remains a Distant Goal - - - Place Tab A in Slot B - - - UML Reference Card - - - - TeX Resources - - The TeX User's Group - - - MikTeX website - - - MetaPost website - - - HEVEA is a quite complete and fast LATEX to HTML translator - - - - Portable Document Format (PDF) - - Adobe - The postscript and PDF standards - - - Reference Manual Portable Document Format - - - Adobe Acrobat Software Development Kit - - - - Literature Sites - - Guide to Special Collections (Columbia University) - - - Literary Criticism on the Web from the Internet Public Library - - - Victorian Web. - - - Voice of the Shuttle. - - - Modernist Journals Project - - - Museum of American Poetics - - - Modern American Poetry - - - FindArticles.com - - - Literary History - - - Literary Encyclopedia - - - - The University of California Press - - - Wright American Fiction, 1851-1875 - - - Documenting the American South: Beginnings to 1920 - - - Electronic Text Center at the University of Virginia - - - The Schomburg Center for Research in Black Culture - - - Alex Catalogue of Electronic Texts. - - - diff --git a/examples/xml/streambookmarks/jennifer.xbel b/examples/xml/streambookmarks/jennifer.xbel index 74b7f1519f4..2501c118af0 100644 --- a/examples/xml/streambookmarks/jennifer.xbel +++ b/examples/xml/streambookmarks/jennifer.xbel @@ -3,60 +3,42 @@ Qt Resources - + + Qt home page + + Qt Partners - - Training Partners - - - Consultants and System Integrators - - - Technology Partners - - - Value Added Resellers (VARs) - - + + + Training + + + Qt 5 documentation + + + Frequently Asked Questions + Community Resources + + Qt Centre + QtForum.org - + The Independent Qt Tutorial - - French PROG.Qt - German Qt Forum Korean Qt Community Site - + Russian Qt Forum - - Digitalfanatics: The QT 4 Resource Center - - - QtQuestions - - - Qt Quarterly - - - Qt home page - - - Qt 4.0 documentation - - - Frequently Asked Questions - Online Dictionaries @@ -73,9 +55,6 @@ OneLook Dictionary Search - - The New English-German Dictionary - TU Chemnitz German-English Dictionary @@ -86,8 +65,5 @@ Dictionnaire de l'Académie Française - - Dictionnaire des synonymes - From dcedce51a62ae9519d8e85c004c2f93159be8751 Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Tue, 1 Nov 2016 11:35:02 +0100 Subject: [PATCH 005/136] Include intrin.h header when using MSVC Fixes the build with MSVC15 Change-Id: I7f22938583775bb3f0767d50cf59a43cab95eede Reviewed-by: Friedemann Kleint --- src/corelib/tools/qalgorithms.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h index ffa3082d5e1..b22c5e219c1 100644 --- a/src/corelib/tools/qalgorithms.h +++ b/src/corelib/tools/qalgorithms.h @@ -36,6 +36,10 @@ #include +#if defined(Q_CC_MSVC) && _MSC_VER > 1500 +#include +#endif + QT_BEGIN_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") From c5010107221ce1ba8dd08f2067c7921389baa96b Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Fri, 21 Oct 2016 19:41:44 +0100 Subject: [PATCH 006/136] Mention QDialog::setSizeGripEnabled() in QSizeGrip's docs The same way it also mentions QStatusBar. Change-Id: Ic084466310c989d1a79ba5ba21d6784acaa38e6e Reviewed-by: Martin Smith --- src/widgets/widgets/qsizegrip.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/widgets/widgets/qsizegrip.cpp b/src/widgets/widgets/qsizegrip.cpp index b2ffef2a5ad..5cacff7e0d5 100644 --- a/src/widgets/widgets/qsizegrip.cpp +++ b/src/widgets/widgets/qsizegrip.cpp @@ -178,9 +178,12 @@ Qt::Corner QSizeGripPrivate::corner() const Put this widget anywhere in a widget tree and the user can use it to resize the top-level window or any widget with the Qt::SubWindow flag set. Generally, this should be in the lower right-hand corner. + Note that QStatusBar already uses this widget, so if you have a status bar (e.g., you are using QMainWindow), then you don't need - to use this widget explicitly. + to use this widget explicitly. The same goes for QDialog, for which + you can just call \l {QDialog::setSizeGripEnabled()} + {QDialog::setSizeGripEnabled()}. On some platforms the size grip automatically hides itself when the window is shown full screen or maximised. From b5fc085e712815bcd465370f88d1df8179b538e3 Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Wed, 2 Nov 2016 10:40:37 +0100 Subject: [PATCH 007/136] Add QPixmapIconEngine::pixmap pointer check Dereference after null check (FORWARD_NULL)5. var_deref_op: Dereferencing null pointer pe. pe pointer it's being checked at the beginning of the function so it implies pe might be null. Coverity-Id: 11106 Change-Id: Ie88b27877a46cdd20a317fb5e21c3fdec1b99dda Reviewed-by: Edward Welbourne --- src/gui/image/qicon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp index 3531be412e8..50989558251 100644 --- a/src/gui/image/qicon.cpp +++ b/src/gui/image/qicon.cpp @@ -294,7 +294,7 @@ QPixmap QPixmapIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::St QString key = QLatin1String("qt_") % HexString(pm.cacheKey()) - % HexString(pe->mode) + % HexString(pe ? pe->mode : QIcon::Normal) % HexString(QGuiApplication::palette().cacheKey()) % HexString(actualSize.width()) % HexString(actualSize.height()); From 5f6c0418fe911b7afe34153b16b3f00839354afd Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 1 Nov 2016 14:54:16 +0100 Subject: [PATCH 008/136] winrt: Fixed assignment of readOrigin in readDatagram Change-Id: I0455b6526b8bacd30622698e0a497fa2da3932ba Reviewed-by: David Faure --- src/network/socket/qnativesocketengine_winrt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index b6a739d1b81..920b8e2cb14 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -641,7 +641,7 @@ qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxlen, QIpPacketHea QByteArray readOrigin; // Do not read the whole datagram. Put the rest of it back into the "queue" if (maxlen < datagram.data.length()) { - QByteArray readOrigin = datagram.data.left(maxlen); + readOrigin = datagram.data.left(maxlen); datagram.data = datagram.data.remove(0, maxlen); d->pendingDatagrams.prepend(datagram); } else { From ca4d93d85ee446c5e30ec8e7814651e45cbf1218 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 12 Nov 2015 10:14:51 -0800 Subject: [PATCH 009/136] Stop unloading plugins in QPluginLoader and QFactoryLoader QPluginLoader hasn't unloaded in its destructor since Qt 5.0, but we missed the equivalent code in QFactoryLoader (which bypasses QPluginLoader). Besides, QPluginLoader::unload() was still doing unloading, which it won't anymore. Not unloading plugins is Qt's policy, as decided during the 5.0 development process and reaffirmed now in 5.6. This is due to static data in plugins leaking out and remaining in use past the unloading of the plugin, causing crashes. This does not affect QLibrary and QLibrary::unload(). Those are meant for non-Qt loadable modules, so unloading them may be safe. Task-number: QTBUG-49061 Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html Change-Id: I461e9fc7199748faa187ffff1416070f138df8db (cherry picked from commit 494376f980e96339b6f1eff7c41336ca4d853065) Discussed-again-on: http://lists.qt-project.org/pipermail/development/2016-October/027476.html Reviewed-by: Lars Knoll --- src/corelib/plugin/qfactoryloader.cpp | 6 ++++-- src/corelib/plugin/qpluginloader.cpp | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index dcf1b1a81d7..b6558f58347 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -208,10 +208,12 @@ void QFactoryLoader::update() ++keyUsageCount; } } - if (keyUsageCount || keys.isEmpty()) + if (keyUsageCount || keys.isEmpty()) { + library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload d->libraryList += library; - else + } else { library->release(); + } } } #else diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp index 37f2368413e..0ea8280fef5 100644 --- a/src/corelib/plugin/qpluginloader.cpp +++ b/src/corelib/plugin/qpluginloader.cpp @@ -148,6 +148,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent) : QObject(parent), d(0), did_load(false) { setFileName(fileName); + setLoadHints(QLibrary::PreventUnloadHint); } /*! @@ -342,7 +343,7 @@ static QString locatePlugin(const QString& fileName) void QPluginLoader::setFileName(const QString &fileName) { #if defined(QT_SHARED) - QLibrary::LoadHints lh; + QLibrary::LoadHints lh = QLibrary::PreventUnloadHint; if (d) { lh = d->loadHints(); d->release(); @@ -391,7 +392,7 @@ Q_GLOBAL_STATIC(StaticPluginList, staticPluginList) \brief Give the load() function some hints on how it should behave. You can give hints on how the symbols in the plugin are - resolved. By default, none of the hints are set. + resolved. By default since Qt 5.7, QLibrary::PreventUnloadHint is set. See the documentation of QLibrary::loadHints for a complete description of how this property works. From 9e53a91e99accae299ff7b4cc0a9c3675606d688 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 21 Oct 2016 18:28:55 +0200 Subject: [PATCH 010/136] Fix tiling on a width over 2048 The blend_tiled_argb and blend_tiled_rgb565 was not correctly handling widths larger than the buffer size. This patch adds the same pattern used in blend_tiled_generic, which worked correctly. Change-Id: Ie22c2a21d96cb0477cd0990bf01451ab907a4768 Task-number: QTBUG-56364 Reviewed-by: Eirik Aavitsland --- src/gui/painting/qdrawhelper.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 39ff4142b80..c0a662b002b 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -4509,8 +4509,10 @@ static void blend_tiled_argb(int count, const QSpan *spans, void *userData) uint *dest = ((uint *)data->rasterBuffer->scanLine(spans->y)) + x; op.func(dest, src, l, coverage); x += l; + sx += l; length -= l; - sx = 0; + if (sx >= image_width) + sx = 0; } ++spans; } @@ -4568,7 +4570,9 @@ static void blend_tiled_rgb565(int count, const QSpan *spans, void *userData) memcpy(dest, src, l * sizeof(quint16)); length -= l; tx += l; - sx = 0; + sx += l; + if (sx >= image_width) + sx = 0; } // Now use the rasterBuffer as the source of the texture, @@ -4601,8 +4605,10 @@ static void blend_tiled_rgb565(int count, const QSpan *spans, void *userData) const quint16 *src = (const quint16 *)data->texture.scanLine(sy) + sx; blend_sourceOver_rgb16_rgb16(dest, src, l, alpha, ialpha); x += l; + sx += l; length -= l; - sx = 0; + if (sx >= image_width) + sx = 0; } } } From 1a1a0e31590a5a7f360a86de5c34a2aec8e17157 Mon Sep 17 00:00:00 2001 From: Dmitry Shachnev Date: Thu, 3 Nov 2016 12:06:43 +0300 Subject: [PATCH 011/136] GTK+ dialogs: Get rid of deprecated GtkStock usage GtkStock has been deprecated since GTK+ 3.10, and is removed in GTK+ 4. Use the standard button names provided by Qt instead. Change-Id: I55e8452178544b4a9ebf5c75b70f4c5c56c047f4 Reviewed-by: J-P Nurmi --- .../platformthemes/gtk3/qgtk3dialoghelpers.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp index c2a116b03c4..ba88af917d6 100644 --- a/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp +++ b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qgtk3dialoghelpers.h" +#include "qgtk3theme.h" #include #include @@ -56,6 +57,11 @@ QT_BEGIN_NAMESPACE +static const char *standardButtonText(int button) +{ + return QGtk3Theme::defaultStandardButtonText(button).toUtf8(); +} + class QGtk3Dialog : public QWindow { Q_OBJECT @@ -237,8 +243,10 @@ QGtk3FileDialogHelper::QGtk3FileDialogHelper() { d.reset(new QGtk3Dialog(gtk_file_chooser_dialog_new("", 0, GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, NULL))); + standardButtonText(QPlatformDialogHelper::Cancel), GTK_RESPONSE_CANCEL, + standardButtonText(QPlatformDialogHelper::Ok), GTK_RESPONSE_OK, + NULL))); + connect(d.data(), SIGNAL(accept()), this, SLOT(onAccepted())); connect(d.data(), SIGNAL(reject()), this, SIGNAL(reject())); @@ -435,9 +443,9 @@ void QGtk3FileDialogHelper::applyOptions() if (opts->isLabelExplicitlySet(QFileDialogOptions::Accept)) gtk_button_set_label(GTK_BUTTON(acceptButton), opts->labelText(QFileDialogOptions::Accept).toUtf8()); else if (opts->acceptMode() == QFileDialogOptions::AcceptOpen) - gtk_button_set_label(GTK_BUTTON(acceptButton), GTK_STOCK_OPEN); + gtk_button_set_label(GTK_BUTTON(acceptButton), standardButtonText(QPlatformDialogHelper::Open)); else - gtk_button_set_label(GTK_BUTTON(acceptButton), GTK_STOCK_SAVE); + gtk_button_set_label(GTK_BUTTON(acceptButton), standardButtonText(QPlatformDialogHelper::Save)); } GtkWidget *rejectButton = gtk_dialog_get_widget_for_response(gtkDialog, GTK_RESPONSE_CANCEL); @@ -445,7 +453,7 @@ void QGtk3FileDialogHelper::applyOptions() if (opts->isLabelExplicitlySet(QFileDialogOptions::Reject)) gtk_button_set_label(GTK_BUTTON(rejectButton), opts->labelText(QFileDialogOptions::Reject).toUtf8()); else - gtk_button_set_label(GTK_BUTTON(rejectButton), GTK_STOCK_CANCEL); + gtk_button_set_label(GTK_BUTTON(rejectButton), standardButtonText(QPlatformDialogHelper::Cancel)); } } From cf4e7575cad8975442191160723d766b48a9623f Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 31 Oct 2016 23:57:36 -0700 Subject: [PATCH 012/136] Fix GCC warning about ODR violation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are two enums called "Operator" qdrawhelper_p.h:201:8: warning: type ‘struct Operator’ violates the C++ One Definition Rule [-Wodr] qopengl.cpp:138:6: note: a different type is defined in another translation unit Change-Id: I09100678ff4443e6be06fffd1482da1f636614b7 Reviewed-by: Marc Mutz --- src/gui/opengl/qopengl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/opengl/qopengl.cpp b/src/gui/opengl/qopengl.cpp index 3dedd7d7be6..9f48d82c9d9 100644 --- a/src/gui/opengl/qopengl.cpp +++ b/src/gui/opengl/qopengl.cpp @@ -129,9 +129,6 @@ QDebug operator<<(QDebug d, const QOpenGLConfig::Gpu &g) return d; } -enum Operator { NotEqual, LessThan, LessEqualThan, Equals, GreaterThan, GreaterEqualThan }; -static const char operators[][3] = {"!=", "<", "<=", "=", ">", ">="}; - static inline QString valueKey() { return QStringLiteral("value"); } static inline QString opKey() { return QStringLiteral("op"); } static inline QString versionKey() { return QStringLiteral("version"); } @@ -169,6 +166,9 @@ static inline bool contains(const QJsonArray &haystack, const QString &needle) } namespace { +enum Operator { NotEqual, LessThan, LessEqualThan, Equals, GreaterThan, GreaterEqualThan }; +static const char operators[][3] = {"!=", "<", "<=", "=", ">", ">="}; + // VersionTerm describing a version term consisting of number and operator // found in os.version and driver_version. struct VersionTerm { From 4b6784b49c6dcf0add9ec0cbb4ad97cd191c2aa3 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 15 Sep 2016 14:07:59 -0700 Subject: [PATCH 013/136] Stop using readdir_r: glibc deprecated it and it's not a good idea MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit POSIX does not require that readdir() be reentrant even for operations on different dirent objects, but all implementations (according to the glibc documentation) already do that. Moreover, it's not a good idea to use readdir_r since the buffer space is limited by the caller, so certain file names may be too long (ENAMETOOLONG) -- we had a workaround for QNX, but for no other OS. According to the glibc documentation, it is expected that POSIX will mark readdir_r obsolete and instead require some form of reentrancy for readdir. This commit makes everyone use readdir instead. The macros in qplatformdefs.h are left behind in case someone else is using them. With glibc 2.24, we started getting: qplatformdefs.h:150:35: warning: ‘int readdir_r(DIR*, dirent*, dirent**)’ is deprecated [-Wdeprecated-declarations] qfilesystemiterator_unix.cpp:112:17: note: in expansion of macro ‘QT_READDIR_R’ Task-number: QTBUG-56088 Change-Id: I33dc971f005a4848bb8ffffd14749b4082f62e69 Reviewed-by: Edward Welbourne Reviewed-by: James McDonnell --- src/corelib/io/qfilesystemengine.cpp | 4 +-- src/corelib/io/qfilesystemiterator_p.h | 8 ----- src/corelib/io/qfilesystemiterator_unix.cpp | 38 --------------------- 3 files changed, 2 insertions(+), 48 deletions(-) diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp index 02aa2ff4b72..055ff3600bc 100644 --- a/src/corelib/io/qfilesystemengine.cpp +++ b/src/corelib/io/qfilesystemengine.cpp @@ -216,7 +216,7 @@ bool QFileSystemEngine::fillMetaData(int fd, QFileSystemMetaData &data) return false; } -#if defined(QT_EXT_QNX_READDIR_R) +#if defined(_DEXTRA_FIRST) static void fillStat64fromStat32(struct stat64 *statBuf64, const struct stat &statBuf32) { statBuf64->st_mode = statBuf32.st_mode; @@ -281,7 +281,7 @@ void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer) void QFileSystemMetaData::fillFromDirEnt(const QT_DIRENT &entry) { -#if defined(QT_EXT_QNX_READDIR_R) +#if defined(_DEXTRA_FIRST) knownFlagsMask = 0; entryFlags = 0; for (dirent_extra *extra = _DEXTRA_FIRST(&entry); _DEXTRA_VALID(extra, &entry); diff --git a/src/corelib/io/qfilesystemiterator_p.h b/src/corelib/io/qfilesystemiterator_p.h index 119068a6487..51dfe65f570 100644 --- a/src/corelib/io/qfilesystemiterator_p.h +++ b/src/corelib/io/qfilesystemiterator_p.h @@ -87,14 +87,6 @@ private: #else QT_DIR *dir; QT_DIRENT *dirEntry; -#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) || defined(QT_EXT_QNX_READDIR_R) - // for readdir_r - QScopedPointer mt_file; -#if defined(QT_EXT_QNX_READDIR_R) - // for _readdir_r - size_t direntSize; -#endif -#endif int lastError; #endif diff --git a/src/corelib/io/qfilesystemiterator_unix.cpp b/src/corelib/io/qfilesystemiterator_unix.cpp index 6f094bd3b2b..7d0e9101880 100644 --- a/src/corelib/io/qfilesystemiterator_unix.cpp +++ b/src/corelib/io/qfilesystemiterator_unix.cpp @@ -46,9 +46,6 @@ QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Fi : nativePath(entry.nativeFilePath()) , dir(0) , dirEntry(0) -#if defined(Q_OS_QNX) && defined(__EXT_QNX__READDIR_R) - , direntSize(0) -#endif , lastError(0) { Q_UNUSED(filters) @@ -58,32 +55,8 @@ QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Fi if ((dir = QT_OPENDIR(nativePath.constData())) == 0) { lastError = errno; } else { - if (!nativePath.endsWith('/')) nativePath.append('/'); - -#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) || defined(QT_EXT_QNX_READDIR_R) - // ### Race condition; we should use fpathconf and dirfd(). - size_t maxPathName = ::pathconf(nativePath.constData(), _PC_NAME_MAX); - if (maxPathName == size_t(-1)) - maxPathName = FILENAME_MAX; - maxPathName += sizeof(QT_DIRENT) + 1; - - QT_DIRENT *p = reinterpret_cast(::malloc(maxPathName)); - Q_CHECK_PTR(p); - - mt_file.reset(p); -#if defined(QT_EXT_QNX_READDIR_R) - direntSize = maxPathName; - - // Include extra stat information in the readdir() call (d_stat member of - // dirent_extra_stat). This is used in QFileSystemMetaData::fillFromDirEnt() to - // avoid extra stat() calls when iterating over directories - int flags = dircntl(dir, D_GETFLAG) | D_FLAG_STAT | D_FLAG_FILTER; - if (dircntl(dir, D_SETFLAG, flags) == -1) - lastError = errno; -#endif -#endif } } @@ -98,18 +71,7 @@ bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaDa if (!dir) return false; -#if defined(QT_EXT_QNX_READDIR_R) - lastError = QT_EXT_QNX_READDIR_R(dir, mt_file.data(), &dirEntry, direntSize); - if (lastError) - return false; -#elif defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) - lastError = QT_READDIR_R(dir, mt_file.data(), &dirEntry); - if (lastError) - return false; -#else - // ### add local lock to prevent breaking reentrancy dirEntry = QT_READDIR(dir); -#endif // _POSIX_THREAD_SAFE_FUNCTIONS if (dirEntry) { fileEntry = QFileSystemEntry(nativePath + QByteArray(dirEntry->d_name), QFileSystemEntry::FromNativePath()); From 15df60239d2dd3b0f0844e3ec8c91300fb7a4b67 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 2 Nov 2016 09:37:42 +0100 Subject: [PATCH 014/136] Fix OOM crashes for huge json documents Check all places where we reallocate our internal data structure and return a DocumentTooLarge parse error if we can't get enough memory. Change-Id: I006d0170d941837220c7dad0508571b68e2cbfd7 Reviewed-by: Edward Welbourne Reviewed-by: Kati Kankaanpaa Reviewed-by: Simon Hausmann --- src/corelib/json/qjsonparser.cpp | 79 +++++++++++++++++++++++++++++--- src/corelib/json/qjsonparser_p.h | 4 ++ 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp index b8a628fdcc8..c7b16d5ec93 100644 --- a/src/corelib/json/qjsonparser.cpp +++ b/src/corelib/json/qjsonparser.cpp @@ -385,6 +385,8 @@ bool Parser::parseObject() } int objectOffset = reserveSpace(sizeof(QJsonPrivate::Object)); + if (objectOffset < 0) + return false; BEGIN << "parseObject pos=" << objectOffset << current << json; ParsedObject parsedObject(this, objectOffset); @@ -417,6 +419,9 @@ bool Parser::parseObject() if (parsedObject.offsets.size()) { int tableSize = parsedObject.offsets.size()*sizeof(uint); table = reserveSpace(tableSize); + if (table < 0) + return false; + #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN memcpy(data + table, parsedObject.offsets.constData(), tableSize); #else @@ -446,6 +451,8 @@ bool Parser::parseObject() bool Parser::parseMember(int baseOffset) { int entryOffset = reserveSpace(sizeof(QJsonPrivate::Entry)); + if (entryOffset < 0) + return false; BEGIN << "parseMember pos=" << entryOffset; bool latin1; @@ -469,6 +476,42 @@ bool Parser::parseMember(int baseOffset) return true; } +namespace { + struct ValueArray { + static const int prealloc = 128; + ValueArray() : data(stackValues), alloc(prealloc), size(0) {} + ~ValueArray() { if (data != stackValues) free(data); } + + inline bool grow() { + alloc *= 2; + if (data == stackValues) { + QJsonPrivate::Value *newValues = static_cast(malloc(alloc*sizeof(QJsonPrivate::Value))); + if (!newValues) + return false; + memcpy(newValues, data, size*sizeof(QJsonPrivate::Value)); + data = newValues; + } else { + data = static_cast(realloc(data, alloc*sizeof(QJsonPrivate::Value))); + if (!data) + return false; + } + return true; + } + bool append(const QJsonPrivate::Value &v) { + if (alloc == size && !grow()) + return false; + data[size] = v; + ++size; + return true; + } + + QJsonPrivate::Value stackValues[prealloc]; + QJsonPrivate::Value *data; + int alloc; + int size; + }; +} + /* array = begin-array [ value *( value-separator value ) ] end-array */ @@ -482,8 +525,10 @@ bool Parser::parseArray() } int arrayOffset = reserveSpace(sizeof(QJsonPrivate::Array)); + if (arrayOffset < 0) + return false; - QVarLengthArray values; + ValueArray values; if (!eatSpace()) { lastError = QJsonParseError::UnterminatedArray; @@ -496,7 +541,10 @@ bool Parser::parseArray() QJsonPrivate::Value val; if (!parseValue(&val, arrayOffset)) return false; - values.append(val); + if (!values.append(val)) { + lastError = QJsonParseError::DocumentTooLarge; + return false; + } char token = nextToken(); if (token == EndArray) break; @@ -510,20 +558,22 @@ bool Parser::parseArray() } } - DEBUG << "size =" << values.size(); + DEBUG << "size =" << values.size; int table = arrayOffset; // finalize the object - if (values.size()) { - int tableSize = values.size()*sizeof(QJsonPrivate::Value); + if (values.size) { + int tableSize = values.size*sizeof(QJsonPrivate::Value); table = reserveSpace(tableSize); - memcpy(data + table, values.constData(), tableSize); + if (table < 0) + return false; + memcpy(data + table, values.data, tableSize); } QJsonPrivate::Array *a = (QJsonPrivate::Array *)(data + arrayOffset); a->tableOffset = table - arrayOffset; a->size = current - arrayOffset; a->is_object = false; - a->length = values.size(); + a->length = values.size; DEBUG << "current=" << current; END; @@ -732,6 +782,8 @@ bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset) } int pos = reserveSpace(sizeof(double)); + if (pos < 0) + return false; qToLittleEndian(ui, reinterpret_cast(data + pos)); if (current - baseOffset >= Value::MaxSize) { lastError = QJsonParseError::DocumentTooLarge; @@ -850,6 +902,9 @@ bool Parser::parseString(bool *latin1) // try to write out a latin1 string int stringPos = reserveSpace(2); + if (stringPos < 0) + return false; + BEGIN << "parse string stringPos=" << stringPos << json; while (json < end) { uint ch = 0; @@ -872,6 +927,8 @@ bool Parser::parseString(bool *latin1) break; } int pos = reserveSpace(1); + if (pos < 0) + return false; DEBUG << " " << ch << (char)ch; data[pos] = (uchar)ch; } @@ -887,6 +944,8 @@ bool Parser::parseString(bool *latin1) // write string length *(QJsonPrivate::qle_ushort *)(data + stringPos) = ushort(current - outStart - sizeof(ushort)); int pos = reserveSpace((4 - current) & 3); + if (pos < 0) + return false; while (pos & 3) data[pos++] = 0; END; @@ -916,10 +975,14 @@ bool Parser::parseString(bool *latin1) } if (QChar::requiresSurrogates(ch)) { int pos = reserveSpace(4); + if (pos < 0) + return false; *(QJsonPrivate::qle_ushort *)(data + pos) = QChar::highSurrogate(ch); *(QJsonPrivate::qle_ushort *)(data + pos + 2) = QChar::lowSurrogate(ch); } else { int pos = reserveSpace(2); + if (pos < 0) + return false; *(QJsonPrivate::qle_ushort *)(data + pos) = (ushort)ch; } } @@ -933,6 +996,8 @@ bool Parser::parseString(bool *latin1) // write string length *(QJsonPrivate::qle_int *)(data + stringPos) = (current - outStart - sizeof(int))/2; int pos = reserveSpace((4 - current) & 3); + if (pos < 0) + return false; while (pos & 3) data[pos++] = 0; END; diff --git a/src/corelib/json/qjsonparser_p.h b/src/corelib/json/qjsonparser_p.h index a395c0c92e9..82a7899a516 100644 --- a/src/corelib/json/qjsonparser_p.h +++ b/src/corelib/json/qjsonparser_p.h @@ -102,6 +102,10 @@ private: if (current + space >= dataLength) { dataLength = 2*dataLength + space; data = (char *)realloc(data, dataLength); + if (!data) { + lastError = QJsonParseError::DocumentTooLarge; + return -1; + } } int pos = current; current += space; From c0c75b3c2093976bab90dbf1566a02a1d10f2d33 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 28 Oct 2016 15:12:51 +0200 Subject: [PATCH 015/136] vcxproj generator: Support the /DEBUG:FASTLINK option of VS 2015 Make qmake understand the /DEBUG:FASTLINK option in QMAKE_LFLAGS, and write the corresponding value correctly to VS 2015 project files. Task-number: QTBUG-55591 Change-Id: I670375ed1523a5ab96bb3cce28635785564edba8 Reviewed-by: Oswald Buddenhagen Reviewed-by: Friedemann Kleint Reviewed-by: Joerg Bornemann --- qmake/generators/win32/msbuild_objectmodel.cpp | 17 ++++++++++++++++- qmake/generators/win32/msvc_objectmodel.cpp | 4 +++- qmake/generators/win32/msvc_objectmodel.h | 5 +++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index 9dbb33ba14f..fec181e61f9 100644 --- a/qmake/generators/win32/msbuild_objectmodel.cpp +++ b/qmake/generators/win32/msbuild_objectmodel.cpp @@ -1163,6 +1163,21 @@ static inline QString toString(subSystemOption option) return QString(); } +static inline QString toString(triState genDebugInfo, linkerDebugOption option) +{ + switch (genDebugInfo) { + case unset: + break; + case _False: + return "false"; + case _True: + if (option == linkerDebugOptionFastLink) + return "DebugFastLink"; + return "true"; + } + return QString(); +} + static inline QString toString(machineTypeOption option) { switch (option) { @@ -1541,7 +1556,7 @@ void VCXProjectWriter::write(XmlOutput &xml, const VCLinkerTool &tool) << attrTagS(_EntryPointSymbol, tool.EntryPointSymbol) << attrTagX(_ForceSymbolReferences, tool.ForceSymbolReferences, ";") << attrTagS(_FunctionOrder, tool.FunctionOrder) - << attrTagT(_GenerateDebugInformation, tool.GenerateDebugInformation) + << attrTagS(_GenerateDebugInformation, toString(tool.GenerateDebugInformation, tool.DebugInfoOption)) << attrTagT(_GenerateManifest, tool.GenerateManifest) << attrTagT(_GenerateWindowsMetadata, tool.GenerateWindowsMetadata) << attrTagS(_WindowsMetadataFile, tool.GenerateWindowsMetadata == _True ? tool.WindowsMetadataFile : QString()) diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 7fd748e39c9..82adc6814c3 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -1430,8 +1430,10 @@ bool VCLinkerTool::parseOption(const char* option) }else EnableUAC = _True; break; - case 0x3389797: // /DEBUG + case 0x3389797: // /DEBUG[:FASTLINK] GenerateDebugInformation = _True; + if (config->CompilerVersion >= NET2015 && strcmp(option + 7, "FASTLINK") == 0) + DebugInfoOption = linkerDebugOptionFastLink; break; case 0x0033896: // /DEF:filename ModuleDefinitionFile = option+5; diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 7092da3e596..96923ba23d6 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -282,6 +282,10 @@ enum inlineExpansionOption { expandAnySuitable, expandDefault // Not useful number, but stops the output }; +enum linkerDebugOption { + linkerDebugOptionNone, + linkerDebugOptionFastLink +}; enum linkIncrementalType { linkIncrementalDefault, linkIncrementalNo, @@ -595,6 +599,7 @@ public: QStringList ForceSymbolReferences; QString FunctionOrder; triState GenerateDebugInformation; + linkerDebugOption DebugInfoOption; triState GenerateMapFile; qlonglong HeapCommitSize; qlonglong HeapReserveSize; From b18a4de8143cba87502ae5737e28eb6a209c6033 Mon Sep 17 00:00:00 2001 From: Andrew Knight Date: Wed, 14 Sep 2016 17:14:32 +0300 Subject: [PATCH 016/136] Register Qt::TextFlag with QT_Q_ENUM By some unfortunate oversight, this enum was never registered. Change-Id: I2227ccf294d2cf717187a3dcaaf4cbfacc4ac65d Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/global/qnamespace.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index e2b0d30db09..a30344995e3 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -1679,6 +1679,7 @@ public: QT_Q_ENUM(Orientation) QT_Q_ENUM(DropAction) QT_Q_FLAG(Alignment) + QT_Q_ENUM(TextFlag) QT_Q_FLAG(Orientations) QT_Q_FLAG(DropActions) QT_Q_FLAG(Edges) From 2f5b7157f5a601d9c439f97e56b238758f9672f2 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 3 Nov 2016 18:11:01 +0100 Subject: [PATCH 017/136] remove dependencies from sync.profile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the CI obtains them from the qt5 super repo nowadays. Change-Id: I146e6a74763f32bee6651f427dd3664a1236ea0e Reviewed-by: Jędrzej Nowacki --- sync.profile | 8 -------- 1 file changed, 8 deletions(-) diff --git a/sync.profile b/sync.profile index bba0ff2b2f7..8f57593b007 100644 --- a/sync.profile +++ b/sync.profile @@ -58,11 +58,3 @@ my @zlib_headers = ( "zconf.h", "zlib.h" ); @ignore_for_include_check = ( "qsystemdetection.h", "qcompilerdetection.h", "qprocessordetection.h", @zlib_headers, @angle_headers); @ignore_for_qt_begin_namespace_check = ( "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qatomic_arch.h", "qatomic_windowsce.h", "qt_windows.h", "qatomic_macosx.h", @zlib_headers, @angle_headers); %inject_headers = ( "$basedir/src/corelib/global" => [ "qconfig.h", "qfeatures.h" ] ); -# Module dependencies. -# Every module that is required to build this module should have one entry. -# Each of the module version specifiers can take one of the following values: -# - A specific Git revision. -# - any git symbolic ref resolvable from the module's repository (e.g. "refs/heads/master" to track master branch) -# -%dependencies = ( -); From c5f18284248cf5ad1d07136764d2e4526b176344 Mon Sep 17 00:00:00 2001 From: Samuli Piippo Date: Wed, 2 Nov 2016 12:45:33 +0200 Subject: [PATCH 018/136] Fix freetype detection on QNX Pass qtConfLibrary_freetype test even when the .../freetype2 folder is not found, so that freetype and fontconfig config.tests are run. This fixes freetype detection on QNX, since the freetype headers are located in the default .../include folder. Task-number: QTBUG-56861 Change-Id: Ic8d72e6509195acd2d22a70603df850361f07b34 Reviewed-by: James McDonnell Reviewed-by: Oswald Buddenhagen --- src/gui/configure.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/configure.pri b/src/gui/configure.pri index ee5c7730df7..aaffa835dc4 100644 --- a/src/gui/configure.pri +++ b/src/gui/configure.pri @@ -12,7 +12,7 @@ defineTest(qtConfLibrary_freetype) { return(true) } } - return(false) + return(true) } # Check for Direct X SDK (include, lib, and direct shader compiler 'fxc'). From 95d127354887425b616a5087c24b6765b7bf907b Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 24 Oct 2016 15:53:06 +0200 Subject: [PATCH 019/136] Windows: Don't claim bitmap fonts support all standard sizes We were throwing away important information by claiming that all fonts support all the standard sizes in QFontDatabase on Windows This caused the font dialog to list unsupported sizes for bitmap fonts, unlike the native font dialog. We would also claim to support creating bitmap fonts at unsupported sizes, which would lead to 1. QFontInfo(font).pointSize() would return the requested size, not the actual rendered size. 2. Bitmap fonts created at 64 pixels and higher would be invisible. On Mac, there are no system bitmap fonts, and the use is not very common, but installing some bitmap fonts on the system, it does seem to ignore the sizes supported in the font and just displays the standard list instead, so we keep the current behavior there. [ChangeLog][QtGui][Text] Fixed list of supported sizes for bitmap fonts on Windows. Task-number: QTBUG-56672 Change-Id: Idbec2db9eb3381ab5ddf6259bd2befcba9b93564 Reviewed-by: Lars Knoll --- .../windows/qwindowsfontdatabase.cpp | 2 +- .../text/qfontdatabase/tst_qfontdatabase.cpp | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp index 434aa16d165..ad4dd3c9445 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -1583,7 +1583,7 @@ QString QWindowsFontDatabase::fontDir() const bool QWindowsFontDatabase::fontsAlwaysScalable() const { - return true; + return false; } void QWindowsFontDatabase::derefUniqueFont(const QString &uniqueFont) diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp index c53792da99b..8c26f8a91f0 100644 --- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp @@ -67,6 +67,9 @@ private slots: void condensedFontWidth(); void condensedFontMatching(); + void rasterFonts(); + void smoothFonts(); + private: QString m_ledFont; QString m_testFont; @@ -334,5 +337,30 @@ void tst_QFontDatabase::condensedFontMatching() QFontMetrics(tfcBySubfamilyName).width(testString())); } +void tst_QFontDatabase::rasterFonts() +{ + QFont font(QLatin1String("Fixedsys"), 1000); + QFontInfo fontInfo(font); + + if (fontInfo.family() != font.family()) + QSKIP("Fixedsys font not available."); + + QVERIFY(!QFontDatabase().isSmoothlyScalable(font.family())); + QVERIFY(fontInfo.pointSize() != font.pointSize()); +} + +void tst_QFontDatabase::smoothFonts() +{ + QFont font(QLatin1String("Arial"), 1000); + QFontInfo fontInfo(font); + + if (fontInfo.family() != font.family()) + QSKIP("Arial font not available."); + + // Smooth and bitmap scaling are mutually exclusive + QVERIFY(QFontDatabase().isSmoothlyScalable(font.family())); + QVERIFY(!QFontDatabase().isBitmapScalable(font.family())); +} + QTEST_MAIN(tst_QFontDatabase) #include "tst_qfontdatabase.moc" From a07e77a99a916f5ee65511ffade0f087d72bf8bb Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 4 Nov 2016 11:07:54 +0100 Subject: [PATCH 020/136] iOS: fix 'incompatible pointer type' compiler warning Change-Id: I01bb7516a3600dd1dbd71dd6989f541494840abc Reviewed-by: Jake Petroules --- src/plugins/platforms/ios/qiostextresponder.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/ios/qiostextresponder.mm b/src/plugins/platforms/ios/qiostextresponder.mm index 6224a6603c5..3a888e2bd0f 100644 --- a/src/plugins/platforms/ios/qiostextresponder.mm +++ b/src/plugins/platforms/ios/qiostextresponder.mm @@ -619,7 +619,7 @@ - (id)tokenizer { - return [[[UITextInputStringTokenizer alloc] initWithTextInput:id(self)] autorelease]; + return [[[UITextInputStringTokenizer alloc] initWithTextInput:self] autorelease]; } - (UITextPosition *)beginningOfDocument From 91c0afdcbf49939b466a07c0719444c55b6bbe49 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 4 Nov 2016 15:09:00 +0100 Subject: [PATCH 021/136] iOS: only build nsphotolibrarysupport for iOS The plugin depends on AssetLibrary.framework, which is only available for iOS. Change-Id: Ic7b3c4ffb4d26808d2120e46593cb4e191e2c10b Reviewed-by: Jake Petroules --- src/plugins/platforms/ios/optional/optional.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/ios/optional/optional.pro b/src/plugins/platforms/ios/optional/optional.pro index 5e3421a025c..6b4ae1ef5e0 100644 --- a/src/plugins/platforms/ios/optional/optional.pro +++ b/src/plugins/platforms/ios/optional/optional.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = nsphotolibrarysupport +ios: SUBDIRS = nsphotolibrarysupport From 68a0bd85920e6eb22b69aa5f57f71f3dccb8b286 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 4 Nov 2016 15:17:19 +0100 Subject: [PATCH 022/136] iOS, mkspec: only link in qiosnsphotolibrarysupport for iOS The plugin depends on AssetLibrary.framework, which is only available for iOS. Change-Id: I798c87b57881210ced8e4a7399c1e45d130ee357 Reviewed-by: Jake Petroules --- mkspecs/features/uikit/default_post.prf | 8 -------- mkspecs/macx-ios-clang/features/default_post.prf | 9 +++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 mkspecs/macx-ios-clang/features/default_post.prf diff --git a/mkspecs/features/uikit/default_post.prf b/mkspecs/features/uikit/default_post.prf index 8f1c5280b8d..6e23e23a6af 100644 --- a/mkspecs/features/uikit/default_post.prf +++ b/mkspecs/features/uikit/default_post.prf @@ -90,11 +90,3 @@ macx-xcode { QMAKE_PCH_ARCHS = $$VALID_ARCHS } - -!xcodebuild:equals(TEMPLATE, app):!isEmpty(QMAKE_INFO_PLIST) { - # Only link in photo library support if Info.plist contains - # NSPhotoLibraryUsageDescription. Otherwise it will be rejected from AppStore. - plist_path = $$absolute_path($$QMAKE_INFO_PLIST, $$_PRO_FILE_PWD_) - system("/usr/libexec/PlistBuddy -c 'Print NSPhotoLibraryUsageDescription' $$system_quote($$plist_path) &>/dev/null"): \ - QTPLUGIN += qiosnsphotolibrarysupport -} diff --git a/mkspecs/macx-ios-clang/features/default_post.prf b/mkspecs/macx-ios-clang/features/default_post.prf new file mode 100644 index 00000000000..2ed96fc5c72 --- /dev/null +++ b/mkspecs/macx-ios-clang/features/default_post.prf @@ -0,0 +1,9 @@ +load(default_post) + +!xcodebuild:equals(TEMPLATE, app):!isEmpty(QMAKE_INFO_PLIST) { + # Only link in photo library support if Info.plist contains + # NSPhotoLibraryUsageDescription. Otherwise it will be rejected from AppStore. + plist_path = $$absolute_path($$QMAKE_INFO_PLIST, $$_PRO_FILE_PWD_) + system("/usr/libexec/PlistBuddy -c 'Print NSPhotoLibraryUsageDescription' $$system_quote($$plist_path) &>/dev/null"): \ + QTPLUGIN += qiosnsphotolibrarysupport +} From 6172ebaf301c42b0c87396a9c6f0816081dddef9 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 26 Oct 2016 13:48:37 +0200 Subject: [PATCH 023/136] Fix compiler version detection for clang Concatenate the multi line output from clang into one line before parsing it. This got broken in 492d7d14fc. Change-Id: I282d69932c5851f229213d7ef1ca6a78cd56c8c3 Reviewed-by: Friedemann Kleint Reviewed-by: Michal Klocek Reviewed-by: Oswald Buddenhagen --- configure.pri | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.pri b/configure.pri index cdc13ff87c4..6d318f63cbb 100644 --- a/configure.pri +++ b/configure.pri @@ -225,6 +225,7 @@ defineTest(qtConfTest_buildParts) { defineTest(qtConfTest_checkCompiler) { contains(QMAKE_CXX, ".*clang.*") { qtRunLoggedCommand("$$QMAKE_CXX -v 2>&1", versionstr)|return(false) + versionstr = "$$versionstr" contains(versionstr, "^Apple (clang|LLVM) version .*") { $${1}.compilerDescription = "Apple Clang" $${1}.compilerId = "apple_clang" From eda3184a67c35d9250bad54c36c6d55f8772e43f Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 13:24:43 +0100 Subject: [PATCH 024/136] fix icpc version detection the regex didn't match the actual output ("icpc (ICC) 17.0.0 20160721"), and the code failed to concatenate the lines (broken in 492d7d14fc, as for clang). but using -dumpversion (as we do for g++) is more elegant anyway, so do it instead. Change-Id: I328bbfab9c08d6e660c3f1ec51554d9f877b8f66 Reviewed-by: Lars Knoll Reviewed-by: Thiago Macieira --- configure.pri | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.pri b/configure.pri index 6d318f63cbb..b78d075b613 100644 --- a/configure.pri +++ b/configure.pri @@ -242,11 +242,11 @@ defineTest(qtConfTest_checkCompiler) { $${1}.compilerDescription = "GCC" $${1}.compilerId = "gcc" $${1}.compilerVersion = $$version - } else: contains(QMAKE_CXX, ".*icpc" ) { - qtRunLoggedCommand("$$QMAKE_CXX -v", version)|return(false) + } else: contains(QMAKE_CXX, ".*icpc") { + qtRunLoggedCommand("$$QMAKE_CXX -dumpversion", version)|return(false) $${1}.compilerDescription = "ICC" $${1}.compilerId = "icc" - $${1}.compilerVersion = $$replace(version, "icpc version ([0-9.]+).*", "\\1") + $${1}.compilerVersion = $$version } else: msvc { command = $$QMAKE_CXX /EP /nologo $$source $$system_quote($$QMAKE_CONFIG_TESTS_DIR/win/msvc_version.cpp) qtRunLoggedCommand("$$command", version)|return(false) From 890a4d40ecd384ba4f59643374948a6fdddb741a Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 13:57:14 +0100 Subject: [PATCH 025/136] nuke obsolete comment amends 56ee007b3. Change-Id: Ida4f79ae72f185ce1f4cca9add30e3084da9c5bf Reviewed-by: Lars Knoll --- mkspecs/features/qt_configure.prf | 3 --- 1 file changed, 3 deletions(-) diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index 6b500c0f3e1..bfc460edca3 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -1552,9 +1552,6 @@ defineTest(qtConfOutput_publicFeature) { } } -# currently this is somewhat inconsistent, as the feature is output to the public pro file, -# whereas the define is being added to the private pro file. -# This should get cleaned up to add to the private pro and header instead. defineTest(qtConfOutput_privateFeature) { name = "$$eval($${1}.name)" isEmpty(name): \ From 66ad9668f3158ab5a0ee8f93fe3ddf062e37967e Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 15:15:19 +0100 Subject: [PATCH 026/136] fix iteration over a feature's outputs use precalculated path instead of incorrectly assembling it from scratch. it accidentally worked when the features happened to be in the right order, as the iteration variable 'feature' from the calling function was inherited. however, if the feature was accessed via dependency resolution, things blew up. amends 90eee08b3e, which presumably came to be this way due to a missing adjustment to a refactoring. Change-Id: I78b0acc0682cfc27a458df014ce14262a65c6241 Reviewed-by: Lars Knoll --- mkspecs/features/qt_configure.prf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index bfc460edca3..1d7e810cc88 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -1182,8 +1182,8 @@ defineTest(qtConfCheckFeature) { $${fpfx}.available = $$result export($${fpfx}.available) - for (i, $${currentConfig}.features.$${feature}.output._KEYS_): \ - qtConfProcessOneOutput($$feature, $$i) + for (i, $${fpfx}.output._KEYS_): \ + qtConfProcessOneOutput($${1}, $$i) return(true) } From 4b1115742ac7be1a1c6bce0e9cac022adc0bdc5c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 16:50:04 +0100 Subject: [PATCH 027/136] invert the logic of the c++98 default test this is much more intuitive, and actually produces a sensible result with configure -recheck after a compiler upgrade. Change-Id: Icfa0b85377d9fc014e66490c8ebf6c9236df978e Reviewed-by: Thiago Macieira Reviewed-by: Lars Knoll --- config.tests/common/c++98default/c++98default.cpp | 4 ++-- configure.json | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config.tests/common/c++98default/c++98default.cpp b/config.tests/common/c++98default/c++98default.cpp index 5edcf2d76ca..3ff92eda33e 100644 --- a/config.tests/common/c++98default/c++98default.cpp +++ b/config.tests/common/c++98default/c++98default.cpp @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#if __cplusplus >= 201103L -#error "compiler uses c++11 or higher by default" +#if __cplusplus < 201103L +#error "compiler does not use c++11 or higher by default" #endif int main(int, char **) {} diff --git a/configure.json b/configure.json index 85ef23a186c..0ff808519c2 100644 --- a/configure.json +++ b/configure.json @@ -281,8 +281,8 @@ "type": "compile", "test": "common/c++1z" }, - "cxx98default": { - "label": "compiler defaulting to C++98", + "cxx11default": { + "label": "compiler defaulting to C++11 or higher", "type": "compile", "test": "common/c++98default" }, @@ -483,9 +483,9 @@ "condition": "call.crossCompile", "output": [ "publicConfig", "privateConfig" ] }, - "cxx98default": { - "label": "Compiler defaults to C++98", - "condition": "tests.cxx98default", + "cxx11default": { + "label": "Compiler defaults to C++11 or higher", + "condition": "!tests.cxx11default", "output": [ { "type": "publicConfig", "name": "c++11" } ] }, "compiler-flags": { From 2ad4d757546b5bc0ede98af26cb04716ac6662b9 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 16:58:20 +0100 Subject: [PATCH 028/136] move empty cache() call back to configure.prf the new configure system doesn't use this type of caching. also, it's invoked via qt_parts.prf, which actually has the same call. Change-Id: Ifa1e810e24330b59a1eb9f883eb0500642a212f3 Reviewed-by: Lars Knoll --- mkspecs/features/configure.prf | 4 ++++ mkspecs/features/configure_base.prf | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mkspecs/features/configure.prf b/mkspecs/features/configure.prf index f275e3ac062..cc360033d71 100644 --- a/mkspecs/features/configure.prf +++ b/mkspecs/features/configure.prf @@ -1,3 +1,7 @@ +# Ensure that a cache is present. If none was found on startup, this will create +# one in the build directory of the project which loads this feature. +cache() + load(configure_base) isEmpty(QMAKE_CONFIG_TESTS_DIR): QMAKE_CONFIG_TESTS_DIR = $$_PRO_FILE_PWD_/config.tests diff --git a/mkspecs/features/configure_base.prf b/mkspecs/features/configure_base.prf index dc630a3528c..cd60cc3cc65 100644 --- a/mkspecs/features/configure_base.prf +++ b/mkspecs/features/configure_base.prf @@ -43,9 +43,5 @@ defineTest(qtRunLoggedCommand) { return(true) } -# Ensure that a cache is present. If none was found on startup, this will create -# one in the build directory of the project which loads this feature. -cache() - QMAKE_CONFIG_LOG = $$dirname(_QMAKE_CACHE_)/config.log write_file($$QMAKE_CONFIG_LOG, "") From 7ac15ab0ffeeb88a156cd5dd935fadcda4a559f9 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 17:08:26 +0100 Subject: [PATCH 029/136] don't clear config.log unless re-checking it is counterproductive to clear the log when cached test results are used, as that makes it hard to determine how they came to be. -recheck isn't as clear-cut as -recheck-all, as only part of the results is discarded, and we can't reasonably discard only part of the log. i opted for clearing the log entirely, as having both the old and new results in the log would be probably quite confusing. Change-Id: Ibb391f2ba2ea86d73c23365d46cc66ed8a2158d6 Reviewed-by: Lars Knoll --- mkspecs/features/configure.prf | 2 ++ mkspecs/features/configure_base.prf | 1 - mkspecs/features/qt_configure.prf | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mkspecs/features/configure.prf b/mkspecs/features/configure.prf index cc360033d71..147d6f178ce 100644 --- a/mkspecs/features/configure.prf +++ b/mkspecs/features/configure.prf @@ -4,6 +4,8 @@ cache() load(configure_base) +recheck: write_file($$QMAKE_CONFIG_LOG, "") + isEmpty(QMAKE_CONFIG_TESTS_DIR): QMAKE_CONFIG_TESTS_DIR = $$_PRO_FILE_PWD_/config.tests # Try to build the test project in $$QMAKE_CONFIG_TESTS_DIR/$$1 diff --git a/mkspecs/features/configure_base.prf b/mkspecs/features/configure_base.prf index cd60cc3cc65..4d68affabf1 100644 --- a/mkspecs/features/configure_base.prf +++ b/mkspecs/features/configure_base.prf @@ -44,4 +44,3 @@ defineTest(qtRunLoggedCommand) { } QMAKE_CONFIG_LOG = $$dirname(_QMAKE_CACHE_)/config.log -write_file($$QMAKE_CONFIG_LOG, "") diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index 1d7e810cc88..810e3106ab3 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -1729,6 +1729,8 @@ equals(QMAKE_CONFIG_CACHE_USE, none) { "cache.xplatform = $$[QMAKE_XSPEC]" write_file($$QMAKE_CONFIG_CACHE, cont) } +!equals(QMAKE_CONFIG_CACHE_USE, all): \ + write_file($$QMAKE_CONFIG_LOG, "") for (currentConfig, allConfigs) { qtConfSetModuleName() From c804033f3630cc19bde4612a5ec9fe9a897e750c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 17:20:49 +0100 Subject: [PATCH 030/136] don't attempt to install the target of header-only modules they have none. Change-Id: I1e5ffa9960c4fac3c708be4820fb40e7909569c8 Reviewed-by: Jake Petroules Reviewed-by: Lars Knoll --- mkspecs/features/qt_module.prf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index 954fdb25015..069eec02eb6 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -64,7 +64,9 @@ load(qt_build_paths) header_module { TEMPLATE = aux - CONFIG += force_qt # Needed for the headers_clean tests. + CONFIG += \ + force_qt \ # Needed for the headers_clean tests. + qt_no_install_library } else { TEMPLATE = lib } From dfbfc4915ba57294661faaa9596a92fa64893318 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 17:37:31 +0100 Subject: [PATCH 031/136] fix handling of -optimized-tools this option makes sense only when the default build is debug (regardless of whether the release build is also enabled), as it overrides the default. Change-Id: I29f87430242a7d8239f13f0b33f6eebe098d9cf7 Reviewed-by: Lars Knoll --- configure.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure.json b/configure.json index 0ff808519c2..e266fa918ce 100644 --- a/configure.json +++ b/configure.json @@ -558,6 +558,7 @@ }, "release_tools": { "label": "Compile tools in release mode", + "autoDetect": "!features.debug", "output": [ "privateFeature", "publicQtConfig" ] }, "simulator_and_device": { @@ -1073,7 +1074,7 @@ or compile needed modules into the library." }, { "type": "note", - "condition": "features.release_tools && (!features.debug || features.debug_and_release)", + "condition": "features.release_tools && !features.debug", "message": "-optimized-tools is not useful in -release mode." }, { From f13b18dc0cf660a1d3419cf21a6e41ba859eeef7 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 17:42:56 +0100 Subject: [PATCH 032/136] remove redundancy from the build type report with -force-debug-info it's a bit pointless to state "(with debug info)" also for the default build mode. Change-Id: I99563c424752c735a3157776ef4fe5252ebd3900 Reviewed-by: Lars Knoll --- configure.pri | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/configure.pri b/configure.pri index b78d075b613..02bce88d960 100644 --- a/configure.pri +++ b/configure.pri @@ -527,13 +527,16 @@ defineTest(qtConfReport_buildMode) { else: \ release = "release" - $$qtConfEvaluate("features.debug"): \ + $$qtConfEvaluate("features.debug") { build_mode = "debug" - else: \ + raw_build_mode = "debug" + } else { build_mode = $$release + raw_build_mode = "release" + } $$qtConfEvaluate("features.debug_and_release"): \ - build_mode = "debug and $$release; default link: $$build_mode" + build_mode = "debug and $$release; default link: $$raw_build_mode" $$qtConfEvaluate("features.release_tools"): \ build_mode = "$$build_mode; optimized tools" From 6c7f81cac93d32072e64466a713eebfcf5e68807 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 17:58:53 +0100 Subject: [PATCH 033/136] don't write "Checking for ..." to config.log the more precise test/library name is already logged. Change-Id: I73d3229a9e20a0024582b18bfe9f2848cab5f4ff Reviewed-by: Lars Knoll --- mkspecs/features/qt_configure.prf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index 810e3106ab3..94001dc1d5a 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -794,10 +794,8 @@ defineTest(qtLogTestIntro) { label = $$eval($${1}.label) isEmpty(label): return() - msg = "Checking for $${label}... " - log($$msg) + log("Checking for $${label}... ") $$QMAKE_CONFIG_VERBOSE: log("$$escape_expand(\\n)") - write_file($$QMAKE_CONFIG_LOG, msg, append) } defineTest(qtLogTestResult) { From b4979082b89842ee14cfc28639129bd15935bfc8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Nov 2016 18:00:16 +0100 Subject: [PATCH 034/136] don't log silent tests to config.log they were already omitted from the console output; there is no need to spam the log with them (their completion was not logged, either). Change-Id: I32c97413d2e6ceb18ee61356855cc6a7fa2222bf Reviewed-by: Lars Knoll --- mkspecs/features/qt_configure.prf | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index 94001dc1d5a..d5b9c6dc113 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -611,9 +611,7 @@ defineTest(qtConfHandleLibrary) { return() } - qtLogTestIntro($${lpfx}) - msg = "looking for library $${1}" - write_file($$QMAKE_CONFIG_LOG, msg, append) + qtLogTestIntro($${lpfx}, "looking for library $${1}") result = false for (s, $${lpfx}.sources._KEYS_) { @@ -796,6 +794,7 @@ defineTest(qtLogTestIntro) { log("Checking for $${label}... ") $$QMAKE_CONFIG_VERBOSE: log("$$escape_expand(\\n)") + write_file($$QMAKE_CONFIG_LOG, 2, append) } defineTest(qtLogTestResult) { @@ -921,9 +920,7 @@ defineTest(qtRunSingleTest) { qtConfLoadResult($${tpfx}, $$1): \ return() - qtLogTestIntro($${tpfx}) - msg = "executing config test $${1}" - write_file($$QMAKE_CONFIG_LOG, msg, append) + qtLogTestIntro($${tpfx}, "executing config test $${1}") result = false $${call}($${tpfx}): result = true From 25a2717f66006ba020d12c5666f8f45d3ccf8756 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 4 Nov 2016 10:34:58 +0100 Subject: [PATCH 035/136] fix debug-only builds on debug-and-release platforms this actually affects only non-framework Darwin builds - debug-only framework builds are impossible, and Windows is always debug-and-release. Change-Id: Ia79dbbefc5750168ebd8967fe4afbe173f55a0d6 Reviewed-by: Erik Verbruggen Reviewed-by: Joerg Bornemann Reviewed-by: Jake Petroules --- mkspecs/features/qt_helper_lib.prf | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mkspecs/features/qt_helper_lib.prf b/mkspecs/features/qt_helper_lib.prf index 07e4f48771b..99ba0c68770 100644 --- a/mkspecs/features/qt_helper_lib.prf +++ b/mkspecs/features/qt_helper_lib.prf @@ -27,6 +27,8 @@ qtConfig(build_all): CONFIG += build_all DESTDIR = $$MODULE_BASE_OUTDIR/lib DLLDESTDIR = $$MODULE_BASE_OUTDIR/bin +THE_TARGET = $$qt5LibraryTarget($$TARGET) + !build_pass { MODULE = $$replace(TARGET, ^qt, ) MODULE_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_ext_$${MODULE}.pri @@ -35,22 +37,23 @@ DLLDESTDIR = $$MODULE_BASE_OUTDIR/bin MODULE_PRI_CONT = \ "QMAKE_INCDIR_$${ucmodule} = $$val_escape(MODULE_INCLUDEPATH)" \ "QMAKE_DEFINES_$${ucmodule} = $$val_escape(MODULE_DEFINES)" - MODULE_LIBS = -L$$DESTDIR -l$$TARGET debug_and_release { win32: MODULE_DEBUG_LIBS = -L$$DESTDIR -l$${TARGET}d darwin: MODULE_DEBUG_LIBS = -L$$DESTDIR -l$${TARGET}_debug + MODULE_RELEASE_LIBS = -L$$DESTDIR -l$$TARGET MODULE_PRI_CONT += \ "QMAKE_LIBS_$${ucmodule}_DEBUG = $$val_escape(MODULE_DEBUG_LIBS)" \ - "QMAKE_LIBS_$${ucmodule}_RELEASE = $$val_escape(MODULE_LIBS)" + "QMAKE_LIBS_$${ucmodule}_RELEASE = $$val_escape(MODULE_RELEASE_LIBS)" } else { + MODULE_LIBS = -L$$DESTDIR -l$$THE_TARGET MODULE_PRI_CONT += \ "QMAKE_LIBS_$${ucmodule} = $$val_escape(MODULE_LIBS)" } write_file($$MODULE_PRI, MODULE_PRI_CONT)|error() } +TARGET = $$THE_TARGET + # In static builds of Qt, convenience libraries must be installed, # as in this case they are not linked to the final library/plugin. installed|if(!not_installed:qtConfig(static)): load(qt_installs) - -TARGET = $$qt5LibraryTarget($$TARGET) From 146a2eef5fe35acb65ae5fe7b8ebad771cbd448e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 2 Nov 2016 10:14:58 +0100 Subject: [PATCH 036/136] Re-add configure option for Direct2D QPA plugin This also allows us to enable auto-detection for it. Change-Id: I7639ab533553f02e691e6f6b8cdd8dff19d91809 Reviewed-by: Oswald Buddenhagen --- config_help.txt | 1 + src/gui/configure.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config_help.txt b/config_help.txt index 296bf807d9e..5e0d36a41f7 100644 --- a/config_help.txt +++ b/config_help.txt @@ -252,6 +252,7 @@ Gui, printing, widget options: -xcb-xlib............. Enable Xcb-Xlib support [auto] Platform backends: + -direct2d .......... Enable Direct2D support [auto] (Windows only) -directfb .......... Enable DirectFB support [no] (Unix only) -eglfs ............. Enable EGLFS support [auto; no on Android and Windows] -gbm ............... Enable backends for GBM [auto] (Linux only) diff --git a/src/gui/configure.json b/src/gui/configure.json index f4e2faf08ba..9fb4a971c32 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -9,6 +9,7 @@ "options": { "android-style-assets": "boolean", "angle": "boolean", + "direct2d": "boolean", "directfb": "boolean", "directwrite": "boolean", "egl": "boolean", @@ -446,8 +447,7 @@ }, "direct2d": { "label": "Direct 2D", - "autoDetect": false, - "condition": "config.win32 && libs.direct2d", + "condition": "config.win32 && !config.winrt && libs.direct2d", "output": [ "privateFeature" ] }, "evdev": { From 969bb10eed646313209fcdd9b84605aa98fc88de Mon Sep 17 00:00:00 2001 From: Samuli Piippo Date: Thu, 3 Nov 2016 08:22:34 +0200 Subject: [PATCH 037/136] Enable cross_compile when sysroot is used The crossCompile test checked only if platform and xplatform are different (which is the usual case), but in yocto builds cross compilation is done by setting both platform and xplatform to the same target mkspec and using host tools from -external-hostbindir. Change-Id: Ib4ae3975a52196d9c0ad52b5b5e9ccd7c1bfe883 Reviewed-by: Oswald Buddenhagen --- configure.pri | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.pri b/configure.pri index 02bce88d960..0e6bb6a6f57 100644 --- a/configure.pri +++ b/configure.pri @@ -57,6 +57,7 @@ defineTest(qtConfCommandline_sanitize) { # callbacks defineReplace(qtConfFunc_crossCompile) { + !isEmpty(config.input.sysroot): return(true) spec = $$[QMAKE_SPEC] !equals(spec, $$[QMAKE_XSPEC]): return(true) return(false) From c972c452e2ae2f38ce957eaac1761d8dff265f9b Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Wed, 2 Nov 2016 13:12:12 +0100 Subject: [PATCH 038/136] winrt: Proper guarding by readMutex Commented its purpose and the guarded members for readMutex. Fixed places where guarded members were accessed without using the mutex. Use QMutexLocker instead of manually (un-)locking the mutex. Task-number: QTBUG-44357 Change-Id: I3049bb0df30f00659dc284c8e30ad7503c11e7c6 Reviewed-by: David Faure --- src/network/socket/qnativesocketengine_winrt.cpp | 13 ++++++++++--- src/network/socket/qnativesocketengine_winrt_p.h | 12 ++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index 920b8e2cb14..32fafc2cb07 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -580,6 +580,7 @@ qint64 QNativeSocketEngine::bytesAvailable() const if (d->socketType != QAbstractSocket::TcpSocket) return -1; + QMutexLocker locker(&d->readMutex); return d->readBytes.size() - d->readBytes.pos(); } @@ -592,12 +593,12 @@ qint64 QNativeSocketEngine::read(char *data, qint64 maxlen) // There will be a read notification when the socket was closed by the remote host. If that // happens and there isn't anything left in the buffer, we have to return -1 in order to signal // the closing of the socket. + QMutexLocker mutexLocker(&d->readMutex); if (d->readBytes.pos() == d->readBytes.size() && d->socketState != QAbstractSocket::ConnectedState) { close(); return -1; } - QMutexLocker mutexLocker(&d->readMutex); return d->readBytes.read(data, maxlen); } @@ -628,6 +629,7 @@ qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxlen, QIpPacketHea PacketHeaderOptions) { Q_D(QNativeSocketEngine); + QMutexLocker locker(&d->readMutex); if (d->socketType != QAbstractSocket::UdpSocket || d->pendingDatagrams.isEmpty()) { if (header) header->clear(); @@ -647,6 +649,7 @@ qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxlen, QIpPacketHea } else { readOrigin = datagram.data; } + locker.unlock(); memcpy(data, readOrigin, qMin(maxlen, qint64(datagram.data.length()))); return readOrigin.length(); } @@ -684,12 +687,14 @@ qint64 QNativeSocketEngine::writeDatagram(const char *data, qint64 len, const QI bool QNativeSocketEngine::hasPendingDatagrams() const { Q_D(const QNativeSocketEngine); + QMutexLocker locker(&d->readMutex); return d->pendingDatagrams.length() > 0; } qint64 QNativeSocketEngine::pendingDatagramSize() const { Q_D(const QNativeSocketEngine); + QMutexLocker locker(&d->readMutex); if (d->pendingDatagrams.isEmpty()) return -1; @@ -1336,7 +1341,7 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async hr = byteArrayAccess->Buffer(&data); Q_ASSERT_SUCCEEDED(hr); - readMutex.lock(); + QMutexLocker locker(&readMutex); if (readBytes.atEnd()) // Everything has been read; the buffer is safe to reset readBytes.close(); if (!readBytes.isOpen()) @@ -1346,7 +1351,7 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async Q_ASSERT(readBytes.atEnd()); readBytes.write(reinterpret_cast(data), qint64(bufferLength)); readBytes.seek(readPos); - readMutex.unlock(); + locker.unlock(); if (notifyOnRead) emit q->readReady(); @@ -1410,7 +1415,9 @@ HRESULT QNativeSocketEnginePrivate::handleNewDatagram(IDatagramSocket *socket, I datagram.data.resize(length); hr = reader->ReadBytes(length, reinterpret_cast(datagram.data.data())); RETURN_OK_IF_FAILED("Could not read datagram"); + QMutexLocker locker(&readMutex); pendingDatagrams.append(datagram); + locker.unlock(); if (notifyOnRead) emit q->readReady(); diff --git a/src/network/socket/qnativesocketengine_winrt_p.h b/src/network/socket/qnativesocketengine_winrt_p.h index c1fbcf70fa6..654bb99d351 100644 --- a/src/network/socket/qnativesocketengine_winrt_p.h +++ b/src/network/socket/qnativesocketengine_winrt_p.h @@ -200,10 +200,18 @@ private: Microsoft::WRL::ComPtr tcpListener; Microsoft::WRL::ComPtr connectOp; Microsoft::WRL::ComPtr> readOp; - QBuffer readBytes; - QMutex readMutex; + // Protected by readMutex. Written in handleReadyRead (native callback) + QBuffer readBytes; + + // In case of TCP readMutex protects readBytes and bytesAvailable. In case of UDP it is + // pendingDatagrams. They are written inside native callbacks (handleReadyRead and + // handleNewDatagrams/putIntoPendingDatagramsList) + mutable QMutex readMutex; + + // Protected by readMutex. Written in handleNewDatagrams/putIntoPendingDatagramsList QList pendingDatagrams; + QList pendingConnections; QList currentConnections; QEventLoop eventLoop; From fe51dbac3d20ef9275dd1a9070f8185dc7705ad9 Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Mon, 31 Oct 2016 12:57:38 +0100 Subject: [PATCH 039/136] winrt: Fix potential memory corruption The timerInfo list might get accessed concurrently and cause references to become dangling. Hence, we need to protect usages with a mutex. According to tests/benchmark there is no impact on performance. Task-number: QTBUG-56756 Change-Id: I4bdffccff70d2dca99f4a39defad438afe571ada Reviewed-by: Oliver Wolff --- src/corelib/kernel/qeventdispatcher_winrt.cpp | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp index d115a3db2a0..4a2e2d887f3 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt.cpp +++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,7 @@ public: private: QHash timerIdToObject; QVector timerInfos; + mutable QMutex timerInfoLock; QHash timerHandleToId; QHash timerIdToHandle; QHash timerIdToCancelHandle; @@ -116,6 +118,7 @@ private: timerIdToObject.insert(id, obj); const quint64 targetTime = qt_msectime() + interval; const WinRTTimerInfo info(id, interval, type, obj, targetTime); + QMutexLocker locker(&timerInfoLock); if (id >= timerInfos.size()) timerInfos.resize(id + 1); timerInfos[id] = info; @@ -124,6 +127,7 @@ private: bool removeTimer(int id) { + QMutexLocker locker(&timerInfoLock); if (id >= timerInfos.size()) return false; @@ -247,14 +251,18 @@ bool QEventDispatcherWinRT::processEvents(QEventLoop::ProcessEventsFlags flags) if (timerId == INTERRUPT_HANDLE) break; - WinRTTimerInfo &info = d->timerInfos[timerId]; - Q_ASSERT(info.timerId != INVALID_TIMER_ID); + { + QMutexLocker locker(&d->timerInfoLock); - QCoreApplication::postEvent(this, new QTimerEvent(timerId)); + WinRTTimerInfo &info = d->timerInfos[timerId]; + Q_ASSERT(info.timerId != INVALID_TIMER_ID); - // Update timer's targetTime - const quint64 targetTime = qt_msectime() + info.interval; - info.targetTime = targetTime; + QCoreApplication::postEvent(this, new QTimerEvent(timerId)); + + // Update timer's targetTime + const quint64 targetTime = qt_msectime() + info.interval; + info.targetTime = targetTime; + } waitResult = WaitForMultipleObjectsEx(timerHandles.count(), timerHandles.constData(), FALSE, 0, TRUE); } emit awake(); @@ -421,6 +429,7 @@ QList QEventDispatcherWinRT::registeredTime } Q_D(const QEventDispatcherWinRT); + QMutexLocker locker(&d->timerInfoLock); QList timerInfos; foreach (const WinRTTimerInfo &info, d->timerInfos) { if (info.object == object && info.timerId != INVALID_TIMER_ID) @@ -452,6 +461,7 @@ int QEventDispatcherWinRT::remainingTime(int timerId) } Q_D(QEventDispatcherWinRT); + QMutexLocker locker(&d->timerInfoLock); const WinRTTimerInfo timerInfo = d->timerInfos.at(timerId); if (timerInfo.timerId == INVALID_TIMER_ID) { #ifndef QT_NO_DEBUG @@ -500,6 +510,9 @@ bool QEventDispatcherWinRT::event(QEvent *e) case QEvent::Timer: { QTimerEvent *timerEvent = static_cast(e); const int id = timerEvent->timerId(); + + QMutexLocker locker(&d->timerInfoLock); + Q_ASSERT(id < d->timerInfos.size()); WinRTTimerInfo &info = d->timerInfos[id]; Q_ASSERT(info.timerId != INVALID_TIMER_ID); @@ -508,9 +521,13 @@ bool QEventDispatcherWinRT::event(QEvent *e) break; info.inEvent = true; + locker.unlock(); + QTimerEvent te(id); QCoreApplication::sendEvent(d->timerIdToObject.value(id), &te); + locker.relock(); + // The timer might have been removed in the meanwhile if (id >= d->timerInfos.size()) break; From 14805de3d9584157fed9da8f8955446d2292846f Mon Sep 17 00:00:00 2001 From: Andrew Knight Date: Mon, 7 Nov 2016 21:11:09 +0100 Subject: [PATCH 040/136] Fix build with -no-feature-cursor Change-Id: I0644342c56facefab611f981690d0c7a2a460e7e Reviewed-by: Laszlo Agocs --- src/plugins/platforms/vnc/qvnc.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/vnc/qvnc.cpp b/src/plugins/platforms/vnc/qvnc.cpp index f386be193d0..a45bb1c19cd 100644 --- a/src/plugins/platforms/vnc/qvnc.cpp +++ b/src/plugins/platforms/vnc/qvnc.cpp @@ -533,9 +533,11 @@ void QRfbRawEncoder::write() QVncClientCursor::QVncClientCursor() { +#ifndef QT_NO_CURSOR QWindow *w = QGuiApplication::focusWindow(); QCursor c = w ? w->cursor() : QCursor(Qt::ArrowCursor); changeCursor(&c, 0); +#endif } QVncClientCursor::~QVncClientCursor() @@ -582,10 +584,10 @@ void QVncClientCursor::write(QVncClient *client) const socket->write((const char*)bitmap.scanLine(i), width); } -#ifndef QT_NO_CURSOR void QVncClientCursor::changeCursor(QCursor *widgetCursor, QWindow *window) { Q_UNUSED(window); +#ifndef QT_NO_CURSOR const Qt::CursorShape shape = widgetCursor ? widgetCursor->shape() : Qt::ArrowCursor; if (shape == Qt::BitmapCursor) { @@ -599,6 +601,9 @@ void QVncClientCursor::changeCursor(QCursor *widgetCursor, QWindow *window) cursor = *platformImage.image(); hotspot = platformImage.hotspot(); } +#else // !QT_NO_CURSOR + Q_UNUSED(widgetCursor); +#endif for (auto client : clients) client->setDirtyCursor(); } @@ -614,7 +619,6 @@ uint QVncClientCursor::removeClient(QVncClient *client) clients.removeOne(client); return clients.count(); } -#endif QVncServer::QVncServer(QVncScreen *screen, quint16 port) : qvnc_screen(screen) From c6477286525682773ae3739fee53689e225d1b0a Mon Sep 17 00:00:00 2001 From: Andrew Knight Date: Mon, 7 Nov 2016 21:11:54 +0100 Subject: [PATCH 041/136] Fix developer build with -no-feature-cursor Change-Id: I3ec22f212ad68baa788fcea2e7340c2f53bfc8a1 Reviewed-by: Friedemann Kleint --- src/plugins/platforms/xcb/qxcbcursor.cpp | 4 ++-- src/widgets/graphicsview/qgraphicswidget_p.cpp | 3 +++ src/widgets/kernel/qapplication.cpp | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbcursor.cpp b/src/plugins/platforms/xcb/qxcbcursor.cpp index 4de4be43d19..80fe5a21993 100644 --- a/src/plugins/platforms/xcb/qxcbcursor.cpp +++ b/src/plugins/platforms/xcb/qxcbcursor.cpp @@ -74,6 +74,8 @@ static PtrXcursorLibraryGetDefaultSize ptrXcursorLibraryGetDefaultSize = 0; static xcb_font_t cursorFont = 0; static int cursorCount = 0; +#ifndef QT_NO_CURSOR + static uint8_t cur_blank_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -276,8 +278,6 @@ static const char * const cursorNames[] = { "link" }; -#ifndef QT_NO_CURSOR - QXcbCursorCacheKey::QXcbCursorCacheKey(const QCursor &c) : shape(c.shape()), bitmapCacheKey(0), maskCacheKey(0) { diff --git a/src/widgets/graphicsview/qgraphicswidget_p.cpp b/src/widgets/graphicsview/qgraphicswidget_p.cpp index 4beb64a254b..46d2a4c1aac 100644 --- a/src/widgets/graphicsview/qgraphicswidget_p.cpp +++ b/src/widgets/graphicsview/qgraphicswidget_p.cpp @@ -722,6 +722,9 @@ void QGraphicsWidgetPrivate::windowFrameHoverMoveEvent(QGraphicsSceneHoverEvent #ifndef QT_NO_CURSOR if (needsSetCursorCall) q->setCursor(cursorShape); +#else + Q_UNUSED(needsSetCursorCall); + Q_UNUSED(cursorShape); #endif // update buttons if we hover over them windowData->hoveredSubControl = q->style()->hitTestComplexControl(QStyle::CC_TitleBar, &bar, pos.toPoint(), 0); diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 89eff898fe6..358838b4e95 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2790,6 +2790,8 @@ void QApplicationPrivate::sendSyntheticEnterLeave(QWidget *widget) // Send enter/leave events followed by a mouse move on the entered widget. QMouseEvent e(QEvent::MouseMove, pos, windowPos, globalPos, Qt::NoButton, Qt::NoButton, Qt::NoModifier); sendMouseEvent(widgetUnderCursor, &e, widgetUnderCursor, tlw, &qt_button_down, qt_last_mouse_receiver); +#else // !QT_NO_CURSOR + Q_UNUSED(widget); #endif // QT_NO_CURSOR } From baebb6aa26799e627bc3be6bf41589cef422bed2 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 27 Sep 2016 11:13:49 +0200 Subject: [PATCH 042/136] QVariant to QJsonValue::Null conversion Adds a few missing parts of the conversion from QVariant to QJsonValue after the introduction of the nullptr QVariant. The conversion the other way is already implemented. Change-Id: I8b25dec4b476c4761c5098a60944ff11c36f8bec Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/json/qjsonvalue.cpp | 8 ++++++++ src/corelib/kernel/qvariant.cpp | 1 + tests/auto/corelib/json/tst_qtjson.cpp | 7 ++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/corelib/json/qjsonvalue.cpp b/src/corelib/json/qjsonvalue.cpp index 5a906dda7bc..4b52014db1e 100644 --- a/src/corelib/json/qjsonvalue.cpp +++ b/src/corelib/json/qjsonvalue.cpp @@ -346,6 +346,12 @@ QJsonValue &QJsonValue::operator =(const QJsonValue &other) \header \li Source type \li Destination type + \row + \li + \list + \li QMetaType::Nullptr + \endlist + \li QJsonValue::Null \row \li \list @@ -393,6 +399,8 @@ QJsonValue &QJsonValue::operator =(const QJsonValue &other) QJsonValue QJsonValue::fromVariant(const QVariant &variant) { switch (variant.userType()) { + case QMetaType::Nullptr: + return QJsonValue(Null); case QVariant::Bool: return QJsonValue(variant.toBool()); case QVariant::Int: diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 72ae3b063fc..ccfa7d0d384 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -3085,6 +3085,7 @@ bool QVariant::canConvert(int targetTypeId) const if (currentType == QMetaType::QJsonValue) { switch (targetTypeId) { + case QMetaType::Nullptr: case QMetaType::QString: case QMetaType::Bool: case QMetaType::Int: diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp index 1194260efa0..17892b44a2d 100644 --- a/tests/auto/corelib/json/tst_qtjson.cpp +++ b/tests/auto/corelib/json/tst_qtjson.cpp @@ -1103,6 +1103,7 @@ void tst_QtJson::fromVariant() jsonObject["string"] = stringValue; jsonObject["array"] = jsonArray_variant; + QCOMPARE(QJsonValue::fromVariant(QVariant::fromValue(nullptr)), QJsonValue(QJsonValue::Null)); QCOMPARE(QJsonValue::fromVariant(QVariant(boolValue)), QJsonValue(boolValue)); QCOMPARE(QJsonValue::fromVariant(QVariant(intValue)), QJsonValue(intValue)); QCOMPARE(QJsonValue::fromVariant(QVariant(uintValue)), QJsonValue(static_cast(uintValue))); @@ -1179,7 +1180,7 @@ void tst_QtJson::toVariantMap() array.append(true); array.append(999.); array.append(QLatin1String("string")); - array.append(QJsonValue()); + array.append(QJsonValue::Null); object.insert("Array", array); map = object.toVariantMap(); @@ -1203,12 +1204,12 @@ void tst_QtJson::toVariantHash() QVERIFY(hash.isEmpty()); object.insert("Key", QString("Value")); - object.insert("null", QJsonValue()); + object.insert("null", QJsonValue::Null); QJsonArray array; array.append(true); array.append(999.); array.append(QLatin1String("string")); - array.append(QJsonValue()); + array.append(QJsonValue::Null); object.insert("Array", array); hash = object.toVariantHash(); From ffe72840a34ed7c99294f29f85828c5d5fad728f Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Tue, 1 Nov 2016 13:10:35 +0100 Subject: [PATCH 043/136] Only turn off font hinting when scale is != 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KDE will set the screen scale factors to 1 by default. Make sure we don't turn off font hinting in that case. Task-number: QTBUG-56797 Change-Id: Ieab18a7cfe4c1cb7087caab4d881932a4a991bc8 Reviewed-by: Friedemann Kleint Reviewed-by: Morten Johan Sørvig --- src/gui/kernel/qhighdpiscaling.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp index 6846196719a..a94ad1e00a9 100644 --- a/src/gui/kernel/qhighdpiscaling.cpp +++ b/src/gui/kernel/qhighdpiscaling.cpp @@ -332,8 +332,10 @@ static const char scaleFactorProperty[] = "_q_scaleFactor"; */ void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor) { - m_screenFactorSet = true; - m_active = true; + if (!qFuzzyCompare(factor, qreal(1))) { + m_screenFactorSet = true; + m_active = true; + } screen->setProperty(scaleFactorProperty, QVariant(factor)); // hack to force re-evaluation of screen geometry From ae8d3d69d68e7f3da1b0f524e12496387aff26ec Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Tue, 1 Nov 2016 15:28:17 -0700 Subject: [PATCH 044/136] 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: I52f26f99a63cbb46969db42f65b09a3c3119ad15 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 3c924bec94d..474e2cdb19d 100644 --- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm @@ -39,6 +39,7 @@ #include #include "qcocoahelpers.h" +#include "qcocoaeventdispatcher.h" #import @@ -318,6 +319,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 8a2a478a723..569dd3b028a 100644 --- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h +++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h @@ -125,6 +125,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 1cfb3ecff90..09a0e149507 100644 --- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm +++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm @@ -960,6 +960,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 4c1b190b9c9..71748ae77fb 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -45,6 +45,7 @@ #include "qt_mac_p.h" #include "qcocoahelpers.h" #include "qcocoamenubar.h" +#include "qcocoaeventdispatcher.h" #include #include #include @@ -235,6 +236,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 5b27dc1da94..eb800afd47b 100644 --- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm @@ -43,6 +43,7 @@ #include #include "qcocoahelpers.h" +#include "qcocoaeventdispatcher.h" #import @@ -313,6 +314,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 d018c056357..d6786b92744 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h @@ -96,6 +96,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 baee4519031..8534c1c6fbf 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -38,6 +38,7 @@ #include "qcocoahelpers.h" #include "qcocoaapplication.h" #include "qcocoaintegration.h" +#include "qcocoaeventdispatcher.h" #include #include @@ -193,6 +194,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 b86de31883b..9c86c5a90e2 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_mac.mm +++ b/src/printsupport/dialogs/qpagesetupdialog_mac.mm @@ -127,6 +127,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 030526954dc..964b20dac58 100644 --- a/src/printsupport/dialogs/qprintdialog_mac.mm +++ b/src/printsupport/dialogs/qprintdialog_mac.mm @@ -239,6 +239,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 8f2eb9b43c23b03918c50fa721a47f3ab99e4ec6 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 045/136] 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: I36cca511da295412332193524219e32607ef8261 Task-number: QTBUG-56639 Reviewed-by: Laszlo Agocs Reviewed-by: Tor Arne Vestbø --- 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 7c8c698a7db..113b7895123 100644 --- a/src/gui/kernel/qopenglcontext_p.h +++ b/src/gui/kernel/qopenglcontext_p.h @@ -258,7 +258,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 b1b580f85b8..b5fa6b97851 100644 --- a/src/gui/opengl/qopenglframebufferobject.cpp +++ b/src/gui/opengl/qopenglframebufferobject.cpp @@ -949,6 +949,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 356f5bbac3a66701e958896f8075bbacc90439df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Tue, 25 Oct 2016 08:14:21 +0200 Subject: [PATCH 046/136] Cocoa: Make child window cursors work correctly The existing cursor logic had a couple of issues: - It made the faulty assumption that we could not use the NSWindow invalidateCursorRectsForView API for child NSViews. - It used NSWindow invalidateCursorRectsForView and NSView resetCursorRects. This API has been replaced by the more general NSTrackingArea API. - It did not implement falling back to the parent window cursor if the current window has no cursor set. Document that QWindow cursors work the same way as QWidget cursors in that a QWindow with no set cursor will fall back to the parent window cursor. Change the cocoa platform code to use NSTrackingArea exclusively and implement NSView cursorUpdate which sets the cursor. Handle immediate change on QWindow:: setCursor() manually. Add QWindow::effectiveWindowCursor() and applyEffectiveWindowCursor() which finds the correct window cursor. Add a manual test for the child window, child widget, and QWidget::createWindowChild cases. Task-number: QTBUG-33479 Task-number: QTBUG-52023 Change-Id: I0370e11bbadb2da95e8632e61be6228ec2cd5e9d Reviewed-by: Timur Pocheptsov --- src/gui/kernel/qwindow.cpp | 3 + src/plugins/platforms/cocoa/qcocoacursor.mm | 9 +- src/plugins/platforms/cocoa/qcocoawindow.h | 2 + src/plugins/platforms/cocoa/qcocoawindow.mm | 62 +++++--- src/plugins/platforms/cocoa/qnsview.h | 1 - src/plugins/platforms/cocoa/qnsview.mm | 19 +-- .../qcursor/childwidget/childwidget.pro | 6 + tests/manual/qcursor/childwidget/main.cpp | 92 ++++++++++++ .../qcursor/childwindow/childwindow.pro | 5 + tests/manual/qcursor/childwindow/main.cpp | 91 ++++++++++++ .../childwindowcontainer.pro | 6 + .../qcursor/childwindowcontainer/main.cpp | 138 ++++++++++++++++++ tests/manual/qcursor/qcursor.pro | 2 +- 13 files changed, 396 insertions(+), 40 deletions(-) create mode 100644 tests/manual/qcursor/childwidget/childwidget.pro create mode 100644 tests/manual/qcursor/childwidget/main.cpp create mode 100644 tests/manual/qcursor/childwindow/childwindow.pro create mode 100644 tests/manual/qcursor/childwindow/main.cpp create mode 100644 tests/manual/qcursor/childwindowcontainer/childwindowcontainer.pro create mode 100644 tests/manual/qcursor/childwindowcontainer/main.cpp diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 2ff19f5175e..c7ad10a46f0 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -2462,6 +2462,9 @@ void QWindowPrivate::_q_clearAlert() See the \l{Qt::CursorShape}{list of predefined cursor objects} for a range of useful shapes. + If no cursor has been set, or after a call to unsetCursor(), the + parent window's cursor is used. + By default, the cursor has the Qt::ArrowCursor shape. Some underlying window implementations will reset the cursor if it diff --git a/src/plugins/platforms/cocoa/qcocoacursor.mm b/src/plugins/platforms/cocoa/qcocoacursor.mm index 8e38181c292..a4c291c14a3 100644 --- a/src/plugins/platforms/cocoa/qcocoacursor.mm +++ b/src/plugins/platforms/cocoa/qcocoacursor.mm @@ -55,7 +55,7 @@ QCocoaCursor::~QCocoaCursor() void QCocoaCursor::changeCursor(QCursor *cursor, QWindow *window) { - NSCursor * cocoaCursor = convertCursor(cursor); + NSCursor *cocoaCursor = convertCursor(cursor); if (QPlatformWindow * platformWindow = window->handle()) static_cast(platformWindow)->setWindowCursor(cocoaCursor); @@ -77,9 +77,12 @@ void QCocoaCursor::setPos(const QPoint &position) CFRelease(e); } -NSCursor *QCocoaCursor::convertCursor(QCursor * cursor) +NSCursor *QCocoaCursor::convertCursor(QCursor *cursor) { - const Qt::CursorShape newShape = cursor ? cursor->shape() : Qt::ArrowCursor; + if (cursor == Q_NULLPTR) + return 0; + + const Qt::CursorShape newShape = cursor->shape(); NSCursor *cocoaCursor; // Check for a suitable built-in NSCursor first: diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 9cf63282812..bf28f83540b 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -236,6 +236,8 @@ public: void setMenubar(QCocoaMenuBar *mb); QCocoaMenuBar *menubar() const; + NSCursor *effectiveWindowCursor() const; + void applyEffectiveWindowCursor(); void setWindowCursor(NSCursor *cursor); void registerTouch(bool enable); diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 977a5ae6574..a18d93b89e1 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -1645,29 +1645,51 @@ QCocoaMenuBar *QCocoaWindow::menubar() const return m_menubar; } +// Finds the effective cursor for this window by walking up the +// ancestor chain (including this window) until a set cursor is +// found. Returns nil if there is not set cursor. +NSCursor *QCocoaWindow::effectiveWindowCursor() const +{ + + if (m_windowCursor) + return m_windowCursor; + if (!parent()) + return nil; + return static_cast(parent())->effectiveWindowCursor(); +} + +// Applies the cursor as returned by effectiveWindowCursor(), handles +// the special no-cursor-set case by setting the arrow cursor. +void QCocoaWindow::applyEffectiveWindowCursor() +{ + NSCursor *effectiveCursor = effectiveWindowCursor(); + if (effectiveCursor) { + [effectiveCursor set]; + } else { + // We wold like to _unset_ the cursor here; but there is no such + // API. Fall back to setting the default arrow cursor. + [[NSCursor arrowCursor] set]; + } +} + void QCocoaWindow::setWindowCursor(NSCursor *cursor) { - // This function is called (via QCocoaCursor) by Qt to set - // the cursor for this window. It can be called for a window - // that is not currenly under the mouse pointer (for example - // for a popup window.) Qt expects the set cursor to "stick": - // it should be accociated with the window until a different - // cursor is set. - if (m_windowCursor != cursor) { - [m_windowCursor release]; - m_windowCursor = [cursor retain]; - } + if (m_windowCursor == cursor) + return; - // Use the built in cursor rect API if the QCocoaWindow has a NSWindow. - // Othervise, set the cursor if this window is under the mouse. In - // this case QNSView::cursorUpdate will set the cursor as the pointer - // moves. - if (m_nsWindow && m_qtView) { - [m_nsWindow invalidateCursorRectsForView : m_qtView]; - } else { - if (m_windowUnderMouse) - [cursor set]; - } + // Setting a cursor in a foregin view is not supported. + if (!m_qtView) + return; + + [m_windowCursor release]; + m_windowCursor = cursor; + [m_windowCursor retain]; + + // The installed view tracking area (see QNSView updateTrackingAreas) will + // handle cursor updates on mouse enter/leave. Handle the case where the + // mouse is on the this window by changing the cursor immediately. + if (m_windowUnderMouse) + applyEffectiveWindowCursor(); } void QCocoaWindow::registerTouch(bool enable) diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index 2d4ad7aad37..9d2b54a3211 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -118,7 +118,6 @@ Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper)); - (void)mouseMovedImpl:(NSEvent *)theEvent; - (void)mouseEnteredImpl:(NSEvent *)theEvent; - (void)mouseExitedImpl:(NSEvent *)theEvent; -- (void)cursorUpdateImpl:(NSEvent *)theEvent; - (void)rightMouseDown:(NSEvent *)theEvent; - (void)rightMouseDragged:(NSEvent *)theEvent; - (void)rightMouseUp:(NSEvent *)theEvent; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index c67bcfd23bb..1ad9b5f327c 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -120,7 +120,7 @@ static bool _q_dontOverrideCtrlLMB = false; - (void)cursorUpdate:(NSEvent *)theEvent { - [view cursorUpdateImpl:theEvent]; + [self cursorUpdate:theEvent]; } @end @@ -924,21 +924,10 @@ QT_WARNING_POP [self addTrackingArea:m_trackingArea]; } --(void)cursorUpdateImpl:(NSEvent *)theEvent +- (void)cursorUpdate:(NSEvent *)theEvent { - Q_UNUSED(theEvent) - // Set the cursor manually if there is no NSWindow. - if (!m_platformWindow->m_nsWindow && m_platformWindow->m_windowCursor) - [m_platformWindow->m_windowCursor set]; - else - [super cursorUpdate:theEvent]; -} - --(void)resetCursorRects -{ - // Use the cursor rect API if there is a NSWindow - if (m_platformWindow->m_nsWindow && m_platformWindow->m_windowCursor) - [self addCursorRect:[self visibleRect] cursor:m_platformWindow->m_windowCursor]; + Q_UNUSED(theEvent); + m_platformWindow->applyEffectiveWindowCursor(); } - (void)mouseMovedImpl:(NSEvent *)theEvent diff --git a/tests/manual/qcursor/childwidget/childwidget.pro b/tests/manual/qcursor/childwidget/childwidget.pro new file mode 100644 index 00000000000..9ca41c5b4f1 --- /dev/null +++ b/tests/manual/qcursor/childwidget/childwidget.pro @@ -0,0 +1,6 @@ +TEMPLATE = app +TARGET = childwidget +INCLUDEPATH += . +QT += widgets + +SOURCES += main.cpp diff --git a/tests/manual/qcursor/childwidget/main.cpp b/tests/manual/qcursor/childwidget/main.cpp new file mode 100644 index 00000000000..4447c87210d --- /dev/null +++ b/tests/manual/qcursor/childwidget/main.cpp @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite 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 + +class CursorWidget : public QWidget +{ +public: + CursorWidget(QCursor cursor, QColor color) + :m_cursor(cursor) + ,m_color(color) + { + if (cursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(cursor); + } + + void paintEvent(QPaintEvent *e) + { + QPainter p(this); + p.fillRect(e->rect(), m_color); + } + + void mousePressEvent(QMouseEvent *) + { + // Toggle cursor + QCursor newCursor = (cursor().shape() == m_cursor.shape()) ? QCursor() : m_cursor; + if (newCursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(newCursor); + } + +private: + QCursor m_cursor; + QColor m_color; +}; + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + // Test child widgets (one of which is native) with set cursors. + // Click window to toggle cursor. + + CursorWidget w1((QCursor(Qt::SizeVerCursor)), QColor(Qt::blue).darker()); + w1.resize(200, 200); + w1.show(); + + CursorWidget w2((QCursor(Qt::OpenHandCursor)), QColor(Qt::red).darker()); + w2.setParent(&w1); + w2.setGeometry(0, 0, 100, 100); + w2.show(); + + CursorWidget w3((QCursor(Qt::IBeamCursor)), QColor(Qt::green).darker()); + w3.winId(); + w3.setParent(&w1); + w3.setGeometry(100, 100, 100, 100); + w3.show(); + + return app.exec(); +} diff --git a/tests/manual/qcursor/childwindow/childwindow.pro b/tests/manual/qcursor/childwindow/childwindow.pro new file mode 100644 index 00000000000..194536a91a7 --- /dev/null +++ b/tests/manual/qcursor/childwindow/childwindow.pro @@ -0,0 +1,5 @@ +TEMPLATE = app +TARGET = childwindow +INCLUDEPATH += . + +SOURCES += main.cpp diff --git a/tests/manual/qcursor/childwindow/main.cpp b/tests/manual/qcursor/childwindow/main.cpp new file mode 100644 index 00000000000..5fc293dfcfd --- /dev/null +++ b/tests/manual/qcursor/childwindow/main.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite 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 + +class CursorWindow : public QRasterWindow +{ +public: + CursorWindow(QCursor cursor, QColor color) + :m_cursor(cursor) + ,m_color(color) + { + if (cursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(cursor); + } + + void paintEvent(QPaintEvent *e) + { + QPainter p(this); + p.fillRect(e->rect(), m_color); + } + + void mousePressEvent(QMouseEvent *) + { + // Toggle cursor + QCursor newCursor = (cursor().shape() == m_cursor.shape()) ? QCursor() : m_cursor; + if (newCursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(newCursor); + } + +private: + QCursor m_cursor; + QColor m_color; +}; + +int main(int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + // Test child windows with set cursors. Create parent window and + // two child windows. Click window to toggle cursor. + + CursorWindow w1((QCursor(Qt::SizeVerCursor)), QColor(Qt::blue).darker()); + w1.resize(200, 200); + w1.show(); + + CursorWindow w2((QCursor(Qt::OpenHandCursor)), QColor(Qt::red).darker()); + w2.setParent(&w1); + w2.setGeometry(0, 0, 100, 100); + w2.show(); + + CursorWindow w3((QCursor(Qt::IBeamCursor)), QColor(Qt::green).darker()); + w3.setParent(&w1); + w3.setGeometry(100, 100, 100, 100); + w3.show(); + + return app.exec(); +} diff --git a/tests/manual/qcursor/childwindowcontainer/childwindowcontainer.pro b/tests/manual/qcursor/childwindowcontainer/childwindowcontainer.pro new file mode 100644 index 00000000000..2233ce4a634 --- /dev/null +++ b/tests/manual/qcursor/childwindowcontainer/childwindowcontainer.pro @@ -0,0 +1,6 @@ +TEMPLATE = app +TARGET = childwindowcontainer +INCLUDEPATH += . +QT += widgets + +SOURCES += main.cpp diff --git a/tests/manual/qcursor/childwindowcontainer/main.cpp b/tests/manual/qcursor/childwindowcontainer/main.cpp new file mode 100644 index 00000000000..d440133a42d --- /dev/null +++ b/tests/manual/qcursor/childwindowcontainer/main.cpp @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite 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 + +class CursorWindow : public QRasterWindow +{ +public: + CursorWindow(QCursor cursor, QColor color) + :m_cursor(cursor) + ,m_color(color) + { + if (cursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(cursor); + } + + void paintEvent(QPaintEvent *e) + { + QPainter p(this); + p.fillRect(e->rect(), m_color); + } + + void mousePressEvent(QMouseEvent *) + { + // Toggle cursor + QCursor newCursor = (cursor().shape() == m_cursor.shape()) ? QCursor() : m_cursor; + if (newCursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(newCursor); + } + +private: + QCursor m_cursor; + QColor m_color; +}; + +class CursorWidget : public QWidget +{ +public: + CursorWidget(QCursor cursor, QColor color) + :m_cursor(cursor) + ,m_color(color) + { + if (cursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(cursor); + } + + void paintEvent(QPaintEvent *e) + { + QPainter p(this); + p.fillRect(e->rect(), m_color); + } + + void mousePressEvent(QMouseEvent *) + { + // Toggle cursor + QCursor newCursor = (cursor().shape() == m_cursor.shape()) ? QCursor() : m_cursor; + if (newCursor.shape() == Qt::ArrowCursor) + unsetCursor(); + else + setCursor(newCursor); + } + +private: + QCursor m_cursor; + QColor m_color; +}; + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + { + // Create top-level windowContainer with window. Setting the cursor + // for the container should set the cursor for the window as well. + // Setting the cursor for the window overrides the cursor for the + // container. The example starts out with a window cursor; click + // to fall back to the container cursor. + CursorWindow *w1 = new CursorWindow(QCursor(Qt::OpenHandCursor), QColor(Qt::red).darker()); + QWidget* container = QWidget::createWindowContainer(w1); + container->resize(200, 200); + container->setCursor(Qt::PointingHandCursor); + container->show(); + } + + { + // Similar to above, but with a top-level QWiget + CursorWidget *w1 = new CursorWidget(QCursor(Qt::IBeamCursor), QColor(Qt::green).darker()); + w1->resize(200, 200); + + CursorWindow *w2 = new CursorWindow(QCursor(Qt::OpenHandCursor), QColor(Qt::red).darker()); + QWidget* container = QWidget::createWindowContainer(w2); + container->winId(); // must make the container native, otherwise setCursor + // sets the cursor on a QWindowContainerClassWindow which + // is outside the QWindow hierarchy (macOS). + container->setParent(w1); + container->setCursor(Qt::PointingHandCursor); + container->setGeometry(0, 0, 100, 100); + + w1->show(); + } + + return app.exec(); +} diff --git a/tests/manual/qcursor/qcursor.pro b/tests/manual/qcursor/qcursor.pro index 0b5c2b19452..c6617b8e890 100644 --- a/tests/manual/qcursor/qcursor.pro +++ b/tests/manual/qcursor/qcursor.pro @@ -1,3 +1,3 @@ TEMPLATE = subdirs -SUBDIRS = allcursors grab_override qcursorhighdpi +SUBDIRS = allcursors childwidget childwindow childwindowcontainer grab_override qcursorhighdpi From d7bcdc3a442b99c2caebd4cfd38de67e14090e05 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 2 Nov 2016 16:45:41 +0100 Subject: [PATCH 047/136] QStyleHelper::uniqueName(): Improve palette pixmap cache key Use QDataStream to obtain cache key for a palettes that are different from the default QPalette. This results in unique keys for palettes created from QStyleSheetStyle's render rules. Task-number: QTBUG-56743 Change-Id: Icbfe165f705ef3e1c9e88cfc9dca88ff1d1e81e6 Reviewed-by: Andy Shaw --- src/widgets/styles/qstylehelper.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/widgets/styles/qstylehelper.cpp b/src/widgets/styles/qstylehelper.cpp index 6602b58a9d1..960695e9df8 100644 --- a/src/widgets/styles/qstylehelper.cpp +++ b/src/widgets/styles/qstylehelper.cpp @@ -43,6 +43,8 @@ #include "qstylehelper_p.h" #include +#include +#include QT_BEGIN_NAMESPACE @@ -56,7 +58,6 @@ QString uniqueName(const QString &key, const QStyleOption *option, const QSize & QString tmp = key % HexString(option->state) % HexString(option->direction) % HexString(complexOption ? uint(complexOption->activeSubControls) : 0u) - % HexString(option->palette.cacheKey()) % HexString(size.width()) % HexString(size.height()); @@ -67,6 +68,25 @@ QString uniqueName(const QString &key, const QStyleOption *option, const QSize & % QLatin1Char(spinBox->frame ? '1' : '0'); ; } #endif // QT_NO_SPINBOX + + // QTBUG-56743, try to create a palette cache key reflecting the value, + // as leaks may occur in conjunction with QStyleSheetStyle/QRenderRule modifying + // palettes when using QPalette::cacheKey() + if (option->palette != QGuiApplication::palette()) { + tmp.append(QLatin1Char('P')); +#ifndef QT_NO_DATASTREAM + QByteArray key; + key.reserve(5120); // Observed 5040B for a serialized palette on 64bit + { + QDataStream str(&key, QIODevice::WriteOnly); + str << option->palette; + } + const QByteArray sha1 = QCryptographicHash::hash(key, QCryptographicHash::Sha1).toHex(); + tmp.append(QString::fromLatin1(sha1)); +#else // QT_NO_DATASTREAM + tmp.append(QString::number(option->palette.cacheKey(), 16)); +#endif // !QT_NO_DATASTREAM + } return tmp; } From aa7e764058cb820c86341c91360976b6bddfd4da Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 4 Nov 2016 12:38:50 +0100 Subject: [PATCH 048/136] MinGW: Explicitly define NTDDI_VERSION Define NTDDI_VERSION, just like _WIN32_WINNT, to be Windows Vista. Usually NTDDI_VERSION is automatically set by MinGW headers to the value that matches _WIN32_WINNT. However, for precompiled headers the inclusion order is that _WIN32_WINNT is set _after_ the relevant MinGW header is parsed, so this can fail. The alternative would be to set _WIN32_WINNT via a compiler flag, e.g. in the mkspecs. Change-Id: Id59e7083f0d3e00491b54e87647c6c9fabb99795 Reviewed-by: Friedemann Kleint Reviewed-by: Thiago Macieira --- src/corelib/global/qt_windows.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/corelib/global/qt_windows.h b/src/corelib/global/qt_windows.h index 7b95501c08b..bc48104edc3 100644 --- a/src/corelib/global/qt_windows.h +++ b/src/corelib/global/qt_windows.h @@ -53,6 +53,9 @@ # ifndef _WIN32_WINNT # define _WIN32_WINNT 0x600 # endif +# ifndef NTDDI_VERSION +# define NTDDI_VERSION 0x06000000 +# endif #endif #ifndef NOMINMAX From aa73a7026fd8093a340b20dacba7b10e5ffa03ac Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 2 Nov 2016 13:58:54 +0100 Subject: [PATCH 049/136] QStandardPaths: Replace deprecated Win32 SHGetSpecialFolderPath SHGetSpecialFolderPath is declared 'unsupported' by Microsoft, and has problems with non-ASCII characters. Replace it by the newer SHGetKnownFolderPath. To fix compilation with MinGW, we have to link in libuuid also in the bootstrapped tools. The alternative is redefining all GUID's (like we did for FOLDERID_Downloads), which is arguably less elegant. Task-number: QTBUG-50570 Change-Id: If99be559bc72de3734ae1fa4d50f960659739898 Reviewed-by: Thiago Macieira Reviewed-by: Friedemann Kleint --- src/corelib/io/qstandardpaths_win.cpp | 77 ++++++++++----------------- src/tools/bootstrap/bootstrap.pro | 5 +- 2 files changed, 31 insertions(+), 51 deletions(-) diff --git a/src/corelib/io/qstandardpaths_win.cpp b/src/corelib/io/qstandardpaths_win.cpp index 38c63553ea1..94beed0c1f0 100644 --- a/src/corelib/io/qstandardpaths_win.cpp +++ b/src/corelib/io/qstandardpaths_win.cpp @@ -47,17 +47,10 @@ #include #endif -const GUID qCLSID_FOLDERID_Downloads = { 0x374de290, 0x123f, 0x4565, { 0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b } }; - #include #include #include -#ifndef CSIDL_MYMUSIC -#define CSIDL_MYMUSIC 13 -#define CSIDL_MYVIDEO 14 -#endif - #ifndef QT_NO_STANDARDPATHS QT_BEGIN_NAMESPACE @@ -108,47 +101,31 @@ static inline void appendTestMode(QString &path) path += QLatin1String("/qttest"); } -// Map QStandardPaths::StandardLocation to CLSID of SHGetSpecialFolderPath() -static int writableSpecialFolderClsid(QStandardPaths::StandardLocation type) +// Map QStandardPaths::StandardLocation to KNOWNFOLDERID of SHGetKnownFolderPath() +static GUID writableSpecialFolderId(QStandardPaths::StandardLocation type) { - static const int clsids[] = { - CSIDL_DESKTOPDIRECTORY, // DesktopLocation - CSIDL_PERSONAL, // DocumentsLocation - CSIDL_FONTS, // FontsLocation - CSIDL_PROGRAMS, // ApplicationsLocation - CSIDL_MYMUSIC, // MusicLocation - CSIDL_MYVIDEO, // MoviesLocation - CSIDL_MYPICTURES, // PicturesLocation - -1, -1, // TempLocation/HomeLocation - CSIDL_LOCAL_APPDATA, // AppLocalDataLocation ("Local" path), AppLocalDataLocation = DataLocation - -1, // CacheLocation - CSIDL_LOCAL_APPDATA, // GenericDataLocation ("Local" path) - -1, // RuntimeLocation - CSIDL_LOCAL_APPDATA, // ConfigLocation ("Local" path) - -1, -1, // DownloadLocation/GenericCacheLocation - CSIDL_LOCAL_APPDATA, // GenericConfigLocation ("Local" path) - CSIDL_APPDATA, // AppDataLocation ("Roaming" path) - CSIDL_LOCAL_APPDATA, // AppConfigLocation ("Local" path) + static const GUID folderIds[] = { + FOLDERID_Desktop, // DesktopLocation + FOLDERID_Documents, // DocumentsLocation + FOLDERID_Fonts, // FontsLocation + FOLDERID_Programs, // ApplicationsLocation + FOLDERID_Music, // MusicLocation + FOLDERID_Videos, // MoviesLocation + FOLDERID_Pictures, // PicturesLocation + GUID(), GUID(), // TempLocation/HomeLocation + FOLDERID_LocalAppData, // AppLocalDataLocation ("Local" path), AppLocalDataLocation = DataLocation + GUID(), // CacheLocation + FOLDERID_LocalAppData, // GenericDataLocation ("Local" path) + GUID(), // RuntimeLocation + FOLDERID_LocalAppData, // ConfigLocation ("Local" path) + GUID(), GUID(), // DownloadLocation/GenericCacheLocation + FOLDERID_LocalAppData, // GenericConfigLocation ("Local" path) + FOLDERID_RoamingAppData,// AppDataLocation ("Roaming" path) + FOLDERID_LocalAppData, // AppConfigLocation ("Local" path) }; - Q_STATIC_ASSERT(sizeof(clsids) / sizeof(clsids[0]) == size_t(QStandardPaths::AppConfigLocation + 1)); - return size_t(type) < sizeof(clsids) / sizeof(clsids[0]) ? clsids[type] : -1; -}; - -// Convenience for SHGetSpecialFolderPath(). -static QString sHGetSpecialFolderPath(int clsid, QStandardPaths::StandardLocation type, bool warn = false) -{ - QString result; - wchar_t path[MAX_PATH]; - if (Q_LIKELY(clsid >= 0 && SHGetSpecialFolderPath(0, path, clsid, FALSE))) { - result = convertCharArray(path); - } else { - if (warn) { - qErrnoWarning("SHGetSpecialFolderPath() failed for standard location \"%s\", clsid=0x%x.", - qPrintable(displayName(type)), clsid); - } - } - return result; + Q_STATIC_ASSERT(sizeof(folderIds) / sizeof(folderIds[0]) == size_t(QStandardPaths::AppConfigLocation + 1)); + return size_t(type) < sizeof(folderIds) / sizeof(folderIds[0]) ? folderIds[type] : GUID(); } // Convenience for SHGetKnownFolderPath(). @@ -178,7 +155,7 @@ QString QStandardPaths::writableLocation(StandardLocation type) QString result; switch (type) { case DownloadLocation: - result = sHGetKnownFolderPath(qCLSID_FOLDERID_Downloads, type); + result = sHGetKnownFolderPath(FOLDERID_Downloads, type); if (result.isEmpty()) result = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); break; @@ -187,7 +164,7 @@ QString QStandardPaths::writableLocation(StandardLocation type) // Although Microsoft has a Cache key it is a pointer to IE's cache, not a cache // location for everyone. Most applications seem to be using a // cache directory located in their AppData directory - result = sHGetSpecialFolderPath(writableSpecialFolderClsid(AppLocalDataLocation), type, /* warn */ true); + result = sHGetKnownFolderPath(writableSpecialFolderId(AppLocalDataLocation), type, /* warn */ true); if (!result.isEmpty()) { appendTestMode(result); appendOrganizationAndApp(result); @@ -196,7 +173,7 @@ QString QStandardPaths::writableLocation(StandardLocation type) break; case GenericCacheLocation: - result = sHGetSpecialFolderPath(writableSpecialFolderClsid(GenericDataLocation), type, /* warn */ true); + result = sHGetKnownFolderPath(writableSpecialFolderId(GenericDataLocation), type, /* warn */ true); if (!result.isEmpty()) { appendTestMode(result); result += QLatin1String("/cache"); @@ -213,7 +190,7 @@ QString QStandardPaths::writableLocation(StandardLocation type) break; default: - result = sHGetSpecialFolderPath(writableSpecialFolderClsid(type), type, /* warn */ isConfigLocation(type)); + result = sHGetKnownFolderPath(writableSpecialFolderId(type), type, /* warn */ isConfigLocation(type)); if (!result.isEmpty() && isConfigLocation(type)) { appendTestMode(result); if (!isGenericConfigLocation(type)) @@ -233,7 +210,7 @@ QStringList QStandardPaths::standardLocations(StandardLocation type) // type-specific handling goes here if (isConfigLocation(type)) { - QString programData = sHGetSpecialFolderPath(CSIDL_COMMON_APPDATA, type); + QString programData = sHGetKnownFolderPath(FOLDERID_ProgramData, type); if (!programData.isEmpty()) { if (!isGenericConfigLocation(type)) appendOrganizationAndApp(programData); diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index 0e0a617f2bc..d51f9e98a45 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -134,7 +134,10 @@ macx { include(../../3rdparty/zlib_dependency.pri) } -win32:LIBS += -luser32 -lole32 -ladvapi32 -lshell32 +win32 { + LIBS += -luser32 -lole32 -ladvapi32 -lshell32 + mingw: LIBS += -luuid +} load(qt_module) From b5fa247102c610d8ed4c1d88a7f1ea685b96c91f Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 3 Nov 2016 11:17:14 +0100 Subject: [PATCH 050/136] QStandardPaths: Do not check whether path exists (Windows) It's arguably better to return a non-existing location than no location at all. This makes it in line with the documentation for e.g. QStandardPaths::writableLocation that says Note: The storage location returned can be a directory that does not exist; i.e., it may need to be created by the system or the user. Finally, this was also the behavior of code that used SHGetSpecialFolderPath before. Change-Id: I5ee44747a38434535610e45a4d303b36ef79d42a Reviewed-by: Thiago Macieira Reviewed-by: Friedemann Kleint --- src/corelib/io/qstandardpaths_win.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/io/qstandardpaths_win.cpp b/src/corelib/io/qstandardpaths_win.cpp index 94beed0c1f0..a64bde6fb4d 100644 --- a/src/corelib/io/qstandardpaths_win.cpp +++ b/src/corelib/io/qstandardpaths_win.cpp @@ -138,7 +138,7 @@ static QString sHGetKnownFolderPath(const GUID &clsid, QStandardPaths::StandardL reinterpret_cast(QSystemLibrary::resolve(QLatin1String("shell32"), "SHGetKnownFolderPath")); LPWSTR path; - if (Q_LIKELY(sHGetKnownFolderPath && SUCCEEDED(sHGetKnownFolderPath(clsid, 0, 0, &path)))) { + if (Q_LIKELY(sHGetKnownFolderPath && SUCCEEDED(sHGetKnownFolderPath(clsid, KF_FLAG_DONT_VERIFY, 0, &path)))) { result = convertCharArray(path); CoTaskMemFree(path); } else { From ed7f77071dcca996a8c8147fd66344090666e60c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 5 Aug 2016 10:12:12 +0200 Subject: [PATCH 051/136] Replace custom type traits with std one's Remove most type traits from qtypetraits.h, but keep the custom implementation of is_signed/is_unsigned. This gets rid of BSD-3 licensed code from Google in a public header (hugh!). The custom implementations for is_signed/is_unsigned are kept because the implementations in gcc's standard headers do not work as we expect for enums - both is_signed and is_unsigned always returns false there - see also https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59027 [ChangeLog][QtCore][General] Qt now relies on type traits from the C++ standard library. Change-Id: I3f2188b46949f04ca4482a6ac9afd3482103f0e1 Reviewed-by: Thiago Macieira --- src/corelib/global/qflags.h | 2 +- src/corelib/global/qglobal.h | 3 +- src/corelib/global/qisenum.h | 3 +- src/corelib/global/qnumeric_p.h | 4 +- src/corelib/global/qtypeinfo.h | 7 +- src/corelib/global/qtypetraits.h | 450 +----------------- src/corelib/kernel/qmetatype.h | 9 +- src/corelib/kernel/qobject.h | 12 +- src/corelib/kernel/qpointer.h | 2 +- src/corelib/kernel/qtimer.h | 8 +- src/corelib/kernel/qvariant_p.h | 10 +- src/corelib/thread/qmutex.cpp | 3 +- src/corelib/tools/qbytearray_p.h | 3 +- src/corelib/tools/qhash.h | 2 +- src/corelib/tools/qlist.h | 4 +- src/corelib/tools/qmap.h | 7 +- src/corelib/tools/qsharedpointer_impl.h | 2 +- src/corelib/tools/qstringalgorithms_p.h | 4 +- src/testlib/qtestcase.h | 3 +- src/widgets/graphicsview/qgraphicsitem.h | 4 +- src/widgets/styles/qstyleoption.h | 8 +- src/widgets/widgets/qmenu.h | 4 +- src/widgets/widgets/qtoolbar.h | 4 +- .../corelib/global/qglobal/tst_qglobal.cpp | 5 +- .../qhashfunctions/tst_qhashfunctions.cpp | 3 +- 25 files changed, 58 insertions(+), 508 deletions(-) diff --git a/src/corelib/global/qflags.h b/src/corelib/global/qflags.h index a6bd37c33fe..f85fc705b46 100644 --- a/src/corelib/global/qflags.h +++ b/src/corelib/global/qflags.h @@ -102,7 +102,7 @@ public: // the definition below is too complex for qdoc typedef int Int; #else - typedef typename QtPrivate::if_< + typedef typename std::conditional< QtPrivate::is_unsigned::value, unsigned int, signed int diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 1bcd30e0b38..99be82f8c3e 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -42,6 +42,7 @@ #define QGLOBAL_H #ifdef __cplusplus +# include # include #endif @@ -963,7 +964,7 @@ public: // - if there was a break inside the inner loop, it will exit with control still // set to 1; in that case, the outer loop will invert it to 0 and will exit too #define Q_FOREACH(variable, container) \ -for (QForeachContainer::type> _container_((container)); \ +for (QForeachContainer::type> _container_((container)); \ _container_.control && _container_.i != _container_.e; \ ++_container_.i, _container_.control ^= 1) \ for (variable = *_container_.i; _container_.control; _container_.control = 0) diff --git a/src/corelib/global/qisenum.h b/src/corelib/global/qisenum.h index 0a4d44619cd..185db5e45f5 100644 --- a/src/corelib/global/qisenum.h +++ b/src/corelib/global/qisenum.h @@ -55,8 +55,7 @@ #endif #ifndef Q_IS_ENUM -# include -# define Q_IS_ENUM(x) QtPrivate::is_enum::value +# define Q_IS_ENUM(x) std::is_enum::value #endif // shut up syncqt diff --git a/src/corelib/global/qnumeric_p.h b/src/corelib/global/qnumeric_p.h index ef40a45dc49..23fcf340f1f 100644 --- a/src/corelib/global/qnumeric_p.h +++ b/src/corelib/global/qnumeric_p.h @@ -172,7 +172,7 @@ static inline bool qt_is_finite(float f) // Unsigned overflow math // namespace { -template inline typename QtPrivate::QEnableIf::value, bool>::Type +template inline typename QtPrivate::QEnableIf::value, bool>::Type add_overflow(T v1, T v2, T *r) { // unsigned additions are well-defined @@ -180,7 +180,7 @@ add_overflow(T v1, T v2, T *r) return v1 > T(v1 + v2); } -template inline typename QtPrivate::QEnableIf::value, bool>::Type +template inline typename QtPrivate::QEnableIf::value, bool>::Type mul_overflow(T v1, T v2, T *r) { // use the next biggest type diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h index e709050011e..cdc85ab1d02 100644 --- a/src/corelib/global/qtypeinfo.h +++ b/src/corelib/global/qtypeinfo.h @@ -38,12 +38,13 @@ ** ****************************************************************************/ -#include #include #ifndef QTYPEINFO_H #define QTYPEINFO_H +#include + QT_BEGIN_NAMESPACE /* @@ -60,7 +61,7 @@ class QTypeInfo public: enum { isPointer = false, - isIntegral = QtPrivate::is_integral::value, + isIntegral = std::is_integral::value, isComplex = true, isStatic = true, isRelocatable = Q_IS_ENUM(T), @@ -247,7 +248,7 @@ public: \ isRelocatable = !isStatic || ((FLAGS) & Q_RELOCATABLE_TYPE), \ isLarge = (sizeof(TYPE)>sizeof(void*)), \ isPointer = false, \ - isIntegral = QtPrivate::is_integral< TYPE >::value, \ + isIntegral = std::is_integral< TYPE >::value, \ isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0), \ sizeOf = sizeof(TYPE) \ }; \ diff --git a/src/corelib/global/qtypetraits.h b/src/corelib/global/qtypetraits.h index c311303e276..b664dd3a3e7 100644 --- a/src/corelib/global/qtypetraits.h +++ b/src/corelib/global/qtypetraits.h @@ -37,451 +37,28 @@ ** ****************************************************************************/ -// BEGIN Google Code - -// Copyright (c) 2006, Google 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 Google 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. - -// ---- -// -// This code is compiled directly on many platforms, including client -// platforms like Windows, Mac, and embedded systems. Before making -// any changes here, make sure that you're not breaking any platforms. -// -// Define a small subset of tr1 type traits. The traits we define are: -// is_integral -// is_floating_point -// is_pointer -// is_enum -// is_reference -// is_const -// is_volatile -// is_pod -// has_trivial_constructor -// has_trivial_copy -// has_trivial_assign -// has_trivial_destructor -// is_signed -// is_unsigned -// remove_const -// remove_volatile -// remove_cv -// remove_reference -// add_reference -// remove_pointer -// is_same -// is_convertible -// We can add more type traits as required. - -// Changes from the original implementation: -// - Move base types from template_util.h directly into this header. -// - Use Qt macros for long long type differences on Windows. -// - Enclose in QtPrivate namespace. - #include "QtCore/qglobal.h" #ifndef QTYPETRAITS_H #define QTYPETRAITS_H -#include // For pair - QT_BEGIN_NAMESPACE namespace QtPrivate { -// Types small_ and big_ are guaranteed such that sizeof(small_) < -// sizeof(big_) -typedef char small_; - -struct big_ { - char dummy[2]; -}; - -// Identity metafunction. -template -struct identity_ { - typedef T type; -}; - -// integral_constant, defined in tr1, is a wrapper for an integer -// value. We don't really need this generality; we could get away -// with hardcoding the integer type to bool. We use the fully -// general integer_constant for compatibility with tr1. - -template -struct integral_constant { - static const T value = v; - typedef T value_type; - typedef integral_constant type; -}; - -template const T integral_constant::value; - - -// Abbreviations: true_type and false_type are structs that represent boolean -// true and false values. Also define the boost::mpl versions of those names, -// true_ and false_. -typedef integral_constant true_type; -typedef integral_constant false_type; -typedef true_type true_; -typedef false_type false_; - -// if_ is a templatized conditional statement. -// if_ is a compile time evaluation of cond. -// if_<>::type contains A if cond is true, B otherwise. -template -struct if_{ - typedef A type; -}; - -template -struct if_ { - typedef B type; -}; - - -// type_equals_ is a template type comparator, similar to Loki IsSameType. -// type_equals_::value is true iff "A" is the same type as "B". // -// New code should prefer base::is_same, defined in base/type_traits.h. -// It is functionally identical, but is_same is the standard spelling. -template -struct type_equals_ : public false_ { -}; - -template -struct type_equals_ : public true_ { -}; - -// and_ is a template && operator. -// and_::value evaluates "A::value && B::value". -template -struct and_ : public integral_constant { -}; - -// or_ is a template || operator. -// or_::value evaluates "A::value || B::value". -template -struct or_ : public integral_constant { -}; - -template struct is_integral; -template struct is_floating_point; -template struct is_pointer; -// MSVC can't compile this correctly, and neither can gcc 3.3.5 (at least) -#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) -// is_enum uses is_convertible, which is not available on MSVC. -template struct is_enum; -#endif -template struct is_reference; -template struct is_pod; -template struct has_trivial_constructor; -template struct has_trivial_copy; -template struct has_trivial_assign; -template struct has_trivial_destructor; -template struct remove_const; -template struct remove_volatile; -template struct remove_cv; -template struct remove_reference; -template struct add_reference; -template struct remove_pointer; -template struct is_same; -#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) -template struct is_convertible; -#endif - -// is_integral is false except for the built-in integer types. A -// cv-qualified type is integral if and only if the underlying type is. -template struct is_integral : false_type { }; -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -#if defined(_MSC_VER) -// wchar_t is not by default a distinct type from unsigned short in -// Microsoft C. -// See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx -template<> struct is_integral<__wchar_t> : true_type { }; -#else -template<> struct is_integral : true_type { }; -#endif -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -#if defined(Q_OS_WIN) && !defined(Q_CC_GNU) -template<> struct is_integral<__int64> : true_type { }; -template<> struct is_integral : true_type { }; -#else -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -#endif -template struct is_integral : is_integral { }; -template struct is_integral : is_integral { }; -template struct is_integral : is_integral { }; -#if defined (Q_COMPILER_UNICODE_STRINGS) -template<> struct is_integral : true_type { }; -template<> struct is_integral : true_type { }; -#endif - -// is_floating_point is false except for the built-in floating-point types. -// A cv-qualified type is integral if and only if the underlying type is. -template struct is_floating_point : false_type { }; -template<> struct is_floating_point : true_type { }; -template<> struct is_floating_point : true_type { }; -template<> struct is_floating_point : true_type { }; -template struct is_floating_point - : is_floating_point { }; -template struct is_floating_point - : is_floating_point { }; -template struct is_floating_point - : is_floating_point { }; - -// is_pointer is false except for pointer types. A cv-qualified type (e.g. -// "int* const", as opposed to "int const*") is cv-qualified if and only if -// the underlying type is. -template struct is_pointer : false_type { }; -template struct is_pointer : true_type { }; -template struct is_pointer : is_pointer { }; -template struct is_pointer : is_pointer { }; -template struct is_pointer : is_pointer { }; - -#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) - -namespace internal { - -template struct is_class_or_union { - template static small_ tester(void (U::*)()); - template static big_ tester(...); - static const bool value = sizeof(tester(0)) == sizeof(small_); -}; - -// is_convertible chokes if the first argument is an array. That's why -// we use add_reference here. -template struct is_enum_impl - : is_convertible::type, int> { }; - -template struct is_enum_impl : false_type { }; - -} // namespace internal - -// Specified by TR1 [4.5.1] primary type categories. - -// Implementation note: +// define custom is_signed, is_unsigned that also works with enum's // -// Each type is either void, integral, floating point, array, pointer, -// reference, member object pointer, member function pointer, enum, -// union or class. Out of these, only integral, floating point, reference, -// class and enum types are potentially convertible to int. Therefore, -// if a type is not a reference, integral, floating point or class and -// is convertible to int, it's a enum. Adding cv-qualification to a type -// does not change whether it's an enum. -// -// Is-convertible-to-int check is done only if all other checks pass, -// because it can't be used with some types (e.g. void or classes with -// inaccessible conversion operators). -template struct is_enum - : internal::is_enum_impl< - is_same::value || - is_integral::value || - is_floating_point::value || - is_reference::value || - internal::is_class_or_union::value, - T> { }; - -template struct is_enum : is_enum { }; -template struct is_enum : is_enum { }; -template struct is_enum : is_enum { }; - -#endif - -// is_reference is false except for reference types. -template struct is_reference : false_type {}; -template struct is_reference : true_type {}; - -// Specified by TR1 [4.5.3] Type Properties -template struct is_const : false_type {}; -template struct is_const : true_type {}; -template struct is_volatile : false_type {}; -template struct is_volatile : true_type {}; - -// We can't get is_pod right without compiler help, so fail conservatively. -// We will assume it's false except for arithmetic types, enumerations, -// pointers and cv-qualified versions thereof. Note that std::pair -// is not a POD even if T and U are PODs. -template struct is_pod - : integral_constant::value || - is_floating_point::value || -#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) - // is_enum is not available on MSVC. - is_enum::value || -#endif - is_pointer::value)> { }; -template struct is_pod : is_pod { }; -template struct is_pod : is_pod { }; -template struct is_pod : is_pod { }; - - -// We can't get has_trivial_constructor right without compiler help, so -// fail conservatively. We will assume it's false except for: (1) types -// for which is_pod is true. (2) std::pair of types with trivial -// constructors. (3) array of a type with a trivial constructor. -// (4) const versions thereof. -template struct has_trivial_constructor : is_pod { }; -template struct has_trivial_constructor > - : integral_constant::value && - has_trivial_constructor::value)> { }; -template struct has_trivial_constructor - : has_trivial_constructor { }; -template struct has_trivial_constructor - : has_trivial_constructor { }; - -// We can't get has_trivial_copy right without compiler help, so fail -// conservatively. We will assume it's false except for: (1) types -// for which is_pod is true. (2) std::pair of types with trivial copy -// constructors. (3) array of a type with a trivial copy constructor. -// (4) const versions thereof. -template struct has_trivial_copy : is_pod { }; -template struct has_trivial_copy > - : integral_constant::value && - has_trivial_copy::value)> { }; -template struct has_trivial_copy - : has_trivial_copy { }; -template struct has_trivial_copy : has_trivial_copy { }; - -// We can't get has_trivial_assign right without compiler help, so fail -// conservatively. We will assume it's false except for: (1) types -// for which is_pod is true. (2) std::pair of types with trivial copy -// constructors. (3) array of a type with a trivial assign constructor. -template struct has_trivial_assign : is_pod { }; -template struct has_trivial_assign > - : integral_constant::value && - has_trivial_assign::value)> { }; -template struct has_trivial_assign - : has_trivial_assign { }; - -// We can't get has_trivial_destructor right without compiler help, so -// fail conservatively. We will assume it's false except for: (1) types -// for which is_pod is true. (2) std::pair of types with trivial -// destructors. (3) array of a type with a trivial destructor. -// (4) const versions thereof. -template struct has_trivial_destructor : is_pod { }; -template struct has_trivial_destructor > - : integral_constant::value && - has_trivial_destructor::value)> { }; -template struct has_trivial_destructor - : has_trivial_destructor { }; -template struct has_trivial_destructor - : has_trivial_destructor { }; - -// Specified by TR1 [4.7.1] -template struct remove_const { typedef T type; }; -template struct remove_const { typedef T type; }; -template struct remove_volatile { typedef T type; }; -template struct remove_volatile { typedef T type; }; -template struct remove_cv { - typedef typename remove_const::type>::type type; -}; - - -// Specified by TR1 [4.7.2] Reference modifications. -template struct remove_reference { typedef T type; }; -template struct remove_reference { typedef T type; }; - -template struct add_reference { typedef T& type; }; -template struct add_reference { typedef T& type; }; - -// Specified by TR1 [4.7.4] Pointer modifications. -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { - typedef T type; }; - -// Specified by TR1 [4.6] Relationships between types -template struct is_same : public false_type { }; -template struct is_same : public true_type { }; - -// Specified by TR1 [4.6] Relationships between types -#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) -namespace internal { - -// This class is an implementation detail for is_convertible, and you -// don't need to know how it works to use is_convertible. For those -// who care: we declare two different functions, one whose argument is -// of type To and one with a variadic argument list. We give them -// return types of different size, so we can use sizeof to trick the -// compiler into telling us which function it would have chosen if we -// had called it with an argument of type From. See Alexandrescu's -// _Modern C++ Design_ for more details on this sort of trick. - -template -struct ConvertHelper { - static small_ Test(To); - static big_ Test(...); - static From Create(); -}; -} // namespace internal - -// Inherits from true_type if From is convertible to To, false_type otherwise. -template -struct is_convertible - : integral_constant::Test( - internal::ConvertHelper::Create())) - == sizeof(small_)> { -}; -#endif - -// END Google Code // a metafunction to invert an integral_constant: template struct not_ - : integral_constant {}; - -// same, with a bool argument: -template -struct not_c - : integral_constant {}; + : std::integral_constant {}; // Checks whether a type is unsigned (T must be convertible to unsigned int): template struct is_unsigned - : integral_constant {}; + : std::integral_constant {}; // Checks whether a type is signed (T must be convertible to int): template @@ -512,27 +89,6 @@ Q_STATIC_ASSERT((!is_unsigned::value)); Q_STATIC_ASSERT((!is_signed::value)); Q_STATIC_ASSERT(( is_signed::value)); -template struct is_default_constructible; - -template<> struct is_default_constructible -{ -protected: - template struct test { typedef char type; }; -public: - static bool const value = false; -}; -template<> struct is_default_constructible<>::test { typedef double type; }; - -template struct is_default_constructible : is_default_constructible<> -{ -private: - template static typename test::type sfinae(U*); - template static char sfinae(...); -public: - static bool const value = sizeof(sfinae(0)) > 1; -}; - - } // namespace QtPrivate QT_END_NAMESPACE diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 9e2a5bf75df..29e60b0eb58 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -46,7 +46,6 @@ #include #include #include -#include #ifndef QT_NO_QOBJECT #include #endif @@ -887,7 +886,7 @@ private: // is void* to avoid overloads conflicts. We do it by injecting unaccessible Dummy // type as part of the overload signature. struct Dummy {}; - typedef typename QtPrivate::if_::value, Dummy, value_type>::type value_type_OR_Dummy; + typedef typename std::conditional::value, Dummy, value_type>::type value_type_OR_Dummy; public: static void assign(void **ptr, const value_type_OR_Dummy *iterator ) { @@ -1092,7 +1091,7 @@ struct QSequentialIterableConvertFunctor } namespace QtMetaTypePrivate { -template::value> +template::value> struct AssociativeContainerAccessor { static const typename T::key_type& getKey(const typename T::const_iterator &it) @@ -1106,7 +1105,7 @@ struct AssociativeContainerAccessor } }; -template >::value> +template >::value> struct StlStyleAssociativeContainerAccessor; template @@ -1787,7 +1786,7 @@ template struct QMetaTypeIdQObject { enum { - Defined = QtPrivate::is_default_constructible::value + Defined = std::is_default_constructible::value }; static int qt_metatype_id() diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h index 3cec9802dc4..69b70ad6ec2 100644 --- a/src/corelib/kernel/qobject.h +++ b/src/corelib/kernel/qobject.h @@ -155,14 +155,14 @@ public: template inline T findChild(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const { - typedef typename QtPrivate::remove_cv::type>::type ObjType; + typedef typename std::remove_cv::type>::type ObjType; return static_cast(qt_qFindChild_helper(this, aName, ObjType::staticMetaObject, options)); } template inline QList findChildren(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const { - typedef typename QtPrivate::remove_cv::type>::type ObjType; + typedef typename std::remove_cv::type>::type ObjType; QList list; qt_qFindChildren_helper(this, aName, ObjType::staticMetaObject, reinterpret_cast *>(&list), options); @@ -173,7 +173,7 @@ public: template inline QList findChildren(const QRegExp &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const { - typedef typename QtPrivate::remove_cv::type>::type ObjType; + typedef typename std::remove_cv::type>::type ObjType; QList list; qt_qFindChildren_helper(this, re, ObjType::staticMetaObject, reinterpret_cast *>(&list), options); @@ -185,7 +185,7 @@ public: template inline QList findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const { - typedef typename QtPrivate::remove_cv::type>::type ObjType; + typedef typename std::remove_cv::type>::type ObjType; QList list; qt_qFindChildren_helper(this, re, ObjType::staticMetaObject, reinterpret_cast *>(&list), options); @@ -493,7 +493,7 @@ inline QT_DEPRECATED QList qFindChildren(const QObject *o, const QRegExp &re) template inline T qobject_cast(QObject *object) { - typedef typename QtPrivate::remove_cv::type>::type ObjType; + typedef typename std::remove_cv::type>::type ObjType; Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro::Value, "qobject_cast requires the type to have a Q_OBJECT macro"); return static_cast(ObjType::staticMetaObject.cast(object)); @@ -502,7 +502,7 @@ inline T qobject_cast(QObject *object) template inline T qobject_cast(const QObject *object) { - typedef typename QtPrivate::remove_cv::type>::type ObjType; + typedef typename std::remove_cv::type>::type ObjType; Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro::Value, "qobject_cast requires the type to have a Q_OBJECT macro"); return static_cast(ObjType::staticMetaObject.cast(object)); diff --git a/src/corelib/kernel/qpointer.h b/src/corelib/kernel/qpointer.h index b5c17ad394e..b2b3cda4abc 100644 --- a/src/corelib/kernel/qpointer.h +++ b/src/corelib/kernel/qpointer.h @@ -52,7 +52,7 @@ class QVariant; template class QPointer { - Q_STATIC_ASSERT_X(!QtPrivate::is_pointer::value, "QPointer's template type must not be a pointer type"); + Q_STATIC_ASSERT_X(!std::is_pointer::value, "QPointer's template type must not be a pointer type"); template struct TypeSelector diff --git a/src/corelib/kernel/qtimer.h b/src/corelib/kernel/qtimer.h index 4f934d03670..96c7efd8f51 100644 --- a/src/corelib/kernel/qtimer.h +++ b/src/corelib/kernel/qtimer.h @@ -119,14 +119,14 @@ public: // singleShot to a functor or function pointer (without context) template static inline typename QtPrivate::QEnableIf::IsPointerToMemberFunction && - !QtPrivate::is_same::value, void>::Type + !std::is_same::value, void>::Type singleShot(Duration interval, Func1 slot) { singleShot(interval, defaultTypeFor(interval), nullptr, slot); } template static inline typename QtPrivate::QEnableIf::IsPointerToMemberFunction && - !QtPrivate::is_same::value, void>::Type + !std::is_same::value, void>::Type singleShot(Duration interval, Qt::TimerType timerType, Func1 slot) { singleShot(interval, timerType, nullptr, slot); @@ -134,14 +134,14 @@ public: // singleShot to a functor or function pointer (with context) template static inline typename QtPrivate::QEnableIf::IsPointerToMemberFunction && - !QtPrivate::is_same::value, void>::Type + !std::is_same::value, void>::Type singleShot(Duration interval, QObject *context, Func1 slot) { singleShot(interval, defaultTypeFor(interval), context, slot); } template static inline typename QtPrivate::QEnableIf::IsPointerToMemberFunction && - !QtPrivate::is_same::value, void>::Type + !std::is_same::value, void>::Type singleShot(Duration interval, Qt::TimerType timerType, QObject *context, Func1 slot) { //compilation error if the slot has arguments. diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index d01f386032c..ec87e206560 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -66,7 +66,7 @@ struct QVariantIntegrator { static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data) && ((QTypeInfoQuery::isRelocatable) || Q_IS_ENUM(T)); - typedef QtPrivate::integral_constant CanUseInternalSpace_t; + typedef std::integral_constant CanUseInternalSpace_t; }; Q_STATIC_ASSERT(QVariantIntegrator::CanUseInternalSpace); Q_STATIC_ASSERT(QVariantIntegrator::CanUseInternalSpace); @@ -118,28 +118,28 @@ private: }; template -inline void v_construct_helper(QVariant::Private *x, const T &t, QtPrivate::true_type) +inline void v_construct_helper(QVariant::Private *x, const T &t, std::true_type) { new (&x->data) T(t); x->is_shared = false; } template -inline void v_construct_helper(QVariant::Private *x, const T &t, QtPrivate::false_type) +inline void v_construct_helper(QVariant::Private *x, const T &t, std::false_type) { x->data.shared = new QVariantPrivateSharedEx(t); x->is_shared = true; } template -inline void v_construct_helper(QVariant::Private *x, QtPrivate::true_type) +inline void v_construct_helper(QVariant::Private *x, std::true_type) { new (&x->data) T(); x->is_shared = false; } template -inline void v_construct_helper(QVariant::Private *x, QtPrivate::false_type) +inline void v_construct_helper(QVariant::Private *x, std::false_type) { x->data.shared = new QVariantPrivateSharedEx; x->is_shared = true; diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp index 366413e82ee..6e0fa4eedb3 100644 --- a/src/corelib/thread/qmutex.cpp +++ b/src/corelib/thread/qmutex.cpp @@ -48,7 +48,6 @@ #include "qelapsedtimer.h" #include "qthread.h" #include "qmutex_p.h" -#include "qtypetraits.h" #ifndef QT_LINUX_FUTEX #include "private/qfreelist_p.h" @@ -77,7 +76,7 @@ public: // written to by the thread that first owns 'mutex'; // read during attempts to acquire ownership of 'mutex' from any other thread: - QAtomicPointer::type> owner; + QAtomicPointer::type> owner; // only ever accessed from the thread that owns 'mutex': uint count; diff --git a/src/corelib/tools/qbytearray_p.h b/src/corelib/tools/qbytearray_p.h index 0824611d990..6ebff739cdd 100644 --- a/src/corelib/tools/qbytearray_p.h +++ b/src/corelib/tools/qbytearray_p.h @@ -52,14 +52,13 @@ // #include -#include #include "qtools_p.h" QT_BEGIN_NAMESPACE enum { // Define as enum to force inlining. Don't expose MaxAllocSize in a public header. - MaxByteArraySize = MaxAllocSize - sizeof(QtPrivate::remove_pointer::type) + MaxByteArraySize = MaxAllocSize - sizeof(std::remove_pointer::type) }; QT_END_NAMESPACE diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 6a2d7bdd114..d58c3c57333 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -764,7 +764,7 @@ Q_INLINE_TEMPLATE typename QHash::iterator QHash::insert(const K return iterator(createNode(h, akey, avalue, node)); } - if (!QtPrivate::is_same::value) + if (!std::is_same::value) (*node)->value = avalue; return iterator(*node); } diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index c7f27abdd69..c0a92aaa101 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -125,10 +125,10 @@ class QList { public: struct MemoryLayout - : QtPrivate::if_< + : std::conditional< QTypeInfo::isStatic || QTypeInfo::isLarge, QListData::IndirectLayout, - typename QtPrivate::if_< + typename std::conditional< sizeof(T) == sizeof(void*), QListData::ArrayCompatibleLayout, QListData::InlineWithPaddingLayout diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h index baa10b7a950..96ce787446a 100644 --- a/src/corelib/tools/qmap.h +++ b/src/corelib/tools/qmap.h @@ -44,7 +44,6 @@ #include #include #include -#include #ifdef Q_MAP_DEBUG #include @@ -130,15 +129,15 @@ struct QMapNode : public QMapNodeBase { callDestructorIfNecessary(key); callDestructorIfNecessary(value); - doDestroySubTree(QtPrivate::integral_constant::isComplex || QTypeInfo::isComplex>()); + doDestroySubTree(std::integral_constant::isComplex || QTypeInfo::isComplex>()); } QMapNode *lowerBound(const Key &key); QMapNode *upperBound(const Key &key); private: - void doDestroySubTree(QtPrivate::false_type) {} - void doDestroySubTree(QtPrivate::true_type) + void doDestroySubTree(std::false_type) {} + void doDestroySubTree(std::true_type) { if (left) leftNode()->destroySubTree(); diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index a0c22c91796..5738413bfba 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -464,7 +464,7 @@ private: template inline void enableSharedFromThis(const QEnableSharedFromThis *ptr) { - ptr->initializeFromSharedPointer(constCast::type>()); + ptr->initializeFromSharedPointer(constCast::type>()); } inline void enableSharedFromThis(...) {} diff --git a/src/corelib/tools/qstringalgorithms_p.h b/src/corelib/tools/qstringalgorithms_p.h index d7127517e09..c5470bc7add 100644 --- a/src/corelib/tools/qstringalgorithms_p.h +++ b/src/corelib/tools/qstringalgorithms_p.h @@ -60,8 +60,8 @@ template struct QStringAlgorithms { typedef typename StringType::value_type Char; typedef typename StringType::size_type size_type; - typedef typename QtPrivate::remove_cv::type NakedStringType; - static const bool isConst = QtPrivate::is_const::value; + typedef typename std::remove_cv::type NakedStringType; + static const bool isConst = std::is_const::value; static inline bool isSpace(char ch) { return ascii_isspace(ch); } static inline bool isSpace(QChar ch) { return ch.isSpace(); } diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index 045431fcaff..c3ccfc3f8c7 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -46,7 +46,6 @@ #include #include #include -#include #include #include @@ -312,7 +311,7 @@ namespace QTest template inline void addColumn(const char *name, T * = 0) { - typedef QtPrivate::is_same QIsSameTConstChar; + typedef std::is_same QIsSameTConstChar; Q_STATIC_ASSERT_X(!QIsSameTConstChar::value, "const char* is not allowed as a test data format."); addColumnInternal(qMetaTypeId(), name); } diff --git a/src/widgets/graphicsview/qgraphicsitem.h b/src/widgets/graphicsview/qgraphicsitem.h index 59656f5b0b0..36f8aac124d 100644 --- a/src/widgets/graphicsview/qgraphicsitem.h +++ b/src/widgets/graphicsview/qgraphicsitem.h @@ -1024,14 +1024,14 @@ private: template inline T qgraphicsitem_cast(QGraphicsItem *item) { - typedef typename QtPrivate::remove_cv::type>::type Item; + typedef typename std::remove_cv::type>::type Item; return int(Item::Type) == int(QGraphicsItem::Type) || (item && int(Item::Type) == item->type()) ? static_cast(item) : 0; } template inline T qgraphicsitem_cast(const QGraphicsItem *item) { - typedef typename QtPrivate::remove_cv::type>::type Item; + typedef typename std::remove_cv::type>::type Item; return int(Item::Type) == int(QGraphicsItem::Type) || (item && int(Item::Type) == item->type()) ? static_cast(item) : 0; } diff --git a/src/widgets/styles/qstyleoption.h b/src/widgets/styles/qstyleoption.h index 96794114028..0e76d53eeac 100644 --- a/src/widgets/styles/qstyleoption.h +++ b/src/widgets/styles/qstyleoption.h @@ -665,7 +665,7 @@ protected: template T qstyleoption_cast(const QStyleOption *opt) { - typedef typename QtPrivate::remove_cv::type>::type Opt; + typedef typename std::remove_cv::type>::type Opt; if (opt && opt->version >= Opt::Version && (opt->type == Opt::Type || int(Opt::Type) == QStyleOption::SO_Default || (int(Opt::Type) == QStyleOption::SO_Complex @@ -677,7 +677,7 @@ T qstyleoption_cast(const QStyleOption *opt) template T qstyleoption_cast(QStyleOption *opt) { - typedef typename QtPrivate::remove_cv::type>::type Opt; + typedef typename std::remove_cv::type>::type Opt; if (opt && opt->version >= Opt::Version && (opt->type == Opt::Type || int(Opt::Type) == QStyleOption::SO_Default || (int(Opt::Type) == QStyleOption::SO_Complex @@ -728,7 +728,7 @@ public: template T qstyleoption_cast(const QStyleHintReturn *hint) { - typedef typename QtPrivate::remove_cv::type>::type Opt; + typedef typename std::remove_cv::type>::type Opt; if (hint && hint->version <= Opt::Version && (hint->type == Opt::Type || int(Opt::Type) == QStyleHintReturn::SH_Default)) return static_cast(hint); @@ -738,7 +738,7 @@ T qstyleoption_cast(const QStyleHintReturn *hint) template T qstyleoption_cast(QStyleHintReturn *hint) { - typedef typename QtPrivate::remove_cv::type>::type Opt; + typedef typename std::remove_cv::type>::type Opt; if (hint && hint->version <= Opt::Version && (hint->type == Opt::Type || int(Opt::Type) == QStyleHintReturn::SH_Default)) return static_cast(hint); diff --git a/src/widgets/widgets/qmenu.h b/src/widgets/widgets/qmenu.h index bcbd0a95c40..5d218ac1ba9 100644 --- a/src/widgets/widgets/qmenu.h +++ b/src/widgets/widgets/qmenu.h @@ -98,7 +98,7 @@ public: #else // addAction(QString): Connect to a QObject slot / functor or function pointer (with context) template - inline typename QtPrivate::QEnableIf::value + inline typename QtPrivate::QEnableIf::value && QtPrivate::IsPointerToTypeDerivedFromQObject::Value, QAction *>::Type addAction(const QString &text, const Obj *object, Func1 slot, const QKeySequence &shortcut = 0) { @@ -126,7 +126,7 @@ public: } // addAction(QIcon, QString): Connect to a QObject slot / functor or function pointer (with context) template - inline typename QtPrivate::QEnableIf::value + inline typename QtPrivate::QEnableIf::value && QtPrivate::IsPointerToTypeDerivedFromQObject::Value, QAction *>::Type addAction(const QIcon &actionIcon, const QString &text, const Obj *object, Func1 slot, const QKeySequence &shortcut = 0) { diff --git a/src/widgets/widgets/qtoolbar.h b/src/widgets/widgets/qtoolbar.h index d361513bbf9..0ea4d4afeb8 100644 --- a/src/widgets/widgets/qtoolbar.h +++ b/src/widgets/widgets/qtoolbar.h @@ -116,7 +116,7 @@ public: #else // addAction(QString): Connect to a QObject slot / functor or function pointer (with context) template - inline typename QtPrivate::QEnableIf::value + inline typename QtPrivate::QEnableIf::value && QtPrivate::IsPointerToTypeDerivedFromQObject::Value, QAction *>::Type addAction(const QString &text, const Obj *object, Func1 slot) { @@ -134,7 +134,7 @@ public: } // addAction(QString): Connect to a QObject slot / functor or function pointer (with context) template - inline typename QtPrivate::QEnableIf::value + inline typename QtPrivate::QEnableIf::value && QtPrivate::IsPointerToTypeDerivedFromQObject::Value, QAction *>::Type addAction(const QIcon &actionIcon, const QString &text, const Obj *object, Func1 slot) { diff --git a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp index 9b92a4ff154..ff0497b69ee 100644 --- a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp +++ b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp @@ -28,7 +28,6 @@ #include -#include #include #include @@ -376,8 +375,8 @@ void tst_QGlobal::isEnum() #define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true) #define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false) #else -#define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true && QtPrivate::is_enum::value == true) -#define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false && QtPrivate::is_enum::value == false) +#define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true && std::is_enum::value == true) +#define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false && std::is_enum::value == false) #endif QVERIFY(IS_ENUM_TRUE(isEnum_B_Byte)); diff --git a/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp b/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp index 1a70ac5e755..0c890eafbcb 100644 --- a/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp +++ b/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp @@ -29,7 +29,6 @@ #include #include -#include #include #include @@ -197,7 +196,7 @@ void tst_QHashFunctions::range() { // verify that the input iterator category suffices: std::stringstream sstream; - Q_STATIC_ASSERT((QtPrivate::is_same::iterator_category>::value)); + Q_STATIC_ASSERT((std::is_same::iterator_category>::value)); std::copy(ints, ints + numInts, std::ostream_iterator(sstream, " ")); sstream.seekg(0); std::istream_iterator it(sstream), end; From 92805a0e9c488e47280e93f65e5378818e340ad1 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Mon, 7 Nov 2016 11:23:21 +0100 Subject: [PATCH 052/136] Fix EGL break on Debian X32 Change to QT_POINTER_SIZE instead of Q_PROCESSOR_WORDSIZE. The latter is 8 due to targeting 64-bit, but pointers are 32-bit still in such builds. For the condition in question it is the pointer size that matters. Task-number: QTBUG-56686 Change-Id: I96c203cae91ceb8404606de605c4fdb1a02a9d5f Reviewed-by: Dmitry Shachnev Reviewed-by: Thiago Macieira --- src/platformsupport/eglconvenience/qt_egl_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platformsupport/eglconvenience/qt_egl_p.h b/src/platformsupport/eglconvenience/qt_egl_p.h index 615ee4b80a6..b1495c9f9de 100644 --- a/src/platformsupport/eglconvenience/qt_egl_p.h +++ b/src/platformsupport/eglconvenience/qt_egl_p.h @@ -83,7 +83,7 @@ struct QtEglConverter { return v; } }; -#if Q_PROCESSOR_WORDSIZE > 4 +#if QT_POINTER_SIZE > 4 template <> struct QtEglConverter { From e25f2392eb4a208449c3aa53196c81583dba08dc Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 11 Oct 2016 00:43:29 +0200 Subject: [PATCH 053/136] QGraphicsWidget: add missing break statement to switch in event() If the QEvent::GraphicsSceneMousePress case falls through, it does so because d->hasDecoration() == false or the virtual call to windowFrameEvent() returned false. It falls through to the case for QEvent::GraphicsSceneMouseMove, etc, which ensures d->windowData and then checks hasDecoration() again, with some other conditions on top, and calls the same virtual function, windowFrameEvent(), with the same arguments again. Now, it could, theoretically, be possible that that second call would, due to the presence of a windowData that wasn't there before, return true when before it did return false. But the only modification to *this between the calls to windowFrameEvent() is the potential allocation of d->windowData, which, if actually effected, will have d->windowData->grabbedSection == Qt::NoSection, hence windowFrameEvent() won't even be called a second time It is therefore safe to assume that a break was intended here, so add it. Discovered independently be GCC 7 and Coverity. Coverity-Id: 11149 Change-Id: Id708a1689ed0f0c914622e388c456ea4576fda02 Reviewed-by: Edward Welbourne --- src/widgets/graphicsview/qgraphicswidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp index 125174627db..5a4f96a2aac 100644 --- a/src/widgets/graphicsview/qgraphicswidget.cpp +++ b/src/widgets/graphicsview/qgraphicswidget.cpp @@ -1449,6 +1449,7 @@ bool QGraphicsWidget::event(QEvent *event) case QEvent::GraphicsSceneMousePress: if (d->hasDecoration() && windowFrameEvent(event)) return true; + break; case QEvent::GraphicsSceneMouseMove: case QEvent::GraphicsSceneMouseRelease: case QEvent::GraphicsSceneMouseDoubleClick: From ef36fd02178482cd312ea551303856ef563421af Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 8 Oct 2016 16:41:46 +0200 Subject: [PATCH 054/136] QGraphicsSceneBspTreeIndex: fix misleading code in event() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old code employed a switch statement to filter timer events, but fell unconditionally through to the default case of calling QObject::event(). The final return statement following the switch is thus dead code. Fix by turning the switch into an if and returning QObject::event() unconditionally afterwards, which much better describes the intent of the code, and also fixes the GCC 7 warning about implicit fall- through in the switch (which wasn't implicit to a human, but GCC's comment-reading-capabilities are somewhat limited at this point). Change-Id: I6756a65b3679a446d09fd721dfd0adc24fdf7772 Reviewed-by: Sérgio Martins Reviewed-by: Edward Welbourne --- src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp b/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp index ce43b1332d3..9916591ffab 100644 --- a/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp +++ b/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp @@ -691,8 +691,7 @@ void QGraphicsSceneBspTreeIndex::itemChange(const QGraphicsItem *item, QGraphics bool QGraphicsSceneBspTreeIndex::event(QEvent *event) { Q_D(QGraphicsSceneBspTreeIndex); - switch (event->type()) { - case QEvent::Timer: + if (event->type() == QEvent::Timer) { if (d->indexTimerId && static_cast(event)->timerId() == d->indexTimerId) { if (d->restartIndexTimer) { d->restartIndexTimer = false; @@ -701,11 +700,8 @@ bool QGraphicsSceneBspTreeIndex::event(QEvent *event) d->_q_updateIndex(); } } - // Fallthrough intended - support timers in subclasses. - default: - return QObject::event(event); } - return true; + return QObject::event(event); } QT_END_NAMESPACE From b559b5646359e6fd9c208c29b7524352784e6177 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 10 Oct 2016 20:27:36 +0200 Subject: [PATCH 055/136] QFontconfigDatabase: remove 200 unneeded relocations Same change as in QColor (d38f86e50b01c6dd60f5a97355031e08d6a47d18). No text and data reduction numbers (ubsan build). Change-Id: I7280a511e785c9442a3a6a1ed55e10011ce0a84e Reviewed-by: Edward Welbourne --- .../fontconfig/qfontconfigdatabase.cpp | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 1c2c3288a0d..71236227de6 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -110,7 +110,7 @@ static inline int stretchFromFcWidth(int fcwidth) return qtstretch; } -static const char *specialLanguages[] = { +static const char specialLanguages[][6] = { "", // Unknown "", // Inherited "", // Common @@ -244,12 +244,12 @@ static const char *specialLanguages[] = { "", // OldHungarian "" // SignWriting }; -Q_STATIC_ASSERT(sizeof(specialLanguages) / sizeof(const char *) == QChar::ScriptCount); +Q_STATIC_ASSERT(sizeof specialLanguages / sizeof *specialLanguages == QChar::ScriptCount); // this could become a list of all languages used for each writing // system, instead of using the single most common language. -static const char *languageForWritingSystem[] = { - 0, // Any +static const char languageForWritingSystem[][6] = { + "", // Any "en", // Latin "el", // Greek "ru", // Cyrillic @@ -279,25 +279,25 @@ static const char *languageForWritingSystem[] = { "ja", // Japanese "ko", // Korean "vi", // Vietnamese - 0, // Symbol + "", // Symbol "sga", // Ogham "non", // Runic "man" // N'Ko }; -Q_STATIC_ASSERT(sizeof(languageForWritingSystem) / sizeof(const char *) == QFontDatabase::WritingSystemsCount); +Q_STATIC_ASSERT(sizeof languageForWritingSystem / sizeof *languageForWritingSystem == QFontDatabase::WritingSystemsCount); #if FC_VERSION >= 20297 // Newer FontConfig let's us sort out fonts that report certain scripts support, // but no open type tables for handling them correctly. // Check the reported script presence in the FC_CAPABILITY's "otlayout:" section. -static const char *capabilityForWritingSystem[] = { - 0, // Any - 0, // Latin - 0, // Greek - 0, // Cyrillic - 0, // Armenian - 0, // Hebrew - 0, // Arabic +static const char capabilityForWritingSystem[][5] = { + "", // Any + "", // Latin + "", // Greek + "", // Cyrillic + "", // Armenian + "", // Hebrew + "", // Arabic "syrc", // Syriac "thaa", // Thaana "deva", // Devanagari @@ -310,20 +310,20 @@ static const char *capabilityForWritingSystem[] = { "knda", // Kannada "mlym", // Malayalam "sinh", // Sinhala - 0, // Thai - 0, // Lao + "", // Thai + "", // Lao "tibt", // Tibetan "mymr", // Myanmar - 0, // Georgian + "", // Georgian "khmr", // Khmer - 0, // SimplifiedChinese - 0, // TraditionalChinese - 0, // Japanese - 0, // Korean - 0, // Vietnamese - 0, // Symbol - 0, // Ogham - 0, // Runic + "", // SimplifiedChinese + "", // TraditionalChinese + "", // Japanese + "", // Korean + "", // Vietnamese + "", // Symbol + "", // Ogham + "", // Runic "nko " // N'Ko }; Q_STATIC_ASSERT(sizeof(capabilityForWritingSystem) / sizeof(*capabilityForWritingSystem) == QFontDatabase::WritingSystemsCount); @@ -425,7 +425,7 @@ static void populateFromPattern(FcPattern *pattern) FcLangResult langRes = FcLangSetHasLang(langset, lang); if (langRes != FcLangDifferentLang) { #if FC_VERSION >= 20297 - if (capabilityForWritingSystem[j] != Q_NULLPTR && requiresOpenType(j)) { + if (*capabilityForWritingSystem[j] && requiresOpenType(j)) { if (cap == Q_NULLPTR) capRes = FcPatternGetString(pattern, FC_CAPABILITY, 0, &cap); if (capRes == FcResultMatch && strstr(reinterpret_cast(cap), capabilityForWritingSystem[j]) == 0) From e649eac69a3220be7654ce6428185c83cd885db2 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 4 Nov 2016 10:52:36 +0100 Subject: [PATCH 056/136] Direct2D QPA: Add #include directives for MinGW D2D support has been partially added to recent versions of MinGW, which one day could make compiling the plugin possible. Change-Id: I53f91c483d3b900698f4424cb6a72f626e32e60b Reviewed-by: Louai Al-Khanji --- src/plugins/platforms/direct2d/qwindowsdirect2dhelpers.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dhelpers.h b/src/plugins/platforms/direct2d/qwindowsdirect2dhelpers.h index 97715ad0502..34225bba9aa 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dhelpers.h +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dhelpers.h @@ -46,6 +46,13 @@ #include #include +#ifdef Q_CC_MINGW +# include +# include +# include +# include +# include +#endif // Q_CC_MINGW #include QT_BEGIN_NAMESPACE From b64fc69d1c8a54ee311ea115c5c01823b0868d18 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 8 Nov 2016 15:33:51 +0100 Subject: [PATCH 057/136] Fix compiler warning/error with clang 3.6 Clang warns about self assignment, so use the same mechanism as Q_UNUSED for HB_UNUSED. Change-Id: I0894c72fb0936074b15198053464f5bc4b8991d4 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/3rdparty/harfbuzz/src/harfbuzz-impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-impl.h b/src/3rdparty/harfbuzz/src/harfbuzz-impl.h index 5f430498c4a..f98594ac915 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-impl.h +++ b/src/3rdparty/harfbuzz/src/harfbuzz-impl.h @@ -59,7 +59,7 @@ HB_BEGIN_HEADER #endif #ifndef HB_UNUSED -# define HB_UNUSED(arg) ((arg) = (arg)) +# define HB_UNUSED(arg) ((void)(arg)) #endif #define HB_LIKELY(cond) (cond) From 0383d0be33c7ede2104b7225c9af13104cbef85d Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Wed, 9 Nov 2016 07:50:14 +0100 Subject: [PATCH 058/136] winrt: Do not copy into a reference The intention has probably been to reset a reference, which is not required. Task-number: QTBUG-56756 Change-Id: I1ef44b6c9b8365ac5c8d48234137e518558e9398 Reviewed-by: Oliver Wolff --- src/corelib/kernel/qeventdispatcher_winrt.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp index 4a2e2d887f3..8d4fbfd8e41 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt.cpp +++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp @@ -532,7 +532,6 @@ bool QEventDispatcherWinRT::event(QEvent *e) if (id >= d->timerInfos.size()) break; - info = d->timerInfos[id]; if (info.timerId == INVALID_TIMER_ID) break; From c83ba01f7bc542368973f3f24dfb59c6052dd78a Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Wed, 9 Nov 2016 07:51:25 +0100 Subject: [PATCH 059/136] winrt: remove superfluous code We do not need to check for an invalid timer id, as this can only happen if the above check is already true. Hence, this was doing the same check twice. Task-number: QTBUG-56756 Change-Id: Icca9b26c32ce88eab76dd02c6c10b24af07bfad7 Reviewed-by: Oliver Wolff --- src/corelib/kernel/qeventdispatcher_winrt.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp index 8d4fbfd8e41..6126ff0e5d5 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt.cpp +++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp @@ -532,9 +532,6 @@ bool QEventDispatcherWinRT::event(QEvent *e) if (id >= d->timerInfos.size()) break; - if (info.timerId == INVALID_TIMER_ID) - break; - if (info.interval == 0 && info.inEvent) { // post the next zero timer event as long as the timer was not restarted QCoreApplication::postEvent(this, new QTimerEvent(id)); From 9de3b15d07dcf1be5ff7b26e2e7987ed8e91a0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Vr=C3=A1til?= Date: Mon, 7 Nov 2016 09:40:34 +0100 Subject: [PATCH 060/136] QLabel: take DPR of QMovie in account when calculating sizeHint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QLabel already does that for QPixmap, so just do the same for QMovie's current pixmap. Task-number: QTBUG-48157 Change-Id: I7b26460f778e56ff017a5efd433f8929f30e4b41 Reviewed-by: Friedemann Kleint Reviewed-by: Morten Johan Sørvig --- src/widgets/widgets/qlabel.cpp | 1 + tests/auto/widgets/widgets/qlabel/red@2x.png | Bin 0 -> 105 bytes .../widgets/widgets/qlabel/tst_qlabel.cpp | 24 ++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 tests/auto/widgets/widgets/qlabel/red@2x.png diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp index a07a9645952..34b75cb5501 100644 --- a/src/widgets/widgets/qlabel.cpp +++ b/src/widgets/widgets/qlabel.cpp @@ -579,6 +579,7 @@ QSize QLabelPrivate::sizeForWidth(int w) const #ifndef QT_NO_MOVIE } else if (movie && !movie->currentPixmap().isNull()) { br = movie->currentPixmap().rect(); + br.setSize(br.size() / movie->currentPixmap().devicePixelRatio()); #endif } else if (isTextLabel) { int align = QStyle::visualAlignment(textDirection(), QFlag(this->align)); diff --git a/tests/auto/widgets/widgets/qlabel/red@2x.png b/tests/auto/widgets/widgets/qlabel/red@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a843e744f405610bc0e621472eaca0ecc4ecf45 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^DImwg9Y$w!>#K(3;vi(^Pe sFVdQ&MBb@08_IUtN;K2 literal 0 HcmV?d00001 diff --git a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp index d76dbf6b469..2b2756fef31 100644 --- a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp +++ b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp @@ -101,6 +101,9 @@ private Q_SLOTS: void taskQTBUG_7902_contextMenuCrash(); #endif + void taskQTBUG_48157_dprPixmap(); + void taskQTBUG_48157_dprMovie(); + private: QLabel *testWidget; QPointer test_box; @@ -546,5 +549,26 @@ void tst_QLabel::taskQTBUG_7902_contextMenuCrash() } #endif +void tst_QLabel::taskQTBUG_48157_dprPixmap() +{ + QLabel label; + QPixmap pixmap; + pixmap.load(QFINDTESTDATA(QStringLiteral("red@2x.png"))); + QCOMPARE(pixmap.devicePixelRatio(), 2.0); + label.setPixmap(pixmap); + QCOMPARE(label.sizeHint(), pixmap.rect().size() / pixmap.devicePixelRatio()); +} + +void tst_QLabel::taskQTBUG_48157_dprMovie() +{ + QLabel label; + QMovie movie; + movie.setFileName(QFINDTESTDATA(QStringLiteral("red@2x.png"))); + movie.start(); + QCOMPARE(movie.currentPixmap().devicePixelRatio(), 2.0); + label.setMovie(&movie); + QCOMPARE(label.sizeHint(), movie.currentPixmap().size() / movie.currentPixmap().devicePixelRatio()); +} + QTEST_MAIN(tst_QLabel) #include "tst_qlabel.moc" From 5c3b16706ff30c38258df0e98e071bf8ae6a1460 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 8 Aug 2016 09:05:53 +0200 Subject: [PATCH 061/136] Remove compiler-specific implementations of Q_IS_ENUM Since the macro is now just a wrapper for std::is_enum, its use is also deprecated. [ChangeLog][QtCore][Global] Q_IS_ENUM is deprecated. Use std::is_enum<>::value instead. Change-Id: I09b9f4559c02c81f338cace927873318f2acafde Reviewed-by: Thiago Macieira --- src/corelib/global/qisenum.h | 17 +--- src/corelib/global/qtypeinfo.h | 6 +- src/corelib/kernel/qmetatype.h | 3 +- src/corelib/kernel/qvariant_p.h | 2 +- .../corelib/global/qglobal/tst_qglobal.cpp | 95 ------------------- .../kernel/qmetatype/tst_qmetatype.cpp | 2 +- 6 files changed, 7 insertions(+), 118 deletions(-) diff --git a/src/corelib/global/qisenum.h b/src/corelib/global/qisenum.h index 185db5e45f5..8f784ef6e37 100644 --- a/src/corelib/global/qisenum.h +++ b/src/corelib/global/qisenum.h @@ -42,21 +42,8 @@ #ifndef QISENUM_H #define QISENUM_H -#ifndef Q_IS_ENUM -# if defined(Q_CC_GNU) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) -# define Q_IS_ENUM(x) __is_enum(x) -# elif defined(Q_CC_MSVC) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >=140050215) -# define Q_IS_ENUM(x) __is_enum(x) -# elif defined(Q_CC_CLANG) -# if __has_extension(is_enum) -# define Q_IS_ENUM(x) __is_enum(x) -# endif -# endif -#endif - -#ifndef Q_IS_ENUM -# define Q_IS_ENUM(x) std::is_enum::value -#endif +// Use of Q_IS_ENUM is deprecated since 5.8 +#define Q_IS_ENUM(x) std::is_enum::value // shut up syncqt QT_BEGIN_NAMESPACE diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h index cdc85ab1d02..8aa5cb4fb45 100644 --- a/src/corelib/global/qtypeinfo.h +++ b/src/corelib/global/qtypeinfo.h @@ -38,13 +38,11 @@ ** ****************************************************************************/ -#include +#include #ifndef QTYPEINFO_H #define QTYPEINFO_H -#include - QT_BEGIN_NAMESPACE /* @@ -64,7 +62,7 @@ public: isIntegral = std::is_integral::value, isComplex = true, isStatic = true, - isRelocatable = Q_IS_ENUM(T), + isRelocatable = std::is_enum::value, isLarge = (sizeof(T)>sizeof(void*)), isDummy = false, //### Qt6: remove sizeOf = sizeof(T) diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 29e60b0eb58..e64812b3aee 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -45,7 +45,6 @@ #include #include #include -#include #ifndef QT_NO_QOBJECT #include #endif @@ -1635,7 +1634,7 @@ namespace QtPrivate { | (IsSharedPointerToTypeDerivedFromQObject::Value ? QMetaType::SharedPointerToQObject : 0) | (IsWeakPointerToTypeDerivedFromQObject::Value ? QMetaType::WeakPointerToQObject : 0) | (IsTrackingPointerToTypeDerivedFromQObject::Value ? QMetaType::TrackingPointerToQObject : 0) - | (Q_IS_ENUM(T) ? QMetaType::IsEnumeration : 0) + | (std::is_enum::value ? QMetaType::IsEnumeration : 0) | (IsGadgetHelper::Value ? QMetaType::IsGadget : 0) }; }; diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index ec87e206560..bf88def4382 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -65,7 +65,7 @@ template struct QVariantIntegrator { static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data) - && ((QTypeInfoQuery::isRelocatable) || Q_IS_ENUM(T)); + && ((QTypeInfoQuery::isRelocatable) || std::is_enum::value); typedef std::integral_constant CanUseInternalSpace_t; }; Q_STATIC_ASSERT(QVariantIntegrator::CanUseInternalSpace); diff --git a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp index ff0497b69ee..bb6ec1c8e7b 100644 --- a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp +++ b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp @@ -48,7 +48,6 @@ private slots: void qConstructorFunction(); void qCoreAppStartupFunction(); void qCoreAppStartupFunctionRestart(); - void isEnum(); void qAlignOf(); void integerForSize(); void qprintable(); @@ -365,100 +364,6 @@ public: enum AnEnum {}; }; -#if defined (Q_COMPILER_CLASS_ENUM) -enum class isEnum_G : qint64 {}; -#endif - -void tst_QGlobal::isEnum() -{ -#if defined (Q_CC_MSVC) -#define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true) -#define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false) -#else -#define IS_ENUM_TRUE(x) (Q_IS_ENUM(x) == true && std::is_enum::value == true) -#define IS_ENUM_FALSE(x) (Q_IS_ENUM(x) == false && std::is_enum::value == false) -#endif - - QVERIFY(IS_ENUM_TRUE(isEnum_B_Byte)); - QVERIFY(IS_ENUM_TRUE(const isEnum_B_Byte)); - QVERIFY(IS_ENUM_TRUE(volatile isEnum_B_Byte)); - QVERIFY(IS_ENUM_TRUE(const volatile isEnum_B_Byte)); - - QVERIFY(IS_ENUM_TRUE(isEnum_B_Short)); - QVERIFY(IS_ENUM_TRUE(const isEnum_B_Short)); - QVERIFY(IS_ENUM_TRUE(volatile isEnum_B_Short)); - QVERIFY(IS_ENUM_TRUE(const volatile isEnum_B_Short)); - - QVERIFY(IS_ENUM_TRUE(isEnum_B_Int)); - QVERIFY(IS_ENUM_TRUE(const isEnum_B_Int)); - QVERIFY(IS_ENUM_TRUE(volatile isEnum_B_Int)); - QVERIFY(IS_ENUM_TRUE(const volatile isEnum_B_Int)); - - QVERIFY(IS_ENUM_TRUE(isEnum_F::AnEnum)); - QVERIFY(IS_ENUM_TRUE(const isEnum_F::AnEnum)); - QVERIFY(IS_ENUM_TRUE(volatile isEnum_F::AnEnum)); - QVERIFY(IS_ENUM_TRUE(const volatile isEnum_F::AnEnum)); - - QVERIFY(IS_ENUM_FALSE(void)); - QVERIFY(IS_ENUM_FALSE(isEnum_B_Byte &)); - QVERIFY(IS_ENUM_FALSE(isEnum_B_Byte[1])); - QVERIFY(IS_ENUM_FALSE(const isEnum_B_Byte[1])); - QVERIFY(IS_ENUM_FALSE(isEnum_B_Byte[])); - QVERIFY(IS_ENUM_FALSE(int)); - QVERIFY(IS_ENUM_FALSE(float)); - QVERIFY(IS_ENUM_FALSE(isEnum_A)); - QVERIFY(IS_ENUM_FALSE(isEnum_A *)); - QVERIFY(IS_ENUM_FALSE(const isEnum_A)); - QVERIFY(IS_ENUM_FALSE(isEnum_C)); - QVERIFY(IS_ENUM_FALSE(isEnum_D)); - QVERIFY(IS_ENUM_FALSE(isEnum_E)); - QVERIFY(IS_ENUM_FALSE(void())); - QVERIFY(IS_ENUM_FALSE(void(*)())); - QVERIFY(IS_ENUM_FALSE(int isEnum_A::*)); - QVERIFY(IS_ENUM_FALSE(void (isEnum_A::*)())); - - QVERIFY(IS_ENUM_FALSE(size_t)); - QVERIFY(IS_ENUM_FALSE(bool)); - QVERIFY(IS_ENUM_FALSE(wchar_t)); - - QVERIFY(IS_ENUM_FALSE(char)); - QVERIFY(IS_ENUM_FALSE(unsigned char)); - QVERIFY(IS_ENUM_FALSE(short)); - QVERIFY(IS_ENUM_FALSE(unsigned short)); - QVERIFY(IS_ENUM_FALSE(int)); - QVERIFY(IS_ENUM_FALSE(unsigned int)); - QVERIFY(IS_ENUM_FALSE(long)); - QVERIFY(IS_ENUM_FALSE(unsigned long)); - - QVERIFY(IS_ENUM_FALSE(qint8)); - QVERIFY(IS_ENUM_FALSE(quint8)); - QVERIFY(IS_ENUM_FALSE(qint16)); - QVERIFY(IS_ENUM_FALSE(quint16)); - QVERIFY(IS_ENUM_FALSE(qint32)); - QVERIFY(IS_ENUM_FALSE(quint32)); - QVERIFY(IS_ENUM_FALSE(qint64)); - QVERIFY(IS_ENUM_FALSE(quint64)); - - QVERIFY(IS_ENUM_FALSE(void *)); - QVERIFY(IS_ENUM_FALSE(int *)); - -#if defined (Q_COMPILER_UNICODE_STRINGS) - QVERIFY(IS_ENUM_FALSE(char16_t)); - QVERIFY(IS_ENUM_FALSE(char32_t)); -#endif - -#if defined (Q_COMPILER_CLASS_ENUM) - // Strongly type class enums are not handled by the - // fallback type traits implementation. Any compiler - // supported by Qt that supports C++0x class enums - // should also support the __is_enum intrinsic. - QVERIFY(Q_IS_ENUM(isEnum_G)); -#endif - -#undef IS_ENUM_TRUE -#undef IS_ENUM_FALSE -} - struct Empty {}; template struct AlignmentInStruct { T dummy; }; diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index caceda86bea..7d9f56ef38e 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -712,7 +712,7 @@ void tst_QMetaType::flags_data() << bool(!QTypeInfo::isStatic) \ << bool(QTypeInfo::isComplex) \ << bool(QtPrivate::IsPointerToTypeDerivedFromQObject::Value) \ - << bool(Q_IS_ENUM(RealType)); + << bool(std::is_enum::value); QT_FOR_EACH_STATIC_CORE_CLASS(ADD_METATYPE_TEST_ROW) QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(ADD_METATYPE_TEST_ROW) QT_FOR_EACH_STATIC_CORE_POINTER(ADD_METATYPE_TEST_ROW) From 615270a3008cfc1314a3c983b7e69006dc4184b4 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 8 Aug 2016 09:41:57 +0200 Subject: [PATCH 062/136] Rename QtPrivate::is_[un]signed to QtPrivate::Is[Un]signedEnum Any other use than for enums should use std::is_[un]signed. Make this explicit by renaming the type traits. Change-Id: I494158563c95c710e710d0d337f4e547006df171 Reviewed-by: Thiago Macieira --- src/corelib/global/qflags.h | 2 +- src/corelib/global/qtypetraits.h | 41 ++++++++++--------- .../auto/corelib/global/qflags/tst_qflags.cpp | 8 ++-- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/corelib/global/qflags.h b/src/corelib/global/qflags.h index f85fc705b46..b871c90c9db 100644 --- a/src/corelib/global/qflags.h +++ b/src/corelib/global/qflags.h @@ -103,7 +103,7 @@ public: typedef int Int; #else typedef typename std::conditional< - QtPrivate::is_unsigned::value, + QtPrivate::QIsUnsignedEnum::value, unsigned int, signed int >::type Int; diff --git a/src/corelib/global/qtypetraits.h b/src/corelib/global/qtypetraits.h index b664dd3a3e7..9773db919b7 100644 --- a/src/corelib/global/qtypetraits.h +++ b/src/corelib/global/qtypetraits.h @@ -47,7 +47,8 @@ QT_BEGIN_NAMESPACE namespace QtPrivate { // -// define custom is_signed, is_unsigned that also works with enum's +// Define QIsUnsignedEnum, QIsSignedEnum - +// std::is_signed, std::is_unsigned does not work for enum's // // a metafunction to invert an integral_constant: @@ -57,37 +58,37 @@ struct not_ // Checks whether a type is unsigned (T must be convertible to unsigned int): template -struct is_unsigned +struct QIsUnsignedEnum : std::integral_constant {}; // Checks whether a type is signed (T must be convertible to int): template -struct is_signed - : not_< is_unsigned > {}; +struct QIsSignedEnum + : not_< QIsUnsignedEnum > {}; -Q_STATIC_ASSERT(( is_unsigned::value)); -Q_STATIC_ASSERT((!is_unsigned::value)); +Q_STATIC_ASSERT(( QIsUnsignedEnum::value)); +Q_STATIC_ASSERT((!QIsUnsignedEnum::value)); -Q_STATIC_ASSERT((!is_signed::value)); -Q_STATIC_ASSERT(( is_signed::value)); +Q_STATIC_ASSERT((!QIsSignedEnum::value)); +Q_STATIC_ASSERT(( QIsSignedEnum::value)); -Q_STATIC_ASSERT(( is_unsigned::value)); -Q_STATIC_ASSERT((!is_unsigned::value)); +Q_STATIC_ASSERT(( QIsUnsignedEnum::value)); +Q_STATIC_ASSERT((!QIsUnsignedEnum::value)); -Q_STATIC_ASSERT((!is_signed::value)); -Q_STATIC_ASSERT(( is_signed::value)); +Q_STATIC_ASSERT((!QIsSignedEnum::value)); +Q_STATIC_ASSERT(( QIsSignedEnum::value)); -Q_STATIC_ASSERT(( is_unsigned::value)); -Q_STATIC_ASSERT((!is_unsigned::value)); +Q_STATIC_ASSERT(( QIsUnsignedEnum::value)); +Q_STATIC_ASSERT((!QIsUnsignedEnum::value)); -Q_STATIC_ASSERT((!is_signed::value)); -Q_STATIC_ASSERT(( is_signed::value)); +Q_STATIC_ASSERT((!QIsSignedEnum::value)); +Q_STATIC_ASSERT(( QIsSignedEnum::value)); -Q_STATIC_ASSERT(( is_unsigned::value)); -Q_STATIC_ASSERT((!is_unsigned::value)); +Q_STATIC_ASSERT(( QIsUnsignedEnum::value)); +Q_STATIC_ASSERT((!QIsUnsignedEnum::value)); -Q_STATIC_ASSERT((!is_signed::value)); -Q_STATIC_ASSERT(( is_signed::value)); +Q_STATIC_ASSERT((!QIsSignedEnum::value)); +Q_STATIC_ASSERT(( QIsSignedEnum::value)); } // namespace QtPrivate diff --git a/tests/auto/corelib/global/qflags/tst_qflags.cpp b/tests/auto/corelib/global/qflags/tst_qflags.cpp index 10902b6f55a..634d9a2df3c 100644 --- a/tests/auto/corelib/global/qflags/tst_qflags.cpp +++ b/tests/auto/corelib/global/qflags/tst_qflags.cpp @@ -134,11 +134,11 @@ void tst_QFlags::signedness() // underlying type is implementation-defined, we need to allow for // a different signedness, so we only check that the relative // signedness of the types matches: - Q_STATIC_ASSERT((QtPrivate::is_unsigned::value == - QtPrivate::is_unsigned::value)); + Q_STATIC_ASSERT((QtPrivate::QIsUnsignedEnum::value == + QtPrivate::QIsUnsignedEnum::value)); - Q_STATIC_ASSERT((QtPrivate::is_signed::value == - QtPrivate::is_signed::value)); + Q_STATIC_ASSERT((QtPrivate::QIsSignedEnum::value == + QtPrivate::QIsSignedEnum::value)); } #if defined(Q_COMPILER_CLASS_ENUM) From a160fd52a1e121dfb237bfcddc305caa896df7dc Mon Sep 17 00:00:00 2001 From: Steve Schilz Date: Fri, 6 May 2016 09:31:03 -0700 Subject: [PATCH 063/136] Documentation: Specify units for QTextDocument::pageSize MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parameter in setPageSize is QSizeF. Without a specified unit it is hard to know what to use as input. Units depend upon the underlying paint device Change-Id: If001b3e9587d6085cc18017680fa20396e936adb Reviewed-by: Edward Welbourne Reviewed-by: Topi Reiniö Reviewed-by: Nico Vertriest Reviewed-by: Steve Schilz --- src/gui/text/qtextdocument.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 6cccf417c70..baadc068d5a 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -1760,6 +1760,10 @@ QTextBlock QTextDocument::lastBlock() const \property QTextDocument::pageSize \brief the page size that should be used for laying out the document + The units are determined by the underlying paint device. The size is + measured in logical pixels when painting to the screen, and in points + (1/72 inch) when painting to a printer. + By default, for a newly-created, empty document, this property contains an undefined size. From 8ee65cd1f25d8a78b6cdba3e6ab6fa031468693c Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 7 Nov 2016 12:29:12 +0100 Subject: [PATCH 064/136] Correct a Q_CHECK_PTR()'s parameter Someone cut-and-pasted but forgot one of the changes. Change-Id: I647dc8117ebfe8ce3d4b26d468b80c15d4e533e8 Reviewed-by: Thiago Macieira --- src/corelib/xml/qxmlstream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp index ef7d454dcaa..6ad06eaed6a 100644 --- a/src/corelib/xml/qxmlstream.cpp +++ b/src/corelib/xml/qxmlstream.cpp @@ -880,7 +880,7 @@ inline void QXmlStreamReaderPrivate::reallocateStack() sym_stack = reinterpret_cast (realloc(sym_stack, stack_size * sizeof(Value))); Q_CHECK_PTR(sym_stack); state_stack = reinterpret_cast (realloc(state_stack, stack_size * sizeof(int))); - Q_CHECK_PTR(sym_stack); + Q_CHECK_PTR(state_stack); } From ef744f2163a22960a04a4c524fece0ec40b2534d Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 8 Nov 2016 15:34:10 +0100 Subject: [PATCH 065/136] Avoid clang warnings about unused return values Change-Id: Iebec7fb425a92199592cb3ea92190dd0bb5deabd Reviewed-by: Thiago Macieira --- src/3rdparty/forkfd/forkfd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/3rdparty/forkfd/forkfd.c b/src/3rdparty/forkfd/forkfd.c index 7b711e197b7..e57d9aa1e0a 100644 --- a/src/3rdparty/forkfd/forkfd.c +++ b/src/3rdparty/forkfd/forkfd.c @@ -162,7 +162,7 @@ static ProcessInfo *tryAllocateInSection(Header *header, ProcessInfo entries[], } /* there isn't an available entry, undo our increment */ - ffd_atomic_add_fetch(&header->busyCount, -1, FFD_ATOMIC_RELAXED); + (void)ffd_atomic_add_fetch(&header->busyCount, -1, FFD_ATOMIC_RELAXED); return NULL; } @@ -267,7 +267,7 @@ static void freeInfo(Header *header, ProcessInfo *entry) entry->deathPipe = -1; entry->pid = 0; - ffd_atomic_add_fetch(&header->busyCount, -1, FFD_ATOMIC_RELEASE); + (void)ffd_atomic_add_fetch(&header->busyCount, -1, FFD_ATOMIC_RELEASE); assert(header->busyCount >= 0); } From 7d3b291c2252bb737845b923e86c5dbcc9e5ec72 Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Wed, 9 Nov 2016 10:45:12 +0100 Subject: [PATCH 066/136] winrt: Switch default screen image format No need to specify a format with alpha for the screen. Comparing to Windows, Format_ARGB32_Premultiplied was only set in the constructor, but never actually during runtime as detection enforces eith RGB32 or RGB16. Change-Id: I4c2fabbab0d14ee296f9b7e43b02de8a9836d5bb Reviewed-by: Oliver Wolff --- src/plugins/platforms/winrt/qwinrtscreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp index e8e869c04f5..6d4edcc8dc4 100644 --- a/src/plugins/platforms/winrt/qwinrtscreen.cpp +++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp @@ -625,7 +625,7 @@ int QWinRTScreen::depth() const QImage::Format QWinRTScreen::format() const { - return QImage::Format_ARGB32_Premultiplied; + return QImage::Format_RGB32; } QSizeF QWinRTScreen::physicalSize() const From eedf8f28e014bb3de6bbaec173d10e03e1792bc4 Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Thu, 3 Nov 2016 15:28:28 +0100 Subject: [PATCH 067/136] Doc: update SQL examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - screenshot: remove OS-dependent part of window - \image --> \borderedimage Change-Id: I3eb98595e5c2eb254d3857e4c81dfedac8b7939e Reviewed-by: Topi Reiniö --- examples/sql/doc/images/books-demo.png | Bin 29155 -> 14782 bytes .../sql/doc/images/cachedtable-example.png | Bin 15908 -> 6912 bytes examples/sql/doc/images/drilldown-example.png | Bin 9092 -> 6612 bytes .../sql/doc/images/masterdetail-example.png | Bin 104228 -> 66419 bytes .../sql/doc/images/querymodel-example.png | Bin 30882 -> 17656 bytes .../images/relationaltablemodel-example.png | Bin 10188 -> 5556 bytes examples/sql/doc/images/sql-widget-mapper.png | Bin 13040 -> 4777 bytes examples/sql/doc/images/sqlbrowser-demo.png | Bin 20671 -> 12742 bytes .../sql/doc/images/tablemodel-example.png | Bin 20904 -> 14361 bytes .../images/widgetmapper-sql-mapping-table.png | Bin 39681 -> 11701 bytes .../doc/images/widgetmapper-sql-mapping.png | Bin 60265 -> 17593 bytes examples/sql/doc/src/books.qdoc | 2 +- examples/sql/doc/src/cachedtable.qdoc | 2 +- examples/sql/doc/src/drilldown.qdoc | 2 +- examples/sql/doc/src/masterdetail.qdoc | 2 +- examples/sql/doc/src/querymodel.qdoc | 2 +- .../sql/doc/src/relationaltablemodel.qdoc | 2 +- examples/sql/doc/src/sqlbrowser.qdoc | 2 +- examples/sql/doc/src/sqlwidgetmapper.qdoc | 6 +++--- examples/sql/doc/src/tablemodel.qdoc | 2 +- 20 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/sql/doc/images/books-demo.png b/examples/sql/doc/images/books-demo.png index 5bcc20b4789359087ea3f379a08b13d2f78de9d8..77b3b308c9448475bbcbd6388b0d0e8b08d339c8 100644 GIT binary patch literal 14782 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 J%@c>{{{aMx+gShr literal 15908 zcmZvD1y~eq->=FFORsdZbT<-`Dx9ny_RgOq@PG(2>JbeD8@*BR93 zd*APzvlkZ^?9SXX_dPSe`u{gbSy37jjRft%g9n(hGLo+!Ja||L{Cxy|1pHQeT=DL~ z1CcFRNtmkZ)J_VDCZ5K4hbNAL{M^|UYicQ!4-cLBIjAr#V?voVFaw#zNEH-2@w7dG zF{!mxuLQ-IkSQ1+kBN`{5fc+9zDUM6&hJ_nFuTCS36dN#=t?Ugk^TqEdG4pbgLjk+Z4`1yY1op% z)36U#^{LUo|8ap!3*J;!hcZuOJ*SpaCVx&eFvb1a)t3h|kE^!c(gW@W~zMq40y%5(r*C&j_lm?ks$9j>jLhZwLh-+kt*8}GUEDP6EU1v$;J7jL z7@gp_GMV4v9e1V0L^&op0ed-FrJ|t}ao;)HD95pv-eL&<`*{(s%gq-iKd$DqjpG6Y z3&YfMp5dlNCpgc~c-;iP@Aoz+YQ&#ZCQRk(`NnitZz}Soc$`66vWLndHhqm?U#F>*p{AUAI<{Y3j)a*xT z<7$l|mG*mL?x)vkcT67s{q-h|+=`Ca@)Hu)MlYtngn8z=GQY_#*J40=jh)(1dv}g+ z%?3X<8Ax}y3e(}HtQ?(MDLkCl9$R|zo$VRt@@}YU<9t1#TQfhW!1mZg;ueQ)wT-Bk zb}A}`IlI5x70Ov+xp!-ZRd*_RkShI&qcFE!A6tWepUB{kwdEXt322C&SdX=zvXr6J zE2hGUNq4F%_J#;1{Zg`ApPSClk3`Y-u0_CD`Xt%Pd?7Yx>*nv(jN&}6&Qj_++;{N< zx_DSoK2gExSQSb_Ihv>@~^OYL1po>J8st}OZz-bh24V3Ah((JA0eK6^6G78e`aMw^k=WTv!(dq?`U$I@gvQS8IuXKGgK$ZAE5{(0|xqK!5&x3dJ>a-w2X;)$cMmT}Xt^l4Wm zxL+tG{WlEs2Iuj1JFAJ4={2NgEV9!SPV;Hm`3J+VglfXBX6?-u8jLl(rglTZJyVLA zH?(o`J9w$7od~8PO6~ulC668>mcYIg0!xgG)X*PzKK|2dS=9xO zQRQBlGRpkTrvHXI(fIAKIWcoLJihH1I)B9PHM9Os*!JKnv5?1Pkr1KnY?D)2dLR98 zsr1691N0lkFIZ2>zNc@2C|71*QZsQ37Ypxb_;y)M2+t#5dfw*3P?D<~xRaHo(lS2a zsgLX!u<5_1k5*$n+i8@rTf>>f?>!%GlD1l#~=7ABlj5Bfp-b z*t3PMVRH^g%pI*`EsM8%E%UslQsU}!#>(7u^;JD{=22E3x}45nl6CiT~PEQ$)f zY)nsHCO1uE_){_lZM?SRuXsCiv9*3K55Lan+XtZikkY2k<7~Gtxe`^@f^IZL>y*t* z-9&zf@SXIJ?b;W&6LP1C-9MOxiOBx(Zm4`y+)mGfiHv`Aa9V%vPu}=zvzt=F6G;gE z^tADOyoX04Wy{(-D|0p|EVJG{bl%}~=;>Vul?T=rta=Jj^NW6Z-PQ8Vv*@P%`H=9A z)1P*Y1|mJ9MJVso=jv&r4mX8Q|5-PsI=po8!9uP#!*Du@oA+gYg#S3JB*W&a>5$Hp z`%RmDsv^I(3o?vWPKa4?5BAgbdgHa}5l>C?PL0y$(6sYJi6I{!pZX1o6UmP^U(u9M zJZ+FLh0Z+q_o_Q>k6*WZ!@W% zV^PlO$>M2Wx=AxyZ_OTi&;Pt}K51eZ4lkUyF>yE3TWsm5d3QBp^|ZvW!>%S}`)H4_ z!S&#K?8Zc#XTz4@Nw2ph@x-QfQLGr>?b!A6$0$DVtmxNeq(q@3duyT_(>>>|m(Mj@ zu#Br}1Pp-tZ0w!QbW?JPcPe`2uV24x{O7eR1}n#D2Tof~i8SAn@x9y9_$H(fP`!1c zHCJ<|gxunMmatuRUfHAZeD7C%VqATr70+9rs0O;oZraSjD{DgiSPk z&_mUJ8t}59E&jq6$s+MABw*C&^=WFI*XC<$Grfb(q|umJfLVlH&rLcf+!`r`^o3gq z;%7?gcY;&z7&k6NCtO&6UcHuI%v`%k!6KP*<6h_8=FIQ=C)FrA#3k_9MT}57uq!W- z;;LRzzwYDh#*cbEIvP)=t1x7<75vg&&H_4b>ub+nv*Z^(Fwu}boB5EI1l^_1pe>+fUMz<<3(lTm337G#MG0#$I9+0-hU9UyQxpiS0{A zKN0IYKP{O~Qu(4s^(2z3a_`0M=Ay^>vR_<%JPF2RR;aOT*7xq8&I5suHB5MI+q=BS z_kJ257at}=RU?Zh()V=8ePG)q`TDEv+8(T=C&uBB zJ9*j4l&4fl%!;N~gtf!_z)Ttp7r*a;mYX==UE>NV++`F7BzQ)jPI9`7*(?r#pqt(%*_vfnP?Telah5;-x zbN~r(-mqO5FYP&8_@f`941deIOHPX1T5&m8=^20Q7vAVJKl#XjzHV!oFy`0LK75pepj_;>e*wek9FbI%|Gp} zxtBL@&ZMY5Qb7A!aKx~6*Kl4ZF0!J)dsy*DT(o!mJSaUFE>*XXK5P>a8j;r=ydprp z-O;)#?S=J66gj6l!}M-CSQB~O@&|uDz3#PXi4zbK8b}dx>HjQPzoX7rc>aZKAURZQ zX6}-qo}w%{N%3P+qT;)`w!C+DvB*dol^d0HQk97lBN}9t^L$s3yq;yUA zHiThkJ;j>9+VPN;#!j!rpEg!jTq>>_?AJ36cQ+T6Mv6>R`5wN=6n-{!-M&eJH4ogG zV=DZl;d9gPHYbf-6hy4}ntEK1DO}SO8clE7i@sEh7~f)FnS0lw?4c54YavovP+v%l z>7dncId%^q`;0mMIKw+*4pMclC_5nH=1-G<9*dUub!>R?m;%&it`qf>>7P0ox{b zYahJ5?TpXUbIy4v1Cx}m5KuR5!F#=pQ|$U0iiEWa2Yke}^R^SkGqBRQl!#B~`` zeKl)(S~F+Kl?eAtTK%yk#+^tSnoMRMZdV^o)cd!L-AT828&@o2V~kdN5_oT%`y8UE zyf$N~~Gpa%T){%xdaXe=cV}>W6v{ z2C~=u;HtT+S=pKz#~r8jCa)03ux^d0-pXZ8~cVChom#+vrl?@dMH?Anl(lh)l0G$+*(D%w;oD5q{3Gw*wU$b zWslC2_XpuM-e-Awv-FgEqAMm!xx)lJ?APm02#E2GcdAM=Pb`P+uH5_TBt>cSBrbh^ zU^_M_|F==`Tmv1L8t&Pc@>k|A*(JgiRcj1b=*6)=%#Pg_<9OS%NP4dQBt8~p3R`n((x$Ak*Zm_-yY7vELJa1{)lhmtq8(4!+3{ZGEmsJu^7hc<+ z=i4k*YW5$J)IkG3zo3@QJA(>XUtmU&IL^8+u6Xq`cqmRyI&Ht#?YIs0uKhGU@ovVS z{dB7~^rHIeT){Kvj%z&`ov-IxWUUNs&iIBu~;{P4tw!Wq{DbL@JaEIKqpx9csYAjRu(Ic5)t}gPBd48#hlUY_WEMfL~h~& zhej--7=-aoxeHgC3vX@{-=B|VJ^~gza}~~AhR&-L)I}^HR3QOj@9$^p?ebt`jWKKt z;P$J~S!Owmv z@h{|vnPkNoxt~$^`B5c&Ni22?R+5j#LS)!6-5HH`{-fjg7@j=1!2Jp3Eb?nB zRl*gNj!pUqk2IB<4s_&ua@&?9eSaWPWekL%n;%@QKwW_z1;@`oeb;Asq|m}11KS@6r2sW%pY|5cEjU1C19&o4+He0GqRM_eqT!V%iZcrM} zGeiY6O9OJ5^}9Z&m^gK5L-ur|`dSjE1i*J{V%pF&-!gBn}4tJ$#kGekmpe?*$JdFHI?TEl#f26q4 zaG1|)w!NmNDl<9JiEZo2qhVle=-9OXT^kZ-bPYDKCX3PVT_j|T{D~Ho*y7~@#oHP4 z+Flqq)Gpezr_pMvka*-JE@-pHp=X$=@l6k@&SXeN zwOH?FKQdZINFi0wq?22B_N$$K8HI^mrzRtFxXK7yNv+|v0H{UGMaQA+v+l%)m!C+UHt$K6 z@@l2Pb(a_1XBSIRHa;c)$bi`g1ShlMNQb+nbJ@~W+8l|yUxn$O$F)c+K|d9cwO|#- zl^(>`I`2t8n*EH7N#d)AUhLcO+SNI>TLS|T)U}ZT+}AHoZ>oID51IHxPqO0Yd*861 zG@KiC4ZV+a5M;#YHPWu;6&v2`_4CIhJ#ctb>^qvLqCsC&Vv~qRoB|~WNeQi8hg86q z9_8ckH$cUHJ^&j9R{ows^Q7nXL5I6Lo8Zn=S*rJLs@LU4eWxa0(r{&}T90~Bj-aRK zet0IDNXtMqi9Pu^<4a?mnUN8BjY?M?ow@e*@%2`6{EROm9^S>a`b=c@QDU`n zD=f%ORlazyn2=y4+el8^zDhLYxwBUXKn>gi!eR9q@AS$JnC52vh$B zY_S?`Y~p+_NX+|*M{8aymJ?G>TS6{;#V`0ddov*q zy_axRSgL{hK{xvl-v^rU@>P%oCky2Oq??)3eH7cuW~L^9*LF$RLve2|PG%k>{2$Eo z^1H|I6XD9o>xVQv`}Sb&!9}SlyQ$;IAI_bI$rI`qyzyYv+LKB1)XewVV>F?G!SPs# za|^$=MolU70=25XU*DRQICt)DAeYVN{d$GJZ-0}1#q$|Y_|1VvoDA7BI9ZDlzs>B; z_R+w>kNW0%yAAD1nl}PLR-XBpxFl{Cbf!b}^f^a_tY#Z3qUJv*^Zs+aAAIJ<@i%Z+ zZ{X&PeKKLfKhy+Av||K{5+EODg%`!*J^qC;iGYU&mKoV2=O zBU$JOX-!f7gC=nyaH)pZFHDofPSNeiuSuF3Hg6XB0RMLCw4sndV9OvU$5DR zJGUN#h2XN2ZT_WSnDH+WzGeeG;kEd(udMeB{Gx*%EyTMtm|)C4vba;DI}oOvc;YWf z6)4s$@iWUU3J>v$3-$lry9vDyS8qBFjIibUCS_Qf3hVlpH1p69)?IyR1>?L*<;(PJ zG_nmtwklmDH09@)0ne2$wy^2$=vDfgo0~gPmst!|s6Z7nw7M<{TC7j45Ak8jNK{|1 zYg$H(@(iPkRneOQqz0s*Ddt=Pe4zJ5pwKN3T$yCd>6scuZa*<`$%ic z(vgxbjeP$Fo>xym*&huWO2CNwcQ!v5EM}SmxRO>}yjPs`R)Avz`gNIl^3MU7NkPO9 zW8F4tx&ghBZ+UPcZ1@Cpf8-IQrrZo1f2d5P$6e%liI*B40o6Z~vdB$3hFuc-17deG z^&T!Q{+QLDv$AM$adCTfL|yk67?i#+vS#{W3i0sZMmJWrV(b=aRlFU1)L-p(L|>{j zrx6qsRHeGWZlmJrD)71e8=ZpRf=_^w6d)cx!w(E^@)=p50~p4IkIhi%P;;7lqA8!0 z%7oP9>+1{fi9*V=le^o!yDE9!y&~;O>c#EtI+HFOKhttt1RVSP>MApDzQ!qJpJA`y z6DhxzwszU^)_5@{CMMFON4!Efs`#K`o};Hqn!e)Cz&TkfoR2~N<(AoE?!6PwoHlI} zBbs+P8{HZ`uLyeVL_9C?Hh%v6*`FfBBKZIY`2jqHPiS70lvh?(CMFW2>dK zX}hd+$08#m1B7sRc*xA=u>Lc>5DjCzdwa61pr-ita;tc*-owM)ox0v}y!mp236%`dZ^y(HoVqdZx<6xxoYe{a66|s!6T~LBWpTshP%8t;aq|5U&X#EZN z^wSM1<)G*DWUs)hD=VYeLvysXRwv8MiwX-Ty!JzkD@i!%6QZIXiG3DyK%Na;8%QmacW^kWuo|a6SnVT4 zK|#^b7$1T%?$NE1!6hHL7Fk1B8R69bDz|1iRzMyIJ`E|3C`r~7NlK+bYr4LMi-MdS z9l?lfH>jv61q}0LW^DjLm|1adZbya5H#i`W>)lV}dL(B?aui50+Kd>;FrO|ob)N1_ zH+_$YfSi_o{rc6cFXgn%ot?cW zj*SM)eEd&a2;m@MSa9(3%f*&}w{t`?o+q2J$;qVX**zfGgGV02y|Z<3Aw0#QC?ONDeGnuOfThLGBZYPvk-bct0`pW1ag{5r4vS#RxLtGgPcjNglbe(H6Gu<8+S3si= z!S2r=9}iyC`t+_ZJw98k#IT^t-roLa-4pDnVi4=IXGteH2b|<*$#Td|)c4$fq|58R*H&%{{kRN*L4wGd$ViuOhKW0+nxDwf*>EWxlZEp>D{v zjk|=+W7Z!x=`DzdAFXK!i6MlQe1B?v?EUG}rvrh<62Sm2YnK{5ZWaec?Mzn!;jLvh z;}1x9qV>GUg`Am-h)#nTUM;$0Ox`|hIwU9kqt^~Z!vLg?<-wuVSJPEt0~s%=^rZj8 z(iUN~v7tZkeSMUHnI6^RCnnU`qQR`!@k^sYSJeS-gMLL$xzV-f;qXdC7Nqq`;4eAk zp&-H~>9Cp#;f`j&Fg;YjlWk^!@ed}6^*jElFP_)m%enwL#OisSHPH3}O1sZ-dtLU5 zhP*J~jTYCfs6?}k=jr6y`e@wVK6S>gY+r-m|Iowe5Dw&LI)yJ2C&)op{}jm_O=a%y2S__Ema=Eq~&_JqKqn4mV7bg$`;3ryAf%V>gvGJEyeFj#%Ycs#9OFu4NZ^T1=P5af6_FP=G zo3)zQ@g!+gwuX+s%)zeG4KU;|*|BEXW<>mblt4!nD4Q-N6;k~2z<`!z?PJM=&yz== zqo~0+plsi?xa54OCX^K!77Sv-p#|rYARe#1#0VN10>PM|j5T<|QV2X$9MI@Pm?ROD z{AElWJy`A`Y%qI)2`5V?0{WF692^W~!~`ArNku}XfWw`L?>Bq}BVLO`R1Ux))WEo? zh|LesI21!;Z<#;4Hvt~r@D;60BowCX2{HM7Fbik`3+si9?P{^t)xfOh^)`Ndne|zA zd7ZRhxV~i0a;?p?C8wwKdy6V?`99BbqxT=;q!CR`O*fY(RFI$^gzLxSFUtry z^g>Db6&L9X-)wJhv+Cq@0|Z9Z%zpXLV_gvX~4s#StY4dY`WB5 zfAVzfmZ!yeQvTf zrbk17zUu9o8y13R?5e@-s^4^pIBWdY?x{#|Ad5dIid(^Q$8LZtI>S?e!MMobb;m7zT~&i zePkP{*oO$~?eGId!=(G`T4w4CoDlTv)nWpa5^+?S;&HI46sPygE^=Ps6g5b~`fEib zRObfpH-?D@evm@F`e#}kLjl;7FUm|3HQQ}BhO*(Hw4;#6MNfpkJ8Ef>qF8z1CPPfV0sjoSbr*vF3_ zxwoTb_s{$(NgmR4;DID>Z*SGOa9Ej{5!xTb;wS+L5g4v73WYw10o|5B>pw`Kp`qD^ z8;VJru49EXBt(9Zg~WgmvP_Ba8?Sv^A)nKPh18xWpFo4;w?}b=PqqN>dvSigPsty<3TYi-hKR3jc zY%D(&#!jqUVXbEf9Axxm;J2AEpp1@=<|6UypfN=(0Cfq?YaBd0-+HQyi}A)=zjjuw zQuBc?ySuxrz(BeKltST4p|?Mwju8hl5=00Y zZEfu(w?_@`|9p73E~EYmZ1!7Q0CE*jjPToQL2njhw31u?FC+lZ7QgsJa&d8yEx0^Z zr2Q5O9$;zld4eny$H=AtiFt%TmEDkEXBsJB(8jn zuNw$uWCFd!y=emjKQLtxNbeKCQK5m`8FEnnqMaoIN_u5nr;>0Fl|XKx`Y+azLt0af zOH0L0bKjs1gJ1yUQM3MqT@=J*2KD{s6X$q;HwVCV5+YBat`-EETmirpR+2BSe9NJ} z0(iAYzujg&b0qXzktLwj1yE1{=*^}|p!*GNpiEH+f>_PR_7T)DAWBv?rqcAI zZVFxjQf25@TF}ZGdnDogiQkh{fu$5;o4SAz>ou(mgcTjc1NcEzA<&``r=sSzxdB@p z_gzl_G(PTD=AKXx2C*NZdYw8&pVLh=v-yd^_LME1oy>_`;O<_dTxC#`9H@!e&L{R` zS~FR&4I@q=Z6qM6{Q*+2+`}?oBQVlb)@1aFQo}R&ogAR8alHZ|nMMzEH7s z8sOo%UqLExj_ERL0YDiP-p7s!P+(**nz*t_J&POIXlH!3)`j1CBBDoDPL7+4t0_3p z2L;>faJj2HmPNbLX131Fp%6htM#f49VyTm6tqY}1361x$%GdBR(ixasi+>Z%qgZki}g4Iw1{Nlc6j7zWxxQ{t?Owl?Zxc&8XL9Vm(201X?tG6DYn&bu>-EBDPQ zS7&>BL)kCsi0KN2A;-VDqQz)a6Zhu)U`eNIr6-*gE(L#3pYqf zIdF!P);CVAL4fxZ&k7y3nX3y5q11)kHgBR?jTUJWrr;wX`2de0Dx3zU>;XNWbDT?P z-d@w^1Du(IAdoxv^c1KS5WLLI$@y->%}vVtc7ITsa&f3oSm`A*Drk|c`~|^Pn%(!P zsz_Gd8oUjFYP=4+82tSFSX1KSaxfvSrobXA5Fj!0{@=D!qhZ*f>hRvP0{p?S=ImFI zuTdO!1>t^0@w1Q-9L#4y&wcoi3vl$65p#bu!nTJl&CKT1oRIGX|UgM@@sktL*~s@fW`0IVz*{nz5+ z0chKgM<&)*CML8QVhzIpV?2h2Psr(&v+ZRC?{mKs(d5pgvRxn#0M?f_vsazL_Vv#XP0f0Rs?$nVA_)2%E|w5L~c+MMXn< zUjCI1(n^l!<1*9MqL}Is;^)_vuU2r&?k3nYH%Fn76grH7iHS`n@S!zbA|R$vtrUW% zyF+k~b}+s-k12wzCx74?Lu3X%uW;M`G_avS2Z}fe34v==+xUsV!2oHKQ9Pa{8x8E8 zk($v5X`Oh^^QB3!Q(8I#zb5d+bf=3^)$6afWtwb*A+BHVb^ zKlrO8k4pfH0Kzjl5r{m_Z-NMJ$diO*`6~c$XUPYWq8P&clY%{LTA!f357a)StxLH7 z8Oj}+zz7V)3&C>}mHKxlZjh8T-Tx$Rs`44Xu|xS-@6WKWu|c?!QUG54N$^k+mi}q$ z1LD8;evJa6$;6ET61b2opd44g+KJsfdb00burBxHww7uL2SSw_*;p@c{~~ zBp4RaOb~3-sgcjUl1yRc34%R!4k&X#=VApMM*1%2{iM+_%e-!Mzh``ix&utY)gObg z-UPn?tXskD5h4KubCM_#*95@;o5K=(pDZR${u?yDqW#(h>FuoHVEsLBd?`c{W)u9c zJ!8ZfF#+e8um1I9Qjux&5c( zG@)85m-U}bH(HNj zG@-onSgBWtOp6oeOdd}0;3}FfpRMrlMg`qPGodxr)ztyQ(k}jq)@rTG9x?{e!p6p% zQ3-r}zHLB`vuc%hj*Z26^78ZR*E+NHxY*j-Iyp%#0uc|8pF(lzI>N|9B!RZ@o9pX{ z&d$!CgM)@ew5)gt+4nhx5ReYAOp_rLnb5W_nD}R-{*ZyT!Jml8RM7w z{C>W(g}S*|@f?4XKf4oF%@TvTIyaJ^`d9n@HwPV*l}x2dq8BFD=Lb?!Qk@-*fQ*-n zUTw#Oc8+)i30zMjkzS^g#I@x{G;F z?NI&Za%7ZQpb0TiUCX?l?J;@75n!zPhhY1QZpVOXv!LCQygVif|Mjh{CAnrOf9-cB zoK|I~7mAB4-wc;7aHjE|JfRvc$;`-zpc%ehIRk1`iR6|*2{Zi^u%th)Hb+_b`T57*JlVzS@kpkI6@7rZH*wdH*xwg* zXQcl{-NWKe2|*_br5CjK(W+9$4#O{gk6FfDZ>%c1QAt8$7Q#{X02wAc(`iOCAx! zo(Ysmi}RvXH+>UeOLdU!Jsj#f1eR9k{7;-4#&Bj1qtLO9%QG0xLujX*JNVCgT0O zQiecx1~WHulXSR#AV3pAP#HsXDgI@a(H9783Q>H35_V=6w`ZPXprfIieif3xPo3<+ ztAuz#K%CO%6Iu8fr8xtI=5KvPQIAR=konPFAHj$r@&AESCvi@mE74rbJ0daM-|nGz z`_bRE8hO}s+^dsgxknn0eNQe1FUCCo^HEGW>(?Y|<7DVP$@CKbogq0yUS5&#H(UJ& zcY!P{SaAjQ_ZV6)zWgVwbF_{E7-&eGQ$zC*(t217;DyaZ2~~V_OpJ+mTB2S{vIHk!dUptareY9lxGyE6p|NwC@kDgw?yg)>uOMc4yq%1=PNzDD*NP0Q4a zv6)Z#ew!^l`IIFw(PQ4tXm2Gsg}h_@X7CSvzXa@lcfj7>DxM@viQN0d5fK)-=3Kqm(+OTRqM_tW_#IB97?JHacC z+Y<+XHiD0rI^&R$g_^bGFNA#uYD8`fJuxE&;9oy3`}pT=B_5*Hs{-;#fM7!^gaF9s zfAA8f3zCV#iBJKAw7FYdU9}qjCiSZ?nI8)a>)W?)0JD@NaDr9}7Jf-qJ8;1=PJjBFOv0=_g9V_PmumBv@ zm&jwj+!?7g*VYn_gNy5<095;yYT1EYr4N}+9Z=R*uK-|gt;!FLUU_NxrT9J$=cDs? z0Kq6?<@0rt;sqEarKPtvHYaL!o`CVq%<}5n}XTvjEu>a9`_DQI$7({@Pt$=Wv-R3}`|5br`#W<*-BWyXNC1 zE6lTa`BV!XCW*5CSSeL>wx=hg2Yz$;)P~}|{=iyG)ulJKk^drWd@&`jnZ&3 zIA=mvUik%h6uL`F`eMvZV7+8fue8xM1b3?%T7W(PUF$%gfwFMR-^ZY7LDk8$U~hYa zj2RQ~zp20(NH>p<9owa69!Q50rLRDG`}*2a#P#(l*?fB>*TCIPwlWdk_UY8Y=JM(rfq#NbC4yS;mbO%p|1=*t_!#dytD$`o-MW@ zWCFbB%7(IR9}O(@9<6e|4eaNr`KOl@P1l$1(@$#Kt3@%QCLZ_G^9&&N2@4AYa&V0* zi3_7p{fTfOCwva>)_52*2;vk7W8nL`vbT44zj%|-Kz7b@r&{S;MWDw>frQVR*L5HA zA$&#R_`72@DPLj|Jo}LAVGs)OThXR&Fzn%z-$vg_JRLWu($DenGYtja&+#!3yu=Q~zx4w9Xk>d_ z^zP-reun?F*X1Ms7bE2%At*&t|CYO#_tjpxay&L?AO?C1{;&`r(#7DSFav4^eK^o# z$S52Iw6NVb75pj6|J~ikz}>826*b%>+sDAsI^%!fcp*S3`?0*q8h&tphz|ar5r<5S zRV)Bv`j}Tv1X3Axc&g;eA@#q?5?T_Zs`hd)JPAW8@T#b?0OngYLW(ZHn5}rDo*Ktk z(93+!w>hsq2&nXqzrHB?aZ}Kc)0C#Jj{5=VjYF~-6H>G2=%0P@qFo`0uWf!%>v(g= z<5I_hj?2=5$65d<0sg+(w~JXAS>BxPF=&z__d3hWGzs)cb+oP7n=dc*_js>FvCv?g zx#C{bU$F<<6|@0uwCJ)bd{t$>x0j&OeK$k5s0CDGEywdRn_D7)-ky|^&{z)macI_o zQDc=e4&*Mb*n&}C&+l)`nsRyx?>~z)3>Sj)-_E^CPJX5>YymYYLqVOSm%L-6ZPZdg zMNrL&D3A+i$U2NpDm{Gcr^NfZP(`Jod^PCimli4Np8;bby$zJ93E!A!>+nBX5HH~j zohRO|J#r-BZ?HchaqY0LDu+K;YbF~Qf+>5U@myboHOuzJq~7H+qe(9He=D@;!<9m; zyd`O-yI4^JH-&Cr8N}r~F0IxlrFzmwqk{Q{2CK>Nkb6tX*x6E*W2rN7vwYHeM+a_$ zwGE>URveBfqj>f3P~$Q!0tr^`{}G{uTy0aY@5 zt_D=6W_nGp^ZL#cXR^!+g(lB1$9M@%YTE5F^Hk3;(ZYNz8fs>skA?a3NT^sQF@Ij7 zyc;Gi=@N^+){$i70tz4I;>AN?j>m;?)7$HB^2~|mb262(xU4N!mSZausPE&%%y;?4 z^`?L9tXB6)KN5WSv5ECzqW1BS)g;dT>n^UDkWirSvs=mXROv$a6W+fg8&oIxe_v5U z1)6R~t&Pj8o zXHvH+`x?wFmX~lIzwyzbK0W15Uws1?U}n`r10Q z82;~d?~d1?x_|6;XF^7W{pN$BeowHyJEUJyVdw!Mbi;De;clbPA+YGxjj4SHq9 zVU8jb!zg5#WE$AXQ_NVUw1}v` diff --git a/examples/sql/doc/images/drilldown-example.png b/examples/sql/doc/images/drilldown-example.png index fed51d36292ca77941ef4dba9c53329a9db89990..39a4117637812f64845309638aaa57d9f9f00fd7 100644 GIT binary patch literal 6612 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 z

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

DBLp1tA2{C(4EVX$n*&xj6(sn^ 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 literal 104228 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̛LrS%dY{3IxXZarjKwhZ+@$%vU% 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