Merge remote-tracking branch 'origin/5.12.0' into 5.12
Change-Id: Ic1dd39044e19f50e1068d4ac70dacaad6440e570
This commit is contained in:
commit
37d3bc9ad7
468
dist/changes-5.12.0
vendored
Normal file
468
dist/changes-5.12.0
vendored
Normal 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.
|
@ -1101,8 +1101,6 @@ QString
|
|||||||
MakefileGenerator::prlFileName(bool fixify)
|
MakefileGenerator::prlFileName(bool fixify)
|
||||||
{
|
{
|
||||||
QString ret = project->first("PRL_TARGET") + Option::prl_ext;
|
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(fixify) {
|
||||||
if(!project->isEmpty("DESTDIR"))
|
if(!project->isEmpty("DESTDIR"))
|
||||||
ret.prepend(project->first("DESTDIR").toQString());
|
ret.prepend(project->first("DESTDIR").toQString());
|
||||||
|
@ -1225,6 +1225,8 @@ void UnixMakefileGenerator::init2()
|
|||||||
else
|
else
|
||||||
ar_cmd.append("$(AR) $(TARGETA) $(OBJECTS)");
|
ar_cmd.append("$(AR) $(TARGETA) $(OBJECTS)");
|
||||||
if (!project->isEmpty("QMAKE_BUNDLE")) {
|
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");
|
ProString bundle_loc = project->first("QMAKE_BUNDLE_LOCATION");
|
||||||
if(!bundle_loc.isEmpty() && !bundle_loc.startsWith("/"))
|
if(!bundle_loc.isEmpty() && !bundle_loc.startsWith("/"))
|
||||||
bundle_loc.prepend("/");
|
bundle_loc.prepend("/");
|
||||||
|
22
src/3rdparty/angle/SYSTEMINFO_LICENSE
vendored
Normal file
22
src/3rdparty/angle/SYSTEMINFO_LICENSE
vendored
Normal 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
27
src/3rdparty/angle/TRACEEVENT_LICENSE
vendored
Normal 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.
|
2
src/3rdparty/libjpeg/qt_attribution.json
vendored
2
src/3rdparty/libjpeg/qt_attribution.json
vendored
@ -2,7 +2,7 @@
|
|||||||
"Id": "libjpeg",
|
"Id": "libjpeg",
|
||||||
"Name": "LibJPEG-turbo",
|
"Name": "LibJPEG-turbo",
|
||||||
"QDocModule": "qtgui",
|
"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",
|
"Description": "The Independent JPEG Group's JPEG software",
|
||||||
"Homepage": "http://libjpeg-turbo.virtualgl.org/",
|
"Homepage": "http://libjpeg-turbo.virtualgl.org/",
|
||||||
|
2
src/3rdparty/libpng/qt_attribution.json
vendored
2
src/3rdparty/libpng/qt_attribution.json
vendored
@ -2,7 +2,7 @@
|
|||||||
"Id": "libpng",
|
"Id": "libpng",
|
||||||
"Name": "LibPNG",
|
"Name": "LibPNG",
|
||||||
"QDocModule": "qtgui",
|
"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.",
|
"Description": "libpng is the official PNG reference library.",
|
||||||
"Homepage": "http://www.libpng.org/pub/png/libpng.html",
|
"Homepage": "http://www.libpng.org/pub/png/libpng.html",
|
||||||
|
21
src/3rdparty/sha3/BRG_ENDIAN_LICENSE
vendored
21
src/3rdparty/sha3/BRG_ENDIAN_LICENSE
vendored
@ -1,21 +1,14 @@
|
|||||||
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)
|
The redistribution and use of this software (with or without changes)
|
||||||
is allowed without the payment of fees or royalties provided that:
|
is allowed without the payment of fees or royalties provided that:
|
||||||
|
|
||||||
1. source code distributions include the above copyright notice, this
|
source code distributions include the above copyright notice, this
|
||||||
list of conditions and the following disclaimer;
|
list of conditions and the following disclaimer;
|
||||||
|
|
||||||
2. binary distributions include the above copyright notice, this list
|
binary distributions include the above copyright notice, this list
|
||||||
of conditions and the following disclaimer in their documentation;
|
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
|
This software is provided 'as is' with no explicit or implied warranties
|
||||||
in respect of its properties, including, but not limited to, correctness
|
in respect of its operation, including, but not limited to, correctness
|
||||||
and/or fitness for purpose.
|
and fitness for purpose.
|
||||||
|
47
src/3rdparty/sha3/brg_endian.h
vendored
47
src/3rdparty/sha3/brg_endian.h
vendored
@ -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)
|
source code distributions include the above copyright notice, this
|
||||||
is allowed without the payment of fees or royalties provided that:
|
list of conditions and the following disclaimer;
|
||||||
|
|
||||||
1. source code distributions include the above copyright notice, this
|
binary distributions include the above copyright notice, this list
|
||||||
list of conditions and the following disclaimer;
|
of conditions and the following disclaimer in their documentation.
|
||||||
|
|
||||||
2. binary distributions include the above copyright notice, this list
|
This software is provided 'as is' with no explicit or implied warranties
|
||||||
of conditions and the following disclaimer in their documentation;
|
in respect of its operation, including, but not limited to, correctness
|
||||||
|
and fitness for purpose.
|
||||||
3. the name of the copyright holder is not used to endorse products
|
---------------------------------------------------------------------------
|
||||||
built using this software without specific written permission.
|
Issue Date: 20/12/2007
|
||||||
|
Changes for ARM 9/9/2010 [Downstream relative to Gladman's GitHub, upstream to Qt]
|
||||||
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
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _BRG_ENDIAN_H
|
#ifndef _BRG_ENDIAN_H
|
||||||
@ -32,7 +25,12 @@
|
|||||||
#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */
|
#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */
|
||||||
#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */
|
#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 */
|
/* Include files where endian defines and byteswap functions may reside */
|
||||||
#if defined( __sun )
|
#if defined( __sun )
|
||||||
# include <sys/isa_defs.h>
|
# include <sys/isa_defs.h>
|
||||||
@ -42,14 +40,13 @@
|
|||||||
defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
|
defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
|
||||||
# include <machine/endian.h>
|
# include <machine/endian.h>
|
||||||
#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
|
#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>
|
# include <endian.h>
|
||||||
# if !defined( __BEOS__ )
|
# if !defined( __BEOS__ )
|
||||||
# include <byteswap.h>
|
# include <byteswap.h>
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Now attempt to set the define for platform byte order using any */
|
/* Now attempt to set the define for platform byte order using any */
|
||||||
/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */
|
/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */
|
||||||
@ -134,7 +131,7 @@
|
|||||||
#elif 0 /* **** EDIT HERE IF NECESSARY **** */
|
#elif 0 /* **** EDIT HERE IF NECESSARY **** */
|
||||||
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
||||||
#else
|
#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
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
34
src/3rdparty/sha3/brg_endian.h.patch
vendored
Normal file
34
src/3rdparty/sha3/brg_endian.h.patch
vendored
Normal 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
|
8
src/3rdparty/sha3/qt_attribution.json
vendored
8
src/3rdparty/sha3/qt_attribution.json
vendored
@ -4,13 +4,15 @@
|
|||||||
"Name": "Secure Hash Algorithm SHA-3 - brg_endian",
|
"Name": "Secure Hash Algorithm SHA-3 - brg_endian",
|
||||||
"QDocModule": "qtcore",
|
"QDocModule": "qtcore",
|
||||||
"QtUsage": "Used in Qt Core (QCryptographicHash).",
|
"QtUsage": "Used in Qt Core (QCryptographicHash).",
|
||||||
|
"Files": "apply brg_endian.h.patch to upstream from https://github.com/BrianGladman/sha/",
|
||||||
"Files": "brg_endian.h",
|
"Files": "brg_endian.h",
|
||||||
|
|
||||||
"Description": "SHA-3, originally known as Keccak, is a cryptographic hash function.",
|
"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",
|
"LicenseFile": "BRG_ENDIAN_LICENSE",
|
||||||
"LicenseId": "BSD-3-Clause",
|
"LicenseId": "BSD-2-Clause",
|
||||||
"Copyright": "Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved."
|
"Copyright": "Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Id": "sha3_keccak",
|
"Id": "sha3_keccak",
|
||||||
|
BIN
src/3rdparty/wasm/DejaVuSans.ttf
vendored
BIN
src/3rdparty/wasm/DejaVuSans.ttf
vendored
Binary file not shown.
3
src/3rdparty/wasm/qt_attribution.json
vendored
3
src/3rdparty/wasm/qt_attribution.json
vendored
@ -24,9 +24,10 @@
|
|||||||
"Description": "The DejaVu fonts are a font family based on the Vera Fonts.",
|
"Description": "The DejaVu fonts are a font family based on the Vera Fonts.",
|
||||||
|
|
||||||
"Homepage": "https://dejavu-fonts.github.io/",
|
"Homepage": "https://dejavu-fonts.github.io/",
|
||||||
|
"Version": "2.37",
|
||||||
"License": "Bitstream Vera Font License",
|
"License": "Bitstream Vera Font License",
|
||||||
"LicenseFile": "DEJAVU-LICENSE",
|
"LicenseFile": "DEJAVU-LICENSE",
|
||||||
"Copyright": "Copyright (C) 2003 Bitstream,Inc
|
"Copyright": "Copyright (c) 2003 by Bitstream, Inc
|
||||||
Copyright (c) 2006 by Tavmjong Bah
|
Copyright (c) 2006 by Tavmjong Bah
|
||||||
(c) American Mathematical Society"
|
(c) American Mathematical Society"
|
||||||
}
|
}
|
||||||
|
@ -3796,7 +3796,7 @@ bool qunsetenv(const char *varName)
|
|||||||
dependent delayed translation in the given \a context with the given
|
dependent delayed translation in the given \a context with the given
|
||||||
\a comment.
|
\a comment.
|
||||||
The \a context is typically a class and also needs to be specified
|
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.
|
a short semantic tag to tell apart otherwise identical strings.
|
||||||
|
|
||||||
The macro tells lupdate to collect the string, and expands to an
|
The macro tells lupdate to collect the string, and expands to an
|
||||||
|
@ -435,6 +435,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
\keyword qglobalstatic-operator-type-ptr
|
||||||
\fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> QGlobalStatic<T, innerFunction, guard>::operator Type*()
|
\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
|
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
|
by this function. If the contents have already been destroyed, this
|
||||||
function will return a null pointer.
|
function will return a null pointer.
|
||||||
|
|
||||||
This function is equivalent to \l {operator Type *()}. It is provided for
|
This function is equivalent to \l {qglobalstatic-operator-type-ptr}
|
||||||
compatibility with the private Q_GLOBAL_STATIC implementation that existed
|
{operator Type *()}. It is provided for compatibility with the private
|
||||||
in Qt 4.x and 5.0. New code should avoid using it and should instead treat
|
Q_GLOBAL_STATIC implementation that existed in Qt 4.x and 5.0. New code
|
||||||
the object as a smart pointer.
|
should avoid using it and should instead treat the object as a smart
|
||||||
|
pointer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -3187,8 +3187,12 @@
|
|||||||
|
|
||||||
\value ScrollUpdate The scrolling distance has changed (default).
|
\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.
|
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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -64,6 +64,10 @@
|
|||||||
#include <float.h>
|
#include <float.h>
|
||||||
#endif
|
#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))
|
#if !defined(Q_CC_MSVC) && (defined(Q_OS_QNX) || defined(Q_CC_INTEL))
|
||||||
# include <math.h>
|
# include <math.h>
|
||||||
# ifdef isnan
|
# 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();
|
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)
|
# if defined(Q_CC_MSVC) && defined(Q_PROCESSOR_X86)
|
||||||
// We can use intrinsics for the unsigned operations with MSVC
|
// We can use intrinsics for the unsigned operations with MSVC
|
||||||
template <> inline bool add_overflow(unsigned v1, unsigned v2, unsigned *r)
|
template <> inline bool add_overflow(unsigned v1, unsigned v2, unsigned *r)
|
||||||
|
@ -1040,7 +1040,8 @@ QStringList QDir::nameFilters() const
|
|||||||
list of filters specified by \a nameFilters.
|
list of filters specified by \a nameFilters.
|
||||||
|
|
||||||
Each name filter is a wildcard (globbing) filter that understands
|
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
|
For example, the following code sets three name filters on a QDir
|
||||||
to ensure that only files with extensions typically used for C++
|
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
|
patterns in the list of \a filters; otherwise returns \c false. The
|
||||||
matching is case insensitive.
|
matching is case insensitive.
|
||||||
|
|
||||||
\sa {QRegularExpression Wildcard matching}, QRegularExpression::wildcardToRegularExpression(),
|
\sa {QRegularExpression#Wildcard matching}{QRegularExpression Wildcard Matching},
|
||||||
entryList(), entryInfoList()
|
entryList(), entryInfoList()
|
||||||
*/
|
*/
|
||||||
bool QDir::match(const QStringList &filters, const QString &fileName)
|
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.
|
contain multiple patterns separated by spaces or semicolons.
|
||||||
The matching is case insensitive.
|
The matching is case insensitive.
|
||||||
|
|
||||||
\sa {QRegularExpression wildcard matching}, QRegularExpression::wildcardToRegularExpression,
|
\sa {QRegularExpression#Wildcard matching}{QRegularExpression Wildcard Matching},
|
||||||
entryList(), entryInfoList()
|
entryList(), entryInfoList()
|
||||||
*/
|
*/
|
||||||
bool QDir::match(const QString &filter, const QString &fileName)
|
bool QDir::match(const QString &filter, const QString &fileName)
|
||||||
{
|
{
|
||||||
|
@ -112,12 +112,12 @@ QT_BEGIN_NAMESPACE
|
|||||||
\relates QProcess
|
\relates QProcess
|
||||||
|
|
||||||
Disables the
|
Disables the
|
||||||
\l {QProcess::start(const QString &, OpenMode)}{QProcess::start()}
|
\l {QProcess::start(const QString &, QIODevice::OpenMode)}
|
||||||
overload taking a single string.
|
{QProcess::start}() overload taking a single string.
|
||||||
In most cases where it is used, the user intends for the first argument
|
In most cases where it is used, the user intends for the first argument
|
||||||
to be treated atomically as per the other overload.
|
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
|
After the \a command string has been split and unquoted, this function
|
||||||
behaves like the overload which takes the arguments as a string list.
|
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)
|
bool QProcess::startDetached(const QString &command)
|
||||||
{
|
{
|
||||||
|
@ -720,6 +720,11 @@ QDeadlineTimer QDeadlineTimer::addNSecs(QDeadlineTimer dt, qint64 nsecs) Q_DECL_
|
|||||||
Returns the time remaining before the deadline.
|
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
|
// the rest of the functions are in qelapsedtimer_xxx.cpp
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
|
|
||||||
QT_USE_NAMESPACE
|
QT_USE_NAMESPACE
|
||||||
|
|
||||||
/*!
|
/*
|
||||||
During scroll view panning, and possibly other gestures, UIKit will
|
During scroll view panning, and possibly other gestures, UIKit will
|
||||||
request a switch to UITrackingRunLoopMode via GSEventPushRunLoopMode,
|
request a switch to UITrackingRunLoopMode via GSEventPushRunLoopMode,
|
||||||
which records the new runloop mode and stops the current runloop.
|
which records the new runloop mode and stops the current runloop.
|
||||||
|
@ -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
|
\since 5.12
|
||||||
\overload
|
\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.
|
handle to the connection.
|
||||||
|
|
||||||
This method is provided for convenience.
|
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()
|
\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
|
\since 5.12
|
||||||
\overload callOnTimeout()
|
\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.
|
event loop of \a context, and returns a handle to the connection.
|
||||||
|
|
||||||
This method is provided for convenience. It's equivalent to calling
|
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()
|
\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
|
\since 5.12
|
||||||
\overload callOnTimeout()
|
\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.
|
a handle to the connection.
|
||||||
|
|
||||||
This method is provided for convenience. It's equivalent to calling
|
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()
|
\sa QObject::connect(), timeout()
|
||||||
*/
|
*/
|
||||||
|
@ -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.
|
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.
|
Contains the status of the attempt of reading the string from the stream.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -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
|
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
|
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
|
This field contains the error code that indicates what decoding problem was
|
||||||
found.
|
found.
|
||||||
|
@ -298,12 +298,9 @@ QThreadPrivate::~QThreadPrivate()
|
|||||||
\warning The handle returned by this function is used for internal
|
\warning The handle returned by this function is used for internal
|
||||||
purposes and should not be used in any application code.
|
purposes and should not be used in any application code.
|
||||||
|
|
||||||
\warning On Windows, the returned value is a pseudo-handle for the
|
\note On Windows, this function returns the DWORD (Windows-Thread
|
||||||
current thread. It can't be used for numerical comparison. i.e.,
|
ID) returned by the Win32 function GetCurrentThreadId(), not the pseudo-HANDLE
|
||||||
this function returns the DWORD (Windows-Thread ID) returned by
|
(Windows-Thread HANDLE) returned by the Win32 function GetCurrentThread().
|
||||||
the Win32 function getCurrentThreadId(), not the HANDLE
|
|
||||||
(Windows-Thread HANDLE) returned by the Win32 function
|
|
||||||
getCurrentThread().
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -3076,7 +3076,7 @@ bool QByteArray::endsWith(const char *str) const
|
|||||||
return qstrncmp(d->data() + d->size - len, str, len) == 0;
|
return qstrncmp(d->data() + d->size - len, str, len) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*
|
||||||
Returns true if \a c is an uppercase Latin1 letter.
|
Returns true if \a c is an uppercase Latin1 letter.
|
||||||
\note The multiplication sign 0xD7 and the sz ligature 0xDF are not
|
\note The multiplication sign 0xD7 and the sz ligature 0xDF are not
|
||||||
treated as uppercase Latin1.
|
treated as uppercase Latin1.
|
||||||
@ -3112,7 +3112,7 @@ bool QByteArray::isUpper() const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*
|
||||||
Returns true if \a c is an lowercase Latin1 letter.
|
Returns true if \a c is an lowercase Latin1 letter.
|
||||||
\note The division sign 0xF7 is not treated as lowercase Latin1,
|
\note The division sign 0xF7 is not treated as lowercase Latin1,
|
||||||
but the small y dieresis 0xFF is.
|
but the small y dieresis 0xFF is.
|
||||||
|
@ -537,7 +537,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
|
|||||||
\sa operator=()
|
\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.
|
Constructs a copy of \a other.
|
||||||
|
|
||||||
|
@ -2000,8 +2000,8 @@ QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
|
|||||||
|
|
||||||
\since 5.12
|
\since 5.12
|
||||||
|
|
||||||
Returns the expression wrapped between the \c{\A} and \c{\z} anchors to be
|
Returns the \a expression wrapped between the \c{\A} and \c{\z} anchors to
|
||||||
used for exact matching.
|
be used for exact matching.
|
||||||
|
|
||||||
\sa {Porting from QRegExp's Exact Matching}
|
\sa {Porting from QRegExp's Exact Matching}
|
||||||
*/
|
*/
|
||||||
|
@ -30,24 +30,36 @@
|
|||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn const QScopeGuard<F> qScopeGuard(F f)
|
\class QScopeGuard
|
||||||
\inmodule QtCore
|
|
||||||
\brief The qScopeGuard function can be used to call a function at the end of the scope.
|
|
||||||
\since 5.12
|
\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
|
\ingroup misc
|
||||||
|
|
||||||
QScopeGuard<F> is a class which sole purpose is to run a function F in its destructor.
|
QScopeGuard<F> is a class which sole purpose is to run a function \e F in
|
||||||
This is useful for guaranteeing your cleanup code is executed whether the function is exited normally,
|
its destructor. This is useful for guaranteeing your cleanup code is
|
||||||
exited early by a return statement, or exited by an exception.
|
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
|
If \e F is a lambda then you cannot instantiate the template directly,
|
||||||
is provided and QScopeGuard<F> is made a private implementation detail.
|
therefore the qScopeGuard() helper is provided and QScopeGuard<F> is made a
|
||||||
|
private implementation detail.
|
||||||
|
|
||||||
Example usage is as follows:
|
Example usage is as follows:
|
||||||
|
|
||||||
\snippet code/src_corelib_tools_qscopeguard.cpp 0
|
\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
|
\sa QScopedValueRollback
|
||||||
*/
|
*/
|
||||||
|
@ -579,6 +579,13 @@ QT_BEGIN_NAMESPACE
|
|||||||
the shared data object if the reference count became 0.
|
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
|
/*! \fn template <class T> QExplicitlySharedDataPointer<T>::operator bool () const
|
||||||
Returns \c true if the \e{d pointer} of \e this is \e not null.
|
Returns \c true if the \e{d pointer} of \e this is \e not null.
|
||||||
*/
|
*/
|
||||||
|
@ -254,7 +254,7 @@ inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1,
|
|||||||
/*!
|
/*!
|
||||||
* \internal
|
* \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
|
* 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
|
* character is not found, this function returns a pointer to the end of the
|
||||||
* string -- that is, \c{str.end()}.
|
* string -- that is, \c{str.end()}.
|
||||||
|
@ -217,7 +217,7 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
|
|||||||
|
|
||||||
This class includes data obtained from the CLDR data files under the terms
|
This class includes data obtained from the CLDR data files under the terms
|
||||||
of the Unicode Data Files and Software License. See
|
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
|
\sa QDateTime
|
||||||
*/
|
*/
|
||||||
|
@ -3013,6 +3013,9 @@ bool QStandardItemModel::setData(const QModelIndex &index, const QVariant &value
|
|||||||
/*!
|
/*!
|
||||||
\since 5.12
|
\since 5.12
|
||||||
Removes the data stored in all the roles for the given \a index.
|
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()
|
\sa setData(), data()
|
||||||
*/
|
*/
|
||||||
bool QStandardItemModel::clearItemData(const QModelIndex &index)
|
bool QStandardItemModel::clearItemData(const QModelIndex &index)
|
||||||
|
@ -56,6 +56,12 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\namespace QPlatformGraphicsBufferHelper
|
||||||
|
\inmodule QtGui
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Convenience function to both lock and bind the \a graphicsBuffer to a texture.
|
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
|
This function will first try to lock with texture read and texture write
|
||||||
|
@ -142,6 +142,7 @@ void CLASS::init(QOpenGLContext *context) \
|
|||||||
\value BlendColor glBlendColor() is available.
|
\value BlendColor glBlendColor() is available.
|
||||||
\value BlendEquation glBlendEquation() is available.
|
\value BlendEquation glBlendEquation() is available.
|
||||||
\value BlendEquationSeparate glBlendEquationSeparate() is available.
|
\value BlendEquationSeparate glBlendEquationSeparate() is available.
|
||||||
|
\value BlendEquationAdvanced Advanced blend equations are available.
|
||||||
\value BlendFuncSeparate glBlendFuncSeparate() is available.
|
\value BlendFuncSeparate glBlendFuncSeparate() is available.
|
||||||
\value BlendSubtract Blend subtract mode is available.
|
\value BlendSubtract Blend subtract mode is available.
|
||||||
\value CompressedTextures Compressed texture functions are available.
|
\value CompressedTextures Compressed texture functions are available.
|
||||||
|
@ -1366,7 +1366,7 @@ QRgba64 QColor::rgba64() const Q_DECL_NOTHROW
|
|||||||
|
|
||||||
Sets the RGB64 value to \a rgba, including its alpha.
|
Sets the RGB64 value to \a rgba, including its alpha.
|
||||||
|
|
||||||
\sa \setRgba(), rgba64()
|
\sa setRgba(), rgba64()
|
||||||
*/
|
*/
|
||||||
void QColor::setRgba64(QRgba64 rgba) Q_DECL_NOTHROW
|
void QColor::setRgba64(QRgba64 rgba) Q_DECL_NOTHROW
|
||||||
{
|
{
|
||||||
|
@ -1254,7 +1254,7 @@ QFont::StyleStrategy QFont::styleStrategy() const
|
|||||||
/*!
|
/*!
|
||||||
Returns the StyleHint.
|
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.
|
See \l QFont::StyleHint for the list of available hints.
|
||||||
|
|
||||||
\sa setStyleHint(), QFont::StyleStrategy, QFontInfo::styleHint()
|
\sa setStyleHint(), QFont::StyleStrategy, QFontInfo::styleHint()
|
||||||
|
@ -155,7 +155,7 @@ bool Qt::mightBeRichText(const QString& text)
|
|||||||
|
|
||||||
This function is defined in the \c <QTextDocument> header file.
|
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)
|
QString Qt::convertFromPlainText(const QString &plain, Qt::WhiteSpaceMode mode)
|
||||||
{
|
{
|
||||||
|
@ -645,6 +645,7 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt)
|
|||||||
\value ImageName
|
\value ImageName
|
||||||
\value ImageWidth
|
\value ImageWidth
|
||||||
\value ImageHeight
|
\value ImageHeight
|
||||||
|
\value ImageQuality
|
||||||
|
|
||||||
Selection properties
|
Selection properties
|
||||||
|
|
||||||
@ -2251,7 +2252,7 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const
|
|||||||
\fn void QTextBlockFormat::setHeadingLevel(int level)
|
\fn void QTextBlockFormat::setHeadingLevel(int level)
|
||||||
\since 5.12
|
\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
|
type (usually with the largest possible heading font size), and increasing
|
||||||
values are progressively deeper into the document (and usually with smaller
|
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
|
font sizes). For example when reading an HTML H1 tag, the heading level is
|
||||||
|
@ -129,6 +129,8 @@ Q_LOGGING_CATEGORY(lcSsl, "qt.network.ssl");
|
|||||||
\value DtlsV1_0OrLater DTLSv1.0 and later versions.
|
\value DtlsV1_0OrLater DTLSv1.0 and later versions.
|
||||||
\value DtlsV1_2 DTLSv1.2
|
\value DtlsV1_2 DTLSv1.2
|
||||||
\value DtlsV1_2OrLater DTLSv1.2 and later versions.
|
\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 UnknownProtocol The cipher's protocol cannot be determined.
|
||||||
\value AnyProtocol The socket understands SSLv2, SSLv3, TLSv1.0 and all
|
\value AnyProtocol The socket understands SSLv2, SSLv3, TLSv1.0 and all
|
||||||
supported later versions of TLS. This value is used by QSslSocket only.
|
supported later versions of TLS. This value is used by QSslSocket only.
|
||||||
|
@ -91,12 +91,13 @@ namespace QSsl {
|
|||||||
TlsV1_1OrLater,
|
TlsV1_1OrLater,
|
||||||
TlsV1_2OrLater,
|
TlsV1_2OrLater,
|
||||||
|
|
||||||
#if QT_CONFIG(dtls) || defined(Q_CLANG_QDOC)
|
|
||||||
DtlsV1_0,
|
DtlsV1_0,
|
||||||
DtlsV1_0OrLater,
|
DtlsV1_0OrLater,
|
||||||
DtlsV1_2,
|
DtlsV1_2,
|
||||||
DtlsV1_2OrLater,
|
DtlsV1_2OrLater,
|
||||||
#endif
|
|
||||||
|
TlsV1_3,
|
||||||
|
TlsV1_3OrLater,
|
||||||
|
|
||||||
UnknownProtocol = -1
|
UnknownProtocol = -1
|
||||||
};
|
};
|
||||||
|
@ -105,7 +105,24 @@ init_context:
|
|||||||
isDtls = true;
|
isDtls = true;
|
||||||
sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
|
sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
|
||||||
break;
|
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
|
#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:
|
default:
|
||||||
// The ssl options will actually control the supported methods
|
// The ssl options will actually control the supported methods
|
||||||
sslContext->ctx = q_SSL_CTX_new(client ? q_TLS_client_method() : q_TLS_server_method());
|
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;
|
minVersion = TLS1_2_VERSION;
|
||||||
maxVersion = TLS1_2_VERSION;
|
maxVersion = TLS1_2_VERSION;
|
||||||
break;
|
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:
|
// Ranges:
|
||||||
case QSsl::TlsV1SslV3:
|
case QSsl::TlsV1SslV3:
|
||||||
case QSsl::AnyProtocol:
|
case QSsl::AnyProtocol:
|
||||||
@ -192,6 +219,17 @@ init_context:
|
|||||||
maxVersion = DTLS_MAX_VERSION;
|
maxVersion = DTLS_MAX_VERSION;
|
||||||
break;
|
break;
|
||||||
#endif // dtls
|
#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:
|
case QSsl::SslV2:
|
||||||
// This protocol is not supported by OpenSSL 1.1 and we handle
|
// This protocol is not supported by OpenSSL 1.1 and we handle
|
||||||
// it as an error (see the code above).
|
// 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
|
// http://www.openssl.org/docs/ssl/SSL_CTX_set_mode.html
|
||||||
q_SSL_CTX_set_mode(sslContext->ctx, SSL_MODE_RELEASE_BUFFERS);
|
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
|
// Initialize ciphers
|
||||||
QByteArray cipherString;
|
|
||||||
bool first = true;
|
|
||||||
QList<QSslCipher> ciphers = sslContext->sslConfiguration.ciphers();
|
QList<QSslCipher> ciphers = sslContext->sslConfiguration.ciphers();
|
||||||
if (ciphers.isEmpty())
|
if (ciphers.isEmpty())
|
||||||
ciphers = isDtls ? q_getDefaultDtlsCiphers() : QSslSocketPrivate::defaultCiphers();
|
ciphers = isDtls ? q_getDefaultDtlsCiphers() : QSslSocketPrivate::defaultCiphers();
|
||||||
|
|
||||||
for (const QSslCipher &cipher : qAsConst(ciphers)) {
|
const QByteArray preTls13Ciphers = filterCiphers(ciphers, false);
|
||||||
if (first)
|
|
||||||
first = false;
|
if (preTls13Ciphers.size()) {
|
||||||
else
|
if (!q_SSL_CTX_set_cipher_list(sslContext->ctx, preTls13Ciphers.data())) {
|
||||||
cipherString.append(':');
|
sslContext->errorStr = QSslSocket::tr("Invalid or empty cipher list (%1)").arg(QSslSocketBackendPrivate::getErrorsFromOpenSsl());
|
||||||
cipherString.append(cipher.name().toLatin1());
|
sslContext->errorCode = QSslError::UnspecifiedError;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!q_SSL_CTX_set_cipher_list(sslContext->ctx, cipherString.data())) {
|
const QByteArray tls13Ciphers = filterCiphers(ciphers, true);
|
||||||
sslContext->errorStr = QSslSocket::tr("Invalid or empty cipher list (%1)").arg(QSslSocketBackendPrivate::getErrorsFromOpenSsl());
|
#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;
|
sslContext->errorCode = QSslError::UnspecifiedError;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -104,6 +104,15 @@ init_context:
|
|||||||
isDtls = true;
|
isDtls = true;
|
||||||
sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
|
sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
|
||||||
break;
|
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
|
#endif // dtls
|
||||||
case QSsl::SslV2:
|
case QSsl::SslV2:
|
||||||
#ifndef OPENSSL_NO_SSL2
|
#ifndef OPENSSL_NO_SSL2
|
||||||
@ -168,6 +177,12 @@ init_context:
|
|||||||
unsupportedProtocol = true;
|
unsupportedProtocol = true;
|
||||||
#endif
|
#endif
|
||||||
break;
|
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) {
|
if (!client && isDtls && configuration.peerVerifyMode() != QSslSocket::VerifyNone) {
|
||||||
|
@ -1110,6 +1110,18 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
|
|||||||
return false;
|
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;
|
OSStatus err = errSecSuccess;
|
||||||
|
|
||||||
if (configuration.protocol == QSsl::SslV3) {
|
if (configuration.protocol == QSsl::SslV3) {
|
||||||
|
@ -180,6 +180,8 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSL_CIPHER(const SSL_CIPHER
|
|||||||
ciph.d->protocol = QSsl::TlsV1_1;
|
ciph.d->protocol = QSsl::TlsV1_1;
|
||||||
else if (protoString == QLatin1String("TLSv1.2"))
|
else if (protoString == QLatin1String("TLSv1.2"))
|
||||||
ciph.d->protocol = QSsl::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=")))
|
if (descriptionList.at(2).startsWith(QLatin1String("Kx=")))
|
||||||
ciph.d->keyExchangeMethod = descriptionList.at(2).mid(3).toString();
|
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;
|
options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1;
|
||||||
else if (protocol == QSsl::TlsV1_2OrLater)
|
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;
|
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
|
#endif
|
||||||
else
|
else
|
||||||
options = SSL_OP_ALL;
|
options = SSL_OP_ALL;
|
||||||
@ -1299,6 +1303,8 @@ QSsl::SslProtocol QSslSocketBackendPrivate::sessionProtocol() const
|
|||||||
return QSsl::TlsV1_1;
|
return QSsl::TlsV1_1;
|
||||||
case 0x303:
|
case 0x303:
|
||||||
return QSsl::TlsV1_2;
|
return QSsl::TlsV1_2;
|
||||||
|
case 0x304:
|
||||||
|
return QSsl::TlsV1_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
return QSsl::UnknownProtocol;
|
return QSsl::UnknownProtocol;
|
||||||
|
@ -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_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session);
|
||||||
unsigned long q_SSL_set_options(SSL *s, unsigned long op);
|
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)
|
#if QT_CONFIG(dtls)
|
||||||
// Functions and types required for DTLS support:
|
// Functions and types required for DTLS support:
|
||||||
extern "C"
|
extern "C"
|
||||||
|
@ -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)
|
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)
|
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(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_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)
|
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)
|
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(OPENSSL_sk_value)
|
||||||
RESOLVEFUNC(DH_get0_pqg)
|
RESOLVEFUNC(DH_get0_pqg)
|
||||||
RESOLVEFUNC(SSL_CTX_set_options)
|
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_get_client_random)
|
||||||
RESOLVEFUNC(SSL_SESSION_get_master_key)
|
RESOLVEFUNC(SSL_SESSION_get_master_key)
|
||||||
RESOLVEFUNC(SSL_session_reused)
|
RESOLVEFUNC(SSL_session_reused)
|
||||||
|
@ -251,6 +251,8 @@ void QSslSocketBackendPrivate::startClientEncryption()
|
|||||||
case QSsl::TlsV1_0OrLater:
|
case QSsl::TlsV1_0OrLater:
|
||||||
case QSsl::TlsV1_1OrLater:
|
case QSsl::TlsV1_1OrLater:
|
||||||
case QSsl::TlsV1_2OrLater:
|
case QSsl::TlsV1_2OrLater:
|
||||||
|
case QSsl::TlsV1_3:
|
||||||
|
case QSsl::TlsV1_3OrLater:
|
||||||
// TlsV1_0OrLater, TlsV1_1OrLater and TlsV1_2OrLater are disabled on WinRT
|
// TlsV1_0OrLater, TlsV1_1OrLater and TlsV1_2OrLater are disabled on WinRT
|
||||||
// because there is no good way to map them to the native API.
|
// because there is no good way to map them to the native API.
|
||||||
setErrorAndEmit(QAbstractSocket::SslInvalidUserDataError,
|
setErrorAndEmit(QAbstractSocket::SslInvalidUserDataError,
|
||||||
|
@ -340,12 +340,17 @@ QCocoaScreen *QCocoaIntegration::screenForNSScreen(NSScreen *nsScreen)
|
|||||||
bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) const
|
bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) const
|
||||||
{
|
{
|
||||||
switch (cap) {
|
switch (cap) {
|
||||||
case ThreadedPixmaps:
|
|
||||||
#ifndef QT_NO_OPENGL
|
#ifndef QT_NO_OPENGL
|
||||||
case OpenGL:
|
|
||||||
case ThreadedOpenGL:
|
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:
|
case BufferQueueingOpenGL:
|
||||||
#endif
|
#endif
|
||||||
|
case ThreadedPixmaps:
|
||||||
case WindowMasks:
|
case WindowMasks:
|
||||||
case MultipleWindows:
|
case MultipleWindows:
|
||||||
case ForeignWindows:
|
case ForeignWindows:
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
@interface QT_MANGLE_NAMESPACE(QNSView) (Drawing) <CALayerDelegate>
|
@interface QT_MANGLE_NAMESPACE(QNSView) (Drawing) <CALayerDelegate>
|
||||||
- (BOOL)wantsLayerHelper;
|
- (void)initDrawing;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper) : NSObject
|
@interface QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper) : NSObject
|
||||||
@ -152,19 +152,8 @@
|
|||||||
|
|
||||||
self.focusRingType = NSFocusRingTypeNone;
|
self.focusRingType = NSFocusRingTypeNone;
|
||||||
self.cursor = nil;
|
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];
|
[self registerDragTypes];
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||||
|
@ -41,6 +41,24 @@
|
|||||||
|
|
||||||
@implementation QT_MANGLE_NAMESPACE(QNSView) (Drawing)
|
@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
|
- (BOOL)isOpaque
|
||||||
{
|
{
|
||||||
if (!m_platformWindow)
|
if (!m_platformWindow)
|
||||||
@ -71,6 +89,33 @@
|
|||||||
m_platformWindow->handleExposeEvent(exposedRegion);
|
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
|
- (BOOL)shouldUseMetalLayer
|
||||||
{
|
{
|
||||||
// MetalSurface needs a layer, and so does VulkanSurface (via MoltenVK)
|
// MetalSurface needs a layer, and so does VulkanSurface (via MoltenVK)
|
||||||
@ -78,18 +123,6 @@
|
|||||||
return surfaceType == QWindow::MetalSurface || surfaceType == QWindow::VulkanSurface;
|
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
|
- (CALayer *)makeBackingLayer
|
||||||
{
|
{
|
||||||
if ([self shouldUseMetalLayer]) {
|
if ([self shouldUseMetalLayer]) {
|
||||||
@ -115,6 +148,14 @@
|
|||||||
return [super makeBackingLayer];
|
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
|
- (NSViewLayerContentsRedrawPolicy)layerContentsRedrawPolicy
|
||||||
{
|
{
|
||||||
// We need to set this explicitly since the super implementation
|
// We need to set this explicitly since the super implementation
|
||||||
|
@ -198,6 +198,7 @@ QPlatformBackingStore *QEglFSIntegration::createPlatformBackingStore(QWindow *wi
|
|||||||
static_cast<QEglFSWindow *>(window->handle())->setBackingStore(bs);
|
static_cast<QEglFSWindow *>(window->handle())->setBackingStore(bs);
|
||||||
return bs;
|
return bs;
|
||||||
#else
|
#else
|
||||||
|
Q_UNUSED(window);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -183,6 +183,8 @@ void QEglFSScreen::handleCursorMove(const QPoint &pos)
|
|||||||
|
|
||||||
if (enter && leave)
|
if (enter && leave)
|
||||||
QWindowSystemInterface::handleEnterLeaveEvent(enter, leave, enter->mapFromGlobal(pos), pos);
|
QWindowSystemInterface::handleEnterLeaveEvent(enter, leave, enter->mapFromGlobal(pos), pos);
|
||||||
|
#else
|
||||||
|
Q_UNUSED(pos);
|
||||||
#endif
|
#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);
|
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();
|
return QPixmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,6 +132,7 @@ QPlatformBackingStore *QMinimalEglIntegration::createPlatformBackingStore(QWindo
|
|||||||
#ifndef QT_NO_OPENGL
|
#ifndef QT_NO_OPENGL
|
||||||
return new QMinimalEglBackingStore(window);
|
return new QMinimalEglBackingStore(window);
|
||||||
#else
|
#else
|
||||||
|
Q_UNUSED(window);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,18 @@ QRectF QWindowsInputContext::keyboardRect() const
|
|||||||
bool QWindowsInputContext::isInputPanelVisible() const
|
bool QWindowsInputContext::isInputPanelVisible() const
|
||||||
{
|
{
|
||||||
HWND hwnd = getVirtualKeyboardWindowHandle();
|
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()
|
void QWindowsInputContext::showInputPanel()
|
||||||
|
@ -336,6 +336,38 @@ static void getMouseEventInfo(UINT message, POINTER_BUTTON_CHANGE_TYPE changeTyp
|
|||||||
*mouseButton = buttonMapping.value(changeType, Qt::NoButton);
|
*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)
|
static QWindow *getWindowUnderPointer(QWindow *window, QPoint globalPos)
|
||||||
{
|
{
|
||||||
QWindow *currentWindowUnderPointer = QWindowsScreen::windowAt(globalPos, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
|
QWindow *currentWindowUnderPointer = QWindowsScreen::windowAt(globalPos, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
|
||||||
@ -405,23 +437,6 @@ QTouchDevice *QWindowsPointerHandler::ensureTouchDevice()
|
|||||||
return m_touchDevice;
|
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,
|
bool QWindowsPointerHandler::translateMouseTouchPadEvent(QWindow *window, HWND hwnd,
|
||||||
QtWindows::WindowsEventType et,
|
QtWindows::WindowsEventType et,
|
||||||
MSG msg, PVOID vPointerInfo)
|
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 globalPos = QPoint(pointerInfo->ptPixelLocation.x, pointerInfo->ptPixelLocation.y);
|
||||||
const QPoint localPos = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPos);
|
const QPoint localPos = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPos);
|
||||||
const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers();
|
const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers();
|
||||||
const Qt::MouseButtons mouseButtons = queryMouseButtons();
|
const Qt::MouseButtons mouseButtons = mouseButtonsFromPointerFlags(pointerInfo->pointerFlags);
|
||||||
|
|
||||||
QWindow *currentWindowUnderPointer = getWindowUnderPointer(window, globalPos);
|
QWindow *currentWindowUnderPointer = getWindowUnderPointer(window, globalPos);
|
||||||
QWindowsWindow *platformWindow = static_cast<QWindowsWindow *>(window->handle());
|
QWindowsWindow *platformWindow = static_cast<QWindowsWindow *>(window->handle());
|
||||||
@ -452,6 +467,11 @@ bool QWindowsPointerHandler::translateMouseTouchPadEvent(QWindow *window, HWND h
|
|||||||
keyModifiers, Qt::MouseEventNotSynthesized);
|
keyModifiers, Qt::MouseEventNotSynthesized);
|
||||||
return false; // To allow window dragging, etc.
|
return false; // To allow window dragging, etc.
|
||||||
} else {
|
} 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 (currentWindowUnderPointer != m_windowUnderPointer) {
|
||||||
if (m_windowUnderPointer && m_windowUnderPointer == m_currentWindow) {
|
if (m_windowUnderPointer && m_windowUnderPointer == m_currentWindow) {
|
||||||
QWindowSystemInterface::handleLeaveEvent(m_windowUnderPointer);
|
QWindowSystemInterface::handleLeaveEvent(m_windowUnderPointer);
|
||||||
@ -797,7 +817,7 @@ bool QWindowsPointerHandler::translateMouseEvent(QWindow *window, HWND hwnd, QtW
|
|||||||
m_windowUnderPointer = currentWindowUnderPointer;
|
m_windowUnderPointer = currentWindowUnderPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Qt::MouseButtons mouseButtons = queryMouseButtons();
|
const Qt::MouseButtons mouseButtons = mouseButtonsFromKeyState(msg.wParam);
|
||||||
|
|
||||||
if (!discardEvent)
|
if (!discardEvent)
|
||||||
QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, mouseButtons, Qt::NoButton, QEvent::MouseMove,
|
QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, mouseButtons, Qt::NoButton, QEvent::MouseMove,
|
||||||
|
@ -61,7 +61,6 @@ public:
|
|||||||
bool translateMouseEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result);
|
bool translateMouseEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result);
|
||||||
QTouchDevice *touchDevice() const { return m_touchDevice; }
|
QTouchDevice *touchDevice() const { return m_touchDevice; }
|
||||||
QTouchDevice *ensureTouchDevice();
|
QTouchDevice *ensureTouchDevice();
|
||||||
Qt::MouseButtons queryMouseButtons();
|
|
||||||
QWindow *windowUnderMouse() const { return m_windowUnderPointer.data(); }
|
QWindow *windowUnderMouse() const { return m_windowUnderPointer.data(); }
|
||||||
void clearWindowUnderMouse() { m_windowUnderPointer = nullptr; }
|
void clearWindowUnderMouse() { m_windowUnderPointer = nullptr; }
|
||||||
|
|
||||||
|
@ -707,7 +707,7 @@ bool readInputFile(Options *options)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
options->sdkPath = sdkPath.toString();
|
options->sdkPath = QDir::fromNativeSeparators(sdkPath.toString());
|
||||||
|
|
||||||
if (options->androidPlatform.isEmpty()) {
|
if (options->androidPlatform.isEmpty()) {
|
||||||
options->androidPlatform = detectLatestAndroidPlatform(options->sdkPath);
|
options->androidPlatform = detectLatestAndroidPlatform(options->sdkPath);
|
||||||
|
@ -3,3 +3,4 @@ windows
|
|||||||
[registerTimer]
|
[registerTimer]
|
||||||
windows
|
windows
|
||||||
winrt
|
winrt
|
||||||
|
osx
|
||||||
|
@ -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
|
// test that the eventDispatcher's timer implementation is complete and working
|
||||||
void tst_QEventDispatcher::registerTimer()
|
void tst_QEventDispatcher::registerTimer()
|
||||||
{
|
{
|
||||||
#define FIND_TIMERS() \
|
TimerManager timers(eventDispatcher, this);
|
||||||
do { \
|
timers.registerAll();
|
||||||
foundPrecise = false; \
|
if (QTest::currentTestFailed())
|
||||||
foundCoarse = false; \
|
return;
|
||||||
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);
|
|
||||||
|
|
||||||
// check that all 3 are present in the eventDispatcher's registeredTimer() list
|
// check that all 3 are present in the eventDispatcher's registeredTimer() list
|
||||||
QList<QAbstractEventDispatcher::TimerInfo> registeredTimers = eventDispatcher->registeredTimers(this);
|
QCOMPARE(timers.registeredTimers().count(), 3);
|
||||||
QCOMPARE(registeredTimers.count(), 3);
|
QVERIFY(timers.foundPrecise());
|
||||||
bool foundPrecise, foundCoarse, foundVeryCoarse;
|
QVERIFY(timers.foundCoarse());
|
||||||
FIND_TIMERS();
|
QVERIFY(timers.foundVeryCoarse());
|
||||||
QVERIFY(foundPrecise && foundCoarse && foundVeryCoarse);
|
|
||||||
|
|
||||||
// process events, waiting for the next event... this should only fire the precise timer
|
// process events, waiting for the next event... this should only fire the precise timer
|
||||||
receivedEventType = -1;
|
receivedEventType = -1;
|
||||||
timerIdFromEvent = -1;
|
timerIdFromEvent = -1;
|
||||||
QTRY_COMPARE_WITH_TIMEOUT(receivedEventType, int(QEvent::Timer), PreciseTimerInterval * 2);
|
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
|
// now unregister it and make sure it's gone
|
||||||
eventDispatcher->unregisterTimer(preciseTimerId);
|
timers.unregister(timers.preciseTimerId());
|
||||||
registeredTimers = eventDispatcher->registeredTimers(this);
|
if (QTest::currentTestFailed())
|
||||||
QCOMPARE(registeredTimers.count(), 2);
|
return;
|
||||||
FIND_TIMERS();
|
QCOMPARE(timers.registeredTimers().count(), 2);
|
||||||
QVERIFY(!foundPrecise && foundCoarse && foundVeryCoarse);
|
QVERIFY(!timers.foundPrecise());
|
||||||
|
QVERIFY(timers.foundCoarse());
|
||||||
|
QVERIFY(timers.foundVeryCoarse());
|
||||||
|
|
||||||
// do the same again for the coarse timer
|
// do the same again for the coarse timer
|
||||||
receivedEventType = -1;
|
receivedEventType = -1;
|
||||||
timerIdFromEvent = -1;
|
timerIdFromEvent = -1;
|
||||||
QTRY_COMPARE_WITH_TIMEOUT(receivedEventType, int(QEvent::Timer), CoarseTimerInterval * 2);
|
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
|
// now unregister it and make sure it's gone
|
||||||
eventDispatcher->unregisterTimer(coarseTimerId);
|
timers.unregister(timers.coarseTimerId());
|
||||||
registeredTimers = eventDispatcher->registeredTimers(this);
|
if (QTest::currentTestFailed())
|
||||||
QCOMPARE(registeredTimers.count(), 1);
|
return;
|
||||||
FIND_TIMERS();
|
QCOMPARE(timers.registeredTimers().count(), 1);
|
||||||
QVERIFY(!foundPrecise && !foundCoarse && foundVeryCoarse);
|
QVERIFY(!timers.foundPrecise());
|
||||||
|
QVERIFY(!timers.foundCoarse());
|
||||||
|
QVERIFY(timers.foundVeryCoarse());
|
||||||
|
|
||||||
// not going to wait for the VeryCoarseTimer, would take too long, just unregister it
|
// not going to wait for the VeryCoarseTimer, would take too long, just unregister it
|
||||||
eventDispatcher->unregisterTimers(this);
|
timers.unregisterAll();
|
||||||
registeredTimers = eventDispatcher->registeredTimers(this);
|
if (QTest::currentTestFailed())
|
||||||
QVERIFY(registeredTimers.isEmpty());
|
return;
|
||||||
|
QVERIFY(timers.registeredTimers().isEmpty());
|
||||||
#undef FIND_TIMERS
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QEventDispatcher::sendPostedEvents_data()
|
void tst_QEventDispatcher::sendPostedEvents_data()
|
||||||
|
@ -1025,6 +1025,26 @@ void tst_QSslSocket::protocol()
|
|||||||
socket->abort();
|
socket->abort();
|
||||||
}
|
}
|
||||||
#endif
|
#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)
|
#if !defined(OPENSSL_NO_SSL2) && !defined(QT_SECURETRANSPORT)
|
||||||
{
|
{
|
||||||
// qt-test-server allows SSLV2.
|
// 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.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.1") << QSsl::TlsV1_0OrLater << QSsl::TlsV1_1 << true;
|
||||||
QTest::newRow("tls1.0orlater-tls1.2") << QSsl::TlsV1_0OrLater << QSsl::TlsV1_2 << 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)
|
#if !defined(OPENSSL_NO_SSL2) && !defined(QT_SECURETRANSPORT)
|
||||||
QTest::newRow("tls1.1orlater-ssl2") << QSsl::TlsV1_1OrLater << QSsl::SslV2 << false;
|
QTest::newRow("tls1.1orlater-ssl2") << QSsl::TlsV1_1OrLater << QSsl::SslV2 << false;
|
||||||
#endif
|
#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.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.1") << QSsl::TlsV1_1OrLater << QSsl::TlsV1_1 << true;
|
||||||
QTest::newRow("tls1.1orlater-tls1.2") << QSsl::TlsV1_1OrLater << QSsl::TlsV1_2 << 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)
|
#if !defined(OPENSSL_NO_SSL2) && !defined(QT_SECURETRANSPORT)
|
||||||
QTest::newRow("tls1.2orlater-ssl2") << QSsl::TlsV1_2OrLater << QSsl::SslV2 << false;
|
QTest::newRow("tls1.2orlater-ssl2") << QSsl::TlsV1_2OrLater << QSsl::SslV2 << false;
|
||||||
#endif
|
#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.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.1") << QSsl::TlsV1_2OrLater << QSsl::TlsV1_1 << false;
|
||||||
QTest::newRow("tls1.2orlater-tls1.2") << QSsl::TlsV1_2OrLater << QSsl::TlsV1_2 << true;
|
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-tls1.0") << QSsl::AnyProtocol << QSsl::TlsV1_0 << true;
|
||||||
QTest::newRow("any-tls1ssl3") << QSsl::AnyProtocol << QSsl::TlsV1SslV3 << true;
|
QTest::newRow("any-tls1ssl3") << QSsl::AnyProtocol << QSsl::TlsV1SslV3 << true;
|
||||||
@ -3511,7 +3550,12 @@ protected:
|
|||||||
socket = new QSslSocket(this);
|
socket = new QSslSocket(this);
|
||||||
socket->setSslConfiguration(config);
|
socket->setSslConfiguration(config);
|
||||||
socket->setPeerVerifyMode(peerVerifyMode);
|
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)
|
if (ignoreSslErrors)
|
||||||
connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot()));
|
connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot()));
|
||||||
|
|
||||||
@ -3891,6 +3935,11 @@ void tst_QSslSocket::pskServer()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
QSslSocket socket;
|
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;
|
this->socket = &socket;
|
||||||
|
|
||||||
QSignalSpy connectedSpy(&socket, SIGNAL(connected()));
|
QSignalSpy connectedSpy(&socket, SIGNAL(connected()));
|
||||||
@ -3976,6 +4025,11 @@ void tst_QSslSocket::signatureAlgorithm_data()
|
|||||||
if (QSslSocket::sslLibraryVersionNumber() < 0x10002000L)
|
if (QSslSocket::sslLibraryVersionNumber() < 0x10002000L)
|
||||||
QSKIP("Signature algorithms cannot be tested with OpenSSL < 1.0.2");
|
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<QByteArrayList>("serverSigAlgPairs");
|
||||||
QTest::addColumn<QSsl::SslProtocol>("serverProtocol");
|
QTest::addColumn<QSsl::SslProtocol>("serverProtocol");
|
||||||
QTest::addColumn<QByteArrayList>("clientSigAlgPairs");
|
QTest::addColumn<QByteArrayList>("clientSigAlgPairs");
|
||||||
|
@ -355,6 +355,11 @@ void tst_QGLThreads::renderInThread()
|
|||||||
QFETCH(bool, resize);
|
QFETCH(bool, resize);
|
||||||
QFETCH(bool, update);
|
QFETCH(bool, update);
|
||||||
|
|
||||||
|
#if defined(Q_OS_MACOS)
|
||||||
|
if (resize)
|
||||||
|
QSKIP("gldSetZero crashes in render thread, QTBUG-68524");
|
||||||
|
#endif
|
||||||
|
|
||||||
ThreadSafeGLWidget widget;
|
ThreadSafeGLWidget widget;
|
||||||
widget.resize(200, 200);
|
widget.resize(200, 200);
|
||||||
SceneRenderingThread thread(&widget);
|
SceneRenderingThread thread(&widget);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user