Merge remote-tracking branch 'origin/5.12.0' into 5.12

Change-Id: Ic1dd39044e19f50e1068d4ac70dacaad6440e570
This commit is contained in:
Liang Qi 2018-11-16 08:10:15 +01:00
commit 37d3bc9ad7
62 changed files with 1163 additions and 220 deletions

468
dist/changes-5.12.0 vendored Normal file
View File

@ -0,0 +1,468 @@
Qt 5.12 introduces many new features and improvements as well as bugfixes
over the 5.11.x series. For more details, refer to the online documentation
included in this distribution. The documentation is also available online:
https://doc.qt.io/qt-5/index.html
The Qt version 5.12 series is binary compatible with the 5.11.x series.
Applications compiled for 5.11 will continue to run with 5.12.
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.
****************************************************************************
* Important Behavior Changes *
****************************************************************************
- QtCore:
* [QTBUG-34460] qFatal() no longer uses std::abort() on Windows, as
there are circumstances where global destructors are still run after
that call, leading to possible deadlocks.
- QRegularExpression:
* [QTBUG-66781] Regular expressions are now automatically optimized
(including JIT compiling) on their first usage. The pattern options
OptimizeOnFirstUsageOption and DontAutomaticallyOptimizeOption no
longer have any effect, and will get removed in a future version of
Qt. QRegularExpression::optimize() can be still used to compile and
optimize the regular expression in advance (before any match), if
needed.
- QDataStream:
* [QTBUG-59978][QTBUG-67995] version bumped up to 18 to account for
changes in the serialization of QGradient.
- Dialogs:
* QFileSystemModel now uses QRegularExpression internally for wildcard
matching. Note that QRegularExpression might not give the exact same
result as QRegExp as its implementation follows strictly the glob
patterns definition for wildcard expressions.
****************************************************************************
* Third-Party Code *
****************************************************************************
- Sources of xcb-xinput 1.13 were bundled and are available via -qt-xcb.
- The minimal required version of libxcb is now 1.9. Bundled xcb sources
were updated to libxcb 1.9.1 built with xcb-proto 1.8.
- [QTBUG-67654] Updated CLDR to version 33.1
- [QTBUG-66561][QTBUG-70008] double-conversion got updated to upstream
version 3.1.1.
- libjpeg-turbo was updated to version 2.0.0
- libpng was updated to version 1.6.35
- Sqlite was updated to version 3.25.2
- [QTBUG-71109] updated bundled libxkbcommon 0.4.1 -> 0.8.2 (up to
31f1f355700870c6615399fbfa7934934b3a9a57)
- PCRE2 was updated to version 10.32.
- Added documentation for the SLJIT part of pcre2, which is available
under the BSD-2-Clause license.
****************************************************************************
* Tools *
****************************************************************************
- rcc:
* Added a --list-mapping option which shows a mapping of resource paths
to file system paths.
- qmake
* New CONFIG options lrelease and embed_translations were added.
CONFIG+=lrelease does run lrelease on translation files listed in
TRANSLATIONS and EXTRA_TRANSLATIONS. CONFIG+=embed_translations does
include the generated .qm files as resources under :/i18n/.
- uic
* [QTBUG-65251][QTBUG-51602] The -no-stringliteral option is now
deprecated and UIC will not generate QStringLiteral anymore.
****************************************************************************
* QtCore *
****************************************************************************
- Added support for CBOR:
* Added QCborStreamReader and QCborStreamWriter, classes for low-level
reading and writing of CBOR streams.
* Added QCborValue, QCborArray and QCborMap, classes that permit DOM-like
access to CBOR data. The API is similar to QJsonValue, QJsonArray and
QJsonObject, respectively.
- QByteArray:
* Added QByteArray::isUpper() and QByteArray::isLower() to check if a
byte array contains only uppercase or only lowercase Latin1 letters.
* Added compare(), which takes Qt::CaseSensitivity as one of the
parameters. This function is more efficient than using toLower() or
toUpper() and then comparing.
* [QTBUG-66187] QByteArray::toInt(), QByteArray::toDouble() and the
other number conversion functions now ignore leading and trailing
whitespaces, as their QString counterparts already did. For
consistency reasons, the same behavior was added to
qEnvironmentVariableIntValue() also.
- QCommandLineParser:
* [QTBUG-70174] Fixed a bug that caused the help output to show two
options or more in the same line if the options didn't have a
description.
- QCryptographicHash:
* Add a static method, hashLength, which returns the length of the
output of a hash function in bytes.
- QDir:
* QDir now uses QRegularExpression internally for wildcard matching.
Note that QRegularExpression might not give the exact same result as
QRegExp as its implementation follows strictly the glob patterns
definition for wildcard expressions. Nevertheless, the tests for QDir
return the same results as before.
* QDir::tempPath() now reports the canonical path of the temporary
directory, with any symlinks resolved.
* On Windows, QDir::drives() no longer returns drives whose media were
ejected.
- QExplicitlySharedDataPointer:
* [QTBUG-66635][QTBUG-66946] Added operator== for nullptr.
- QFile:
* [QTBUG-13470] When opening a file, if Truncate is asked for, or
implied by other flags, it shall be attempted, regardless of what
other options are selected. We previously did this on Windows; now we
do so also on Unix (even when appending).
- QFileSystemWatcher:
* [QTBUG-69320] Fixed a bug that caused addPaths() to crash on Windows
if adding a path to be watched on removable storage, if that
addPaths() was called on a thread not created by QThread and no
QEventLoop has been created yet.
- QFlags's operator| for enum types in the Qt namespace are now declared
in the Qt namespace itself.
- QLocale:
* [QTBUG-57802] Added support for World and Europe as (numeric)
"country" codes ("territory" in CLDR terms), thereby enabling support
for Yiddish and Esperanto, among other locales using such codes.
- Logging:
* [QTBUG-69548] Qt will now accept qtlogging.ini files written by
QSettings.
- QMetaType can now register constructor for a set of dynamic types.
- QRegularExpression:
* Implemented support for wildcard patterns through a static method.
* QRegularExpression now provides anchoredPattern() which is a helper
function to build regular expressions used for exact matching.
* Implemented support for wildcard patterns. Warning: QRegularExpression
might not give the exact same result as QRegExp as its implementation
follows strictly the glob patterns definition for the wildcard
expressions.
- [QTBUG-62894] Introduced QScopeGuard.
- QSharedDataPointer:
* [QTBUG-66635][QTBUG-66946] Added operator== for nullptr.
- QSortFilterProxyModel:
* [QTBUG-46810] QSortFilterProxyModel now supports QRegularExpression.
* Setters of both the filterRegExp and filterRegularExpression
properties are now slots and can be used with the old as well as the
new syntax.
- QString:
* Added the functions QString::isUpper() and QString::isLower() to check
if a string contains only uppercase or only lowercase letters.
- QTextCodec:
* [QTBUG-56203] QTextCodec automatically deregisters on destruction now.
- QTimer:
* [QTBUG-69800] Fixed singleShot() methods that lacked proper "const"
qualification to QObject context receivers.
* Added QTimer::connectTo(), a shorthand way of connecting to the
timeout() signal.
- QTranslator:
* [QTBUG-31031] It is now possible to load qm files without any
translations. This is particularly useful for the language the
untranslated strings are written in; logic to load translations can
now handle the source language like all other languages.
- QUndoStack:
* [QTBUG-40040] Exposed canUndo, canRedo, undoText, redoText and clean as
Q_PROPERTYs.
- QUrl:
* Fixed a bug that caused QUrl::matches to incorrectly compare two URLs
with different hostnames or different usernames as equal, if certain
QUrl::RemoveXxx options were passed.
- other:
* Added an overload of q{To,From}{Big,Little}Endian that operates on a
memory region.
* Added the QT_TR_N_NOOP(), QT_TRANSLATE_N_NOOP(), and
QT_TRANSLATE_N_NOOP3() macros for numeral dependent delayed
translation.
****************************************************************************
* QtGui *
****************************************************************************
- QBitmap:
* Added overloaded QBitmap::fromImage that takes QImage rvalue.
- QDocumentWriter:
* [QTBUG-63581] QDocumentWriter now supports table borders, table
alignment, table width, column widths, line height and image
resolution when exporting QTextDocuments to ODF files.
- QGradient:
* [QTBUG-59978][QTBUG-67995] Added ObjectMode coordinate mode.
- QGuiApplication:
* [QTBUG-26413] Fixed queryKeyboardModifiers() on macOS to actually return
the current modifier key state.
- QImage:
* [QTBUG-45858] QImage now supports 64bit image formats with 16 bits per
color channel, compatible with 16bpc PNG or RGBA16 OpenGL formats.
- QIntValidator:
* [QTBUG-59650] Input value with over the highest acceptable value, but
with no more digits than the maximum value, is now considered
intermediate.
- QOpenGLShader:
* [QTBUG-66074] QOpenGLShader has been fixed to expose geometry and
tessellation evaluation/control shaders with OpenGL ES 3.2.
- QPagedPaintDevice:
* The default constructor has been deprecated since that class is
not meant to be used standalone. The two public but internal
devicePageLayout() methods are now deprecated.
- QPainter:
* [QTBUG-67248] Fixed drawTiledPixmap() and texture-brush painting with
high-DPR images.
* QPainter::drawTiledPixmap() now tiles in the device independent
coordinate system.
- QPicture:
* [QTBUG-71208] Fixed a crash reading malformed picture file.
- QStandardItemModel:
* itemData does not return role 255 any more.
- QTextImageFormat:
* Added two new functions to the class: setQuality(int=100) and
quality(). They are currently used by QTextODFWriter to determine the
image type and quality when exporting images to ODT files.
- Text:
* [QTBUG-57479] Non-breaking spaces are now displayed as a degree symbol
when QTextOption::ShowTabsAndSpaces is used.
* [QTBUG-69085] Fixed position of text cursor set by clicking outside
the bounds of a text line that ends with a surrogate pair or ligature.
* [QTBUG-70293] Fixed a crash that can happen when calling a setter on a
QTextCursor after its QTextDocument has been deleted.
****************************************************************************
* QtNetwork *
****************************************************************************
- Added DTLS over UDP support.
- QPasswordDigestor:
* [QTBUG-30550] Added QPasswordDigestor
- QSslKey:
* [QTBUG-17718] The OpenSSL backend can now load encrypted PKCS#8
DER-encoded keys.
* [QTBUG-59068] Added support for PKCS#8-encoded keys in the generic SSL
back-end (used for SecureTransport on macOS and for WinRT). Note that
it does not support keys encrypted with a PKCS#12 algorithm.
- QSslSocket:
* Enabled ALPN (and thus HTTP/2 negotiation) in SecureTransport backend
(macOS).
* [QTBUG-69420] Implemented renegotiation for SecureTransport backend.
- SSL:
* The OpenSSL 1.1 backend also works with OpenSSL 1.1.1 (and thus can
negotiate TLS 1.3).
* [QTBUG-68156] OpenSSL >= 1.0 is now required to build Qt with OpenSSL
support.
****************************************************************************
* QtSql *
****************************************************************************
- MySQL:
* Now supports MySQL versions >= 8.0.1.
* [QTBUG-57028] The TIME data type is now treated like a string-based
type in order to respect the full range of the TIME data type.
****************************************************************************
* QtTest *
****************************************************************************
- QCOMPARE:
* Now outputs contents of std::tuple on failure.
* [QTBUG-65845] QtTest now prints values of QFlags that failed to compare.
****************************************************************************
* QtWidgets *
****************************************************************************
- Itemviews:
* [QTBUG-12129][QTBUG-14949][QTBUG-57891] Fixed eliding of multi-line
items.
- QAbstractSpinBox:
* [QTBUG-67380] The Qt::ControlModifier now increases the number of steps a
QAbstractSpinBox takes for the following interactions: scrolling, up/down
keyboard keys and the spin box buttons. Previously, Qt::ControlModifier
only affected scrolling.
- QApplication:
* [QTBUG-67736] QApplication no longer sends a mouse move event to the
entered widget if it sends synthetic enter and leave events.
- QHeaderView:
* [QTBUG-23203] Padding/margin is now taken into account when the text gets
elided.
* [QTBUG-59501] The qss padding attribute is now honored in all cases.
* [QTBUG-62091] The size of the decoration is now taken into account in
paintSection().
* [QTBUG-65017] The drag'n'drop indicator is now using the correct font.
* [QTBUG-69431] setDefaultSectionSize() now checks if the given value is
inside min/max section size.
* [QTBUG-70084] The section indicator is now high-DPI-aware.
- QItemDelegate:
* [QTBUG-16134] Fixed text height calculation when the item has a
decoration or checkbox.
- QLineEdit:
* [QTBUG-44046] The textEdited() signal is now emitted even if the
QValidator has changed the user input.
* [QTBUG-57448] Added inputRejected() signal for when a key press is not
accepted by the QLineEdit. For instance, when an invalid key is
pressed for a validator set.
- QListView:
* [QTBUG-27110] The pseudo states :first/:middle/:last are now respected.
* [QTBUG-56606] Added itemAlignment property.
* [QTBUG-67440] Fixed a bug that caused items on internal move to be
deleted.
- QMenu:
* [QTBUG-69199] Removed icon highlight when a stylesheet was applied by
the application.
- QMessageBox:
* [QTBUG-35545] On Android and iOS it's now possible to show a
QMessageBox with custom buttons as a native dialog.
- QSpinBox/QDoubleSpinBox:
* Added an option for adaptive decimal step size.
- QSplashScreen:
* [QTBUG-43081] The alignment when the message is passed as HTML is now
correctly honored.
- QStyle:
* QStyle::SH_SpinBox_StepModifier allows the developer to pick which
keyboard modifier increases the number of steps a QAbstractSpinBox
takes for the following interactions: scrolling, up/down keyboard keys
and the spin box buttons. The Qt::ShiftModifier can now be used, or
the feature can be disabled using Qt::NoModifier. Previously, only
Qt::ControlModifier could be used as the modifier.
- QTabBar:
* [QTBUG-18146] Fixed mixed up CSS pseudo class for left and right.
- QTableView:
* [QTBUG-48244][QTBUG-49548] Fixed calculating geometries for editors.
* [QTBUG-70215] Fixed PageUp not getting to top when first row is hidden.
- QTableWidget:
* Fixed handling of Qt::EditRole and Qt::DisplayRole in setItemData().
- QTreeView:
* [QTBUG-39486] Sped up expanding items when pressing asterisk.
- QWidget:
* [QTBUG-68393][QTBUG-69619][QTBUG-10907] Fixed several bugs that
incorrectly reordered tabs for compound widgets under some special
circumstances.
* [QTBUG-65199] enterEvent() and leaveEvent() now occur when a hovering
drawing tablet stylus enters or leaves a widget.
* Added the Qt::WA_StyleSheetTarget attribute to indicate that a widget
was affected by a style sheet.
****************************************************************************
* Android *
****************************************************************************
- Added Android edit context menu.
- Removed old debugging bridge. To be able to debug Qt on Android apps the
user must use QtCreator 4.6.1+.
- [QTBUG-63735] The system no longer restarts the application when the user
replaces SIM card or changes the logical density of the screen.
- [QTBUG-70280] ARM64 builds now default to android-21 instead of failing.
- [QTBUG-35545] QMessageBox now supports buttons with custom labels.
****************************************************************************
* Linux *
****************************************************************************
- QFileDialog will use the native dialogs provided by the platform theme
instead of trying to use Flatpak portal to select directories.
****************************************************************************
* macOS *
****************************************************************************
- QtGui:
* [QTBUG-63800] Fixed display of condensed fonts when NoFontMerging is
in use.
- Text:
* [QTBUG-69955] Fixed font weights on macOS 10.14.
****************************************************************************
* Windows *
****************************************************************************
- [QTBUG-55762] The dimensions of invisible margins inside the frames of
Windows 10 windows will now be disregarded in the positioning of Qt
windows to avoid a misplaced look (offset by a few pixels from the
expected position).
- [QTBUG-44964][QTBUG-60437] The application attributes
AA_CompressTabletEvents and AA_CompressHighFrequencyEvents are now
supported on Windows 8 and above for touch/pen input, with the same
defaults as on X11 (compress touch events, don't compress tablet events)
- QTimeZone:
* [QTBUG-42021] Changed MS-Win to use ICU for time-zone data, when
available, in preference to MS's TZ APIs. The choice is made when
building Qt. This will give reliable results when non-DST transitions
arise, or when a zone's DST is not simple (e.g. interrupted by
Ramadan).
****************************************************************************
* winrt *
****************************************************************************
- Added support to Windows UI Automation to the WinRT QPA, allowing
Qt-based UWP applications to operate with accessibility and
programmatic UI control tools.
****************************************************************************
* X11 *
****************************************************************************
- [QTBUG-39624] The xcb plugin was ported to use libxcb-xinput instead of
libXi for XInput2 support. The -xinput2 configure option was replaced by
-xcb-xinput.

