summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2016-11-29 12:31:41 +0100
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2016-11-29 12:31:41 +0100
commit947cace7993807d173656300f4440ae5166624fe (patch)
tree39eb81b1bda6a92a3358b1c489e9cfce6d241f17
parent5e921a18b2a098f68dbce368f9d20447939b3510 (diff)
parent7eb4be9db89d40ea2cc090e7a562bdd588708607 (diff)
Merge 5.8 into 5.8.0
-rwxr-xr-xconfigure117
-rw-r--r--configure.json2
-rw-r--r--dist/changes-5.7.1221
-rw-r--r--examples/network/multistreamserver/server.cpp2
-rw-r--r--examples/widgets/animation/appchooser/main.cpp6
-rw-r--r--examples/widgets/animation/moveblocks/main.cpp10
-rw-r--r--examples/widgets/animation/states/main.cpp2
-rw-r--r--examples/widgets/animation/stickman/graphicsview.h2
-rw-r--r--examples/widgets/animation/stickman/lifecycle.cpp4
-rw-r--r--examples/widgets/animation/stickman/rectbutton.h6
-rw-r--r--examples/widgets/animation/stickman/stickman.h4
-rw-r--r--examples/widgets/animation/sub-attaq/boat.h2
-rw-r--r--examples/widgets/animation/sub-attaq/boat_p.h6
-rw-r--r--examples/widgets/animation/sub-attaq/states.h6
-rw-r--r--examples/widgets/animation/sub-attaq/submarine.h2
-rw-r--r--examples/widgets/graphicsview/boxes/glbuffers.h12
-rw-r--r--examples/widgets/graphicsview/boxes/qtbox.h32
-rw-r--r--examples/widgets/graphicsview/boxes/scene.h22
-rw-r--r--examples/widgets/graphicsview/chip/view.cpp2
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/main.cpp2
-rw-r--r--examples/widgets/graphicsview/weatheranchorlayout/main.cpp2
-rw-r--r--examples/widgets/itemviews/frozencolumn/freezetablewidget.h4
-rw-r--r--examples/widgets/painting/fontsampler/mainwindow.cpp4
-rw-r--r--examples/widgets/painting/fontsampler/mainwindow.h2
-rw-r--r--examples/widgets/richtext/textedit/textedit.h2
-rw-r--r--examples/widgets/statemachine/factorial/main.cpp8
-rw-r--r--examples/widgets/statemachine/pingpong/main.cpp6
-rw-r--r--examples/widgets/statemachine/trafficlight/main.cpp2
-rw-r--r--mkspecs/android-clang/qmake.conf3
-rw-r--r--mkspecs/features/moc.prf3
-rw-r--r--mkspecs/features/qt.prf9
-rw-r--r--mkspecs/features/qt_app.prf2
-rw-r--r--mkspecs/features/qt_build_config.prf16
-rw-r--r--mkspecs/features/qt_configure.prf2
-rw-r--r--mkspecs/features/qt_example_installs.prf3
-rw-r--r--mkspecs/win32-msvc2017/qmake.conf10
-rw-r--r--mkspecs/win32-msvc2017/qplatformdefs.h34
-rw-r--r--qmake/Makefile.unix9
-rw-r--r--qmake/Makefile.unix.macos17
-rw-r--r--qmake/Makefile.unix.mingw27
-rw-r--r--qmake/Makefile.unix.unix11
-rw-r--r--qmake/Makefile.unix.win3219
-rw-r--r--qmake/Makefile.win3216
-rw-r--r--qmake/doc/src/qmake-manual.qdoc6
-rw-r--r--qmake/generators/win32/mingw_make.cpp9
-rw-r--r--qmake/generators/win32/msvc_nmake.cpp9
-rw-r--r--qmake/generators/win32/msvc_objectmodel.h3
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp11
-rw-r--r--qmake/generators/win32/winmakefile.cpp24
-rw-r--r--qmake/library/qmakeevaluator.cpp13
-rw-r--r--qmake/qmake.pro1
-rw-r--r--src/3rdparty/angle/qt_attribution.json8
-rw-r--r--src/3rdparty/forkfd/LICENSE1
-rw-r--r--src/3rdparty/forkfd/qt_attribution.json2
-rw-r--r--src/3rdparty/freebsd/qt_attribution.json10
-rw-r--r--src/3rdparty/sha3/qt_attribution.json2
-rw-r--r--src/corelib/Qt5Config.cmake.in12
-rw-r--r--src/corelib/Qt5ModuleLocation.cmake.in15
-rw-r--r--src/corelib/Qt5ModuleLocationForInstall.cmake.in4
-rw-r--r--src/corelib/codecs/codecs.pri6
-rw-r--r--src/corelib/codecs/qiconvcodec.cpp56
-rw-r--r--src/corelib/codecs/qiconvcodec_p.h8
-rw-r--r--src/corelib/codecs/qsimplecodec_p.h10
-rw-r--r--src/corelib/codecs/qtextcodec.cpp6
-rw-r--r--src/corelib/configure.json20
-rw-r--r--src/corelib/corelib.pro21
-rw-r--r--src/corelib/global/qcompilerdetection.h9
-rw-r--r--src/corelib/global/qconfig-bootstrapped.h1
-rw-r--r--src/corelib/global/qglobal.cpp6
-rw-r--r--src/corelib/global/qglobal.h26
-rw-r--r--src/corelib/global/qlibraryinfo.cpp4
-rw-r--r--src/corelib/global/qlogging.cpp2
-rw-r--r--src/corelib/io/PSL-LICENSE.txt373
-rw-r--r--src/corelib/io/qfile_p.h2
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp20
-rw-r--r--src/corelib/io/qresource.cpp126
-rw-r--r--src/corelib/io/qresource.h1
-rw-r--r--src/corelib/io/qsettings.cpp71
-rw-r--r--src/corelib/io/qt_attribution.json29
-rw-r--r--src/corelib/io/qtemporaryfile_p.h14
-rw-r--r--src/corelib/io/qurl.cpp3
-rw-r--r--src/corelib/io/qurltlds_p.h.INFO3
-rw-r--r--src/corelib/json/qjsonparser.cpp5
-rw-r--r--src/corelib/json/qjsonparser_p.h5
-rw-r--r--src/corelib/kernel/qdeadlinetimer.cpp25
-rw-r--r--src/corelib/kernel/qelapsedtimer.cpp2
-rw-r--r--src/corelib/kernel/qobjectdefs_impl.h10
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp2
-rw-r--r--src/corelib/mimetypes/qmimetypeparser_p.h10
-rw-r--r--src/corelib/statemachine/qhistorystate_p.h4
-rw-r--r--src/corelib/thread/qbasicatomic.h5
-rw-r--r--src/corelib/thread/qfutureinterface.cpp109
-rw-r--r--src/corelib/thread/qfutureinterface_p.h2
-rw-r--r--src/corelib/thread/qmutex.cpp4
-rw-r--r--src/corelib/thread/qmutex.h38
-rw-r--r--src/corelib/tools/qalgorithms.h3
-rw-r--r--src/corelib/tools/qdatetime.cpp2
-rw-r--r--src/corelib/tools/qdatetimeparser.cpp2
-rw-r--r--src/corelib/tools/qdatetimeparser_p.h84
-rw-r--r--src/corelib/tools/qstring.cpp106
-rw-r--r--src/gui/configure.json7
-rw-r--r--src/gui/image/qimage.h3
-rw-r--r--src/gui/image/qxbmhandler.cpp13
-rw-r--r--src/gui/kernel/qkeysequence.cpp4
-rw-r--r--src/gui/opengl/opengl.pri1
-rw-r--r--src/gui/opengl/qopenglshadercache_meego_p.h450
-rw-r--r--src/gui/opengl/qopenglshadercache_p.h5
-rw-r--r--src/gui/painting/qcolor.cpp8
-rw-r--r--src/gui/painting/qcoregraphics.mm7
-rw-r--r--src/gui/painting/qcoregraphics_p.h2
-rw-r--r--src/gui/painting/qdrawhelper.cpp185
-rw-r--r--src/gui/text/qcssparser.cpp1
-rw-r--r--src/gui/text/qfontdatabase.cpp10
-rw-r--r--src/gui/text/qfontengine.cpp11
-rw-r--r--src/gui/text/qfontengine_p.h1
-rw-r--r--src/gui/text/qharfbuzzng_p.h3
-rw-r--r--src/gui/text/qtextengine.cpp19
-rw-r--r--src/gui/text/qtextengine_p.h2
-rw-r--r--src/gui/text/text.pri4
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp2
-rw-r--r--src/network/configure.json2
-rw-r--r--src/network/socket/qabstractsocket.cpp13
-rw-r--r--src/network/socket/qnativesocketengine_winrt.cpp84
-rw-r--r--src/network/socket/qsctpserver.cpp28
-rw-r--r--src/network/socket/qsctpserver.h4
-rw-r--r--src/network/socket/qsctpserver_p.h2
-rw-r--r--src/network/socket/qsctpsocket.cpp44
-rw-r--r--src/network/socket/qsctpsocket.h6
-rw-r--r--src/network/socket/qsctpsocket_p.h2
-rw-r--r--src/network/ssl/qsslsocket.cpp2
-rw-r--r--src/opengl/gl2paintengineex/qglshadercache_meego_p.h450
-rw-r--r--src/opengl/gl2paintengineex/qglshadercache_p.h5
-rw-r--r--src/opengl/opengl.pro3
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp217
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp105
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h25
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp16
-rw-r--r--src/platformsupport/services/genericunix/qgenericunixservices.cpp3
-rw-r--r--src/plugins/platforms/cocoa/COCOA_LICENSE.txt29
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm2
-rw-r--r--src/plugins/platforms/cocoa/qt_attribution.json13
-rw-r--r--src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp2
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfsintegration.cpp2
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfswindow.cpp2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp4
-rw-r--r--src/plugins/platforms/windows/qwin10helpers.cpp167
-rw-r--r--src/plugins/platforms/windows/qwin10helpers.h52
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.h2
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp7
-rw-r--r--src/plugins/platforms/windows/qwindowskeymapper.cpp3
-rw-r--r--src/plugins/platforms/windows/windows.pri4
-rw-r--r--src/plugins/sqldrivers/mysql/qsql_mysql.cpp2
-rw-r--r--src/printsupport/kernel/kernel.pri2
-rw-r--r--src/src.pro8
-rw-r--r--src/testlib/doc/src/qttestlib-manual.qdoc29
-rw-r--r--src/testlib/qxctestlogger.mm2
-rw-r--r--src/tools/moc/moc.cpp5
-rw-r--r--src/tools/rcc/rcc.cpp46
-rw-r--r--src/tools/rcc/rcc.h1
-rw-r--r--src/tools/uic/qclass_lib_map.h6
-rw-r--r--src/widgets/accessible/itemviews.cpp42
-rw-r--r--src/widgets/accessible/itemviews_p.h2
-rw-r--r--src/widgets/kernel/qformlayout.cpp25
-rw-r--r--src/widgets/kernel/qwidget.h10
-rw-r--r--src/widgets/widgets/qlineedit.cpp2
-rw-r--r--src/widgets/widgets/qpushbutton.h3
-rw-r--r--tests/auto/corelib/io/qfile/tst_qfile.cpp3
-rw-r--r--tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp15
-rw-r--r--tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp14
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp50
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp40
-rw-r--r--tests/auto/corelib/thread/qmutex/tst_qmutex.cpp114
-rw-r--r--tests/auto/corelib/thread/qthread/tst_qthread.cpp4
-rw-r--r--tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp4
-rw-r--r--tests/auto/gui/text/qstatictext/tst_qstatictext.cpp2
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp2
-rw-r--r--tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp16
-rw-r--r--tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp7
-rw-r--r--tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp3
-rw-r--r--tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp3
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp5
-rw-r--r--tests/auto/sql/kernel/qsql/tst_qsql.cpp1
-rw-r--r--tests/auto/tools/rcc/data/images/images.expected10
-rw-r--r--tests/auto/tools/rcc/tst_rcc.cpp17
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp10
-rw-r--r--tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp8
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp8
-rw-r--r--tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp42
-rw-r--r--tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp2
-rw-r--r--tests/manual/qstorageinfo/printvolumes.cpp10
-rw-r--r--tools/configure/configureapp.cpp158
-rw-r--r--tools/configure/configureapp.h2
-rw-r--r--tools/configure/environment.cpp8
-rw-r--r--tools/configure/environment.h4
-rw-r--r--tools/configure/tools.cpp8
195 files changed, 2544 insertions, 2287 deletions
diff --git a/configure b/configure
index 938831df09..bc18e614d2 100755
--- a/configure
+++ b/configure
@@ -399,7 +399,6 @@ HostVar()
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
# detect the "echo without newline" style. usage: echo $ECHO_N "<string>$ECHO_C"
if echo '\c' | grep '\c' >/dev/null; then
@@ -479,7 +478,7 @@ XPLATFORM_TVOS=no # Whether target platform is tvOS
XPLATFORM_WATCHOS=no # Whether target platform is watchOS
XPLATFORM_ANDROID=no
XPLATFORM_MINGW=no # Whether target platform is MinGW (win32-g++*)
-PLATFORM=$QMAKESPEC
+PLATFORM=
OPT_CONFIRM_LICENSE=no
OPT_SHADOW=maybe
OPT_VERBOSE=no
@@ -512,8 +511,6 @@ QT_HOST_LIBS=
QT_HOST_DATA=
QT_EXT_PREFIX=
-# default qpa platform
-
# Android vars
CFG_DEFAULT_ANDROID_NDK_ROOT=$ANDROID_NDK_ROOT
CFG_DEFAULT_ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT
@@ -529,7 +526,6 @@ CFG_DEFAULT_ANDROID_NDK_HOST=$ANDROID_NDK_HOST
# parse the arguments, setting things to "yes" or "no"
while [ "$#" -gt 0 ]; do
CURRENT_OPT="$1"
- UNKNOWN_ARG=no
case "$1" in
#Autoconf style options
--enable-*)
@@ -658,10 +654,6 @@ while [ "$#" -gt 0 ]; do
extprefix)
QT_EXT_PREFIX="$VAL"
;;
- pkg-config)
- ;;
- force-pkg-config)
- ;;
docdir)
QT_INSTALL_DOCS="$VAL"
;;
@@ -1314,8 +1306,6 @@ if [ "$OPT_SHADOW" = "yes" ]; then
[ "$OPT_VERBOSE" = "yes" ] && echo "Performing shadow build..."
fi
-# if the source tree is different from the build tree,
-# symlink or copy part of the sources
if [ "$OPT_SHADOW" = "yes" ]; then
echo "Preparing build tree..."
@@ -1628,35 +1618,19 @@ setBootstrapVariable()
}
# build qmake
-if true; then ###[ '!' -f "$outpath/bin/qmake" ];
echo "Creating qmake..."
-
mkdir -p "$outpath/qmake" || exit
- # fix makefiles
- for mkfile in GNUmakefile Makefile; do
- EXTRA_LFLAGS=
- EXTRA_CFLAGS=
- in_mkfile="${mkfile}.in"
- if [ "$mkfile" = "Makefile" ]; then
-# if which qmake >/dev/null 2>&1 && [ -f qmake/qmake.pro ]; then
-# (cd qmake && qmake) >/dev/null 2>&1 && continue
-# fi
- in_mkfile="${mkfile}.unix"
- fi
- in_mkfile="$relpath/qmake/$in_mkfile"
- mkfile="$outpath/qmake/$mkfile"
+
+ in_mkfile=$relpath/qmake/Makefile.unix
+ mkfile=$outpath/qmake/Makefile
if [ -f "$mkfile" ]; then
[ "$CFG_DEV" = "yes" ] && "$WHICH" chflags >/dev/null 2>&1 && chflags nouchg "$mkfile"
rm -f "$mkfile"
fi
- [ -f "$in_mkfile" ] || continue
echo "########################################################################" > "$mkfile"
echo "## This file was autogenerated by configure, all changes will be lost ##" >> "$mkfile"
echo "########################################################################" >> "$mkfile"
- EXTRA_OBJS=
- EXTRA_SRCS=
- EXTRA_CFLAGS="\$(QMAKE_CFLAGS) \$(QMAKE_CFLAGS_SPLIT_SECTIONS)"
EXTRA_CXXFLAGS="\$(QMAKE_CXXFLAGS) \$(QMAKE_CXXFLAGS_CXX11) \$(QMAKE_CXXFLAGS_SPLIT_SECTIONS)"
EXTRA_LFLAGS="\$(QMAKE_LFLAGS) \$(QMAKE_LFLAGS_GCSECTIONS)"
@@ -1667,8 +1641,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
[ "$CFG_SILENT" = "yes" ] && CC_TRANSFORM='s,^,\@,' || CC_TRANSFORM=
setBootstrapVariable QMAKE_CC CC "$CC_TRANSFORM"
setBootstrapVariable QMAKE_CXX CXX "$CC_TRANSFORM"
- setBootstrapVariable QMAKE_CFLAGS
- setBootstrapVariable QMAKE_CFLAGS_SPLIT_SECTIONS
setBootstrapVariable QMAKE_CXXFLAGS
setBootstrapVariable QMAKE_CXXFLAGS_CXX11
setBootstrapVariable QMAKE_CXXFLAGS_SPLIT_SECTIONS
@@ -1676,71 +1648,13 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
setBootstrapVariable QMAKE_LFLAGS_GCSECTIONS
if [ "$CFG_DEBUG" = "no" ] || [ "$CFG_RELEASE_TOOLS" = "yes" ]; then
- setBootstrapVariable QMAKE_CFLAGS_RELEASE
setBootstrapVariable QMAKE_CXXFLAGS_RELEASE
- EXTRA_CFLAGS="$EXTRA_CFLAGS \$(QMAKE_CFLAGS_RELEASE)"
EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(QMAKE_CXXFLAGS_RELEASE)"
else
- setBootstrapVariable QMAKE_CFLAGS_DEBUG
setBootstrapVariable QMAKE_CXXFLAGS_DEBUG
- EXTRA_CFLAGS="$EXTRA_CFLAGS \$(QMAKE_CFLAGS_DEBUG)"
EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(QMAKE_CXXFLAGS_DEBUG)"
fi
- case `basename "$PLATFORM"` in
- win32-g++*)
- EXTRA_CFLAGS="$EXTRA_CFLAGS -DUNICODE"
- EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -DUNICODE"
- EXTRA_OBJS="qfilesystemengine_win.o \
- qfilesystemiterator_win.o \
- qfsfileengine_win.o \
- qlocale_win.o \
- qsettings_win.o \
- qsystemlibrary.o \
- registry.o"
- EXTRA_SRCS="\"\$(SOURCE_PATH)/src/corelib/corelib/io/qfilesystemengine_win.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/io/qsettings_win.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp\" \
- \"\$(SOURCE_PATH)/tools/shared/windows/registry.cpp\""
- EXTRA_LFLAGS="$EXTRA_LFLAGS -static -s -lole32 -luuid -ladvapi32 -lkernel32"
- EXEEXT=".exe"
- ;;
- *)
- EXTRA_OBJS="qfilesystemengine_unix.o \
- qfilesystemiterator_unix.o \
- qfsfileengine_unix.o \
- qlocale_unix.o"
- EXTRA_SRCS="\"\$(SOURCE_PATH)/src/corelib/io/qfilesystemengine_unix.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_unix.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp\""
- EXEEXT=
- ;;
- esac
- if [ "$BUILD_ON_MAC" = "yes" ]; then
- echo "COCOA_LFLAGS =-framework Foundation -framework CoreServices" >>"$mkfile"
- echo "CARBON_LFLAGS =-framework ApplicationServices" >>"$mkfile"
- echo "CARBON_CFLAGS =-fconstant-cfstrings" >>"$mkfile"
- EXTRA_LFLAGS="$EXTRA_LFLAGS \$(COCOA_LFLAGS)"
- EXTRA_LFLAGS="$EXTRA_LFLAGS \$(CARBON_LFLAGS)"
- EXTRA_CFLAGS="$EXTRA_CFLAGS \$(CARBON_CFLAGS)"
- EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS \$(CARBON_CFLAGS)"
- EXTRA_OBJS="$EXTRA_OBJS \
- qsettings_mac.o \
- qcore_mac.o \
- qcore_mac_objc.o \
- qcore_foundation.o"
- EXTRA_SRCS="$EXTRA_SRCS \
- \"\$(SOURCE_PATH)/src/corelib/io/qsettings_mac.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp\" \
- \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm\" \
- \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm\""
- fi
-
- echo >>"$mkfile"
adjrelpath=`echo "$relpath" | sed 's/ /\\\\\\\\ /g'`
adjoutpath=`echo "$outpath" | sed 's/ /\\\\\\\\ /g'`
adjqmakespec=`echo "$QMAKESPEC" | sed 's/ /\\\\\\\\ /g'`
@@ -1757,15 +1671,24 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
echo "QT_MAJOR_VERSION = $QT_MAJOR_VERSION" >> "$mkfile"
echo "QT_MINOR_VERSION = $QT_MINOR_VERSION" >> "$mkfile"
echo "QT_PATCH_VERSION = $QT_PATCH_VERSION" >> "$mkfile"
- echo "EXTRA_CFLAGS = $EXTRA_CFLAGS" >> "$mkfile"
- echo "EXTRA_CXXFLAGS = $EXTRA_CXXFLAGS" >> "$mkfile"
- echo "QTOBJS =" $EXTRA_OBJS >> "$mkfile"
- echo "QTSRCS =" $EXTRA_SRCS >> "$mkfile"
- echo "LFLAGS = $EXTRA_LFLAGS" >> "$mkfile"
- echo "EXEEXT = $EXEEXT" >> "$mkfile"
+ echo "CONFIG_CXXFLAGS = $EXTRA_CXXFLAGS" >> "$mkfile"
+ echo "CONFIG_LFLAGS = $EXTRA_LFLAGS" >> "$mkfile"
echo "RM_F = rm -f" >> "$mkfile"
echo "RM_RF = rm -rf" >> "$mkfile"
+ case `basename "$PLATFORM"` in
+ win32-g++*)
+ cat "$in_mkfile.win32" >> "$mkfile"
+ ;;
+ *)
+ cat "$in_mkfile.unix" >> "$mkfile"
+ if [ "$BUILD_ON_MAC" = "yes" ]; then
+ cat "$in_mkfile.macos" >> "$mkfile"
+ fi
+ ;;
+ esac
+ echo >>"$mkfile"
+
if [ "$BUILD_ON_MAC" = "yes" ]; then
echo "EXTRA_CXXFLAGS += -MMD" >> "$mkfile"
cat "$in_mkfile" >> "$mkfile"
@@ -1779,7 +1702,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
rm "$mkfile.tmp"
fi
fi
- done
if [ "$OPT_VERBOSE" = yes ]; then
# Show the output of make
@@ -1797,7 +1719,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
fi
echo "Done."
fi
-fi # Build qmake
#-------------------------------------------------------------------------------
# create a qt.conf for the Qt build tree itself
diff --git a/configure.json b/configure.json
index 3480aed20f..f774291d22 100644
--- a/configure.json
+++ b/configure.json
@@ -515,7 +515,7 @@
},
"release_tools": {
"label": "Compile tools in release mode",
- "autoDetect": "!features.debug",
+ "autoDetect": "features.debug",
"output": [ "privateFeature", "publicQtConfig" ]
},
"simulator_and_device": {
diff --git a/dist/changes-5.7.1 b/dist/changes-5.7.1
new file mode 100644
index 0000000000..83065f01c1
--- /dev/null
+++ b/dist/changes-5.7.1
@@ -0,0 +1,221 @@
+Qt 5.7.1 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.7.0.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+http://doc.qt.io/qt-5/index.html
+
+The Qt version 5.7 series is binary compatible with the 5.6.x series.
+Applications compiled for 5.6 will continue to run with 5.7.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+This release contains all fixes included in the Qt 5.6.2 release.
+
+****************************************************************************
+* Important Behavior Changes *
+****************************************************************************
+
+ - [QTBUG-45031] The NSURLConnection backend of QNetworkAccessManager has
+ been removed, since SecureTransport is the default SSL backend on iOS
+ and is enabled by default. This means that building with -no-openssl
+ -no-securetransport will no longer provide SSL capabilities on iOS.
+
+ - QtCore / QDataStream:
+ * [QTBUG-54022] Incomplete reads of Qt containers are now handled same
+ way as for primitive types, meaning that previous errors are latched.
+
+****************************************************************************
+* Library *
+****************************************************************************
+
+QtCore
+------
+
+ - QLockFile:
+ * Fixed permissions on lock files on Unix to allow for adjustments via
+ umask.
+
+ - QMimeType:
+ * [QTBUG-50776] QMimeType::comment() now uses the default locale rather
+ than system locale, so that applications can control which language is
+ being used.
+
+ - QUrl:
+ * QUrl::resolved() no longer treats a URL with a scheme as a relative URL
+ if it matches this URL's scheme. For now it still treats "file:name.txt"
+ as relative for compatibility, but be warned that in Qt 5.8 it will no
+ longer consider those to be relative. Both isRelative() and RFC 3986 say
+ that such URLs are not relative, so starting from Qt 5.8, resolved() will
+ return them as is.
+
+ - QXmlStreamReader:
+ * Fixed a bug in the XML parser that prevented to load XML that
+ contained invalid characters for XML 1.0.
+
+ - QXmlStreamWriter:
+ * Fixed a bug that prevented the generation of valid XML files when
+ using encoding with 8 bit per character but not ASCII compatible.
+ QXMLStreamWriter generated XML markup using always ASCII in this case.
+
+QtGui
+-----
+
+ - QGuiApplication:
+ * [QTBUG-51703] Fixed a bug that would cause QGuiApplication::sync() to
+ be left undefined for Qt builds without session management support.
+
+ - QIconLoaderEngine:
+ * Fixed theme lookup for scalable entries
+
+ - QTextDocument:
+ * [QTBUG-48182] Fixed a bug that would return a wrong position when
+ searching backward from the end of the document.
+
+ - Text:
+ * [QTBUG-49452] Fixed a performance regression in Freetype engine that
+ was introduced in Qt 5.5.
+ * [QTBUG-53911] Fixed a crash that could happen if you were doing many
+ different text layouts with different fonts and superscript or
+ subscript alignment.
+ * [QTBUG-42033] Fixed bug where a QTextLayout with
+ ShowLineAndParagraphSeparators would modify the layout's input string.
+ * [QTBUG-54180] Fixed performance regression when rapidly switching
+ between a large set of fonts.
+
+QtNetwork
+---------
+
+- QSslSocket:
+ * [QTBUG-55170] Fixed a bug in SecureTransport backend that would cause
+ a memory usage growth in case 'readBufferMaxSize' is set.
+ * [QTBUG-52975] Fixed a bug in SecureTransport backend where transmit
+ was using invalid SSL context and reporting (incorrectly) some irrelevant
+ errors as a result.
+
+QtSql
+-----
+
+ - [QTBUG-53969][QTBUG-53237] Fixed QSqlQuery::prepare value truncation
+ error when using UNSIGNED values in a MySQL database.
+
+QtWidgets
+---------
+
+ - QAbstractItemDelegate:
+ * [QTBUG-16469] Show localized detailed tooltips and "What's this?"
+ texts.
+
+ - QTreeView:
+ * [QTBUG-52793] Fixed a key navigation bug when the columns were
+ reordered.
+
+****************************************************************************
+* Platform-specific Changes *
+****************************************************************************
+
+Android
+-------
+
+ - [QTBUG-50724] Added support for clang compiler
+ - [QTBUG-53511] Fixed CJK font resolution on Android 7.
+
+FreeBSD
+-------
+
+ - The freebsd-g++ mkspec was moved back and no longer requires the
+ "unsupported/" prefix, matching the FreeBSD ports tree, as FreeBSD 9.3
+ still defaults to using GCC. Users of GCC that did not previously use
+ the ports patch will need to adapt their build scripts and drop the
+ "unsupported/" prefix.
+
+Linux
+-----
+
+- [QTBUG-54733] It is now possible to opt out from installing signal
+ handlers when running with eglfs and linuxfb by setting the
+ QT_QPA_NO_SIGNAL_HANDLER environment variable to a non-zero value.
+- [QTBUG-55140] xcb with EGL and OpenGL ES, as well as eglfs with the
+ eglfs_x11 backend, are now supported on DRIVE CX boards when using the
+ linux-drive-cx-g++ device spec.
+
+
+Windows
+-------
+
+ - [QTBUG-41186] QWindow::fromWinId() may return 0 when passing invalid
+ window handles.
+ - [QTBUG-55595] Fixed crash when loading color fonts from data.
+ - [QTBUG-55097] Fixed rendering Adobe/Mozilla format color fonts with
+ other colors than black after Windows 10 Anniversary update.
+ - [QTBUG-54494] Fixed stretch when combined with either no or vertical
+ hinting preference or a device pixel ratio different from 1.
+ - [QTBUG-51024] Fixed height of text bounding box when using no or
+ vertical hinting preference, or when the device pixel ratio is
+ different from 1.
+
+****************************************************************************
+* Tools *
+****************************************************************************
+
+configure & build system
+------------------------
+
+ - [QTBUG-35886][QTBUG-51417] Fixed Fontconfig vs. system FreeType
+ configuration.
+ - [QTBUG-43784][X11] Fixed detection of GLX with -qt-xcb.
+ - [QTBUG-51534][Windows] The configure.exe bootstrapping now prefers
+ cl over clang-cl, to avoid header incompatibility problems.
+ - [QTBUG-52940] Fixed missing plugins.qmltypes files in static builds.
+ - [QTBUG-52951] Fixed dynamic library support detection for platforms
+ without libdl.
+ - [QTBUG-53038] Fixed running of configure tests outside qtbase when
+ cross compiling on Windows (for example for Android).
+ - [QTBUG-53312] The flags supplied by the configure -D/-I/-L/-l options
+ are now applied after Qt's own flags. This helps in some cases when
+ the provided paths contain files which conflict with the Qt build.
+ - [QTBUG-53926] Fixed linkage of QML plugins in static prefix builds.
+ - [QTBUG-55011][Unix] Fixed -no-pkg-config being ignored by some
+ configure tests, which led to build failures later on.
+ - Fixed configure tests outside qtbase when $MAKEFLAGS contains the
+ -i flag.
+ - [Android] Some unused plugins are not built anymore.
+ - [MinGW] Added support for -separate-debug-info.
+ - [Unix] Added configure -no-opengles3 option.
+ - [Unix] Fixed MySQL detection/use on RHEL 6.6.
+
+qmake
+-----
+
+ - [QTBUG-41830] Fixed nested custom functions inheriting their callers'
+ arguments.
+ - [QTBUG-53895][MSVC] Started using separate PDB files for compiling
+ and linking.
+ - [QTBUG-54036][Darwin] Fixed installation of debug symbols.
+ - [QTBUG-54299] Various QMAKE_EXTRA_COMPILERS' .depends entries are now
+ appended to rather than overwritten.
+ - [QTBUG-54346][MSys/Apple] Fixed detection of QMAKE_DEFAULT_{INC,LIB}DIRS.
+ - [QTBUG-54550] Fixed access to freed memory in $$absolute_path().
+ - [QTBUG-54674] The obsolete -target xp is now properly rejected.
+ - [QTBUG-55183][nmake] _WINDLL is now automatically defined when building
+ a DLL, consistently with Visual Studio.
+ - [QTBUG-55505] Fixed build of projects with spaces in the source or build
+ path against static builds of Qt.
+ - [QTBUG-55649][QTBUG-55915][Xcode] Fixed support for Xcode 8.
+ - [QTBUG-56162][MinGW] Fixed -release -force-debug-info missing both
+ optimization and debug info.
+ - Fixed several cases where the error() function would not abort qmake.
+ - Interrupting a command run via system() will now abort qmake as well.
+ - The packagesExist() function will now warn when used when Qt was
+ configured with -no-pkg-config.
+ - [Android] The default compiler flags were adjusted to match newer
+ NDK versions.
+ - [Darwin] Fixed detection of QMAKE_DEFAULT_INCDIRS.
+ - [Darwin][make] Added support for building Xcode asset catalogs.
diff --git a/examples/network/multistreamserver/server.cpp b/examples/network/multistreamserver/server.cpp
index 3b06c0fd37..1d18514c0e 100644
--- a/examples/network/multistreamserver/server.cpp
+++ b/examples/network/multistreamserver/server.cpp
@@ -66,7 +66,7 @@ Server::Server(QWidget *parent)
setWindowTitle(tr("Multi-stream Server"));
sctpServer = new QSctpServer(this);
- sctpServer->setMaxChannelCount(NumberOfChannels);
+ sctpServer->setMaximumChannelCount(NumberOfChannels);
statusLabel = new QLabel;
QPushButton *quitButton = new QPushButton(tr("Quit"));
diff --git a/examples/widgets/animation/appchooser/main.cpp b/examples/widgets/animation/appchooser/main.cpp
index c9821450c9..71c869f6a2 100644
--- a/examples/widgets/animation/appchooser/main.cpp
+++ b/examples/widgets/animation/appchooser/main.cpp
@@ -67,12 +67,12 @@ public:
painter->drawPixmap(QPointF(), p);
}
- virtual void mousePressEvent(QGraphicsSceneMouseEvent *) override
+ void mousePressEvent(QGraphicsSceneMouseEvent *) override
{
emit clicked();
}
- virtual void setGeometry(const QRectF &rect) override
+ void setGeometry(const QRectF &rect) override
{
QGraphicsWidget::setGeometry(rect);
@@ -98,7 +98,7 @@ public:
{
}
- virtual void resizeEvent(QResizeEvent *) override
+ void resizeEvent(QResizeEvent *) override
{
fitInView(sceneRect(), Qt::KeepAspectRatio);
}
diff --git a/examples/widgets/animation/moveblocks/main.cpp b/examples/widgets/animation/moveblocks/main.cpp
index f85211ef88..a9b95808a5 100644
--- a/examples/widgets/animation/moveblocks/main.cpp
+++ b/examples/widgets/animation/moveblocks/main.cpp
@@ -98,14 +98,14 @@ public:
protected:
//![14]
- virtual bool eventTest(QEvent *event) override
+ bool eventTest(QEvent *event) override
{
return (event->type() == QEvent::Type(StateSwitchEvent::StateSwitchType))
&& (static_cast<StateSwitchEvent *>(event)->rand() == m_rand);
}
//![14]
- virtual void onTransition(QEvent *) override {}
+ void onTransition(QEvent *) override {}
private:
int m_rand;
@@ -122,7 +122,7 @@ public:
//![10]
//![11]
- virtual void onEntry(QEvent *) override
+ void onEntry(QEvent *) override
{
int n;
while ((n = (qrand() % m_stateCount + 1)) == m_lastIndex)
@@ -130,7 +130,7 @@ public:
m_lastIndex = n;
machine()->postEvent(new StateSwitchEvent(n));
}
- virtual void onExit(QEvent *) override {}
+ void onExit(QEvent *) override {}
//![11]
//![12]
@@ -174,7 +174,7 @@ public:
}
protected:
- virtual void resizeEvent(QResizeEvent *event) override
+ void resizeEvent(QResizeEvent *event) override
{
fitInView(scene()->sceneRect());
QGraphicsView::resizeEvent(event);
diff --git a/examples/widgets/animation/states/main.cpp b/examples/widgets/animation/states/main.cpp
index a3c7256933..14d193c301 100644
--- a/examples/widgets/animation/states/main.cpp
+++ b/examples/widgets/animation/states/main.cpp
@@ -79,7 +79,7 @@ public:
{
}
- virtual void resizeEvent(QResizeEvent *) override
+ void resizeEvent(QResizeEvent *) override
{
fitInView(sceneRect(), Qt::KeepAspectRatio);
}
diff --git a/examples/widgets/animation/stickman/graphicsview.h b/examples/widgets/animation/stickman/graphicsview.h
index 4b9b8fc028..56396bb780 100644
--- a/examples/widgets/animation/stickman/graphicsview.h
+++ b/examples/widgets/animation/stickman/graphicsview.h
@@ -61,7 +61,7 @@ public:
GraphicsView(QWidget *parent = 0);
protected:
- virtual void resizeEvent(QResizeEvent *event) override;
+ void resizeEvent(QResizeEvent *event) override;
void keyPressEvent(QKeyEvent *) override;
signals:
diff --git a/examples/widgets/animation/stickman/lifecycle.cpp b/examples/widgets/animation/stickman/lifecycle.cpp
index 0ece4f3932..253af22b2d 100644
--- a/examples/widgets/animation/stickman/lifecycle.cpp
+++ b/examples/widgets/animation/stickman/lifecycle.cpp
@@ -70,7 +70,7 @@ public:
setTargetState(target);
}
- virtual bool eventTest(QEvent *e) override
+ bool eventTest(QEvent *e) override
{
if (QSignalTransition::eventTest(e)) {
QVariant key = static_cast<QStateMachine::SignalEvent*>(e)->arguments().at(0);
@@ -95,7 +95,7 @@ public:
startTimer(1000);
}
- virtual bool eventTest(QEvent *e) override
+ bool eventTest(QEvent *e) override
{
return QEventTransition::eventTest(e) && ((qrand() % 50) == 0);
}
diff --git a/examples/widgets/animation/stickman/rectbutton.h b/examples/widgets/animation/stickman/rectbutton.h
index 864a2c179e..ab47bad0f7 100644
--- a/examples/widgets/animation/stickman/rectbutton.h
+++ b/examples/widgets/animation/stickman/rectbutton.h
@@ -60,13 +60,13 @@ public:
RectButton(QString buttonText);
~RectButton();
- virtual QRectF boundingRect() const override;
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+ QRectF boundingRect() const override;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
protected:
QString m_ButtonText;
- virtual void mousePressEvent (QGraphicsSceneMouseEvent *event) override;
+ void mousePressEvent (QGraphicsSceneMouseEvent *event) override;
signals:
void clicked();
diff --git a/examples/widgets/animation/stickman/stickman.h b/examples/widgets/animation/stickman/stickman.h
index b5fbd14872..f2311a0358 100644
--- a/examples/widgets/animation/stickman/stickman.h
+++ b/examples/widgets/animation/stickman/stickman.h
@@ -69,8 +69,8 @@ public:
StickMan();
~StickMan();
- virtual QRectF boundingRect() const override;
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+ QRectF boundingRect() const override;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
int nodeCount() const;
Node *node(int idx) const;
diff --git a/examples/widgets/animation/sub-attaq/boat.h b/examples/widgets/animation/sub-attaq/boat.h
index 24b004a108..a75e2b1474 100644
--- a/examples/widgets/animation/sub-attaq/boat.h
+++ b/examples/widgets/animation/sub-attaq/boat.h
@@ -86,7 +86,7 @@ public:
void updateBoatMovement();
- virtual int type() const override;
+ int type() const override;
signals:
void boatDestroyed();
diff --git a/examples/widgets/animation/sub-attaq/boat_p.h b/examples/widgets/animation/sub-attaq/boat_p.h
index 5cad6bde96..de11ff9555 100644
--- a/examples/widgets/animation/sub-attaq/boat_p.h
+++ b/examples/widgets/animation/sub-attaq/boat_p.h
@@ -81,7 +81,7 @@ public:
{
}
protected:
- virtual bool eventTest(QEvent *event) override
+ bool eventTest(QEvent *event) override
{
if (!QKeyEventTransition::eventTest(event))
return false;
@@ -100,7 +100,7 @@ public:
{
}
protected:
- virtual bool eventTest(QEvent *event) override
+ bool eventTest(QEvent *event) override
{
if (!QKeyEventTransition::eventTest(event))
return false;
@@ -131,7 +131,7 @@ public:
{
}
protected:
- virtual bool eventTest(QEvent *event) override
+ bool eventTest(QEvent *event) override
{
if (!QKeyEventTransition::eventTest(event))
return false;
diff --git a/examples/widgets/animation/sub-attaq/states.h b/examples/widgets/animation/sub-attaq/states.h
index 1d50abbf02..cd68e319c2 100644
--- a/examples/widgets/animation/sub-attaq/states.h
+++ b/examples/widgets/animation/sub-attaq/states.h
@@ -152,7 +152,7 @@ class UpdateScoreTransition : public QSignalTransition
public:
UpdateScoreTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target);
protected:
- virtual bool eventTest(QEvent *event) override;
+ bool eventTest(QEvent *event) override;
private:
PlayState * game;
GraphicsScene *scene;
@@ -164,7 +164,7 @@ class WinTransition : public QSignalTransition
public:
WinTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target);
protected:
- virtual bool eventTest(QEvent *event) override;
+ bool eventTest(QEvent *event) override;
private:
PlayState * game;
GraphicsScene *scene;
@@ -176,7 +176,7 @@ private:
public:
CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key);
protected:
- virtual bool eventTest(QEvent *event) override;
+ bool eventTest(QEvent *event) override;
private:
PlayState *game;
};
diff --git a/examples/widgets/animation/sub-attaq/submarine.h b/examples/widgets/animation/sub-attaq/submarine.h
index abfdca6195..d145c9cbee 100644
--- a/examples/widgets/animation/sub-attaq/submarine.h
+++ b/examples/widgets/animation/sub-attaq/submarine.h
@@ -81,7 +81,7 @@ public:
void launchTorpedo(int speed);
void destroy();
- virtual int type() const override;
+ int type() const override;
QGraphicsRotation *rotation() const { return graphicsRotation; }
diff --git a/examples/widgets/graphicsview/boxes/glbuffers.h b/examples/widgets/graphicsview/boxes/glbuffers.h
index 0c2ff43c7e..0b80c8c4ae 100644
--- a/examples/widgets/graphicsview/boxes/glbuffers.h
+++ b/examples/widgets/graphicsview/boxes/glbuffers.h
@@ -110,8 +110,8 @@ public:
GLTexture2D(int width, int height);
explicit GLTexture2D(const QString& fileName, int width = 0, int height = 0);
void load(int width, int height, QRgb *data);
- virtual void bind() override;
- virtual void unbind() override;
+ void bind() override;
+ void unbind() override;
};
class GLTexture3D : public GLTexture
@@ -121,8 +121,8 @@ public:
// TODO: Implement function below
//GLTexture3D(const QString& fileName, int width = 0, int height = 0);
void load(int width, int height, int depth, QRgb *data);
- virtual void bind() override;
- virtual void unbind() override;
+ void bind() override;
+ void unbind() override;
};
class GLTextureCube : public GLTexture
@@ -131,8 +131,8 @@ public:
GLTextureCube(int size);
explicit GLTextureCube(const QStringList& fileNames, int size = 0);
void load(int size, int face, QRgb *data);
- virtual void bind() override;
- virtual void unbind() override;
+ void bind() override;
+ void unbind() override;
};
// TODO: Define and implement class below
diff --git a/examples/widgets/graphicsview/boxes/qtbox.h b/examples/widgets/graphicsview/boxes/qtbox.h
index e283dccfb4..f8ee9bdb0a 100644
--- a/examples/widgets/graphicsview/boxes/qtbox.h
+++ b/examples/widgets/graphicsview/boxes/qtbox.h
@@ -63,18 +63,18 @@ public:
ItemBase(int size, int x, int y);
virtual ~ItemBase();
- virtual QRectF boundingRect() const override;
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+ QRectF boundingRect() const override;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
protected:
virtual ItemBase *createNew(int size, int x, int y) = 0;
- virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
- virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override;
- virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
- virtual void keyPressEvent(QKeyEvent *event) override;
- virtual void wheelEvent(QGraphicsSceneWheelEvent *event) override;
- virtual int type() const override;
+ void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
+ void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override;
+ void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
+ void keyPressEvent(QKeyEvent *event) override;
+ void wheelEvent(QGraphicsSceneWheelEvent *event) override;
+ int type() const override;
bool isInResizeArea(const QPointF &pos);
static void duplicateSelectedItems(QGraphicsScene *scene);
@@ -92,9 +92,9 @@ class QtBox : public ItemBase
public:
QtBox(int size, int x, int y);
virtual ~QtBox();
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
protected:
- virtual ItemBase *createNew(int size, int x, int y) override;
+ ItemBase *createNew(int size, int x, int y) override;
private:
QVector3D m_vertices[8];
QVector3D m_texCoords[4];
@@ -106,9 +106,9 @@ class CircleItem : public ItemBase
{
public:
CircleItem(int size, int x, int y);
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
protected:
- virtual ItemBase *createNew(int size, int x, int y) override;
+ ItemBase *createNew(int size, int x, int y) override;
QColor m_color;
};
@@ -117,9 +117,9 @@ class SquareItem : public ItemBase
{
public:
SquareItem(int size, int x, int y);
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
protected:
- virtual ItemBase *createNew(int size, int x, int y) override;
+ ItemBase *createNew(int size, int x, int y) override;
QPixmap m_image;
};
diff --git a/examples/widgets/graphicsview/boxes/scene.h b/examples/widgets/graphicsview/boxes/scene.h
index b76fb1057c..3f367a8dce 100644
--- a/examples/widgets/graphicsview/boxes/scene.h
+++ b/examples/widgets/graphicsview/boxes/scene.h
@@ -87,7 +87,7 @@ public slots:
signals:
void colorChanged(QRgb color, int id);
protected:
- virtual void mousePressEvent(QMouseEvent *event) override;
+ void mousePressEvent(QMouseEvent *event) override;
void setColor(QRgb color); // also emits colorChanged()
private:
QGraphicsScene *m_dialogParentScene;
@@ -120,9 +120,9 @@ class GraphicsWidget : public QGraphicsProxyWidget
public:
GraphicsWidget() : QGraphicsProxyWidget(0, Qt::Window) {}
protected:
- virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
- virtual void resizeEvent(QGraphicsSceneResizeEvent *event) override;
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+ QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
+ void resizeEvent(QGraphicsSceneResizeEvent *event) override;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
};
class TwoSidedGraphicsWidget : public QObject
@@ -162,7 +162,7 @@ signals:
void shaderChanged(int);
void doubleClicked();
protected:
- virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
+ void mouseDoubleClickEvent(QMouseEvent *event) override;
QVector<QByteArray> m_parameterNames;
QComboBox *m_textureCombo;
@@ -189,7 +189,7 @@ signals:
void doubleClicked();
void newItemTriggered(ItemDialog::ItemType type);
protected:
- virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
+ void mouseDoubleClickEvent(QMouseEvent *event) override;
};
class Scene : public QGraphicsScene
@@ -198,7 +198,7 @@ class Scene : public QGraphicsScene
public:
Scene(int width, int height, int maxTextureSize);
~Scene();
- virtual void drawBackground(QPainter *painter, const QRectF &rect) override;
+ void drawBackground(QPainter *painter, const QRectF &rect) override;
public slots:
void setShader(int index);
@@ -214,10 +214,10 @@ protected:
void defaultStates();
void renderCubemaps();
- virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
- virtual void wheelEvent(QGraphicsSceneWheelEvent * event) override;
+ void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
+ void wheelEvent(QGraphicsSceneWheelEvent * event) override;
private:
void initGL();
QPointF pixelPosToViewPos(const QPointF& p);
diff --git a/examples/widgets/graphicsview/chip/view.cpp b/examples/widgets/graphicsview/chip/view.cpp
index 7a26227628..62aa25b575 100644
--- a/examples/widgets/graphicsview/chip/view.cpp
+++ b/examples/widgets/graphicsview/chip/view.cpp
@@ -50,10 +50,8 @@
#include "view.h"
-#ifndef QT_NO_PRINTER
#include <QPrinter>
#include <QPrintDialog>
-#endif
#ifndef QT_NO_OPENGL
#include <QtOpenGL>
#else
diff --git a/examples/widgets/graphicsview/dragdroprobot/main.cpp b/examples/widgets/graphicsview/dragdroprobot/main.cpp
index ff3758ac60..20cec92d26 100644
--- a/examples/widgets/graphicsview/dragdroprobot/main.cpp
+++ b/examples/widgets/graphicsview/dragdroprobot/main.cpp
@@ -63,7 +63,7 @@ public:
}
protected:
- virtual void resizeEvent(QResizeEvent *) override
+ void resizeEvent(QResizeEvent *) override
{
}
};
diff --git a/examples/widgets/graphicsview/weatheranchorlayout/main.cpp b/examples/widgets/graphicsview/weatheranchorlayout/main.cpp
index ec1f73bf9c..81db2780b4 100644
--- a/examples/widgets/graphicsview/weatheranchorlayout/main.cpp
+++ b/examples/widgets/graphicsview/weatheranchorlayout/main.cpp
@@ -69,7 +69,7 @@ public:
{
}
- virtual void resizeEvent(QResizeEvent *event) override
+ void resizeEvent(QResizeEvent *event) override
{
w->setGeometry(0, 0, event->size().width(), event->size().height());
}
diff --git a/examples/widgets/itemviews/frozencolumn/freezetablewidget.h b/examples/widgets/itemviews/frozencolumn/freezetablewidget.h
index 51c46fb7e7..69a90dab54 100644
--- a/examples/widgets/itemviews/frozencolumn/freezetablewidget.h
+++ b/examples/widgets/itemviews/frozencolumn/freezetablewidget.h
@@ -63,8 +63,8 @@ public:
protected:
- virtual void resizeEvent(QResizeEvent *event) override;
- virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override;
+ void resizeEvent(QResizeEvent *event) override;
+ QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override;
void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible) override;
private:
diff --git a/examples/widgets/painting/fontsampler/mainwindow.cpp b/examples/widgets/painting/fontsampler/mainwindow.cpp
index 33d560edf3..06ffac3728 100644
--- a/examples/widgets/painting/fontsampler/mainwindow.cpp
+++ b/examples/widgets/painting/fontsampler/mainwindow.cpp
@@ -49,11 +49,7 @@
****************************************************************************/
#include <QtWidgets>
-#ifndef QT_NO_PRINTER
-#include <QPrinter>
-#include <QPrintDialog>
#include <QPrintPreviewDialog>
-#endif
#include "mainwindow.h"
diff --git a/examples/widgets/painting/fontsampler/mainwindow.h b/examples/widgets/painting/fontsampler/mainwindow.h
index f39e1b1916..ada0d47354 100644
--- a/examples/widgets/painting/fontsampler/mainwindow.h
+++ b/examples/widgets/painting/fontsampler/mainwindow.h
@@ -52,6 +52,8 @@
#define MAINWINDOW_H
#include "ui_mainwindowbase.h"
+#include <QPrinter>
+#include <QPrintDialog>
QT_BEGIN_NAMESPACE
class QPrinter;
diff --git a/examples/widgets/richtext/textedit/textedit.h b/examples/widgets/richtext/textedit/textedit.h
index e5f04e706c..ae0b13a4cc 100644
--- a/examples/widgets/richtext/textedit/textedit.h
+++ b/examples/widgets/richtext/textedit/textedit.h
@@ -78,7 +78,7 @@ public slots:
void fileNew();
protected:
- virtual void closeEvent(QCloseEvent *e) override;
+ void closeEvent(QCloseEvent *e) override;
private slots:
void fileOpen();
diff --git a/examples/widgets/statemachine/factorial/main.cpp b/examples/widgets/statemachine/factorial/main.cpp
index d0d61cb7df..919988051f 100644
--- a/examples/widgets/statemachine/factorial/main.cpp
+++ b/examples/widgets/statemachine/factorial/main.cpp
@@ -103,7 +103,7 @@ public:
: QSignalTransition(fact, SIGNAL(xChanged(int))), m_fact(fact)
{}
- virtual bool eventTest(QEvent *e) override
+ bool eventTest(QEvent *e) override
{
if (!QSignalTransition::eventTest(e))
return false;
@@ -111,7 +111,7 @@ public:
return se->arguments().at(0).toInt() > 1;
}
- virtual void onTransition(QEvent *e) override
+ void onTransition(QEvent *e) override
{
QStateMachine::SignalEvent *se = static_cast<QStateMachine::SignalEvent*>(e);
int x = se->arguments().at(0).toInt();
@@ -133,7 +133,7 @@ public:
: QSignalTransition(fact, SIGNAL(xChanged(int))), m_fact(fact)
{}
- virtual bool eventTest(QEvent *e) override
+ bool eventTest(QEvent *e) override
{
if (!QSignalTransition::eventTest(e))
return false;
@@ -141,7 +141,7 @@ public:
return se->arguments().at(0).toInt() <= 1;
}
- virtual void onTransition(QEvent *) override
+ void onTransition(QEvent *) override
{
fprintf(stdout, "%d\n", m_fact->property("fac").toInt());
}
diff --git a/examples/widgets/statemachine/pingpong/main.cpp b/examples/widgets/statemachine/pingpong/main.cpp
index 8c3b9f674b..354f1d245b 100644
--- a/examples/widgets/statemachine/pingpong/main.cpp
+++ b/examples/widgets/statemachine/pingpong/main.cpp
@@ -75,7 +75,7 @@ public:
: QState(parent) {}
protected:
- virtual void onEntry(QEvent *) override
+ void onEntry(QEvent *) override
{
machine()->postEvent(new PingEvent());
fprintf(stdout, "ping?\n");
@@ -93,7 +93,7 @@ protected:
virtual bool eventTest(QEvent *e) override {
return (e->type() == QEvent::User+3);
}
- virtual void onTransition(QEvent *) override
+ void onTransition(QEvent *) override
{
machine()->postDelayedEvent(new PingEvent(), 500);
fprintf(stdout, "ping?\n");
@@ -111,7 +111,7 @@ protected:
virtual bool eventTest(QEvent *e) override {
return (e->type() == QEvent::User+2);
}
- virtual void onTransition(QEvent *) override
+ void onTransition(QEvent *) override
{
machine()->postDelayedEvent(new PongEvent(), 500);
fprintf(stdout, "pong!\n");
diff --git a/examples/widgets/statemachine/trafficlight/main.cpp b/examples/widgets/statemachine/trafficlight/main.cpp
index 143f2a9324..21df91d8b0 100644
--- a/examples/widgets/statemachine/trafficlight/main.cpp
+++ b/examples/widgets/statemachine/trafficlight/main.cpp
@@ -74,7 +74,7 @@ public slots:
void turnOn() { setOn(true); }
protected:
- virtual void paintEvent(QPaintEvent *) override
+ void paintEvent(QPaintEvent *) override
{
if (!m_on)
return;
diff --git a/mkspecs/android-clang/qmake.conf b/mkspecs/android-clang/qmake.conf
index b25a4399f3..3e621c7d77 100644
--- a/mkspecs/android-clang/qmake.conf
+++ b/mkspecs/android-clang/qmake.conf
@@ -1,4 +1,4 @@
-# qmake configuration for building with android-g++
+# qmake configuration for building with android-clang
MAKEFILE_GENERATOR = UNIX
QMAKE_PLATFORM = android
QMAKE_COMPILER = gcc clang llvm
@@ -6,6 +6,7 @@ QMAKE_COMPILER = gcc clang llvm
CONFIG += android_install unversioned_soname unversioned_libname plugin_with_soname android_deployment_settings
include(../common/linux.conf)
+include(../common/gcc-base-unix.conf)
include(../common/clang.conf)
include(../common/android-base-head.conf)
diff --git a/mkspecs/features/moc.prf b/mkspecs/features/moc.prf
index 59ed81b49e..dc14d71db7 100644
--- a/mkspecs/features/moc.prf
+++ b/mkspecs/features/moc.prf
@@ -32,7 +32,8 @@ if(gcc|intel_icl|msvc):!rim_qcc:!uikit {
gcc: moc_predefs.commands = $$QMAKE_CXX $$QMAKE_CXXFLAGS -dM -E -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
else:intel_icl: moc_predefs.commands = $$QMAKE_CXX $$QMAKE_CXXFLAGS -QdM -P -Fi${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
else:msvc {
- moc_predefs.commands += $$QMAKE_CXX -Bx$$QMAKE_QMAKE $$QMAKE_CXXFLAGS -E ${QMAKE_FILE_IN} 2>NUL >${QMAKE_FILE_OUT}
+ moc_predefs.commands += $$QMAKE_CXX -Bx$$shell_quote($$shell_path($$QMAKE_QMAKE)) $$QMAKE_CXXFLAGS \
+ -E ${QMAKE_FILE_IN} 2>NUL >${QMAKE_FILE_OUT}
} else: error("Oops, I messed up")
moc_predefs.output = $$MOC_DIR/moc_predefs.h
moc_predefs.input = MOC_PREDEF_FILE
diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf
index 9bf0d2fad3..98f794c485 100644
--- a/mkspecs/features/qt.prf
+++ b/mkspecs/features/qt.prf
@@ -194,13 +194,8 @@ qt_module_deps = $$resolve_depends(qt_module_deps, "QT.")
# static builds: link qml import plugins into the app.
contains(qt_module_deps, qml): \
qtConfig(static):contains(TEMPLATE, .*app):!host_build:!no_import_scan {
- !isEmpty(QTREPOS) {
- for (qrep, QTREPOS): \
- exists($$qrep/qml): \
- QMLPATHS += $$qrep/qml
- } else {
- QMLPATHS += $$[QT_INSTALL_QML/get]
- }
+ exists($$[QT_INSTALL_QML/get]): \
+ QMLPATHS *= $$[QT_INSTALL_QML/get]
# run qmlimportscanner
qtPrepareTool(QMLIMPORTSCANNER, qmlimportscanner, , system)
diff --git a/mkspecs/features/qt_app.prf b/mkspecs/features/qt_app.prf
index 87e32d6d42..cb84ae0da8 100644
--- a/mkspecs/features/qt_app.prf
+++ b/mkspecs/features/qt_app.prf
@@ -37,6 +37,8 @@ INSTALLS += target
load(qt_targets)
load(qt_common)
+qtSetQmlPath()
+
no_launch_target: return()
load(resolve_target)
diff --git a/mkspecs/features/qt_build_config.prf b/mkspecs/features/qt_build_config.prf
index 95e63ecae0..3762c14f98 100644
--- a/mkspecs/features/qt_build_config.prf
+++ b/mkspecs/features/qt_build_config.prf
@@ -52,6 +52,22 @@ QMAKE_DIR_REPLACE_SANE = PRECOMPILED_DIR OBJECTS_DIR MOC_DIR RCC_DIR UI_DIR
unset(modpath)
}
+defineTest(qtSetQmlPath) {
+ !qtConfig(static)|host_build|no_import_scan: \
+ return()
+ deps = $$replace(QT, -private$, _private)
+ deps = $$resolve_depends(deps, "QT.")
+ !contains(deps, qml): \
+ return()
+
+ isEmpty(QTREPOS): \
+ QTREPOS = $$shadowed($$dirname(_QMAKE_CONF_))
+ for (qrep, QTREPOS): \
+ exists($$qrep/qml): \
+ QMLPATHS += $$qrep/qml
+ export(QMLPATHS)
+}
+
# Apply extra compiler flags passed via configure last.
CONFIG = qt_build_extra $$CONFIG
diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf
index 289e2250bd..eaaa161270 100644
--- a/mkspecs/features/qt_configure.prf
+++ b/mkspecs/features/qt_configure.prf
@@ -22,7 +22,7 @@ defineTest(qtConfAddWarning) {
defineTest(qtConfAddError) {
QT_CONFIGURE_ERRORS += "ERROR: $$join(1, $$escape_expand(\\n))"
export(QT_CONFIGURE_ERRORS)
- equals(2, log) {
+ equals(2, log):qt_conf_tests_allowed {
CONFIG += mention_config_log
export(CONFIG)
}
diff --git a/mkspecs/features/qt_example_installs.prf b/mkspecs/features/qt_example_installs.prf
index 4c68cfd72f..0a008374e5 100644
--- a/mkspecs/features/qt_example_installs.prf
+++ b/mkspecs/features/qt_example_installs.prf
@@ -9,6 +9,9 @@
# We mean it.
#
+contains(TEMPLATE, .*app): \
+ qtSetQmlPath()
+
contains(TEMPLATE, "vc.*"): return()
defineTest(addInstallFiles) {
diff --git a/mkspecs/win32-msvc2017/qmake.conf b/mkspecs/win32-msvc2017/qmake.conf
new file mode 100644
index 0000000000..b8351eb3fe
--- /dev/null
+++ b/mkspecs/win32-msvc2017/qmake.conf
@@ -0,0 +1,10 @@
+#
+# qmake configuration for win32-msvc2017
+#
+# Written for Microsoft Visual C++ 2017
+#
+
+MSC_VER = 1910
+MSVC_VER = 15.0
+include(../common/msvc-desktop.conf)
+load(qt_config)
diff --git a/mkspecs/win32-msvc2017/qplatformdefs.h b/mkspecs/win32-msvc2017/qplatformdefs.h
new file mode 100644
index 0000000000..7100e3aa41
--- /dev/null
+++ b/mkspecs/win32-msvc2017/qplatformdefs.h
@@ -0,0 +1,34 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the qmake spec of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../win32-msvc2005/qplatformdefs.h"
diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index 320979150f..808a6d8233 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -20,7 +20,7 @@ QOBJS=qtextcodec.o qutfcodec.o qstring.o qstring_compat.o qstringbuilder.o qtext
qvariant.o qvsnprintf.o qlocale.o qlocale_tools.o qlinkedlist.o qnumeric.o \
qcryptographichash.o qxmlstream.o qxmlutils.o qlogging.o \
qjson.o qjsondocument.o qjsonparser.o qjsonarray.o qjsonobject.o qjsonvalue.o \
- $(QTOBJS)
+ $(QTOBJS) $(QTOBJS2)
#all sources, used for the depend target
@@ -92,11 +92,11 @@ DEPEND_SRC = \
$(SOURCE_PATH)/src/corelib/json/qjsonarray.cpp \
$(SOURCE_PATH)/src/corelib/json/qjsonobject.cpp \
$(SOURCE_PATH)/src/corelib/json/qjsonvalue.cpp \
- $(QTSRCS)
+ $(QTSRCS) $(QTSRCS2)
CPPFLAGS = -g $(EXTRA_CPPFLAGS) \
-I$(QMKSRC) -I$(QMKLIBSRC) -I$(QMKSRC)/generators -I$(QMKSRC)/generators/unix -I$(QMKSRC)/generators/win32 \
- -I$(QMKSRC)/generators/mac -I$(QMKSRC)/generators/integrity \
+ -I$(QMKSRC)/generators/mac \
-I$(INC_PATH) -I$(INC_PATH)/QtCore \
-I$(INC_PATH)/QtCore/$(QT_VERSION) -I$(INC_PATH)/QtCore/$(QT_VERSION)/QtCore \
-I$(BUILD_PATH)/src/corelib/global \
@@ -106,7 +106,8 @@ CPPFLAGS = -g $(EXTRA_CPPFLAGS) \
-DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DPROEVALUATOR_FULL \
-DQT_NO_FOREACH
-CXXFLAGS = $(EXTRA_CXXFLAGS) $(CPPFLAGS)
+CXXFLAGS = $(EXTRA_CXXFLAGS) $(CONFIG_CXXFLAGS) $(CPPFLAGS)
+LFLAGS = $(EXTRA_LFLAGS) $(CONFIG_LFLAGS)
first all: $(BUILD_PATH)/bin/qmake$(EXEEXT)
qmake: $(BUILD_PATH)/bin/qmake$(EXEEXT)
diff --git a/qmake/Makefile.unix.macos b/qmake/Makefile.unix.macos
new file mode 100644
index 0000000000..06b875a84a
--- /dev/null
+++ b/qmake/Makefile.unix.macos
@@ -0,0 +1,17 @@
+COCOA_LFLAGS = -framework Foundation -framework CoreServices
+CARBON_LFLAGS = -framework ApplicationServices
+CARBON_CFLAGS = -fconstant-cfstrings
+
+EXTRA_CXXFLAGS = $(CARBON_CFLAGS)
+EXTRA_LFLAGS = $(COCOA_LFLAGS) $(CARBON_LFLAGS)
+
+QTOBJS2 = \
+ qsettings_mac.o \
+ qcore_mac.o \
+ qcore_mac_objc.o \
+ qcore_foundation.o
+QTSRCS2 = \
+ $(SOURCE_PATH)/src/corelib/io/qsettings_mac.cpp \
+ $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp \
+ $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm \
+ $(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm
diff --git a/qmake/Makefile.unix.mingw b/qmake/Makefile.unix.mingw
new file mode 100644
index 0000000000..2c52c07dca
--- /dev/null
+++ b/qmake/Makefile.unix.mingw
@@ -0,0 +1,27 @@
+# SHELL is the full path of sh.exe, unless
+# 1) it is found in the current directory
+# 2) it is not found at all
+# 3) it is overridden on the command line with an existing file
+# ... otherwise it is always sh.exe. Specifically, SHELL from the
+# environment has no effect.
+#
+# This check will fail if SHELL is explicitly set to a not
+# sh-compatible shell. This is not a problem, because configure.bat
+# will not do that.
+ifeq ($(SHELL), sh.exe)
+ ifeq ($(wildcard $(CURDIR)/sh.exe), )
+ SH = 0
+ else
+ SH = 1
+ endif
+else
+ SH = 1
+endif
+
+ifeq ($(SH), 1)
+ RM_F = rm -f
+ RM_RF = rm -rf
+else
+ RM_F = del /f
+ RM_RF = rmdir /s /q
+endif
diff --git a/qmake/Makefile.unix.unix b/qmake/Makefile.unix.unix
new file mode 100644
index 0000000000..63eba4f5a5
--- /dev/null
+++ b/qmake/Makefile.unix.unix
@@ -0,0 +1,11 @@
+EXEEXT =
+QTOBJS = \
+ qfilesystemengine_unix.o \
+ qfilesystemiterator_unix.o \
+ qfsfileengine_unix.o \
+ qlocale_unix.o
+QTSRCS = \
+ $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_unix.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_unix.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp \
+ $(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp
diff --git a/qmake/Makefile.unix.win32 b/qmake/Makefile.unix.win32
new file mode 100644
index 0000000000..be7245a370
--- /dev/null
+++ b/qmake/Makefile.unix.win32
@@ -0,0 +1,19 @@
+EXEEXT = .exe
+EXTRA_CXXFLAGS = -DUNICODE
+EXTRA_LFLAGS = -static -s -lole32 -luuid -ladvapi32 -lkernel32
+QTOBJS = \
+ qfilesystemengine_win.o \
+ qfilesystemiterator_win.o \
+ qfsfileengine_win.o \
+ qlocale_win.o \
+ qsettings_win.o \
+ qsystemlibrary.o \
+ registry.o
+QTSRCS = \
+ $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qsettings_win.cpp \
+ $(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp \
+ $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp \
+ $(SOURCE_PATH)/tools/shared/windows/registry.cpp
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index 3e67632939..cd2cdd9c40 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -23,7 +23,7 @@ CXX = cl
LINKER = link
! if "$(QMAKESPEC)" == "win32-msvc2013"
CFLAGS_EXTRA = /MP /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS $(CFLAGS_CRT)
-! elseif "$(QMAKESPEC)" == "win32-msvc2015" || "$(QMAKESPEC)" == "win32-clang-msvc2015"
+! elseif "$(QMAKESPEC)" == "win32-msvc2015" || "$(QMAKESPEC)" == "win32-msvc2017" || "$(QMAKESPEC)" == "win32-clang-msvc2015"
CFLAGS_EXTRA = /MP /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /Zc:strictStrings /w44456 /w44457 /w44458 /wd4577 $(CFLAGS_CRT)
! else
! error Unsupported compiler for this Makefile
@@ -38,7 +38,7 @@ PCH_OBJECT = qmake_pch.obj
CFLAGS_BARE = -c -Fo./ -Fdqmake.pdb \
-W3 -nologo -O1 \
$(CFLAGS_EXTRA) \
- -I$(QMKSRC) -I$(QMKSRC)\library -I$(QMKSRC)\generators -I$(QMKSRC)\generators\unix -I$(QMKSRC)\generators\win32 -I$(QMKSRC)\generators\mac -I$(QMKSRC)\generators\integrity \
+ -I$(QMKSRC) -I$(QMKSRC)\library -I$(QMKSRC)\generators -I$(QMKSRC)\generators\unix -I$(QMKSRC)\generators\win32 -I$(QMKSRC)\generators\mac \
-I$(INC_PATH) -I$(INC_PATH)\QtCore -I$(INC_PATH)\QtCore\$(QT_VERSION) -I$(INC_PATH)\QtCore\$(QT_VERSION)\QtCore \
-I$(BUILD_PATH)\src\corelib\global \
-I$(SOURCE_PATH)\mkspecs\$(QMAKESPEC) \
@@ -147,18 +147,9 @@ distclean:: clean
-del $(BUILD_PATH)\bin\qmake.exe
-del Makefile
-.c.obj:
- $(CXX) $(CFLAGS) $<
-
.cpp.obj:
$(CXX) $(CXXFLAGS) $<
-.cc.obj:
- $(CXX) $(CXXFLAGS) $<
-
-.cxx.obj:
- $(CXX) $(CXXFLAGS) $<
-
$(OBJS): $(PCH_OBJECT)
$(QTOBJS): $(PCH_OBJECT)
@@ -174,9 +165,6 @@ qmake_pch.obj:
{$(SOURCE_PATH)\qmake\generators\mac}.cpp{}.obj::
$(CXX) $(CXXFLAGS) $<
-{$(SOURCE_PATH)\qmake\generators\integrity}.cpp{}.obj::
- $(CXX) $(CXXFLAGS) $<
-
{$(SOURCE_PATH)\qmake\generators\unix}.cpp{}.obj::
$(CXX) $(CXXFLAGS) $<
diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc
index aa6c8b35cc..c3c878ebb8 100644
--- a/qmake/doc/src/qmake-manual.qdoc
+++ b/qmake/doc/src/qmake-manual.qdoc
@@ -2057,6 +2057,12 @@
value of this variable is typically handled by qmake or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+ \section1 QMAKE_OBJECTIVE_CFLAGS
+
+ Specifies the Objective C/C++ compiler flags for building
+ a project. These flags are used in addition to QMAKE_CFLAGS and
+ QMAKE_CXXFLAGS.
+
\section1 QMAKE_POST_LINK
Specifies the command to execute after linking the \l{TARGET}
diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp
index 382b10c37b..e3d76cd76e 100644
--- a/qmake/generators/win32/mingw_make.cpp
+++ b/qmake/generators/win32/mingw_make.cpp
@@ -308,7 +308,12 @@ void MingwMakefileGenerator::writeBuildRulesPart(QTextStream &t)
{
t << "first: all\n";
t << "all: " << escapeDependencyPath(fileFixify(Option::output.fileName()))
- << ' ' << depVar("ALL_DEPS") << " $(DESTDIR_TARGET)\n\n";
+ << ' ' << depVar("ALL_DEPS");
+ if (project->first("TEMPLATE") == "aux") {
+ t << "\n\n";
+ return;
+ }
+ t << " $(DESTDIR_TARGET)\n\n";
t << "$(DESTDIR_TARGET): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS");
if(!project->isEmpty("QMAKE_PRE_LINK"))
t << "\n\t" <<var("QMAKE_PRE_LINK");
@@ -318,7 +323,7 @@ void MingwMakefileGenerator::writeBuildRulesPart(QTextStream &t)
} else {
t << "\n\t" << objectsLinkLine << " " ;
}
- } else if (project->first("TEMPLATE") != "aux") {
+ } else {
t << "\n\t$(LINKER) $(LFLAGS) " << var("QMAKE_LINK_O_FLAG") << "$(DESTDIR_TARGET) " << objectsLinkLine << " $(LIBS)";
}
if(!project->isEmpty("QMAKE_POST_LINK"))
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp
index 1739f66453..3a4f6242b2 100644
--- a/qmake/generators/win32/msvc_nmake.cpp
+++ b/qmake/generators/win32/msvc_nmake.cpp
@@ -517,7 +517,12 @@ void NmakeMakefileGenerator::writeBuildRulesPart(QTextStream &t)
t << "first: all\n";
t << "all: " << escapeDependencyPath(fileFixify(Option::output.fileName()))
- << ' ' << depVar("ALL_DEPS") << " $(DESTDIR_TARGET)\n\n";
+ << ' ' << depVar("ALL_DEPS");
+ if (templateName == "aux") {
+ t << "\n\n";
+ return;
+ }
+ t << " $(DESTDIR_TARGET)\n\n";
t << "$(DESTDIR_TARGET): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS");
if(!project->isEmpty("QMAKE_PRE_LINK"))
@@ -526,7 +531,7 @@ void NmakeMakefileGenerator::writeBuildRulesPart(QTextStream &t)
t << "\n\t$(LIBAPP) $(LIBFLAGS) " << var("QMAKE_LINK_O_FLAG") << "$(DESTDIR_TARGET) @<<\n\t "
<< "$(OBJECTS)"
<< "\n<<";
- } else if (templateName != "aux") {
+ } else {
const bool embedManifest = ((templateName == "app" && project->isActiveConfig("embed_manifest_exe"))
|| (templateName == "lib" && project->isActiveConfig("embed_manifest_dll")
&& !(project->isActiveConfig("plugin") && project->isActiveConfig("no_plugin_manifest"))
diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h
index a744804760..e97996120f 100644
--- a/qmake/generators/win32/msvc_objectmodel.h
+++ b/qmake/generators/win32/msvc_objectmodel.h
@@ -52,7 +52,8 @@ enum DotNET {
NET2010 = 0xa0,
NET2012 = 0xb0,
NET2013 = 0xc0,
- NET2015 = 0xd0
+ NET2015 = 0xd0,
+ NET2017 = 0xe0
};
/*
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index cb44937bea..7b3d7fd160 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -64,6 +64,7 @@ struct DotNetCombo {
const char *versionStr;
const char *regKey;
} dotNetCombo[] = {
+ {NET2017, "MSVC.NET 2017 (15.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\15.0"},
{NET2015, "MSVC.NET 2015 (14.0)", "Software\\Microsoft\\VisualStudio\\14.0\\Setup\\VC\\ProductDir"},
{NET2013, "MSVC.NET 2013 (12.0)", "Software\\Microsoft\\VisualStudio\\12.0\\Setup\\VC\\ProductDir"},
{NET2013, "MSVC.NET 2013 Express Edition (12.0)", "Software\\Microsoft\\VCExpress\\12.0\\Setup\\VC\\ProductDir"},
@@ -158,6 +159,8 @@ const char _slnHeader120[] = "Microsoft Visual Studio Solution File, Format
"\n# Visual Studio 2013";
const char _slnHeader140[] = "Microsoft Visual Studio Solution File, Format Version 12.00"
"\n# Visual Studio 2015";
+const char _slnHeader141[] = "Microsoft Visual Studio Solution File, Format Version 12.00"
+ "\n# Visual Studio 2017";
// The following UUID _may_ change for later servicepacks...
// If so we need to search through the registry at
// HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Projects
@@ -386,6 +389,8 @@ QString VcprojGenerator::retrievePlatformToolSet() const
return QStringLiteral("v120") + suffix;
case NET2015:
return QStringLiteral("v140") + suffix;
+ case NET2017:
+ return QStringLiteral("v141") + suffix;
default:
return QString();
}
@@ -613,6 +618,9 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
}
switch (which_dotnet_version(project->first("MSVC_VER").toLatin1())) {
+ case NET2017:
+ t << _slnHeader141;
+ break;
case NET2015:
t << _slnHeader140;
break;
@@ -934,6 +942,9 @@ void VcprojGenerator::initProject()
// Own elements -----------------------------
vcProject.Name = project->first("QMAKE_ORIG_TARGET").toQString();
switch (which_dotnet_version(project->first("MSVC_VER").toLatin1())) {
+ case NET2017:
+ vcProject.Version = "15.00";
+ break;
case NET2015:
vcProject.Version = "14.00";
break;
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index af9fe520f1..48df4ff916 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -568,16 +568,18 @@ void Win32MakefileGenerator::writeStandardParts(QTextStream &t)
t << "####### Build rules\n\n";
writeBuildRulesPart(t);
- if(project->isActiveConfig("shared") && !project->values("DLLDESTDIR").isEmpty()) {
- const ProStringList &dlldirs = project->values("DLLDESTDIR");
- for (ProStringList::ConstIterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir) {
- t << "\t-$(COPY_FILE) $(DESTDIR_TARGET) "
- << escapeFilePath(Option::fixPathToTargetOS((*dlldir).toQString(), false)) << endl;
+ if (project->first("TEMPLATE") != "aux") {
+ if (project->isActiveConfig("shared") && !project->values("DLLDESTDIR").isEmpty()) {
+ const ProStringList &dlldirs = project->values("DLLDESTDIR");
+ for (ProStringList::ConstIterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir) {
+ t << "\t-$(COPY_FILE) $(DESTDIR_TARGET) "
+ << escapeFilePath(Option::fixPathToTargetOS((*dlldir).toQString(), false)) << endl;
+ }
}
- }
- t << endl;
+ t << endl;
- writeRcFilePart(t);
+ writeRcFilePart(t);
+ }
writeMakeQmake(t);
@@ -601,8 +603,10 @@ void Win32MakefileGenerator::writeStandardParts(QTextStream &t)
const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS");
for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) {
const ProStringList &inputs = project->values(ProKey(*it + ".input"));
- for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input)
- t << escapeFilePath(*input) << ' ';
+ for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) {
+ const ProStringList &val = project->values((*input).toKey());
+ t << escapeFilePaths(val).join(' ') << ' ';
+ }
}
}
t << endl << endl;
diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp
index 338131d06b..017fc3434c 100644
--- a/qmake/library/qmakeevaluator.cpp
+++ b/qmake/library/qmakeevaluator.cpp
@@ -971,6 +971,13 @@ static ProString msvcBinDirToQMakeArch(QString subdir)
subdir = subdir.toLower();
if (subdir == QLatin1String("amd64"))
return ProString("x86_64");
+ // Since 2017 the folder structure from here is HostX64|X86/x64|x86
+ idx = subdir.indexOf(QLatin1Char('\\'));
+ if (idx == -1)
+ return ProString("x86");
+ subdir.remove(0, idx + 1);
+ if (subdir == QLatin1String("x64"))
+ return ProString("x86_64");
return ProString(subdir);
}
@@ -1065,8 +1072,12 @@ void QMakeEvaluator::loadDefaults()
vars[ProKey("QMAKE_HOST.arch")] << archStr;
# if defined(Q_CC_MSVC) // ### bogus condition, but nobody x-builds for msvc with a different qmake
+ // Since VS 2017 we need VCToolsInstallDir instead of VCINSTALLDIR
+ QString vcInstallDir = m_option->getEnv(QLatin1String("VCToolsInstallDir"));
+ if (vcInstallDir.isEmpty())
+ vcInstallDir = m_option->getEnv(QLatin1String("VCINSTALLDIR"));
vars[ProKey("QMAKE_TARGET.arch")] = msvcArchitecture(
- m_option->getEnv(QLatin1String("VCINSTALLDIR")),
+ vcInstallDir,
m_option->getEnv(QLatin1String("PATH")));
# endif
#elif defined(Q_OS_UNIX)
diff --git a/qmake/qmake.pro b/qmake/qmake.pro
index 74cefb07aa..1472aef3e4 100644
--- a/qmake/qmake.pro
+++ b/qmake/qmake.pro
@@ -27,7 +27,6 @@ INCLUDEPATH += . \
generators/unix \
generators/win32 \
generators/mac \
- generators/integrity \
../tools/shared
include(qmake.pri)
diff --git a/src/3rdparty/angle/qt_attribution.json b/src/3rdparty/angle/qt_attribution.json
index 230f30940b..e35e1f0eb9 100644
--- a/src/3rdparty/angle/qt_attribution.json
+++ b/src/3rdparty/angle/qt_attribution.json
@@ -12,7 +12,7 @@
},
{
"Id": "angle-arrayboundsclamper",
- "Name": "ANGLE Array Bounds Clamper for WebKit",
+ "Name": "ANGLE: Array Bounds Clamper for WebKit",
"QDocModule": "qtgui",
"QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.",
@@ -25,7 +25,7 @@
},
{
"Id": "angle-murmurhash",
- "Name": "Murmurhash (as part of ANGLE)",
+ "Name": "ANGLE: Murmurhash",
"QDocModule": "qtgui",
"QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.",
@@ -36,7 +36,7 @@
},
{
"Id": "angle-systeminfo",
- "Name": "Systeminfo (as part of ANGLE)",
+ "Name": "ANGLE: Systeminfo",
"QDocModule": "qtgui",
"QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.",
@@ -48,7 +48,7 @@
},
{
"Id": "angle-trace_event",
- "Name": "trace_event (as part of ANGLE)",
+ "Name": "ANGLE: trace_event",
"QDocModule": "qtgui",
"QtUsage": "Used on Windows to implement OpenGL ES on top of DirectX. Configure with -no-opengl, or -opengl desktop to exclude.",
diff --git a/src/3rdparty/forkfd/LICENSE b/src/3rdparty/forkfd/LICENSE
index 351ebf705d..36ab612951 100644
--- a/src/3rdparty/forkfd/LICENSE
+++ b/src/3rdparty/forkfd/LICENSE
@@ -1,4 +1,5 @@
Copyright (C) 2016 Intel Corporation.
+Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/src/3rdparty/forkfd/qt_attribution.json b/src/3rdparty/forkfd/qt_attribution.json
index 89f25f4870..f004116753 100644
--- a/src/3rdparty/forkfd/qt_attribution.json
+++ b/src/3rdparty/forkfd/qt_attribution.json
@@ -7,6 +7,6 @@
"License": "MIT License",
"LicenseId": "MIT",
"LicenseFile": "LICENSE",
- "Copyright": "Copyright (C) 2013-2016 Intel Corporation
+ "Copyright": "Copyright (C) 2016 Intel Corporation
Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com"
}
diff --git a/src/3rdparty/freebsd/qt_attribution.json b/src/3rdparty/freebsd/qt_attribution.json
index 40c337cc67..57f425cdbc 100644
--- a/src/3rdparty/freebsd/qt_attribution.json
+++ b/src/3rdparty/freebsd/qt_attribution.json
@@ -4,14 +4,10 @@
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core.",
+ "Description": "strtoll() and strtoull() are functions for converting a string to (unsigned) long long integer.",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseId": "BSD-3-Clause",
"LicenseFile": "LICENSE",
- "Copyright": "Copyright (c) 1992, 1993
- The Regents of the University of California. All rights reserved.
-
-Copyright (c) 2011 The FreeBSD Foundation
-All rights reserved.
-Portions of this software were developed by David Chisnall
-under sponsorship from the FreeBSD Foundation."
+ "Copyright": "Copyright (c) 1992, 1993 The Regents of the University of California.
+Copyright (c) 2011 The FreeBSD Foundation"
}
diff --git a/src/3rdparty/sha3/qt_attribution.json b/src/3rdparty/sha3/qt_attribution.json
index 13e6e971d9..4866be32ea 100644
--- a/src/3rdparty/sha3/qt_attribution.json
+++ b/src/3rdparty/sha3/qt_attribution.json
@@ -4,6 +4,7 @@
"Name": "Secure Hash Algorithm SHA-3 - brg_endian",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QCryptographicHash).",
+ "Files": "brg_endian.h",
"Description": "SHA-3, originally known as Keccak, is a cryptographic hash function.",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
@@ -16,6 +17,7 @@
"Name": "Secure Hash Algorithm SHA-3 - Keccak",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QCryptographicHash).",
+ "Files": "KeccakF-1600-32-rvk.macros KeccakF-1600-32.macros KeccakF-1600-64.macros KeccakF-1600-interface.h KeccakF-1600-opt32.c KeccakF-1600-opt64.c KeccakF-1600-unrolling.macros KeccakNISTInterface.c KeccakNISTInterface.h KeccakSponge.c KeccakSponge.h",
"Description": "SHA-3, originally known as Keccak, is a cryptographic hash function.",
"License": "Creative Commons Zero v1.0 Universal",
diff --git a/src/corelib/Qt5Config.cmake.in b/src/corelib/Qt5Config.cmake.in
index a872d0e917..75b53485b7 100644
--- a/src/corelib/Qt5Config.cmake.in
+++ b/src/corelib/Qt5Config.cmake.in
@@ -22,18 +22,24 @@ get_filename_component(_qt5_install_prefix \"${CMAKE_CURRENT_LIST_DIR}/..\" ABSO
set(_Qt5_NOTFOUND_MESSAGE)
+include(${CMAKE_CURRENT_LIST_DIR}/Qt5ModuleLocation.cmake)
+
foreach(module ${Qt5_FIND_COMPONENTS})
find_package(Qt5${module}
${_Qt5_FIND_PARTS_QUIET}
${_Qt5_FIND_PARTS_REQUIRED}
- PATHS \"${_qt5_install_prefix}\" NO_DEFAULT_PATH
+ PATHS ${_qt5_module_paths} NO_DEFAULT_PATH
)
if (NOT Qt5${module}_FOUND)
+ string(CONFIGURE ${_qt5_module_location_template} _expected_module_location @ONLY)
+
if (Qt5_FIND_REQUIRED_${module})
- set(_Qt5_NOTFOUND_MESSAGE \"${_Qt5_NOTFOUND_MESSAGE}Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_qt5_install_prefix}/Qt5${module}/Qt5${module}Config.cmake\\\"\\n\")
+ set(_Qt5_NOTFOUND_MESSAGE \"${_Qt5_NOTFOUND_MESSAGE}Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_expected_module_location}\\\"\\n\")
elseif(NOT Qt5_FIND_QUIETLY)
- message(WARNING \"Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_qt5_install_prefix}/Qt5${module}/Qt5${module}Config.cmake\\\"\")
+ message(WARNING \"Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_expected_module_location}\\\"\")
endif()
+
+ unset(_expected_module_location)
endif()
endforeach()
diff --git a/src/corelib/Qt5ModuleLocation.cmake.in b/src/corelib/Qt5ModuleLocation.cmake.in
new file mode 100644
index 0000000000..5065ada56e
--- /dev/null
+++ b/src/corelib/Qt5ModuleLocation.cmake.in
@@ -0,0 +1,15 @@
+!!IF !isEmpty(_QMAKE_SUPER_CACHE_)
+get_filename_component(_qt5_root_dir \"${CMAKE_CURRENT_LIST_DIR}/../../../..\" ABSOLUTE)
+
+file(GLOB qtmodules ${_qt5_root_dir} "${_qt5_root_dir}/*")
+foreach(qtmodule ${qtmodules})
+ if(IS_DIRECTORY ${qtmodule})
+ list(APPEND _qt5_module_paths ${qtmodule})
+ endif()
+endforeach()
+!!ELSE
+set(_qt5_root_dir ${_qt5_install_prefix})
+set(_qt5_module_paths ${_qt5_install_prefix})
+!!ENDIF
+
+set(_qt5_module_location_template ${_qt5_root_dir})
diff --git a/src/corelib/Qt5ModuleLocationForInstall.cmake.in b/src/corelib/Qt5ModuleLocationForInstall.cmake.in
new file mode 100644
index 0000000000..e401b1fe34
--- /dev/null
+++ b/src/corelib/Qt5ModuleLocationForInstall.cmake.in
@@ -0,0 +1,4 @@
+set(_qt5_root_dir ${_qt5_install_prefix})
+set(_qt5_module_paths ${_qt5_install_prefix})
+
+set(_qt5_module_location_template ${_qt5_install_prefix}/Qt5@module@/Qt5@module@Config.cmake)
diff --git a/src/corelib/codecs/codecs.pri b/src/corelib/codecs/codecs.pri
index 4fa778d042..dc8974d13f 100644
--- a/src/corelib/codecs/codecs.pri
+++ b/src/corelib/codecs/codecs.pri
@@ -43,12 +43,8 @@ qtConfig(icu) {
qtConfig(iconv) {
HEADERS += codecs/qiconvcodec_p.h
SOURCES += codecs/qiconvcodec.cpp
- qtConfig(gnu-libiconv) {
- DEFINES += GNU_LIBICONV
+ qtConfig(gnu-libiconv): \
QMAKE_USE_PRIVATE += iconv
- } else: qtConfig(sun-libiconv) {
- DEFINES += GNU_LIBICONV
- }
}
win32 {
diff --git a/src/corelib/codecs/qiconvcodec.cpp b/src/corelib/codecs/qiconvcodec.cpp
index 845155dce0..e4fb359f2c 100644
--- a/src/corelib/codecs/qiconvcodec.cpp
+++ b/src/corelib/codecs/qiconvcodec.cpp
@@ -37,7 +37,9 @@
**
****************************************************************************/
-#ifndef QT_NO_ICONV
+#include <QtCore/private/qglobal_p.h>
+
+QT_REQUIRE_CONFIG(iconv);
#include "qiconvcodec_p.h"
#include "qtextcodec_p.h"
@@ -62,7 +64,7 @@
#elif defined(Q_OS_AIX)
# define NO_BOM
# define UTF16 "UCS-2"
-#elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC)
+#elif defined(Q_OS_FREEBSD)
# define NO_BOM
# if Q_BYTE_ORDER == Q_BIG_ENDIAN
# define UTF16 "UTF-16BE"
@@ -73,19 +75,6 @@
# define UTF16 "UTF-16"
#endif
-#if defined(Q_OS_MAC)
-#ifndef GNU_LIBICONV
-#define GNU_LIBICONV
-#endif
-typedef iconv_t (*Ptr_iconv_open) (const char*, const char*);
-typedef size_t (*Ptr_iconv) (iconv_t, const char **, size_t *, char **, size_t *);
-typedef int (*Ptr_iconv_close) (iconv_t);
-
-static Ptr_iconv_open ptr_iconv_open = 0;
-static Ptr_iconv ptr_iconv = 0;
-static Ptr_iconv_close ptr_iconv_close = 0;
-#endif
-
QT_BEGIN_NAMESPACE
QIconvCodec::QIconvCodec()
@@ -103,33 +92,6 @@ void QIconvCodec::init() const
fprintf(stderr, "QIconvCodec::convertToUnicode: internal error, UTF-16 codec not found\n");
utf16Codec = reinterpret_cast<QTextCodec *>(~0);
}
-#if defined(Q_OS_MAC)
- if (ptr_iconv_open == 0) {
- QLibrary libiconv(QLatin1String("/usr/lib/libiconv"));
- libiconv.setLoadHints(QLibrary::ExportExternalSymbolsHint);
-
- ptr_iconv_open = reinterpret_cast<Ptr_iconv_open>(libiconv.resolve("libiconv_open"));
- if (!ptr_iconv_open)
- ptr_iconv_open = reinterpret_cast<Ptr_iconv_open>(libiconv.resolve("iconv_open"));
- ptr_iconv = reinterpret_cast<Ptr_iconv>(libiconv.resolve("libiconv"));
- if (!ptr_iconv)
- ptr_iconv = reinterpret_cast<Ptr_iconv>(libiconv.resolve("iconv"));
- ptr_iconv_close = reinterpret_cast<Ptr_iconv_close>(libiconv.resolve("libiconv_close"));
- if (!ptr_iconv_close)
- ptr_iconv_close = reinterpret_cast<Ptr_iconv_close>(libiconv.resolve("iconv_close"));
-
- Q_ASSERT_X(ptr_iconv_open && ptr_iconv && ptr_iconv_close,
- "QIconvCodec::QIconvCodec()",
- "internal error, could not resolve the iconv functions");
-
-# undef iconv_open
-# define iconv_open ptr_iconv_open
-# undef iconv
-# define iconv ptr_iconv
-# undef iconv_close
-# define iconv_close ptr_iconv_close
- }
-#endif
}
QIconvCodec::~QIconvCodec()
@@ -221,7 +183,7 @@ QString QIconvCodec::convertToUnicode(const char* chars, int len, ConverterState
IconvState *state = *pstate;
size_t inBytesLeft = len;
// best case assumption, each byte is converted into one UTF-16 character, plus 2 bytes for the BOM
-#ifdef GNU_LIBICONV
+#if !QT_CONFIG(posix_libiconv)
// GNU doesn't disagree with POSIX :/
const char *inBytes = chars;
#else
@@ -320,7 +282,7 @@ static bool setByteOrder(iconv_t cd)
size_t outBytesLeft = sizeof buf;
size_t inBytesLeft = sizeof bom;
-#if defined(GNU_LIBICONV)
+#if !QT_CONFIG(posix_libiconv)
const char **inBytesPtr = const_cast<const char **>(&inBytes);
#else
char **inBytesPtr = &inBytes;
@@ -342,7 +304,7 @@ QByteArray QIconvCodec::convertFromUnicode(const QChar *uc, int len, ConverterSt
char *outBytes;
size_t inBytesLeft;
-#if defined(GNU_LIBICONV)
+#if !QT_CONFIG(posix_libiconv)
const char **inBytesPtr = const_cast<const char **>(&inBytes);
#else
char **inBytesPtr = &inBytes;
@@ -472,7 +434,7 @@ iconv_t QIconvCodec::createIconv_t(const char *to, const char *from) const
init();
iconv_t cd = (iconv_t) -1;
-#if defined(__GLIBC__) || defined(GNU_LIBICONV) || defined(Q_OS_QNX)
+#if defined(__GLIBC__) || !QT_CONFIG(posix_libiconv) || defined(Q_OS_QNX)
#if defined(Q_OS_QNX)
// on QNX the default locale is UTF-8, and an empty string will cause iconv_open to fail
static const char empty_codeset[] = "UTF-8";
@@ -562,5 +524,3 @@ iconv_t QIconvCodec::createIconv_t(const char *to, const char *from) const
}
QT_END_NAMESPACE
-
-#endif /* #ifndef QT_NO_ICONV */
diff --git a/src/corelib/codecs/qiconvcodec_p.h b/src/corelib/codecs/qiconvcodec_p.h
index 238351bc81..9b8500538b 100644
--- a/src/corelib/codecs/qiconvcodec_p.h
+++ b/src/corelib/codecs/qiconvcodec_p.h
@@ -54,13 +54,9 @@
#include <QtCore/private/qglobal_p.h>
#include "qtextcodec.h"
-#if defined(Q_OS_UNIX) && !defined(QT_NO_ICONV) && !defined(QT_BOOTSTRAPPED)
+QT_REQUIRE_CONFIG(iconv);
-#ifdef Q_OS_MAC
-typedef void * iconv_t;
-#else
#include <iconv.h>
-#endif
QT_BEGIN_NAMESPACE
@@ -100,6 +96,4 @@ public:
QT_END_NAMESPACE
-#endif // Q_OS_UNIX && !QT_NO_ICONV && !QT_BOOTSTRAPPED
-
#endif // QICONVCODEC_P_H
diff --git a/src/corelib/codecs/qsimplecodec_p.h b/src/corelib/codecs/qsimplecodec_p.h
index d268a9f5b8..188c3f3cb4 100644
--- a/src/corelib/codecs/qsimplecodec_p.h
+++ b/src/corelib/codecs/qsimplecodec_p.h
@@ -67,12 +67,12 @@ public:
explicit QSimpleTextCodec(int);
~QSimpleTextCodec();
- QString convertToUnicode(const char *, int, ConverterState *) const;
- QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+ QString convertToUnicode(const char *, int, ConverterState *) const override;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override;
- QByteArray name() const;
- QList<QByteArray> aliases() const;
- int mibEnum() const;
+ QByteArray name() const override;
+ QList<QByteArray> aliases() const override;
+ int mibEnum() const override;
private:
int forwardIndex;
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index 5098ac4242..0c9036aadf 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -61,7 +61,7 @@
#if defined(QT_USE_ICU)
#include "qicucodec_p.h"
#else
-#if !defined(QT_NO_ICONV)
+#if QT_CONFIG(iconv)
# include "qiconvcodec_p.h"
#endif
#ifdef Q_OS_WIN
@@ -184,7 +184,7 @@ static QTextCodec *setupLocaleMapper()
if (charset)
locale = QTextCodec::codecForName(charset);
#endif
-#if !defined(QT_NO_ICONV) && !defined(QT_BOOTSTRAPPED)
+#if QT_CONFIG(iconv)
if (!locale) {
// no builtin codec for the locale found, let's try using iconv
(void) new QIconvCodec();
@@ -286,7 +286,7 @@ static void setup()
(void)new QBig5Codec;
(void)new QBig5hkscsCodec;
# endif // !QT_NO_BIG_CODECS && !Q_OS_INTEGRITY
-#if !defined(QT_NO_ICONV)
+#if QT_CONFIG(iconv)
(void) new QIconvCodec;
#endif
#if defined(Q_OS_WIN32)
diff --git a/src/corelib/configure.json b/src/corelib/configure.json
index e7eb5fe482..0d1954c3a8 100644
--- a/src/corelib/configure.json
+++ b/src/corelib/configure.json
@@ -245,21 +245,21 @@
"label": "iconv",
"purpose": "Provides internationalization on Unix.",
"section": "Internationalization",
- "condition": "features.posix-libiconv || features.sun-libiconv || features.gnu-libiconv",
+ "condition": "!features.icu && (features.posix-libiconv || features.sun-libiconv || features.gnu-libiconv)",
"output": [ "privateFeature", "feature" ]
},
"posix-libiconv": {
"label": "POSIX iconv",
"enable": "input.iconv == 'posix'",
"disable": "input.iconv == 'sun' || input.iconv == 'gnu' || input.iconv == 'no'",
- "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && tests.posix-iconv"
+ "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && tests.posix-iconv",
+ "output": [ "privateFeature" ]
},
"sun-libiconv": {
"label": "SUN iconv",
"enable": "input.iconv == 'sun'",
"disable": "input.iconv == 'posix' || input.iconv == 'gnu' || input.iconv == 'no'",
- "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && tests.sun-iconv",
- "output": [ "privateFeature", "publicQtConfig" ]
+ "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && tests.sun-iconv"
},
"gnu-libiconv": {
"label": "GNU iconv",
@@ -372,11 +372,6 @@
"condition": "tests.syslog",
"output": [ "privateConfig" ]
},
- "systemsemaphore": {
- "label": "Enable QSystemSemaphore",
- "condition": "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix",
- "output": [ { "type": "define", "negative": true, "name": "QT_NO_SYSTEMSEMAPHORE" } ]
- },
"threadsafe-cloexec": {
"label": "Threadsafe pipe creation",
"condition": "tests.cloexec",
@@ -401,12 +396,17 @@
"label": "QSharedMemory",
"purpose": "Provides access to a shared memory segment.",
"section": "Kernel",
+ "condition": "!config.vxworks",
"output": [ "publicFeature", "feature" ]
},
"systemsemaphore": {
"label": "QSystemSemaphore",
"purpose": "Provides a general counting system semaphore.",
"section": "Kernel",
+ "condition": [
+ "!config.integrity && !config.vxworks",
+ "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix"
+ ],
"output": [ "publicFeature", "feature" ]
},
"xmlstream": {
@@ -446,6 +446,7 @@
"label": "QProcess",
"purpose": "Supports external process invocation.",
"section": "File I/O",
+ "condition": "!config.winrt && !config.uikit && !config.integrity && !config.vxworks",
"output": [ "publicFeature", "feature" ]
},
"temporaryfile": {
@@ -470,6 +471,7 @@
"label": "QFileSystemWatcher",
"purpose": "Provides an interface for monitoring files and directories for modifications.",
"section": "File I/O",
+ "condition": "!config.winrt",
"output": [ "publicFeature", "feature" ]
},
"filesystemiterator": {
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index 616a9641a1..0bd7c9b99d 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -93,6 +93,12 @@ ctest_macros_file.CONFIG = verbatim
cmake_umbrella_config_file.input = $$PWD/Qt5Config.cmake.in
cmake_umbrella_config_file.output = $$DESTDIR/cmake/Qt5/Qt5Config.cmake
+cmake_umbrella_config_module_location.input = $$PWD/Qt5ModuleLocation.cmake.in
+cmake_umbrella_config_module_location.output = $$DESTDIR/cmake/Qt5/Qt5ModuleLocation.cmake
+
+cmake_umbrella_config_module_location_for_install.input = $$PWD/Qt5ModuleLocationForInstall.cmake.in
+cmake_umbrella_config_module_location_for_install.output = $$DESTDIR/cmake/install/Qt5/Qt5ModuleLocation.cmake
+
cmake_umbrella_config_version_file.input = $$PWD/../../mkspecs/features/data/cmake/Qt5ConfigVersion.cmake.in
cmake_umbrella_config_version_file.output = $$DESTDIR/cmake/Qt5/Qt5ConfigVersion.cmake
@@ -119,10 +125,21 @@ contains(CMAKE_INSTALL_DATA_DIR, "^\\.\\./.*"):!isEmpty(CMAKE_INSTALL_DATA_DIR)
cmake_extras_mkspec_dir_for_install.input = $$PWD/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in
cmake_extras_mkspec_dir_for_install.output = $$DESTDIR/cmake/install/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake
-cmake_qt5_umbrella_module_files.files = $$cmake_umbrella_config_file.output $$cmake_umbrella_config_version_file.output
+cmake_qt5_umbrella_module_files.files = \
+ $$cmake_umbrella_config_file.output \
+ $$cmake_umbrella_config_version_file.output \
+ $$cmake_umbrella_config_module_location_for_install.output
+
cmake_qt5_umbrella_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5
-QMAKE_SUBSTITUTES += ctest_macros_file cmake_umbrella_config_file cmake_umbrella_config_version_file cmake_extras_mkspec_dir cmake_extras_mkspec_dir_for_install
+QMAKE_SUBSTITUTES += \
+ ctest_macros_file \
+ cmake_umbrella_config_file \
+ cmake_umbrella_config_module_location \
+ cmake_umbrella_config_module_location_for_install \
+ cmake_umbrella_config_version_file \
+ cmake_extras_mkspec_dir \
+ cmake_extras_mkspec_dir_for_install
ctest_qt5_module_files.files += $$ctest_macros_file.output $$cmake_extras_mkspec_dir_for_install.output
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index 0b2345f8d4..d978c141a4 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -986,6 +986,9 @@
# define Q_COMPILER_THREADSAFE_STATICS
# define Q_COMPILER_UNIFORM_INIT
# endif
+# if _MSC_VER >= 1910
+# define Q_COMPILER_CONSTEXPR
+# endif
# endif /* __cplusplus */
#endif /* Q_CC_MSVC */
@@ -1270,6 +1273,7 @@
# define QT_WARNING_DISABLE_INTEL(number) __pragma(warning(disable: number))
# define QT_WARNING_DISABLE_CLANG(text)
# define QT_WARNING_DISABLE_GCC(text)
+# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1786)
#elif defined(Q_CC_INTEL)
/* icc: Intel compiler on Linux or OS X */
# define QT_WARNING_PUSH QT_DO_PRAGMA(warning(push))
@@ -1278,6 +1282,7 @@
# define QT_WARNING_DISABLE_MSVC(number)
# define QT_WARNING_DISABLE_CLANG(text)
# define QT_WARNING_DISABLE_GCC(text)
+# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1786)
#elif defined(Q_CC_MSVC) && _MSC_VER >= 1500 && !defined(Q_CC_CLANG)
# undef QT_DO_PRAGMA /* not needed */
# define QT_WARNING_PUSH __pragma(warning(push))
@@ -1286,6 +1291,7 @@
# define QT_WARNING_DISABLE_INTEL(number)
# define QT_WARNING_DISABLE_CLANG(text)
# define QT_WARNING_DISABLE_GCC(text)
+# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_MSVC(4996)
#elif defined(Q_CC_CLANG)
# define QT_WARNING_PUSH QT_DO_PRAGMA(clang diagnostic push)
# define QT_WARNING_POP QT_DO_PRAGMA(clang diagnostic pop)
@@ -1293,6 +1299,7 @@
# define QT_WARNING_DISABLE_GCC(text)
# define QT_WARNING_DISABLE_INTEL(number)
# define QT_WARNING_DISABLE_MSVC(number)
+# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_CLANG("-Wdeprecated-declarations")
#elif defined(Q_CC_GNU) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)
# define QT_WARNING_PUSH QT_DO_PRAGMA(GCC diagnostic push)
# define QT_WARNING_POP QT_DO_PRAGMA(GCC diagnostic pop)
@@ -1300,6 +1307,7 @@
# define QT_WARNING_DISABLE_CLANG(text)
# define QT_WARNING_DISABLE_INTEL(number)
# define QT_WARNING_DISABLE_MSVC(number)
+# define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations")
#else // All other compilers, GCC < 4.6 and MSVC < 2008
# define QT_WARNING_DISABLE_GCC(text)
# define QT_WARNING_PUSH
@@ -1308,6 +1316,7 @@
# define QT_WARNING_DISABLE_MSVC(number)
# define QT_WARNING_DISABLE_CLANG(text)
# define QT_WARNING_DISABLE_GCC(text)
+# define QT_WARNING_DISABLE_DEPRECATED
#endif
/*
diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h
index 3b86e94cdd..4629a57485 100644
--- a/src/corelib/global/qconfig-bootstrapped.h
+++ b/src/corelib/global/qconfig-bootstrapped.h
@@ -68,6 +68,7 @@
#define QT_CRYPTOGRAPHICHASH_ONLY_SHA1
#define QT_NO_DATASTREAM
+#define QT_FEATURE_iconv -1
#define QT_NO_LIBRARY
#define QT_FEATURE_library -1
#define QT_NO_QOBJECT
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index d06acb83b2..6efdc4c22c 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -1244,6 +1244,12 @@ bool qSharedBuild() Q_DECL_NOTHROW
\value MV_TVOS_9_2 tvOS 9.2
\value MV_TVOS_10_0 tvOS 10.0
+ \value MV_WATCHOS watchOS (any)
+ \value MV_WATCHOS_2_0 watchOS 2.0
+ \value MV_WATCHOS_2_1 watchOS 2.1
+ \value MV_WATCHOS_2_2 watchOS 2.2
+ \value MV_WATCHOS_3_0 watchOS 3.0
+
\value MV_None Not a Darwin operating system
\sa WinVersion
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 99be82f8c3..1737f58c87 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -619,32 +619,6 @@ private:
class QDataStream;
-#if defined(Q_OS_VXWORKS)
-# define QT_NO_CRASHHANDLER // no popen
-# define QT_NO_PROCESS // no exec*, no fork
-# define QT_NO_SHAREDMEMORY // only POSIX, no SysV and in the end...
-# define QT_NO_SYSTEMSEMAPHORE // not needed at all in a flat address space
-#endif
-
-#if defined(Q_OS_WINRT)
-# define QT_NO_FILESYSTEMWATCHER
-# define QT_NO_NETWORKPROXY
-# define QT_NO_PROCESS
-# define QT_NO_SOCKETNOTIFIER
-# define QT_NO_SOCKS5
-#endif
-
-#if defined(QT_PLATFORM_UIKIT)
-# define QT_NO_PROCESS
-#endif
-
-#if defined(Q_OS_INTEGRITY)
-# define QT_NO_CRASHHANDLER // no popen
-# define QT_NO_PROCESS // no exec*, no fork
-# define QT_NO_SYSTEMSEMAPHORE // not needed at all in a single AddressSpace
-# define QT_NO_MULTIPROCESS // no system
-#endif
-
inline void qt_noop(void) {}
/* These wrap try/catch so we can switch off exceptions later.
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index 1469f5776b..27fe10a79e 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -318,8 +318,10 @@ QLibraryInfo::buildDate()
# define COMPILER_STRING "MSVC 2012"
# elif _MSC_VER < 1900
# define COMPILER_STRING "MSVC 2013"
-# elif _MSC_VER < 2000
+# elif _MSC_VER < 1910
# define COMPILER_STRING "MSVC 2015"
+# elif _MSC_VER < 2000
+# define COMPILER_STRING "MSVC 2017"
# else
# define COMPILER_STRING "MSVC _MSC_VER " QT_STRINGIFY(_MSC_VER)
# endif
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index 0ca6829564..f344873276 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -1779,7 +1779,7 @@ void qErrnoWarning(int code, const char *msg, ...)
\snippet code/src_corelib_global_qglobal.cpp 23
- \sa QtMessageHandler, QtMsgType, qDebug(), qWarning(), qCritical(), qFatal(),
+ \sa QtMessageHandler, QtMsgType, qDebug(), qInfo(), qWarning(), qCritical(), qFatal(),
{Debugging Techniques}
*/
diff --git a/src/corelib/io/PSL-LICENSE.txt b/src/corelib/io/PSL-LICENSE.txt
new file mode 100644
index 0000000000..d0a1fa1482
--- /dev/null
+++ b/src/corelib/io/PSL-LICENSE.txt
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/src/corelib/io/qfile_p.h b/src/corelib/io/qfile_p.h
index fd7db3c120..545890c6b3 100644
--- a/src/corelib/io/qfile_p.h
+++ b/src/corelib/io/qfile_p.h
@@ -70,7 +70,7 @@ protected:
bool openExternalFile(int flags, int fd, QFile::FileHandleFlags handleFlags);
bool openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handleFlags);
- virtual QAbstractFileEngine *engine() const;
+ QAbstractFileEngine *engine() const override;
QString fileName;
};
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 5de85f9811..1b908eac55 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -65,6 +65,13 @@
#include <MobileCoreServices/MobileCoreServices.h>
#endif
+#if defined(Q_OS_DARWIN)
+// We cannot include <Foundation/Foundation.h> (it's an Objective-C header), but
+// we need these declarations:
+Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
+extern "C" NSString *NSTemporaryDirectory();
+#endif
+
QT_BEGIN_NAMESPACE
#if defined(Q_OS_DARWIN)
@@ -703,8 +710,17 @@ QString QFileSystemEngine::tempPath()
return QLatin1String(QT_UNIX_TEMP_PATH_OVERRIDE);
#else
QString temp = QFile::decodeName(qgetenv("TMPDIR"));
- if (temp.isEmpty())
- temp = QLatin1String("/tmp");
+ if (temp.isEmpty()) {
+#if defined(Q_OS_DARWIN) && !defined(QT_BOOTSTRAPPED)
+ if (NSString *nsPath = NSTemporaryDirectory()) {
+ temp = QString::fromCFString((CFStringRef)nsPath);
+ } else {
+#else
+ {
+#endif
+ temp = QLatin1String("/tmp");
+ }
+ }
return QDir::cleanPath(temp);
#endif
}
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index 7fe3753da4..febf22639c 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -49,6 +49,7 @@
#include "qdatetime.h"
#include "qbytearray.h"
#include "qstringlist.h"
+#include "qendian.h"
#include <qshareddata.h>
#include <qplatformdefs.h>
#include "private/qabstractfileengine_p.h"
@@ -101,35 +102,38 @@ class QResourceRoot
Directory = 0x02
};
const uchar *tree, *names, *payloads;
- inline int findOffset(int node) const { return node * 14; } //sizeof each tree element
+ int version;
+ inline int findOffset(int node) const { return node * (14 + (version >= 0x02 ? 8 : 0)); } //sizeof each tree element
uint hash(int node) const;
QString name(int node) const;
short flags(int node) const;
public:
mutable QAtomicInt ref;
- inline QResourceRoot(): tree(0), names(0), payloads(0) {}
- inline QResourceRoot(const uchar *t, const uchar *n, const uchar *d) { setSource(t, n, d); }
+ inline QResourceRoot(): tree(0), names(0), payloads(0), version(0) {}
+ inline QResourceRoot(int version, const uchar *t, const uchar *n, const uchar *d) { setSource(version, t, n, d); }
virtual ~QResourceRoot() { }
int findNode(const QString &path, const QLocale &locale=QLocale()) const;
inline bool isContainer(int node) const { return flags(node) & Directory; }
inline bool isCompressed(int node) const { return flags(node) & Compressed; }
const uchar *data(int node, qint64 *size) const;
+ QDateTime lastModified(int node) const;
QStringList children(int node) const;
virtual QString mappingRoot() const { return QString(); }
bool mappingRootSubdir(const QString &path, QString *match=0) const;
inline bool operator==(const QResourceRoot &other) const
- { return tree == other.tree && names == other.names && payloads == other.payloads; }
+ { return tree == other.tree && names == other.names && payloads == other.payloads && version == other.version; }
inline bool operator!=(const QResourceRoot &other) const
{ return !operator==(other); }
enum ResourceRootType { Resource_Builtin, Resource_File, Resource_Buffer };
virtual ResourceRootType type() const { return Resource_Builtin; }
protected:
- inline void setSource(const uchar *t, const uchar *n, const uchar *d) {
+ inline void setSource(int v, const uchar *t, const uchar *n, const uchar *d) {
tree = t;
names = n;
payloads = d;
+ version = v;
}
};
@@ -231,6 +235,7 @@ public:
mutable qint64 size;
mutable const uchar *data;
mutable QStringList children;
+ mutable QDateTime lastModified;
QResource *q_ptr;
Q_DECLARE_PUBLIC(QResource)
@@ -244,6 +249,7 @@ QResourcePrivate::clear()
data = 0;
size = 0;
children.clear();
+ lastModified = QDateTime();
container = 0;
for(int i = 0; i < related.size(); ++i) {
QResourceRoot *root = related.at(i);
@@ -274,6 +280,7 @@ QResourcePrivate::load(const QString &file)
size = 0;
compressed = 0;
}
+ lastModified = res->lastModified(node);
} else if(res->isContainer(node) != container) {
qWarning("QResourceInfo: Resource [%s] has both data and children!", file.toLatin1().constData());
}
@@ -284,6 +291,7 @@ QResourcePrivate::load(const QString &file)
data = 0;
size = 0;
compressed = 0;
+ lastModified = QDateTime();
res->ref.ref();
related.append(res);
}
@@ -514,6 +522,17 @@ const uchar *QResource::data() const
}
/*!
+ Returns the date and time when the file was last modified before
+ packaging into a resource.
+*/
+QDateTime QResource::lastModified() const
+{
+ Q_D(const QResource);
+ d->ensureInitialized();
+ return d->lastModified;
+}
+
+/*!
Returns \c true if the resource represents a directory and thus may have
children() in it, false if it represents a file.
@@ -588,11 +607,9 @@ inline uint QResourceRoot::hash(int node) const
if(!node) //root
return 0;
const int offset = findOffset(node);
- int name_offset = (tree[offset+0] << 24) + (tree[offset+1] << 16) +
- (tree[offset+2] << 8) + (tree[offset+3] << 0);
+ qint32 name_offset = qFromBigEndian<qint32>(tree + offset);
name_offset += 2; //jump past name length
- return (names[name_offset+0] << 24) + (names[name_offset+1] << 16) +
- (names[name_offset+2] << 8) + (names[name_offset+3] << 0);
+ return qFromBigEndian<quint32>(names + name_offset);
}
inline QString QResourceRoot::name(int node) const
{
@@ -601,10 +618,8 @@ inline QString QResourceRoot::name(int node) const
const int offset = findOffset(node);
QString ret;
- int name_offset = (tree[offset+0] << 24) + (tree[offset+1] << 16) +
- (tree[offset+2] << 8) + (tree[offset+3] << 0);
- const short name_length = (names[name_offset+0] << 8) +
- (names[name_offset+1] << 0);
+ qint32 name_offset = qFromBigEndian<qint32>(tree + offset);
+ const qint16 name_length = qFromBigEndian<qint16>(names + name_offset);
name_offset += 2;
name_offset += 4; //jump past hash
@@ -644,10 +659,8 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const
return 0;
//the root node is always first
- int child_count = (tree[6] << 24) + (tree[7] << 16) +
- (tree[8] << 8) + (tree[9] << 0);
- int child = (tree[10] << 24) + (tree[11] << 16) +
- (tree[12] << 8) + (tree[13] << 0);
+ qint32 child_count = qFromBigEndian<qint32>(tree + 6);
+ qint32 child = qFromBigEndian<qint32>(tree + 10);
//now iterate up the tree
int node = -1;
@@ -693,18 +706,15 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const
#endif
offset += 4; //jump past name
- const short flags = (tree[offset+0] << 8) +
- (tree[offset+1] << 0);
+ const qint16 flags = qFromBigEndian<qint16>(tree + offset);
offset += 2;
if(!splitter.hasNext()) {
if(!(flags & Directory)) {
- const short country = (tree[offset+0] << 8) +
- (tree[offset+1] << 0);
+ const qint16 country = qFromBigEndian<qint16>(tree + offset);
offset += 2;
- const short language = (tree[offset+0] << 8) +
- (tree[offset+1] << 0);
+ const qint16 language = qFromBigEndian<qint16>(tree + offset);
offset += 2;
#ifdef DEBUG_RESOURCE_MATCH
qDebug() << " " << "LOCALE" << country << language;
@@ -731,11 +741,9 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const
if(!(flags & Directory))
return -1;
- child_count = (tree[offset+0] << 24) + (tree[offset+1] << 16) +
- (tree[offset+2] << 8) + (tree[offset+3] << 0);
+ child_count = qFromBigEndian<qint32>(tree + offset);
offset += 4;
- child = (tree[offset+0] << 24) + (tree[offset+1] << 16) +
- (tree[offset+2] << 8) + (tree[offset+3] << 0);
+ child = qFromBigEndian<qint32>(tree + offset);
break;
}
}
@@ -753,7 +761,7 @@ short QResourceRoot::flags(int node) const
if(node == -1)
return 0;
const int offset = findOffset(node) + 4; //jump past name
- return (tree[offset+0] << 8) + (tree[offset+1] << 0);
+ return qFromBigEndian<qint16>(tree + offset);
}
const uchar *QResourceRoot::data(int node, qint64 *size) const
{
@@ -763,16 +771,14 @@ const uchar *QResourceRoot::data(int node, qint64 *size) const
}
int offset = findOffset(node) + 4; //jump past name
- const short flags = (tree[offset+0] << 8) + (tree[offset+1] << 0);
+ const qint16 flags = qFromBigEndian<qint16>(tree + offset);
offset += 2;
offset += 4; //jump past locale
if(!(flags & Directory)) {
- const int data_offset = (tree[offset+0] << 24) + (tree[offset+1] << 16) +
- (tree[offset+2] << 8) + (tree[offset+3] << 0);
- const uint data_length = (payloads[data_offset+0] << 24) + (payloads[data_offset+1] << 16) +
- (payloads[data_offset+2] << 8) + (payloads[data_offset+3] << 0);
+ const qint32 data_offset = qFromBigEndian<qint32>(tree + offset);
+ const quint32 data_length = qFromBigEndian<quint32>(payloads + data_offset);
const uchar *ret = payloads+data_offset+4;
*size = data_length;
return ret;
@@ -780,22 +786,35 @@ const uchar *QResourceRoot::data(int node, qint64 *size) const
*size = 0;
return 0;
}
+
+QDateTime QResourceRoot::lastModified(int node) const
+{
+ if (node == -1 || version < 0x02)
+ return QDateTime();
+
+ const int offset = findOffset(node) + 14;
+
+ const quint64 timeStamp = qFromBigEndian<quint64>(tree + offset);
+ if (timeStamp == 0)
+ return QDateTime();
+
+ return QDateTime::fromMSecsSinceEpoch(timeStamp);
+}
+
QStringList QResourceRoot::children(int node) const
{
if(node == -1)
return QStringList();
int offset = findOffset(node) + 4; //jump past name
- const short flags = (tree[offset+0] << 8) + (tree[offset+1] << 0);
+ const qint16 flags = qFromBigEndian<qint16>(tree + offset);
offset += 2;
QStringList ret;
if(flags & Directory) {
- const int child_count = (tree[offset+0] << 24) + (tree[offset+1] << 16) +
- (tree[offset+2] << 8) + (tree[offset+3] << 0);
+ const qint32 child_count = qFromBigEndian<qint32>(tree + offset);
offset += 4;
- const int child_off = (tree[offset+0] << 24) + (tree[offset+1] << 16) +
- (tree[offset+2] << 8) + (tree[offset+3] << 0);
+ const qint32 child_off = qFromBigEndian<qint32>(tree + offset);
ret.reserve(child_count);
for(int i = child_off; i < child_off+child_count; ++i)
ret << name(i);
@@ -829,9 +848,9 @@ Q_CORE_EXPORT bool qRegisterResourceData(int version, const unsigned char *tree,
const unsigned char *name, const unsigned char *data)
{
QMutexLocker lock(resourceMutex());
- if(version == 0x01 && resourceList()) {
+ if ((version == 0x01 || version == 0x2) && resourceList()) {
bool found = false;
- QResourceRoot res(tree, name, data);
+ QResourceRoot res(version, tree, name, data);
for(int i = 0; i < resourceList()->size(); ++i) {
if(*resourceList()->at(i) == res) {
found = true;
@@ -839,7 +858,7 @@ Q_CORE_EXPORT bool qRegisterResourceData(int version, const unsigned char *tree,
}
}
if(!found) {
- QResourceRoot *root = new QResourceRoot(tree, name, data);
+ QResourceRoot *root = new QResourceRoot(version, tree, name, data);
root->ref.ref();
resourceList()->append(root);
}
@@ -852,8 +871,8 @@ Q_CORE_EXPORT bool qUnregisterResourceData(int version, const unsigned char *tre
const unsigned char *name, const unsigned char *data)
{
QMutexLocker lock(resourceMutex());
- if(version == 0x01 && resourceList()) {
- QResourceRoot res(tree, name, data);
+ if ((version == 0x01 || version == 0x02) && resourceList()) {
+ QResourceRoot res(version, tree, name, data);
for(int i = 0; i < resourceList()->size(); ) {
if(*resourceList()->at(i) == res) {
QResourceRoot *root = resourceList()->takeAt(i);
@@ -899,29 +918,25 @@ public:
}
offset += 4;
- const int version = (b[offset+0] << 24) + (b[offset+1] << 16) +
- (b[offset+2] << 8) + (b[offset+3] << 0);
+ const int version = qFromBigEndian<qint32>(b + offset);
offset += 4;
- const int tree_offset = (b[offset+0] << 24) + (b[offset+1] << 16) +
- (b[offset+2] << 8) + (b[offset+3] << 0);
+ const int tree_offset = qFromBigEndian<qint32>(b + offset);
offset += 4;
- const int data_offset = (b[offset+0] << 24) + (b[offset+1] << 16) +
- (b[offset+2] << 8) + (b[offset+3] << 0);
+ const int data_offset = qFromBigEndian<qint32>(b + offset);
offset += 4;
- const int name_offset = (b[offset+0] << 24) + (b[offset+1] << 16) +
- (b[offset+2] << 8) + (b[offset+3] << 0);
+ const int name_offset = qFromBigEndian<qint32>(b + offset);
offset += 4;
// Some sanity checking for sizes. This is _not_ a security measure.
if (size >= 0 && (tree_offset >= size || data_offset >= size || name_offset >= size))
return false;
- if(version == 0x01) {
+ if (version == 0x01 || version == 0x02) {
buffer = b;
- setSource(b+tree_offset, b+name_offset, b+data_offset);
+ setSource(version, b+tree_offset, b+name_offset, b+data_offset);
return true;
}
return false;
@@ -1430,8 +1445,11 @@ QString QResourceFileEngine::owner(FileOwner) const
return QString();
}
-QDateTime QResourceFileEngine::fileTime(FileTime) const
+QDateTime QResourceFileEngine::fileTime(FileTime time) const
{
+ Q_D(const QResourceFileEngine);
+ if (time == ModificationTime)
+ return d->resource.lastModified();
return QDateTime();
}
diff --git a/src/corelib/io/qresource.h b/src/corelib/io/qresource.h
index a50bbbdaca..895cf0456e 100644
--- a/src/corelib/io/qresource.h
+++ b/src/corelib/io/qresource.h
@@ -69,6 +69,7 @@ public:
bool isCompressed() const;
qint64 size() const;
const uchar *data() const;
+ QDateTime lastModified() const;
static void addSearchPath(const QString &path);
static QStringList searchPaths();
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index 47108d057b..480a777457 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -97,14 +97,6 @@ using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::Storage;
#endif
-#ifndef CSIDL_COMMON_APPDATA
-#define CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data
-#endif
-
-#ifndef CSIDL_APPDATA
-#define CSIDL_APPDATA 0x001a // <username>\Application Data
-#endif
-
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID)
#define Q_XDG_PLATFORM
#endif
@@ -959,31 +951,34 @@ void QConfFileSettingsPrivate::initAccess()
}
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
-static QString windowsConfigPath(int type)
+static QString windowsConfigPath(const KNOWNFOLDERID &type)
{
QString result;
- wchar_t path[MAX_PATH];
- if (SHGetSpecialFolderPath(0, path, type, false))
+ PWSTR path = nullptr;
+ if (SHGetKnownFolderPath(type, KF_FLAG_DONT_VERIFY, NULL, &path) == S_OK) {
result = QString::fromWCharArray(path);
+ CoTaskMemFree(path);
+ }
if (result.isEmpty()) {
- switch (type) {
- case CSIDL_COMMON_APPDATA:
+ if (type == FOLDERID_ProgramData) {
result = QLatin1String("C:\\temp\\qt-common");
- break;
- case CSIDL_APPDATA:
+ } else if (type == FOLDERID_RoamingAppData) {
result = QLatin1String("C:\\temp\\qt-user");
- break;
- default:
- ;
}
}
return result;
}
#elif defined(Q_OS_WINRT) // Q_OS_WIN && !Q_OS_WINRT
-static QString windowsConfigPath(int type)
+
+enum ConfigPathType {
+ ConfigPath_CommonAppData,
+ ConfigPath_UserAppData
+};
+
+static QString windowsConfigPath(ConfigPathType type)
{
static QString result;
while (result.isEmpty()) {
@@ -1006,12 +1001,10 @@ static QString windowsConfigPath(int type)
}
switch (type) {
- case CSIDL_COMMON_APPDATA:
+ case ConfigPath_CommonAppData:
return result + QLatin1String("\\qt-common");
- case CSIDL_APPDATA:
+ case ConfigPath_UserAppData:
return result + QLatin1String("\\qt-user");
- default:
- break;
}
return result;
}
@@ -1068,10 +1061,18 @@ static void initDefaultPaths(QMutexLocker *locker)
Windows registry and the Mac CFPreferences.)
*/
#ifdef Q_OS_WIN
+
+# ifdef Q_OS_WINRT
+ const QString roamingAppDataFolder = windowsConfigPath(ConfigPath_UserAppData);
+ const QString programDataFolder = windowsConfigPath(ConfigPath_CommonAppData);
+# else
+ const QString roamingAppDataFolder = windowsConfigPath(FOLDERID_RoamingAppData);
+ const QString programDataFolder = windowsConfigPath(FOLDERID_ProgramData);
+# endif
pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::UserScope),
- windowsConfigPath(CSIDL_APPDATA) + QDir::separator());
+ roamingAppDataFolder + QDir::separator());
pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::SystemScope),
- windowsConfigPath(CSIDL_COMMON_APPDATA) + QDir::separator());
+ programDataFolder + QDir::separator());
#else
const QString userPath = make_user_path();
pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::UserScope), userPath);
@@ -2231,20 +2232,20 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
On Windows, the following files are used:
\list 1
- \li \c{CSIDL_APPDATA\MySoft\Star Runner.ini}
- \li \c{CSIDL_APPDATA\MySoft.ini}
- \li \c{CSIDL_COMMON_APPDATA\MySoft\Star Runner.ini}
- \li \c{CSIDL_COMMON_APPDATA\MySoft.ini}
+ \li \c{FOLDERID_RoamingAppData\MySoft\Star Runner.ini}
+ \li \c{FOLDERID_RoamingAppData\MySoft.ini}
+ \li \c{FOLDERID_ProgramData\MySoft\Star Runner.ini}
+ \li \c{FOLDERID_ProgramData\MySoft.ini}
\endlist
- The identifiers prefixed by \c{CSIDL_} are special item ID lists to be passed
- to the Win32 API function \c{SHGetSpecialFolderPath()} to obtain the
+ The identifiers prefixed by \c{FOLDERID_} are special item ID lists to be passed
+ to the Win32 API function \c{SHGetKnownFolderPath()} to obtain the
corresponding path.
- \c{CSIDL_APPDATA} usually points to \tt{C:\\Users\\\e{User Name}\\AppData\\Roaming},
+ \c{FOLDERID_RoamingAppData} usually points to \tt{C:\\Users\\\e{User Name}\\AppData\\Roaming},
also shown by the environment variable \c{%APPDATA%}.
- \c{CSIDL_COMMON_APPDATA} usually points to \tt{C:\\ProgramData}.
+ \c{FOLDERID_ProgramData} usually points to \tt{C:\\ProgramData}.
If the file format is IniFormat, this is "Settings/MySoft/Star Runner.ini"
in the application's home directory.
@@ -3348,8 +3349,8 @@ void QSettings::setUserIniPath(const QString &dir)
\table
\header \li Platform \li Format \li Scope \li Path
- \row \li{1,2} Windows \li{1,2} IniFormat \li UserScope \li \c CSIDL_APPDATA
- \row \li SystemScope \li \c CSIDL_COMMON_APPDATA
+ \row \li{1,2} Windows \li{1,2} IniFormat \li UserScope \li \c FOLDERID_RoamingAppData
+ \row \li SystemScope \li \c FOLDERID_ProgramData
\row \li{1,2} Unix \li{1,2} NativeFormat, IniFormat \li UserScope \li \c $HOME/.config
\row \li SystemScope \li \c /etc/xdg
\row \li{1,2} Qt for Embedded Linux \li{1,2} NativeFormat, IniFormat \li UserScope \li \c $HOME/Settings
diff --git a/src/corelib/io/qt_attribution.json b/src/corelib/io/qt_attribution.json
index 2a616a2819..c64f8cae4b 100644
--- a/src/corelib/io/qt_attribution.json
+++ b/src/corelib/io/qt_attribution.json
@@ -1,3 +1,4 @@
+[
{
"Id": "qtemporaryfile",
"Name": "Parts of QTemporaryFile",
@@ -10,4 +11,32 @@
"LicenseId": "BSD-3-Clause",
"LicenseFile": "QTEMPORARYFILE_LICENSE.txt",
"Copyright": "Copyright (c) 1987, 1993 The Regents of the University of California."
+},
+{
+ "Id": "psl",
+ "Name": "The Public Suffix List",
+ "QDocModule": "qtcore",
+ "Description": "The Public Suffix List is an initiative of the Mozilla Project,
+but is maintained as a community resource. It is available for use in any software,
+but was originally created to meet the needs of browser manufacturers.
+It allows browsers to, for example:
+
+- Avoid privacy-damaging \"supercookies\" being set for high-level domain name suffixes
+
+- Highlight the most important part of a domain name in the user interface
+
+- Accurately sort history entries by site",
+
+ "Files": "qurltlds_p.h",
+ "QtUsage": "Used in Qt Core to avoid \"supercookies\" being set in the cookie jar
+supported by Qt (by the QNetworkCookieJar class).",
+
+ "Homepage": "http://publicsuffix.org/",
+ "Version": "Generated on 2016-10-20 from revision 915565885d0fbd25caf7d8b339cd3478f558da94",
+ "License": "Mozilla Public License 2.0",
+ "LicenseFile": "PSL-LICENSE.txt",
+ "LicenseId": "MPL-2.0",
+ "Copyright": "The list was originally provided by Jo Hermans <jo.hermans@gmail.com>.
+It is now maintained on github (https://github.com/publicsuffix/list)."
}
+]
diff --git a/src/corelib/io/qtemporaryfile_p.h b/src/corelib/io/qtemporaryfile_p.h
index d057603034..7f365f0e8a 100644
--- a/src/corelib/io/qtemporaryfile_p.h
+++ b/src/corelib/io/qtemporaryfile_p.h
@@ -70,7 +70,7 @@ protected:
explicit QTemporaryFilePrivate(const QString &templateNameIn);
~QTemporaryFilePrivate();
- QAbstractFileEngine *engine() const;
+ QAbstractFileEngine *engine() const override;
void resetFileEngine() const;
bool autoRemove = true;
@@ -99,14 +99,14 @@ public:
~QTemporaryFileEngine();
bool isReallyOpen() const;
- void setFileName(const QString &file);
+ void setFileName(const QString &file) override;
void setFileTemplate(const QString &fileTemplate);
- bool open(QIODevice::OpenMode flags);
- bool remove();
- bool rename(const QString &newName);
- bool renameOverwrite(const QString &newName);
- bool close();
+ bool open(QIODevice::OpenMode flags) override;
+ bool remove() override;
+ bool rename(const QString &newName) override;
+ bool renameOverwrite(const QString &newName) override;
+ bool close() override;
quint32 fileMode;
bool filePathIsTemplate;
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 5b34813a71..60ce752eb6 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -3690,6 +3690,9 @@ bool QUrl::matches(const QUrl &url, FormattingOptions options) const
if ((d->sectionIsPresent & mask) != (url.d->sectionIsPresent & mask))
return false;
+ if (options & QUrl::RemovePath)
+ return true;
+
// Compare paths, after applying path-related options
QString path1;
d->appendPath(path1, options, QUrlPrivate::Path);
diff --git a/src/corelib/io/qurltlds_p.h.INFO b/src/corelib/io/qurltlds_p.h.INFO
index 3f3d808a21..33ccd458bf 100644
--- a/src/corelib/io/qurltlds_p.h.INFO
+++ b/src/corelib/io/qurltlds_p.h.INFO
@@ -9,9 +9,6 @@ Those arrays in qurltlds_p.h are derived from the Public
Suffix List ([2]), which was originally provided by
Jo Hermans <jo.hermans@gmail.com>.
-The file qurltlds_p.h was last generated Thursday,
-October 20th 8:40 2016.
-
----
[1] list: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
[2] homepage: http://publicsuffix.org/
diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp
index 0eb0d21ecf..39738b90a8 100644
--- a/src/corelib/json/qjsonparser.cpp
+++ b/src/corelib/json/qjsonparser.cpp
@@ -500,9 +500,10 @@ namespace {
memcpy(newValues, data, size*sizeof(QJsonPrivate::Value));
data = newValues;
} else {
- data = static_cast<QJsonPrivate::Value *>(realloc(data, alloc*sizeof(QJsonPrivate::Value)));
- if (!data)
+ void *newValues = realloc(data, alloc * sizeof(QJsonPrivate::Value));
+ if (!newValues)
return false;
+ data = static_cast<QJsonPrivate::Value *>(newValues);
}
return true;
}
diff --git a/src/corelib/json/qjsonparser_p.h b/src/corelib/json/qjsonparser_p.h
index afa2c1a8cf..379256847f 100644
--- a/src/corelib/json/qjsonparser_p.h
+++ b/src/corelib/json/qjsonparser_p.h
@@ -108,11 +108,12 @@ private:
inline int reserveSpace(int space) {
if (current + space >= dataLength) {
dataLength = 2*dataLength + space;
- data = (char *)realloc(data, dataLength);
- if (!data) {
+ char *newData = (char *)realloc(data, dataLength);
+ if (!newData) {
lastError = QJsonParseError::DocumentTooLarge;
return -1;
}
+ data = newData;
}
int pos = current;
current += space;
diff --git a/src/corelib/kernel/qdeadlinetimer.cpp b/src/corelib/kernel/qdeadlinetimer.cpp
index 17a74b22d7..d670637d53 100644
--- a/src/corelib/kernel/qdeadlinetimer.cpp
+++ b/src/corelib/kernel/qdeadlinetimer.cpp
@@ -173,9 +173,9 @@ Q_DECL_CONST_FUNCTION static inline QPair<qint64, qint64> toSecsAndNSecs(qint64
*/
/*!
- \fn QDeadlineTimer::QDeadlineTimer(ForeverConstant, Qt::TimerType timerType)
+ \fn QDeadlineTimer::QDeadlineTimer(ForeverConstant foreverConstant, Qt::TimerType timerType)
- QDeadlineTimer objects created with parameter \a ForeverConstant never expire.
+ QDeadlineTimer objects created with parameter \a foreverConstant never expire.
For such objects, remainingTime() will return -1, deadline() will return the
maximum value, and isForever() will return true.
@@ -295,7 +295,7 @@ void QDeadlineTimer::setRemainingTime(qint64 msecs, Qt::TimerType timerType) Q_D
parameters are zero, this QDeadlineTimer will be marked as expired.
The timer type for this QDeadlineTimer object will be set to the specified
- \a type.
+ \a timerType.
\sa setRemainingTime(), hasExpired(), isForever(), remainingTime()
*/
@@ -341,24 +341,7 @@ void QDeadlineTimer::setPreciseRemainingTime(qint64 secs, qint64 nsecs, Qt::Time
*/
/*!
- \fn void QDeadlineTimer::setPreciseRemainingTime(qint64 secs, unsigned nsecs, Qt::TimerType type)
-
- Sets the remaining time for this QDeadlineTimer object to \a secs seconds
- and \a nsecs nanoseconds from now, if \a secs is a positive value. If both
- values are zero, this QDeadlineTimer object will be marked as expired,
- whereas if \a secs is -1, it will set it to never expire.
-
- If value of \a nsecs is more than 1 billion nanoseconds (1 second), this
- function will adjust \a secs accordingly.
-
- The timer type for this QDeadlineTimer object will be set to the specified \a type.
-
- \sa setRemainingTime(), hasExpired(), isForever(), remainingTime()
-*/
-
-/*!
- \overload
- \fn Duration QDeadlineTimer::remainingTime() const
+ \fn std::chrono::nanoseconds remainingTimeAsDuration() const
Returns a \c{std::chrono::duration} object of type \c{Duration} containing
the remaining time in this QDeadlineTimer, if it still has time left. If
diff --git a/src/corelib/kernel/qelapsedtimer.cpp b/src/corelib/kernel/qelapsedtimer.cpp
index 5e9d1317ac..e578b5b8b3 100644
--- a/src/corelib/kernel/qelapsedtimer.cpp
+++ b/src/corelib/kernel/qelapsedtimer.cpp
@@ -83,7 +83,7 @@ QT_BEGIN_NAMESPACE
\snippet qelapsedtimer/main.cpp 2
- It is often more convenient to use \ref{QDeadlineTimer} in this case, which
+ It is often more convenient to use \l{QDeadlineTimer} in this case, which
counts towards a timeout in the future instead of tracking elapsed time.
\section1 Reference Clocks
diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h
index e94e713e1f..79c9c8303e 100644
--- a/src/corelib/kernel/qobjectdefs_impl.h
+++ b/src/corelib/kernel/qobjectdefs_impl.h
@@ -229,8 +229,14 @@ namespace QtPrivate {
(std::is_floating_point<From>::value && std::is_integral<To>::value) ||
(std::is_floating_point<From>::value && std::is_floating_point<To>::value && sizeof(From) > sizeof(To)) ||
((std::is_integral<From>::value || std::is_enum<From>::value) && std::is_floating_point<To>::value) ||
- (std::is_integral<From>::value && std::is_integral<To>::value && (sizeof(From) > sizeof(To) || std::is_signed<From>::value != std::is_signed<To>::value)) ||
- (std::is_enum<From>::value && std::is_integral<To>::value && (sizeof(From) > sizeof(To) || IsEnumUnderlyingTypeSigned<From>::value != std::is_signed<To>::value))
+ (std::is_integral<From>::value && std::is_integral<To>::value
+ && (sizeof(From) > sizeof(To)
+ || (std::is_signed<From>::value ? !std::is_signed<To>::value
+ : (std::is_signed<To>::value && sizeof(From) == sizeof(To))))) ||
+ (std::is_enum<From>::value && std::is_integral<To>::value
+ && (sizeof(From) > sizeof(To)
+ || (IsEnumUnderlyingTypeSigned<From>::value ? !std::is_signed<To>::value
+ : (std::is_signed<To>::value && sizeof(From) == sizeof(To)))))
>
{
};
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index f786b2ae03..448e6117b1 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -264,7 +264,7 @@ bool QMimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
\code
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
- <mime-type type="application/vnd.nokia.qt.qmakeprofile">
+ <mime-type type="application/vnd.qt.qmakeprofile">
<comment xml:lang="en">Qt qmake Profile</comment>
<glob pattern="*.pro" weight="50"/>
</mime-type>
diff --git a/src/corelib/mimetypes/qmimetypeparser_p.h b/src/corelib/mimetypes/qmimetypeparser_p.h
index a502439419..0ce39e701c 100644
--- a/src/corelib/mimetypes/qmimetypeparser_p.h
+++ b/src/corelib/mimetypes/qmimetypeparser_p.h
@@ -108,19 +108,19 @@ public:
explicit QMimeTypeParser(QMimeXMLProvider &provider) : m_provider(provider) {}
protected:
- inline bool process(const QMimeType &t, QString *)
+ inline bool process(const QMimeType &t, QString *) override
{ m_provider.addMimeType(t); return true; }
- inline bool process(const QMimeGlobPattern &glob, QString *)
+ inline bool process(const QMimeGlobPattern &glob, QString *) override
{ m_provider.addGlobPattern(glob); return true; }
- inline void processParent(const QString &child, const QString &parent)
+ inline void processParent(const QString &child, const QString &parent) override
{ m_provider.addParent(child, parent); }
- inline void processAlias(const QString &alias, const QString &name)
+ inline void processAlias(const QString &alias, const QString &name) override
{ m_provider.addAlias(alias, name); }
- inline void processMagicMatcher(const QMimeMagicRuleMatcher &matcher)
+ inline void processMagicMatcher(const QMimeMagicRuleMatcher &matcher) override
{ m_provider.addMagicMatcher(matcher); }
private:
diff --git a/src/corelib/statemachine/qhistorystate_p.h b/src/corelib/statemachine/qhistorystate_p.h
index 4a4442d7dd..d22e5c4aaf 100644
--- a/src/corelib/statemachine/qhistorystate_p.h
+++ b/src/corelib/statemachine/qhistorystate_p.h
@@ -88,8 +88,8 @@ protected:
// state, it will handle this transition as a special case. The history state itself is never
// entered either: either the stored configuration will be used, or the target(s) of this
// transition are used.
- virtual bool eventTest(QEvent *event) { Q_UNUSED(event); return false; }
- virtual void onTransition(QEvent *event) { Q_UNUSED(event); }
+ bool eventTest(QEvent *event) override { Q_UNUSED(event); return false; }
+ void onTransition(QEvent *event) override { Q_UNUSED(event); }
};
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h
index 447fca44c0..24218e833a 100644
--- a/src/corelib/thread/qbasicatomic.h
+++ b/src/corelib/thread/qbasicatomic.h
@@ -61,6 +61,9 @@
# error "Qt requires C++11 support"
#endif
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_MSVC(4522)
+
QT_BEGIN_NAMESPACE
#if 0
@@ -323,4 +326,6 @@ public:
QT_END_NAMESPACE
+QT_WARNING_POP
+
#endif // QBASICATOMIC_H
diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp
index ce31fe9270..c62b8fd36b 100644
--- a/src/corelib/thread/qfutureinterface.cpp
+++ b/src/corelib/thread/qfutureinterface.cpp
@@ -83,13 +83,33 @@ QFutureInterfaceBase::~QFutureInterfaceBase()
delete d;
}
+static inline int switch_on(QAtomicInt &a, int which)
+{
+ return a.fetchAndOrRelaxed(which) | which;
+}
+
+static inline int switch_off(QAtomicInt &a, int which)
+{
+ return a.fetchAndAndRelaxed(~which) & ~which;
+}
+
+static inline int switch_from_to(QAtomicInt &a, int from, int to)
+{
+ int newValue;
+ int expected = a.load();
+ do {
+ newValue = (expected & ~from) | to;
+ } while (!a.testAndSetRelaxed(expected, newValue, expected));
+ return newValue;
+}
+
void QFutureInterfaceBase::cancel()
{
QMutexLocker locker(&d->m_mutex);
- if (d->state & Canceled)
+ if (d->state.load() & Canceled)
return;
- d->state = State((d->state & ~Paused) | Canceled);
+ switch_from_to(d->state, Paused, Canceled);
d->waitCondition.wakeAll();
d->pausedWaitCondition.wakeAll();
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Canceled));
@@ -99,10 +119,10 @@ void QFutureInterfaceBase::setPaused(bool paused)
{
QMutexLocker locker(&d->m_mutex);
if (paused) {
- d->state = State(d->state | Paused);
+ switch_on(d->state, Paused);
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Paused));
} else {
- d->state = State(d->state & ~Paused);
+ switch_off(d->state, Paused);
d->pausedWaitCondition.wakeAll();
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Resumed));
}
@@ -111,29 +131,24 @@ void QFutureInterfaceBase::setPaused(bool paused)
void QFutureInterfaceBase::togglePaused()
{
QMutexLocker locker(&d->m_mutex);
- if (d->state & Paused) {
- d->state = State(d->state & ~Paused);
+ if (d->state.load() & Paused) {
+ switch_off(d->state, Paused);
d->pausedWaitCondition.wakeAll();
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Resumed));
} else {
- d->state = State(d->state | Paused);
+ switch_on(d->state, Paused);
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Paused));
}
}
void QFutureInterfaceBase::setThrottled(bool enable)
{
- // bail out if we are not changing the state
- if ((enable && (d->state & Throttled)) || (!enable && !(d->state & Throttled)))
- return;
-
- // lock and change the state
QMutexLocker lock(&d->m_mutex);
if (enable) {
- d->state = State(d->state | Throttled);
+ switch_on(d->state, Throttled);
} else {
- d->state = State(d->state & ~Throttled);
- if (!(d->state & Paused))
+ switch_off(d->state, Throttled);
+ if (!(d->state.load() & Paused))
d->pausedWaitCondition.wakeAll();
}
}
@@ -184,11 +199,15 @@ bool QFutureInterfaceBase::waitForNextResult()
void QFutureInterfaceBase::waitForResume()
{
// return early if possible to avoid taking the mutex lock.
- if ((d->state & Paused) == false || (d->state & Canceled))
- return;
+ {
+ const int state = d->state.load();
+ if (!(state & Paused) || (state & Canceled))
+ return;
+ }
QMutexLocker lock(&d->m_mutex);
- if ((d->state & Paused) == false || (d->state & Canceled))
+ const int state = d->state.load();
+ if (!(state & Paused) || (state & Canceled))
return;
// decrease active thread count since this thread will wait.
@@ -236,7 +255,7 @@ bool QFutureInterfaceBase::isProgressUpdateNeeded() const
void QFutureInterfaceBase::reportStarted()
{
QMutexLocker locker(&d->m_mutex);
- if ((d->state & Started) || (d->state & Canceled) || (d->state & Finished))
+ if (d->state.load() & (Started|Canceled|Finished))
return;
d->setState(State(Started | Running));
@@ -252,11 +271,11 @@ void QFutureInterfaceBase::reportCanceled()
void QFutureInterfaceBase::reportException(const QException &exception)
{
QMutexLocker locker(&d->m_mutex);
- if ((d->state & Canceled) || (d->state & Finished))
+ if (d->state.load() & (Canceled|Finished))
return;
d->m_exceptionStore.setException(exception);
- d->state = State(d->state | Canceled);
+ switch_on(d->state, Canceled);
d->waitCondition.wakeAll();
d->pausedWaitCondition.wakeAll();
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Canceled));
@@ -266,8 +285,8 @@ void QFutureInterfaceBase::reportException(const QException &exception)
void QFutureInterfaceBase::reportFinished()
{
QMutexLocker locker(&d->m_mutex);
- if (!(d->state & Finished)) {
- d->state = State((d->state & ~Running) | Finished);
+ if (!isFinished()) {
+ switch_from_to(d->state, Running, Finished);
d->waitCondition.wakeAll();
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Finished));
}
@@ -287,7 +306,7 @@ int QFutureInterfaceBase::expectedResultCount()
bool QFutureInterfaceBase::queryState(State state) const
{
- return (d->state & state);
+ return d->state.load() & state;
}
void QFutureInterfaceBase::waitForResult(int resultIndex)
@@ -295,7 +314,7 @@ void QFutureInterfaceBase::waitForResult(int resultIndex)
d->m_exceptionStore.throwPossibleException();
QMutexLocker lock(&d->m_mutex);
- if (!(d->state & Running))
+ if (!isRunning())
return;
lock.unlock();
@@ -305,11 +324,9 @@ void QFutureInterfaceBase::waitForResult(int resultIndex)
lock.relock();
- if (d->state & Running) {
- const int waitIndex = (resultIndex == -1) ? INT_MAX : resultIndex;
- while ((d->state & Running) && d->internal_isResultReadyAt(waitIndex) == false)
- d->waitCondition.wait(&d->m_mutex);
- }
+ const int waitIndex = (resultIndex == -1) ? INT_MAX : resultIndex;
+ while (isRunning() && !d->internal_isResultReadyAt(waitIndex))
+ d->waitCondition.wait(&d->m_mutex);
d->m_exceptionStore.throwPossibleException();
}
@@ -317,7 +334,7 @@ void QFutureInterfaceBase::waitForResult(int resultIndex)
void QFutureInterfaceBase::waitForFinished()
{
QMutexLocker lock(&d->m_mutex);
- const bool alreadyFinished = !(d->state & Running);
+ const bool alreadyFinished = !isRunning();
lock.unlock();
if (!alreadyFinished) {
@@ -325,7 +342,7 @@ void QFutureInterfaceBase::waitForFinished()
lock.relock();
- while (d->state & Running)
+ while (isRunning())
d->waitCondition.wait(&d->m_mutex);
}
@@ -334,7 +351,7 @@ void QFutureInterfaceBase::waitForFinished()
void QFutureInterfaceBase::reportResultsReady(int beginIndex, int endIndex)
{
- if ((d->state & Canceled) || (d->state & Finished) || beginIndex == endIndex)
+ if (beginIndex == endIndex || (d->state.load() & (Canceled|Finished)))
return;
d->waitCondition.wakeAll();
@@ -396,7 +413,7 @@ void QFutureInterfaceBase::setProgressValueAndText(int progressValue,
if (d->m_progressValue >= progressValue)
return;
- if ((d->state & Canceled) || (d->state & Finished))
+ if (d->state.load() & (Canceled|Finished))
return;
if (d->internal_updateProgress(progressValue, progressText)) {
@@ -468,10 +485,10 @@ bool QFutureInterfaceBasePrivate::internal_waitForNextResult()
if (m_results.hasNextResult())
return true;
- while ((state & QFutureInterfaceBase::Running) && m_results.hasNextResult() == false)
+ while ((state.load() & QFutureInterfaceBase::Running) && m_results.hasNextResult() == false)
waitCondition.wait(&m_mutex);
- return (!(state & QFutureInterfaceBase::Canceled) && m_results.hasNextResult());
+ return !(state.load() & QFutureInterfaceBase::Canceled) && m_results.hasNextResult();
}
bool QFutureInterfaceBasePrivate::internal_updateProgress(int progress,
@@ -494,16 +511,16 @@ bool QFutureInterfaceBasePrivate::internal_updateProgress(int progress,
void QFutureInterfaceBasePrivate::internal_setThrottled(bool enable)
{
// bail out if we are not changing the state
- if ((enable && (state & QFutureInterfaceBase::Throttled))
- || (!enable && !(state & QFutureInterfaceBase::Throttled)))
+ if ((enable && (state.load() & QFutureInterfaceBase::Throttled))
+ || (!enable && !(state.load() & QFutureInterfaceBase::Throttled)))
return;
// change the state
if (enable) {
- state = QFutureInterfaceBase::State(state | QFutureInterfaceBase::Throttled);
+ switch_on(state, QFutureInterfaceBase::Throttled);
} else {
- state = QFutureInterfaceBase::State(state & ~QFutureInterfaceBase::Throttled);
- if (!(state & QFutureInterfaceBase::Paused))
+ switch_off(state, QFutureInterfaceBase::Throttled);
+ if (!(state.load() & QFutureInterfaceBase::Paused))
pausedWaitCondition.wakeAll();
}
}
@@ -538,7 +555,7 @@ void QFutureInterfaceBasePrivate::connectOutputInterface(QFutureCallOutInterface
{
QMutexLocker locker(&m_mutex);
- if (state & QFutureInterfaceBase::Started) {
+ if (state.load() & QFutureInterfaceBase::Started) {
interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Started));
interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::ProgressRange,
m_progressMinimum,
@@ -558,13 +575,13 @@ void QFutureInterfaceBasePrivate::connectOutputInterface(QFutureCallOutInterface
it.batchedAdvance();
}
- if (state & QFutureInterfaceBase::Paused)
+ if (state.load() & QFutureInterfaceBase::Paused)
interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Paused));
- if (state & QFutureInterfaceBase::Canceled)
+ if (state.load() & QFutureInterfaceBase::Canceled)
interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Canceled));
- if (state & QFutureInterfaceBase::Finished)
+ if (state.load() & QFutureInterfaceBase::Finished)
interface->postCallOutEvent(QFutureCallOutEvent(QFutureCallOutEvent::Finished));
outputConnections.append(interface);
@@ -583,7 +600,7 @@ void QFutureInterfaceBasePrivate::disconnectOutputInterface(QFutureCallOutInterf
void QFutureInterfaceBasePrivate::setState(QFutureInterfaceBase::State newState)
{
- state = newState;
+ state.store(newState);
}
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qfutureinterface_p.h b/src/corelib/thread/qfutureinterface_p.h
index ee8dfe1354..cf882dd9b4 100644
--- a/src/corelib/thread/qfutureinterface_p.h
+++ b/src/corelib/thread/qfutureinterface_p.h
@@ -162,7 +162,7 @@ public:
int m_progressValue; // TQ
int m_progressMinimum; // TQ
int m_progressMaximum; // TQ
- QFutureInterfaceBase::State state;
+ QAtomicInt state; // reads and writes can happen unprotected, both must be atomic
QElapsedTimer progressTime;
QWaitCondition pausedWaitCondition;
QtPrivate::ResultStoreBase m_results;
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 6e0fa4eedb..0aee4aeda4 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -275,7 +275,7 @@ bool QMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT
Attempts to lock the mutex. This function returns \c true if the lock
was obtained; otherwise it returns \c false. If another thread has
- locked the mutex, this function will wait for at most \a duration
+ locked the mutex, this function will wait for at least \a duration
for the mutex to become available.
Note: Passing a negative duration as the \a duration is equivalent to
@@ -299,7 +299,7 @@ bool QMutex::tryLock(int timeout) QT_MUTEX_LOCK_NOEXCEPT
Attempts to lock the mutex. This function returns \c true if the lock
was obtained; otherwise it returns \c false. If another thread has
- locked the mutex, this function will wait at most until \a timePoint
+ locked the mutex, this function will wait at least until \a timePoint
for the mutex to become available.
Note: Passing a \a timePoint which has already passed is equivalent
diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h
index 3a0e22e3bd..056ebdeaa5 100644
--- a/src/corelib/thread/qmutex.h
+++ b/src/corelib/thread/qmutex.h
@@ -46,8 +46,11 @@
#if QT_HAS_INCLUDE(<chrono>)
# include <chrono>
+# include <limits>
#endif
+class tst_QMutex;
+
QT_BEGIN_NAMESPACE
@@ -135,14 +138,7 @@ public:
template <class Rep, class Period>
bool try_lock_for(std::chrono::duration<Rep, Period> duration)
{
- // N4606 § 30.4.1.3 [thread.timedmutex.requirements]/5 specifies that
- // a duration less than or equal to duration.zero() shall result in a
- // try_lock, unlike QMutex's tryLock with a negative duration which
- // results in a lock.
-
- if (duration <= duration.zero())
- return tryLock(0);
- return tryLock(std::chrono::duration_cast<std::chrono::milliseconds>(duration).count());
+ return tryLock(convertToMilliseconds(duration));
}
// TimedLockable concept
@@ -162,6 +158,32 @@ public:
private:
Q_DISABLE_COPY(QMutex)
friend class QMutexLocker;
+ friend class ::tst_QMutex;
+
+#if QT_HAS_INCLUDE(<chrono>)
+ template<class Rep, class Period>
+ static int convertToMilliseconds(std::chrono::duration<Rep, Period> duration)
+ {
+ // N4606 § 30.4.1.3.5 [thread.timedmutex.requirements] specifies that a
+ // duration less than or equal to duration.zero() shall result in a
+ // try_lock, unlike QMutex's tryLock with a negative duration which
+ // results in a lock.
+
+ if (duration <= duration.zero())
+ return 0;
+
+ // when converting from 'duration' to milliseconds, make sure that
+ // the result is not shorter than 'duration':
+ std::chrono::milliseconds wait = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
+ if (wait < duration)
+ wait += std::chrono::milliseconds(1);
+ Q_ASSERT(wait >= duration);
+ const auto ms = wait.count();
+ const auto maxInt = (std::numeric_limits<int>::max)();
+
+ return ms < maxInt ? int(ms) : maxInt;
+ }
+#endif
};
class Q_CORE_EXPORT QMutexLocker
diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h
index 38753a6726..303374b06d 100644
--- a/src/corelib/tools/qalgorithms.h
+++ b/src/corelib/tools/qalgorithms.h
@@ -48,8 +48,7 @@
QT_BEGIN_NAMESPACE
QT_WARNING_PUSH
-QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations")
-QT_WARNING_DISABLE_CLANG("-Wdeprecated-declarations")
+QT_WARNING_DISABLE_DEPRECATED
/*
Warning: The contents of QAlgorithmsPrivate is not a part of the public Qt API
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index f784aa13fc..a642358770 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -3835,7 +3835,7 @@ QString QDateTime::toString(Qt::DateFormat format) const
\li the abbreviated localized day name (e.g. 'Mon' to 'Sun').
Uses the system locale to localize the name, i.e. QLocale::system().
\row \li dddd
- \li the long localized day name (e.g. 'Monday' to 'Qt::Sunday').
+ \li the long localized day name (e.g. 'Monday' to 'Sunday').
Uses the system locale to localize the name, i.e. QLocale::system().
\row \li M \li the month as number without a leading zero (1-12)
\row \li MM \li the month as number with a leading zero (01-12)
diff --git a/src/corelib/tools/qdatetimeparser.cpp b/src/corelib/tools/qdatetimeparser.cpp
index 3271e2a8c4..621c877174 100644
--- a/src/corelib/tools/qdatetimeparser.cpp
+++ b/src/corelib/tools/qdatetimeparser.cpp
@@ -888,12 +888,12 @@ QDateTimeParser::StateNode QDateTimeParser::parse(QString &input, int &cursorPos
State state = Acceptable;
QDateTime newCurrentValue;
- int pos = 0;
bool conflicts = false;
const int sectionNodesCount = sectionNodes.size();
QDTPDEBUG << "parse" << input;
{
+ int pos = 0;
int year, month, day;
const QDate currentDate = currentValue.date();
const QTime currentTime = currentValue.time();
diff --git a/src/corelib/tools/qdatetimeparser_p.h b/src/corelib/tools/qdatetimeparser_p.h
index 6f381965a9..bc088a5f4c 100644
--- a/src/corelib/tools/qdatetimeparser_p.h
+++ b/src/corelib/tools/qdatetimeparser_p.h
@@ -104,14 +104,6 @@ public:
none.zeroesAdded = 0;
}
virtual ~QDateTimeParser() {}
- enum AmPmFinder {
- Neither = -1,
- AM = 0,
- PM = 1,
- PossibleAM = 2,
- PossiblePM = 3,
- PossibleBoth = 4
- };
enum Section {
NoSection = 0x00000,
@@ -187,33 +179,44 @@ public:
#ifndef QT_NO_DATESTRING
StateNode parse(QString &input, int &cursorPosition, const QDateTime &currentValue, bool fixup) const;
#endif
- int sectionMaxSize(int index) const;
- int sectionSize(int index) const;
- int sectionMaxSize(Section s, int count) const;
- int sectionPos(int index) const;
- int sectionPos(const SectionNode &sn) const;
-
- const SectionNode &sectionNode(int index) const;
- Section sectionType(int index) const;
- QString sectionText(int sectionIndex) const;
- QString sectionText(const QString &text, int sectionIndex, int index) const;
- int getDigit(const QDateTime &dt, int index) const;
- bool setDigit(QDateTime &t, int index, int newval) const;
- int parseSection(const QDateTime &currentValue, int sectionIndex, QString &txt, int &cursorPosition,
- int index, QDateTimeParser::State &state, int *used = 0) const;
- int absoluteMax(int index, const QDateTime &value = QDateTime()) const;
- int absoluteMin(int index) const;
bool parseFormat(const QString &format);
#ifndef QT_NO_DATESTRING
bool fromString(const QString &text, QDate *date, QTime *time) const;
#endif
+ enum FieldInfoFlag {
+ Numeric = 0x01,
+ FixedWidth = 0x02,
+ AllowPartial = 0x04,
+ Fraction = 0x08
+ };
+ Q_DECLARE_FLAGS(FieldInfo, FieldInfoFlag)
+
+ FieldInfo fieldInfo(int index) const;
+
+ void setDefaultLocale(const QLocale &loc) { defaultLocale = loc; }
+ virtual QString displayText() const { return text; }
+
+private:
+ int sectionMaxSize(Section s, int count) const;
+ QString sectionText(const QString &text, int sectionIndex, int index) const;
+ int parseSection(const QDateTime &currentValue, int sectionIndex, QString &txt, int &cursorPosition,
+ int index, QDateTimeParser::State &state, int *used = 0) const;
#ifndef QT_NO_TEXTDATE
int findMonth(const QString &str1, int monthstart, int sectionIndex,
QString *monthName = 0, int *used = 0) const;
int findDay(const QString &str1, int intDaystart, int sectionIndex,
QString *dayName = 0, int *used = 0) const;
#endif
+
+ enum AmPmFinder {
+ Neither = -1,
+ AM = 0,
+ PM = 1,
+ PossibleAM = 2,
+ PossiblePM = 3,
+ PossibleBoth = 4
+ };
AmPmFinder findAmPm(QString &str, int index, int *used = 0) const;
bool potentialValue(const QStringRef &str, int min, int max, int index,
const QDateTime &currentValue, int insert) const;
@@ -223,36 +226,37 @@ public:
return potentialValue(QStringRef(&str), min, max, index, currentValue, insert);
}
+protected: // for the benefit of QDateTimeEditPrivate
+ int sectionSize(int index) const;
+ int sectionMaxSize(int index) const;
+ int sectionPos(int index) const;
+ int sectionPos(const SectionNode &sn) const;
+
+ const SectionNode &sectionNode(int index) const;
+ Section sectionType(int index) const;
+ QString sectionText(int sectionIndex) const;
+ int getDigit(const QDateTime &dt, int index) const;
+ bool setDigit(QDateTime &t, int index, int newval) const;
+
+ int absoluteMax(int index, const QDateTime &value = QDateTime()) const;
+ int absoluteMin(int index) const;
+
bool skipToNextSection(int section, const QDateTime &current, const QStringRef &sectionText) const;
bool skipToNextSection(int section, const QDateTime &current, const QString &sectionText) const
{
return skipToNextSection(section, current, QStringRef(&sectionText));
}
-
QString stateName(State s) const;
-
- enum FieldInfoFlag {
- Numeric = 0x01,
- FixedWidth = 0x02,
- AllowPartial = 0x04,
- Fraction = 0x08
- };
- Q_DECLARE_FLAGS(FieldInfo, FieldInfoFlag)
-
- FieldInfo fieldInfo(int index) const;
-
- void setDefaultLocale(const QLocale &loc) { defaultLocale = loc; }
virtual QDateTime getMinimum() const;
virtual QDateTime getMaximum() const;
virtual int cursorPosition() const { return -1; }
- virtual QString displayText() const { return text; }
virtual QString getAmPmText(AmPm ap, Case cs) const;
virtual QLocale locale() const { return defaultLocale; }
mutable int currentSectionIndex;
Sections display;
/*
- This stores the stores the most recently selected day.
+ This stores the most recently selected day.
It is useful when considering the following scenario:
1. Date is: 31/01/2000
@@ -272,9 +276,7 @@ public:
QString displayFormat;
QLocale defaultLocale;
QVariant::Type parserType;
-
bool fixday;
-
Qt::TimeSpec spec; // spec if used by QDateTimeEdit
Context context;
};
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 8520bb5740..eef375fe72 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -2300,21 +2300,20 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
*/
QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
{
- int i = 0;
- ushort c = ch.unicode();
- if (cs == Qt::CaseSensitive) {
- while (i < d->size)
- if (d->data()[i] == ch)
- remove(i, 1);
- else
- i++;
- } else {
- c = foldCase(c);
- while (i < d->size)
- if (foldCase(d->data()[i]) == c)
- remove(i, 1);
- else
- i++;
+ const int idx = indexOf(ch, 0, cs);
+ if (idx != -1) {
+ const auto first = begin(); // implicit detach()
+ auto last = end();
+ if (cs == Qt::CaseSensitive) {
+ last = std::remove(first + idx, last, ch);
+ } else {
+ const QChar c = ch.toCaseFolded();
+ auto caseInsensEqual = [c](QChar x) {
+ return c == x.toCaseFolded();
+ };
+ last = std::remove_if(first + idx, last, caseInsensEqual);
+ }
+ resize(last - first);
}
return *this;
}
@@ -3261,6 +3260,23 @@ static int lastIndexOfHelper(const ushort *haystack, int from, const ushort *nee
return -1;
}
+static inline int lastIndexOfHelper(
+ const QStringRef &haystack, int from, const QStringRef &needle, Qt::CaseSensitivity cs)
+{
+ return lastIndexOfHelper(reinterpret_cast<const ushort*>(haystack.unicode()), from,
+ reinterpret_cast<const ushort*>(needle.unicode()), needle.size(), cs);
+}
+
+static inline int lastIndexOfHelper(
+ const QStringRef &haystack, int from, QLatin1String needle, Qt::CaseSensitivity cs)
+{
+ const int size = needle.size();
+ QVarLengthArray<ushort> s(size);
+ qt_from_latin1(s.data(), needle.latin1(), size);
+ return lastIndexOfHelper(reinterpret_cast<const ushort*>(haystack.unicode()), from,
+ s.data(), size, cs);
+}
+
/*!
Returns the index position of the last occurrence of the string \a
str in this string, searching backward from index position \a
@@ -9817,6 +9833,27 @@ int QStringRef::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
return qt_last_index_of(unicode(), size(), ch, from, cs);
}
+template<typename T>
+static int last_index_of_impl(const QStringRef &haystack, int from, const T &needle, Qt::CaseSensitivity cs)
+{
+ const int sl = needle.size();
+ if (sl == 1)
+ return haystack.lastIndexOf(needle.at(0), from, cs);
+
+ const int l = haystack.size();
+ if (from < 0)
+ from += l;
+ int delta = l - sl;
+ if (from == l && sl == 0)
+ return from;
+ if (uint(from) >= uint(l) || delta < 0)
+ return -1;
+ if (from > delta)
+ from = delta;
+
+ return lastIndexOfHelper(haystack, from, needle, cs);
+}
+
/*!
\since 4.8
\overload lastIndexOf()
@@ -9834,25 +9871,7 @@ int QStringRef::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
*/
int QStringRef::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
{
- const int sl = str.size();
- if (sl == 1)
- return lastIndexOf(str.at(0), from, cs);
-
- const int l = size();
- if (from < 0)
- from += l;
- int delta = l - sl;
- if (from == l && sl == 0)
- return from;
- if (uint(from) >= uint(l) || delta < 0)
- return -1;
- if (from > delta)
- from = delta;
-
- QVarLengthArray<ushort> s(sl);
- qt_from_latin1(s.data(), str.latin1(), sl);
-
- return lastIndexOfHelper(reinterpret_cast<const ushort*>(unicode()), from, s.data(), sl, cs);
+ return last_index_of_impl(*this, from, str, cs);
}
/*!
@@ -9872,24 +9891,7 @@ int QStringRef::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs)
*/
int QStringRef::lastIndexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const
{
- const int sl = str.size();
- if (sl == 1)
- return lastIndexOf(str.at(0), from, cs);
-
- const int l = size();
- if (from < 0)
- from += l;
- int delta = l - sl;
- if (from == l && sl == 0)
- return from;
- if (uint(from) >= uint(l) || delta < 0)
- return -1;
- if (from > delta)
- from = delta;
-
- return lastIndexOfHelper(reinterpret_cast<const ushort*>(unicode()), from,
- reinterpret_cast<const ushort*>(str.unicode()),
- str.size(), cs);
+ return last_index_of_impl(*this, from, str, cs);
}
/*!
diff --git a/src/gui/configure.json b/src/gui/configure.json
index 6fba8173b4..1f5011617c 100644
--- a/src/gui/configure.json
+++ b/src/gui/configure.json
@@ -964,6 +964,13 @@
"section": "Utilities",
"condition": "features.properties",
"output": [ "publicFeature", "feature" ]
+ },
+ "multiprocess": {
+ "label": "Multi process",
+ "description": "Provides support for detecting the desktop environment, launching external processes and opening URLs.",
+ "section": "Utilities",
+ "condition": "!config.integrity",
+ "output": [ "privateFeature" ]
}
},
diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h
index 91aaf673d0..fd2298561e 100644
--- a/src/gui/image/qimage.h
+++ b/src/gui/image/qimage.h
@@ -381,8 +381,7 @@ inline void QImage::setPixelColor(const QPoint &pt, const QColor &c) { setPixelC
#if QT_DEPRECATED_SINCE(5, 0)
QT_WARNING_PUSH
-QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations")
-QT_WARNING_DISABLE_MSVC(4996)
+QT_WARNING_DISABLE_DEPRECATED
inline QString QImage::text(const char* key, const char* lang) const
{
diff --git a/src/gui/image/qxbmhandler.cpp b/src/gui/image/qxbmhandler.cpp
index eda816f0f2..19015c5dcd 100644
--- a/src/gui/image/qxbmhandler.cpp
+++ b/src/gui/image/qxbmhandler.cpp
@@ -124,17 +124,18 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage)
qint64 readBytes = 0;
+ char *p;
+
// scan for database
- for (;;) {
+ do {
if ((readBytes = device->readLine(buf, buflen)) <= 0) {
// end of file
return false;
}
buf[readBytes] = '\0';
- if (QByteArray::fromRawData(buf, readBytes).contains("0x"))
- break;
- }
+ p = strstr(buf, "0x");
+ } while (!p);
if (outImage->size() != QSize(w, h) || outImage->format() != QImage::Format_MonoLSB) {
*outImage = QImage(w, h, QImage::Format_MonoLSB);
@@ -148,7 +149,6 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage)
int x = 0, y = 0;
uchar *b = outImage->scanLine(0);
- char *p = buf + QByteArray::fromRawData(buf, readBytes).indexOf("0x");
w = (w+7)/8; // byte width
while (y < h) { // for all encoded bytes...
@@ -163,7 +163,8 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage)
} else { // read another line
if ((readBytes = device->readLine(buf,buflen)) <= 0) // EOF ==> truncated image
break;
- p = buf + QByteArray::fromRawData(buf, readBytes).indexOf("0x");
+ buf[readBytes] = '\0';
+ p = strstr(buf, "0x");
}
}
diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp
index d59bd63caf..a6bc7d4d9c 100644
--- a/src/gui/kernel/qkeysequence.cpp
+++ b/src/gui/kernel/qkeysequence.cpp
@@ -1528,7 +1528,9 @@ bool QKeySequence::isDetached() const
If the key sequence has no keys, an empty string is returned.
On \macos, the string returned resembles the sequence that is
- shown in the menu bar.
+ shown in the menu bar if \a format is
+ QKeySequence::NativeText; otherwise, the string uses the
+ "portable" format, suitable for writing to a file.
\sa fromString()
*/
diff --git a/src/gui/opengl/opengl.pri b/src/gui/opengl/opengl.pri
index 712cf144e0..1a1022b3a7 100644
--- a/src/gui/opengl/opengl.pri
+++ b/src/gui/opengl/opengl.pri
@@ -24,7 +24,6 @@ qtConfig(opengl) {
opengl/qopenglcustomshaderstage_p.h \
opengl/qopengltextureglyphcache_p.h \
opengl/qopenglshadercache_p.h \
- opengl/qopenglshadercache_meego_p.h \
opengl/qopenglversionfunctions.h \
opengl/qopenglversionfunctionsfactory_p.h \
opengl/qopenglvertexarrayobject.h \
diff --git a/src/gui/opengl/qopenglshadercache_meego_p.h b/src/gui/opengl/qopenglshadercache_meego_p.h
deleted file mode 100644
index 0892e1a2a1..0000000000
--- a/src/gui/opengl/qopenglshadercache_meego_p.h
+++ /dev/null
@@ -1,450 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QOPENGLSHADERCACHE_MEEGO_P_H
-#define QOPENGLSHADERCACHE_MEEGO_P_H
-
-#include <QtCore/qopenglobal.h>
-
-#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
-
-#include <QtCore/qcryptographichash.h>
-#include <QtCore/qsharedmemory.h>
-#include <QtCore/qsystemsemaphore.h>
-
-#ifndef QT_BOOTSTRAPPED
-# include <GLES2/gl2ext.h>
-#endif
-#if defined(QT_DEBUG) || defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
-# include <syslog.h>
-#endif
-
-/*
- This cache stores internal Qt shader programs in shared memory.
-
- This header file is ugly on purpose and can only be included once. It is only to be used
- for the internal shader cache, not as a generic cache for anyone's shaders.
-
- The cache stores either ShaderCacheMaxEntries shader programs or ShaderCacheDataSize kilobytes
- of shader programs, whatever limit is reached first.
-
- The layout of the cache is as outlined in the CachedShaders struct. After some
- integers, an array of headers is reserved, then comes the space for the actual binaries.
-
- Shader Programs are identified by the md5sum of their frag and vertex shader source code.
-
- Shader Programs are never removed. The cache never shrinks or re-shuffles. This is done
- on purpose to ensure minimum amount of locking, no alignment problems and very few write
- operations.
-
- Note: Locking the shader cache could be expensive, because the entire system might hang.
- That's why the cache is immutable to minimize the time we need to keep it locked.
-
- Why is it Meego specific?
-
- First, the size is chosen so that it fits to generic meego usage. Second, on Meego, there's
- always at least one Qt application active (the launcher), so the cache will never be destroyed.
- Only when the last Qt app exits, the cache dies, which should only be when someone kills the
- X11 server. And last but not least it was only tested with Meego's SGX driver.
-
- There's a small tool in src/opengl/util/meego that dumps the contents of the cache.
- */
-
-// anonymous namespace, prevent exporting of the private symbols
-namespace
-{
-
-struct CachedShaderHeader
-{
- /* the index in the data[] member of CachedShaders */
- int index;
- /* the size of the binary shader */
- GLsizei size;
- /* the format of the binary shader */
- GLenum format;
- /* the md5sum of the frag+vertex shaders */
- char md5Sum[16];
-};
-
-enum
-{
- /* The maximum amount of shader programs the cache can hold */
- ShaderCacheMaxEntries = 20
-};
-
-typedef CachedShaderHeader CachedShaderHeaders[ShaderCacheMaxEntries];
-
-enum
-{
- // ShaderCacheDataSize is 20k minus the other data members of CachedShaders
- ShaderCacheDataSize = 1024 * ShaderCacheMaxEntries - sizeof(CachedShaderHeaders) - 2 * sizeof(int)
-};
-
-struct CachedShaders
-{
- /* How much space is still available in the cache */
- inline int availableSize() const { return ShaderCacheDataSize - dataSize; }
-
- /* The current amount of cached shaders */
- int shaderCount;
-
- /* The current amount (in bytes) of cached data */
- int dataSize;
-
- /* The headers describing the shaders */
- CachedShaderHeaders headers;
-
- /* The actual binary data of the shader programs */
- char data[ShaderCacheDataSize];
-};
-
-//#define QT_DEBUG_SHADER_CACHE
-#ifdef QT_DEBUG_SHADER_CACHE
-static QDebug shaderCacheDebug()
-{
- return QDebug(QtDebugMsg);
-}
-#else
-static inline QNoDebug shaderCacheDebug() { return QNoDebug(); }
-#endif
-
-class ShaderCacheSharedMemory
-{
-public:
- ShaderCacheSharedMemory()
- : shm(QLatin1String("qt_gles2_shadercache_" QT_VERSION_STR))
- {
- // we need a system semaphore here, since cache creation and initialization must be atomic
- QSystemSemaphore attachSemaphore(QLatin1String("qt_gles2_shadercache_mutex_" QT_VERSION_STR), 1);
-
- if (!attachSemaphore.acquire()) {
- shaderCacheDebug() << "Unable to require shader cache semaphore:" << attachSemaphore.errorString();
- return;
- }
-
- if (shm.attach()) {
- // success!
- shaderCacheDebug() << "Attached to shader cache";
- } else {
-
- // no cache exists - create and initialize it
- if (shm.create(sizeof(CachedShaders))) {
- shaderCacheDebug() << "Created new shader cache";
- initializeCache();
- } else {
- shaderCacheDebug() << "Unable to create shader cache:" << shm.errorString();
- }
- }
-
- attachSemaphore.release();
- }
-
- inline bool isAttached() const { return shm.isAttached(); }
-
- inline bool lock() { return shm.lock(); }
- inline bool unlock() { return shm.unlock(); }
- inline void *data() { return shm.data(); }
- inline QString errorString() { return shm.errorString(); }
-
- ~ShaderCacheSharedMemory()
- {
- if (!shm.detach())
- shaderCacheDebug() << "Unable to detach shader cache" << shm.errorString();
- }
-
-private:
- void initializeCache()
- {
- // no need to lock the shared memory since we're already protected by the
- // attach system semaphore.
-
- void *data = shm.data();
- Q_ASSERT(data);
-
- memset(data, 0, sizeof(CachedShaders));
- }
-
- QSharedMemory shm;
-};
-
-class ShaderCacheLocker
-{
-public:
- inline ShaderCacheLocker(ShaderCacheSharedMemory *cache)
- : shm(cache->lock() ? cache : (ShaderCacheSharedMemory *)0)
- {
- if (!shm)
- shaderCacheDebug() << "Unable to lock shader cache" << cache->errorString();
- }
-
- inline bool isLocked() const { return shm; }
-
- inline ~ShaderCacheLocker()
- {
- if (!shm)
- return;
- if (!shm->unlock())
- shaderCacheDebug() << "Unable to unlock shader cache" << shm->errorString();
- }
-
-private:
- ShaderCacheSharedMemory *shm;
-};
-
-#ifdef QT_BOOTSTRAPPED
-} // end namespace
-#else
-
-static void traceCacheOverflow(const char *message)
-{
-#if defined(QT_DEBUG) || defined (QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
- openlog(qPrintable(QCoreApplication::applicationName()), LOG_PID | LOG_ODELAY, LOG_USER);
- syslog(LOG_DEBUG, message);
- closelog();
-#endif
- shaderCacheDebug() << message;
-}
-
-Q_GLOBAL_STATIC(ShaderCacheSharedMemory, shaderCacheSharedMemory)
-
-/*
- Finds the index of the shader program identified by md5Sum in the cache.
- Note: Does NOT lock the cache for reading, the cache must already be locked!
-
- Returns -1 when no shader was found.
- */
-static int qt_cache_index_unlocked(const QByteArray &md5Sum, CachedShaders *cache)
-{
- for (int i = 0; i < cache->shaderCount; ++i) {
- if (qstrncmp(md5Sum.constData(), cache->headers[i].md5Sum, 16) == 0) {
- return i;
- }
- }
- return -1;
-}
-
-/* Returns the index of the shader identified by md5Sum */
-static int qt_cache_index(const QByteArray &md5Sum)
-{
- ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
- if (!shm || !shm->isAttached())
- return false;
-
- Q_ASSERT(md5Sum.length() == 16);
-
- ShaderCacheLocker locker(shm);
- if (!locker.isLocked())
- return false;
-
- void *data = shm->data();
- Q_ASSERT(data);
-
- CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
-
- return qt_cache_index_unlocked(md5Sum, cache);
-}
-
-/* Loads the cached shader at index \a shaderIndex into \a program
- * Note: Since the cache is immutable, this operation doesn't lock the shared memory.
- */
-static bool qt_cached_shader(QOpenGLShaderProgram *program, QOpenGLContext *ctx, int shaderIndex)
-{
- Q_ASSERT(shaderIndex >= 0 && shaderIndex <= ShaderCacheMaxEntries);
- Q_ASSERT(program);
-
- ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
- if (!shm || !shm->isAttached())
- return false;
-
- void *data = shm->data();
- Q_ASSERT(data);
-
- CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
-
- shaderCacheDebug() << "fetching cached shader at index" << shaderIndex
- << "dataIndex" << cache->headers[shaderIndex].index
- << "size" << cache->headers[shaderIndex].size
- << "format" << cache->headers[shaderIndex].format;
-
- // call program->programId first, since that resolves the glProgramBinaryOES symbol
- GLuint programId = program->programId();
- glProgramBinaryOES(programId, cache->headers[shaderIndex].format,
- cache->data + cache->headers[shaderIndex].index,
- cache->headers[shaderIndex].size);
-
- return true;
-}
-
-/* Stores the shader program in the cache. Returns false if there's an error with the cache, or
- if the cache is too small to hold the shader. */
-static bool qt_cache_shader(const QOpenGLShaderProgram *shader, QOpenGLContext *ctx, const QByteArray &md5Sum)
-{
- ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
- if (!shm || !shm->isAttached())
- return false;
-
- void *data = shm->data();
- Q_ASSERT(data);
-
- CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
-
- ShaderCacheLocker locker(shm);
- if (!locker.isLocked())
- return false;
-
- int cacheIdx = cache->shaderCount;
- if (cacheIdx >= ShaderCacheMaxEntries) {
- traceCacheOverflow("Qt OpenGL shader cache index overflow!");
- return false;
- }
-
- // now that we have the lock on the shared memory, make sure no one
- // inserted the shader already while we were unlocked
- if (qt_cache_index_unlocked(md5Sum, cache) != -1)
- return true; // already cached
-
- shaderCacheDebug() << "Caching shader at index" << cacheIdx;
-
- GLint binaryLength = 0;
- glGetProgramiv(shader->programId(), GL_PROGRAM_BINARY_LENGTH_OES, &binaryLength);
-
- if (!binaryLength) {
- shaderCacheDebug() << "Unable to determine binary shader size!";
- return false;
- }
-
- if (binaryLength > cache->availableSize()) {
- traceCacheOverflow("Qt OpenGL shader cache data overflow!");
- return false;
- }
-
- GLsizei size = 0;
- GLenum format = 0;
- glGetProgramBinaryOES(shader->programId(), binaryLength, &size, &format,
- cache->data + cache->dataSize);
-
- if (!size) {
- shaderCacheDebug() << "Unable to get binary shader!";
- return false;
- }
-
- cache->headers[cacheIdx].index = cache->dataSize;
- cache->dataSize += binaryLength;
- ++cache->shaderCount;
- cache->headers[cacheIdx].size = binaryLength;
- cache->headers[cacheIdx].format = format;
-
- memcpy(cache->headers[cacheIdx].md5Sum, md5Sum.constData(), 16);
-
- shaderCacheDebug() << "cached shader size" << size
- << "format" << format
- << "binarySize" << binaryLength
- << "cache index" << cacheIdx
- << "data index" << cache->headers[cacheIdx].index;
-
- return true;
-}
-
-} // namespace
-
-QT_BEGIN_NAMESPACE
-
-
-class CachedShader
-{
-public:
- CachedShader(const QByteArray &fragSource, const QByteArray &vertexSource)
- : cacheIdx(-1)
- {
- QCryptographicHash md5Hash(QCryptographicHash::Md5);
-
- md5Hash.addData(fragSource);
- md5Hash.addData(vertexSource);
-
- md5Sum = md5Hash.result();
- }
-
- bool isCached()
- {
- return cacheIndex() != -1;
- }
-
- int cacheIndex()
- {
- if (cacheIdx != -1)
- return cacheIdx;
- cacheIdx = qt_cache_index(md5Sum);
- return cacheIdx;
- }
-
- bool load(QOpenGLShaderProgram *program, QOpenGLContext *ctx)
- {
- if (cacheIndex() == -1)
- return false;
- return qt_cached_shader(program, ctx, cacheIdx);
- }
-
- bool store(QOpenGLShaderProgram *program, QOpenGLContext *ctx)
- {
- return qt_cache_shader(program, ctx, md5Sum);
- }
-
-private:
- QByteArray md5Sum;
- int cacheIdx;
-};
-
-
-QT_END_NAMESPACE
-
-#endif
-
-#endif
-#endif
diff --git a/src/gui/opengl/qopenglshadercache_p.h b/src/gui/opengl/qopenglshadercache_p.h
index b4d1d64721..0f730602b0 100644
--- a/src/gui/opengl/qopenglshadercache_p.h
+++ b/src/gui/opengl/qopenglshadercache_p.h
@@ -53,10 +53,6 @@
#include <QtGui/private/qtguiglobal_p.h>
-#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
-# include "qopenglshadercache_meego_p.h"
-#else
-
QT_BEGIN_NAMESPACE
@@ -88,4 +84,3 @@ public:
QT_END_NAMESPACE
#endif
-#endif
diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp
index e3dbf663e1..6a8091bf8b 100644
--- a/src/gui/painting/qcolor.cpp
+++ b/src/gui/painting/qcolor.cpp
@@ -795,12 +795,20 @@ QColor::QColor(Spec spec) Q_DECL_NOTHROW
/*!
\fn QColor::QColor(const char *name)
+
+ Constructs a named color in the same way as setNamedColor() using
+ the given \a name.
+
\overload
\sa setNamedColor(), name(), isValid()
*/
/*!
\fn QColor::QColor(QLatin1String name)
+
+ Constructs a named color in the same way as setNamedColor() using
+ the given \a name.
+
\overload
\since 5.8
\sa setNamedColor(), name(), isValid()
diff --git a/src/gui/painting/qcoregraphics.mm b/src/gui/painting/qcoregraphics.mm
index 6af12c19d8..466b18d59b 100644
--- a/src/gui/painting/qcoregraphics.mm
+++ b/src/gui/painting/qcoregraphics.mm
@@ -146,13 +146,16 @@ NSImage *qt_mac_create_nsimage(const QPixmap &pm)
return nsImage;
}
-NSImage *qt_mac_create_nsimage(const QIcon &icon)
+NSImage *qt_mac_create_nsimage(const QIcon &icon, int defaultSize)
{
if (icon.isNull())
return nil;
NSImage *nsImage = [[NSImage alloc] init];
- foreach (QSize size, icon.availableSizes()) {
+ QList<QSize> availableSizes = icon.availableSizes();
+ if (availableSizes.isEmpty() && defaultSize > 0)
+ availableSizes << QSize(defaultSize, defaultSize);
+ foreach (QSize size, availableSizes) {
QPixmap pm = icon.pixmap(size);
QImage image = pm.toImage();
CGImageRef cgImage = qt_mac_toCGImage(image);
diff --git a/src/gui/painting/qcoregraphics_p.h b/src/gui/painting/qcoregraphics_p.h
index ab2579387e..065910222d 100644
--- a/src/gui/painting/qcoregraphics_p.h
+++ b/src/gui/painting/qcoregraphics_p.h
@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
#ifdef Q_OS_MACOS
Q_GUI_EXPORT NSImage *qt_mac_create_nsimage(const QPixmap &pm);
-Q_GUI_EXPORT NSImage *qt_mac_create_nsimage(const QIcon &icon);
+Q_GUI_EXPORT NSImage *qt_mac_create_nsimage(const QIcon &icon, int defaultSize = 0);
Q_GUI_EXPORT QPixmap qt_mac_toQPixmap(const NSImage *image, const QSizeF &size);
#endif
Q_GUI_EXPORT CGImageRef qt_mac_toCGImage(const QImage &qImage);
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index fe1ff6603d..656b04fdf3 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -836,7 +836,10 @@ static const uint *QT_FASTCALL convertGrayscale8FromARGB32PM(uint *buffer, const
}
template <QPixelLayout::BPP bpp> static
-uint QT_FASTCALL fetchPixel(const uchar *src, int index);
+uint QT_FASTCALL fetchPixel(const uchar *, int)
+{
+ Q_UNREACHABLE();
+}
template <>
inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP1LSB>(const uchar *src, int index)
@@ -1554,92 +1557,11 @@ static const QRgba64 *QT_FASTCALL fetchUntransformed64(QRgba64 *buffer, const Op
}
}
-// blendType is either BlendTransformed or BlendTransformedTiled
-template<TextureBlendType blendType>
-static const uint *QT_FASTCALL fetchTransformedARGB32PM(uint *buffer, const Operator *, const QSpanData *data,
- int y, int x, int length)
-{
- int image_width = data->texture.width;
- int image_height = data->texture.height;
-
- const qreal cx = x + qreal(0.5);
- const qreal cy = y + qreal(0.5);
-
- const uint *end = buffer + length;
- uint *b = buffer;
- if (data->fast_matrix) {
- // The increment pr x in the scanline
- int fdx = (int)(data->m11 * fixed_scale);
- int fdy = (int)(data->m12 * fixed_scale);
-
- int fx = int((data->m21 * cy
- + data->m11 * cx + data->dx) * fixed_scale);
- int fy = int((data->m22 * cy
- + data->m12 * cx + data->dy) * fixed_scale);
-
- while (b < end) {
- int px = fx >> 16;
- int py = fy >> 16;
-
- if (blendType == BlendTransformedTiled) {
- px %= image_width;
- py %= image_height;
- if (px < 0) px += image_width;
- if (py < 0) py += image_height;
- } else {
- px = qBound(0, px, image_width - 1);
- py = qBound(0, py, image_height - 1);
- }
- *b = reinterpret_cast<const uint *>(data->texture.scanLine(py))[px];
-
- fx += fdx;
- fy += fdy;
- ++b;
- }
- } else {
- const qreal fdx = data->m11;
- const qreal fdy = data->m12;
- const qreal fdw = data->m13;
-
- qreal fx = data->m21 * cy + data->m11 * cx + data->dx;
- qreal fy = data->m22 * cy + data->m12 * cx + data->dy;
- qreal fw = data->m23 * cy + data->m13 * cx + data->m33;
-
- while (b < end) {
- const qreal iw = fw == 0 ? 1 : 1 / fw;
- const qreal tx = fx * iw;
- const qreal ty = fy * iw;
- int px = int(tx) - (tx < 0);
- int py = int(ty) - (ty < 0);
-
- if (blendType == BlendTransformedTiled) {
- px %= image_width;
- py %= image_height;
- if (px < 0) px += image_width;
- if (py < 0) py += image_height;
- } else {
- px = qBound(0, px, image_width - 1);
- py = qBound(0, py, image_height - 1);
- }
- *b = reinterpret_cast<const uint *>(data->texture.scanLine(py))[px];
-
- fx += fdx;
- fy += fdy;
- fw += fdw;
- //force increment to avoid /0
- if (!fw) {
- fw += fdw;
- }
- ++b;
- }
- }
- return buffer;
-}
-
-template<TextureBlendType blendType> /* either BlendTransformed or BlendTransformedTiled */
+template<TextureBlendType blendType, QPixelLayout::BPP bpp>
static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const QSpanData *data,
int y, int x, int length)
{
+ Q_STATIC_ASSERT(blendType == BlendTransformed || blendType == BlendTransformedTiled);
int image_width = data->texture.width;
int image_height = data->texture.height;
@@ -1647,9 +1569,12 @@ static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *,
const qreal cy = y + qreal(0.5);
const QPixelLayout *layout = &qPixelLayouts[data->texture.format];
- FetchPixelFunc fetch = qFetchPixel[layout->bpp];
+ if (bpp != QPixelLayout::BPPNone) // Like this to not ICE on GCC 5.3.1
+ Q_ASSERT(layout->bpp == bpp);
+ // When templated 'fetch' should be inlined at compile time:
+ const FetchPixelFunc fetch = (bpp == QPixelLayout::BPPNone) ? qFetchPixel[layout->bpp] : fetchPixel<bpp>;
- const uint *end = buffer + length;
+ uint *const end = buffer + length;
uint *b = buffer;
if (data->fast_matrix) {
// The increment pr x in the scanline
@@ -2585,12 +2510,17 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c
}
// blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled
-template<TextureBlendType blendType>
+template<TextureBlendType blendType, QPixelLayout::BPP bpp>
static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *,
const QSpanData *data, int y, int x, int length)
{
const QPixelLayout *layout = &qPixelLayouts[data->texture.format];
const QVector<QRgb> *clut = data->texture.colorTable;
+ if (bpp != QPixelLayout::BPPNone) // Like this to not ICE on GCC 5.3.1
+ Q_ASSERT(layout->bpp == bpp);
+ // When templated 'fetch' should be inlined at compile time:
+ const FetchPixelsFunc fetch = (bpp == QPixelLayout::BPPNone) ? qFetchPixels[layout->bpp] : fetchPixels<bpp>;
+ const FetchPixelFunc fetch1 = (bpp == QPixelLayout::BPPNone) ? qFetchPixel[layout->bpp] : fetchPixel<bpp>;
int image_width = data->texture.width;
int image_height = data->texture.height;
@@ -2628,7 +2558,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
// The idea is first to do the interpolation between the row s1 and the row s2
// into an intermediate buffer, then we interpolate between two pixel of this buffer.
- FetchPixelsFunc fetch = qFetchPixels[layout->bpp];
// +1 for the last pixel to interpolate with, and +1 for rounding errors.
uint buf1[buffer_size + 2];
uint buf2[buffer_size + 2];
@@ -2717,7 +2646,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
fx += fdx;
}
} else {
- FetchPixelFunc fetch = qFetchPixel[layout->bpp];
uint buf1[buffer_size];
uint buf2[buffer_size];
uint *b = buffer;
@@ -2728,19 +2656,10 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
int x1 = (fx >> 16);
int x2;
fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
-
- if (layout->bpp == QPixelLayout::BPP32) {
- buf1[i * 2 + 0] = ((const uint*)s1)[x1];
- buf1[i * 2 + 1] = ((const uint*)s1)[x2];
- buf2[i * 2 + 0] = ((const uint*)s2)[x1];
- buf2[i * 2 + 1] = ((const uint*)s2)[x2];
- } else {
- buf1[i * 2 + 0] = fetch(s1, x1);
- buf1[i * 2 + 1] = fetch(s1, x2);
- buf2[i * 2 + 0] = fetch(s2, x1);
- buf2[i * 2 + 1] = fetch(s2, x2);
- }
-
+ buf1[i * 2 + 0] = fetch1(s1, x1);
+ buf1[i * 2 + 1] = fetch1(s1, x2);
+ buf2[i * 2 + 0] = fetch1(s2, x1);
+ buf2[i * 2 + 1] = fetch1(s2, x2);
fx += fdx;
}
layout->convertToARGB32PM(buf1, buf1, len * 2, clut, 0);
@@ -2770,7 +2689,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
}
}
} else { //rotation
- FetchPixelFunc fetch = qFetchPixel[layout->bpp];
uint buf1[buffer_size];
uint buf2[buffer_size];
uint *b = buffer;
@@ -2789,19 +2707,10 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
const uchar *s1 = data->texture.scanLine(y1);
const uchar *s2 = data->texture.scanLine(y2);
-
- if (layout->bpp == QPixelLayout::BPP32) {
- buf1[i * 2 + 0] = ((const uint*)s1)[x1];
- buf1[i * 2 + 1] = ((const uint*)s1)[x2];
- buf2[i * 2 + 0] = ((const uint*)s2)[x1];
- buf2[i * 2 + 1] = ((const uint*)s2)[x2];
- } else {
- buf1[i * 2 + 0] = fetch(s1, x1);
- buf1[i * 2 + 1] = fetch(s1, x2);
- buf2[i * 2 + 0] = fetch(s2, x1);
- buf2[i * 2 + 1] = fetch(s2, x2);
- }
-
+ buf1[i * 2 + 0] = fetch1(s1, x1);
+ buf1[i * 2 + 1] = fetch1(s1, x2);
+ buf2[i * 2 + 0] = fetch1(s2, x1);
+ buf2[i * 2 + 1] = fetch1(s2, x2);
fx += fdx;
fy += fdy;
}
@@ -2848,7 +2757,6 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
qreal fy = data->m22 * cy + data->m12 * cx + data->dy;
qreal fw = data->m23 * cy + data->m13 * cx + data->m33;
- FetchPixelFunc fetch = qFetchPixel[layout->bpp];
uint buf1[buffer_size];
uint buf2[buffer_size];
uint *b = buffer;
@@ -2876,18 +2784,10 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
const uchar *s1 = data->texture.scanLine(y1);
const uchar *s2 = data->texture.scanLine(y2);
-
- if (layout->bpp == QPixelLayout::BPP32) {
- buf1[i * 2 + 0] = ((const uint*)s1)[x1];
- buf1[i * 2 + 1] = ((const uint*)s1)[x2];
- buf2[i * 2 + 0] = ((const uint*)s2)[x1];
- buf2[i * 2 + 1] = ((const uint*)s2)[x2];
- } else {
- buf1[i * 2 + 0] = fetch(s1, x1);
- buf1[i * 2 + 1] = fetch(s1, x2);
- buf2[i * 2 + 0] = fetch(s2, x1);
- buf2[i * 2 + 1] = fetch(s2, x2);
- }
+ buf1[i * 2 + 0] = fetch1(s1, x1);
+ buf1[i * 2 + 1] = fetch1(s1, x2);
+ buf2[i * 2 + 0] = fetch1(s2, x1);
+ buf2[i * 2 + 1] = fetch1(s2, x2);
fx += fdx;
fy += fdy;
@@ -3293,23 +3193,32 @@ static SourceFetchProc sourceFetchUntransformed[QImage::NImageFormats] = {
};
static const SourceFetchProc sourceFetchGeneric[NBlendTypes] = {
- fetchUntransformed, // Untransformed
- fetchUntransformed, // Tiled
- fetchTransformed<BlendTransformed>, // Transformed
- fetchTransformed<BlendTransformedTiled>, // TransformedTiled
- fetchTransformedBilinear<BlendTransformedBilinear>, // Bilinear
- fetchTransformedBilinear<BlendTransformedBilinearTiled> // BilinearTiled
+ fetchUntransformed, // Untransformed
+ fetchUntransformed, // Tiled
+ fetchTransformed<BlendTransformed, QPixelLayout::BPPNone>, // Transformed
+ fetchTransformed<BlendTransformedTiled, QPixelLayout::BPPNone>, // TransformedTiled
+ fetchTransformedBilinear<BlendTransformedBilinear, QPixelLayout::BPPNone>, // TransformedBilinear
+ fetchTransformedBilinear<BlendTransformedBilinearTiled, QPixelLayout::BPPNone> // TransformedBilinearTiled
};
static SourceFetchProc sourceFetchARGB32PM[NBlendTypes] = {
fetchUntransformedARGB32PM, // Untransformed
fetchUntransformedARGB32PM, // Tiled
- fetchTransformedARGB32PM<BlendTransformed>, // Transformed
- fetchTransformedARGB32PM<BlendTransformedTiled>, // TransformedTiled
+ fetchTransformed<BlendTransformed, QPixelLayout::BPP32>, // Transformed
+ fetchTransformed<BlendTransformedTiled, QPixelLayout::BPP32>, // TransformedTiled
fetchTransformedBilinearARGB32PM<BlendTransformedBilinear>, // Bilinear
fetchTransformedBilinearARGB32PM<BlendTransformedBilinearTiled> // BilinearTiled
};
+static SourceFetchProc sourceFetchAny32[NBlendTypes] = {
+ fetchUntransformed, // Untransformed
+ fetchUntransformed, // Tiled
+ fetchTransformed<BlendTransformed, QPixelLayout::BPP32>, // Transformed
+ fetchTransformed<BlendTransformedTiled, QPixelLayout::BPP32>, // TransformedTiled
+ fetchTransformedBilinear<BlendTransformedBilinear, QPixelLayout::BPP32>, // TransformedBilinear
+ fetchTransformedBilinear<BlendTransformedBilinearTiled, QPixelLayout::BPP32> // TransformedBilinearTiled
+};
+
static const SourceFetchProc64 sourceFetchGeneric64[NBlendTypes] = {
fetchUntransformed64, // Untransformed
fetchUntransformed64, // Tiled
@@ -3325,6 +3234,8 @@ static inline SourceFetchProc getSourceFetch(TextureBlendType blendType, QImage:
return sourceFetchARGB32PM[blendType];
if (blendType == BlendUntransformed || blendType == BlendTiled)
return sourceFetchUntransformed[format];
+ if (qPixelLayouts[format].bpp == QPixelLayout::BPP32)
+ return sourceFetchAny32[blendType];
return sourceFetchGeneric[blendType];
}
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp
index 31d832a9ce..a0438bd458 100644
--- a/src/gui/text/qcssparser.cpp
+++ b/src/gui/text/qcssparser.cpp
@@ -2211,6 +2211,7 @@ void Parser::init(const QString &css, bool isFile)
bool Parser::parse(StyleSheet *styleSheet, Qt::CaseSensitivity nameCaseSensitivity)
{
if (testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("charset"))) {
+ while (test(S) || test(CDO) || test(CDC)) {}
if (!next(STRING)) return false;
if (!next(SEMICOLON)) return false;
}
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index d2da24ca94..43648d0f7f 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -406,9 +406,14 @@ QtFontFoundry *QtFontFamily::foundry(const QString &f, bool create)
return foundries[count++];
}
+static inline bool equalsCaseInsensitive(const QString &a, const QString &b)
+{
+ return a.size() == b.size() && a.compare(b, Qt::CaseInsensitive) == 0;
+}
+
bool QtFontFamily::matchesFamilyName(const QString &familyName) const
{
- return name.compare(familyName, Qt::CaseInsensitive) == 0 || aliases.contains(familyName, Qt::CaseInsensitive);
+ return equalsCaseInsensitive(name, familyName) || aliases.contains(familyName, Qt::CaseInsensitive);
}
void QtFontFamily::ensurePopulated()
@@ -947,8 +952,8 @@ QFontEngine *loadSingleEngine(int script,
return 0;
}
+ engine->isSmoothlyScalable = style->smoothScalable;
fontCache->insertEngine(key, engine);
-
return engine;
}
}
@@ -973,6 +978,7 @@ QFontEngine *loadSingleEngine(int script,
return 0;
}
+ engine->isSmoothlyScalable = style->smoothScalable;
fontCache->insertEngine(key, engine);
if (Q_LIKELY(cacheForCommonScript && !engine->symbol)) {
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index 74ea8d15b7..0b2972f189 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -53,7 +53,7 @@
#include <qendian.h>
#include <private/qstringiterator_p.h>
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
# include "qharfbuzzng_p.h"
# include <harfbuzz/hb-ot.h>
#endif
@@ -93,7 +93,7 @@ static inline bool qSafeFromBigEndian(const uchar *source, const uchar *end, T *
// Harfbuzz helper functions
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
Q_GLOBAL_STATIC_WITH_ARGS(bool, useHarfbuzzNG,(qgetenv("QT_HARFBUZZ") != "old"))
bool qt_useHarfbuzzNG()
@@ -257,6 +257,7 @@ QFontEngine::QFontEngine(Type type)
cache_cost = 0;
fsType = 0;
symbol = false;
+ isSmoothlyScalable = false;
glyphFormat = Format_None;
m_subPixelPositionCount = 0;
@@ -296,7 +297,7 @@ QFixed QFontEngine::underlinePosition() const
void *QFontEngine::harfbuzzFont() const
{
Q_ASSERT(type() != QFontEngine::Multi);
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
if (qt_useHarfbuzzNG())
return hb_qt_font_get_for_engine(const_cast<QFontEngine *>(this));
#endif
@@ -331,7 +332,7 @@ void *QFontEngine::harfbuzzFont() const
void *QFontEngine::harfbuzzFace() const
{
Q_ASSERT(type() != QFontEngine::Multi);
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
if (qt_useHarfbuzzNG())
return hb_qt_face_get_for_engine(const_cast<QFontEngine *>(this));
#endif
@@ -363,7 +364,7 @@ bool QFontEngine::supportsScript(QChar::Script script) const
return true;
}
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
if (qt_useHarfbuzzNG()) {
#if defined(Q_OS_DARWIN)
// in AAT fonts, 'gsub' table is effectively replaced by 'mort'/'morx' table
diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h
index 42610e9b70..c0e350f755 100644
--- a/src/gui/text/qfontengine_p.h
+++ b/src/gui/text/qfontengine_p.h
@@ -325,6 +325,7 @@ public:
uint cache_cost; // amount of mem used in bytes by the font
uint fsType : 16;
bool symbol;
+ bool isSmoothlyScalable;
struct KernPair {
uint left_right;
QFixed adjust;
diff --git a/src/gui/text/qharfbuzzng_p.h b/src/gui/text/qharfbuzzng_p.h
index 95a21eedb6..fabf222bae 100644
--- a/src/gui/text/qharfbuzzng_p.h
+++ b/src/gui/text/qharfbuzzng_p.h
@@ -53,6 +53,9 @@
//
#include <QtGui/private/qtguiglobal_p.h>
+
+QT_REQUIRE_CONFIG(harfbuzz);
+
#include <QtCore/qchar.h>
#include <harfbuzz/hb.h>
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 742b01dd1f..67cafa53fe 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -37,6 +37,7 @@
**
****************************************************************************/
+#include <QtGui/private/qtguiglobal_p.h>
#include "qdebug.h"
#include "qtextformat.h"
#include "qtextformat_p.h"
@@ -837,7 +838,7 @@ enum JustificationClass {
Justification_Arabic_Kashida = 13 // User-inserted Kashida(U+0640)
};
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
/*
Adds an inter character justification opportunity after the number or letter
@@ -916,7 +917,7 @@ static inline void qt_getJustificationOpportunities(const ushort *string, int le
qt_getDefaultJustificationOpportunities(string, length, g, log_clusters, spaceAs);
}
-#endif // QT_ENABLE_HARFBUZZ_NG
+#endif // harfbuzz
// shape all the items that intersect with the line, taking tab widths into account to find out what text actually fits in the line.
@@ -950,7 +951,7 @@ void QTextEngine::shapeLine(const QScriptLine &line)
}
}
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
extern bool qt_useHarfbuzzNG(); // defined in qfontengine.cpp
#endif
@@ -1063,7 +1064,7 @@ void QTextEngine::shapeText(int item) const
letterSpacing *= font.d->dpi / qt_defaultDpiY();
}
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
if (Q_LIKELY(qt_useHarfbuzzNG()))
si.num_glyphs = shapeTextWithHarfbuzzNG(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled, letterSpacing != 0);
else
@@ -1079,7 +1080,7 @@ void QTextEngine::shapeText(int item) const
QGlyphLayout glyphs = shapedGlyphs(&si);
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
if (Q_LIKELY(qt_useHarfbuzzNG()))
qt_getJustificationOpportunities(string, itemLength, si, glyphs, logClusters(&si));
#endif
@@ -1119,7 +1120,7 @@ void QTextEngine::shapeText(int item) const
si.width += glyphs.advances[i] * !glyphs.attributes[i].dontPrint;
}
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
QT_BEGIN_INCLUDE_NAMESPACE
@@ -1313,7 +1314,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si,
return glyphs_shaped;
}
-#endif // QT_ENABLE_HARFBUZZ_NG
+#endif // harfbuzz
QT_BEGIN_INCLUDE_NAMESPACE
@@ -1669,7 +1670,7 @@ void QTextEngine::itemize() const
analysis->flags = QScriptAnalysis::None;
break;
}
-#ifndef QT_ENABLE_HARFBUZZ_NG
+#if !QT_CONFIG(harfbuzz)
analysis->script = hbscript_to_script(script_to_hbscript(analysis->script));
#endif
++uc;
@@ -1678,7 +1679,7 @@ void QTextEngine::itemize() const
if (option.flags() & QTextOption::ShowLineAndParagraphSeparators) {
(analysis-1)->flags = QScriptAnalysis::LineOrParagraphSeparator; // to exclude it from width
}
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
analysis = scriptAnalysis.data();
if (qt_useHarfbuzzNG()) {
// ### pretend HB-old behavior for now
diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h
index 160e9ce490..f49e2638f5 100644
--- a/src/gui/text/qtextengine_p.h
+++ b/src/gui/text/qtextengine_p.h
@@ -649,7 +649,7 @@ private:
void setBoundary(int strPos) const;
void addRequiredBoundaries() const;
void shapeText(int item) const;
-#ifdef QT_ENABLE_HARFBUZZ_NG
+#if QT_CONFIG(harfbuzz)
int shapeTextWithHarfbuzzNG(const QScriptItem &si,
const ushort *string,
int itemLength,
diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri
index a15793ec2f..efd041a5af 100644
--- a/src/gui/text/text.pri
+++ b/src/gui/text/text.pri
@@ -78,9 +78,7 @@ SOURCES += \
HEADERS += \
text/qplatformfontdatabase.h
-qtConfig(harfbuzz)|qtConfig(system-harfbuzz) {
- DEFINES += QT_ENABLE_HARFBUZZ_NG
-
+qtConfig(harfbuzz) {
QMAKE_USE_PRIVATE += harfbuzz
SOURCES += text/qharfbuzzng.cpp
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 246b9a7bad..6d5b2400f1 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1654,7 +1654,7 @@ void QNetworkAccessManagerPrivate::_q_networkSessionClosed()
QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
- QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(error(QNetworkSession::SessionError)),
+ QObject::disconnect(networkSession.data(), SIGNAL(error(QNetworkSession::SessionError)),
q, SLOT(_q_networkSessionFailed(QNetworkSession::SessionError)));
networkSessionStrongRef.clear();
diff --git a/src/network/configure.json b/src/network/configure.json
index 30a1c39c0c..1e08aa7c49 100644
--- a/src/network/configure.json
+++ b/src/network/configure.json
@@ -207,12 +207,14 @@
"label": "QNetworkProxy",
"purpose": "Provides network proxy support.",
"section": "Networking",
+ "condition": "!config.winrt",
"output": [ "publicFeature", "feature" ]
},
"socks5": {
"label": "SOCKS5",
"purpose": "Provides SOCKS5 support in QNetworkProxy.",
"section": "Networking",
+ "condition": "!config.winrt",
"output": [ "publicFeature", "feature" ]
},
"networkinterface": {
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 02bba2d293..57c40194a3 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -1113,10 +1113,15 @@ void QAbstractSocketPrivate::_q_connectToNextAddress()
// Tries to connect to the address. If it succeeds immediately
// (localhost address on BSD or any UDP connect), emit
// connected() and return.
- if (socketEngine->connectToHost(host, port)) {
- //_q_testConnection();
- fetchConnectionParameters();
- return;
+ if (
+#if defined(Q_OS_WINRT) && _MSC_VER >= 1900
+ !qEnvironmentVariableIsEmpty("QT_WINRT_USE_THREAD_NETWORK_CONTEXT") ?
+ socketEngine->connectToHostByName(hostName, port) :
+#endif
+ socketEngine->connectToHost(host, port)) {
+ //_q_testConnection();
+ fetchConnectionParameters();
+ return;
}
// Check that we're in delayed connection state. If not, try
diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp
index 3daca38959..8257eec9ea 100644
--- a/src/network/socket/qnativesocketengine_winrt.cpp
+++ b/src/network/socket/qnativesocketengine_winrt.cpp
@@ -75,6 +75,9 @@ using namespace ABI::Windows::Storage::Streams;
using namespace ABI::Windows::Networking;
using namespace ABI::Windows::Networking::Connectivity;
using namespace ABI::Windows::Networking::Sockets;
+#if _MSC_VER >= 1900
+using namespace ABI::Windows::Security::EnterpriseData;
+#endif
typedef ITypedEventHandler<StreamSocketListener *, StreamSocketListenerConnectionReceivedEventArgs *> ClientConnectedHandler;
typedef ITypedEventHandler<DatagramSocket *, DatagramSocketMessageReceivedEventArgs *> DatagramReceivedHandler;
@@ -84,6 +87,45 @@ typedef IAsyncOperationWithProgress<IBuffer *, UINT32> IAsyncBufferOperation;
QT_BEGIN_NAMESPACE
+#if _MSC_VER >= 1900
+static HRESULT qt_winrt_try_create_thread_network_context(QString host, ComPtr<IThreadNetworkContext> &context)
+{
+ HRESULT hr;
+ ComPtr<IProtectionPolicyManagerStatics> protectionPolicyManager;
+
+ hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Security_EnterpriseData_ProtectionPolicyManager).Get(),
+ &protectionPolicyManager);
+ RETURN_HR_IF_FAILED("Could not access ProtectionPolicyManager statics.");
+
+ ComPtr<IHostNameFactory> hostNameFactory;
+ hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(),
+ &hostNameFactory);
+ RETURN_HR_IF_FAILED("Could not access HostName factory.");
+
+ ComPtr<IHostName> hostName;
+ HStringReference hostRef(reinterpret_cast<LPCWSTR>(host.utf16()), host.length());
+ hr = hostNameFactory->CreateHostName(hostRef.Get(), &hostName);
+ RETURN_HR_IF_FAILED("Could not create hostname.");
+
+ ComPtr<IAsyncOperation<HSTRING>> op;
+ hr = protectionPolicyManager->GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName.Get(), &op);
+ RETURN_HR_IF_FAILED("Could not get identity operation.");
+
+ HSTRING hIdentity;
+ hr = QWinRTFunctions::await(op, &hIdentity);
+ RETURN_HR_IF_FAILED("Could not wait for identity operation.");
+
+ // Implies there is no need for a network context for this address
+ if (hIdentity == nullptr)
+ return S_OK;
+
+ hr = protectionPolicyManager->CreateCurrentThreadNetworkContext(hIdentity, &context);
+ RETURN_HR_IF_FAILED("Could not create thread network context");
+
+ return S_OK;
+}
+#endif // _MSC_VER >= 1900
+
static inline QString qt_QStringFromHString(const HString &string)
{
UINT32 length;
@@ -316,25 +358,23 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::
// Start processing incoming data
if (d->socketType == QAbstractSocket::TcpSocket) {
- HRESULT hr;
- QEventDispatcherWinRT::runOnXamlThread([&hr, socket, socketState, this]() {
- Q_D(QNativeSocketEngine);
+ HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([d, socket, socketState, this]() {
ComPtr<IBuffer> buffer;
HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer);
- RETURN_OK_IF_FAILED("initialize(): Could not create buffer");
+ RETURN_HR_IF_FAILED("initialize(): Could not create buffer");
ComPtr<IInputStream> stream;
hr = socket->get_InputStream(&stream);
- RETURN_OK_IF_FAILED("initialize(): Could not obtain input stream");
+ RETURN_HR_IF_FAILED("initialize(): Could not obtain input stream");
ComPtr<IAsyncBufferOperation> readOp;
hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, readOp.GetAddressOf());
- RETURN_OK_IF_FAILED_WITH_ARGS("initialize(): Failed to read from the socket buffer (%s).",
- socketDescription(this).constData());
+ RETURN_HR_IF_FAILED_WITH_ARGS("initialize(): Failed to read from the socket buffer (%s).",
+ socketDescription(this).constData());
QMutexLocker locker(&d->readOperationsMutex);
d->pendingReadOps.append(readOp);
d->socketState = socketState;
hr = readOp->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get());
- RETURN_OK_IF_FAILED_WITH_ARGS("initialize(): Failed to set socket read callback (%s).",
- socketDescription(this).constData());
+ RETURN_HR_IF_FAILED_WITH_ARGS("initialize(): Failed to set socket read callback (%s).",
+ socketDescription(this).constData());
return S_OK;
});
if (FAILED(hr))
@@ -367,9 +407,23 @@ bool QNativeSocketEngine::connectToHost(const QHostAddress &address, quint16 por
bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port)
{
Q_D(QNativeSocketEngine);
+ HRESULT hr;
+
+#if _MSC_VER >= 1900
+ ComPtr<IThreadNetworkContext> networkContext;
+ if (!qEnvironmentVariableIsEmpty("QT_WINRT_USE_THREAD_NETWORK_CONTEXT")) {
+ hr = qt_winrt_try_create_thread_network_context(name, networkContext);
+ if (FAILED(hr)) {
+ setError(QAbstractSocket::ConnectionRefusedError, QLatin1String("Could not create thread network context."));
+ d->socketState = QAbstractSocket::ConnectedState;
+ return true;
+ }
+ }
+#endif // _MSC_VER >= 1900
+
HStringReference hostNameRef(reinterpret_cast<LPCWSTR>(name.utf16()));
ComPtr<IHostNameFactory> hostNameFactory;
- HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(),
+ hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(),
&hostNameFactory);
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IHostName> remoteHost;
@@ -390,6 +444,16 @@ bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port)
}
Q_ASSERT_SUCCEEDED(hr);
+#if _MSC_VER >= 1900
+ if (networkContext != nullptr) {
+ ComPtr<IClosable> networkContextCloser;
+ hr = networkContext.As(&networkContextCloser);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = networkContextCloser->Close();
+ Q_ASSERT_SUCCEEDED(hr);
+ }
+#endif // _MSC_VER >= 1900
+
d->socketState = QAbstractSocket::ConnectingState;
QEventDispatcherWinRT::runOnXamlThread([d, &hr]() {
hr = d->connectOp->put_Completed(Callback<IAsyncActionCompletedHandler>(
diff --git a/src/network/socket/qsctpserver.cpp b/src/network/socket/qsctpserver.cpp
index 24f18e1ee8..77cb997192 100644
--- a/src/network/socket/qsctpserver.cpp
+++ b/src/network/socket/qsctpserver.cpp
@@ -60,7 +60,7 @@
The most common way to use QSctpServer is to construct an object
and set the maximum number of channels that the server is
- prepared to support, by calling setMaxChannelCount(). You can set
+ prepared to support, by calling setMaximumChannelCount(). You can set
the TCP emulation mode by passing a negative argument in this
call. Also, a special value of 0 (the default) indicates to use
the peer's value as the actual number of channels. The new incoming
@@ -102,7 +102,7 @@ QT_BEGIN_NAMESPACE
/*! \internal
*/
QSctpServerPrivate::QSctpServerPrivate()
- : maxChannelCount(0)
+ : maximumChannelCount(0)
{
}
@@ -119,7 +119,7 @@ void QSctpServerPrivate::configureCreatedSocket()
QTcpServerPrivate::configureCreatedSocket();
if (socketEngine)
socketEngine->setOption(QAbstractSocketEngine::MaxStreamsSocketOption,
- maxChannelCount == -1 ? 1 : maxChannelCount);
+ maximumChannelCount == -1 ? 1 : maximumChannelCount);
}
/*!
@@ -128,7 +128,7 @@ void QSctpServerPrivate::configureCreatedSocket()
Sets the datagram operation mode. The \a parent argument is passed
to QObject's constructor.
- \sa setMaxChannelCount(), listen(), setSocketDescriptor()
+ \sa setMaximumChannelCount(), listen(), setSocketDescriptor()
*/
QSctpServer::QSctpServer(QObject *parent)
: QTcpServer(QAbstractSocket::SctpSocket, *new QSctpServerPrivate, parent)
@@ -159,19 +159,19 @@ QSctpServer::~QSctpServer()
Call this method only when QSctpServer is in UnconnectedState.
- \sa maxChannelCount(), QSctpSocket
+ \sa maximumChannelCount(), QSctpSocket
*/
-void QSctpServer::setMaxChannelCount(int count)
+void QSctpServer::setMaximumChannelCount(int count)
{
Q_D(QSctpServer);
if (d->state != QAbstractSocket::UnconnectedState) {
- qWarning("QSctpServer::setMaxChannelCount() is only allowed in UnconnectedState");
+ qWarning("QSctpServer::setMaximumChannelCount() is only allowed in UnconnectedState");
return;
}
#if defined(QSCTPSERVER_DEBUG)
- qDebug("QSctpServer::setMaxChannelCount(%i)", count);
+ qDebug("QSctpServer::setMaximumChannelCount(%i)", count);
#endif
- d->maxChannelCount = count;
+ d->maximumChannelCount = count;
}
/*!
@@ -183,11 +183,11 @@ void QSctpServer::setMaxChannelCount(int count)
Returns -1, if QSctpServer running in TCP emulation mode.
- \sa setMaxChannelCount()
+ \sa setMaximumChannelCount()
*/
-int QSctpServer::maxChannelCount() const
+int QSctpServer::maximumChannelCount() const
{
- return d_func()->maxChannelCount;
+ return d_func()->maximumChannelCount;
}
/*! \reimp
@@ -199,7 +199,7 @@ void QSctpServer::incomingConnection(qintptr socketDescriptor)
#endif
QSctpSocket *socket = new QSctpSocket(this);
- socket->setMaxChannelCount(d_func()->maxChannelCount);
+ socket->setMaximumChannelCount(d_func()->maximumChannelCount);
socket->setSocketDescriptor(socketDescriptor);
addPendingConnection(socket);
}
@@ -234,7 +234,7 @@ QSctpSocket *QSctpServer::nextPendingDatagramConnection()
QSctpSocket *socket = qobject_cast<QSctpSocket *>(i.next());
Q_ASSERT(socket);
- if (socket->inDatagramMode()) {
+ if (socket->isInDatagramMode()) {
i.remove();
Q_ASSERT(d->socketEngine);
d->socketEngine->setReadNotificationEnabled(true);
diff --git a/src/network/socket/qsctpserver.h b/src/network/socket/qsctpserver.h
index fb017a924d..f39257485d 100644
--- a/src/network/socket/qsctpserver.h
+++ b/src/network/socket/qsctpserver.h
@@ -57,8 +57,8 @@ public:
explicit QSctpServer(QObject *parent = nullptr);
virtual ~QSctpServer();
- void setMaxChannelCount(int count);
- int maxChannelCount() const;
+ void setMaximumChannelCount(int count);
+ int maximumChannelCount() const;
QSctpSocket *nextPendingDatagramConnection();
diff --git a/src/network/socket/qsctpserver_p.h b/src/network/socket/qsctpserver_p.h
index 32760caffe..274939fc3d 100644
--- a/src/network/socket/qsctpserver_p.h
+++ b/src/network/socket/qsctpserver_p.h
@@ -64,7 +64,7 @@ public:
QSctpServerPrivate();
virtual ~QSctpServerPrivate();
- int maxChannelCount;
+ int maximumChannelCount;
void configureCreatedSocket() Q_DECL_OVERRIDE;
};
diff --git a/src/network/socket/qsctpsocket.cpp b/src/network/socket/qsctpsocket.cpp
index cb07e80299..fe76f64c42 100644
--- a/src/network/socket/qsctpsocket.cpp
+++ b/src/network/socket/qsctpsocket.cpp
@@ -83,14 +83,14 @@
\endlist
To set a continuous byte stream mode, instantiate QSctpSocket and
- call setMaxChannelCount() with a negative value. This gives the
+ call setMaximumChannelCount() with a negative value. This gives the
ability to use QSctpSocket as a regular buffered QTcpSocket. You
can call connectToHost() to initiate connection with endpoint,
write() to transmit and read() to receive data from the peer, but
you cannot distinguish message boundaries.
By default, QSctpSocket operates in datagram mode. Before
- connecting, call setMaxChannelCount() to set the maximum number of
+ connecting, call setMaximumChannelCount() to set the maximum number of
channels that the application is prepared to support. This number
is a parameter negotiated with the remote endpoint and its value
can be bounded by the operating system. The default value of 0
@@ -130,7 +130,7 @@ QT_BEGIN_NAMESPACE
/*! \internal
*/
QSctpSocketPrivate::QSctpSocketPrivate()
- : maxChannelCount(0)
+ : maximumChannelCount(0)
{
}
@@ -150,7 +150,7 @@ bool QSctpSocketPrivate::canReadNotification()
#endif
// Handle TCP emulation mode in the base implementation.
- if (!q->inDatagramMode())
+ if (!q->isInDatagramMode())
return QTcpSocketPrivate::canReadNotification();
const int savedCurrentChannel = currentReadChannel;
@@ -248,7 +248,7 @@ bool QSctpSocketPrivate::writeToSocket()
#endif
// Handle TCP emulation mode in the base implementation.
- if (!q->inDatagramMode())
+ if (!q->isInDatagramMode())
return QTcpSocketPrivate::writeToSocket();
if (!socketEngine)
@@ -331,7 +331,7 @@ void QSctpSocketPrivate::configureCreatedSocket()
{
if (socketEngine)
socketEngine->setOption(QAbstractSocketEngine::MaxStreamsSocketOption,
- maxChannelCount < 0 ? 1 : maxChannelCount);
+ maximumChannelCount < 0 ? 1 : maximumChannelCount);
}
/*!
@@ -340,7 +340,7 @@ void QSctpSocketPrivate::configureCreatedSocket()
Sets the datagram operation mode. The \a parent argument is passed
to QObject's constructor.
- \sa socketType(), setMaxChannelCount()
+ \sa socketType(), setMaximumChannelCount()
*/
QSctpSocket::QSctpSocket(QObject *parent)
: QTcpSocket(SctpSocket, *new QSctpSocketPrivate, parent)
@@ -418,19 +418,19 @@ void QSctpSocket::disconnectFromHost()
Call this method only when QSctpSocket is in UnconnectedState.
- \sa maxChannelCount(), readChannelCount(), writeChannelCount()
+ \sa maximumChannelCount(), readChannelCount(), writeChannelCount()
*/
-void QSctpSocket::setMaxChannelCount(int count)
+void QSctpSocket::setMaximumChannelCount(int count)
{
Q_D(QSctpSocket);
if (d->state != QAbstractSocket::UnconnectedState) {
- qWarning("QSctpSocket::setMaxChannelCount() is only allowed in UnconnectedState");
+ qWarning("QSctpSocket::setMaximumChannelCount() is only allowed in UnconnectedState");
return;
}
#if defined(QSCTPSOCKET_DEBUG)
- qDebug("QSctpSocket::setMaxChannelCount(%i)", count);
+ qDebug("QSctpSocket::setMaximumChannelCount(%i)", count);
#endif
- d->maxChannelCount = qMax(count, -1);
+ d->maximumChannelCount = qMax(count, -1);
}
/*!
@@ -443,22 +443,22 @@ void QSctpSocket::setMaxChannelCount(int count)
Returns -1 if QSctpSocket is running in continuous byte stream
mode.
- \sa setMaxChannelCount(), readChannelCount(), writeChannelCount()
+ \sa setMaximumChannelCount(), readChannelCount(), writeChannelCount()
*/
-int QSctpSocket::maxChannelCount() const
+int QSctpSocket::maximumChannelCount() const
{
- return d_func()->maxChannelCount;
+ return d_func()->maximumChannelCount;
}
/*!
Returns \c true if the socket is running in datagram mode.
- \sa setMaxChannelCount()
+ \sa setMaximumChannelCount()
*/
-bool QSctpSocket::inDatagramMode() const
+bool QSctpSocket::isInDatagramMode() const
{
Q_D(const QSctpSocket);
- return d->maxChannelCount != -1 && d->isBuffered;
+ return d->maximumChannelCount != -1 && d->isBuffered;
}
/*!
@@ -471,13 +471,13 @@ bool QSctpSocket::inDatagramMode() const
On failure, returns a QNetworkDatagram that reports \l
{QNetworkDatagram::isValid()}{not valid}.
- \sa writeDatagram(), inDatagramMode(), currentReadChannel()
+ \sa writeDatagram(), isInDatagramMode(), currentReadChannel()
*/
QNetworkDatagram QSctpSocket::readDatagram()
{
Q_D(QSctpSocket);
- if (!isReadable() || !inDatagramMode()) {
+ if (!isReadable() || !isInDatagramMode()) {
qWarning("QSctpSocket::readDatagram(): operation is not permitted");
return QNetworkDatagram();
}
@@ -507,14 +507,14 @@ QNetworkDatagram QSctpSocket::readDatagram()
Writes a \a datagram to the buffer of the current write channel.
Returns true on success; otherwise returns false.
- \sa readDatagram(), inDatagramMode(), currentWriteChannel()
+ \sa readDatagram(), isInDatagramMode(), currentWriteChannel()
*/
bool QSctpSocket::writeDatagram(const QNetworkDatagram &datagram)
{
Q_D(QSctpSocket);
if (!isWritable() || d->state != QAbstractSocket::ConnectedState || !d->socketEngine
- || !d->socketEngine->isValid() || !inDatagramMode()) {
+ || !d->socketEngine->isValid() || !isInDatagramMode()) {
qWarning("QSctpSocket::writeDatagram(): operation is not permitted");
return false;
}
diff --git a/src/network/socket/qsctpsocket.h b/src/network/socket/qsctpsocket.h
index aaa4e1ecca..3e5a545c4b 100644
--- a/src/network/socket/qsctpsocket.h
+++ b/src/network/socket/qsctpsocket.h
@@ -59,9 +59,9 @@ public:
void close() Q_DECL_OVERRIDE;
void disconnectFromHost() Q_DECL_OVERRIDE;
- void setMaxChannelCount(int count);
- int maxChannelCount() const;
- bool inDatagramMode() const;
+ void setMaximumChannelCount(int count);
+ int maximumChannelCount() const;
+ bool isInDatagramMode() const;
QNetworkDatagram readDatagram();
bool writeDatagram(const QNetworkDatagram &datagram);
diff --git a/src/network/socket/qsctpsocket_p.h b/src/network/socket/qsctpsocket_p.h
index f38095330f..3f765ebed9 100644
--- a/src/network/socket/qsctpsocket_p.h
+++ b/src/network/socket/qsctpsocket_p.h
@@ -74,7 +74,7 @@ public:
bool writeToSocket() Q_DECL_OVERRIDE;
QByteArray incomingDatagram;
- int maxChannelCount;
+ int maximumChannelCount;
typedef std::deque<QIpPacketHeader> IpHeaderList;
QVector<IpHeaderList> readHeaders;
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 29e1f32815..2fc779b257 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -2643,7 +2643,7 @@ bool QSslSocketPrivate::rootCertOnDemandLoadingSupported()
*/
QList<QByteArray> QSslSocketPrivate::unixRootCertDirectories()
{
- return QList<QByteArray>() << "/etc/ssl/certs/" // (K)ubuntu, OpenSUSE, Mandriva, MeeGo ...
+ return QList<QByteArray>() << "/etc/ssl/certs/" // (K)ubuntu, OpenSUSE, Mandriva ...
<< "/usr/lib/ssl/certs/" // Gentoo, Mandrake
<< "/usr/share/ssl/" // Centos, Redhat, SuSE
<< "/usr/local/ssl/" // Normal OpenSSL Tarball
diff --git a/src/opengl/gl2paintengineex/qglshadercache_meego_p.h b/src/opengl/gl2paintengineex/qglshadercache_meego_p.h
deleted file mode 100644
index de75d5ae8c..0000000000
--- a/src/opengl/gl2paintengineex/qglshadercache_meego_p.h
+++ /dev/null
@@ -1,450 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QGLSHADERCACHE_MEEGO_P_H
-#define QGLSHADERCACHE_MEEGO_P_H
-
-#include <QtCore/qglobal.h>
-
-#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
-
-#include <QtCore/qcryptographichash.h>
-#include <QtCore/qsharedmemory.h>
-#include <QtCore/qsystemsemaphore.h>
-
-#ifndef QT_BOOTSTRAPPED
-# include <GLES2/gl2ext.h>
-#endif
-#if defined(QT_DEBUG) || defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
-# include <syslog.h>
-#endif
-
-/*
- This cache stores internal Qt shader programs in shared memory.
-
- This header file is ugly on purpose and can only be included once. It is only to be used
- for the internal shader cache, not as a generic cache for anyone's shaders.
-
- The cache stores either ShaderCacheMaxEntries shader programs or ShaderCacheDataSize kilobytes
- of shader programs, whatever limit is reached first.
-
- The layout of the cache is as outlined in the CachedShaders struct. After some
- integers, an array of headers is reserved, then comes the space for the actual binaries.
-
- Shader Programs are identified by the md5sum of their frag and vertex shader source code.
-
- Shader Programs are never removed. The cache never shrinks or re-shuffles. This is done
- on purpose to ensure minimum amount of locking, no alignment problems and very few write
- operations.
-
- Note: Locking the shader cache could be expensive, because the entire system might hang.
- That's why the cache is immutable to minimize the time we need to keep it locked.
-
- Why is it Meego specific?
-
- First, the size is chosen so that it fits to generic meego usage. Second, on Meego, there's
- always at least one Qt application active (the launcher), so the cache will never be destroyed.
- Only when the last Qt app exits, the cache dies, which should only be when someone kills the
- X11 server. And last but not least it was only tested with Meego's SGX driver.
-
- There's a small tool in src/opengl/util/meego that dumps the contents of the cache.
- */
-
-// anonymous namespace, prevent exporting of the private symbols
-namespace
-{
-
-struct CachedShaderHeader
-{
- /* the index in the data[] member of CachedShaders */
- int index;
- /* the size of the binary shader */
- GLsizei size;
- /* the format of the binary shader */
- GLenum format;
- /* the md5sum of the frag+vertex shaders */
- char md5Sum[16];
-};
-
-enum
-{
- /* The maximum amount of shader programs the cache can hold */
- ShaderCacheMaxEntries = 20
-};
-
-typedef CachedShaderHeader CachedShaderHeaders[ShaderCacheMaxEntries];
-
-enum
-{
- // ShaderCacheDataSize is 20k minus the other data members of CachedShaders
- ShaderCacheDataSize = 1024 * ShaderCacheMaxEntries - sizeof(CachedShaderHeaders) - 2 * sizeof(int)
-};
-
-struct CachedShaders
-{
- /* How much space is still available in the cache */
- inline int availableSize() const { return ShaderCacheDataSize - dataSize; }
-
- /* The current amount of cached shaders */
- int shaderCount;
-
- /* The current amount (in bytes) of cached data */
- int dataSize;
-
- /* The headers describing the shaders */
- CachedShaderHeaders headers;
-
- /* The actual binary data of the shader programs */
- char data[ShaderCacheDataSize];
-};
-
-//#define QT_DEBUG_SHADER_CACHE
-#ifdef QT_DEBUG_SHADER_CACHE
-static QDebug shaderCacheDebug()
-{
- return QDebug(QtDebugMsg);
-}
-#else
-static inline QNoDebug shaderCacheDebug() { return QNoDebug(); }
-#endif
-
-class ShaderCacheSharedMemory
-{
-public:
- ShaderCacheSharedMemory()
- : shm(QLatin1String("qt_gles2_shadercache_" QT_VERSION_STR))
- {
- // we need a system semaphore here, since cache creation and initialization must be atomic
- QSystemSemaphore attachSemaphore(QLatin1String("qt_gles2_shadercache_mutex_" QT_VERSION_STR), 1);
-
- if (!attachSemaphore.acquire()) {
- shaderCacheDebug() << "Unable to require shader cache semaphore:" << attachSemaphore.errorString();
- return;
- }
-
- if (shm.attach()) {
- // success!
- shaderCacheDebug() << "Attached to shader cache";
- } else {
-
- // no cache exists - create and initialize it
- if (shm.create(sizeof(CachedShaders))) {
- shaderCacheDebug() << "Created new shader cache";
- initializeCache();
- } else {
- shaderCacheDebug() << "Unable to create shader cache:" << shm.errorString();
- }
- }
-
- attachSemaphore.release();
- }
-
- inline bool isAttached() const { return shm.isAttached(); }
-
- inline bool lock() { return shm.lock(); }
- inline bool unlock() { return shm.unlock(); }
- inline void *data() { return shm.data(); }
- inline QString errorString() { return shm.errorString(); }
-
- ~ShaderCacheSharedMemory()
- {
- if (!shm.detach())
- shaderCacheDebug() << "Unable to detach shader cache" << shm.errorString();
- }
-
-private:
- void initializeCache()
- {
- // no need to lock the shared memory since we're already protected by the
- // attach system semaphore.
-
- void *data = shm.data();
- Q_ASSERT(data);
-
- memset(data, 0, sizeof(CachedShaders));
- }
-
- QSharedMemory shm;
-};
-
-class ShaderCacheLocker
-{
-public:
- inline ShaderCacheLocker(ShaderCacheSharedMemory *cache)
- : shm(cache->lock() ? cache : (ShaderCacheSharedMemory *)0)
- {
- if (!shm)
- shaderCacheDebug() << "Unable to lock shader cache" << cache->errorString();
- }
-
- inline bool isLocked() const { return shm; }
-
- inline ~ShaderCacheLocker()
- {
- if (!shm)
- return;
- if (!shm->unlock())
- shaderCacheDebug() << "Unable to unlock shader cache" << shm->errorString();
- }
-
-private:
- ShaderCacheSharedMemory *shm;
-};
-
-#ifdef QT_BOOTSTRAPPED
-} // end namespace
-#else
-
-static void traceCacheOverflow(const char *message)
-{
-#if defined(QT_DEBUG) || defined (QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
- openlog(qPrintable(QCoreApplication::applicationName()), LOG_PID | LOG_ODELAY, LOG_USER);
- syslog(LOG_DEBUG, message);
- closelog();
-#endif
- shaderCacheDebug() << message;
-}
-
-Q_GLOBAL_STATIC(ShaderCacheSharedMemory, shaderCacheSharedMemory)
-
-/*
- Finds the index of the shader program identified by md5Sum in the cache.
- Note: Does NOT lock the cache for reading, the cache must already be locked!
-
- Returns -1 when no shader was found.
- */
-static int qt_cache_index_unlocked(const QByteArray &md5Sum, CachedShaders *cache)
-{
- for (int i = 0; i < cache->shaderCount; ++i) {
- if (qstrncmp(md5Sum.constData(), cache->headers[i].md5Sum, 16) == 0) {
- return i;
- }
- }
- return -1;
-}
-
-/* Returns the index of the shader identified by md5Sum */
-static int qt_cache_index(const QByteArray &md5Sum)
-{
- ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
- if (!shm || !shm->isAttached())
- return false;
-
- Q_ASSERT(md5Sum.length() == 16);
-
- ShaderCacheLocker locker(shm);
- if (!locker.isLocked())
- return false;
-
- void *data = shm->data();
- Q_ASSERT(data);
-
- CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
-
- return qt_cache_index_unlocked(md5Sum, cache);
-}
-
-/* Loads the cached shader at index \a shaderIndex into \a program
- * Note: Since the cache is immutable, this operation doesn't lock the shared memory.
- */
-static bool qt_cached_shader(QGLShaderProgram *program, const QGLContext *ctx, int shaderIndex)
-{
- Q_ASSERT(shaderIndex >= 0 && shaderIndex <= ShaderCacheMaxEntries);
- Q_ASSERT(program);
-
- ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
- if (!shm || !shm->isAttached())
- return false;
-
- void *data = shm->data();
- Q_ASSERT(data);
-
- CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
-
- shaderCacheDebug() << "fetching cached shader at index" << shaderIndex
- << "dataIndex" << cache->headers[shaderIndex].index
- << "size" << cache->headers[shaderIndex].size
- << "format" << cache->headers[shaderIndex].format;
-
- // call program->programId first, since that resolves the glProgramBinaryOES symbol
- GLuint programId = program->programId();
- glProgramBinaryOES(programId, cache->headers[shaderIndex].format,
- cache->data + cache->headers[shaderIndex].index,
- cache->headers[shaderIndex].size);
-
- return true;
-}
-
-/* Stores the shader program in the cache. Returns false if there's an error with the cache, or
- if the cache is too small to hold the shader. */
-static bool qt_cache_shader(const QGLShaderProgram *shader, const QGLContext *ctx, const QByteArray &md5Sum)
-{
- ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
- if (!shm || !shm->isAttached())
- return false;
-
- void *data = shm->data();
- Q_ASSERT(data);
-
- CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
-
- ShaderCacheLocker locker(shm);
- if (!locker.isLocked())
- return false;
-
- int cacheIdx = cache->shaderCount;
- if (cacheIdx >= ShaderCacheMaxEntries) {
- traceCacheOverflow("Qt OpenGL shader cache index overflow!");
- return false;
- }
-
- // now that we have the lock on the shared memory, make sure no one
- // inserted the shader already while we were unlocked
- if (qt_cache_index_unlocked(md5Sum, cache) != -1)
- return true; // already cached
-
- shaderCacheDebug() << "Caching shader at index" << cacheIdx;
-
- GLint binaryLength = 0;
- glGetProgramiv(shader->programId(), GL_PROGRAM_BINARY_LENGTH_OES, &binaryLength);
-
- if (!binaryLength) {
- shaderCacheDebug() << "Unable to determine binary shader size!";
- return false;
- }
-
- if (binaryLength > cache->availableSize()) {
- traceCacheOverflow("Qt OpenGL shader cache data overflow!");
- return false;
- }
-
- GLsizei size = 0;
- GLenum format = 0;
- glGetProgramBinaryOES(shader->programId(), binaryLength, &size, &format,
- cache->data + cache->dataSize);
-
- if (!size) {
- shaderCacheDebug() << "Unable to get binary shader!";
- return false;
- }
-
- cache->headers[cacheIdx].index = cache->dataSize;
- cache->dataSize += binaryLength;
- ++cache->shaderCount;
- cache->headers[cacheIdx].size = binaryLength;
- cache->headers[cacheIdx].format = format;
-
- memcpy(cache->headers[cacheIdx].md5Sum, md5Sum.constData(), 16);
-
- shaderCacheDebug() << "cached shader size" << size
- << "format" << format
- << "binarySize" << binaryLength
- << "cache index" << cacheIdx
- << "data index" << cache->headers[cacheIdx].index;
-
- return true;
-}
-
-} // namespace
-
-QT_BEGIN_NAMESPACE
-
-
-class CachedShader
-{
-public:
- CachedShader(const QByteArray &fragSource, const QByteArray &vertexSource)
- : cacheIdx(-1)
- {
- QCryptographicHash md5Hash(QCryptographicHash::Md5);
-
- md5Hash.addData(fragSource);
- md5Hash.addData(vertexSource);
-
- md5Sum = md5Hash.result();
- }
-
- bool isCached()
- {
- return cacheIndex() != -1;
- }
-
- int cacheIndex()
- {
- if (cacheIdx != -1)
- return cacheIdx;
- cacheIdx = qt_cache_index(md5Sum);
- return cacheIdx;
- }
-
- bool load(QGLShaderProgram *program, const QGLContext *ctx)
- {
- if (cacheIndex() == -1)
- return false;
- return qt_cached_shader(program, ctx, cacheIdx);
- }
-
- bool store(QGLShaderProgram *program, const QGLContext *ctx)
- {
- return qt_cache_shader(program, ctx, md5Sum);
- }
-
-private:
- QByteArray md5Sum;
- int cacheIdx;
-};
-
-
-QT_END_NAMESPACE
-
-#endif
-
-#endif
-#endif
diff --git a/src/opengl/gl2paintengineex/qglshadercache_p.h b/src/opengl/gl2paintengineex/qglshadercache_p.h
index e2ac3f85d7..4204e3e256 100644
--- a/src/opengl/gl2paintengineex/qglshadercache_p.h
+++ b/src/opengl/gl2paintengineex/qglshadercache_p.h
@@ -53,10 +53,6 @@
#include <QtCore/qglobal.h>
-#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
-# include "qglshadercache_meego_p.h"
-#else
-
QT_BEGIN_NAMESPACE
@@ -88,4 +84,3 @@ public:
QT_END_NAMESPACE
#endif
-#endif
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index 25de6ad670..718a886809 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -41,8 +41,7 @@ HEADERS += qglshaderprogram.h \
gl2paintengineex/qglengineshadersource_p.h \
gl2paintengineex/qglcustomshaderstage_p.h \
gl2paintengineex/qtextureglyphcache_gl_p.h \
- gl2paintengineex/qglshadercache_p.h \
- gl2paintengineex/qglshadercache_meego_p.h
+ gl2paintengineex/qglshadercache_p.h
SOURCES += qglshaderprogram.cpp \
qgraphicsshadereffect.cpp \
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
index b8d997bc35..1c615e06ed 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
@@ -759,7 +759,7 @@ static inline QFontDatabase::WritingSystem writingSystemFromCharSet(uchar charSe
((quint32)(ch1)) \
)
-bool localizedName(const QString &name)
+bool qt_localizedName(const QString &name)
{
const QChar *c = name.unicode();
for (int i = 0; i < name.length(); ++i) {
@@ -769,24 +769,8 @@ bool localizedName(const QString &name)
return false;
}
-static inline quint16 getUShort(const unsigned char *p)
-{
- quint16 val;
- val = *p++ << 8;
- val |= *p;
-
- return val;
-}
-
namespace {
-struct FontNames {
- QString name; // e.g. "DejaVu Sans Condensed"
- QString style; // e.g. "Italic"
- QString preferredName; // e.g. "DejaVu Sans"
- QString preferredStyle; // e.g. "Condensed Italic"
-};
-
static QString readName(bool unicode, const uchar *string, int length)
{
QString out;
@@ -797,7 +781,7 @@ static QString readName(bool unicode, const uchar *string, int length)
out.resize(length);
QChar *uc = out.data();
for (int i = 0; i < length; ++i)
- uc[i] = getUShort(string + 2*i);
+ uc[i] = qt_getUShort(string + 2*i);
} else {
// Apple Roman
@@ -822,7 +806,7 @@ enum PlatformFieldValue {
PlatformId_Microsoft = 3
};
-static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes)
+FontNames qt_getCanonicalFontNames(const uchar *table, quint32 bytes)
{
FontNames out;
const int NameRecordSize = 12;
@@ -836,11 +820,11 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes)
if (bytes < 8)
return out;
- if (getUShort(table) != 0)
+ if (qt_getUShort(table) != 0)
return out;
- count = getUShort(table+2);
- string_offset = getUShort(table+4);
+ count = qt_getUShort(table + 2);
+ string_offset = qt_getUShort(table + 4);
names = table + 6;
if (string_offset >= bytes || 6 + count*NameRecordSize > string_offset)
@@ -859,10 +843,10 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes)
for (int i = 0; i < count; ++i) {
// search for the correct name entries
- quint16 platform_id = getUShort(names + i*NameRecordSize);
- quint16 encoding_id = getUShort(names + 2 + i*NameRecordSize);
- quint16 language_id = getUShort(names + 4 + i*NameRecordSize);
- quint16 name_id = getUShort(names + 6 + i*NameRecordSize);
+ quint16 platform_id = qt_getUShort(names + i*NameRecordSize);
+ quint16 encoding_id = qt_getUShort(names + 2 + i*NameRecordSize);
+ quint16 language_id = qt_getUShort(names + 4 + i*NameRecordSize);
+ quint16 name_id = qt_getUShort(names + 6 + i*NameRecordSize);
PlatformIdType *idType = nullptr;
int *id = nullptr;
@@ -888,8 +872,8 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes)
continue;
}
- quint16 length = getUShort(names + 8 + i*NameRecordSize);
- quint16 offset = getUShort(names + 10 + i*NameRecordSize);
+ quint16 length = qt_getUShort(names + 8 + i*NameRecordSize);
+ quint16 offset = qt_getUShort(names + 10 + i*NameRecordSize);
if (DWORD(string_offset + offset + length) > bytes)
continue;
@@ -916,8 +900,8 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes)
if (idStatus[i] == NotFound)
continue;
int id = ids[i];
- quint16 length = getUShort(names + 8 + id * NameRecordSize);
- quint16 offset = getUShort(names + 10 + id * NameRecordSize);
+ quint16 length = qt_getUShort(names + 8 + id * NameRecordSize);
+ quint16 offset = qt_getUShort(names + 10 + id * NameRecordSize);
const unsigned char *string = table + string_offset + offset;
strings[i] = readName(idStatus[i] != Apple, string, length);
}
@@ -931,7 +915,7 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes)
} // namespace
-QString getEnglishName(const QString &familyName, bool includeStyle = false)
+QString qt_getEnglishName(const QString &familyName, bool includeStyle)
{
QString i18n_name;
QString faceName = familyName;
@@ -970,7 +954,7 @@ QString getEnglishName(const QString &familyName, bool includeStyle = false)
goto error;
{
- const FontNames names = getCanonicalFontNames(table, bytes);
+ const FontNames names = qt_getCanonicalFontNames(table, bytes);
i18n_name = names.name;
if (includeStyle)
i18n_name += QLatin1Char(' ') + names.style;
@@ -985,16 +969,63 @@ error:
return i18n_name;
}
-static bool addFontToDatabase(const QString &familyName, const QString &styleName, uchar charSet,
+// Note this duplicates parts of qt_getEnglishName, we should try to unify the two functions.
+FontNames qt_getCanonicalFontNames(const LOGFONT &lf)
+{
+ FontNames fontNames;
+ HDC hdc = GetDC(0);
+ HFONT hfont = CreateFontIndirect(&lf);
+
+ if (!hfont) {
+ ReleaseDC(0, hdc);
+ return fontNames;
+ }
+
+ HGDIOBJ oldobj = SelectObject(hdc, hfont);
+
+ // get the name table
+ QByteArray table;
+ const DWORD name_tag = MAKE_TAG('n', 'a', 'm', 'e');
+ DWORD bytes = GetFontData(hdc, name_tag, 0, 0, 0);
+ if (bytes != GDI_ERROR) {
+ table.resize(bytes);
+
+ if (GetFontData(hdc, name_tag, 0, table.data(), bytes) != GDI_ERROR)
+ fontNames = qt_getCanonicalFontNames(reinterpret_cast<const uchar*>(table.constData()), bytes);
+ }
+
+ SelectObject(hdc, oldobj);
+ DeleteObject(hfont);
+ ReleaseDC(0, hdc);
+
+ return fontNames;
+}
+
+static QChar *createFontFile(const QString &faceName)
+{
+ QChar *faceNamePtr = nullptr;
+ if (!faceName.isEmpty()) {
+ const int nameLength = qMin(faceName.length(), LF_FACESIZE - 1);
+ faceNamePtr = new QChar[nameLength + 1];
+ memcpy(faceNamePtr, faceName.utf16(), sizeof(wchar_t) * nameLength);
+ faceNamePtr[nameLength] = 0;
+ }
+ return faceNamePtr;
+}
+
+static bool addFontToDatabase(QString familyName,
+ QString styleName,
+ const LOGFONT &logFont,
const TEXTMETRIC *textmetric,
const FONTSIGNATURE *signature,
- int type,
- bool registerAlias)
+ int type)
{
// the "@family" fonts are just the same as "family". Ignore them.
if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_")))
return false;
+ uchar charSet = logFont.lfCharSet;
+
static const int SMOOTH_SCALABLE = 0xffff;
const QString foundryName; // No such concept.
const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH);
@@ -1023,10 +1054,24 @@ static bool addFontToDatabase(const QString &familyName, const QString &styleNam
qCDebug(lcQpaFonts) << message;
}
#endif
-
QString englishName;
- if (registerAlias && ttf && localizedName(familyName))
- englishName = getEnglishName(familyName);
+ QString faceName;
+
+ QString subFamilyName;
+ QString subFamilyStyle;
+ if (ttf) {
+ // Look-up names registered in the font
+ FontNames canonicalNames = qt_getCanonicalFontNames(logFont);
+ if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty())
+ englishName = canonicalNames.name;
+ if (!canonicalNames.preferredName.isEmpty()) {
+ subFamilyName = familyName;
+ subFamilyStyle = styleName;
+ faceName = familyName; // Remember the original name for later lookups
+ familyName = canonicalNames.preferredName;
+ styleName = canonicalNames.preferredStyle;
+ }
+ }
QSupportedWritingSystems writingSystems;
if (type & TRUETYPE_FONTTYPE) {
@@ -1054,32 +1099,36 @@ static bool addFontToDatabase(const QString &familyName, const QString &styleNam
}
QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight,
- style, stretch, antialias, scalable, size, fixed, writingSystems, 0);
+ style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
+
// add fonts windows can generate for us:
if (weight <= QFont::DemiBold && styleName.isEmpty())
QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold,
- style, stretch, antialias, scalable, size, fixed, writingSystems, 0);
+ style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
if (style != QFont::StyleItalic && styleName.isEmpty())
QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight,
- QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0);
+ QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty())
QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold,
- QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0);
+ QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
- if (!englishName.isEmpty())
+ if (!subFamilyName.isEmpty() && familyName != subFamilyName) {
+ QPlatformFontDatabase::registerFont(subFamilyName, subFamilyStyle, foundryName, weight,
+ style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
+ }
+
+ if (!englishName.isEmpty() && englishName != familyName)
QPlatformFontDatabase::registerAliasToFontFamily(familyName, englishName);
return true;
}
static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric,
- DWORD type, LPARAM lParam)
+ DWORD type, LPARAM)
{
const ENUMLOGFONTEX *f = reinterpret_cast<const ENUMLOGFONTEX *>(logFont);
const QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName);
const QString styleName = QString::fromWCharArray(f->elfStyle);
- const uchar charSet = f->elfLogFont.lfCharSet;
- const bool registerAlias = bool(lParam);
// NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according
// to the documentation is identical to a TEXTMETRIC except for the last four
@@ -1087,13 +1136,13 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t
const FONTSIGNATURE *signature = Q_NULLPTR;
if (type & TRUETYPE_FONTTYPE)
signature = &reinterpret_cast<const NEWTEXTMETRICEX *>(textmetric)->ntmFontSig;
- addFontToDatabase(familyName, styleName, charSet, textmetric, signature, type, registerAlias);
+ addFontToDatabase(familyName, styleName, *logFont, textmetric, signature, type);
// keep on enumerating
return 1;
}
-void QWindowsFontDatabase::populateFamily(const QString &familyName, bool registerAlias)
+void QWindowsFontDatabase::populateFamily(const QString &familyName)
{
qCDebug(lcQpaFonts) << familyName;
if (familyName.size() >= LF_FACESIZE) {
@@ -1106,29 +1155,12 @@ void QWindowsFontDatabase::populateFamily(const QString &familyName, bool regist
familyName.toWCharArray(lf.lfFaceName);
lf.lfFaceName[familyName.size()] = 0;
lf.lfPitchAndFamily = 0;
- EnumFontFamiliesEx(dummy, &lf, storeFont, LPARAM(registerAlias), 0);
+ EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0);
ReleaseDC(0, dummy);
}
-void QWindowsFontDatabase::populateFamily(const QString &familyName)
-{
- populateFamily(familyName, false);
-}
-
-namespace {
-// Context for enumerating system fonts, records whether the default font has been encountered,
-// which is normally not enumerated by EnumFontFamiliesEx().
-struct PopulateFamiliesContext
-{
- PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {}
-
- QString systemDefaultFont;
- bool seenSystemDefaultFont;
-};
-} // namespace
-
-static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric,
- DWORD, LPARAM lparam)
+static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *,
+ DWORD, LPARAM)
{
// the "@family" fonts are just the same as "family". Ignore them.
const ENUMLOGFONTEX *f = reinterpret_cast<const ENUMLOGFONTEX *>(logFont);
@@ -1136,22 +1168,6 @@ static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TE
if (faceNameW[0] && faceNameW[0] != L'@' && wcsncmp(faceNameW, L"WST_", 4)) {
const QString faceName = QString::fromWCharArray(faceNameW);
QPlatformFontDatabase::registerFontFamily(faceName);
- PopulateFamiliesContext *context = reinterpret_cast<PopulateFamiliesContext *>(lparam);
- if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont)
- context->seenSystemDefaultFont = true;
-
- // Register current font's english name as alias
- const bool ttf = textmetric->tmPitchAndFamily & TMPF_TRUETYPE;
- if (ttf && localizedName(faceName)) {
- const QString englishName = getEnglishName(faceName);
- if (!englishName.isEmpty()) {
- QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName);
- // Check whether the system default font name is an alias of the current font family name,
- // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name
- if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont)
- context->seenSystemDefaultFont = true;
- }
- }
}
return 1; // continue
}
@@ -1164,12 +1180,10 @@ void QWindowsFontDatabase::populateFontDatabase()
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfFaceName[0] = 0;
lf.lfPitchAndFamily = 0;
- PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family());
- EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast<LPARAM>(&context), 0);
+ EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, 0, 0);
ReleaseDC(0, dummy);
// Work around EnumFontFamiliesEx() not listing the system font.
- if (!context.seenSystemDefaultFont)
- QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont);
+ QPlatformFontDatabase::registerFontFamily(QWindowsFontDatabase::systemDefaultFont().family());
}
typedef QSharedPointer<QWindowsFontEngineData> QWindowsFontEngineDataPtr;
@@ -1228,7 +1242,8 @@ QFontEngineMulti *QWindowsFontDatabase::fontEngineMulti(QFontEngine *fontEngine,
QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, void *handle)
{
- QFontEngine *fe = QWindowsFontDatabase::createEngine(fontDef,
+ const QString faceName(static_cast<const QChar*>(handle));
+ QFontEngine *fe = QWindowsFontDatabase::createEngine(fontDef, faceName,
defaultVerticalDPI(),
sharedFontData());
qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDEF" << fontDef << fe << handle;
@@ -1282,7 +1297,7 @@ QT_WARNING_POP
request.hintingPreference = hintingPreference;
request.stretch = QFont::Unstretched;
- fontEngine = QWindowsFontDatabase::createEngine(request,
+ fontEngine = QWindowsFontDatabase::createEngine(request, QString(),
defaultVerticalDPI(),
sharedFontData());
@@ -1461,7 +1476,7 @@ static void getFamiliesAndSignatures(const QByteArray &fontData,
getFontTable(data, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length);
if (!table)
continue;
- FontNames names = getCanonicalFontNames(table, length);
+ FontNames names = qt_getCanonicalFontNames(table, length);
if (names.name.isEmpty())
continue;
@@ -1523,8 +1538,8 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData,
TEXTMETRIC textMetrics;
GetTextMetrics(hdc, &textMetrics);
- addFontToDatabase(familyName, styleName, lf.lfCharSet, &textMetrics, &signatures.at(j),
- TRUETYPE_FONTTYPE, true);
+ addFontToDatabase(familyName, styleName, lf, &textMetrics, &signatures.at(j),
+ TRUETYPE_FONTTYPE);
SelectObject(hdc, oldobj);
DeleteObject(hfont);
@@ -1550,7 +1565,7 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData,
for (int j = 0; j < families.count(); ++j) {
const QString familyName = families.at(j).name;
familyNames << familyName;
- populateFamily(familyName, true);
+ populateFamily(familyName);
}
}
@@ -1571,8 +1586,10 @@ void QWindowsFontDatabase::removeApplicationFonts()
m_applicationFonts.clear();
}
-void QWindowsFontDatabase::releaseHandle(void * /* handle */)
+void QWindowsFontDatabase::releaseHandle(void *handle)
{
+ const QChar *faceName = reinterpret_cast<const QChar *>(handle);
+ delete[] faceName;
}
QString QWindowsFontDatabase::fontDir() const
@@ -1663,7 +1680,7 @@ static const char *kr_tryFonts[] = {
static const char **tryFonts = 0;
-LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request)
+LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request, const QString &faceName)
{
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
@@ -1738,7 +1755,9 @@ LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request)
lf.lfPitchAndFamily = DEFAULT_PITCH | hint;
- QString fam = request.family;
+ QString fam = faceName;
+ if (fam.isEmpty())
+ fam = request.family;
if (Q_UNLIKELY(fam.size() >= LF_FACESIZE)) {
qCritical("%s: Family name '%s' is too long.", __FUNCTION__, qPrintable(fam));
fam.truncate(LF_FACESIZE - 1);
@@ -1837,13 +1856,13 @@ QStringList QWindowsFontDatabase::fallbacksForFamily(const QString &family, QFon
}
-QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request,
+QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, const QString &faceName,
int dpi,
const QSharedPointer<QWindowsFontEngineData> &data)
{
QFontEngine *fe = 0;
- LOGFONT lf = fontDefToLOGFONT(request);
+ LOGFONT lf = fontDefToLOGFONT(request, faceName);
const bool preferClearTypeAA = lf.lfQuality == CLEARTYPE_QUALITY;
if (request.stretch != 100) {
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp
index 4d973bbf17..df84198862 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp
@@ -100,9 +100,6 @@ static FontFile * createFontFile(const QString &fileName, int index)
return fontFile;
}
-extern bool localizedName(const QString &name);
-extern QString getEnglishName(const QString &familyName, bool includeStyle = false);
-
namespace {
struct FontKey
{
@@ -162,19 +159,20 @@ static const FontKey *findFontKey(const QString &name, int *indexIn = Q_NULLPTR)
return Q_NULLPTR;
}
-static bool addFontToDatabase(const QString &faceName,
- const QString &styleName,
+static bool addFontToDatabase(QString familyName,
+ QString styleName,
const QString &fullName,
- uchar charSet,
+ const LOGFONT &logFont,
const TEXTMETRIC *textmetric,
const FONTSIGNATURE *signature,
- int type,
- bool registerAlias)
+ int type)
{
// the "@family" fonts are just the same as "family". Ignore them.
- if (faceName.isEmpty() || faceName.at(0) == QLatin1Char('@') || faceName.startsWith(QLatin1String("WST_")))
+ if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_")))
return false;
+ uchar charSet = logFont.lfCharSet;
+
static const int SMOOTH_SCALABLE = 0xffff;
const QString foundryName; // No such concept.
const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH);
@@ -190,7 +188,7 @@ static bool addFontToDatabase(const QString &faceName,
if (lcQpaFonts().isDebugEnabled()) {
QString message;
QTextStream str(&message);
- str << __FUNCTION__ << ' ' << faceName << "::" << fullName << ' ' << charSet << " TTF=" << ttf;
+ str << __FUNCTION__ << ' ' << familyName << "::" << fullName << ' ' << charSet << " TTF=" << ttf;
if (type & DEVICE_FONTTYPE)
str << " DEVICE";
if (type & RASTER_FONTTYPE)
@@ -205,8 +203,22 @@ static bool addFontToDatabase(const QString &faceName,
#endif
QString englishName;
- if (registerAlias & ttf && localizedName(faceName))
- englishName = getEnglishName(faceName);
+ QString faceName = familyName;
+
+ QString subFamilyName;
+ QString subFamilyStyle;
+ if (ttf) {
+ // Look-up names registered in the font
+ FontNames canonicalNames = qt_getCanonicalFontNames(logFont);
+ if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty())
+ englishName = canonicalNames.name;
+ if (!canonicalNames.preferredName.isEmpty()) {
+ subFamilyName = familyName;
+ subFamilyStyle = styleName;
+ familyName = canonicalNames.preferredName;
+ styleName = canonicalNames.preferredStyle;
+ }
+ }
QSupportedWritingSystems writingSystems;
if (type & TRUETYPE_FONTTYPE) {
@@ -243,12 +255,10 @@ static bool addFontToDatabase(const QString &faceName,
&& systemLocale.language() != QLocale::English
&& styleName != QLatin1String("Italic")
&& styleName != QLatin1String("Bold")) {
- key = findFontKey(getEnglishName(fullName, true), &index);
+ key = findFontKey(qt_getEnglishName(fullName, true), &index);
}
if (!key)
key = findFontKey(faceName, &index);
- if (!key && !registerAlias && englishName.isEmpty() && localizedName(faceName))
- englishName = getEnglishName(faceName);
if (!key && !englishName.isEmpty())
key = findFontKey(englishName, &index);
if (!key)
@@ -261,24 +271,29 @@ static bool addFontToDatabase(const QString &faceName,
if (!QDir::isAbsolutePath(value))
value.prepend(QFile::decodeName(qgetenv("windir") + "\\Fonts\\"));
- QPlatformFontDatabase::registerFont(faceName, styleName, foundryName, weight, style, stretch,
+ QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight, style, stretch,
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
// add fonts windows can generate for us:
if (weight <= QFont::DemiBold && styleName.isEmpty())
- QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, style, stretch,
+ QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, style, stretch,
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
if (style != QFont::StyleItalic && styleName.isEmpty())
- QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, weight, QFont::StyleItalic, stretch,
+ QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight, QFont::StyleItalic, stretch,
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty())
- QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, QFont::StyleItalic, stretch,
+ QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, QFont::StyleItalic, stretch,
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
- if (!englishName.isEmpty())
- QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName);
+ if (!subFamilyName.isEmpty() && familyName != subFamilyName) {
+ QPlatformFontDatabase::registerFont(subFamilyName, subFamilyStyle, foundryName, weight,
+ style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
+ }
+
+ if (!englishName.isEmpty() && englishName != familyName)
+ QPlatformFontDatabase::registerAliasToFontFamily(familyName, englishName);
return true;
}
@@ -290,7 +305,6 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t
const QString faceName = QString::fromWCharArray(f->elfLogFont.lfFaceName);
const QString styleName = QString::fromWCharArray(f->elfStyle);
const QString fullName = QString::fromWCharArray(f->elfFullName);
- const uchar charSet = f->elfLogFont.lfCharSet;
// NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according
// to the documentation is identical to a TEXTMETRIC except for the last four
@@ -298,7 +312,7 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t
const FONTSIGNATURE *signature = Q_NULLPTR;
if (type & TRUETYPE_FONTTYPE)
signature = &reinterpret_cast<const NEWTEXTMETRICEX *>(textmetric)->ntmFontSig;
- addFontToDatabase(faceName, styleName, fullName, charSet, textmetric, signature, type, false);
+ addFontToDatabase(faceName, styleName, fullName, *logFont, textmetric, signature, type);
// keep on enumerating
return 1;
@@ -321,30 +335,19 @@ void QWindowsFontDatabaseFT::populateFamily(const QString &familyName)
}
HDC dummy = GetDC(0);
LOGFONT lf;
- lf.lfCharSet = DEFAULT_CHARSET;
+ memset(&lf, 0, sizeof(LOGFONT));
familyName.toWCharArray(lf.lfFaceName);
lf.lfFaceName[familyName.size()] = 0;
+ lf.lfCharSet = DEFAULT_CHARSET;
lf.lfPitchAndFamily = 0;
EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0);
ReleaseDC(0, dummy);
}
-namespace {
-// Context for enumerating system fonts, records whether the default font has been
-// encountered, which is normally not enumerated.
-struct PopulateFamiliesContext
-{
- PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {}
-
- QString systemDefaultFont;
- bool seenSystemDefaultFont;
-};
-} // namespace
-
// Delayed population of font families
static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric,
- DWORD, LPARAM lparam)
+ DWORD, LPARAM)
{
const ENUMLOGFONTEX *f = reinterpret_cast<const ENUMLOGFONTEX *>(logFont);
// the "@family" fonts are just the same as "family". Ignore them.
@@ -356,27 +359,11 @@ static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TE
const FontKey *key = findFontKey(faceName);
if (!key) {
key = findFontKey(QString::fromWCharArray(f->elfFullName));
- if (!key && ttf && localizedName(faceName))
- key = findFontKey(getEnglishName(faceName));
+ if (!key && ttf && qt_localizedName(faceName))
+ key = findFontKey(qt_getEnglishName(faceName));
}
- if (key) {
+ if (key)
QPlatformFontDatabase::registerFontFamily(faceName);
- PopulateFamiliesContext *context = reinterpret_cast<PopulateFamiliesContext *>(lparam);
- if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont)
- context->seenSystemDefaultFont = true;
-
- // Register current font's english name as alias
- if (ttf && localizedName(faceName)) {
- const QString englishName = getEnglishName(faceName);
- if (!englishName.isEmpty()) {
- QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName);
- // Check whether the system default font name is an alias of the current font family name,
- // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name
- if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont)
- context->seenSystemDefaultFont = true;
- }
- }
- }
}
return 1; // continue
}
@@ -388,12 +375,10 @@ void QWindowsFontDatabaseFT::populateFontDatabase()
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfFaceName[0] = 0;
lf.lfPitchAndFamily = 0;
- PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family());
- EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast<LPARAM>(&context), 0);
+ EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, 0, 0);
ReleaseDC(0, dummy);
// Work around EnumFontFamiliesEx() not listing the system font
- if (!context.seenSystemDefaultFont)
- QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont);
+ QPlatformFontDatabase::registerFontFamily(QWindowsFontDatabase::systemDefaultFont().family());
}
QFontEngine * QWindowsFontDatabaseFT::fontEngine(const QFontDef &fontDef, void *handle)
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h
index b7ebfc033f..325f522335 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h
@@ -112,7 +112,7 @@ public:
static QFont systemDefaultFont();
- static QFontEngine *createEngine(const QFontDef &request,
+ static QFontEngine *createEngine(const QFontDef &request, const QString &faceName,
int dpi,
const QSharedPointer<QWindowsFontEngineData> &data);
@@ -120,7 +120,7 @@ public:
static QFont LOGFONT_to_QFont(const LOGFONT& lf, int verticalDPI = 0);
static qreal fontSmoothingGamma();
- static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef);
+ static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef, const QString &faceName);
static QStringList extraTryFontsForFamily(const QString &family);
static QString familyForStyleHint(QFont::StyleHint styleHint);
@@ -133,7 +133,6 @@ public:
static QString readRegistryString(HKEY parentHandle, const wchar_t *keyPath, const wchar_t *keyName);
private:
- void populateFamily(const QString &familyName, bool registerAlias);
void removeApplicationFonts();
struct WinApplicationFont {
@@ -157,6 +156,26 @@ private:
QDebug operator<<(QDebug, const QFontDef &def);
#endif
+inline quint16 qt_getUShort(const unsigned char *p)
+{
+ quint16 val;
+ val = *p++ << 8;
+ val |= *p;
+
+ return val;
+}
+
+struct FontNames {
+ QString name; // e.g. "DejaVu Sans Condensed"
+ QString style; // e.g. "Italic"
+ QString preferredName; // e.g. "DejaVu Sans"
+ QString preferredStyle; // e.g. "Condensed Italic"
+};
+
+bool qt_localizedName(const QString &name);
+QString qt_getEnglishName(const QString &familyName, bool includeStyle = false);
+FontNames qt_getCanonicalFontNames(const LOGFONT &lf);
+
QT_END_NAMESPACE
#endif // QWINDOWSFONTDATABASE_H
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp
index 9fc6fec915..0cd473e020 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp
@@ -97,15 +97,6 @@ static void resolveGetCharWidthI()
ptrGetCharWidthI = (PtrGetCharWidthI)QSystemLibrary::resolve(QStringLiteral("gdi32"), "GetCharWidthI");
}
-static inline quint16 getUShort(unsigned char *p)
-{
- quint16 val;
- val = *p++ << 8;
- val |= *p;
-
- return val;
-}
-
// general font engine
QFixed QWindowsFontEngine::lineThickness() const
@@ -912,7 +903,7 @@ int QWindowsFontEngine::synthesized() const
SelectObject(hdc, hfont);
uchar data[4];
GetFontData(hdc, HEAD, 44, &data, 4);
- USHORT macStyle = getUShort(data);
+ USHORT macStyle = qt_getUShort(data);
if (tm.tmItalic && !(macStyle & 2))
synthesized_flags = SynthesizedItalic;
if (fontDef.stretch != 100 && ttf)
@@ -1192,9 +1183,10 @@ QFontEngine *QWindowsFontEngine::cloneWithSize(qreal pixelSize) const
if (!uniqueFamilyName.isEmpty())
request.family = uniqueFamilyName;
request.pixelSize = pixelSize;
+ const QString faceName = QString::fromWCharArray(m_logfont.lfFaceName);
QFontEngine *fontEngine =
- QWindowsFontDatabase::createEngine(request,
+ QWindowsFontDatabase::createEngine(request, faceName,
QWindowsFontDatabase::defaultVerticalDPI(),
m_fontEngineData);
if (fontEngine) {
@@ -1257,7 +1249,7 @@ QFontEngine *QWindowsMultiFontEngine::loadEngine(int at)
#ifndef QT_NO_DIRECTWRITE
if (fontEngine->type() == QFontEngine::DirectWrite) {
QWindowsFontEngineDirectWrite *fe = static_cast<QWindowsFontEngineDirectWrite *>(fontEngine);
- lf = QWindowsFontDatabase::fontDefToLOGFONT(fe->fontDef);
+ lf = QWindowsFontDatabase::fontDefToLOGFONT(fe->fontDef, QString());
data = fe->fontEngineData();
} else
diff --git a/src/platformsupport/services/genericunix/qgenericunixservices.cpp b/src/platformsupport/services/genericunix/qgenericunixservices.cpp
index 5242f00193..a24ab82057 100644
--- a/src/platformsupport/services/genericunix/qgenericunixservices.cpp
+++ b/src/platformsupport/services/genericunix/qgenericunixservices.cpp
@@ -38,6 +38,7 @@
****************************************************************************/
#include "qgenericunixservices_p.h"
+#include <QtGui/private/qtguiglobal_p.h>
#include <QtCore/QStandardPaths>
#include <QtCore/QProcess>
@@ -48,7 +49,7 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_MULTIPROCESS
+#if QT_CONFIG(multiprocess)
enum { debug = 0 };
diff --git a/src/plugins/platforms/cocoa/COCOA_LICENSE.txt b/src/plugins/platforms/cocoa/COCOA_LICENSE.txt
new file mode 100644
index 0000000000..8c08f48528
--- /dev/null
+++ b/src/plugins/platforms/cocoa/COCOA_LICENSE.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2007-2008, Apple, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of Apple, Inc. nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
index b8a64641a8..e32ff26ff5 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
@@ -360,7 +360,7 @@ NSMenuItem *QCocoaMenuItem::sync()
NSImage *img = nil;
if (!m_icon.isNull()) {
- img = qt_mac_create_nsimage(m_icon);
+ img = qt_mac_create_nsimage(m_icon, m_iconSize);
[img setSize:NSMakeSize(m_iconSize, m_iconSize)];
}
[m_native setImage:img];
diff --git a/src/plugins/platforms/cocoa/qt_attribution.json b/src/plugins/platforms/cocoa/qt_attribution.json
new file mode 100644
index 0000000000..37c0937f29
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qt_attribution.json
@@ -0,0 +1,13 @@
+{
+ "Id": "cocoa-platform-plugin",
+ "Name": "Cocoa Platform Plugin",
+ "QDocModule": "qtgui",
+ "QtUsage": "Code used in the Qt Platform Abstraction (QPA) for macOS.",
+ "Files": "qcocoaapplication.h qcocoaapplication.mm qcocoaapplicationdelegate.h qcocoaapplicationdelegate.mm qcocoaeventdispatcher.h qcocoaeventdispatcher.mm qcocoaintrospection.h qcocoaintrospection.mm qcocoasystemtrayicon.mm qmacdefines_mac.h",
+
+ "Description": "Allows Qt to integrate into Apple's Cocoa API.",
+ "LicenseId": "BSD-3-Clause",
+ "License": "BSD 3-clause \"New\" or \"Revised\" License",
+ "LicenseFile": "COCOA_LICENSE.txt",
+ "Copyright": "Copyright (c) 2007-2008, Apple, Inc."
+}
diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp
index 69d2e12778..c4ff937a0b 100644
--- a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp
+++ b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp
@@ -1037,7 +1037,7 @@ public:
if (fontFace)
return fontFace;
- LOGFONT lf = QWindowsFontDatabase::fontDefToLOGFONT(fontDef);
+ LOGFONT lf = QWindowsFontDatabase::fontDefToLOGFONT(fontDef, QString());
// Get substitute name
static const char keyC[] = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes";
diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp
index 7c88c73cc2..8cf6660c44 100644
--- a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp
+++ b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp
@@ -188,7 +188,7 @@ QPlatformBackingStore *QEglFSIntegration::createPlatformBackingStore(QWindow *wi
QPlatformWindow *QEglFSIntegration::createPlatformWindow(QWindow *window) const
{
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
QEglFSWindow *w = qt_egl_device_integration()->createWindow(window);
w->create();
if (window->type() != Qt::ToolTip)
diff --git a/src/plugins/platforms/eglfs/api/qeglfswindow.cpp b/src/plugins/platforms/eglfs/api/qeglfswindow.cpp
index e79b377d40..639fc56d2b 100644
--- a/src/plugins/platforms/eglfs/api/qeglfswindow.cpp
+++ b/src/plugins/platforms/eglfs/api/qeglfswindow.cpp
@@ -215,7 +215,7 @@ void QEglFSWindow::setVisible(bool visible)
QWindowSystemInterface::handleExposeEvent(wnd, QRect(QPoint(0, 0), wnd->geometry().size()));
if (visible)
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
}
void QEglFSWindow::setGeometry(const QRect &r)
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp
index cd468c989f..8eb07d727b 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp
@@ -48,7 +48,7 @@
QT_BEGIN_NAMESPACE
-struct fbdev_window {
+struct shadow_fbdev_window {
unsigned short width;
unsigned short height;
};
@@ -91,7 +91,7 @@ EGLNativeWindowType QEglFSMaliIntegration::createNativeWindow(QPlatformWindow *w
Q_UNUSED(window);
Q_UNUSED(format);
- fbdev_window *fbwin = reinterpret_cast<fbdev_window *>(malloc(sizeof(fbdev_window)));
+ shadow_fbdev_window *fbwin = reinterpret_cast<shadow_fbdev_window *>(malloc(sizeof(shadow_fbdev_window)));
if (NULL == fbwin)
return 0;
diff --git a/src/plugins/platforms/windows/qwin10helpers.cpp b/src/plugins/platforms/windows/qwin10helpers.cpp
new file mode 100644
index 0000000000..3ded96b9d6
--- /dev/null
+++ b/src/plugins/platforms/windows/qwin10helpers.cpp
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwin10helpers.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/private/qsystemlibrary_p.h>
+
+#if defined(Q_CC_MINGW)
+# define HAS_UI_VIEW_SETTINGS_INTEROP
+#elif !defined(Q_CC_MSVC) || _MSC_VER >= 1900 // MSVC2013 is lacking both
+# define HAS_UI_VIEW_SETTINGS_INTEROP
+# define HAS_UI_VIEW_SETTINGS
+#endif
+
+#include <inspectable.h>
+
+#ifdef HAS_UI_VIEW_SETTINGS
+# include <windows.ui.viewmanagement.h>
+#endif
+
+#ifdef HAS_UI_VIEW_SETTINGS_INTEROP
+# include <UIViewSettingsInterop.h>
+#endif
+
+#ifndef HAS_UI_VIEW_SETTINGS_INTEROP
+MIDL_INTERFACE("3694dbf9-8f68-44be-8ff5-195c98ede8a6")
+IUIViewSettingsInterop : public IInspectable
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE GetForWindow(
+ __RPC__in HWND hwnd,
+ __RPC__in REFIID riid,
+ __RPC__deref_out_opt void **ppv) = 0;
+};
+#endif // !HAS_UI_VIEW_SETTINGS_INTEROP
+
+#ifndef HAS_UI_VIEW_SETTINGS
+namespace ABI {
+namespace Windows {
+namespace UI {
+namespace ViewManagement {
+
+enum UserInteractionMode { Mouse, Touch };
+
+MIDL_INTERFACE("C63657F6-8850-470D-88F8-455E16EA2C26")
+IUIViewSettings : public IInspectable
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE get_UserInteractionMode(UserInteractionMode *value) = 0;
+};
+
+} // namespace ViewManagement
+} // namespace UI
+} // namespace Windows
+} // namespace ABI
+#endif // HAS_UI_VIEW_SETTINGS
+
+QT_BEGIN_NAMESPACE
+
+// Starting from Windows 10
+struct QWindowsComBaseDLL
+{
+ bool init();
+ bool isValid() const
+ {
+ return roGetActivationFactory != nullptr && windowsCreateStringReference != nullptr;
+ }
+
+ typedef HRESULT (WINAPI *RoGetActivationFactory)(HSTRING, REFIID, void **);
+ typedef HRESULT (WINAPI *WindowsCreateStringReference)(PCWSTR, UINT32, HSTRING_HEADER *, HSTRING *);
+
+ RoGetActivationFactory roGetActivationFactory = nullptr;
+ WindowsCreateStringReference windowsCreateStringReference = nullptr;
+};
+
+static QWindowsComBaseDLL baseComDll;
+
+bool QWindowsComBaseDLL::init()
+{
+ if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS10 && !isValid()) {
+ QSystemLibrary library(QStringLiteral("combase"));
+ roGetActivationFactory =
+ reinterpret_cast<RoGetActivationFactory>(library.resolve("RoGetActivationFactory"));
+ windowsCreateStringReference =
+ reinterpret_cast<WindowsCreateStringReference>(library.resolve("WindowsCreateStringReference"));
+ }
+ return isValid();
+}
+
+// Return tablet mode, note: Does not work for GetDesktopWindow().
+bool qt_windowsIsTabletMode(HWND hwnd)
+{
+ bool result = false;
+
+ if (!baseComDll.init())
+ return false;
+
+ const wchar_t uiViewSettingsId[] = L"Windows.UI.ViewManagement.UIViewSettings";
+ HSTRING_HEADER uiViewSettingsIdRefHeader;
+ HSTRING uiViewSettingsIdHs = nullptr;
+ const UINT32 uiViewSettingsIdLen = UINT32(sizeof(uiViewSettingsId) / sizeof(uiViewSettingsId[0]) - 1);
+ if (FAILED(baseComDll.windowsCreateStringReference(uiViewSettingsId, uiViewSettingsIdLen, &uiViewSettingsIdRefHeader, &uiViewSettingsIdHs)))
+ return false;
+
+ IUIViewSettingsInterop *uiViewSettingsInterop = nullptr;
+ // __uuidof(IUIViewSettingsInterop);
+ const GUID uiViewSettingsInteropRefId = {0x3694dbf9, 0x8f68, 0x44be,{0x8f, 0xf5, 0x19, 0x5c, 0x98, 0xed, 0xe8, 0xa6}};
+
+ HRESULT hr = baseComDll.roGetActivationFactory(uiViewSettingsIdHs, uiViewSettingsInteropRefId,
+ reinterpret_cast<void **>(&uiViewSettingsInterop));
+ if (FAILED(hr))
+ return false;
+
+ // __uuidof(ABI::Windows::UI::ViewManagement::IUIViewSettings);
+ const GUID uiViewSettingsRefId = {0xc63657f6, 0x8850, 0x470d,{0x88, 0xf8, 0x45, 0x5e, 0x16, 0xea, 0x2c, 0x26}};
+ ABI::Windows::UI::ViewManagement::IUIViewSettings *viewSettings = nullptr;
+ hr = uiViewSettingsInterop->GetForWindow(hwnd, uiViewSettingsRefId,
+ reinterpret_cast<void **>(&viewSettings));
+ if (SUCCEEDED(hr)) {
+ ABI::Windows::UI::ViewManagement::UserInteractionMode currentMode;
+ hr = viewSettings->get_UserInteractionMode(&currentMode);
+ if (SUCCEEDED(hr))
+ result = currentMode == 1; // Touch, 1
+ viewSettings->Release();
+ }
+ uiViewSettingsInterop->Release();
+ return result;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwin10helpers.h b/src/plugins/platforms/windows/qwin10helpers.h
new file mode 100644
index 0000000000..e1485003dd
--- /dev/null
+++ b/src/plugins/platforms/windows/qwin10helpers.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWIN10HELPERS_H
+#define QWIN10HELPERS_H
+
+#include <QtCore/QtGlobal>
+#include <QtCore/qt_windows.h>
+
+QT_BEGIN_NAMESPACE
+
+bool qt_windowsIsTabletMode(HWND hwnd);
+
+QT_END_NAMESPACE
+
+#endif // QWIN10HELPERS_H
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.h b/src/plugins/platforms/windows/qwindowsclipboard.h
index 3fe0c74e78..992d34d492 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.h
+++ b/src/plugins/platforms/windows/qwindowsclipboard.h
@@ -73,6 +73,8 @@ public:
static QWindowsClipboard *instance() { return m_instance; }
+ HWND clipboardViewer() const { return m_clipboardViewer; }
+
private:
void clear();
void releaseIData();
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 004b03d9a9..f49ad0e767 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -41,6 +41,7 @@
#include "qwindowsintegration.h"
#include "qwindowswindow.h"
#include "qwindowscontext.h"
+#include "qwin10helpers.h"
#include "qwindowsopenglcontext.h"
#include "qwindowsscreen.h"
@@ -510,6 +511,12 @@ QVariant QWindowsIntegration::styleHint(QPlatformIntegration::StyleHint hint) co
case KeyboardAutoRepeatRate:
return QVariant(keyBoardAutoRepeatRateMS());
#endif
+ case QPlatformIntegration::ShowIsMaximized:
+#ifndef QT_NO_CLIPBOARD
+ return qt_windowsIsTabletMode(d->m_clipboard.clipboardViewer());
+#else
+ break;
+#endif
case QPlatformIntegration::StartDragTime:
case QPlatformIntegration::StartDragDistance:
case QPlatformIntegration::KeyboardInputInterval:
diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp
index b8c4f0b736..00c4a6191e 100644
--- a/src/plugins/platforms/windows/qwindowskeymapper.cpp
+++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp
@@ -837,6 +837,9 @@ bool QWindowsKeyMapper::translateKeyEvent(QWindow *widget, HWND hwnd,
bool QWindowsKeyMapper::translateMultimediaKeyEventInternal(QWindow *window, const MSG &msg)
{
#if defined(WM_APPCOMMAND)
+ // QTBUG-57198, do not send mouse-synthesized commands as key events in addition
+ if (GET_DEVICE_LPARAM(msg.lParam) == FAPPCOMMAND_MOUSE)
+ return false;
const int cmd = GET_APPCOMMAND_LPARAM(msg.lParam);
const int dwKeys = GET_KEYSTATE_LPARAM(msg.lParam);
int state = 0;
diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri
index d97e49309f..20e0b81da9 100644
--- a/src/plugins/platforms/windows/windows.pri
+++ b/src/plugins/platforms/windows/windows.pri
@@ -25,7 +25,8 @@ SOURCES += \
$$PWD/qwindowsdialoghelpers.cpp \
$$PWD/qwindowsservices.cpp \
$$PWD/qwindowsnativeinterface.cpp \
- $$PWD/qwindowsopengltester.cpp
+ $$PWD/qwindowsopengltester.cpp \
+ $$PWD/qwin10helpers.cpp
HEADERS += \
$$PWD/qwindowswindow.h \
@@ -46,6 +47,7 @@ HEADERS += \
$$PWD/qwindowsnativeinterface.h \
$$PWD/qwindowsopengltester.h \
$$PWD/qwindowsthreadpoolrunner.h
+ $$PWD/qwin10helpers.h
INCLUDEPATH += $$PWD
diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
index eb2bddd0bd..0bea9ebfa1 100644
--- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
+++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
@@ -1624,7 +1624,7 @@ QString QMYSQLDriver::formatValue(const QSqlField &field, bool trimStrings) cons
Q_D(const QMYSQLDriver);
QString r;
if (field.isNull()) {
- r = QLatin1String("NULL");
+ r = QStringLiteral("NULL");
} else {
switch(field.type()) {
case QVariant::Double:
diff --git a/src/printsupport/kernel/kernel.pri b/src/printsupport/kernel/kernel.pri
index 22d12e4cc3..90eab4a634 100644
--- a/src/printsupport/kernel/kernel.pri
+++ b/src/printsupport/kernel/kernel.pri
@@ -30,7 +30,7 @@ win32 {
$$PWD/qprintengine_win_p.h
SOURCES += \
$$PWD/qprintengine_win.cpp
- LIBS_PRIVATE += -lwinspool -lcomdlg32 -lgdi32 -luser32
+ !winrt: LIBS_PRIVATE += -lwinspool -lcomdlg32 -lgdi32 -luser32
}
unix:!darwin:qtConfig(cups) {
diff --git a/src/src.pro b/src/src.pro
index f19b0bd354..b13bc4fa43 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -178,18 +178,14 @@ qtConfig(gui) {
src_plugins.depends += src_gui src_platformsupport src_platformheaders
src_testlib.depends += src_gui # if QtGui is enabled, QtTest requires QtGui's headers
qtConfig(widgets) {
- SUBDIRS += src_tools_uic src_widgets
+ SUBDIRS += src_tools_uic src_widgets src_printsupport
TOOLS += src_tools_uic
- src_plugins.depends += src_widgets
+ src_plugins.depends += src_widgets src_printsupport
src_testlib.depends += src_widgets # if QtWidgets is enabled, QtTest requires QtWidgets's headers
qtConfig(opengl) {
SUBDIRS += src_opengl
src_plugins.depends += src_opengl
}
- !wince:!winrt {
- SUBDIRS += src_printsupport
- src_plugins.depends += src_printsupport
- }
}
}
SUBDIRS += src_plugins
diff --git a/src/testlib/doc/src/qttestlib-manual.qdoc b/src/testlib/doc/src/qttestlib-manual.qdoc
index d775ae5b76..6bdf6c33c7 100644
--- a/src/testlib/doc/src/qttestlib-manual.qdoc
+++ b/src/testlib/doc/src/qttestlib-manual.qdoc
@@ -361,35 +361,6 @@
See \l {Chapter 5: Writing a Benchmark}{Writing a Benchmark} in the Qt Test
Tutorial for more benchmarking examples.
-
- \section1 3rd Party Code
-
- The CPU tick counters used for benchmarking are licensed under the following
- license: (from src/testlib/3rdparty/cycle.h)
-
- \legalese
- Copyright (c) 2003, 2006 Matteo Frigo\br
- Copyright (c) 2003, 2006 Massachusetts Institute of Technology
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- \endlegalese
*/
/*!
diff --git a/src/testlib/qxctestlogger.mm b/src/testlib/qxctestlogger.mm
index ffabe88db2..62fd73070f 100644
--- a/src/testlib/qxctestlogger.mm
+++ b/src/testlib/qxctestlogger.mm
@@ -66,7 +66,7 @@
QT_WARNING_PUSH
// Ignore XCTestProbe deprecation
-QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations")
+QT_WARNING_DISABLE_DEPRECATED
// ---------------------------------------------------------
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 3bd87e1f01..89bf2bd6a1 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -1002,12 +1002,17 @@ void Moc::generate(FILE *out)
fprintf(out, "#endif\n\n");
fprintf(out, "QT_BEGIN_MOC_NAMESPACE\n");
+ fprintf(out, "QT_WARNING_PUSH\n");
+ fprintf(out, "QT_WARNING_DISABLE_DEPRECATED\n");
+ fputs("", out);
for (i = 0; i < classList.size(); ++i) {
Generator generator(&classList[i], metaTypes, knownQObjectClasses, knownGadgets, out);
generator.generateCode();
}
+ fputs("", out);
+ fprintf(out, "QT_WARNING_POP\n");
fprintf(out, "QT_END_MOC_NAMESPACE\n");
}
diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp
index 18772d2816..c8ac554cd4 100644
--- a/src/tools/rcc/rcc.cpp
+++ b/src/tools/rcc/rcc.cpp
@@ -203,6 +203,12 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib)
}
if (text || pass1)
lib.writeChar('\n');
+
+ // last modified time stamp
+ const QDateTime lastModified = m_fileInfo.lastModified();
+ lib.writeNumber8(quint64(lastModified.isValid() ? lastModified.toMSecsSinceEpoch() : 0));
+ if (text || pass1)
+ lib.writeChar('\n');
}
qint64 RCCFileInfo::writeDataBlob(RCCResourceLibrary &lib, qint64 offset,
@@ -833,6 +839,38 @@ void RCCResourceLibrary::writeNumber4(quint32 number)
}
}
+void RCCResourceLibrary::writeNumber8(quint64 number)
+{
+ if (m_format == RCCResourceLibrary::Pass2) {
+ m_outDevice->putChar(char(number >> 56));
+ m_outDevice->putChar(char(number >> 48));
+ m_outDevice->putChar(char(number >> 40));
+ m_outDevice->putChar(char(number >> 32));
+ m_outDevice->putChar(char(number >> 24));
+ m_outDevice->putChar(char(number >> 16));
+ m_outDevice->putChar(char(number >> 8));
+ m_outDevice->putChar(char(number));
+ } else if (m_format == RCCResourceLibrary::Binary) {
+ writeChar(number >> 56);
+ writeChar(number >> 48);
+ writeChar(number >> 40);
+ writeChar(number >> 32);
+ writeChar(number >> 24);
+ writeChar(number >> 16);
+ writeChar(number >> 8);
+ writeChar(number);
+ } else {
+ writeHex(number >> 56);
+ writeHex(number >> 48);
+ writeHex(number >> 40);
+ writeHex(number >> 32);
+ writeHex(number >> 24);
+ writeHex(number >> 16);
+ writeHex(number >> 8);
+ writeHex(number);
+ }
+}
+
bool RCCResourceLibrary::writeHeader()
{
if (m_format == C_Code || m_format == Pass1) {
@@ -1076,7 +1114,7 @@ bool RCCResourceLibrary::writeInitializer()
if (m_root) {
writeString(" ");
writeAddNamespaceFunction("qRegisterResourceData");
- writeString("\n (0x01, qt_resource_struct, "
+ writeString("\n (0x02, qt_resource_struct, "
"qt_resource_name, qt_resource_data);\n");
}
writeString(" return 1;\n");
@@ -1097,7 +1135,7 @@ bool RCCResourceLibrary::writeInitializer()
if (m_root) {
writeString(" ");
writeAddNamespaceFunction("qUnregisterResourceData");
- writeString("\n (0x01, qt_resource_struct, "
+ writeString("\n (0x02, qt_resource_struct, "
"qt_resource_name, qt_resource_data);\n");
}
writeString(" return 1;\n");
@@ -1114,10 +1152,10 @@ bool RCCResourceLibrary::writeInitializer()
} else if (m_format == Binary) {
int i = 4;
char *p = m_out.data();
- p[i++] = 0; // 0x01
+ p[i++] = 0; // 0x02
p[i++] = 0;
p[i++] = 0;
- p[i++] = 1;
+ p[i++] = 2;
p[i++] = (m_treeOffset >> 24) & 0xff;
p[i++] = (m_treeOffset >> 16) & 0xff;
diff --git a/src/tools/rcc/rcc.h b/src/tools/rcc/rcc.h
index 8d0d83e00c..157cd4809f 100644
--- a/src/tools/rcc/rcc.h
+++ b/src/tools/rcc/rcc.h
@@ -118,6 +118,7 @@ private:
void writeHex(quint8 number);
void writeNumber2(quint16 number);
void writeNumber4(quint32 number);
+ void writeNumber8(quint64 number);
void writeChar(char c) { m_out.append(c); }
void writeByteArray(const QByteArray &);
void write(const char *, int len);
diff --git a/src/tools/uic/qclass_lib_map.h b/src/tools/uic/qclass_lib_map.h
index 930a648d57..810b326b30 100644
--- a/src/tools/uic/qclass_lib_map.h
+++ b/src/tools/uic/qclass_lib_map.h
@@ -440,12 +440,6 @@ QT_CLASS_LIB(QXmlResultItems, QtXmlPatterns, qxmlresultitems.h)
QT_CLASS_LIB(QXmlSchema, QtXmlPatterns, qxmlschema.h)
QT_CLASS_LIB(QXmlSchemaValidator, QtXmlPatterns, qxmlschemavalidator.h)
QT_CLASS_LIB(QXmlSerializer, QtXmlPatterns, qxmlserializer.h)
-QT_CLASS_LIB(QMeeGoFenceSync, QtMeeGoGraphicsSystemHelper, qmeegofencesync.h)
-QT_CLASS_LIB(QMeeGoGraphicsSystemHelper, QtMeeGoGraphicsSystemHelper, qmeegographicssystemhelper.h)
-QT_CLASS_LIB(QMeeGoLivePixmap, QtMeeGoGraphicsSystemHelper, qmeegolivepixmap.h)
-QT_CLASS_LIB(QMeeGoOverlayWidget, QtMeeGoGraphicsSystemHelper, qmeegooverlaywidget.h)
-QT_CLASS_LIB(QMeeGoRuntime, QtMeeGoGraphicsSystemHelper, qmeegoruntime.h)
-QT_CLASS_LIB(QMeeGoSwitchEvent, QtMeeGoGraphicsSystemHelper, qmeegoswitchevent.h)
QT_CLASS_LIB(QAxBase, ActiveQt, qaxbase.h)
QT_CLASS_LIB(QAxObject, ActiveQt, qaxobject.h)
QT_CLASS_LIB(QAxScriptEngine, ActiveQt, qaxscript.h)
diff --git a/src/widgets/accessible/itemviews.cpp b/src/widgets/accessible/itemviews.cpp
index 09eba76fbd..db5af4fd7c 100644
--- a/src/widgets/accessible/itemviews.cpp
+++ b/src/widgets/accessible/itemviews.cpp
@@ -564,20 +564,8 @@ void QAccessibleTable::modelChange(QAccessibleTableModelChangeEvent *event)
QAccessible::Id id = iter.value();
QAccessibleInterface *iface = QAccessible::accessibleInterface(id);
Q_ASSERT(iface);
- if (iface->role() == QAccessible::Cell || iface->role() == QAccessible::ListItem) {
- Q_ASSERT(iface->tableCellInterface());
- QAccessibleTableCell *cell = static_cast<QAccessibleTableCell*>(iface->tableCellInterface());
- if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted
- && cell->m_index.row() >= event->firstRow()) {
- int newRow = cell->m_index.row() + newRows;
- cell->m_index = cell->m_index.sibling(newRow, cell->m_index.column());
- } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::ColumnsInserted
- && cell->m_index.column() >= event->firstColumn()) {
- int newColumn = cell->m_index.column() + newColumns;
- cell->m_index = cell->m_index.sibling(cell->m_index.row(), newColumn);
- }
- } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted
- && iface->role() == QAccessible::RowHeader) {
+ if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted
+ && iface->role() == QAccessible::RowHeader) {
QAccessibleTableHeaderCell *cell = static_cast<QAccessibleTableHeaderCell*>(iface);
if (cell->index >= event->firstRow()) {
cell->index += newRows;
@@ -616,27 +604,11 @@ void QAccessibleTable::modelChange(QAccessibleTableModelChangeEvent *event)
if (iface->role() == QAccessible::Cell || iface->role() == QAccessible::ListItem) {
Q_ASSERT(iface->tableCellInterface());
QAccessibleTableCell *cell = static_cast<QAccessibleTableCell*>(iface->tableCellInterface());
- if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsRemoved) {
- if (cell->m_index.row() < event->firstRow()) {
- newCache.insert(indexOfChild(cell), id);
- } else if (cell->m_index.row() > event->lastRow()) {
- int newRow = cell->m_index.row() - deletedRows;
- cell->m_index = cell->m_index.sibling(newRow, cell->m_index.column());
- newCache.insert(indexOfChild(cell), id);
- } else {
- QAccessible::deleteAccessibleInterface(id);
- }
- } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::ColumnsRemoved) {
- if (cell->m_index.column() < event->firstColumn()) {
- newCache.insert(indexOfChild(cell), id);
- } else if (cell->m_index.column() > event->lastColumn()) {
- int newColumn = cell->m_index.column() - deletedColumns;
- cell->m_index = cell->m_index.sibling(cell->m_index.row(), newColumn);
- newCache.insert(indexOfChild(cell), id);
- } else {
- QAccessible::deleteAccessibleInterface(id);
- }
- }
+ // Since it is a QPersistentModelIndex, we only need to check if it is valid
+ if (cell->m_index.isValid())
+ newCache.insert(indexOfChild(cell), id);
+ else
+ QAccessible::deleteAccessibleInterface(id);
} else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsRemoved
&& iface->role() == QAccessible::RowHeader) {
QAccessibleTableHeaderCell *cell = static_cast<QAccessibleTableHeaderCell*>(iface);
diff --git a/src/widgets/accessible/itemviews_p.h b/src/widgets/accessible/itemviews_p.h
index 5b73444c67..1b3869f2fa 100644
--- a/src/widgets/accessible/itemviews_p.h
+++ b/src/widgets/accessible/itemviews_p.h
@@ -216,7 +216,7 @@ private:
QHeaderView *verticalHeader() const;
QHeaderView *horizontalHeader() const;
QPointer<QAbstractItemView > view;
- QModelIndex m_index;
+ QPersistentModelIndex m_index;
QAccessible::Role m_role;
void selectCell();
diff --git a/src/widgets/kernel/qformlayout.cpp b/src/widgets/kernel/qformlayout.cpp
index 3e60723f17..f3f7280030 100644
--- a/src/widgets/kernel/qformlayout.cpp
+++ b/src/widgets/kernel/qformlayout.cpp
@@ -1410,18 +1410,15 @@ static QLayoutItem *ownershipCleanedItem(QFormLayoutItem *item, QFormLayout *lay
return i;
}
-static void clearQLayoutItem(QLayoutItem *item)
+static void clearAndDestroyQLayoutItem(QLayoutItem *item)
{
if (Q_LIKELY(item)) {
+ delete item->widget();
if (QLayout *layout = item->layout()) {
- while (QLayoutItem *child = layout->takeAt(0)) {
- clearQLayoutItem(child);
- delete child;
- }
- delete layout;
+ while (QLayoutItem *child = layout->takeAt(0))
+ clearAndDestroyQLayoutItem(child);
}
- delete item->widget();
- delete item->spacerItem();
+ delete item;
}
}
@@ -1453,8 +1450,8 @@ static void clearQLayoutItem(QLayoutItem *item)
void QFormLayout::removeRow(int row)
{
TakeRowResult result = takeRow(row);
- clearQLayoutItem(result.labelItem);
- clearQLayoutItem(result.fieldItem);
+ clearAndDestroyQLayoutItem(result.labelItem);
+ clearAndDestroyQLayoutItem(result.fieldItem);
}
/*!
@@ -1485,8 +1482,8 @@ void QFormLayout::removeRow(int row)
void QFormLayout::removeRow(QWidget *widget)
{
TakeRowResult result = takeRow(widget);
- clearQLayoutItem(result.labelItem);
- clearQLayoutItem(result.fieldItem);
+ clearAndDestroyQLayoutItem(result.labelItem);
+ clearAndDestroyQLayoutItem(result.fieldItem);
}
/*!
@@ -1518,8 +1515,8 @@ void QFormLayout::removeRow(QWidget *widget)
void QFormLayout::removeRow(QLayout *layout)
{
TakeRowResult result = takeRow(layout);
- clearQLayoutItem(result.labelItem);
- clearQLayoutItem(result.fieldItem);
+ clearAndDestroyQLayoutItem(result.labelItem);
+ clearAndDestroyQLayoutItem(result.fieldItem);
}
/*!
diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h
index 5edf2c62da..58413c6bd3 100644
--- a/src/widgets/kernel/qwidget.h
+++ b/src/widgets/kernel/qwidget.h
@@ -570,16 +570,6 @@ public:
inline QWidget *childAt(int x, int y) const;
QWidget *childAt(const QPoint &p) const;
-#if 0 // Used to be included in Qt4 for Q_WS_X11
- const QX11Info &x11Info() const;
- Qt::HANDLE x11PictureHandle() const;
-#endif
-
-#if 0 // Used to be included in Qt4 for Q_WS_MAC
- Qt::HANDLE macQDHandle() const;
- Qt::HANDLE macCGHandle() const;
-#endif
-
void setAttribute(Qt::WidgetAttribute, bool on = true);
inline bool testAttribute(Qt::WidgetAttribute) const;
diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp
index dd5f5325b1..ffe1ca1c66 100644
--- a/src/widgets/widgets/qlineedit.cpp
+++ b/src/widgets/widgets/qlineedit.cpp
@@ -603,7 +603,7 @@ const QValidator * QLineEdit::validator() const
The initial setting is to have no input validator (i.e. any input
is accepted up to maxLength()).
- \sa validator(), QIntValidator, QDoubleValidator, QRegExpValidator
+ \sa validator(), hasAcceptableInput(), QIntValidator, QDoubleValidator, QRegExpValidator
*/
void QLineEdit::setValidator(const QValidator *v)
diff --git a/src/widgets/widgets/qpushbutton.h b/src/widgets/widgets/qpushbutton.h
index 859ac247fb..b0d1ccacdb 100644
--- a/src/widgets/widgets/qpushbutton.h
+++ b/src/widgets/widgets/qpushbutton.h
@@ -87,9 +87,6 @@ public Q_SLOTS:
protected:
bool event(QEvent *e) Q_DECL_OVERRIDE;
-#if 0 // Used to be included in Qt4 for Q_WS_MAC
- bool hitButton(const QPoint &pos) const;
-#endif
void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE;
void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE;
void focusInEvent(QFocusEvent *) Q_DECL_OVERRIDE;
diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp
index eeba882c70..287b8aebd8 100644
--- a/tests/auto/corelib/io/qfile/tst_qfile.cpp
+++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp
@@ -2658,7 +2658,8 @@ void tst_QFile::handle()
QVERIFY(fd > 2);
QCOMPARE(int(file.handle()), fd);
char c = '\0';
- QT_READ(int(file.handle()), &c, 1);
+ const auto readResult = QT_READ(int(file.handle()), &c, 1);
+ QCOMPARE(readResult, static_cast<decltype(readResult)>(1));
QCOMPARE(c, '/');
// test if the QFile and the handle remain in sync
diff --git a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp
index 561ab193c6..7fdd00876f 100644
--- a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp
+++ b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp
@@ -55,6 +55,7 @@ private slots:
void searchPath();
void doubleSlashInRoot();
void setLocale();
+ void lastModified();
private:
const QString m_runtimeResourceRcc;
@@ -489,6 +490,20 @@ void tst_QResourceEngine::setLocale()
QLocale::setDefault(QLocale::system());
}
+void tst_QResourceEngine::lastModified()
+{
+ {
+ QFileInfo fi(":/");
+ QVERIFY(fi.exists());
+ QVERIFY2(!fi.lastModified().isValid(), qPrintable(fi.lastModified().toString()));
+ }
+ {
+ QFileInfo fi(":/search_file.txt");
+ QVERIFY(fi.exists());
+ QVERIFY(fi.lastModified().isValid());
+ }
+}
+
QTEST_MAIN(tst_QResourceEngine)
#include "tst_qresourceengine.moc"
diff --git a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
index 5b18ab9d68..a7a761a2da 100644
--- a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
+++ b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
@@ -33,6 +33,9 @@
#include <qfileinfo.h>
#include <qsysinfo.h>
#include <qregexp.h>
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) && !defined(Q_OS_WINCE)
+# include <qt_windows.h>
+#endif
#ifdef Q_OS_UNIX
#include <unistd.h>
@@ -126,6 +129,16 @@ static const char * const enumNames[MaxStandardLocation + 1 - int(QStandardPaths
void tst_qstandardpaths::initTestCase()
{
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) && !defined(Q_OS_WINCE)
+ // Disable WOW64 redirection, see testFindExecutable()
+ if (QSysInfo::buildCpuArchitecture() != QSysInfo::currentCpuArchitecture()) {
+ void *oldMode;
+ const bool disabledDisableWow64FsRedirection = Wow64DisableWow64FsRedirection(&oldMode) == TRUE;
+ if (!disabledDisableWow64FsRedirection)
+ qErrnoWarning("Wow64DisableWow64FsRedirection() failed");
+ QVERIFY(disabledDisableWow64FsRedirection);
+ }
+#endif // Q_OS_WIN && !Q_OS_WINRT && !Q_OS_WINCE
QVERIFY2(m_localConfigTempDir.isValid(), qPrintable(m_localConfigTempDir.errorString()));
QVERIFY2(m_globalConfigTempDir.isValid(), qPrintable(m_globalConfigTempDir.errorString()));
QVERIFY2(m_localAppTempDir.isValid(), qPrintable(m_localAppTempDir.errorString()));
@@ -375,6 +388,7 @@ void tst_qstandardpaths::testFindExecutable_data()
if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS8) {
// The logo executable on Windows 8 is perfectly suited for testing that the
// suffix mechanism is not thrown off by dots in the name.
+ // Note: Requires disabling WOW64 redirection, see initTestCase()
const QString logo = QLatin1String("microsoft.windows.softwarelogo.showdesktop");
const QString logoPath = cmdFi.absolutePath() + QLatin1Char('/') + logo + QLatin1String(".exe");
QTest::newRow("win8-logo")
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index f589fe1d6d..a4461a12d3 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -177,6 +177,8 @@ private slots:
void streaming();
void detach();
void testThreading();
+ void matches_data();
+ void matches();
private:
void testThreadingHelper();
@@ -4020,6 +4022,54 @@ void tst_QUrl::testThreading()
delete s_urlStorage;
}
+void tst_QUrl::matches_data()
+{
+ QTest::addColumn<QString>("urlStrOne");
+ QTest::addColumn<QString>("urlStrTwo");
+ QTest::addColumn<uint>("options");
+ QTest::addColumn<bool>("matches");
+
+ QTest::newRow("matchingString-none") << "http://www.website.com/directory/?#ref"
+ << "http://www.website.com/directory/?#ref"
+ << uint(QUrl::None) << true;
+ QTest::newRow("nonMatchingString-none") << "http://www.website.com/directory/?#ref"
+ << "http://www.nomatch.com/directory/?#ref"
+ << uint(QUrl::None) << false;
+ QTest::newRow("matchingHost-removePath") << "http://www.website.com/directory"
+ << "http://www.website.com/differentdir"
+ << uint(QUrl::RemovePath) << true;
+ QTest::newRow("nonMatchingHost-removePath") << "http://www.website.com/directory"
+ << "http://www.different.com/differentdir"
+ << uint(QUrl::RemovePath) << false;
+ QTest::newRow("matchingHost-removePathAuthority") << "http://user:pass@www.website.com/directory"
+ << "http://www.website.com/differentdir"
+ << uint(QUrl::RemovePath | QUrl::RemoveAuthority)
+ << true;
+ QTest::newRow("nonMatchingHost-removePathAuthority") << "http://user:pass@www.website.com/directory"
+ << "http://user:pass@www.different.com/differentdir"
+ << uint(QUrl::RemovePath | QUrl::RemoveAuthority)
+ << true;
+ QTest::newRow("matchingHostAuthority-removePathAuthority")
+ << "http://user:pass@www.website.com/directory" << "http://www.website.com/differentdir"
+ << uint(QUrl::RemovePath | QUrl::RemoveAuthority) << true;
+ QTest::newRow("nonMatchingAuthority-removePathAuthority")
+ << "http://user:pass@www.website.com/directory"
+ << "http://otheruser:otherpass@www.website.com/directory"
+ << uint(QUrl::RemovePath | QUrl::RemoveAuthority) << true;
+}
+
+void tst_QUrl::matches()
+{
+ QFETCH(QString, urlStrOne);
+ QFETCH(QString, urlStrTwo);
+ QFETCH(uint, options);
+ QFETCH(bool, matches);
+
+ QUrl urlOne(urlStrOne);
+ QUrl urlTwo(urlStrTwo);
+ QCOMPARE(urlOne.matches(urlTwo, QUrl::FormattingOptions(options)), matches);
+}
+
QTEST_MAIN(tst_QUrl)
#include "tst_qurl.moc"
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 0f7f75fb2e..91810cdcd8 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -6969,10 +6969,10 @@ void tst_QObject::checkArgumentsForNarrowing()
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<signed char, unsigned long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned char, signed char>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned char, short>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned char, int>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned char, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned char, long long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned char, short>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned char, int>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned char, long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned char, long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<short, unsigned short>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<short, unsigned int>::value));
@@ -6980,23 +6980,23 @@ void tst_QObject::checkArgumentsForNarrowing()
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<short, unsigned long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned short, short>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned short, int>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned short, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned short, long long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned short, int>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned short, long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned short, long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<int, unsigned int>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<int, unsigned long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<int, unsigned long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned int, int>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned int, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned int, long long>::value));
+ QCOMPARE((QtPrivate::AreArgumentsNarrowedBase<unsigned int, long>::value), sizeof(int) >= sizeof(long));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<unsigned int, long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<long, unsigned long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<long, unsigned long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned long, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned long, long long>::value));
+ QCOMPARE((QtPrivate::AreArgumentsNarrowedBase<unsigned long, long long>::value), sizeof(long) >= sizeof(long long));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<long long, unsigned long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<unsigned long long, long long>::value));
@@ -7206,28 +7206,28 @@ void tst_QObject::checkArgumentsForNarrowing()
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByLongLong, unsigned long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, signed char>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, short>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, int>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, long long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, short>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, int>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUChar, long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, signed char>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, short>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, int>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, long long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, int>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, long>::value));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUShort, long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUInt, signed char>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUInt, short>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUInt, int>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUInt, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUInt, long long>::value));
+ QCOMPARE((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUInt, long>::value), sizeof(ScopedEnumBackedByUInt) >= sizeof(long));
+ QVERIFY((!QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByUInt, long long>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULong, signed char>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULong, short>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULong, int>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULong, long>::value));
- QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULong, long long>::value));
+ QCOMPARE((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULong, long long>::value), sizeof(ScopedEnumBackedByULong) >= sizeof(long long));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULongLong, signed char>::value));
QVERIFY((QtPrivate::AreArgumentsNarrowedBase<ScopedEnumBackedByULongLong, short>::value));
diff --git a/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp b/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp
index b24ecfcd43..bf778e9fd1 100644
--- a/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp
+++ b/tests/auto/corelib/thread/qmutex/tst_qmutex.cpp
@@ -44,8 +44,19 @@
class tst_QMutex : public QObject
{
Q_OBJECT
+public:
+ enum class TimeUnit {
+ Nanoseconds,
+ Microseconds,
+ Milliseconds,
+ Seconds,
+ };
+ Q_ENUM(TimeUnit);
+
private slots:
void initTestCase();
+ void convertToMilliseconds_data();
+ void convertToMilliseconds();
void tryLock_non_recursive();
void try_lock_for_non_recursive();
void try_lock_until_non_recursive();
@@ -122,6 +133,109 @@ void tst_QMutex::initTestCase()
initializeSystemTimersResolution();
}
+void tst_QMutex::convertToMilliseconds_data()
+{
+ QTest::addColumn<TimeUnit>("unit");
+ QTest::addColumn<double>("doubleValue");
+ QTest::addColumn<qint64>("intValue");
+ QTest::addColumn<qint64>("expected");
+
+
+ auto add = [](TimeUnit unit, double d, long long i, qint64 expected) {
+ const QScopedArrayPointer<char> enumName(QTest::toString(unit));
+ QTest::newRow(qPrintable(QString::asprintf("%s:%f:%lld", enumName.data(), d, i)))
+ << unit << d << qint64(i) << expected;
+ };
+
+ auto forAllUnitsAdd = [=](double d, long long i, qint64 expected) {
+ for (auto unit : {TimeUnit::Nanoseconds, TimeUnit::Microseconds, TimeUnit::Milliseconds, TimeUnit::Seconds})
+ add(unit, d, i, expected);
+ };
+
+ forAllUnitsAdd(-0.5, -1, 0); // all negative values result in 0
+
+ forAllUnitsAdd(0, 0, 0);
+
+ add(TimeUnit::Nanoseconds, 1, 1, 1);
+ add(TimeUnit::Nanoseconds, 1000 * 1000, 1000 * 1000, 1);
+ add(TimeUnit::Nanoseconds, 1000 * 1000 + 0.5, 1000 * 1000 + 1, 2);
+
+ add(TimeUnit::Microseconds, 1, 1, 1);
+ add(TimeUnit::Microseconds, 1000, 1000, 1);
+ add(TimeUnit::Microseconds, 1000 + 0.5, 1000 + 1, 2);
+
+ add(TimeUnit::Milliseconds, 1, 1, 1);
+ add(TimeUnit::Milliseconds, 1.5, 2, 2);
+
+ add(TimeUnit::Seconds, 0.9991, 1, 1000);
+
+ //
+ // overflowing int results in INT_MAX (equivalent to a spurious wakeup after ~24 days); check it:
+ //
+
+ // spot on:
+ add(TimeUnit::Nanoseconds, INT_MAX * 1000. * 1000, INT_MAX * Q_INT64_C(1000) * 1000, INT_MAX);
+ add(TimeUnit::Microseconds, INT_MAX * 1000., INT_MAX * Q_INT64_C(1000), INT_MAX);
+ add(TimeUnit::Milliseconds, INT_MAX, INT_MAX, INT_MAX);
+
+ // minimally above:
+ add(TimeUnit::Nanoseconds, INT_MAX * 1000. * 1000 + 1, INT_MAX * Q_INT64_C(1000) * 1000 + 1, INT_MAX);
+ add(TimeUnit::Microseconds, INT_MAX * 1000. + 1, INT_MAX * Q_INT64_C(1000) + 1, INT_MAX);
+ add(TimeUnit::Milliseconds, INT_MAX + 1., INT_MAX + Q_INT64_C(1), INT_MAX);
+ add(TimeUnit::Seconds, INT_MAX / 1000. + 1, INT_MAX / 1000 + 1, INT_MAX);
+
+ // minimally below:
+ add(TimeUnit::Nanoseconds, INT_MAX * 1000. * 1000 - 1, INT_MAX * Q_INT64_C(1000) * 1000 - 1, INT_MAX);
+ add(TimeUnit::Microseconds, INT_MAX * 1000. - 1, INT_MAX * Q_INT64_C(1000) - 1, INT_MAX);
+ add(TimeUnit::Milliseconds, INT_MAX - 0.1, INT_MAX , INT_MAX);
+
+}
+
+void tst_QMutex::convertToMilliseconds()
+{
+#if !QT_HAS_INCLUDE(<chrono>)
+ QSKIP("This test requires <chrono>");
+#else
+ QFETCH(TimeUnit, unit);
+ QFETCH(double, doubleValue);
+ QFETCH(qint64, intValue);
+ QFETCH(qint64, expected);
+
+ Q_CONSTEXPR qint64 maxShort = std::numeric_limits<short>::max();
+ Q_CONSTEXPR qint64 maxInt = std::numeric_limits<int>::max();
+ Q_CONSTEXPR qint64 maxUInt = std::numeric_limits<uint>::max();
+
+ switch (unit) {
+#define CASE(Unit, Period) \
+ case TimeUnit::Unit: \
+ DO(double, Period, doubleValue); \
+ if (intValue < maxShort) \
+ DO(short, Period, short(intValue)); \
+ if (intValue < maxInt) \
+ DO(int, Period, int(intValue)); \
+ DO(qint64, Period, intValue); \
+ if (intValue >= 0) { \
+ if (intValue < maxUInt) \
+ DO(uint, Period, uint(intValue)); \
+ DO(quint64, Period, quint64(intValue)); \
+ } \
+ break
+#define DO(Rep, Period, val) \
+ do { \
+ const std::chrono::duration<Rep, Period> wait((val)); \
+ QCOMPARE(QMutex::convertToMilliseconds(wait), expected); \
+ } while (0)
+
+ CASE(Nanoseconds, std::nano);
+ CASE(Microseconds, std::micro);
+ CASE(Milliseconds, std::milli);
+ CASE(Seconds, std::ratio<1>);
+#undef DO
+#undef CASE
+ }
+#endif
+}
+
void tst_QMutex::tryLock_non_recursive()
{
class Thread : public QThread
diff --git a/tests/auto/corelib/thread/qthread/tst_qthread.cpp b/tests/auto/corelib/thread/qthread/tst_qthread.cpp
index 06b27f79cd..0efbc5d01e 100644
--- a/tests/auto/corelib/thread/qthread/tst_qthread.cpp
+++ b/tests/auto/corelib/thread/qthread/tst_qthread.cpp
@@ -1059,8 +1059,8 @@ void tst_QThread::wait2()
thread.start();
timer.start();
QVERIFY(!thread.wait(Waiting_Thread::WaitTime));
- qint64 elapsed = timer.elapsed(); // On Windows, we sometimes get (WaitTime - 1).
- QVERIFY2(elapsed >= Waiting_Thread::WaitTime - 1, qPrintable(QString::fromLatin1("elapsed: %1").arg(elapsed)));
+ qint64 elapsed = timer.elapsed(); // On Windows, we sometimes get (WaitTime - 9).
+ QVERIFY2(elapsed >= Waiting_Thread::WaitTime - 10, qPrintable(QString::fromLatin1("elapsed: %1").arg(elapsed)));
timer.start();
thread.cond1.wakeOne();
diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
index 8c26f8a91f..e8244a0e5d 100644
--- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
+++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
@@ -326,6 +326,10 @@ void tst_QFontDatabase::condensedFontMatching()
QFont tfcByStyleName("QtBidiTestFont");
tfcByStyleName.setStyleName("Condensed");
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("","No matching of sub-family by stretch on Windows", Continue);
+#endif
+
QCOMPARE(QFontMetrics(tfcByStretch).width(testString()),
QFontMetrics(tfcByStyleName).width(testString()));
diff --git a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp
index b3d1b75a42..9f84f64ee9 100644
--- a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp
+++ b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp
@@ -859,7 +859,7 @@ void tst_QStaticText::textDocumentColor()
class TestPaintEngine: public QPaintEngine
{
public:
- void drawTextItem(const QPointF &p, const QTextItem &textItem) Q_DECL_OVERRIDE
+ void drawTextItem(const QPointF &p, const QTextItem &) Q_DECL_OVERRIDE
{
differentVerticalPositions.insert(qRound(p.y()));
}
diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
index 8cc06a77ba..74bffef4f4 100644
--- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
+++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
@@ -698,7 +698,7 @@ void tst_QLocalSocket::simpleCommandProtocol2()
QObject::connect(localSocketRead, &QLocalSocket::readyRead, [&] {
forever {
- if (localSocketRead->bytesAvailable() < sizeof(qint64))
+ if (localSocketRead->bytesAvailable() < qint64(sizeof(qint64)))
return;
if (blockSize == 0) {
diff --git a/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp b/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp
index fc976fbd0d..cf15e60531 100644
--- a/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp
+++ b/tests/auto/network/socket/qsctpsocket/tst_qsctpsocket.cpp
@@ -112,7 +112,7 @@ void tst_QSctpSocket::constructing()
QVERIFY(!socket.isOpen());
QVERIFY(!socket.isValid());
QCOMPARE(socket.socketType(), QAbstractSocket::SctpSocket);
- QCOMPARE(socket.maxChannelCount(), 0);
+ QCOMPARE(socket.maximumChannelCount(), 0);
QCOMPARE(socket.readChannelCount(), 0);
QCOMPARE(socket.writeChannelCount(), 0);
@@ -202,7 +202,7 @@ void tst_QSctpSocket::setSocketDescriptor()
{
QSctpServer server;
- server.setMaxChannelCount(16);
+ server.setMaximumChannelCount(16);
QVERIFY(server.listen());
SOCKET sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
@@ -218,8 +218,8 @@ void tst_QSctpSocket::setSocketDescriptor()
QVERIFY(socket.waitForConnected(3000));
QVERIFY(server.waitForNewConnection(3000));
- QCOMPARE(socket.readChannelCount(), server.maxChannelCount());
- QVERIFY(socket.writeChannelCount() <= server.maxChannelCount());
+ QCOMPARE(socket.readChannelCount(), server.maximumChannelCount());
+ QVERIFY(socket.writeChannelCount() <= server.maximumChannelCount());
QSctpSocket *acceptedSocket = server.nextPendingDatagramConnection();
QVERIFY(acceptedSocket);
@@ -338,11 +338,11 @@ void tst_QSctpSocket::loop()
QSctpServer server;
- server.setMaxChannelCount(10);
+ server.setMaximumChannelCount(10);
QVERIFY(server.listen());
QSctpSocket peter;
- peter.setMaxChannelCount(10);
+ peter.setMaximumChannelCount(10);
peter.connectToHost(QHostAddress::LocalHost, server.serverPort());
QVERIFY(peter.waitForConnected(3000));
@@ -389,11 +389,11 @@ void tst_QSctpSocket::loopInTCPMode()
QSctpServer server;
- server.setMaxChannelCount(-1);
+ server.setMaximumChannelCount(-1);
QVERIFY(server.listen());
QSctpSocket peter;
- peter.setMaxChannelCount(-1);
+ peter.setMaximumChannelCount(-1);
peter.connectToHost(QHostAddress::LocalHost, server.serverPort());
QVERIFY(peter.waitForConnected(3000));
QVERIFY(server.waitForNewConnection(3000));
diff --git a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
index 5a0baf73b5..4bbd0662e4 100644
--- a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
@@ -929,15 +929,16 @@ void tst_QTcpServer::linkLocal()
//each server should have two connections
foreach (QTcpServer* server, servers) {
- QTcpSocket* remote;
//qDebug() << "checking for connections" << server->serverAddress() << ":" << server->serverPort();
QVERIFY(server->waitForNewConnection(5000));
- QVERIFY(remote = server->nextPendingConnection());
+ QTcpSocket* remote = server->nextPendingConnection();
+ QVERIFY(remote != nullptr);
remote->close();
delete remote;
if (!server->hasPendingConnections())
QVERIFY(server->waitForNewConnection(5000));
- QVERIFY(remote = server->nextPendingConnection());
+ remote = server->nextPendingConnection();
+ QVERIFY(remote != nullptr);
remote->close();
delete remote;
QVERIFY(!server->hasPendingConnections());
diff --git a/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp b/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp
index 407d244f15..ed61db1a13 100644
--- a/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp
+++ b/tests/auto/network/socket/qtcpsocket/stressTest/Test.cpp
@@ -47,7 +47,8 @@ void My4Socket::read(void)
{
QDataStream in(this);
- quint32 num, reply;
+ quint32 num = 0;
+ quint32 reply = 0;
while (bytesAvailable()) {
in >> num;
diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
index fb6b0c6e32..fe1057bdde 100644
--- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
@@ -2251,7 +2251,8 @@ void tst_QTcpSocket::abortiveClose()
enterLoop(10);
QVERIFY(server.hasPendingConnections());
- QVERIFY(tmpSocket = server.nextPendingConnection());
+ tmpSocket = server.nextPendingConnection();
+ QVERIFY(tmpSocket != nullptr);
qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
QSignalSpy readyReadSpy(clientSocket, SIGNAL(readyRead()));
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index 2f5936f1ad..11baee7335 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -2897,7 +2897,10 @@ void tst_QAccessibility::listTest()
QAccessibleInterface *cellMunich3 = table2->cellAt(2,0);
QCOMPARE(cell4, cellMunich3);
QCOMPARE(axidMunich, QAccessible::uniqueId(cellMunich3));
-
+ delete listView->takeItem(2);
+ // list: Oslo, Helsinki
+ // verify that it doesn't return an invalid item from the cache
+ QVERIFY(table2->cellAt(2,0) == 0);
delete listView;
}
diff --git a/tests/auto/sql/kernel/qsql/tst_qsql.cpp b/tests/auto/sql/kernel/qsql/tst_qsql.cpp
index 282fed2584..2ce43b85a7 100644
--- a/tests/auto/sql/kernel/qsql/tst_qsql.cpp
+++ b/tests/auto/sql/kernel/qsql/tst_qsql.cpp
@@ -33,7 +33,6 @@
#include <qsqlerror.h>
#include <qsqlquery.h>
#include <qsqlrecord.h>
-#include <qsql.h>
#include <qsqlresult.h>
#include <qsqldriver.h>
#include <qdebug.h>
diff --git a/tests/auto/tools/rcc/data/images/images.expected b/tests/auto/tools/rcc/data/images/images.expected
index 1f0157d51c..eb5d9222c8 100644
--- a/tests/auto/tools/rcc/data/images/images.expected
+++ b/tests/auto/tools/rcc/data/images/images.expected
@@ -79,16 +79,22 @@ static const unsigned char qt_resource_name[] = {
static const unsigned char qt_resource_struct[] = {
// :
0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,
+0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
// :/images
0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2,
+0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
// :/images/subdir
0x0,0x0,0x0,0x12,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x5,
+0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
// :/images/square.png
0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xa9,
+TIMESTAMP:images/square.png
// :/images/circle.png
0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,
+TIMESTAMP:images/circle.png
// :/images/subdir/triangle.png
0x0,0x0,0x0,0x58,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0xb,
+TIMESTAMP:images/subdir/triangle.png
};
@@ -120,7 +126,7 @@ int QT_RCC_MANGLE_NAMESPACE(qInitResources)();
int QT_RCC_MANGLE_NAMESPACE(qInitResources)()
{
QT_RCC_PREPEND_NAMESPACE(qRegisterResourceData)
- (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
+ (0x02, qt_resource_struct, qt_resource_name, qt_resource_data);
return 1;
}
@@ -128,7 +134,7 @@ int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)();
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)()
{
QT_RCC_PREPEND_NAMESPACE(qUnregisterResourceData)
- (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
+ (0x02, qt_resource_struct, qt_resource_name, qt_resource_data);
return 1;
}
diff --git a/tests/auto/tools/rcc/tst_rcc.cpp b/tests/auto/tools/rcc/tst_rcc.cpp
index 8d95d06e30..54a2854ede 100644
--- a/tests/auto/tools/rcc/tst_rcc.cpp
+++ b/tests/auto/tools/rcc/tst_rcc.cpp
@@ -92,12 +92,23 @@ static QString doCompare(const QStringList &actual, const QStringList &expected)
QByteArray ba;
for (int i = 0, n = expected.size(); i != n; ++i) {
- if (expected.at(i).startsWith("IGNORE:"))
+ QString expectedLine = expected.at(i);
+ if (expectedLine.startsWith("IGNORE:"))
continue;
- if (expected.at(i) != actual.at(i)) {
+ if (expectedLine.startsWith("TIMESTAMP:")) {
+ const QString relativePath = expectedLine.mid(strlen("TIMESTAMP:"));
+ const quint64 timeStamp = QFileInfo(relativePath).lastModified().toMSecsSinceEpoch();
+ expectedLine.clear();
+ for (int shift = 56; shift >= 0; shift -= 8) {
+ expectedLine.append(QLatin1String("0x"));
+ expectedLine.append(QString::number(quint8(timeStamp >> shift), 16));
+ expectedLine.append(QLatin1Char(','));
+ }
+ }
+ if (expectedLine != actual.at(i)) {
qDebug() << "LINES" << i << "DIFFER";
ba.append(
- "\n<<<<<< actual\n" + actual.at(i) + "\n======\n" + expected.at(i)
+ "\n<<<<<< actual\n" + actual.at(i) + "\n======\n" + expectedLine
+ "\n>>>>>> expected\n"
);
}
diff --git a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
index a16bd1a787..1ff7a0c97b 100644
--- a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
@@ -340,8 +340,7 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior()
// test based on task233037_selectingDirectory
struct TestContext {
- TestContext()
- : current(QDir::current()) {}
+ explicit TestContext(const QString &path) : current(path) {}
~TestContext() {
file.remove();
current.rmdir(test.dirName());
@@ -349,7 +348,9 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior()
QDir current;
QDir test;
QFile file;
- } ctx;
+ };
+
+ TestContext ctx(tempDir.path());
// setup testbed
QVERIFY(ctx.current.mkdir("task143519_deleteAndRenameActionBehavior_test")); // ensure at least one item
@@ -363,6 +364,7 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior()
QFileDialog fd;
fd.setViewMode(QFileDialog::List);
fd.setDirectory(ctx.test.absolutePath());
+ fd.selectFile(ctx.file.fileName());
fd.show();
QTest::qWaitForWindowActive(&fd);
@@ -377,7 +379,7 @@ void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior()
// defaults
QVERIFY(openContextMenu(fd));
- QCOMPARE(fd.selectedFiles().size(), 1);
+ QCOMPARE(fd.selectedFiles(), QStringList(ctx.file.fileName()));
QCOMPARE(rm->isEnabled(), !fd.isReadOnly());
QCOMPARE(mv->isEnabled(), !fd.isReadOnly());
diff --git a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
index e8bd86bee5..f8ab64e4d6 100644
--- a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
+++ b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
@@ -1672,16 +1672,16 @@ void tst_QListWidget::mimeData()
QMimeData *data;
- QVERIFY(data = list.mimeData(tableWidgetItemList));
+ QVERIFY((data = list.mimeData(tableWidgetItemList)));
delete data;
- QVERIFY(data = list.model()->mimeData(modelIndexList));
+ QVERIFY((data = list.model()->mimeData(modelIndexList)));
delete data;
- QVERIFY(data = list.model()->mimeData(modelIndexList));
+ QVERIFY((data = list.model()->mimeData(modelIndexList)));
delete data;
- QVERIFY(data = list.mimeData(tableWidgetItemList));
+ QVERIFY((data = list.mimeData(tableWidgetItemList)));
delete data;
// check the saved data is actually the same
diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
index 8f871b03f6..a86ffbc30d 100644
--- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
+++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
@@ -1520,16 +1520,16 @@ void tst_QTableWidget::mimeData()
QMimeData *data;
- QVERIFY(data = table.mimeData(tableWidgetItemList));
+ QVERIFY((data = table.mimeData(tableWidgetItemList)));
delete data;
- QVERIFY(data = table.model()->mimeData(modelIndexList));
+ QVERIFY((data = table.model()->mimeData(modelIndexList)));
delete data;
- QVERIFY(data = table.model()->mimeData(modelIndexList));
+ QVERIFY((data = table.model()->mimeData(modelIndexList)));
delete data;
- QVERIFY(data = table.mimeData(tableWidgetItemList));
+ QVERIFY((data = table.mimeData(tableWidgetItemList)));
delete data;
// check the saved data is actually the same
diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
index 01e3d7bac0..d8239b5a28 100644
--- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
+++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
@@ -43,6 +43,10 @@
#include <qformlayout.h>
+// ItemRole has enumerators for numerical values 0..2, thus the only
+// valid numerical values for storing into an ItemRole variable are 0..3:
+Q_CONSTEXPR QFormLayout::ItemRole invalidRole = QFormLayout::ItemRole(3);
+
static inline void setFrameless(QWidget *w)
{
Qt::WindowFlags flags = w->windowFlags();
@@ -567,7 +571,7 @@ void tst_QFormLayout::insertRow_QWidget_QWidget()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout->getWidgetPosition(lbl1, &row, &role);
QCOMPARE(row, 0);
QCOMPARE(int(role), int(QFormLayout::LabelRole));
@@ -575,7 +579,7 @@ void tst_QFormLayout::insertRow_QWidget_QWidget()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout->getWidgetPosition(fld1, &row, &role);
QCOMPARE(row, 0);
QCOMPARE(int(role), int(QFormLayout::FieldRole));
@@ -636,7 +640,7 @@ void tst_QFormLayout::insertRow_QWidget_QLayout()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout->getWidgetPosition(lbl1, &row, &role);
QCOMPARE(row, 0);
QCOMPARE(int(role), int(QFormLayout::LabelRole));
@@ -644,7 +648,7 @@ void tst_QFormLayout::insertRow_QWidget_QLayout()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout->getLayoutPosition(fld1, &row, &role);
QCOMPARE(row, 0);
QCOMPARE(int(role), int(QFormLayout::FieldRole));
@@ -992,7 +996,7 @@ void tst_QFormLayout::setWidget()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getWidgetPosition(&w1, &row, &role);
QCOMPARE(row, 5);
QCOMPARE(int(role), int(QFormLayout::LabelRole));
@@ -1000,7 +1004,7 @@ void tst_QFormLayout::setWidget()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getWidgetPosition(&w2, &row, &role);
QCOMPARE(row, 3);
QCOMPARE(int(role), int(QFormLayout::FieldRole));
@@ -1008,7 +1012,7 @@ void tst_QFormLayout::setWidget()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getWidgetPosition(&w3, &row, &role);
QCOMPARE(row, 3);
QCOMPARE(int(role), int(QFormLayout::LabelRole));
@@ -1016,18 +1020,20 @@ void tst_QFormLayout::setWidget()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getWidgetPosition(&w4, &row, &role);
+ // not found
QCOMPARE(row, -1);
- QCOMPARE(int(role), -123);
+ QCOMPARE(int(role), int(invalidRole));
}
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getWidgetPosition(0, &row, &role);
+ // not found
QCOMPARE(row, -1);
- QCOMPARE(int(role), -123);
+ QCOMPARE(int(role), int(invalidRole));
}
}
@@ -1060,7 +1066,7 @@ void tst_QFormLayout::setLayout()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getLayoutPosition(&l1, &row, &role);
QCOMPARE(row, 5);
QCOMPARE(int(role), int(QFormLayout::LabelRole));
@@ -1068,7 +1074,7 @@ void tst_QFormLayout::setLayout()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getLayoutPosition(&l2, &row, &role);
QCOMPARE(row, 3);
QCOMPARE(int(role), int(QFormLayout::FieldRole));
@@ -1076,7 +1082,7 @@ void tst_QFormLayout::setLayout()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getLayoutPosition(&l3, &row, &role);
QCOMPARE(row, 3);
QCOMPARE(int(role), int(QFormLayout::LabelRole));
@@ -1084,18 +1090,18 @@ void tst_QFormLayout::setLayout()
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getLayoutPosition(&l4, &row, &role);
QCOMPARE(row, -1);
- QCOMPARE(int(role), -123);
+ QCOMPARE(int(role), int(invalidRole));
}
{
int row = -1;
- QFormLayout::ItemRole role = QFormLayout::ItemRole(-123);
+ QFormLayout::ItemRole role = invalidRole;
layout.getLayoutPosition(0, &row, &role);
QCOMPARE(row, -1);
- QCOMPARE(int(role), -123);
+ QCOMPARE(int(role), int(invalidRole));
}
}
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
index 09ab20f7ca..9ab755c5f1 100644
--- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
+++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
@@ -3710,7 +3710,7 @@ void tst_QDateTimeEdit::dateEditCorrectSectionSize()
QTest::keyClick(&edit, keyPair.first, keyPair.second);
QDateTimeEditPrivate* edit_d_ptr(static_cast<QDateTimeEditPrivate*>(qt_widget_private(&edit)));
- QCOMPARE(edit_d_ptr->text, expectedDisplayString);
+ QCOMPARE(edit_d_ptr->QDateTimeParser::displayText(), expectedDisplayString);
}
#endif
diff --git a/tests/manual/qstorageinfo/printvolumes.cpp b/tests/manual/qstorageinfo/printvolumes.cpp
index 1b1660b433..6089d5120a 100644
--- a/tests/manual/qstorageinfo/printvolumes.cpp
+++ b/tests/manual/qstorageinfo/printvolumes.cpp
@@ -42,17 +42,17 @@ void printVolumes(const QList<QStorageInfo> &volumes, int (*printer)(const char
// 214958080 39088272 4096 /
// /dev/disk1s2 (hfs) RW 488050672 419909696 4096 Macintosh HD2 /Volumes/Macintosh HD2
- printf("Filesystem (Type) Size Available BSize Label Mounted on\n");
+ printer("Filesystem (Type) Size Available BSize Label Mounted on\n");
foreach (const QStorageInfo &info, volumes) {
QByteArray fsAndType = info.device();
if (info.fileSystemType() != fsAndType)
fsAndType += " (" + info.fileSystemType() + ')';
- printf("%-19s R%c ", fsAndType.constData(), info.isReadOnly() ? 'O' : 'W');
+ printer("%-19s R%c ", fsAndType.constData(), info.isReadOnly() ? 'O' : 'W');
if (fsAndType.size() > 19)
- printf("\n%23s", "");
+ printer("\n%23s", "");
- printf("%10llu %10llu %5u ", info.bytesTotal() / 1024, info.bytesFree() / 1024, info.blockSize());
- printf("%-16s %s\n", qPrintable(info.name()), qPrintable(info.rootPath()));
+ printer("%10llu %10llu %5u ", info.bytesTotal() / 1024, info.bytesFree() / 1024, info.blockSize());
+ printer("%-16s %s\n", qPrintable(info.name()), qPrintable(info.rootPath()));
}
}
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 8716fa88f7..841aa66b8f 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -107,12 +107,9 @@ Configure::Configure(int& argc, char** argv)
dictionary[ "QT_INSTALL_PREFIX" ] = installPath;
- dictionary[ "QMAKESPEC" ] = getenv("QMAKESPEC");
if (dictionary[ "QMAKESPEC" ].size() == 0) {
dictionary[ "QMAKESPEC" ] = Environment::detectQMakeSpec();
dictionary[ "QMAKESPEC_FROM" ] = "detected";
- } else {
- dictionary[ "QMAKESPEC_FROM" ] = "env";
}
dictionary[ "SYNCQT" ] = "auto";
@@ -120,34 +117,6 @@ Configure::Configure(int& argc, char** argv)
//Only used when cross compiling.
dictionary[ "QT_INSTALL_SETTINGS" ] = "/etc/xdg";
- QString version;
- QFile qmake_conf(sourcePath + "/.qmake.conf");
- if (qmake_conf.open(QFile::ReadOnly)) {
- while (!qmake_conf.atEnd()) {
- static const char beginning[] = "MODULE_VERSION = ";
- QByteArray line = qmake_conf.readLine();
- if (!line.startsWith(beginning))
- continue;
-
- version = qMove(line).mid(int(strlen(beginning))).trimmed();
- break;
- }
- qmake_conf.close();
- }
-
- if (version.isEmpty())
- version = QString("%1.%2.%3").arg(QT_VERSION>>16).arg(((QT_VERSION>>8)&0xff)).arg(QT_VERSION&0xff);
-
- dictionary[ "VERSION" ] = version;
- {
- QRegExp version_re("([0-9]*)\\.([0-9]*)\\.([0-9]*)(|-.*)");
- if (version_re.exactMatch(version)) {
- dictionary[ "VERSION_MAJOR" ] = version_re.cap(1);
- dictionary[ "VERSION_MINOR" ] = version_re.cap(2);
- dictionary[ "VERSION_PATCH" ] = version_re.cap(3);
- }
- }
-
dictionary[ "REDO" ] = "no";
dictionary[ "BUILDTYPE" ] = "none";
@@ -176,12 +145,6 @@ QString Configure::formatPath(const QString &path)
return ret;
}
-// #### somehow I get a compiler error about vc++ reaching the nesting limit without
-// undefining the ansi for scoping.
-#ifdef for
-#undef for
-#endif
-
void Configure::parseCmdLine()
{
sourcePathMangled = sourcePath;
@@ -481,19 +444,17 @@ void Configure::parseCmdLine()
dictionary[ "DONE" ] = "error";
if (dictionary ["QMAKESPEC_FROM"] == "commandline") {
cout << "Invalid option \"" << dictionary["QMAKESPEC"] << "\" for -platform." << endl;
- } else if (dictionary ["QMAKESPEC_FROM"] == "env") {
- cout << "QMAKESPEC environment variable is set to \"" << dictionary["QMAKESPEC"]
- << "\" which is not a supported platform" << endl;
} else { // was autodetected from environment
cout << "Unable to detect the platform from environment. Use -platform command line" << endl
- << "argument or set the QMAKESPEC environment variable and run configure again." << endl;
+ << "argument and run configure again." << endl;
}
cout << "See the README file for a list of supported operating systems and compilers." << endl;
} else {
if (dictionary[ "QMAKESPEC" ].endsWith("-icc") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2012") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2013") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2015")) {
+ dictionary[ "QMAKESPEC" ].endsWith("-msvc2015") ||
+ dictionary[ "QMAKESPEC" ].endsWith("-msvc2017")) {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "nmake";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32";
} else if (dictionary[ "QMAKESPEC" ].startsWith(QLatin1String("win32-g++"))) {
@@ -605,16 +566,6 @@ void Configure::generateQDevicePri()
dictionary[ "DONE" ] = "error";
}
-QString Configure::formatConfigPath(const char *var)
-{
- QString val = dictionary[var];
- if (QFileInfo(val).isRelative()) {
- QString pfx = dictionary["QT_INSTALL_PREFIX"];
- val = (val == ".") ? pfx : QDir(pfx).absoluteFilePath(val);
- }
- return QDir::toNativeSeparators(val);
-}
-
void Configure::generateHeaders()
{
if (dictionary["SYNCQT"] == "auto")
@@ -626,7 +577,7 @@ void Configure::generateHeaders()
QStringList args;
args << "perl" << "-w";
args += sourcePath + "/bin/syncqt.pl";
- args << "-version" << dictionary["VERSION"] << "-minimal" << "-module" << "QtCore";
+ args << "-version" << QT_VERSION_STR << "-minimal" << "-module" << "QtCore";
args += sourcePath;
int retc = Environment::execute(args, QStringList(), QStringList());
if (retc) {
@@ -882,61 +833,21 @@ void Configure::buildQmake()
<< "INC_PATH = " << QDir::toNativeSeparators(
(QFile::exists(sourcePath + "/.git") ? ".." : sourcePath)
+ "/include") << endl;
- stream << "QT_VERSION = " << dictionary["VERSION"] << endl
- << "QT_MAJOR_VERSION = " << dictionary["VERSION_MAJOR"] << endl
- << "QT_MINOR_VERSION = " << dictionary["VERSION_MINOR"] << endl
- << "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl;
+ stream << "QT_VERSION = " QT_VERSION_STR << endl
+ << "QT_MAJOR_VERSION = " QT_STRINGIFY(QT_VERSION_MAJOR) << endl
+ << "QT_MINOR_VERSION = " QT_STRINGIFY(QT_VERSION_MINOR) << endl
+ << "QT_PATCH_VERSION = " QT_STRINGIFY(QT_VERSION_PATCH) << endl;
if (dictionary[ "QMAKESPEC" ].startsWith("win32-g++")) {
stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\" << dictionary[ "QMAKESPEC" ] << endl
- << "EXTRA_CFLAGS = -DUNICODE -ffunction-sections" << endl
- << "EXTRA_CXXFLAGS = -std=c++11 -DUNICODE -ffunction-sections" << endl
- << "EXTRA_LFLAGS = -Wl,--gc-sections" << endl
- << "QTOBJS = qfilesystemengine_win.o \\" << endl
- << " qfilesystemiterator_win.o \\" << endl
- << " qfsfileengine_win.o \\" << endl
- << " qlocale_win.o \\" << endl
- << " qsettings_win.o \\" << endl
- << " qsystemlibrary.o \\" << endl
- << " registry.o" << endl
- << "QTSRCS=\"$(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp\" \\" << endl
- << " \"$(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp\" \\" << endl
- << " \"$(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp\" \\" << endl
- << " \"$(SOURCE_PATH)/src/corelib/io/qsettings_win.cpp\" \\" << endl
- << " \"$(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp\" \\" << endl\
- << " \"$(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp\" \\" << endl
- << " \"$(SOURCE_PATH)/tools/shared/windows/registry.cpp\"" << endl
- << "EXEEXT=.exe" << endl
- << "LFLAGS=-static -s -lole32 -luuid -ladvapi32 -lkernel32" << endl;
- /*
- ** SHELL is the full path of sh.exe, unless
- ** 1) it is found in the current directory
- ** 2) it is not found at all
- ** 3) it is overridden on the command line with an existing file
- ** ... otherwise it is always sh.exe. Specifically, SHELL from the
- ** environment has no effect.
- **
- ** This check will fail if SHELL is explicitly set to a not
- ** sh-compatible shell. This is not a problem, because configure.bat
- ** will not do that.
- */
- stream << "ifeq ($(SHELL), sh.exe)" << endl
- << " ifeq ($(wildcard $(CURDIR)/sh.exe), )" << endl
- << " SH = 0" << endl
- << " else" << endl
- << " SH = 1" << endl
- << " endif" << endl
- << "else" << endl
- << " SH = 1" << endl
- << "endif" << endl
- << "\n"
- << "ifeq ($(SH), 1)" << endl
- << " RM_F = rm -f" << endl
- << " RM_RF = rm -rf" << endl
- << "else" << endl
- << " RM_F = del /f" << endl
- << " RM_RF = rmdir /s /q" << endl
- << "endif" << endl;
- stream << "\n\n";
+ << "CONFIG_CXXFLAGS = -std=c++11 -ffunction-sections" << endl
+ << "CONFIG_LFLAGS = -Wl,--gc-sections" << endl;
+
+ QFile in(sourcePath + "/qmake/Makefile.unix.win32");
+ if (in.open(QFile::ReadOnly | QFile::Text))
+ stream << in.readAll();
+ QFile in2(sourcePath + "/qmake/Makefile.unix.mingw");
+ if (in2.open(QFile::ReadOnly | QFile::Text))
+ stream << in2.readAll();
} else {
stream << "QMAKESPEC = " << dictionary["QMAKESPEC"] << endl;
}
@@ -1032,11 +943,6 @@ void Configure::configure()
bool Configure::showLicense(QString orgLicenseFile)
{
- if (dictionary["LICENSE_CONFIRMED"] == "yes") {
- cout << "You have already accepted the terms of the license." << endl << endl;
- return true;
- }
-
bool showGpl2 = true;
QString licenseFile = orgLicenseFile;
QString theLicense;
@@ -1147,23 +1053,35 @@ void Configure::readLicense()
}
}
if (hasOpenSource && openSource) {
- cout << endl << "This is the " << dictionary["PLATFORM NAME"] << " Open Source Edition." << endl;
+ cout << endl << "This is the " << dictionary["PLATFORM NAME"] << " Open Source Edition." << endl << endl;
dictionary["LICENSEE"] = "Open Source";
dictionary["EDITION"] = "OpenSource";
- cout << endl;
- if (!showLicense(dictionary["LICENSE FILE"])) {
- cout << "Configuration aborted since license was not accepted";
- dictionary["DONE"] = "error";
- return;
- }
} else if (openSource) {
cout << endl << "Cannot find the GPL license files! Please download the Open Source version of the library." << endl;
dictionary["DONE"] = "error";
return;
+ } else {
+ QString tpLicense = sourcePath + "/LICENSE.PREVIEW.COMMERCIAL";
+ if (QFile::exists(tpLicense)) {
+ cout << endl << "This is the Qt Preview Edition." << endl << endl;
+
+ dictionary["EDITION"] = "Preview";
+ dictionary["LICENSE FILE"] = tpLicense;
+ } else {
+ Tools::checkLicense(dictionary, sourcePath, buildPath);
+ }
}
- else {
- Tools::checkLicense(dictionary, sourcePath, buildPath);
+
+ if (dictionary["LICENSE_CONFIRMED"] != "yes") {
+ if (!showLicense(dictionary["LICENSE FILE"])) {
+ cout << "Configuration aborted since license was not accepted" << endl;
+ dictionary["DONE"] = "error";
+ return;
+ }
+ } else if (dictionary["LICHECK"].isEmpty()) { // licheck executable shows license
+ cout << "You have already accepted the terms of the license." << endl << endl;
}
+
if (dictionary["BUILDTYPE"] == "none") {
if (openSource)
configCmdLine << "-opensource";
diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h
index b1c6ea9181..c8d4d3df53 100644
--- a/tools/configure/configureapp.h
+++ b/tools/configure/configureapp.h
@@ -88,8 +88,6 @@ private:
void saveCmdLine();
void applySpecSpecifics();
-
- QString formatConfigPath(const char *var);
};
class FileWriter : public QTextStream
diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp
index 6cc350acc5..e585b16ea7 100644
--- a/tools/configure/environment.cpp
+++ b/tools/configure/environment.cpp
@@ -62,13 +62,13 @@ struct CompilerInfo{
const char *executable;
} compiler_info[] = {
// The compilers here are sorted in a reversed-preferred order
- {CC_BORLAND, "Borland C++", 0, "bcc32.exe"},
{CC_MINGW, "MinGW (Minimalist GNU for Windows)", 0, "g++.exe"},
{CC_INTEL, "Intel(R) C++ Compiler for 32-bit applications", 0, "icl.exe"}, // xilink.exe, xilink5.exe, xilink6.exe, xilib.exe
{CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe
{CC_MSVC2013, "Microsoft (R) Visual Studio 2013 C/C++ Compiler (12.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0", "cl.exe"}, // link.exe, lib.exe
// Microsoft skipped version 13
{CC_MSVC2015, "Microsoft (R) Visual Studio 2015 C/C++ Compiler (14.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\14.0", "cl.exe"}, // link.exe, lib.exe
+ {CC_MSVC2017, "Microsoft (R) Visual Studio 2017 C/C++ Compiler (15.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\15.0", "cl.exe"}, // link.exe, lib.exe
{CC_UNKNOWN, "Unknown", 0, 0},
};
@@ -94,6 +94,9 @@ QString Environment::detectQMakeSpec()
{
QString spec;
switch (detectCompiler()) {
+ case CC_MSVC2017:
+ spec = "win32-msvc2017";
+ break;
case CC_MSVC2015:
spec = "win32-msvc2015";
break;
@@ -109,9 +112,6 @@ QString Environment::detectQMakeSpec()
case CC_MINGW:
spec = "win32-g++";
break;
- case CC_BORLAND:
- spec = "win32-borland";
- break;
default:
break;
}
diff --git a/tools/configure/environment.h b/tools/configure/environment.h
index d14961b5ac..aa8e7fd8bc 100644
--- a/tools/configure/environment.h
+++ b/tools/configure/environment.h
@@ -33,7 +33,6 @@ QT_BEGIN_NAMESPACE
enum Compiler {
CC_UNKNOWN = 0,
- CC_BORLAND = 0x01,
CC_MINGW = 0x02,
CC_INTEL = 0x03,
CC_MSVC2005 = 0x80,
@@ -41,7 +40,8 @@ enum Compiler {
CC_MSVC2010 = 0xA0,
CC_MSVC2012 = 0xB0,
CC_MSVC2013 = 0xC0,
- CC_MSVC2015 = 0xD0
+ CC_MSVC2015 = 0xD0,
+ CC_MSVC2017 = 0xE0
};
struct CompilerInfo;
diff --git a/tools/configure/tools.cpp b/tools/configure/tools.cpp
index fb80e2136b..5ba7125975 100644
--- a/tools/configure/tools.cpp
+++ b/tools/configure/tools.cpp
@@ -42,13 +42,6 @@ using namespace std;
void Tools::checkLicense(QMap<QString,QString> &dictionary,
const QString &sourcePath, const QString &buildPath)
{
- QString tpLicense = sourcePath + "/LICENSE.PREVIEW.COMMERCIAL";
- if (QFile::exists(tpLicense)) {
- dictionary["EDITION"] = "Preview";
- dictionary["LICENSE FILE"] = tpLicense;
- return;
- }
-
dictionary["LICHECK"] = "licheck.exe";
const QString licenseChecker =
@@ -75,6 +68,7 @@ void Tools::checkLicense(QMap<QString,QString> &dictionary,
} else {
foreach (const QString &var, licheckOutput.split('\n'))
dictionary[var.section('=', 0, 0).toUpper()] = var.section('=', 1, 1);
+ dictionary["LICENSE_CONFIRMED"] = "yes";
}
} else {
cout << endl << "Error: Could not find licheck.exe" << endl