summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-11-16 07:37:38 +0100
committerLiang Qi <liang.qi@qt.io>2016-11-16 12:35:36 +0100
commit90c425642dfeae4564b43dacf15f80479962e910 (patch)
tree7e51683195210b3c70c04a8a0753ee272af1cd4c
parent1a43199fcea1bcec1ebf1a1a12cd3dcb942d67b4 (diff)
parent9808b53fde1dfc65ad3757cc6720e430c3cc89a2 (diff)
Merge remote-tracking branch 'origin/5.7' into 5.8
Conflicts: mkspecs/common/linux-android.conf src/gui/opengl/qopengl.h src/network/socket/qnativesocketengine_winrt.cpp src/network/socket/qnativesocketengine_winrt_p.h src/plugins/platforms/cocoa/qcocoawindow.mm src/plugins/platforms/eglfs/api/qeglfsintegration.cpp src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp sync.profile Change-Id: If70aaf2c49df91157b864cf0d7d9513546c9bec4
-rw-r--r--config.tests/unix/opengldesktop/opengldesktop.cpp1
-rw-r--r--config.tests/unix/opengles2/opengles2.cpp1
-rw-r--r--config.tests/unix/opengles3/opengles3.cpp1
-rwxr-xr-xconfigure6
-rw-r--r--mkspecs/common/linux-android.conf113
-rw-r--r--mkspecs/features/mac/asset_catalogs.prf2
-rw-r--r--qmake/generators/win32/msbuild_objectmodel.cpp17
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp4
-rw-r--r--qmake/generators/win32/msvc_objectmodel.h5
-rw-r--r--qmake/library/qmakebuiltins.cpp3
-rw-r--r--qmake/property.cpp53
-rw-r--r--src/corelib/json/qjson.cpp25
-rw-r--r--src/corelib/json/qjson_p.h37
-rw-r--r--src/corelib/json/qjsonobject.cpp4
-rw-r--r--src/corelib/kernel/qeventdispatcher_winrt.cpp33
-rw-r--r--src/corelib/xml/qxmlstream.cpp2
-rw-r--r--src/gui/image/qiconloader.cpp2
-rw-r--r--src/gui/kernel/qhighdpiscaling.cpp6
-rw-r--r--src/gui/kernel/qopenglcontext_p.h2
-rw-r--r--src/gui/kernel/qwindow.cpp3
-rw-r--r--src/gui/opengl/qopengl.h18
-rw-r--r--src/gui/opengl/qopenglframebufferobject.cpp6
-rw-r--r--src/gui/text/qtextdocument.cpp4
-rw-r--r--src/gui/text/qtextlayout.cpp8
-rw-r--r--src/network/socket/qnativesocketengine_winrt.cpp2
-rw-r--r--src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc29
-rw-r--r--src/platformsupport/eglconvenience/qt_egl_p.h2
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp52
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm5
-rw-r--r--src/plugins/platforms/cocoa/qcocoacursor.mm9
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm13
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm5
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm5
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm60
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h1
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm23
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfsintegration.cpp12
-rw-r--r--src/plugins/platforms/ios/qiostextresponder.mm2
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp12
-rw-r--r--src/plugins/platforms/winrt/qwinrtbackingstore.h1
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp7
-rw-r--r--src/plugins/platforms/xcb/qxcbclipboard.cpp6
-rw-r--r--src/printsupport/dialogs/qpagesetupdialog_mac.mm5
-rw-r--r--src/printsupport/dialogs/qprintdialog_mac.mm5
-rw-r--r--src/widgets/doc/snippets/code/src_gui_kernel_qwidget.cpp8
-rw-r--r--src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp8
-rw-r--r--src/widgets/graphicsview/qgraphicswidget.cpp1
-rw-r--r--src/widgets/kernel/qwidget.cpp5
-rw-r--r--src/widgets/styles/qstylehelper.cpp22
-rw-r--r--src/widgets/widgets/qlabel.cpp1
-rw-r--r--sync.profile8
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/10.bjsonbin0 -> 544 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/11.bjsonbin0 -> 542 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/12.bjsonbin0 -> 506 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/13.bjsonbin0 -> 544 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/14.bjsonbin0 -> 521 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/15.bjsonbin0 -> 536 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/16.bjsonbin0 -> 874 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/17.bjsonbin0 -> 49 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/18.bjsonbin0 -> 524 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/19.bjsonbin0 -> 524 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/20.bjsonbin0 -> 524 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/21.bjsonbin0 -> 552 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/22.bjsonbin0 -> 524 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/23.bjsonbin0 -> 533 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/24.bjsonbin0 -> 506 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/25.bjsonbin0 -> 542 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/26.bjsonbin0 -> 628 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/27.bjsonbin0 -> 51 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/28.bjsonbin0 -> 542 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/29.bjsonbin0 -> 544 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/30.bjsonbin0 -> 542 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/31.bjsonbin0 -> 553 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/32.bjsonbin0 -> 536 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/33.bjsonbin0 -> 544 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/34.bjsonbin0 -> 524 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/35.bjsonbin0 -> 524 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/36.bjsonbin0 -> 524 bytes
-rw-r--r--tests/auto/corelib/json/invalidBinaryData/37.bjsonbin0 -> 536 bytes
-rw-r--r--tests/auto/corelib/json/tst_qtjson.cpp16
-rw-r--r--tests/auto/gui/image/qpixmap/tst_qpixmap.cpp15
-rw-r--r--tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp37
-rw-r--r--tests/auto/tools/qmakelib/evaltest.cpp4
-rw-r--r--tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp19
-rw-r--r--tests/auto/widgets/widgets/qlabel/red@2x.pngbin0 -> 105 bytes
-rw-r--r--tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp24
-rw-r--r--tests/manual/qcursor/childwidget/childwidget.pro6
-rw-r--r--tests/manual/qcursor/childwidget/main.cpp92
-rw-r--r--tests/manual/qcursor/childwindow/childwindow.pro5
-rw-r--r--tests/manual/qcursor/childwindow/main.cpp91
-rw-r--r--tests/manual/qcursor/childwindowcontainer/childwindowcontainer.pro6
-rw-r--r--tests/manual/qcursor/childwindowcontainer/main.cpp138
-rw-r--r--tests/manual/qcursor/qcursor.pro2
-rw-r--r--tools/configure/configureapp.cpp2
98 files changed, 808 insertions, 326 deletions
diff --git a/config.tests/unix/opengldesktop/opengldesktop.cpp b/config.tests/unix/opengldesktop/opengldesktop.cpp
index 9c206c6172..0a5ce4e78c 100644
--- a/config.tests/unix/opengldesktop/opengldesktop.cpp
+++ b/config.tests/unix/opengldesktop/opengldesktop.cpp
@@ -40,6 +40,7 @@
#ifdef __APPLE__
#include <OpenGL/gl.h>
#else
+#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#endif
diff --git a/config.tests/unix/opengles2/opengles2.cpp b/config.tests/unix/opengles2/opengles2.cpp
index af67129fdd..a9ad0d6766 100644
--- a/config.tests/unix/opengles2/opengles2.cpp
+++ b/config.tests/unix/opengles2/opengles2.cpp
@@ -40,6 +40,7 @@
#ifdef BUILD_ON_MAC
#include <OpenGLES/ES2/gl.h>
#else
+ #define GL_GLEXT_PROTOTYPES
#include <GLES2/gl2.h>
#endif
diff --git a/config.tests/unix/opengles3/opengles3.cpp b/config.tests/unix/opengles3/opengles3.cpp
index 41120ab85e..b5bf9b4a80 100644
--- a/config.tests/unix/opengles3/opengles3.cpp
+++ b/config.tests/unix/opengles3/opengles3.cpp
@@ -40,6 +40,7 @@
#ifdef BUILD_ON_MAC
#include <OpenGLES/ES3/gl.h>
#else
+ #define GL_GLEXT_PROTOTYPES
#include <GLES3/gl3.h>
#endif
diff --git a/configure b/configure
index 3b0240f341..938831df09 100755
--- a/configure
+++ b/configure
@@ -1104,14 +1104,14 @@ if [ "$Edition" = "OpenSource" ]; then
while true; do
if [ "$CFG_ANDROID_STYLE_ASSETS" = "no" ] || [ "$XPLATFORM_ANDROID" = "no" ]; then
echo "You are licensed to use this software under the terms of"
- echo "the GNU Lesser General Public License (LGPL) versions 3."
+ echo "the GNU Lesser General Public License (LGPL) version 3."
echo "You are also licensed to use this software under the terms of"
- echo "the GNU General Public License (GPL) versions 2."
+ echo "the GNU General Public License (GPL) version 2."
affix="either"
showGPL2="yes"
else
echo "You are licensed to use this software under the terms of"
- echo "the GNU Lesser General Public License (LGPL) versions 3."
+ echo "the GNU Lesser General Public License (LGPL) version 3."
showGPL2="no"
affix="the"
fi
diff --git a/mkspecs/common/linux-android.conf b/mkspecs/common/linux-android.conf
deleted file mode 100644
index b8e052d1ec..0000000000
--- a/mkspecs/common/linux-android.conf
+++ /dev/null
@@ -1,113 +0,0 @@
-MAKEFILE_GENERATOR = UNIX
-QMAKE_INCREMENTAL_STYLE = sublib
-
-QMAKE_PLATFORM += android
-
-include(linux.conf)
-include(gcc-base-unix.conf)
-
-QT_QPA_DEFAULT_PLATFORM = minimal
-
-NDK_ROOT = $$(ANDROID_NDK_ROOT)
-isEmpty(NDK_ROOT): error("$ANDROID_NDK_ROOT is empty, please set it to something like ~/android/ndk-r7c")
-
-NDK_HOST = $$(ANDROID_NDK_HOST)
-isEmpty(NDK_HOST): error("$ANDROID_NDK_HOST is empty, please set it to something like linux-x86 or darwin-x86")
-
-ANDROID_PLATFORM = $$(ANDROID_NDK_PLATFORM)
-isEmpty(ANDROID_PLATFORM): ANDROID_PLATFORM = android-5
-
-NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION)
-isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = 4.4.3
-
-!contains(NDK_TOOLCHAIN_VERSION, 4.4.3): ANDROID_CXXSTL_SUFFIX = -$$NDK_TOOLCHAIN_VERSION
-
-NDK_TOOLCHAIN = $$ANDROID_NDK_TOOLCHAIN_PREFIX-$$NDK_TOOLCHAIN_VERSION
-NDK_TOOLCHAIN_PATH = $$NDK_ROOT/toolchains/$$NDK_TOOLCHAIN/prebuilt/$$NDK_HOST
-
-CONFIG += $$ANDROID_PLATFORM $$ANDROID_TARGET_ARCH
-ANDROID_PLATFORM_ROOT_PATH = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/
-ANDROID_PLATFORM_PATH = $$ANDROID_PLATFORM_ROOT_PATH/usr
-
-# used to compile platform plugins for android-4 and android-5
-QMAKE_ANDROID_PLATFORM_INCDIR = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/usr/include
-QMAKE_ANDROID_PLATFORM_LIBDIR = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/usr/lib
-
-ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl$$ANDROID_CXXSTL_SUFFIX/gnu-libstdc++/libs/$$ANDROID_TARGET_ARCH
-ANDROID_SOURCES_CXX_STL_INCDIR = $$NDK_ROOT/sources/cxx-stl$$ANDROID_CXXSTL_SUFFIX/gnu-libstdc++/include $$ANDROID_SOURCES_CXX_STL_LIBDIR/include
-
-# modifications to g++.conf
-QMAKE_CC = $$NDK_TOOLCHAIN_PATH/bin/$$ANDROID_NDK_TOOLS_PREFIX-gcc
-
-QMAKE_CFLAGS_WARN_ON = -Wall -Wextra
-QMAKE_CFLAGS_WARN_OFF = -Wno-psabi
-
-QMAKE_CFLAGS_SHLIB = -fPIC
-QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-QMAKE_CFLAGS_THREAD = -D_REENTRANT
-QMAKE_CFLAGS_HIDESYMS = -fvisibility=hidden
-
-QMAKE_CXX = $$NDK_TOOLCHAIN_PATH/bin/$$ANDROID_NDK_TOOLS_PREFIX-g++
-QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
-QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
-QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
-QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
-QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG
-QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
-QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
-QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
-QMAKE_CXXFLAGS_HIDESYMS = $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
-
-QMAKE_LINK = $$QMAKE_CXX
-QMAKE_LINK_SHLIB = $$QMAKE_LINK
-
-# modifications to linux.conf
-QMAKE_AR = $$NDK_TOOLCHAIN_PATH/bin/$$ANDROID_NDK_TOOLS_PREFIX-ar cqs
-QMAKE_OBJCOPY = $$NDK_TOOLCHAIN_PATH/bin/$$ANDROID_NDK_TOOLS_PREFIX-objcopy
-QMAKE_NM = $$NDK_TOOLCHAIN_PATH/bin/$$ANDROID_NDK_TOOLS_PREFIX-nm -P
-QMAKE_STRIP = $$NDK_TOOLCHAIN_PATH/bin/$$ANDROID_NDK_TOOLS_PREFIX-strip
-QMAKE_RANLIB = $$NDK_TOOLCHAIN_PATH/bin/$$ANDROID_NDK_TOOLS_PREFIX-ranlib
-
-QMAKE_INCDIR = $$ANDROID_PLATFORM_PATH/include $$ANDROID_SOURCES_CXX_STL_INCDIR
-QMAKE_LIBDIR = $$ANDROID_SOURCES_CXX_STL_LIBDIR $$ANDROID_PLATFORM_PATH/lib
-QMAKE_INCDIR_X11 =
-QMAKE_LIBDIR_X11 =
-QMAKE_INCDIR_OPENGL =
-QMAKE_INCDIR_OPENGL_ES2 =
-QMAKE_LIBDIR_OPENGL_ES2 =
-
-contains(ANDROID_TARGET_ARCH, x86): LIBGCC_PATH_FULL = $$system($$QMAKE_CC -print-libgcc-file-name)
- else: LIBGCC_PATH_FULL = $$system($$QMAKE_CC -mthumb-interwork -print-libgcc-file-name)
-
-QMAKE_LINK = $$QMAKE_CXX
-QMAKE_LINK_SHLIB = $$QMAKE_CXX
-QMAKE_LFLAGS = --sysroot=$$ANDROID_PLATFORM_ROOT_PATH -L$$dirname(LIBGCC_PATH_FULL) -Wl,-rpath-link=$$ANDROID_PLATFORM_PATH/lib
-QMAKE_LFLAGS_APP =
-QMAKE_LFLAGS_SHLIB = -Wl,--no-undefined -Wl,-z,noexecstack -shared
-
-contains(NDK_ROOT, ".*r[56].*") {
- !contains(ANDROID_PLATFORM, ".*android-[458].*") {
- message("Your NDK-version is out-dated. A work-around is enabled. Consider updating your NDK (workarounds are required until r6(a))")
- QMAKE_LFLAGS_SHLIB += $$ANDROID_PLATFORM_PATH/lib/crtbegin_so.o $$ANDROID_PLATFORM_PATH/lib/crtend_so.o
- }
-}
-
-QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
-QMAKE_LFLAGS_SONAME =
-QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined
-QMAKE_LFLAGS_RPATH = -Wl,-rpath=
-
-# TODO: -lgnustl_static was -lstdc++, but that leads to undefined reference to
-# std::__throw_bad_alloc during configure.
-QMAKE_LIBS = -lsupc++ -llog -lz -lm -ldl -lc -lgcc -lgnustl_static
-QMAKE_LIBS_X11 =
-QMAKE_LIBS_X11SM =
-QMAKE_LIBS_QT_THREAD =
-QMAKE_LIBS_QT_OPENGL =
-QMAKE_LIBS_QTOPIA =
-QMAKE_LIBS_THREAD =
-QMAKE_LIBS_OPENGL =
-QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $$QMAKE_LIBS
-
-load(qt_config)
-
diff --git a/mkspecs/features/mac/asset_catalogs.prf b/mkspecs/features/mac/asset_catalogs.prf
index 57d93d56d5..87875136c2 100644
--- a/mkspecs/features/mac/asset_catalogs.prf
+++ b/mkspecs/features/mac/asset_catalogs.prf
@@ -65,7 +65,7 @@
actool_output_files = $$system(\
mkdir -p $$system_quote($$QMAKE_ASSET_CATALOGS_BUILD_PATH) && \
/usr/libexec/PlistBuddy -c \'Print :com.apple.actool.compilation-results:output-files\' \
- /dev/stdin <<< $($${asset_catalog_compiler.commands} 2>/dev/null) | grep \'^ .*$\', lines)
+ /dev/stdin <<< $($${asset_catalog_compiler.commands} 2>/dev/null) | sed -Ene \'s/^ +//p\', lines)
for (output_file, actool_output_files) {
!equals(output_file, $$asset_catalog_compiler.target): \
diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index 4539058cbf..914505a362 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -1158,6 +1158,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) {
@@ -1536,7 +1551,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 39898567a7..fb9c4f354d 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -1425,8 +1425,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 0f3665eba8..a744804760 100644
--- a/qmake/generators/win32/msvc_objectmodel.h
+++ b/qmake/generators/win32/msvc_objectmodel.h
@@ -277,6 +277,10 @@ enum inlineExpansionOption {
expandAnySuitable,
expandDefault // Not useful number, but stops the output
};
+enum linkerDebugOption {
+ linkerDebugOptionNone,
+ linkerDebugOptionFastLink
+};
enum linkIncrementalType {
linkIncrementalDefault,
linkIncrementalNo,
@@ -590,6 +594,7 @@ public:
QStringList ForceSymbolReferences;
QString FunctionOrder;
triState GenerateDebugInformation;
+ linkerDebugOption DebugInfoOption;
triState GenerateMapFile;
qlonglong HeapCommitSize;
qlonglong HeapReserveSize;
diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp
index 9daa7ada10..02c910fe46 100644
--- a/qmake/library/qmakebuiltins.cpp
+++ b/qmake/library/qmakebuiltins.cpp
@@ -578,8 +578,7 @@ ProStringList QMakeEvaluator::evaluateBuiltinExpand(
int end = -1;
if (func_t == E_SECTION) {
if (args.count() != 3 && args.count() != 4) {
- evalError(fL1S("%1(var) section(var, sep, begin, end) requires"
- " three or four arguments.").arg(func.toQString(m_tmp1)));
+ evalError(fL1S("section(var, sep, begin, end) requires three or four arguments."));
} else {
var = args[0];
sep = args.at(1).toQString();
diff --git a/qmake/property.cpp b/qmake/property.cpp
index 9ee08f4b55..d17d62481a 100644
--- a/qmake/property.cpp
+++ b/qmake/property.cpp
@@ -41,38 +41,41 @@ static const struct {
const char *name;
QLibraryInfo::LibraryLocation loc;
bool raw;
+ bool singular;
} propList[] = {
- { "QT_SYSROOT", QLibraryInfo::SysrootPath, true },
- { "QT_INSTALL_PREFIX", QLibraryInfo::PrefixPath, false },
- { "QT_INSTALL_ARCHDATA", QLibraryInfo::ArchDataPath, false },
- { "QT_INSTALL_DATA", QLibraryInfo::DataPath, false },
- { "QT_INSTALL_DOCS", QLibraryInfo::DocumentationPath, false },
- { "QT_INSTALL_HEADERS", QLibraryInfo::HeadersPath, false },
- { "QT_INSTALL_LIBS", QLibraryInfo::LibrariesPath, false },
- { "QT_INSTALL_LIBEXECS", QLibraryInfo::LibraryExecutablesPath, false },
- { "QT_INSTALL_BINS", QLibraryInfo::BinariesPath, false },
- { "QT_INSTALL_TESTS", QLibraryInfo::TestsPath, false },
- { "QT_INSTALL_PLUGINS", QLibraryInfo::PluginsPath, false },
- { "QT_INSTALL_IMPORTS", QLibraryInfo::ImportsPath, false },
- { "QT_INSTALL_QML", QLibraryInfo::Qml2ImportsPath, false },
- { "QT_INSTALL_TRANSLATIONS", QLibraryInfo::TranslationsPath, false },
- { "QT_INSTALL_CONFIGURATION", QLibraryInfo::SettingsPath, false },
- { "QT_INSTALL_EXAMPLES", QLibraryInfo::ExamplesPath, false },
- { "QT_INSTALL_DEMOS", QLibraryInfo::ExamplesPath, false }, // Just backwards compat
- { "QT_HOST_PREFIX", QLibraryInfo::HostPrefixPath, true },
- { "QT_HOST_DATA", QLibraryInfo::HostDataPath, true },
- { "QT_HOST_BINS", QLibraryInfo::HostBinariesPath, true },
- { "QT_HOST_LIBS", QLibraryInfo::HostLibrariesPath, true },
- { "QMAKE_SPEC", QLibraryInfo::HostSpecPath, true },
- { "QMAKE_XSPEC", QLibraryInfo::TargetSpecPath, true },
+ { "QT_SYSROOT", QLibraryInfo::SysrootPath, true, true },
+ { "QT_INSTALL_PREFIX", QLibraryInfo::PrefixPath, false, false },
+ { "QT_INSTALL_ARCHDATA", QLibraryInfo::ArchDataPath, false, false },
+ { "QT_INSTALL_DATA", QLibraryInfo::DataPath, false, false },
+ { "QT_INSTALL_DOCS", QLibraryInfo::DocumentationPath, false, false },
+ { "QT_INSTALL_HEADERS", QLibraryInfo::HeadersPath, false, false },
+ { "QT_INSTALL_LIBS", QLibraryInfo::LibrariesPath, false, false },
+ { "QT_INSTALL_LIBEXECS", QLibraryInfo::LibraryExecutablesPath, false, false },
+ { "QT_INSTALL_BINS", QLibraryInfo::BinariesPath, false, false },
+ { "QT_INSTALL_TESTS", QLibraryInfo::TestsPath, false, false },
+ { "QT_INSTALL_PLUGINS", QLibraryInfo::PluginsPath, false, false },
+ { "QT_INSTALL_IMPORTS", QLibraryInfo::ImportsPath, false, false },
+ { "QT_INSTALL_QML", QLibraryInfo::Qml2ImportsPath, false, false },
+ { "QT_INSTALL_TRANSLATIONS", QLibraryInfo::TranslationsPath, false, false },
+ { "QT_INSTALL_CONFIGURATION", QLibraryInfo::SettingsPath, false, false },
+ { "QT_INSTALL_EXAMPLES", QLibraryInfo::ExamplesPath, false, false },
+ { "QT_INSTALL_DEMOS", QLibraryInfo::ExamplesPath, false, false }, // Just backwards compat
+ { "QT_HOST_PREFIX", QLibraryInfo::HostPrefixPath, true, false },
+ { "QT_HOST_DATA", QLibraryInfo::HostDataPath, true, false },
+ { "QT_HOST_BINS", QLibraryInfo::HostBinariesPath, true, false },
+ { "QT_HOST_LIBS", QLibraryInfo::HostLibrariesPath, true, false },
+ { "QMAKE_SPEC", QLibraryInfo::HostSpecPath, true, true },
+ { "QMAKE_XSPEC", QLibraryInfo::TargetSpecPath, true, true },
};
QMakeProperty::QMakeProperty() : settings(0)
{
for (unsigned i = 0; i < sizeof(propList)/sizeof(propList[0]); i++) {
QString name = QString::fromLatin1(propList[i].name);
- m_values[ProKey(name + "/src")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::EffectiveSourcePaths);
- m_values[ProKey(name + "/get")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::EffectivePaths);
+ if (!propList[i].singular) {
+ m_values[ProKey(name + "/src")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::EffectiveSourcePaths);
+ m_values[ProKey(name + "/get")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::EffectivePaths);
+ }
QString val = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::FinalPaths);
if (!propList[i].raw) {
m_values[ProKey(name + "/dev")] = QLibraryInfo::rawLocation(propList[i].loc, QLibraryInfo::DevicePaths);
diff --git a/src/corelib/json/qjson.cpp b/src/corelib/json/qjson.cpp
index e9a1366af0..d509349a51 100644
--- a/src/corelib/json/qjson.cpp
+++ b/src/corelib/json/qjson.cpp
@@ -135,10 +135,12 @@ bool Data::valid() const
return false;
bool res = false;
- if (header->root()->is_object)
- res = static_cast<Object *>(header->root())->isValid();
+ Base *root = header->root();
+ int maxSize = alloc - sizeof(Header);
+ if (root->is_object)
+ res = static_cast<Object *>(root)->isValid(maxSize);
else
- res = static_cast<Array *>(header->root())->isValid();
+ res = static_cast<Array *>(root)->isValid(maxSize);
return res;
}
@@ -223,9 +225,9 @@ int Object::indexOf(QLatin1String key, bool *exists) const
return min;
}
-bool Object::isValid() const
+bool Object::isValid(int maxSize) const
{
- if (tableOffset + length*sizeof(offset) > size)
+ if (size > (uint)maxSize || tableOffset + length*sizeof(offset) > size)
return false;
QString lastKey;
@@ -234,8 +236,7 @@ bool Object::isValid() const
if (entryOffset + sizeof(Entry) >= tableOffset)
return false;
Entry *e = entryAt(i);
- int s = e->size();
- if (table()[i] + s > tableOffset)
+ if (!e->isValid(tableOffset - table()[i]))
return false;
QString key = e->key();
if (key < lastKey)
@@ -249,9 +250,9 @@ bool Object::isValid() const
-bool Array::isValid() const
+bool Array::isValid(int maxSize) const
{
- if (tableOffset + length*sizeof(offset) > size)
+ if (size > (uint)maxSize || tableOffset + length*sizeof(offset) > size)
return false;
for (uint i = 0; i < length; ++i) {
@@ -359,12 +360,12 @@ bool Value::isValid(const Base *b) const
int s = usedStorage(b);
if (!s)
return true;
- if (s < 0 || offset + s > (int)b->tableOffset)
+ if (s < 0 || s > (int)b->tableOffset - offset)
return false;
if (type == QJsonValue::Array)
- return static_cast<Array *>(base(b))->isValid();
+ return static_cast<Array *>(base(b))->isValid(s);
if (type == QJsonValue::Object)
- return static_cast<Object *>(base(b))->isValid();
+ return static_cast<Object *>(base(b))->isValid(s);
return true;
}
diff --git a/src/corelib/json/qjson_p.h b/src/corelib/json/qjson_p.h
index 4be62172a2..0c78fadfc7 100644
--- a/src/corelib/json/qjson_p.h
+++ b/src/corelib/json/qjson_p.h
@@ -326,12 +326,19 @@ public:
explicit String(const char *data) { d = (Data *)data; }
struct Data {
- qle_int length;
+ qle_uint length;
qle_ushort utf16[1];
};
Data *d;
+ int byteSize() const { return sizeof(uint) + sizeof(ushort) * d->length; }
+ bool isValid(int maxSize) const {
+ // Check byteSize() <= maxSize, avoiding integer overflow
+ maxSize -= sizeof(uint);
+ return maxSize >= 0 && uint(d->length) <= maxSize / sizeof(ushort);
+ }
+
inline String &operator=(const QString &str)
{
d->length = str.length();
@@ -400,11 +407,16 @@ public:
explicit Latin1String(const char *data) { d = (Data *)data; }
struct Data {
- qle_short length;
+ qle_ushort length;
char latin1[1];
};
Data *d;
+ int byteSize() const { return sizeof(ushort) + sizeof(char)*(d->length); }
+ bool isValid(int maxSize) const {
+ return byteSize() <= maxSize;
+ }
+
inline Latin1String &operator=(const QString &str)
{
int len = d->length = str.length();
@@ -606,7 +618,7 @@ public:
int indexOf(const QString &key, bool *exists) const;
int indexOf(QLatin1String key, bool *exists) const;
- bool isValid() const;
+ bool isValid(int maxSize) const;
};
@@ -616,7 +628,7 @@ public:
inline Value at(int i) const;
inline Value &operator [](int i);
- bool isValid() const;
+ bool isValid(int maxSize) const;
};
@@ -671,12 +683,12 @@ public:
// key
// value data follows key
- int size() const {
+ uint size() const {
int s = sizeof(Entry);
if (value.latinKey)
- s += sizeof(ushort) + qFromLittleEndian(*(ushort *) ((const char *)this + sizeof(Entry)));
+ s += shallowLatin1Key().byteSize();
else
- s += sizeof(uint) + sizeof(ushort)*qFromLittleEndian(*(int *) ((const char *)this + sizeof(Entry)));
+ s += shallowKey().byteSize();
return alignedSize(s);
}
@@ -702,6 +714,15 @@ public:
return shallowKey().toString();
}
+ bool isValid(int maxSize) const {
+ if (maxSize < (int)sizeof(Entry))
+ return false;
+ maxSize -= sizeof(Entry);
+ if (value.latinKey)
+ return shallowLatin1Key().isValid(maxSize);
+ return shallowKey().isValid(maxSize);
+ }
+
bool operator ==(const QString &key) const;
inline bool operator !=(const QString &key) const { return !operator ==(key); }
inline bool operator >=(const QString &key) const;
@@ -714,8 +735,6 @@ public:
bool operator >=(const Entry &other) const;
};
-inline bool operator!=(const Entry &lhs, const Entry &rhs) { return !(lhs == rhs); }
-
inline bool Entry::operator >=(const QString &key) const
{
if (value.latinKey)
diff --git a/src/corelib/json/qjsonobject.cpp b/src/corelib/json/qjsonobject.cpp
index fb651f0f24..b5b6f36bc6 100644
--- a/src/corelib/json/qjsonobject.cpp
+++ b/src/corelib/json/qjsonobject.cpp
@@ -599,8 +599,8 @@ bool QJsonObject::operator==(const QJsonObject &other) const
for (uint i = 0; i < o->length; ++i) {
QJsonPrivate::Entry *e = o->entryAt(i);
- QJsonPrivate::Entry *oe = other.o->entryAt(i);
- if (*e != *oe || QJsonValue(d, o, e->value) != QJsonValue(other.d, other.o, oe->value))
+ QJsonValue v(d, o, e->value);
+ if (other.value(e->key()) != v)
return false;
}
diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp
index 3b2321aa49..ff397fc750 100644
--- a/src/corelib/kernel/qeventdispatcher_winrt.cpp
+++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp
@@ -42,6 +42,7 @@
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include <QtCore/QHash>
+#include <QtCore/QMutex>
#include <QtCore/qfunctions_winrt.h>
#include <private/qabstracteventdispatcher_p.h>
#include <private/qcoreapplication_p.h>
@@ -151,6 +152,7 @@ public:
private:
QHash<int, QObject *> timerIdToObject;
QVector<WinRTTimerInfo> timerInfos;
+ mutable QMutex timerInfoLock;
QHash<HANDLE, int> timerHandleToId;
QHash<int, HANDLE> timerIdToHandle;
QHash<int, HANDLE> timerIdToCancelHandle;
@@ -167,6 +169,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;
@@ -175,6 +178,7 @@ private:
bool removeTimer(int id)
{
+ QMutexLocker locker(&timerInfoLock);
if (id >= timerInfos.size())
return false;
@@ -312,14 +316,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();
@@ -487,6 +495,7 @@ QList<QAbstractEventDispatcher::TimerInfo> QEventDispatcherWinRT::registeredTime
}
Q_D(const QEventDispatcherWinRT);
+ QMutexLocker locker(&d->timerInfoLock);
QList<TimerInfo> timerInfos;
for (const WinRTTimerInfo &info : d->timerInfos) {
if (info.object == object && info.timerId != INVALID_TIMER_ID)
@@ -518,6 +527,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
@@ -566,6 +576,9 @@ bool QEventDispatcherWinRT::event(QEvent *e)
case QEvent::Timer: {
QTimerEvent *timerEvent = static_cast<QTimerEvent *>(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);
@@ -574,17 +587,17 @@ 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;
- info = d->timerInfos[id];
- 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));
diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp
index 1ffaeca852..af35193b13 100644
--- a/src/corelib/xml/qxmlstream.cpp
+++ b/src/corelib/xml/qxmlstream.cpp
@@ -886,7 +886,7 @@ inline void QXmlStreamReaderPrivate::reallocateStack()
sym_stack = reinterpret_cast<Value*> (realloc(sym_stack, stack_size * sizeof(Value)));
Q_CHECK_PTR(sym_stack);
state_stack = reinterpret_cast<int*> (realloc(state_stack, stack_size * sizeof(int)));
- Q_CHECK_PTR(sym_stack);
+ Q_CHECK_PTR(state_stack);
}
diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp
index 17d77a07b5..324f13a17b 100644
--- a/src/gui/image/qiconloader.cpp
+++ b/src/gui/image/qiconloader.cpp
@@ -378,8 +378,6 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName,
QThemeIconInfo info;
Q_ASSERT(!themeName.isEmpty());
- QPixmap pixmap;
-
// Used to protect against potential recursions
visited << themeName;
diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp
index 1085b546a7..085652879c 100644
--- a/src/gui/kernel/qhighdpiscaling.cpp
+++ b/src/gui/kernel/qhighdpiscaling.cpp
@@ -343,8 +343,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
diff --git a/src/gui/kernel/qopenglcontext_p.h b/src/gui/kernel/qopenglcontext_p.h
index 57f70356b8..64bf55beee 100644
--- a/src/gui/kernel/qopenglcontext_p.h
+++ b/src/gui/kernel/qopenglcontext_p.h
@@ -266,7 +266,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/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index edb65a2d4c..94a34b5c27 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -2505,6 +2505,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/gui/opengl/qopengl.h b/src/gui/opengl/qopengl.h
index c7a3e79666..cd44ddfe4d 100644
--- a/src/gui/opengl/qopengl.h
+++ b/src/gui/opengl/qopengl.h
@@ -95,8 +95,11 @@ typedef void* GLeglImageOES;
// applications cannot target ES 3. Therefore QOpenGLFunctions and
// friends do everything dynamically and never rely on these macros.
+// Some Khronos headers use the ext proto guard in the standard headers as well,
+// which is bad. Work it around, but avoid spilling over to the ext header.
# ifndef GL_GLEXT_PROTOTYPES
# define GL_GLEXT_PROTOTYPES
+# define QGL_TEMP_GLEXT_PROTO
# endif
# if defined(QT_OPENGL_ES_3_1)
@@ -107,6 +110,11 @@ typedef void* GLeglImageOES;
# include <GLES2/gl2.h>
#endif
+# ifdef QGL_TEMP_GLEXT_PROTO
+# undef GL_GLEXT_PROTOTYPES
+# undef QGL_TEMP_GLEXT_PROTO
+# endif
+
/*
Some GLES2 implementations (like the one on Harmattan) are missing the
typedef for GLchar. Work around it here by adding it. The Kkronos headers
@@ -125,7 +133,15 @@ typedef char GLchar;
# include <OpenGL/glext.h>
# else
# define GL_GLEXT_LEGACY // Prevents GL/gl.h from #including system glext.h
-# include <GL/gl.h>
+// Some Khronos headers use the ext proto guard in the standard headers as well,
+// which is bad. Work it around, but avoid spilling over to the ext header.
+# ifndef GL_GLEXT_PROTOTYPES
+# define GL_GLEXT_PROTOTYPES
+# include <GL/gl.h>
+# undef GL_GLEXT_PROTOTYPES
+# else
+# include <GL/gl.h>
+# endif
# include <QtGui/qopenglext.h>
# endif // Q_OS_MAC
#endif // QT_OPENGL_ES_2
diff --git a/src/gui/opengl/qopenglframebufferobject.cpp b/src/gui/opengl/qopenglframebufferobject.cpp
index 4833617377..cedbe19191 100644
--- a/src/gui/opengl/qopenglframebufferobject.cpp
+++ b/src/gui/opengl/qopenglframebufferobject.cpp
@@ -950,6 +950,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;
+ }
}
/*!
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp
index 07aec6f019..0d05fee6ef 100644
--- a/src/gui/text/qtextdocument.cpp
+++ b/src/gui/text/qtextdocument.cpp
@@ -1766,6 +1766,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.
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index 28a5eb6a89..540bbf5d54 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -1905,11 +1905,15 @@ void QTextLine::layout_helper(int maxGlyphs)
++lbh.glyphCount;
if (lbh.checkFullOtherwiseExtend(line))
goto found;
- } else if (attributes[lbh.currentPosition].whiteSpace) {
+ } else if (attributes[lbh.currentPosition].whiteSpace
+ && eng->layoutData->string.at(lbh.currentPosition).decompositionTag() != QChar::NoBreak) {
lbh.whiteSpaceOrObject = true;
- while (lbh.currentPosition < end && attributes[lbh.currentPosition].whiteSpace)
+ while (lbh.currentPosition < end
+ && attributes[lbh.currentPosition].whiteSpace
+ && eng->layoutData->string.at(lbh.currentPosition).decompositionTag() != QChar::NoBreak) {
addNextCluster(lbh.currentPosition, end, lbh.spaceData, lbh.glyphCount,
current, lbh.logClusters, lbh.glyphs);
+ }
if (!lbh.manualWrap && lbh.spaceData.textWidth > line.width) {
lbh.spaceData.textWidth = line.width; // ignore spaces that fall out of the line.
diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp
index d547f829f8..3daca38959 100644
--- a/src/network/socket/qnativesocketengine_winrt.cpp
+++ b/src/network/socket/qnativesocketengine_winrt.cpp
@@ -662,10 +662,10 @@ qint64 QNativeSocketEngine::read(char *data, qint64 maxlen)
if (d->socketType != QAbstractSocket::TcpSocket)
return -1;
- QMutexLocker mutexLocker(&d->readMutex);
// 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;
diff --git a/src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc b/src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc
index 241dff05da..f0ef5ee2a7 100644
--- a/src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc
+++ b/src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc
@@ -86,6 +86,35 @@
*/
/*!
+ \typedef QXcbWindowFunctions::SetWmWindowRole
+ \since 5.6.2
+
+ This is the typedef for the function returned by
+ QGuiApplication::platformFunction when passed the
+ value returned by setWmWindowRoleIdentifier().
+*/
+
+/*!
+ \fn QByteArray QXcbWindowFunctions::setWmWindowRoleIdentifier()
+ \since 5.6.2
+
+ This function returns the byte array that can be used to query
+ QGuiApplication::platformFunction to retrieve the SetWmWindowRole function.
+*/
+
+/*!
+ \fn void QXcbWindowFunctions::setWmWindowRole(QWindow *window, const QByteArray &role)
+ \since 5.6.2
+
+ Sets the WM_WINDOW_ROLE property from \role on the corresponding
+ X11 window.
+
+ This is a convenience function that can be used directly instead
+ of resolving the function pointer. \a window and \a role will be
+ relayed to the function retrieved by QGuiApplication.
+*/
+
+/*!
\typedef QXcbWindowFunctions::SetWmWindowIconText
This is the typedef for the function returned by
diff --git a/src/platformsupport/eglconvenience/qt_egl_p.h b/src/platformsupport/eglconvenience/qt_egl_p.h
index 615ee4b80a..b1495c9f9d 100644
--- a/src/platformsupport/eglconvenience/qt_egl_p.h
+++ b/src/platformsupport/eglconvenience/qt_egl_p.h
@@ -83,7 +83,7 @@ struct QtEglConverter<uint32_t, uintptr_t>
{ return v; }
};
-#if Q_PROCESSOR_WORDSIZE > 4
+#if QT_POINTER_SIZE > 4
template <>
struct QtEglConverter<uintptr_t, uint32_t>
{
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index d92b87c6da..65bc494e91 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -117,7 +117,7 @@ static inline int stretchFromFcWidth(int fcwidth)
return qtstretch;
}
-static const char *specialLanguages[] = {
+static const char specialLanguages[][6] = {
"", // Unknown
"", // Inherited
"", // Common
@@ -251,12 +251,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
@@ -286,25 +286,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
@@ -317,20 +317,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);
@@ -436,7 +436,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<const char *>(cap), capabilityForWritingSystem[j]) == 0)
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
index 3a5a0c8e78..7f81e313cb 100644
--- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
@@ -45,6 +45,7 @@
#include "qcocoacolordialoghelper.h"
#include "qcocoahelpers.h"
+#include "qcocoaeventdispatcher.h"
#import <AppKit/AppKit.h>
@@ -322,6 +323,10 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSColorPanelDelegate);
// cleanup of modal sessions. Do this before showing the native dialog, otherwise it will
// close down during the cleanup.
qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
+
+ // Make sure we don't interrupt the runModalForWindow call.
+ QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag();
+
[NSApp runModalForWindow:mColorPanel];
mDialogIsExecuting = false;
return (mResultCode == NSOKButton);
diff --git a/src/plugins/platforms/cocoa/qcocoacursor.mm b/src/plugins/platforms/cocoa/qcocoacursor.mm
index 8e523dfbbf..3df2a7c962 100644
--- a/src/plugins/platforms/cocoa/qcocoacursor.mm
+++ b/src/plugins/platforms/cocoa/qcocoacursor.mm
@@ -62,7 +62,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<QCocoaWindow *>(platformWindow)->setWindowCursor(cocoaCursor);
@@ -84,9 +84,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/qcocoaeventdispatcher.h b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
index 84880d51c5..70887c41c9 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
@@ -131,6 +131,8 @@ public:
void interrupt();
void flush();
+ static void clearCurrentThreadCocoaEventDispatcherInterruptFlag();
+
friend void qt_mac_maybeCancelWaitForMoreEventsForwarder(QAbstractEventDispatcher *eventDispatcher);
};
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index b2b9fe2c1e..72c7856c2d 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -965,6 +965,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<QCocoaEventDispatcher *>(QThread::currentThread()->eventDispatcher());
+ if (!cocoaEventDispatcher)
+ return;
+ QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate =
+ static_cast<QCocoaEventDispatcherPrivate *>(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 ef102990b4..234da57f59 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
@@ -53,6 +53,7 @@
#include "qt_mac_p.h"
#include "qcocoahelpers.h"
#include "qcocoamenubar.h"
+#include "qcocoaeventdispatcher.h"
#include <qregexp.h>
#include <qbuffer.h>
#include <qdebug.h>
@@ -250,6 +251,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 0be931b54f..791839d6ea 100644
--- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
@@ -49,6 +49,7 @@
#include "qcocoafontdialoghelper.h"
#include "qcocoahelpers.h"
+#include "qcocoaeventdispatcher.h"
#import <AppKit/AppKit.h>
@@ -319,6 +320,10 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
// cleanup of modal sessions. Do this before showing the native dialog, otherwise it will
// close down during the cleanup.
qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
+
+ // Make sure we don't interrupt the runModalForWindow call.
+ QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag();
+
[NSApp runModalForWindow:mFontPanel];
mDialogIsExecuting = false;
return (mResultCode == NSOKButton);
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
index 477165607c..26fbe3e4bc 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
@@ -100,6 +100,8 @@ private:
*/
Q_INVOKABLE QPixmap defaultBackgroundPixmapForQWizard();
+ Q_INVOKABLE void clearCurrentThreadCocoaEventDispatcherInterruptFlag();
+
// QMacPastebardMime support. The mac pasteboard void pointers are
// QMacPastebardMime instances from the cocoa plugin or qtmacextras
// These two classes are kept in sync and can be casted between.
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
index 10435d0b1d..972230349b 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
@@ -44,6 +44,7 @@
#include "qcocoahelpers.h"
#include "qcocoaapplication.h"
#include "qcocoaintegration.h"
+#include "qcocoaeventdispatcher.h"
#include <qbytearray.h>
#include <qwindow.h>
@@ -194,6 +195,11 @@ QPixmap QCocoaNativeInterface::defaultBackgroundPixmapForQWizard()
return QPixmap();
}
+void QCocoaNativeInterface::clearCurrentThreadCocoaEventDispatcherInterruptFlag()
+{
+ QCocoaEventDispatcher::clearCurrentThreadCocoaEventDispatcherInterruptFlag();
+}
+
void QCocoaNativeInterface::onAppFocusWindowChanged(QWindow *window)
{
Q_UNUSED(window);
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 2e9de03dfc..16639fd8b1 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -216,6 +216,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 e377d8f83d..602da0a175 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -1638,31 +1638,53 @@ QCocoaMenuBar *QCocoaWindow::menubar() const
return m_menubar;
}
-void QCocoaWindow::setWindowCursor(NSCursor *cursor)
+// 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
{
- // 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];
- }
- // 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 && window()->type() != Qt::ForeignWindow) {
- [m_nsWindow invalidateCursorRectsForView:m_view];
+ if (m_windowCursor)
+ return m_windowCursor;
+ if (!QPlatformWindow::parent())
+ return nil;
+ return static_cast<QCocoaWindow *>(QPlatformWindow::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 {
- if (m_windowUnderMouse)
- [cursor set];
+ // 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)
+{
+ if (m_windowCursor == cursor)
+ return;
+
+ // Setting a cursor in a foregin view is not supported.
+ if (window()->type() == Qt::ForeignWindow)
+ 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)
{
m_registerTouchCount += enable ? 1 : -1;
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index abaff39e81..f226547b90 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -129,7 +129,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 6181997923..a63bc4d570 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -121,7 +121,7 @@ static bool _q_dontOverrideCtrlLMB = false;
- (void)cursorUpdate:(NSEvent *)theEvent
{
- [view cursorUpdateImpl:theEvent];
+ [self cursorUpdate:theEvent];
}
@end
@@ -1053,21 +1053,10 @@ static bool _q_dontOverrideCtrlLMB = false;
[self addTrackingArea:m_trackingArea];
}
--(void)cursorUpdateImpl:(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
+- (void)cursorUpdate:(NSEvent *)theEvent
{
- // 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
@@ -1891,9 +1880,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
- (NSRange) selectedRange
{
- NSRange selectedRange = {NSNotFound, 0};
- selectedRange.location = NSNotFound;
- selectedRange.length = 0;
+ NSRange selectedRange = {0, 0};
QObject *fo = QGuiApplication::focusObject();
if (!fo)
diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp
index 733f0bd139..7c88c73cc2 100644
--- a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp
+++ b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp
@@ -418,15 +418,17 @@ void QEglFSIntegration::createInputHandlers()
}
#endif
-#if QT_CONFIG(evdev)
- m_kbdMgr = new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString() /* spec */, this);
- new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString() /* spec */, this);
+ bool useTslib = false;
#if QT_CONFIG(tslib)
- const bool useTslib = qEnvironmentVariableIntValue("QT_QPA_EGLFS_TSLIB");
+ useTslib = qEnvironmentVariableIntValue("QT_QPA_EGLFS_TSLIB");
if (useTslib)
new QTsLibMouseHandler(QLatin1String("TsLib"), QString() /* spec */);
- else
#endif
+
+#if QT_CONFIG(evdev)
+ m_kbdMgr = new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString() /* spec */, this);
+ new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString() /* spec */, this);
+ if (!useTslib)
new QEvdevTouchManager(QLatin1String("EvdevTouch"), QString() /* spec */, this);
#endif
}
diff --git a/src/plugins/platforms/ios/qiostextresponder.mm b/src/plugins/platforms/ios/qiostextresponder.mm
index e8d216fbc2..eab6792266 100644
--- a/src/plugins/platforms/ios/qiostextresponder.mm
+++ b/src/plugins/platforms/ios/qiostextresponder.mm
@@ -628,7 +628,7 @@
- (id<UITextInputTokenizer>)tokenizer
{
- return [[[UITextInputStringTokenizer alloc] initWithTextInput:id<UITextInput>(self)] autorelease];
+ return [[[UITextInputStringTokenizer alloc] initWithTextInput:self] autorelease];
}
- (UITextPosition *)beginningOfDocument
diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp
index 893205177d..c1c235588e 100644
--- a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp
+++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp
@@ -147,15 +147,17 @@ void QLinuxFbIntegration::createInputHandlers()
}
#endif
-#if QT_CONFIG(evdev) && !defined(Q_OS_ANDROID)
- new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this);
- new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this);
+ bool useTslib = false;
#if QT_CONFIG(tslib)
- const bool useTslib = qEnvironmentVariableIntValue("QT_QPA_FB_TSLIB");
+ useTslib = qEnvironmentVariableIntValue("QT_QPA_FB_TSLIB");
if (useTslib)
new QTsLibMouseHandler(QLatin1String("TsLib"), QString());
- else
#endif
+
+#if QT_CONFIG(evdev) && !defined(Q_OS_ANDROID)
+ new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this);
+ new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this);
+ if (!useTslib)
new QEvdevTouchManager(QLatin1String("EvdevTouch"), QString() /* spec */, this);
#endif
}
diff --git a/src/plugins/platforms/winrt/qwinrtbackingstore.h b/src/plugins/platforms/winrt/qwinrtbackingstore.h
index ce99718548..41b27debcc 100644
--- a/src/plugins/platforms/winrt/qwinrtbackingstore.h
+++ b/src/plugins/platforms/winrt/qwinrtbackingstore.h
@@ -40,6 +40,7 @@
#ifndef QWINRTBACKINGSTORE_H
#define QWINRTBACKINGSTORE_H
+#define GL_GLEXT_PROTOTYPES
#include <qpa/qplatformbackingstore.h>
#include <QtCore/QScopedPointer>
#include <QtCore/QLoggingCategory>
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
index dc720c090f..1f36a1ad2a 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
@@ -678,8 +678,11 @@ void QGLXContext::queryDummyContext()
}
QOpenGLContext context;
- context.create();
- context.makeCurrent(surface.data());
+ if (!context.create() || !context.makeCurrent(surface.data())) {
+ qWarning("QGLXContext: Failed to create dummy context");
+ m_supportsThreading = false;
+ return;
+ }
m_supportsThreading = true;
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
index f9c32cd0a4..38e91cc9f6 100644
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
@@ -729,8 +729,10 @@ void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_eve
if (mode > QClipboard::Selection)
return;
- // here we care only about the xfixes events that come from non Qt processes
- if (event->owner != XCB_NONE && event->owner != owner()) {
+ // Note1: Here we care only about the xfixes events that come from other processes.
+ // Note2: If the QClipboard::clear() is issued, event->owner is XCB_NONE,
+ // so we check selection_timestamp to not handle our own QClipboard::clear().
+ if (event->owner != owner() && event->selection_timestamp > m_timestamp[mode]) {
if (!m_xClipboard[mode]) {
m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
} else {
diff --git a/src/printsupport/dialogs/qpagesetupdialog_mac.mm b/src/printsupport/dialogs/qpagesetupdialog_mac.mm
index e3e7523a16..c29b911e35 100644
--- a/src/printsupport/dialogs/qpagesetupdialog_mac.mm
+++ b/src/printsupport/dialogs/qpagesetupdialog_mac.mm
@@ -133,6 +133,11 @@ void QMacPageSetupDialogPrivate::openCocoaPageLayout(Qt::WindowModality modality
QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) alloc] initWithNSPrintInfo:printInfo];
if (modality == Qt::ApplicationModal) {
+
+ // Make sure we don't interrupt the runModalWithPrintInfo call.
+ (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
+ "clearCurrentThreadCocoaEventDispatcherInterruptFlag");
+
int rval = [pageLayout runModalWithPrintInfo:printInfo];
[delegate pageLayoutDidEnd:pageLayout returnCode:rval contextInfo:q];
} else {
diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm
index c16bb93013..c630ab634a 100644
--- a/src/printsupport/dialogs/qprintdialog_mac.mm
+++ b/src/printsupport/dialogs/qprintdialog_mac.mm
@@ -245,6 +245,11 @@ void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality)
if (modality == Qt::ApplicationModal || !q->parentWidget()) {
if (modality == Qt::NonModal)
qWarning("QPrintDialog is required to be modal on OS X");
+
+ // Make sure we don't interrupt the runModalWithPrintInfo call.
+ (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
+ "clearCurrentThreadCocoaEventDispatcherInterruptFlag");
+
int rval = [printPanel runModalWithPrintInfo:printInfo];
[delegate printPanelDidEnd:printPanel returnCode:rval contextInfo:q];
} else {
diff --git a/src/widgets/doc/snippets/code/src_gui_kernel_qwidget.cpp b/src/widgets/doc/snippets/code/src_gui_kernel_qwidget.cpp
index 18f8f2df8c..f2db73226b 100644
--- a/src/widgets/doc/snippets/code/src_gui_kernel_qwidget.cpp
+++ b/src/widgets/doc/snippets/code/src_gui_kernel_qwidget.cpp
@@ -137,11 +137,3 @@ setUpdatesEnabled(false);
bigVisualChanges();
setUpdatesEnabled(true);
//! [13]
-
-
-//! [14]
-...
-extern void qt_x11_set_global_double_buffer(bool);
-qt_x11_set_global_double_buffer(false);
-...
-//! [14]
diff --git a/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp b/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp
index b884e93290..203cc8007c 100644
--- a/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp
+++ b/src/widgets/graphicsview/qgraphicsscenebsptreeindex.cpp
@@ -694,8 +694,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<QTimerEvent *>(event)->timerId() == d->indexTimerId) {
if (d->restartIndexTimer) {
d->restartIndexTimer = false;
@@ -704,11 +703,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
diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp
index d153915ae6..2adc58e4a4 100644
--- a/src/widgets/graphicsview/qgraphicswidget.cpp
+++ b/src/widgets/graphicsview/qgraphicswidget.cpp
@@ -1456,6 +1456,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:
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 8ca79bbb3c..ace50f13ee 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -9625,11 +9625,6 @@ void QWidget::leaveEvent(QEvent *)
Since Qt 4.0, QWidget automatically double-buffers its painting, so there
is no need to write double-buffering code in paintEvent() to avoid flicker.
- \b{Note for the X11 platform}: It is possible to toggle global double
- buffering by calling \c qt_x11_set_global_double_buffer(). For example,
-
- \snippet code/src_gui_kernel_qwidget.cpp 14
-
\note Generally, you should refrain from calling update() or repaint()
\b{inside} a paintEvent(). For example, calling update() or repaint() on
children inside a paintevent() results in undefined behavior; the child may
diff --git a/src/widgets/styles/qstylehelper.cpp b/src/widgets/styles/qstylehelper.cpp
index 583385ee8a..602421725f 100644
--- a/src/widgets/styles/qstylehelper.cpp
+++ b/src/widgets/styles/qstylehelper.cpp
@@ -49,6 +49,8 @@
#include "qstylehelper_p.h"
#include <qstringbuilder.h>
+#include <qdatastream.h>
+#include <qcryptographichash.h>
QT_BEGIN_NAMESPACE
@@ -62,7 +64,6 @@ QString uniqueName(const QString &key, const QStyleOption *option, const QSize &
QString tmp = key % HexString<uint>(option->state)
% HexString<uint>(option->direction)
% HexString<uint>(complexOption ? uint(complexOption->activeSubControls) : 0u)
- % HexString<quint64>(option->palette.cacheKey())
% HexString<uint>(size.width())
% HexString<uint>(size.height());
@@ -73,6 +74,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;
}
diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp
index 76713d9880..fa0cff45c9 100644
--- a/src/widgets/widgets/qlabel.cpp
+++ b/src/widgets/widgets/qlabel.cpp
@@ -583,6 +583,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/sync.profile b/sync.profile
index 2f6c5399d4..ef2779ae48 100644
--- a/sync.profile
+++ b/sync.profile
@@ -80,11 +80,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 = ( "qt_windows.h", @zlib_headers, @angle_headers);
%inject_headers = ( "$basedir/src/corelib/global" => [ "qconfig.h", "qconfig_p.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 = (
-);
diff --git a/tests/auto/corelib/json/invalidBinaryData/10.bjson b/tests/auto/corelib/json/invalidBinaryData/10.bjson
new file mode 100644
index 0000000000..12b29b7aa5
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/10.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/11.bjson b/tests/auto/corelib/json/invalidBinaryData/11.bjson
new file mode 100644
index 0000000000..cf2b612111
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/11.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/12.bjson b/tests/auto/corelib/json/invalidBinaryData/12.bjson
new file mode 100644
index 0000000000..9c2403350e
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/12.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/13.bjson b/tests/auto/corelib/json/invalidBinaryData/13.bjson
new file mode 100644
index 0000000000..db6308b1fd
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/13.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/14.bjson b/tests/auto/corelib/json/invalidBinaryData/14.bjson
new file mode 100644
index 0000000000..347da4572c
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/14.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/15.bjson b/tests/auto/corelib/json/invalidBinaryData/15.bjson
new file mode 100644
index 0000000000..c6c5558934
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/15.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/16.bjson b/tests/auto/corelib/json/invalidBinaryData/16.bjson
new file mode 100644
index 0000000000..ae8b57446d
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/16.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/17.bjson b/tests/auto/corelib/json/invalidBinaryData/17.bjson
new file mode 100644
index 0000000000..32f0cc0e23
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/17.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/18.bjson b/tests/auto/corelib/json/invalidBinaryData/18.bjson
new file mode 100644
index 0000000000..50c89169eb
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/18.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/19.bjson b/tests/auto/corelib/json/invalidBinaryData/19.bjson
new file mode 100644
index 0000000000..b922212f45
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/19.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/20.bjson b/tests/auto/corelib/json/invalidBinaryData/20.bjson
new file mode 100644
index 0000000000..c965a0d294
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/20.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/21.bjson b/tests/auto/corelib/json/invalidBinaryData/21.bjson
new file mode 100644
index 0000000000..98165ee40c
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/21.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/22.bjson b/tests/auto/corelib/json/invalidBinaryData/22.bjson
new file mode 100644
index 0000000000..151f773a81
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/22.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/23.bjson b/tests/auto/corelib/json/invalidBinaryData/23.bjson
new file mode 100644
index 0000000000..6eb5269470
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/23.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/24.bjson b/tests/auto/corelib/json/invalidBinaryData/24.bjson
new file mode 100644
index 0000000000..c55a2a3e3b
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/24.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/25.bjson b/tests/auto/corelib/json/invalidBinaryData/25.bjson
new file mode 100644
index 0000000000..6c619f2ae1
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/25.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/26.bjson b/tests/auto/corelib/json/invalidBinaryData/26.bjson
new file mode 100644
index 0000000000..3bf303215a
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/26.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/27.bjson b/tests/auto/corelib/json/invalidBinaryData/27.bjson
new file mode 100644
index 0000000000..d2656c2287
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/27.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/28.bjson b/tests/auto/corelib/json/invalidBinaryData/28.bjson
new file mode 100644
index 0000000000..6797cf8c40
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/28.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/29.bjson b/tests/auto/corelib/json/invalidBinaryData/29.bjson
new file mode 100644
index 0000000000..0645dfc3b2
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/29.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/30.bjson b/tests/auto/corelib/json/invalidBinaryData/30.bjson
new file mode 100644
index 0000000000..f77fe1efd0
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/30.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/31.bjson b/tests/auto/corelib/json/invalidBinaryData/31.bjson
new file mode 100644
index 0000000000..d9840b6582
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/31.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/32.bjson b/tests/auto/corelib/json/invalidBinaryData/32.bjson
new file mode 100644
index 0000000000..1de4cb829f
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/32.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/33.bjson b/tests/auto/corelib/json/invalidBinaryData/33.bjson
new file mode 100644
index 0000000000..532a31dc08
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/33.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/34.bjson b/tests/auto/corelib/json/invalidBinaryData/34.bjson
new file mode 100644
index 0000000000..f498558eff
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/34.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/35.bjson b/tests/auto/corelib/json/invalidBinaryData/35.bjson
new file mode 100644
index 0000000000..8701210755
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/35.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/36.bjson b/tests/auto/corelib/json/invalidBinaryData/36.bjson
new file mode 100644
index 0000000000..ef5864e911
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/36.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/invalidBinaryData/37.bjson b/tests/auto/corelib/json/invalidBinaryData/37.bjson
new file mode 100644
index 0000000000..f4dd4ae12f
--- /dev/null
+++ b/tests/auto/corelib/json/invalidBinaryData/37.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index 4a6584a0f6..6aa5165e24 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -93,6 +93,7 @@ private Q_SLOTS:
void fromBinary();
void toAndFromBinary_data();
void toAndFromBinary();
+ void invalidBinaryData();
void parseNumbers();
void parseStrings();
void parseDuplicateKeys();
@@ -1770,6 +1771,21 @@ void tst_QtJson::toAndFromBinary()
QCOMPARE(doc, outdoc);
}
+void tst_QtJson::invalidBinaryData()
+{
+ QDir dir(testDataDir + "/invalidBinaryData");
+ QFileInfoList files = dir.entryInfoList();
+ for (int i = 0; i < files.size(); ++i) {
+ if (!files.at(i).isFile())
+ continue;
+ QFile file(files.at(i).filePath());
+ file.open(QIODevice::ReadOnly);
+ QByteArray bytes = file.readAll();
+ QJsonDocument document = QJsonDocument::fromRawData(bytes.constData(), bytes.size());
+ QVERIFY(document.isNull());
+ }
+}
+
void tst_QtJson::parseNumbers()
{
{
diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
index 895f68bbd7..ad7de09c48 100644
--- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
@@ -162,6 +162,7 @@ private:
const QString m_prefix;
const QString m_convertFromImage;
const QString m_loadFromData;
+ const QTemporaryDir m_tempDir;
};
static bool lenientCompare(const QPixmap &actual, const QPixmap &expected)
@@ -209,11 +210,11 @@ void tst_QPixmap::initTestCase()
QVERIFY(!m_prefix.isEmpty());
QVERIFY(!m_convertFromImage.isEmpty());
QVERIFY(!m_loadFromData.isEmpty());
+ QVERIFY2(m_tempDir.isValid(), qPrintable(m_tempDir.errorString()));
}
void tst_QPixmap::cleanupTestCase()
{
- QFile::remove(QLatin1String("temp_image.png"));
}
void tst_QPixmap::swap()
@@ -1442,18 +1443,18 @@ void tst_QPixmap::preserveDepth()
void tst_QPixmap::loadAsBitmapOrPixmap()
{
QImage tmp(10, 10, QImage::Format_RGB32);
- tmp.save("temp_image.png");
+ tmp.save(m_tempDir.path() + "/temp_image.png");
bool ok;
// Check that we can load the pixmap as a pixmap and that it then turns into a pixmap
- QPixmap pixmap("temp_image.png");
+ QPixmap pixmap(m_tempDir.path() + "/temp_image.png");
QVERIFY(!pixmap.isNull());
QVERIFY(pixmap.depth() > 1);
QVERIFY(!pixmap.isQBitmap());
pixmap = QPixmap();
- ok = pixmap.load("temp_image.png");
+ ok = pixmap.load(m_tempDir.path() + "/temp_image.png");
QVERIFY(ok);
QVERIFY(!pixmap.isNull());
QVERIFY(pixmap.depth() > 1);
@@ -1461,20 +1462,20 @@ void tst_QPixmap::loadAsBitmapOrPixmap()
//now we can try to load it without an extension
pixmap = QPixmap();
- ok = pixmap.load("temp_image");
+ ok = pixmap.load(m_tempDir.path() + "/temp_image");
QVERIFY(ok);
QVERIFY(!pixmap.isNull());
QVERIFY(pixmap.depth() > 1);
QVERIFY(!pixmap.isQBitmap());
// The do the same check for bitmaps..
- QBitmap bitmap("temp_image.png");
+ QBitmap bitmap(m_tempDir.path() + "/temp_image.png");
QVERIFY(!bitmap.isNull());
QCOMPARE(bitmap.depth(), 1);
QVERIFY(bitmap.isQBitmap());
bitmap = QBitmap();
- ok = bitmap.load("temp_image.png");
+ ok = bitmap.load(m_tempDir.path() + "/temp_image.png");
QVERIFY(ok);
QVERIFY(!bitmap.isNull());
QCOMPARE(bitmap.depth(), 1);
diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
index 0d1d0f1ae1..b8af5271ea 100644
--- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
@@ -134,6 +134,7 @@ private slots:
void xToCursorForLigatures();
void cursorInNonStopChars();
void nbsp();
+ void nbspWithFormat();
void noModificationOfInputString();
void superscriptCrash_qtbug53911();
@@ -2254,5 +2255,41 @@ void tst_QTextLayout::superscriptCrash_qtbug53911()
qDeleteAll(textLayouts);
}
+void tst_QTextLayout::nbspWithFormat()
+{
+ QString s1 = QLatin1String("ABCDEF ");
+ QString s2 = QLatin1String("GHI");
+ QChar nbsp(QChar::Nbsp);
+ QString s3 = QLatin1String("JKLMNOPQRSTUVWXYZ");
+
+ QTextLayout layout;
+ layout.setText(s1 + s2 + nbsp + s3);
+
+ QTextLayout::FormatRange formatRange;
+ formatRange.start = s1.length() + s2.length();
+ formatRange.length = 1;
+ formatRange.format.setFontUnderline(true);
+
+ QList<QTextLayout::FormatRange> overrides;
+ overrides.append(formatRange);
+
+ layout.setAdditionalFormats(overrides);
+
+ layout.beginLayout();
+ forever {
+ QTextLine line = layout.createLine();
+ if (!line.isValid())
+ break;
+ line.setLineWidth(1);
+ }
+ layout.endLayout();
+
+ QCOMPARE(layout.lineCount(), 2);
+ QCOMPARE(layout.lineAt(0).textStart(), 0);
+ QCOMPARE(layout.lineAt(0).textLength(), s1.length());
+ QCOMPARE(layout.lineAt(1).textStart(), s1.length());
+ QCOMPARE(layout.lineAt(1).textLength(), s2.length() + 1 + s3.length());
+}
+
QTEST_MAIN(tst_QTextLayout)
#include "tst_qtextlayout.moc"
diff --git a/tests/auto/tools/qmakelib/evaltest.cpp b/tests/auto/tools/qmakelib/evaltest.cpp
index 44c82fb376..e3be294e5f 100644
--- a/tests/auto/tools/qmakelib/evaltest.cpp
+++ b/tests/auto/tools/qmakelib/evaltest.cpp
@@ -1265,8 +1265,8 @@ void tst_qmakelib::addReplaceFunctions(const QString &qindir)
QTest::newRow("$$section(): bad number of arguments")
<< "VAR = $$section(1, 2) \\\n$$section(1, 2, 3, 4, 5)"
<< "VAR ="
- << "##:1: section(var) section(var, sep, begin, end) requires three or four arguments.\n"
- "##:2: section(var) section(var, sep, begin, end) requires three or four arguments."
+ << "##:1: section(var, sep, begin, end) requires three or four arguments.\n"
+ "##:2: section(var, sep, begin, end) requires three or four arguments."
<< true;
QTest::newRow("$$find()")
diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
index 00693ba6f7..0bb2c50b9d 100644
--- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -1057,6 +1057,10 @@ static QSet<QString> fileListUnderIndex(const QFileSystemModel *model, const QMo
void tst_QFileSystemModel::specialFiles()
{
+#ifndef Q_OS_UNIX
+ QSKIP("Not implemented");
+#endif
+
QFileSystemModel model;
model.setFilter(QDir::AllEntries | QDir::System | QDir::Hidden);
@@ -1065,23 +1069,8 @@ void tst_QFileSystemModel::specialFiles()
// as it will always return a valid index for existing files,
// even if the file is not visible with the given filter.
-#if defined(Q_OS_UNIX)
const QModelIndex rootIndex = model.setRootPath(QStringLiteral("/dev/"));
const QString testFileName = QStringLiteral("null");
-#elif defined(Q_OS_WIN)
- const QModelIndex rootIndex = model.setRootPath(flatDirTestPath);
-
- const QString testFileName = QStringLiteral("linkSource.lnk");
-
- QFile file(flatDirTestPath + QLatin1String("/linkTarget.txt"));
- QVERIFY(file.open(QIODevice::WriteOnly));
- file.close();
- QVERIFY(file.link(flatDirTestPath + '/' + testFileName));
-#else
- QSKIP("Not implemented");
- QModelIndex rootIndex;
- QString testFileName;
-#endif
QTRY_VERIFY(fileListUnderIndex(&model, rootIndex).contains(testFileName));
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 0000000000..4a843e744f
--- /dev/null
+++ b/tests/auto/widgets/widgets/qlabel/red@2x.png
Binary files differ
diff --git a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp
index ad971c6b5f..6363d0c673 100644
--- a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp
+++ b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp
@@ -96,6 +96,9 @@ private Q_SLOTS:
void taskQTBUG_7902_contextMenuCrash();
#endif
+ void taskQTBUG_48157_dprPixmap();
+ void taskQTBUG_48157_dprMovie();
+
private:
QLabel *testWidget;
QPointer<Widget> test_box;
@@ -541,5 +544,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"
diff --git a/tests/manual/qcursor/childwidget/childwidget.pro b/tests/manual/qcursor/childwidget/childwidget.pro
new file mode 100644
index 0000000000..9ca41c5b4f
--- /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 0000000000..4447c87210
--- /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 <QtWidgets>
+
+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 0000000000..194536a91a
--- /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 0000000000..5fc293dfcf
--- /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 <QtGui>
+
+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 0000000000..2233ce4a63
--- /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 0000000000..d440133a42
--- /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 <QtWidgets>
+
+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 0b5c2b1945..c6617b8e89 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
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index bf2d7aa8a7..8716fa88f7 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -1085,7 +1085,7 @@ bool Configure::showLicense(QString orgLicenseFile)
return false;
} else {
if (dictionary["EDITION"] == "OpenSource") {
- if (accept == 'L')
+ if (accept == 'l')
licenseFile = orgLicenseFile + "/LICENSE.LGPL3";
else
licenseFile = orgLicenseFile + "/LICENSE.GPL2";