View File

@ -1101,8 +1101,6 @@ QString
MakefileGenerator::prlFileName(bool fixify)
{
QString ret = project->first("PRL_TARGET") + Option::prl_ext;
if(!project->isEmpty("QMAKE_BUNDLE"))
ret.prepend(project->first("QMAKE_BUNDLE") + Option::dir_sep);
if(fixify) {
if(!project->isEmpty("DESTDIR"))
ret.prepend(project->first("DESTDIR").toQString());

View File

@ -1225,6 +1225,8 @@ void UnixMakefileGenerator::init2()
else
ar_cmd.append("$(AR) $(TARGETA) $(OBJECTS)");
if (!project->isEmpty("QMAKE_BUNDLE")) {
project->values("PRL_TARGET").prepend(
project->first("QMAKE_BUNDLE") + Option::dir_sep + project->first("TARGET"));
ProString bundle_loc = project->first("QMAKE_BUNDLE_LOCATION");
if(!bundle_loc.isEmpty() && !bundle_loc.startsWith("/"))
bundle_loc.prepend("/");

22
src/3rdparty/angle/SYSTEMINFO_LICENSE vendored Normal file
View File

@ -0,0 +1,22 @@
Copyright (C) 2009 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:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. 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.
THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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.

27
src/3rdparty/angle/TRACEEVENT_LICENSE vendored Normal file
View File

@ -0,0 +1,27 @@
Copyright 2013 The Chromium Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -2,7 +2,7 @@
"Id": "libjpeg",
"Name": "LibJPEG-turbo",
"QDocModule": "qtgui",
"QtUsage": "Used in the QJPEG image plugin. Configure with -no-jpeg to avoid.",
"QtUsage": "Used in the qjpeg image plugin. Configure with -system-libjpeg or -no-libjpeg to avoid.",
"Description": "The Independent JPEG Group's JPEG software",
"Homepage": "http://libjpeg-turbo.virtualgl.org/",

View File

@ -2,7 +2,7 @@
"Id": "libpng",
"Name": "LibPNG",
"QDocModule": "qtgui",
"QtUsage": "Used in the qpng image plugin. Configure with -system-png or -no-png to avoid.",
"QtUsage": "Used in the qpng image plugin. Configure with -system-libpng or -no-libpng to avoid.",
"Description": "libpng is the official PNG reference library.",
"Homepage": "http://www.libpng.org/pub/png/libpng.html",

View File

@ -1,21 +1,14 @@
Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
LICENSE TERMS
Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved.
The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:
1. source code distributions include the above copyright notice, this
list of conditions and the following disclaimer;
source code distributions include the above copyright notice, this
list of conditions and the following disclaimer;
2. binary distributions include the above copyright notice, this list
of conditions and the following disclaimer in their documentation;
3. the name of the copyright holder is not used to endorse products
built using this software without specific written permission.
DISCLAIMER
binary distributions include the above copyright notice, this list
of conditions and the following disclaimer in their documentation.
This software is provided 'as is' with no explicit or implied warranties
in respect of its properties, including, but not limited to, correctness
and/or fitness for purpose.
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.

View File

@ -1,29 +1,22 @@
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
---------------------------------------------------------------------------
Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved.
LICENSE TERMS
The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:
The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:
source code distributions include the above copyright notice, this
list of conditions and the following disclaimer;
1. source code distributions include the above copyright notice, this
list of conditions and the following disclaimer;
binary distributions include the above copyright notice, this list
of conditions and the following disclaimer in their documentation.
2. binary distributions include the above copyright notice, this list
of conditions and the following disclaimer in their documentation;
3. the name of the copyright holder is not used to endorse products
built using this software without specific written permission.
DISCLAIMER
This software is provided 'as is' with no explicit or implied warranties
in respect of its properties, including, but not limited to, correctness
and/or fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
Changes for ARM 9/9/2010
This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
Changes for ARM 9/9/2010 [Downstream relative to Gladman's GitHub, upstream to Qt]
*/
#ifndef _BRG_ENDIAN_H
@ -32,7 +25,12 @@
#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */
#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */
#if 0
/* This is needed when using clang with MSVC to avoid including */
/* endian.h and byteswap.h which are not present on Windows */
#if defined( _MSC_VER ) && defined( __clang__ )
# undef __GNUC__
#endif
/* Include files where endian defines and byteswap functions may reside */
#if defined( __sun )
# include <sys/isa_defs.h>
@ -42,14 +40,13 @@
defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
# include <machine/endian.h>
#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
# if !defined( __MINGW32__ ) && !defined( _AIX )
# if !defined( __MINGW32__ ) && !defined( _AIX ) && !defined(Q_OS_QNX)
# include <endian.h>
# if !defined( __BEOS__ )
# include <byteswap.h>
# endif
# endif
#endif
#endif
/* Now attempt to set the define for platform byte order using any */
/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */
@ -134,7 +131,7 @@
#elif 0 /* **** EDIT HERE IF NECESSARY **** */
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#else
# error Please edit lines 132 or 134 in brg_endian.h to set the platform byte order
# error Please edit lines 129 or 131 in brg_endian.h to set the platform byte order
#endif
#endif

34
src/3rdparty/sha3/brg_endian.h.patch vendored Normal file
View File

@ -0,0 +1,34 @@
diff -ub /home/eddy/.sys/tmp/sha/brg_endian.h /home/eddy/work/Qt-5.12/qtbase/src/3rdparty/sha3/brg_endian.h
--- upstream/sha/brg_endian.h 2018-10-22 16:27:04.106128670 +0200
+++ qtbase/src/3rdparty/sha3/brg_endian.h 2018-10-22 16:30:35.098891562 +0200
@@ -16,6 +16,7 @@
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
+Changes for ARM 9/9/2010 [Downstream relative to Gladman's GitHub, upstream to Qt]
*/
#ifndef _BRG_ENDIAN_H
@@ -119,12 +120,18 @@
defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX )
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
-#elif 0 /* **** EDIT HERE IF NECESSARY **** */
+#elif defined(__arm__)
+# ifdef __BIG_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+# else
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+# endif
+#elif 1 /* **** EDIT HERE IF NECESSARY **** */
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#elif 0 /* **** EDIT HERE IF NECESSARY **** */
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#else
-# error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order
+# error Please edit lines 129 or 131 in brg_endian.h to set the platform byte order
#endif
#endif
Diff finished. Mon Oct 22 16:31:46 2018

View File

@ -4,13 +4,15 @@
"Name": "Secure Hash Algorithm SHA-3 - brg_endian",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QCryptographicHash).",
"Files": "apply brg_endian.h.patch to upstream from https://github.com/BrianGladman/sha/",
"Files": "brg_endian.h",
"Description": "SHA-3, originally known as Keccak, is a cryptographic hash function.",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"Version": "https://github.com/BrianGladman/sha/ commit 4b9e13ead2c5b5e41ca27c65de4dd69ae0bac228",
"License": "BSD 2-clause \"Simplified\" License",
"LicenseFile": "BRG_ENDIAN_LICENSE",
"LicenseId": "BSD-3-Clause",
"Copyright": "Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved."
"LicenseId": "BSD-2-Clause",
"Copyright": "Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved."
},
{
"Id": "sha3_keccak",

Binary file not shown.

View File

@ -24,10 +24,11 @@
"Description": "The DejaVu fonts are a font family based on the Vera Fonts.",
"Homepage": "https://dejavu-fonts.github.io/",
"Version": "2.37",
"License": "Bitstream Vera Font License",
"LicenseFile": "DEJAVU-LICENSE",
"Copyright": "Copyright (C) 2003 Bitstream,Inc
"Copyright": "Copyright (c) 2003 by Bitstream, Inc
Copyright (c) 2006 by Tavmjong Bah
(c) American Mathematical Society"
}
]
]

View File

@ -3796,7 +3796,7 @@ bool qunsetenv(const char *varName)
dependent delayed translation in the given \a context with the given
\a comment.
The \a context is typically a class and also needs to be specified
as a string literal. The string literal \a disambiguation should be
as a string literal. The string literal \a comment should be
a short semantic tag to tell apart otherwise identical strings.
The macro tells lupdate to collect the string, and expands to an

View File

@ -435,6 +435,7 @@
*/
/*!
\keyword qglobalstatic-operator-type-ptr
\fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> QGlobalStatic<T, innerFunction, guard>::operator Type*()
This function returns the address of the contents of this global static. If
@ -476,10 +477,11 @@
by this function. If the contents have already been destroyed, this
function will return a null pointer.
This function is equivalent to \l {operator Type *()}. It is provided for
compatibility with the private Q_GLOBAL_STATIC implementation that existed
in Qt 4.x and 5.0. New code should avoid using it and should instead treat
the object as a smart pointer.
This function is equivalent to \l {qglobalstatic-operator-type-ptr}
{operator Type *()}. It is provided for compatibility with the private
Q_GLOBAL_STATIC implementation that existed in Qt 4.x and 5.0. New code
should avoid using it and should instead treat the object as a smart
pointer.
*/
/*!

View File

@ -3187,8 +3187,12 @@
\value ScrollUpdate The scrolling distance has changed (default).
\value ScrollEnd Scrolling has ended, but the scrolling distance
\value ScrollEnd Scrolling has ended, and the scrolling distance
did not change anymore.
\value ScrollMomentum The user no longer touches the input device,
but scrolling continues due to scroll momentum.
This value was introduced in Qt 5.12.
*/
/*!

View File

@ -64,6 +64,10 @@
#include <float.h>
#endif
# if defined(Q_OS_INTEGRITY) && defined(Q_PROCESSOR_ARM_64)
#include <arm64_ghs.h>
#endif
#if !defined(Q_CC_MSVC) && (defined(Q_OS_QNX) || defined(Q_CC_INTEL))
# include <math.h>
# ifdef isnan
@ -323,6 +327,38 @@ mul_overflow(T v1, T v2, T *r)
return lr > std::numeric_limits<T>::max() || lr < std::numeric_limits<T>::min();
}
# if defined(Q_OS_INTEGRITY) && defined(Q_PROCESSOR_ARM_64)
template <> inline bool mul_overflow(quint64 v1, quint64 v2, quint64 *r)
{
*r = v1 * v2;
return __MULUH64(v1, v2);
}
template <> inline bool mul_overflow(qint64 v1, qint64 v2, qint64 *r)
{
qint64 high = __MULSH64(v1, v2);
if (high == 0) {
*r = v1 * v2;
return *r < 0;
}
if (high == -1) {
*r = v1 * v2;
return *r >= 0;
}
return true;
}
template <> inline bool mul_overflow(uint64_t v1, uint64_t v2, uint64_t *r)
{
return mul_overflow<quint64>(v1,v2,reinterpret_cast<quint64*>(r));
}
template <> inline bool mul_overflow(int64_t v1, int64_t v2, int64_t *r)
{
return mul_overflow<qint64>(v1,v2,reinterpret_cast<qint64*>(r));
}
#endif
# if defined(Q_CC_MSVC) && defined(Q_PROCESSOR_X86)
// We can use intrinsics for the unsigned operations with MSVC
template <> inline bool add_overflow(unsigned v1, unsigned v2, unsigned *r)

View File

@ -1040,7 +1040,8 @@ QStringList QDir::nameFilters() const
list of filters specified by \a nameFilters.
Each name filter is a wildcard (globbing) filter that understands
\c{*} and \c{?} wildcards. (See \l{QRegularExpression wildcard matching}.)
\c{*} and \c{?} wildcards. See \l{QRegularExpression#Wildcard matching}
{QRegularExpression Wildcard Matching}.
For example, the following code sets three name filters on a QDir
to ensure that only files with extensions typically used for C++
@ -2120,8 +2121,8 @@ QString QDir::rootPath()
patterns in the list of \a filters; otherwise returns \c false. The
matching is case insensitive.
\sa {QRegularExpression Wildcard matching}, QRegularExpression::wildcardToRegularExpression(),
entryList(), entryInfoList()
\sa {QRegularExpression#Wildcard matching}{QRegularExpression Wildcard Matching},
entryList(), entryInfoList()
*/
bool QDir::match(const QStringList &filters, const QString &fileName)
{
@ -2143,8 +2144,8 @@ bool QDir::match(const QStringList &filters, const QString &fileName)
contain multiple patterns separated by spaces or semicolons.
The matching is case insensitive.
\sa {QRegularExpression wildcard matching}, QRegularExpression::wildcardToRegularExpression,
entryList(), entryInfoList()
\sa {QRegularExpression#Wildcard matching}{QRegularExpression Wildcard Matching},
entryList(), entryInfoList()
*/
bool QDir::match(const QString &filter, const QString &fileName)
{

View File

@ -112,12 +112,12 @@ QT_BEGIN_NAMESPACE
\relates QProcess
Disables the
\l {QProcess::start(const QString &, OpenMode)}{QProcess::start()}
overload taking a single string.
\l {QProcess::start(const QString &, QIODevice::OpenMode)}
{QProcess::start}() overload taking a single string.
In most cases where it is used, the user intends for the first argument
to be treated atomically as per the other overload.
\sa QProcess::start(const QString &command, OpenMode mode)
\sa QProcess::start(const QString &command, QIODevice::OpenMode mode)
*/
/*!
@ -2557,7 +2557,7 @@ bool QProcess::startDetached(const QString &program,
After the \a command string has been split and unquoted, this function
behaves like the overload which takes the arguments as a string list.
\sa start(const QString &command, OpenMode mode)
\sa start(const QString &command, QIODevice::OpenMode mode)
*/
bool QProcess::startDetached(const QString &command)
{

View File

@ -720,6 +720,11 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) Q_DECL_
Returns the time remaining before the deadline.
*/
/*!
\fn QPair<qint64, unsigned> QDeadlineTimer::_q_data() const
\internal
*/
// the rest of the functions are in qelapsedtimer_xxx.cpp
QT_END_NAMESPACE

View File

@ -58,7 +58,7 @@
QT_USE_NAMESPACE
/*!
/*
During scroll view panning, and possibly other gestures, UIKit will
request a switch to UITrackingRunLoopMode via GSEventPushRunLoopMode,
which records the new runloop mode and stops the current runloop.

View File

@ -571,43 +571,43 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiv
*/
/*!
\fn template<typename Functor> QMetaObject::Connection callOnTimeout(Functor functor, Qt::ConnectionType connectionType = Qt::AutoConnection)
\fn template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
\since 5.12
\overload
Creates a connection from the timeout() signal to \a functor, and returns a
Creates a connection from the timeout() signal to \a slot, and returns a
handle to the connection.
This method is provided for convenience.
It's equivalent to calling \c {QObject::connect(timer, &QTimer::timeout, timer, functor, connectionType)}.
It's equivalent to calling \c {QObject::connect(timer, &QTimer::timeout, timer, slot, connectionType)}.
\sa QObject::connect(), timeout()
*/
/*!
\fn template<typename Functor> QMetaObject::Connection callOnTimeout(QObject *context, Functor functor, Qt::ConnectionType connectionType = Qt::AutoConnection)
\fn template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
\since 5.12
\overload callOnTimeout()
Creates a connection from the timeout() signal to \a functor to be placed in a specific
Creates a connection from the timeout() signal to \a slot to be placed in a specific
event loop of \a context, and returns a handle to the connection.
This method is provided for convenience. It's equivalent to calling
\c {QObject::connect(timer, &QTimer::timeout, context, functor, connectionType)}.
\c {QObject::connect(timer, &QTimer::timeout, context, slot, connectionType)}.
\sa QObject::connect(), timeout()
*/
/*!
\fn template<typename PointerToMemberFunction> QMetaObject::Connection callOnTimeout(QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType connectionType = Qt::AutoConnection)
\fn template <typename PointerToMemberFunction> QMetaObject::Connection QTimer::callOnTimeout(const QObject *receiver, PointerToMemberFunction slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
\since 5.12
\overload callOnTimeout()
Creates a connection from the timeout() signal to the \a method in the \a receiver object. Returns
Creates a connection from the timeout() signal to the \a slot in the \a receiver object. Returns
a handle to the connection.
This method is provided for convenience. It's equivalent to calling
\c {QObject::connect(timer, &QTimer::timeout, receiver, method, connectionType)}.
\c {QObject::connect(timer, &QTimer::timeout, receiver, slot, connectionType)}.
\sa QObject::connect(), timeout()
*/

View File

@ -1422,12 +1422,14 @@ bool QCborStreamWriter::endMap()
*/
/*!
\variable Container QCborStreamReader::StringResult::data
\variable QCborStreamReader::StringResult::data
Contains the actual data from the string if \l status is \c Ok.
*/
/*!
\variable QCborStreamReader::StringResultCode QCborStreamReader::StringResult::status
\variable QCborStreamReader::StringResult::status
Contains the status of the attempt of reading the string from the stream.
*/

View File

@ -221,7 +221,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
\variable qint64 QCborParserError::offset
\variable QCborParserError::offset
This field contains the offset from the beginning of the data where the
error was detected. The offset should point to the beginning of the item
@ -232,7 +232,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
\variable QCborError QCborParserError::error
\variable QCborParserError::error
This field contains the error code that indicates what decoding problem was
found.

View File

@ -298,12 +298,9 @@ QThreadPrivate::~QThreadPrivate()
\warning The handle returned by this function is used for internal
purposes and should not be used in any application code.
\warning On Windows, the returned value is a pseudo-handle for the
current thread. It can't be used for numerical comparison. i.e.,
this function returns the DWORD (Windows-Thread ID) returned by
the Win32 function getCurrentThreadId(), not the HANDLE
(Windows-Thread HANDLE) returned by the Win32 function
getCurrentThread().
\note On Windows, this function returns the DWORD (Windows-Thread
ID) returned by the Win32 function GetCurrentThreadId(), not the pseudo-HANDLE
(Windows-Thread HANDLE) returned by the Win32 function GetCurrentThread().
*/
/*!

View File

@ -3076,7 +3076,7 @@ bool QByteArray::endsWith(const char *str) const
return qstrncmp(d->data() + d->size - len, str, len) == 0;
}
/*!
/*
Returns true if \a c is an uppercase Latin1 letter.
\note The multiplication sign 0xD7 and the sz ligature 0xDF are not
treated as uppercase Latin1.
@ -3112,7 +3112,7 @@ bool QByteArray::isUpper() const
return true;
}
/*!
/*
Returns true if \a c is an lowercase Latin1 letter.
\note The division sign 0xF7 is not treated as lowercase Latin1,
but the small y dieresis 0xFF is.

View File

@ -537,7 +537,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa operator=()
*/
/*! \fn template <class Key, class T> QMap<Key, T>::QMap(const std::map<Key, T> & other)
/*! \fn template <class Key, class T> QMap<Key, T>::QMap(const typename std::map<Key, T> & other)
Constructs a copy of \a other.

View File

@ -2000,8 +2000,8 @@ QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
\since 5.12
Returns the expression wrapped between the \c{\A} and \c{\z} anchors to be
used for exact matching.
Returns the \a expression wrapped between the \c{\A} and \c{\z} anchors to
be used for exact matching.
\sa {Porting from QRegExp's Exact Matching}
*/

View File

@ -30,24 +30,36 @@
QT_BEGIN_NAMESPACE
/*!
\fn const QScopeGuard<F> qScopeGuard(F f)
\inmodule QtCore
\brief The qScopeGuard function can be used to call a function at the end of the scope.
\class QScopeGuard
\since 5.12
\inmodule QtCore
\brief Provides a scope guard for calling a function at the of
a scope.
*/
/*!
\fn template <typename F> const QScopeGuard<F> qScopeGuard(F f)
\inmodule QtCore
\relates QScopeGuard
\brief The qScopeGuard function can be used to call a function at the end
of the scope.
\ingroup misc
QScopeGuard<F> is a class which sole purpose is to run a function F in its destructor.
This is useful for guaranteeing your cleanup code is executed whether the function is exited normally,
exited early by a return statement, or exited by an exception.
QScopeGuard<F> is a class which sole purpose is to run a function \e F in
its destructor. This is useful for guaranteeing your cleanup code is
executed, whether the function is exited normally, exited early by a return
statement, or exited by an exception.
If F is a lambda then you cannot instantiate the template directly, therefore the qScopeGuard() helper
is provided and QScopeGuard<F> is made a private implementation detail.
If \e F is a lambda then you cannot instantiate the template directly,
therefore the qScopeGuard() helper is provided and QScopeGuard<F> is made a
private implementation detail.
Example usage is as follows:
\snippet code/src_corelib_tools_qscopeguard.cpp 0
\note Exceptions are not supported. The callable shouldn't throw when executed, copied or moved.
\note Exceptions are not supported. The callable shouldn't throw when
executed, copied or moved.
\sa QScopedValueRollback
*/

View File

@ -579,6 +579,13 @@ QT_BEGIN_NAMESPACE
the shared data object if the reference count became 0.
*/
/*! \fn template <class T> T *QExplicitlySharedDataPointer<T>::take()
\since 5.12
Returns a pointer to the shared object, and resets \e this to be null.
That is, this function sets the \e{d pointer} of \e this to \c nullptr.
*/
/*! \fn template <class T> QExplicitlySharedDataPointer<T>::operator bool () const
Returns \c true if the \e{d pointer} of \e this is \e not null.
*/

View File

@ -254,7 +254,7 @@ inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1,
/*!
* \internal
*
* Searches for character \a \c in the string \a str and returns a pointer to
* Searches for character \a c in the string \a str and returns a pointer to
* it. Unlike strchr() and wcschr() (but like glibc's strchrnul()), if the
* character is not found, this function returns a pointer to the end of the
* string -- that is, \c{str.end()}.

View File

@ -217,7 +217,7 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
This class includes data obtained from the CLDR data files under the terms
of the Unicode Data Files and Software License. See
\l{Unicode CLDR (Unicode Common Locale Data Repository)} for the details.
\l{Unicode Common Locale Data Repository (CLDR)} for details.
\sa QDateTime
*/

View File

@ -3013,6 +3013,9 @@ bool QStandardItemModel::setData(const QModelIndex &index, const QVariant &value
/*!
\since 5.12
Removes the data stored in all the roles for the given \a index.
Returns \c true if \a index is valid and data was cleared, \c false
otherwise.
\sa setData(), data()
*/
bool QStandardItemModel::clearItemData(const QModelIndex &index)

View File

@ -56,6 +56,12 @@
QT_BEGIN_NAMESPACE
/*!
\namespace QPlatformGraphicsBufferHelper
\inmodule QtGui
\internal
*/
/*!
Convenience function to both lock and bind the \a graphicsBuffer to a texture.
This function will first try to lock with texture read and texture write

View File

@ -142,6 +142,7 @@ void CLASS::init(QOpenGLContext *context) \
\value BlendColor glBlendColor() is available.
\value BlendEquation glBlendEquation() is available.
\value BlendEquationSeparate glBlendEquationSeparate() is available.
\value BlendEquationAdvanced Advanced blend equations are available.
\value BlendFuncSeparate glBlendFuncSeparate() is available.
\value BlendSubtract Blend subtract mode is available.
\value CompressedTextures Compressed texture functions are available.

View File

@ -1366,7 +1366,7 @@ QRgba64 QColor::rgba64() const Q_DECL_NOTHROW
Sets the RGB64 value to \a rgba, including its alpha.
\sa \setRgba(), rgba64()
\sa setRgba(), rgba64()
*/
void QColor::setRgba64(QRgba64 rgba) Q_DECL_NOTHROW
{

View File

@ -1254,7 +1254,7 @@ QFont::StyleStrategy QFont::styleStrategy() const
/*!
Returns the StyleHint.
The style hint affects the \l{#fontmatching}{font matching algorithm}.
The style hint affects the \l{QFont#fontmatching}{font matching algorithm}.
See \l QFont::StyleHint for the list of available hints.
\sa setStyleHint(), QFont::StyleStrategy, QFontInfo::styleHint()

View File

@ -155,7 +155,7 @@ bool Qt::mightBeRichText(const QString& text)
This function is defined in the \c <QTextDocument> header file.
\sa escape(), mightBeRichText()
\sa QString::toHtmlEscaped(), mightBeRichText()
*/
QString Qt::convertFromPlainText(const QString &plain, Qt::WhiteSpaceMode mode)
{

View File

@ -645,6 +645,7 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt)
\value ImageName
\value ImageWidth
\value ImageHeight
\value ImageQuality
Selection properties
@ -2251,7 +2252,7 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const
\fn void QTextBlockFormat::setHeadingLevel(int level)
\since 5.12
Sets the paragraph's heading level, where 1 is the highest-level heading
Sets the paragraph's heading \a level, where 1 is the highest-level heading
type (usually with the largest possible heading font size), and increasing
values are progressively deeper into the document (and usually with smaller
font sizes). For example when reading an HTML H1 tag, the heading level is

View File

@ -129,6 +129,8 @@ Q_LOGGING_CATEGORY(lcSsl, "qt.network.ssl");
\value DtlsV1_0OrLater DTLSv1.0 and later versions.
\value DtlsV1_2 DTLSv1.2
\value DtlsV1_2OrLater DTLSv1.2 and later versions.
\value TlsV1_3 TLSv1.3. (Since Qt 5.12)
\value TlsV1_3OrLater TLSv1.3 and later versions. (Since Qt 5.12)
\value UnknownProtocol The cipher's protocol cannot be determined.
\value AnyProtocol The socket understands SSLv2, SSLv3, TLSv1.0 and all
supported later versions of TLS. This value is used by QSslSocket only.

View File

@ -91,12 +91,13 @@ namespace QSsl {
TlsV1_1OrLater,
TlsV1_2OrLater,
#if QT_CONFIG(dtls) || defined(Q_CLANG_QDOC)
DtlsV1_0,
DtlsV1_0OrLater,
DtlsV1_2,
DtlsV1_2OrLater,
#endif
TlsV1_3,
TlsV1_3OrLater,
UnknownProtocol = -1
};

View File

@ -105,7 +105,24 @@ init_context:
isDtls = true;
sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
break;
#else // dtls
case QSsl::DtlsV1_0:
case QSsl::DtlsV1_0OrLater:
case QSsl::DtlsV1_2:
case QSsl::DtlsV1_2OrLater:
sslContext->ctx = nullptr;
unsupportedProtocol = true;
qCWarning(lcSsl, "DTLS protocol requested, but feature 'dtls' is disabled");
break;
#endif // dtls
case QSsl::TlsV1_3:
case QSsl::TlsV1_3OrLater:
#if !defined(TLS1_3_VERSION)
qCWarning(lcSsl, "TLS 1.3 is not supported");
sslContext->ctx = nullptr;
unsupportedProtocol = true;
break;
#endif // TLS1_3_VERSION
default:
// The ssl options will actually control the supported methods
sslContext->ctx = q_SSL_CTX_new(client ? q_TLS_client_method() : q_TLS_server_method());
@ -155,6 +172,16 @@ init_context:
minVersion = TLS1_2_VERSION;
maxVersion = TLS1_2_VERSION;
break;
case QSsl::TlsV1_3:
#ifdef TLS1_3_VERSION
minVersion = TLS1_3_VERSION;
maxVersion = TLS1_3_VERSION;
#else
// This protocol is not supported by OpenSSL 1.1 and we handle
// it as an error (see the code above).
Q_UNREACHABLE();
#endif // TLS1_3_VERSION
break;
// Ranges:
case QSsl::TlsV1SslV3:
case QSsl::AnyProtocol:
@ -192,6 +219,17 @@ init_context:
maxVersion = DTLS_MAX_VERSION;
break;
#endif // dtls
case QSsl::TlsV1_3OrLater:
#ifdef TLS1_3_VERSION
minVersion = TLS1_3_VERSION;
maxVersion = 0;
break;
#else
// This protocol is not supported by OpenSSL 1.1 and we handle
// it as an error (see the code above).
Q_UNREACHABLE();
break;
#endif // TLS1_3_VERSION
case QSsl::SslV2:
// This protocol is not supported by OpenSSL 1.1 and we handle
// it as an error (see the code above).
@ -223,23 +261,52 @@ init_context:
// http://www.openssl.org/docs/ssl/SSL_CTX_set_mode.html
q_SSL_CTX_set_mode(sslContext->ctx, SSL_MODE_RELEASE_BUFFERS);
auto filterCiphers = [](const QList<QSslCipher> &ciphers, bool selectTls13)
{
QByteArray cipherString;
bool first = true;
for (const QSslCipher &cipher : qAsConst(ciphers)) {
const bool isTls13Cipher = cipher.protocol() == QSsl::TlsV1_3 || cipher.protocol() == QSsl::TlsV1_3OrLater;
if (selectTls13 != isTls13Cipher)
continue;
if (first)
first = false;
else
cipherString.append(':');
cipherString.append(cipher.name().toLatin1());
}
return cipherString;
};
// Initialize ciphers
QByteArray cipherString;
bool first = true;
QList<QSslCipher> ciphers = sslContext->sslConfiguration.ciphers();
if (ciphers.isEmpty())
ciphers = isDtls ? q_getDefaultDtlsCiphers() : QSslSocketPrivate::defaultCiphers();
for (const QSslCipher &cipher : qAsConst(ciphers)) {
if (first)
first = false;
else
cipherString.append(':');
cipherString.append(cipher.name().toLatin1());
const QByteArray preTls13Ciphers = filterCiphers(ciphers, false);
if (preTls13Ciphers.size()) {
if (!q_SSL_CTX_set_cipher_list(sslContext->ctx, preTls13Ciphers.data())) {
sslContext->errorStr = QSslSocket::tr("Invalid or empty cipher list (%1)").arg(QSslSocketBackendPrivate::getErrorsFromOpenSsl());
sslContext->errorCode = QSslError::UnspecifiedError;
return;
}
}
if (!q_SSL_CTX_set_cipher_list(sslContext->ctx, cipherString.data())) {
sslContext->errorStr = QSslSocket::tr("Invalid or empty cipher list (%1)").arg(QSslSocketBackendPrivate::getErrorsFromOpenSsl());
const QByteArray tls13Ciphers = filterCiphers(ciphers, true);
#ifdef TLS1_3_VERSION
if (tls13Ciphers.size()) {
if (!q_SSL_CTX_set_ciphersuites(sslContext->ctx, tls13Ciphers.data())) {
sslContext->errorStr = QSslSocket::tr("Invalid or empty cipher list (%1)").arg(QSslSocketBackendPrivate::getErrorsFromOpenSsl());
sslContext->errorCode = QSslError::UnspecifiedError;
return;
}
}
#endif // TLS1_3_VERSION
if (!preTls13Ciphers.size() && !tls13Ciphers.size()) {
sslContext->errorStr = QSslSocket::tr("Invalid or empty cipher list (%1)").arg(QStringLiteral(""));
sslContext->errorCode = QSslError::UnspecifiedError;
return;
}

View File

@ -104,6 +104,15 @@ init_context:
isDtls = true;
sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
break;
#else // dtls
case QSsl::DtlsV1_0:
case QSsl::DtlsV1_0OrLater:
case QSsl::DtlsV1_2:
case QSsl::DtlsV1_2OrLater:
sslContext->ctx = nullptr;
unsupportedProtocol = true;
qCWarning(lcSsl, "DTLS protocol requested, but feature 'dtls' is disabled");
break;
#endif // dtls
case QSsl::SslV2:
#ifndef OPENSSL_NO_SSL2
@ -168,6 +177,12 @@ init_context:
unsupportedProtocol = true;
#endif
break;
case QSsl::TlsV1_3:
case QSsl::TlsV1_3OrLater:
// TLS 1.3 is not supported by the system, but chosen deliberately -> error
sslContext->ctx = nullptr;
unsupportedProtocol = true;
break;
}
if (!client && isDtls && configuration.peerVerifyMode() != QSslSocket::VerifyNone) {

View File

@ -1110,6 +1110,18 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
return false;
}
// SecureTransport has kTLSProtocol13 constant and also, kTLSProtocolMaxSupported.
// Calling SSLSetProtocolVersionMax/Min with any of these two constants results
// in errInvalidParam and a failure to set the protocol version. This means
// no TLS 1.3 on macOS and iOS.
switch (configuration.protocol) {
case QSsl::TlsV1_3:
case QSsl::TlsV1_3OrLater:
qCWarning(lcSsl) << plainSocket << "SecureTransport does not support TLS 1.3";
return false;
default:;
}
OSStatus err = errSecSuccess;
if (configuration.protocol == QSsl::SslV3) {

View File

@ -180,6 +180,8 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSL_CIPHER(const SSL_CIPHER
ciph.d->protocol = QSsl::TlsV1_1;
else if (protoString == QLatin1String("TLSv1.2"))
ciph.d->protocol = QSsl::TlsV1_2;
else if (protoString == QLatin1String("TLSv1.3"))
ciph.d->protocol = QSsl::TlsV1_3;
if (descriptionList.at(2).startsWith(QLatin1String("Kx=")))
ciph.d->keyExchangeMethod = descriptionList.at(2).mid(3).toString();
@ -291,6 +293,8 @@ long QSslSocketBackendPrivate::setupOpenSslOptions(QSsl::SslProtocol protocol, Q
options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1;
else if (protocol == QSsl::TlsV1_2OrLater)
options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1;
else if (protocol == QSsl::TlsV1_3OrLater)
options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2;
#endif
else
options = SSL_OP_ALL;
@ -1299,6 +1303,8 @@ QSsl::SslProtocol QSslSocketBackendPrivate::sessionProtocol() const
return QSsl::TlsV1_1;
case 0x303:
return QSsl::TlsV1_2;
case 0x304:
return QSsl::TlsV1_3;
}
return QSsl::UnknownProtocol;

View File

@ -130,6 +130,10 @@ const char *q_OpenSSL_version(int type);
unsigned long q_SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session);
unsigned long q_SSL_set_options(SSL *s, unsigned long op);
#ifdef TLS1_3_VERSION
int q_SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str);
#endif
#if QT_CONFIG(dtls)
// Functions and types required for DTLS support:
extern "C"

View File

@ -161,6 +161,7 @@ DEFINEFUNC(void, OPENSSL_sk_free, OPENSSL_STACK *a, a, return, DUMMYARG)
DEFINEFUNC2(void *, OPENSSL_sk_value, OPENSSL_STACK *a, a, int b, b, return nullptr, return)
DEFINEFUNC(int, SSL_session_reused, SSL *a, a, return 0, return)
DEFINEFUNC2(unsigned long, SSL_CTX_set_options, SSL_CTX *ctx, ctx, unsigned long op, op, return 0, return)
DEFINEFUNC2(int, SSL_CTX_set_ciphersuites, SSL_CTX *ctx, ctx, const char *str, str, return 0, return)
DEFINEFUNC3(size_t, SSL_get_client_random, SSL *a, a, unsigned char *out, out, size_t outlen, outlen, return 0, return)
DEFINEFUNC3(size_t, SSL_SESSION_get_master_key, const SSL_SESSION *ses, ses, unsigned char *out, out, size_t outlen, outlen, return 0, return)
DEFINEFUNC6(int, CRYPTO_get_ex_new_index, int class_index, class_index, long argl, argl, void *argp, argp, CRYPTO_EX_new *new_func, new_func, CRYPTO_EX_dup *dup_func, dup_func, CRYPTO_EX_free *free_func, free_func, return -1, return)
@ -966,6 +967,9 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(OPENSSL_sk_value)
RESOLVEFUNC(DH_get0_pqg)
RESOLVEFUNC(SSL_CTX_set_options)
#ifdef TLS1_3_VERSION
RESOLVEFUNC(SSL_CTX_set_ciphersuites)
#endif // TLS 1.3 or OpenSSL > 1.1.1
RESOLVEFUNC(SSL_get_client_random)
RESOLVEFUNC(SSL_SESSION_get_master_key)
RESOLVEFUNC(SSL_session_reused)

View File

@ -251,6 +251,8 @@ void QSslSocketBackendPrivate::startClientEncryption()
case QSsl::TlsV1_0OrLater:
case QSsl::TlsV1_1OrLater:
case QSsl::TlsV1_2OrLater:
case QSsl::TlsV1_3:
case QSsl::TlsV1_3OrLater:
// TlsV1_0OrLater, TlsV1_1OrLater and TlsV1_2OrLater are disabled on WinRT
// because there is no good way to map them to the native API.
setErrorAndEmit(QAbstractSocket::SslInvalidUserDataError,

View File

@ -340,12 +340,17 @@ QCocoaScreen *QCocoaIntegration::screenForNSScreen(NSScreen *nsScreen)
bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) const
{
switch (cap) {
case ThreadedPixmaps:
#ifndef QT_NO_OPENGL
case OpenGL:
case ThreadedOpenGL:
// AppKit expects rendering to happen on the main thread, and we can
// easily end up in situations where rendering on secondary threads
// will result in visual artifacts, bugs, or even deadlocks, when
// building with SDK 10.14 or higher which enbles view layer-backing.
return QMacVersion::buildSDK() < QOperatingSystemVersion(QOperatingSystemVersion::MacOSMojave);
case OpenGL:
case BufferQueueingOpenGL:
#endif
case ThreadedPixmaps:
case WindowMasks:
case MultipleWindows:
case ForeignWindows:

View File

@ -71,7 +71,7 @@
@end
@interface QT_MANGLE_NAMESPACE(QNSView) (Drawing) <CALayerDelegate>
- (BOOL)wantsLayerHelper;
- (void)initDrawing;
@end
@interface QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper) : NSObject
@ -152,19 +152,8 @@
self.focusRingType = NSFocusRingTypeNone;
self.cursor = nil;
self.wantsLayer = [self wantsLayerHelper];
// Enable high-DPI OpenGL for retina displays. Enabling has the side
// effect that Cocoa will start calling glViewport(0, 0, width, height),
// overriding any glViewport calls in application code. This is usually not a
// problem, except if the application wants to have a "custom" viewport.
// (like the hellogl example)
if (m_platformWindow->window()->supportsOpenGL()) {
self.wantsBestResolutionOpenGLSurface = qt_mac_resolveOption(YES, m_platformWindow->window(),
"_q_mac_wantsBestResolutionOpenGLSurface", "QT_MAC_WANTS_BEST_RESOLUTION_OPENGL_SURFACE");
// See also QCocoaGLContext::makeCurrent for software renderer workarounds.
}
[self initDrawing];
[self registerDragTypes];
[[NSNotificationCenter defaultCenter] addObserver:self

View File

@ -41,6 +41,24 @@
@implementation QT_MANGLE_NAMESPACE(QNSView) (Drawing)
- (void)initDrawing
{
self.wantsLayer = [self layerExplicitlyRequested]
|| [self shouldUseMetalLayer]
|| [self layerEnabledByMacOS];
// Enable high-DPI OpenGL for retina displays. Enabling has the side
// effect that Cocoa will start calling glViewport(0, 0, width, height),
// overriding any glViewport calls in application code. This is usually not a
// problem, except if the application wants to have a "custom" viewport.
// (like the hellogl example)
if (m_platformWindow->window()->supportsOpenGL()) {
self.wantsBestResolutionOpenGLSurface = qt_mac_resolveOption(YES, m_platformWindow->window(),
"_q_mac_wantsBestResolutionOpenGLSurface", "QT_MAC_WANTS_BEST_RESOLUTION_OPENGL_SURFACE");
// See also QCocoaGLContext::makeCurrent for software renderer workarounds.
}
}
- (BOOL)isOpaque
{
if (!m_platformWindow)
@ -71,6 +89,33 @@
m_platformWindow->handleExposeEvent(exposedRegion);
}
- (BOOL)layerEnabledByMacOS
{
// AppKit has its own logic for this, but if we rely on that, our layers are created
// by AppKit at a point where we've already set up other parts of the platform plugin
// based on the presence of layers or not. Once we've rewritten these parts to support
// dynamically picking up layer enablement we can let AppKit do its thing.
return QMacVersion::buildSDK() >= QOperatingSystemVersion::MacOSMojave
&& QMacVersion::currentRuntime() >= QOperatingSystemVersion::MacOSMojave;
}
- (BOOL)layerExplicitlyRequested
{
static bool wantsLayer = [&]() {
int wantsLayer = qt_mac_resolveOption(-1, m_platformWindow->window(),
"_q_mac_wantsLayer", "QT_MAC_WANTS_LAYER");
if (wantsLayer != -1 && [self layerEnabledByMacOS]) {
qCWarning(lcQpaDrawing) << "Layer-backing can not be explicitly controlled on 10.14 when built against the 10.14 SDK";
return true;
}
return wantsLayer == 1;
}();
return wantsLayer;
}
- (BOOL)shouldUseMetalLayer
{
// MetalSurface needs a layer, and so does VulkanSurface (via MoltenVK)
@ -78,18 +123,6 @@
return surfaceType == QWindow::MetalSurface || surfaceType == QWindow::VulkanSurface;
}
- (BOOL)wantsLayerHelper
{
Q_ASSERT(m_platformWindow);
bool wantsLayer = qt_mac_resolveOption(true, m_platformWindow->window(),
"_q_mac_wantsLayer", "QT_MAC_WANTS_LAYER");
bool layerForSurfaceType = [self shouldUseMetalLayer];
return wantsLayer || layerForSurfaceType;
}
- (CALayer *)makeBackingLayer
{
if ([self shouldUseMetalLayer]) {
@ -115,6 +148,14 @@
return [super makeBackingLayer];
}
- (void)setLayer:(CALayer *)layer
{
qCDebug(lcQpaDrawing) << "Making" << self << "layer-backed with" << layer
<< "due to being" << ([self layerExplicitlyRequested] ? "explicitly requested"
: [self shouldUseMetalLayer] ? "needed by surface type" : "enabled by macOS");
[super setLayer:layer];
}
- (NSViewLayerContentsRedrawPolicy)layerContentsRedrawPolicy
{
// We need to set this explicitly since the super implementation

View File

@ -198,6 +198,7 @@ QPlatformBackingStore *QEglFSIntegration::createPlatformBackingStore(QWindow *wi
static_cast<QEglFSWindow *>(window->handle())->setBackingStore(bs);
return bs;
#else
Q_UNUSED(window);
return nullptr;
#endif
}

View File

@ -183,6 +183,8 @@ void QEglFSScreen::handleCursorMove(const QPoint &pos)
if (enter && leave)
QWindowSystemInterface::handleEnterLeaveEvent(enter, leave, enter->mapFromGlobal(pos), pos);
#else
Q_UNUSED(pos);
#endif
}
@ -231,7 +233,13 @@ QPixmap QEglFSScreen::grabWindow(WId wid, int x, int y, int width, int height) c
return QPixmap::fromImage(img).copy(rect);
}
}
#endif // QT_NO_OPENGL
#else // QT_NO_OPENGL
Q_UNUSED(wid);
Q_UNUSED(x);
Q_UNUSED(y);
Q_UNUSED(width);
Q_UNUSED(height);
#endif
return QPixmap();
}

View File

@ -132,6 +132,7 @@ QPlatformBackingStore *QMinimalEglIntegration::createPlatformBackingStore(QWindo
#ifndef QT_NO_OPENGL
return new QMinimalEglBackingStore(window);
#else
Q_UNUSED(window);
return nullptr;
#endif
}

View File

@ -242,7 +242,18 @@ QRectF QWindowsInputContext::keyboardRect() const
bool QWindowsInputContext::isInputPanelVisible() const
{
HWND hwnd = getVirtualKeyboardWindowHandle();
return hwnd && ::IsWindowEnabled(hwnd) && ::IsWindowVisible(hwnd);
if (hwnd && ::IsWindowEnabled(hwnd) && ::IsWindowVisible(hwnd))
return true;
// check if the Input Method Editor is open
if (inputMethodAccepted()) {
if (QWindow *window = QGuiApplication::focusWindow()) {
if (QWindowsWindow *platformWindow = QWindowsWindow::windowsWindowOf(window)) {
if (HIMC himc = ImmGetContext(platformWindow->handle()))
return ImmGetOpenStatus(himc);
}
}
}
return false;
}
void QWindowsInputContext::showInputPanel()

View File

@ -336,6 +336,38 @@ static void getMouseEventInfo(UINT message, POINTER_BUTTON_CHANGE_TYPE changeTyp
*mouseButton = buttonMapping.value(changeType, Qt::NoButton);
}
static Qt::MouseButtons mouseButtonsFromPointerFlags(POINTER_FLAGS pointerFlags)
{
Qt::MouseButtons result = Qt::NoButton;
if (pointerFlags & POINTER_FLAG_FIRSTBUTTON)
result |= Qt::LeftButton;
if (pointerFlags & POINTER_FLAG_SECONDBUTTON)
result |= Qt::RightButton;
if (pointerFlags & POINTER_FLAG_THIRDBUTTON)
result |= Qt::MiddleButton;
if (pointerFlags & POINTER_FLAG_FOURTHBUTTON)
result |= Qt::XButton1;
if (pointerFlags & POINTER_FLAG_FIFTHBUTTON)
result |= Qt::XButton2;
return result;
}
static Qt::MouseButtons mouseButtonsFromKeyState(WPARAM keyState)
{
Qt::MouseButtons result = Qt::NoButton;
if (keyState & MK_LBUTTON)
result |= Qt::LeftButton;
if (keyState & MK_RBUTTON)
result |= Qt::RightButton;
if (keyState & MK_MBUTTON)
result |= Qt::MiddleButton;
if (keyState & MK_XBUTTON1)
result |= Qt::XButton1;
if (keyState & MK_XBUTTON2)
result |= Qt::XButton2;
return result;
}
static QWindow *getWindowUnderPointer(QWindow *window, QPoint globalPos)
{
QWindow *currentWindowUnderPointer = QWindowsScreen::windowAt(globalPos, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
@ -405,23 +437,6 @@ QTouchDevice *QWindowsPointerHandler::ensureTouchDevice()
return m_touchDevice;
}
Qt::MouseButtons QWindowsPointerHandler::queryMouseButtons()
{
Qt::MouseButtons result = 0;
const bool mouseSwapped = GetSystemMetrics(SM_SWAPBUTTON);
if (GetAsyncKeyState(VK_LBUTTON) < 0)
result |= mouseSwapped ? Qt::RightButton: Qt::LeftButton;
if (GetAsyncKeyState(VK_RBUTTON) < 0)
result |= mouseSwapped ? Qt::LeftButton : Qt::RightButton;
if (GetAsyncKeyState(VK_MBUTTON) < 0)
result |= Qt::MidButton;
if (GetAsyncKeyState(VK_XBUTTON1) < 0)
result |= Qt::XButton1;
if (GetAsyncKeyState(VK_XBUTTON2) < 0)
result |= Qt::XButton2;
return result;
}
bool QWindowsPointerHandler::translateMouseTouchPadEvent(QWindow *window, HWND hwnd,
QtWindows::WindowsEventType et,
MSG msg, PVOID vPointerInfo)
@ -430,7 +445,7 @@ bool QWindowsPointerHandler::translateMouseTouchPadEvent(QWindow *window, HWND h
const QPoint globalPos = QPoint(pointerInfo->ptPixelLocation.x, pointerInfo->ptPixelLocation.y);
const QPoint localPos = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPos);
const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers();
const Qt::MouseButtons mouseButtons = queryMouseButtons();
const Qt::MouseButtons mouseButtons = mouseButtonsFromPointerFlags(pointerInfo->pointerFlags);
QWindow *currentWindowUnderPointer = getWindowUnderPointer(window, globalPos);
QWindowsWindow *platformWindow = static_cast<QWindowsWindow *>(window->handle());
@ -452,6 +467,11 @@ bool QWindowsPointerHandler::translateMouseTouchPadEvent(QWindow *window, HWND h
keyModifiers, Qt::MouseEventNotSynthesized);
return false; // To allow window dragging, etc.
} else {
if (eventType == QEvent::MouseButtonPress) {
// Implement "Click to focus" for native child windows (unless it is a native widget window).
if (!window->isTopLevel() && !window->inherits("QWidgetWindow") && QGuiApplication::focusWindow() != window)
window->requestActivate();
}
if (currentWindowUnderPointer != m_windowUnderPointer) {
if (m_windowUnderPointer && m_windowUnderPointer == m_currentWindow) {
QWindowSystemInterface::handleLeaveEvent(m_windowUnderPointer);
@ -797,7 +817,7 @@ bool QWindowsPointerHandler::translateMouseEvent(QWindow *window, HWND hwnd, QtW
m_windowUnderPointer = currentWindowUnderPointer;
}
const Qt::MouseButtons mouseButtons = queryMouseButtons();
const Qt::MouseButtons mouseButtons = mouseButtonsFromKeyState(msg.wParam);
if (!discardEvent)
QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, mouseButtons, Qt::NoButton, QEvent::MouseMove,

View File

@ -61,7 +61,6 @@ public:
bool translateMouseEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result);
QTouchDevice *touchDevice() const { return m_touchDevice; }
QTouchDevice *ensureTouchDevice();
Qt::MouseButtons queryMouseButtons();
QWindow *windowUnderMouse() const { return m_windowUnderPointer.data(); }
void clearWindowUnderMouse() { m_windowUnderPointer = nullptr; }

View File

@ -707,7 +707,7 @@ bool readInputFile(Options *options)
return false;
}
options->sdkPath = sdkPath.toString();
options->sdkPath = QDir::fromNativeSeparators(sdkPath.toString());
if (options->androidPlatform.isEmpty()) {
options->androidPlatform = detectLatestAndroidPlatform(options->sdkPath);

View File

@ -3,3 +3,4 @@ windows
[registerTimer]
windows
winrt
osx

View File

@ -92,77 +92,151 @@ void tst_QEventDispatcher::initTestCase()
}
}
class TimerManager {
Q_DISABLE_COPY(TimerManager)
public:
TimerManager(QAbstractEventDispatcher *eventDispatcher, QObject *parent)
: m_eventDispatcher(eventDispatcher), m_parent(parent)
{
}
~TimerManager()
{
if (!registeredTimers().isEmpty())
m_eventDispatcher->unregisterTimers(m_parent);
}
TimerManager(TimerManager &&) = delete;
TimerManager &operator=(TimerManager &&) = delete;
int preciseTimerId() const { return m_preciseTimerId; }
int coarseTimerId() const { return m_coarseTimerId; }
int veryCoarseTimerId() const { return m_veryCoarseTimerId; }
bool foundPrecise() const { return m_preciseTimerId > 0; }
bool foundCoarse() const { return m_coarseTimerId > 0; }
bool foundVeryCoarse() const { return m_veryCoarseTimerId > 0; }
QList<QAbstractEventDispatcher::TimerInfo> registeredTimers() const
{
return m_eventDispatcher->registeredTimers(m_parent);
}
void registerAll()
{
// start 3 timers, each with the different timer types and different intervals
m_preciseTimerId = m_eventDispatcher->registerTimer(
PreciseTimerInterval, Qt::PreciseTimer, m_parent);
m_coarseTimerId = m_eventDispatcher->registerTimer(
CoarseTimerInterval, Qt::CoarseTimer, m_parent);
m_veryCoarseTimerId = m_eventDispatcher->registerTimer(
VeryCoarseTimerInterval, Qt::VeryCoarseTimer, m_parent);
QVERIFY(m_preciseTimerId > 0);
QVERIFY(m_coarseTimerId > 0);
QVERIFY(m_veryCoarseTimerId > 0);
findTimers();
}
void unregister(int timerId)
{
m_eventDispatcher->unregisterTimer(timerId);
findTimers();
}
void unregisterAll()
{
m_eventDispatcher->unregisterTimers(m_parent);
findTimers();
}
private:
void findTimers()
{
bool foundPrecise = false;
bool foundCoarse = false;
bool foundVeryCoarse = false;
const QList<QAbstractEventDispatcher::TimerInfo> timers = registeredTimers();
for (int i = 0; i < timers.count(); ++i) {
const QAbstractEventDispatcher::TimerInfo &timerInfo = timers.at(i);
if (timerInfo.timerId == m_preciseTimerId) {
QCOMPARE(timerInfo.interval, int(PreciseTimerInterval));
QCOMPARE(timerInfo.timerType, Qt::PreciseTimer);
foundPrecise = true;
} else if (timerInfo.timerId == m_coarseTimerId) {
QCOMPARE(timerInfo.interval, int(CoarseTimerInterval));
QCOMPARE(timerInfo.timerType, Qt::CoarseTimer);
foundCoarse = true;
} else if (timerInfo.timerId == m_veryCoarseTimerId) {
QCOMPARE(timerInfo.interval, int(VeryCoarseTimerInterval));
QCOMPARE(timerInfo.timerType, Qt::VeryCoarseTimer);
foundVeryCoarse = true;
}
}
if (!foundPrecise)
m_preciseTimerId = -1;
if (!foundCoarse)
m_coarseTimerId = -1;
if (!foundVeryCoarse)
m_veryCoarseTimerId = -1;
}
QAbstractEventDispatcher *m_eventDispatcher = nullptr;
int m_preciseTimerId = -1;
int m_coarseTimerId = -1;
int m_veryCoarseTimerId = -1;
QObject *m_parent = nullptr;
};
// test that the eventDispatcher's timer implementation is complete and working
void tst_QEventDispatcher::registerTimer()
{
#define FIND_TIMERS() \
do { \
foundPrecise = false; \
foundCoarse = false; \
foundVeryCoarse = false; \
for (int i = 0; i < registeredTimers.count(); ++i) { \
const QAbstractEventDispatcher::TimerInfo &timerInfo = registeredTimers.at(i); \
if (timerInfo.timerId == preciseTimerId) { \
QCOMPARE(timerInfo.interval, int(PreciseTimerInterval)); \
QCOMPARE(timerInfo.timerType, Qt::PreciseTimer); \
foundPrecise = true; \
} else if (timerInfo.timerId == coarseTimerId) { \
QCOMPARE(timerInfo.interval, int(CoarseTimerInterval)); \
QCOMPARE(timerInfo.timerType, Qt::CoarseTimer); \
foundCoarse = true; \
} else if (timerInfo.timerId == veryCoarseTimerId) { \
QCOMPARE(timerInfo.interval, int(VeryCoarseTimerInterval)); \
QCOMPARE(timerInfo.timerType, Qt::VeryCoarseTimer); \
foundVeryCoarse = true; \
} \
} \
} while (0)
// start 3 timers, each with the different timer types and different intervals
int preciseTimerId = eventDispatcher->registerTimer(PreciseTimerInterval, Qt::PreciseTimer, this);
int coarseTimerId = eventDispatcher->registerTimer(CoarseTimerInterval, Qt::CoarseTimer, this);
int veryCoarseTimerId = eventDispatcher->registerTimer(VeryCoarseTimerInterval, Qt::VeryCoarseTimer, this);
QVERIFY(preciseTimerId > 0);
QVERIFY(coarseTimerId > 0);
QVERIFY(veryCoarseTimerId > 0);
TimerManager timers(eventDispatcher, this);
timers.registerAll();
if (QTest::currentTestFailed())
return;
// check that all 3 are present in the eventDispatcher's registeredTimer() list
QList<QAbstractEventDispatcher::TimerInfo> registeredTimers = eventDispatcher->registeredTimers(this);
QCOMPARE(registeredTimers.count(), 3);
bool foundPrecise, foundCoarse, foundVeryCoarse;
FIND_TIMERS();
QVERIFY(foundPrecise && foundCoarse && foundVeryCoarse);
QCOMPARE(timers.registeredTimers().count(), 3);
QVERIFY(timers.foundPrecise());
QVERIFY(timers.foundCoarse());
QVERIFY(timers.foundVeryCoarse());
// process events, waiting for the next event... this should only fire the precise timer
receivedEventType = -1;
timerIdFromEvent = -1;
QTRY_COMPARE_WITH_TIMEOUT(receivedEventType, int(QEvent::Timer), PreciseTimerInterval * 2);
QCOMPARE(timerIdFromEvent, preciseTimerId);
QCOMPARE(timerIdFromEvent, timers.preciseTimerId());
// now unregister it and make sure it's gone
eventDispatcher->unregisterTimer(preciseTimerId);
registeredTimers = eventDispatcher->registeredTimers(this);
QCOMPARE(registeredTimers.count(), 2);
FIND_TIMERS();
QVERIFY(!foundPrecise && foundCoarse && foundVeryCoarse);
timers.unregister(timers.preciseTimerId());
if (QTest::currentTestFailed())
return;
QCOMPARE(timers.registeredTimers().count(), 2);
QVERIFY(!timers.foundPrecise());
QVERIFY(timers.foundCoarse());
QVERIFY(timers.foundVeryCoarse());
// do the same again for the coarse timer
receivedEventType = -1;
timerIdFromEvent = -1;
QTRY_COMPARE_WITH_TIMEOUT(receivedEventType, int(QEvent::Timer), CoarseTimerInterval * 2);
QCOMPARE(timerIdFromEvent, coarseTimerId);
QCOMPARE(timerIdFromEvent, timers.coarseTimerId());
// now unregister it and make sure it's gone
eventDispatcher->unregisterTimer(coarseTimerId);
registeredTimers = eventDispatcher->registeredTimers(this);
QCOMPARE(registeredTimers.count(), 1);
FIND_TIMERS();
QVERIFY(!foundPrecise && !foundCoarse && foundVeryCoarse);
timers.unregister(timers.coarseTimerId());
if (QTest::currentTestFailed())
return;
QCOMPARE(timers.registeredTimers().count(), 1);
QVERIFY(!timers.foundPrecise());
QVERIFY(!timers.foundCoarse());
QVERIFY(timers.foundVeryCoarse());
// not going to wait for the VeryCoarseTimer, would take too long, just unregister it
eventDispatcher->unregisterTimers(this);
registeredTimers = eventDispatcher->registeredTimers(this);
QVERIFY(registeredTimers.isEmpty());
#undef FIND_TIMERS
timers.unregisterAll();
if (QTest::currentTestFailed())
return;
QVERIFY(timers.registeredTimers().isEmpty());
}
void tst_QEventDispatcher::sendPostedEvents_data()

View File

@ -1025,6 +1025,26 @@ void tst_QSslSocket::protocol()
socket->abort();
}
#endif
#ifdef TLS1_3_VERSION
{
// qt-test-server probably doesn't allow TLSV1.3
socket->setProtocol(QSsl::TlsV1_3);
QCOMPARE(socket->protocol(), QSsl::TlsV1_3);
socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
if (setProxy && !socket->waitForEncrypted())
QSKIP("TLS 1.3 is not supported by the test server or the test is flaky - see QTBUG-29941");
QCOMPARE(socket->protocol(), QSsl::TlsV1_3);
socket->abort();
QCOMPARE(socket->protocol(), QSsl::TlsV1_3);
socket->connectToHost(QtNetworkSettings::serverName(), 443);
QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString()));
socket->startClientEncryption();
if (setProxy && !socket->waitForEncrypted())
QSKIP("TLS 1.3 is not supported by the test server or the test is flaky - see QTBUG-29941");
QCOMPARE(socket->sessionProtocol(), QSsl::TlsV1_3);
socket->abort();
}
#endif // TLS1_3_VERSION
#if !defined(OPENSSL_NO_SSL2) && !defined(QT_SECURETRANSPORT)
{
// qt-test-server allows SSLV2.
@ -1279,7 +1299,9 @@ void tst_QSslSocket::protocolServerSide_data()
QTest::newRow("tls1.0orlater-tls1.0") << QSsl::TlsV1_0OrLater << QSsl::TlsV1_0 << true;
QTest::newRow("tls1.0orlater-tls1.1") << QSsl::TlsV1_0OrLater << QSsl::TlsV1_1 << true;
QTest::newRow("tls1.0orlater-tls1.2") << QSsl::TlsV1_0OrLater << QSsl::TlsV1_2 << true;
#ifdef TLS1_3_VERSION
QTest::newRow("tls1.0orlater-tls1.3") << QSsl::TlsV1_0OrLater << QSsl::TlsV1_3 << true;
#endif
#if !defined(OPENSSL_NO_SSL2) && !defined(QT_SECURETRANSPORT)
QTest::newRow("tls1.1orlater-ssl2") << QSsl::TlsV1_1OrLater << QSsl::SslV2 << false;
#endif
@ -1290,7 +1312,9 @@ void tst_QSslSocket::protocolServerSide_data()
QTest::newRow("tls1.1orlater-tls1.0") << QSsl::TlsV1_1OrLater << QSsl::TlsV1_0 << false;
QTest::newRow("tls1.1orlater-tls1.1") << QSsl::TlsV1_1OrLater << QSsl::TlsV1_1 << true;
QTest::newRow("tls1.1orlater-tls1.2") << QSsl::TlsV1_1OrLater << QSsl::TlsV1_2 << true;
#ifdef TLS1_3_VERSION
QTest::newRow("tls1.1orlater-tls1.3") << QSsl::TlsV1_1OrLater << QSsl::TlsV1_3 << true;
#endif
#if !defined(OPENSSL_NO_SSL2) && !defined(QT_SECURETRANSPORT)
QTest::newRow("tls1.2orlater-ssl2") << QSsl::TlsV1_2OrLater << QSsl::SslV2 << false;
#endif
@ -1300,6 +1324,21 @@ void tst_QSslSocket::protocolServerSide_data()
QTest::newRow("tls1.2orlater-tls1.0") << QSsl::TlsV1_2OrLater << QSsl::TlsV1_0 << false;
QTest::newRow("tls1.2orlater-tls1.1") << QSsl::TlsV1_2OrLater << QSsl::TlsV1_1 << false;
QTest::newRow("tls1.2orlater-tls1.2") << QSsl::TlsV1_2OrLater << QSsl::TlsV1_2 << true;
#ifdef TLS1_3_VERSION
QTest::newRow("tls1.2orlater-tls1.3") << QSsl::TlsV1_2OrLater << QSsl::TlsV1_3 << true;
#endif
#ifdef TLS1_3_VERSION
#if !defined(OPENSSL_NO_SSL2) && !defined(QT_SECURETRANSPORT)
QTest::newRow("tls1.3orlater-ssl2") << QSsl::TlsV1_3OrLater << QSsl::SslV2 << false;
#endif
#if !defined(OPENSSL_NO_SSL3)
QTest::newRow("tls1.3orlater-ssl3") << QSsl::TlsV1_3OrLater << QSsl::SslV3 << false;
#endif
QTest::newRow("tls1.3orlater-tls1.0") << QSsl::TlsV1_3OrLater << QSsl::TlsV1_0 << false;
QTest::newRow("tls1.3orlater-tls1.1") << QSsl::TlsV1_3OrLater << QSsl::TlsV1_1 << false;
QTest::newRow("tls1.3orlater-tls1.2") << QSsl::TlsV1_3OrLater << QSsl::TlsV1_2 << false;
QTest::newRow("tls1.3orlater-tls1.3") << QSsl::TlsV1_3OrLater << QSsl::TlsV1_3 << true;
#endif // TLS1_3_VERSION
QTest::newRow("any-tls1.0") << QSsl::AnyProtocol << QSsl::TlsV1_0 << true;
QTest::newRow("any-tls1ssl3") << QSsl::AnyProtocol << QSsl::TlsV1SslV3 << true;
@ -3511,7 +3550,12 @@ protected:
socket = new QSslSocket(this);
socket->setSslConfiguration(config);
socket->setPeerVerifyMode(peerVerifyMode);
socket->setProtocol(protocol);
if (QSslSocket::sslLibraryVersionNumber() > 0x10101000L) {
// FIXME. With OpenSSL 1.1.1 and TLS 1.3 PSK auto-test is broken.
socket->setProtocol(QSsl::TlsV1_2);
} else {
socket->setProtocol(protocol);
}
if (ignoreSslErrors)
connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot()));
@ -3891,6 +3935,11 @@ void tst_QSslSocket::pskServer()
return;
QSslSocket socket;
#ifdef TLS1_3_VERSION
// FIXME: with OpenSSL 1.1.1 (thus TLS 1.3) test is known to fail
// due to the different PSK mechanism (?) - to be investigated ASAP.
socket.setProtocol(QSsl::TlsV1_2);
#endif
this->socket = &socket;
QSignalSpy connectedSpy(&socket, SIGNAL(connected()));
@ -3976,6 +4025,11 @@ void tst_QSslSocket::signatureAlgorithm_data()
if (QSslSocket::sslLibraryVersionNumber() < 0x10002000L)
QSKIP("Signature algorithms cannot be tested with OpenSSL < 1.0.2");
if (QSslSocket::sslLibraryVersionNumber() >= 0x10101000L) {
// FIXME: investigate if this test makes any sense with TLS 1.3.
QSKIP("Test is not valid for TLS 1.3/OpenSSL 1.1.1");
}
QTest::addColumn<QByteArrayList>("serverSigAlgPairs");
QTest::addColumn<QSsl::SslProtocol>("serverProtocol");
QTest::addColumn<QByteArrayList>("clientSigAlgPairs");

View File

@ -355,6 +355,11 @@ void tst_QGLThreads::renderInThread()
QFETCH(bool, resize);
QFETCH(bool, update);
#if defined(Q_OS_MACOS)
if (resize)
QSKIP("gldSetZero crashes in render thread, QTBUG-68524");
#endif
ThreadSafeGLWidget widget;
widget.resize(200, 200);
SceneRenderingThread thread(&widget);