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

Conflicts:
	src/corelib/io/qdir.cpp
	src/corelib/kernel/qtimer.cpp
	src/corelib/kernel/qtimer.h

Done-With: Edward Welbourne <edward.welbourne@qt.io>
Change-Id: I683d897760ec06593136d77955f8bc87fdef3f9f
This commit is contained in:
Liang Qi 2018-11-21 23:59:03 +01:00
commit bf58c70546
134 changed files with 1682 additions and 609 deletions

1
.gitignore vendored
View File

@ -98,7 +98,6 @@ qt*-config.pri
/bin/qhelpgenerator /bin/qhelpgenerator
/bin/qlalr /bin/qlalr
/bin/qml /bin/qml
/bin/qml1plugindump
/bin/qmleasing /bin/qmleasing
/bin/qmlimportscanner /bin/qmlimportscanner
/bin/qmljs /bin/qmljs

468
dist/changes-5.12.0 vendored Normal file
View File

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

View File

@ -88,7 +88,8 @@ void OpenGLWindow::render()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
m_device->setSize(size()); m_device->setSize(size() * devicePixelRatio());
m_device->setDevicePixelRatio(devicePixelRatio());
QPainter painter(m_device); QPainter painter(m_device);
render(&painter); render(&painter);

View File

@ -41,6 +41,8 @@ ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/libs/$$A
ANDROID_STDCPP_PATH = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++_shared.so ANDROID_STDCPP_PATH = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++_shared.so
ANDROID_USE_LLVM = true
exists($$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++.so): \ exists($$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++.so): \
ANDROID_CXX_STL_LIBS = -lc++ ANDROID_CXX_STL_LIBS = -lc++
else: \ else: \

View File

@ -16,6 +16,7 @@ QMAKE_LINK = $$QMAKE_CXX
ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/libs/$$ANDROID_TARGET_ARCH ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/libs/$$ANDROID_TARGET_ARCH
ANDROID_STDCPP_PATH = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libgnustl_shared.so ANDROID_STDCPP_PATH = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libgnustl_shared.so
ANDROID_CXX_STL_LIBS = -lgnustl_shared -lgcc ANDROID_CXX_STL_LIBS = -lgnustl_shared -lgcc
ANDROID_USE_LLVM = false
exists($$NDK_ROOT/sysroot/usr/include): \ exists($$NDK_ROOT/sysroot/usr/include): \
QMAKE_CFLAGS += --sysroot=$$NDK_ROOT/sysroot \ QMAKE_CFLAGS += --sysroot=$$NDK_ROOT/sysroot \

View File

@ -17,17 +17,22 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {
isEmpty(NDK_ROOT): NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT isEmpty(NDK_ROOT): NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT
FILE_CONTENT += " \"ndk\": $$emitString($$NDK_ROOT)," FILE_CONTENT += " \"ndk\": $$emitString($$NDK_ROOT),"
NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX) equals(ANDROID_USE_LLVM, true) {
isEmpty(NDK_TOOLCHAIN_PREFIX) { FILE_CONTENT += " \"toolchain-prefix\": \"llvm\","
equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86 FILE_CONTENT += " \"tool-prefix\": \"llvm\","
else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64 } else {
else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLCHAIN_PREFIX = mipsel-linux-android NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX)
else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLCHAIN_PREFIX = mips64el-linux-android isEmpty(NDK_TOOLCHAIN_PREFIX) {
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86
else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64
else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLCHAIN_PREFIX = mipsel-linux-android
else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLCHAIN_PREFIX = mips64el-linux-android
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android
else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi
}
FILE_CONTENT += " \"toolchain-prefix\": $$emitString($$NDK_TOOLCHAIN_PREFIX),"
FILE_CONTENT += " \"tool-prefix\": $$emitString($$NDK_TOOLS_PREFIX),"
} }
FILE_CONTENT += " \"toolchain-prefix\": $$emitString($$NDK_TOOLCHAIN_PREFIX),"
FILE_CONTENT += " \"tool-prefix\": $$emitString($$NDK_TOOLS_PREFIX),"
NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION) NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION)
isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION
@ -63,6 +68,7 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {
QML_ROOT_PATH = $$_PRO_FILE_PWD_ QML_ROOT_PATH = $$_PRO_FILE_PWD_
FILE_CONTENT += " \"qml-root-path\": $$emitString($$QML_ROOT_PATH)," FILE_CONTENT += " \"qml-root-path\": $$emitString($$QML_ROOT_PATH),"
FILE_CONTENT += " \"stdcpp-path\": $$emitString($$ANDROID_STDCPP_PATH)," FILE_CONTENT += " \"stdcpp-path\": $$emitString($$ANDROID_STDCPP_PATH),"
FILE_CONTENT += " \"useLLVM\": $$ANDROID_USE_LLVM,"
FILE_CONTENT += " \"application-binary\": $$emitString($$absolute_path($$DESTDIR, $$OUT_PWD)/$$TARGET)" FILE_CONTENT += " \"application-binary\": $$emitString($$absolute_path($$DESTDIR, $$OUT_PWD)/$$TARGET)"
FILE_CONTENT += "}" FILE_CONTENT += "}"

View File

@ -259,3 +259,10 @@ isEmpty(xcode_product_bundle_target): \
xcode_product_bundle_target = ${PRODUCT_NAME:rfc1034identifier} xcode_product_bundle_target = ${PRODUCT_NAME:rfc1034identifier}
xcode_product_bundle_identifier_setting.value = "$${xcode_product_bundle_identifier_setting.value}.$${xcode_product_bundle_target}" xcode_product_bundle_identifier_setting.value = "$${xcode_product_bundle_identifier_setting.value}.$${xcode_product_bundle_target}"
QMAKE_MAC_XCODE_SETTINGS += xcode_product_bundle_identifier_setting QMAKE_MAC_XCODE_SETTINGS += xcode_product_bundle_identifier_setting
!macx-xcode {
generate_xcode_project.commands = @$(QMAKE) -spec macx-xcode $(EXPORT__PRO_FILE_)
generate_xcode_project.target = xcodeproj
QMAKE_EXTRA_VARIABLES += _PRO_FILE_
QMAKE_EXTRA_TARGETS += generate_xcode_project
}

View File

@ -1,13 +0,0 @@
#
# W A R N I N G
# -------------
#
# This file is not part of the Qt API. It exists purely as an
# implementation detail. It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#
CONFIG += qml1_target
load(qml_module)

View File

@ -1,13 +0,0 @@
#
# W A R N I N G
# -------------
#
# This file is not part of the Qt API. It exists purely as an
# implementation detail. It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#
CONFIG += qml1_target
load(qml_plugin)

View File

@ -23,15 +23,9 @@ for(qmlf, AUX_QML_FILES): fq_aux_qml_files += $$absolute_path($$qmlf, $$_PRO_FIL
load(qt_build_paths) load(qt_build_paths)
qml1_target { DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
DESTDIR = $$MODULE_BASE_OUTDIR/imports/$$TARGETPATH
instbase = $$[QT_INSTALL_IMPORTS]
} else {
DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
instbase = $$[QT_INSTALL_QML]
}
!qml1_target:static: \ static: \
CONFIG += builtin_resources CONFIG += builtin_resources
else: \ else: \
CONFIG += install_qml_files CONFIG += install_qml_files
@ -52,7 +46,7 @@ qmldir.base = $$_PRO_FILE_PWD_
# Tools need qmldir and plugins.qmltypes always installed on the file system # Tools need qmldir and plugins.qmltypes always installed on the file system
qmldir.files = $$qmldir_file $$fq_aux_qml_files qmldir.files = $$qmldir_file $$fq_aux_qml_files
install_qml_files: qmldir.files += $$fq_qml_files install_qml_files: qmldir.files += $$fq_qml_files
qmldir.path = $$instbase/$$TARGETPATH qmldir.path = $$[QT_INSTALL_QML]/$$TARGETPATH
INSTALLS += qmldir INSTALLS += qmldir
!debug_and_release|!build_all|CONFIG(release, debug|release) { !debug_and_release|!build_all|CONFIG(release, debug|release) {

View File

@ -48,15 +48,9 @@ exists($$QMLTYPEFILE): AUX_QML_FILES += $$QMLTYPEFILE
load(qt_build_paths) load(qt_build_paths)
qml1_target { DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
DESTDIR = $$MODULE_BASE_OUTDIR/imports/$$TARGETPATH
instbase = $$[QT_INSTALL_IMPORTS]
} else {
DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
instbase = $$[QT_INSTALL_QML]
}
target.path = $$instbase/$$TARGETPATH target.path = $$[QT_INSTALL_QML]/$$TARGETPATH
INSTALLS += target INSTALLS += target
# Some final setup # Some final setup
@ -75,20 +69,11 @@ load(qt_common)
# directory. Then review and commit the changes made to plugins.qmltypes. # directory. Then review and commit the changes made to plugins.qmltypes.
# #
!cross_compile { !cross_compile {
qml1_target { qmlplugindump = qmlplugindump
qmlplugindump = qml1plugindump importpath.name = QML2_IMPORT_PATH
importpath.name = QML_IMPORT_PATH
} else {
qmlplugindump = qmlplugindump
importpath.name = QML2_IMPORT_PATH
}
importpath.value = importpath.value =
for(qmod, QTREPOS) { for(qmod, QTREPOS) {
qml1_target: \ exists($$qmod/qml): importpath.value += $$shell_path($$qmod/qml)
qmod = $$qmod/imports
else: \
qmod = $$qmod/qml
exists($$qmod): importpath.value += $$shell_path($$qmod)
} }
importpath.value = $$unique(importpath.value) importpath.value = $$unique(importpath.value)
QT_TOOL_ENV = importpath QT_TOOL_ENV = importpath

View File

@ -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());

View File

@ -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("/");

View File

@ -133,7 +133,7 @@ public:
bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(s, 0, cs) >= 0; } bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(s, 0, cs) >= 0; }
bool contains(const char *s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(QLatin1String(s), 0, cs) >= 0; } bool contains(const char *s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(QLatin1String(s), 0, cs) >= 0; }
bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(c, 0, cs) >= 0; } bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(c, 0, cs) >= 0; }
int toLongLong(bool *ok = nullptr, int base = 10) const { return toQStringRef().toLongLong(ok, base); } qlonglong toLongLong(bool *ok = nullptr, int base = 10) const { return toQStringRef().toLongLong(ok, base); }
int toInt(bool *ok = nullptr, int base = 10) const { return toQStringRef().toInt(ok, base); } int toInt(bool *ok = nullptr, int base = 10) const { return toQStringRef().toInt(ok, base); }
short toShort(bool *ok = nullptr, int base = 10) const { return toQStringRef().toShort(ok, base); } short toShort(bool *ok = nullptr, int base = 10) const { return toQStringRef().toShort(ok, base); }

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

@ -0,0 +1,22 @@
Copyright (C) 2009 Apple Inc. All Rights Reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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

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

View File

@ -2,7 +2,7 @@
"Id": "libjpeg", "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/",

View File

@ -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",

View File

@ -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.

View File

@ -1,29 +1,22 @@
/* /*
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved.
LICENSE TERMS The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:
The redistribution and use of this software (with or without changes) 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
View File

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

View File

@ -4,13 +4,15 @@
"Name": "Secure Hash Algorithm SHA-3 - brg_endian", "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",

Binary file not shown.

View File

@ -24,10 +24,11 @@
"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"
} }
] ]

View File

@ -177,6 +177,8 @@ public class QtNative
File f = new File(libName); File f = new File(libName);
if (f.exists()) if (f.exists())
System.load(libName); System.load(libName);
else
Log.i(QtTAG, "Can't find '" + libName + "'");
} catch (SecurityException e) { } catch (SecurityException e) {
Log.i(QtTAG, "Can't load '" + libName + "'", e); Log.i(QtTAG, "Can't load '" + libName + "'", e);
} catch (Exception e) { } catch (Exception e) {

View File

@ -595,8 +595,7 @@ namespace QT_NAMESPACE {
//! [43] //! [43]
class MyClass : public QObject class MyClass : public QObject
{ {
private:
private:
Q_DISABLE_COPY(MyClass) Q_DISABLE_COPY(MyClass)
}; };
@ -605,22 +604,21 @@ class MyClass : public QObject
//! [44] //! [44]
class MyClass : public QObject class MyClass : public QObject
{ {
private:
private: MyClass(const MyClass &) = delete;
MyClass(const MyClass &); MyClass &operator=(const MyClass &) = delete;
MyClass &operator=(const MyClass &);
}; };
//! [44] //! [44]
//! [45] //! [45]
QWidget w = QWidget(); QWidget w = QWidget();
//! [45] //! [45]
//! [46] //! [46]
// Instead of comparing with 0.0 // Instead of comparing with 0.0
qFuzzyCompare(0.0,1.0e-200); // This will return false qFuzzyCompare(0.0, 1.0e-200); // This will return false
// Compare adding 1 to both values will fix the problem // Compare adding 1 to both values will fix the problem
qFuzzyCompare(1 + 0.0, 1 + 1.0e-200); // This will return true qFuzzyCompare(1 + 0.0, 1 + 1.0e-200); // This will return true
//! [46] //! [46]
//! [47] //! [47]

View File

@ -104,7 +104,6 @@
#else #else
# define QT_FEATURE_renameat2 -1 # define QT_FEATURE_renameat2 -1
#endif #endif
#define QT_FEATURE_settings -1
#define QT_FEATURE_sharedmemory -1 #define QT_FEATURE_sharedmemory -1
#define QT_FEATURE_slog2 -1 #define QT_FEATURE_slog2 -1
#ifdef __GLIBC_PREREQ #ifdef __GLIBC_PREREQ
@ -127,11 +126,13 @@
#define QT_FEATURE_commandlineparser -1 #define QT_FEATURE_commandlineparser -1
#define QT_NO_COMPRESS #define QT_NO_COMPRESS
#define QT_JSON_READONLY #define QT_JSON_READONLY
#define QT_FEATURE_settings 1
#define QT_NO_STANDARDPATHS #define QT_NO_STANDARDPATHS
#define QT_FEATURE_textcodec -1 #define QT_FEATURE_textcodec -1
#else #else
#define QT_FEATURE_codecs -1 #define QT_FEATURE_codecs -1
#define QT_FEATURE_commandlineparser 1 #define QT_FEATURE_commandlineparser 1
#define QT_FEATURE_settings -1
#define QT_FEATURE_textcodec 1 #define QT_FEATURE_textcodec 1
#endif #endif

View File

@ -3833,7 +3833,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

View File

@ -435,6 +435,7 @@
*/ */
/*! /*!
\keyword qglobalstatic-operator-type-ptr
\fn template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> QGlobalStatic<T, innerFunction, guard>::operator Type*() \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.
*/ */
/*! /*!

View File

@ -41,7 +41,9 @@
#include "qdir.h" #include "qdir.h"
#include "qstringlist.h" #include "qstringlist.h"
#include "qfile.h" #include "qfile.h"
#if QT_CONFIG(settings)
#include "qsettings.h" #include "qsettings.h"
#endif
#include "qlibraryinfo.h" #include "qlibraryinfo.h"
#include "qscopedpointer.h" #include "qscopedpointer.h"
@ -67,7 +69,7 @@ QT_BEGIN_NAMESPACE
extern void qDumpCPUFeatures(); // in qsimd.cpp extern void qDumpCPUFeatures(); // in qsimd.cpp
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
struct QLibrarySettings struct QLibrarySettings
{ {
@ -204,7 +206,7 @@ QSettings *QLibraryInfoPrivate::findConfiguration()
return 0; //no luck return 0; //no luck
} }
#endif // QT_NO_SETTINGS #endif // settings
/*! /*!
\class QLibraryInfo \class QLibraryInfo
@ -464,7 +466,7 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
#endif // QT_BUILD_QMAKE, started inside location ! #endif // QT_BUILD_QMAKE, started inside location !
QString ret; QString ret;
bool fromConf = false; bool fromConf = false;
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
#ifdef QT_BUILD_QMAKE #ifdef QT_BUILD_QMAKE
// Logic for choosing the right data source: if EffectivePaths are requested // Logic for choosing the right data source: if EffectivePaths are requested
// and qt.conf with that section is present, use it, otherwise fall back to // and qt.conf with that section is present, use it, otherwise fall back to
@ -547,7 +549,7 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
ret = QDir::fromNativeSeparators(ret); ret = QDir::fromNativeSeparators(ret);
} }
} }
#endif // QT_NO_SETTINGS #endif // settings
#ifndef QT_BUILD_QMAKE_BOOTSTRAP #ifndef QT_BUILD_QMAKE_BOOTSTRAP
if (!fromConf) { if (!fromConf) {
@ -646,7 +648,7 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
QStringList QLibraryInfo::platformPluginArguments(const QString &platformName) QStringList QLibraryInfo::platformPluginArguments(const QString &platformName)
{ {
#if !defined(QT_BUILD_QMAKE) && !defined(QT_NO_SETTINGS) #if !defined(QT_BUILD_QMAKE) && QT_CONFIG(settings)
QScopedPointer<const QSettings> settings(QLibraryInfoPrivate::findConfiguration()); QScopedPointer<const QSettings> settings(QLibraryInfoPrivate::findConfiguration());
if (!settings.isNull()) { if (!settings.isNull()) {
const QString key = QLatin1String(platformsSection) const QString key = QLatin1String(platformsSection)
@ -657,7 +659,7 @@ QStringList QLibraryInfo::platformPluginArguments(const QString &platformName)
} }
#else #else
Q_UNUSED(platformName); Q_UNUSED(platformName);
#endif // !QT_BUILD_QMAKE && !QT_NO_SETTINGS #endif // !QT_BUILD_QMAKE && settings
return QStringList(); return QStringList();
} }

View File

@ -1885,7 +1885,7 @@ static void qt_message_fatal(QtMsgType, const QMessageLogContext &context, const
// [support.start.term]). So we bypass std::abort() and directly // [support.start.term]). So we bypass std::abort() and directly
// terminate the application. // terminate the application.
# ifdef Q_CC_MSVC # if defined(Q_CC_MSVC) && !defined(Q_CC_INTEL)
if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE)) if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
__fastfail(FAST_FAIL_FATAL_APP_EXIT); __fastfail(FAST_FAIL_FATAL_APP_EXIT);
# else # else

View File

@ -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.
*/ */
/*! /*!

View File

@ -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)

View File

@ -218,6 +218,7 @@ struct QRandomGenerator::SystemGenerator
#endif // Q_OS_WINRT #endif // Q_OS_WINRT
static SystemGenerator &self(); static SystemGenerator &self();
typedef quint32 result_type;
void generate(quint32 *begin, quint32 *end) Q_DECL_NOEXCEPT_EXPR(FillBufferNoexcept); void generate(quint32 *begin, quint32 *end) Q_DECL_NOEXCEPT_EXPR(FillBufferNoexcept);
// For std::mersenne_twister_engine implementations that use something // For std::mersenne_twister_engine implementations that use something

View File

@ -34,8 +34,6 @@ HEADERS += \
io/qurlquery.h \ io/qurlquery.h \
io/qurltlds_p.h \ io/qurltlds_p.h \
io/qtldurl_p.h \ io/qtldurl_p.h \
io/qsettings.h \
io/qsettings_p.h \
io/qfsfileengine_p.h \ io/qfsfileengine_p.h \
io/qfsfileengine_iterator_p.h \ io/qfsfileengine_iterator_p.h \
io/qfilesystementry_p.h \ io/qfilesystementry_p.h \
@ -73,7 +71,6 @@ SOURCES += \
io/qurlidna.cpp \ io/qurlidna.cpp \
io/qurlquery.cpp \ io/qurlquery.cpp \
io/qurlrecode.cpp \ io/qurlrecode.cpp \
io/qsettings.cpp \
io/qfsfileengine.cpp \ io/qfsfileengine.cpp \
io/qfsfileengine_iterator.cpp \ io/qfsfileengine_iterator.cpp \
io/qfilesystementry.cpp \ io/qfilesystementry.cpp \
@ -121,6 +118,24 @@ qtConfig(processenvironment) {
SOURCES += io/qprocess_unix.cpp SOURCES += io/qprocess_unix.cpp
} }
qtConfig(settings) {
SOURCES += \
io/qsettings.cpp
HEADERS += \
io/qsettings.h \
io/qsettings_p.h
win32 {
!winrt {
SOURCES += io/qsettings_win.cpp
} else {
SOURCES += io/qsettings_winrt.cpp
}
} else: darwin:!nacl {
SOURCES += io/qsettings_mac.cpp
}
}
win32 { win32 {
SOURCES += io/qfsfileengine_win.cpp SOURCES += io/qfsfileengine_win.cpp
SOURCES += io/qlockfile_win.cpp SOURCES += io/qlockfile_win.cpp
@ -136,7 +151,6 @@ win32 {
io/qwindowspipewriter_p.h io/qwindowspipewriter_p.h
SOURCES += \ SOURCES += \
io/qsettings_win.cpp \
io/qstandardpaths_win.cpp \ io/qstandardpaths_win.cpp \
io/qstorageinfo_win.cpp \ io/qstorageinfo_win.cpp \
io/qwindowspipereader.cpp \ io/qwindowspipereader.cpp \
@ -146,7 +160,6 @@ win32 {
} else { } else {
SOURCES += \ SOURCES += \
io/qstandardpaths_winrt.cpp \ io/qstandardpaths_winrt.cpp \
io/qsettings_winrt.cpp \
io/qstorageinfo_stub.cpp io/qstorageinfo_stub.cpp
} }
} else:unix { } else:unix {
@ -162,9 +175,6 @@ win32 {
../3rdparty/forkfd/forkfd.h ../3rdparty/forkfd/forkfd.h
INCLUDEPATH += ../3rdparty/forkfd INCLUDEPATH += ../3rdparty/forkfd
} }
!nacl:mac: {
SOURCES += io/qsettings_mac.cpp
}
mac { mac {
SOURCES += io/qstorageinfo_mac.cpp SOURCES += io/qstorageinfo_mac.cpp
qtConfig(processenvironment): \ qtConfig(processenvironment): \

View File

@ -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{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 {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 {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)
{ {

View File

@ -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)
{ {

View File

@ -1288,7 +1288,6 @@ bool QResourceFileEngine::close()
{ {
Q_D(QResourceFileEngine); Q_D(QResourceFileEngine);
d->offset = 0; d->offset = 0;
d->uncompressed.clear();
return true; return true;
} }
@ -1503,14 +1502,25 @@ uchar *QResourceFileEnginePrivate::map(qint64 offset, qint64 size, QFile::Memory
{ {
Q_Q(QResourceFileEngine); Q_Q(QResourceFileEngine);
Q_UNUSED(flags); Q_UNUSED(flags);
qint64 max = resource.size();
if (resource.isCompressed()) {
uncompress();
max = uncompressed.size();
}
qint64 end; qint64 end;
if (offset < 0 || size <= 0 || !resource.isValid() || if (offset < 0 || size <= 0 || !resource.isValid() ||
add_overflow(offset, size, &end) || end > resource.size()) { add_overflow(offset, size, &end) || end > max) {
q->setError(QFile::UnspecifiedError, QString()); q->setError(QFile::UnspecifiedError, QString());
return 0; return 0;
} }
uchar *address = const_cast<uchar *>(resource.data());
return (address + offset); const uchar *address = resource.data();
if (resource.isCompressed())
address = reinterpret_cast<const uchar *>(uncompressed.constData());
return const_cast<uchar *>(address) + offset;
} }
bool QResourceFileEnginePrivate::unmap(uchar *ptr) bool QResourceFileEnginePrivate::unmap(uchar *ptr)

View File

@ -41,8 +41,6 @@
#include "qplatformdefs.h" #include "qplatformdefs.h"
#include "qsettings.h" #include "qsettings.h"
#ifndef QT_NO_SETTINGS
#include "qsettings_p.h" #include "qsettings_p.h"
#include "qcache.h" #include "qcache.h"
#include "qfile.h" #include "qfile.h"
@ -3617,5 +3615,3 @@ QT_END_NAMESPACE
#ifndef QT_BOOTSTRAPPED #ifndef QT_BOOTSTRAPPED
#include "moc_qsettings.cpp" #include "moc_qsettings.cpp"
#endif #endif
#endif // QT_NO_SETTINGS

View File

@ -45,10 +45,7 @@
#include <QtCore/qstring.h> #include <QtCore/qstring.h>
#include <QtCore/qscopedpointer.h> #include <QtCore/qscopedpointer.h>
QT_BEGIN_NAMESPACE QT_REQUIRE_CONFIG(settings);
QT_END_NAMESPACE
#ifndef QT_NO_SETTINGS
#include <ctype.h> #include <ctype.h>
@ -212,6 +209,4 @@ private:
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QT_NO_SETTINGS
#endif // QSETTINGS_H #endif // QSETTINGS_H

View File

@ -38,7 +38,6 @@
****************************************************************************/ ****************************************************************************/
#include "qsettings.h" #include "qsettings.h"
#ifndef QT_NO_SETTINGS
#include "qsettings_p.h" #include "qsettings_p.h"
#include "qdatetime.h" #include "qdatetime.h"
@ -664,4 +663,3 @@ bool QConfFileSettingsPrivate::writePlistFile(QIODevice &file, const ParsedSetti
} }
QT_END_NAMESPACE QT_END_NAMESPACE
#endif //QT_NO_SETTINGS

View File

@ -39,8 +39,6 @@
#include "qsettings.h" #include "qsettings.h"
#ifndef QT_NO_SETTINGS
#include "qsettings_p.h" #include "qsettings_p.h"
#include "qvector.h" #include "qvector.h"
#include "qmap.h" #include "qmap.h"
@ -864,4 +862,3 @@ QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::F
} }
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QT_NO_SETTINGS

View File

@ -39,8 +39,6 @@
#include "qsettings.h" #include "qsettings.h"
#ifndef QT_NO_SETTINGS
#include "qsettings_p.h" #include "qsettings_p.h"
#include "qvector.h" #include "qvector.h"
#include "qmap.h" #include "qmap.h"
@ -690,4 +688,3 @@ QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::F
} }
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QT_NO_SETTINGS

View File

@ -53,7 +53,9 @@
#include "QtCore/qcoreapplication.h" #include "QtCore/qcoreapplication.h"
#include "QtCore/qtranslator.h" #include "QtCore/qtranslator.h"
#if QT_CONFIG(settings)
#include "QtCore/qsettings.h" #include "QtCore/qsettings.h"
#endif
#ifndef QT_NO_QOBJECT #ifndef QT_NO_QOBJECT
#include "private/qobject_p.h" #include "private/qobject_p.h"
#endif #endif

View File

@ -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

View File

@ -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.

View File

@ -571,30 +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 function, 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 function, which could be a pointer Creates a connection from the timeout() signal to \a slot to be placed in a specific
to a member function of \a context, or it could be a functor to be placed in a specific event loop of \a context, and returns a handle to the connection.
event loop of \a context. It 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, function, connectionType)}. \c {QObject::connect(timer, &QTimer::timeout, context, slot, connectionType)}.
\sa QObject::connect(), timeout()
*/
/*!
\fn template <typename PointerToMemberFunction> QMetaObject::Connection QTimer::callOnTimeout(const QObject *receiver, PointerToMemberFunction slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
\since 5.12
\overload callOnTimeout()
Creates a connection from the timeout() signal to the \a slot in the \a receiver object. Returns
a handle to the connection.
This method is provided for convenience. It's equivalent to calling
\c {QObject::connect(timer, &QTimer::timeout, receiver, slot, connectionType)}.
\sa QObject::connect(), timeout() \sa QObject::connect(), timeout()
*/ */

View File

@ -100,6 +100,8 @@ public:
QMetaObject::Connection callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection); QMetaObject::Connection callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
template <typename Functor> template <typename Functor>
QMetaObject::Connection callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection); QMetaObject::Connection callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
template <typename PointerToMemberFunction>
QMetaObject::Connection callOnTimeout(const QObject *receiver, PointerToMemberFunction slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
#else #else
// singleShot to a QObject slot // singleShot to a QObject slot
template <typename Duration, typename Func1> template <typename Duration, typename Func1>

View File

@ -1438,12 +1438,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.
*/ */

View File

@ -222,7 +222,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
@ -233,7 +233,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.

View File

@ -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().
*/ */
/*! /*!

View File

@ -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.

View File

@ -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}
*/ */

View File

@ -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
*/ */

View File

@ -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.
*/ */

View File

@ -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()}.

View File

@ -217,7 +217,7 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
This class includes data obtained from the CLDR data files under the terms 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
*/ */

View File

@ -50,7 +50,9 @@
#include <QtCore/qmath.h> #include <QtCore/qmath.h>
#include <QtCore/QList> #include <QtCore/QList>
#include <QtCore/QDir> #include <QtCore/QDir>
#if QT_CONFIG(settings)
#include <QtCore/QSettings> #include <QtCore/QSettings>
#endif
#include <QtGui/QPainter> #include <QtGui/QPainter>
#include <private/qhexstring_p.h> #include <private/qhexstring_p.h>
@ -348,7 +350,7 @@ QIconTheme::QIconTheme(const QString &themeName)
m_valid = true; m_valid = true;
} }
} }
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
if (themeIndex.exists()) { if (themeIndex.exists()) {
const QSettings indexReader(themeIndex.fileName(), QSettings::IniFormat); const QSettings indexReader(themeIndex.fileName(), QSettings::IniFormat);
const QStringList keys = indexReader.allKeys(); const QStringList keys = indexReader.allKeys();
@ -407,7 +409,7 @@ QIconTheme::QIconTheme(const QString &themeName)
if (!m_parents.contains(QLatin1String("hicolor"))) if (!m_parents.contains(QLatin1String("hicolor")))
m_parents.append(QLatin1String("hicolor")); m_parents.append(QLatin1String("hicolor"));
} }
#endif //QT_NO_SETTINGS #endif // settings
} }
QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName, QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName,

View File

@ -3018,6 +3018,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()
*/ */
#endif #endif

View File

@ -42,7 +42,9 @@
#include <QtCore/QCoreApplication> #include <QtCore/QCoreApplication>
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <QtCore/QSharedData> #include <QtCore/QSharedData>
#if QT_CONFIG(settings)
#include <QtCore/QSettings> #include <QtCore/QSettings>
#endif
#include <QtCore/QUrl> #include <QtCore/QUrl>
#include <QtCore/QVector> #include <QtCore/QVector>
#include <QtGui/QColor> #include <QtGui/QColor>
@ -296,7 +298,7 @@ QColorDialogStaticData::QColorDialogStaticData() : customSet(false)
void QColorDialogStaticData::readSettings() void QColorDialogStaticData::readSettings()
{ {
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
const QSettings settings(QSettings::UserScope, QStringLiteral("QtProject")); const QSettings settings(QSettings::UserScope, QStringLiteral("QtProject"));
for (int i = 0; i < int(CustomColorCount); ++i) { for (int i = 0; i < int(CustomColorCount); ++i) {
const QVariant v = settings.value(QLatin1String("Qt/customColors/") + QString::number(i)); const QVariant v = settings.value(QLatin1String("Qt/customColors/") + QString::number(i));
@ -308,7 +310,7 @@ void QColorDialogStaticData::readSettings()
void QColorDialogStaticData::writeSettings() const void QColorDialogStaticData::writeSettings() const
{ {
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
if (customSet) { if (customSet) {
const_cast<QColorDialogStaticData*>(this)->customSet = false; const_cast<QColorDialogStaticData*>(this)->customSet = false;
QSettings settings(QSettings::UserScope, QStringLiteral("QtProject")); QSettings settings(QSettings::UserScope, QStringLiteral("QtProject"));

View File

@ -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

View File

@ -48,14 +48,14 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
(QPlatformInputContextFactoryInterface_iid, QLatin1String("/platforminputcontexts"), Qt::CaseInsensitive)) (QPlatformInputContextFactoryInterface_iid, QLatin1String("/platforminputcontexts"), Qt::CaseInsensitive))
#endif #endif
QStringList QPlatformInputContextFactory::keys() QStringList QPlatformInputContextFactory::keys()
{ {
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
return loader()->keyMap().values(); return loader()->keyMap().values();
#else #else
return QStringList(); return QStringList();
@ -70,7 +70,7 @@ QString QPlatformInputContextFactory::requested()
QPlatformInputContext *QPlatformInputContextFactory::create(const QString& key) QPlatformInputContext *QPlatformInputContextFactory::create(const QString& key)
{ {
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
if (!key.isEmpty()) { if (!key.isEmpty()) {
QStringList paramList = key.split(QLatin1Char(':')); QStringList paramList = key.split(QLatin1Char(':'));
const QString platform = paramList.takeFirst().toLower(); const QString platform = paramList.takeFirst().toLower();

View File

@ -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.

View File

@ -97,7 +97,7 @@ void QOpenGLTextureCacheWrapper::cleanupTexturesForPixmapData(QPlatformPixmap *p
QOpenGLTextureCache::QOpenGLTextureCache(QOpenGLContext *ctx) QOpenGLTextureCache::QOpenGLTextureCache(QOpenGLContext *ctx)
: QOpenGLSharedResource(ctx->shareGroup()) : QOpenGLSharedResource(ctx->shareGroup())
, m_cache(64 * 1024) // 64 MB cache , m_cache(256 * 1024) // 256 MB cache
{ {
} }

View File

@ -54,77 +54,77 @@ QT_BEGIN_NAMESPACE
/*! /*!
\internal \internal
If s[0..1] is a valid hex number, returns its integer value, If s[0..n] is a valid hex number, returns its integer value,
otherwise returns -1. otherwise returns -1.
*/ */
static inline int hex2int(const char *s) static inline int hex2int(const char *s, int n)
{ {
const int hi = QtMiscUtils::fromHex(s[0]); if (n < 0)
if (hi < 0)
return -1; return -1;
const int lo = QtMiscUtils::fromHex(s[1]); int result = 0;
if (lo < 0) for (; n > 0; --n) {
return -1; result = result * 16;
return (hi << 4) | lo; const int h = QtMiscUtils::fromHex(*s++);
if (h < 0)
return -1;
result += h;
}
return result;
} }
/*! static bool get_hex_rgb(const char *name, size_t len, QRgba64 *rgb)
\internal
If s is a valid hex digit, returns its integer value,
multiplied by 0x11, otherwise returns -1.
*/
static inline int hex2int(char s)
{
const int h = QtMiscUtils::fromHex(s);
return h < 0 ? h : (h << 4) | h;
}
static bool get_hex_rgb(const char *name, size_t len, QRgb *rgb)
{ {
if (name[0] != '#') if (name[0] != '#')
return false; return false;
name++; name++;
--len; --len;
int a, r, g, b; int a, r, g, b;
a = 255; a = 65535;
if (len == 12) { if (len == 12) {
r = hex2int(name); r = hex2int(name + 0, 4);
g = hex2int(name + 4); g = hex2int(name + 4, 4);
b = hex2int(name + 8); b = hex2int(name + 8, 4);
} else if (len == 9) { } else if (len == 9) {
r = hex2int(name); r = hex2int(name + 0, 3);
g = hex2int(name + 3); g = hex2int(name + 3, 3);
b = hex2int(name + 6); b = hex2int(name + 6, 3);
r = (r << 4) | (r >> 8);
g = (g << 4) | (g >> 8);
b = (b << 4) | (b >> 8);
} else if (len == 8) { } else if (len == 8) {
a = hex2int(name); a = hex2int(name + 0, 2) * 0x101;
r = hex2int(name + 2); r = hex2int(name + 2, 2) * 0x101;
g = hex2int(name + 4); g = hex2int(name + 4, 2) * 0x101;
b = hex2int(name + 6); b = hex2int(name + 6, 2) * 0x101;
} else if (len == 6) { } else if (len == 6) {
r = hex2int(name); r = hex2int(name + 0, 2) * 0x101;
g = hex2int(name + 2); g = hex2int(name + 2, 2) * 0x101;
b = hex2int(name + 4); b = hex2int(name + 4, 2) * 0x101;
} else if (len == 3) { } else if (len == 3) {
r = hex2int(name[0]); r = hex2int(name + 0, 1) * 0x1111;
g = hex2int(name[1]); g = hex2int(name + 1, 1) * 0x1111;
b = hex2int(name[2]); b = hex2int(name + 2, 1) * 0x1111;
} else { } else {
r = g = b = -1; r = g = b = -1;
} }
if ((uint)r > 255 || (uint)g > 255 || (uint)b > 255 || (uint)a > 255) { if ((uint)r > 65535 || (uint)g > 65535 || (uint)b > 65535 || (uint)a > 65535) {
*rgb = 0; *rgb = 0;
return false; return false;
} }
*rgb = qRgba(r, g ,b, a); *rgb = qRgba64(r, g ,b, a);
return true; return true;
} }
bool qt_get_hex_rgb(const char *name, QRgb *rgb) bool qt_get_hex_rgb(const char *name, QRgb *rgb)
{ {
return get_hex_rgb(name, qstrlen(name), rgb); QRgba64 rgba64;
if (!get_hex_rgb(name, qstrlen(name), &rgba64))
return false;
*rgb = rgba64.toArgb32();
return true;
} }
static bool get_hex_rgb(const QChar *str, size_t len, QRgb *rgb) static bool get_hex_rgb(const QChar *str, size_t len, QRgba64 *rgb)
{ {
if (len > 13) if (len > 13)
return false; return false;
@ -948,9 +948,9 @@ bool QColor::setColorFromString(String name)
} }
if (name[0] == QLatin1Char('#')) { if (name[0] == QLatin1Char('#')) {
QRgb rgba; QRgba64 rgba;
if (get_hex_rgb(name.data(), name.size(), &rgba)) { if (get_hex_rgb(name.data(), name.size(), &rgba)) {
setRgba(rgba); setRgba64(rgba);
return true; return true;
} else { } else {
invalidate(); invalidate();
@ -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
{ {

View File

@ -1287,7 +1287,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()

View File

@ -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)
{ {

View File

@ -2709,7 +2709,8 @@ void QTextDocumentLayoutPrivate::layoutBlock(const QTextBlock &bl, int blockPosi
qreal(q->paintDevice()->logicalDpiY()) / qreal(qt_defaultDpi()) : 1; qreal(q->paintDevice()->logicalDpiY()) / qreal(qt_defaultDpi()) : 1;
getLineHeightParams(blockFormat, line, scaling, &lineAdjustment, &lineBreakHeight, &lineHeight, &lineBottom); getLineHeightParams(blockFormat, line, scaling, &lineAdjustment, &lineBreakHeight, &lineHeight, &lineBottom);
if (layoutStruct->pageHeight > 0 && layoutStruct->absoluteY() + lineBreakHeight > layoutStruct->pageBottom) { if (layoutStruct->pageHeight > 0 && layoutStruct->absoluteY() + lineBreakHeight > layoutStruct->pageBottom &&
layoutStruct->pageHeight >= lineBreakHeight) {
layoutStruct->newPage(); layoutStruct->newPage();
floatMargins(layoutStruct->y, layoutStruct, &left, &right); floatMargins(layoutStruct->y, layoutStruct, &left, &right);
@ -3049,18 +3050,12 @@ void QTextDocumentLayout::resizeInlineObject(QTextInlineObject item, int posInDo
QSizeF inlineSize = (pos == QTextFrameFormat::InFlow ? intrinsic : QSizeF(0, 0)); QSizeF inlineSize = (pos == QTextFrameFormat::InFlow ? intrinsic : QSizeF(0, 0));
item.setWidth(inlineSize.width()); item.setWidth(inlineSize.width());
QFontMetrics m(f.font()); if (f.verticalAlignment() == QTextCharFormat::AlignMiddle) {
switch (f.verticalAlignment()) QFontMetrics m(f.font());
{ qreal halfX = m.xHeight()/2.;
case QTextCharFormat::AlignMiddle: item.setAscent((inlineSize.height() + halfX) / 2.);
item.setDescent(inlineSize.height() / 2); item.setDescent((inlineSize.height() - halfX) / 2.);
item.setAscent(inlineSize.height() / 2); } else {
break;
case QTextCharFormat::AlignBaseline:
item.setDescent(m.descent());
item.setAscent(inlineSize.height() - m.descent());
break;
default:
item.setDescent(0); item.setDescent(0);
item.setAscent(inlineSize.height()); item.setAscent(inlineSize.height());
} }

View File

@ -1962,19 +1962,24 @@ const QCharAttributes *QTextEngine::attributes() const
void QTextEngine::shape(int item) const void QTextEngine::shape(int item) const
{ {
if (layoutData->items.at(item).analysis.flags == QScriptAnalysis::Object) { auto &li = layoutData->items[item];
if (li.analysis.flags == QScriptAnalysis::Object) {
ensureSpace(1); ensureSpace(1);
if (block.docHandle()) { if (block.docHandle()) {
docLayout()->resizeInlineObject(QTextInlineObject(item, const_cast<QTextEngine *>(this)), docLayout()->resizeInlineObject(QTextInlineObject(item, const_cast<QTextEngine *>(this)),
layoutData->items[item].position + block.position(), li.position + block.position(),
format(&layoutData->items[item])); format(&li));
} }
} else if (layoutData->items.at(item).analysis.flags == QScriptAnalysis::Tab) { // fix log clusters to point to the previous glyph, as the object doesn't have a glyph of it's own.
// This is required so that all entries in the array get initialized and are ordered correctly.
ushort *lc = logClusters(&li);
*lc = item ? lc[-1] : 0;
} else if (li.analysis.flags == QScriptAnalysis::Tab) {
// set up at least the ascent/descent/leading of the script item for the tab // set up at least the ascent/descent/leading of the script item for the tab
fontEngine(layoutData->items[item], fontEngine(li, &li.ascent, &li.descent, &li.leading);
&layoutData->items[item].ascent, // see the comment above
&layoutData->items[item].descent, ushort *lc = logClusters(&li);
&layoutData->items[item].leading); *lc = item ? lc[-1] : 0;
} else { } else {
shapeText(item); shapeText(item);
} }

View File

@ -649,6 +649,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
@ -2274,7 +2275,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

View File

@ -1834,6 +1834,9 @@ void QTextLine::layout_helper(int maxGlyphs)
lbh.logClusters = eng->layoutData->logClustersPtr; lbh.logClusters = eng->layoutData->logClustersPtr;
lbh.previousGlyph = 0; lbh.previousGlyph = 0;
bool hasInlineObject = false;
QFixed maxInlineObjectHeight = 0;
while (newItem < eng->layoutData->items.size()) { while (newItem < eng->layoutData->items.size()) {
lbh.resetRightBearing(); lbh.resetRightBearing();
lbh.softHyphenWidth = 0; lbh.softHyphenWidth = 0;
@ -1862,8 +1865,11 @@ void QTextLine::layout_helper(int maxGlyphs)
lbh.tmpData.leading = qMax(lbh.tmpData.leading + lbh.tmpData.ascent, lbh.tmpData.leading = qMax(lbh.tmpData.leading + lbh.tmpData.ascent,
current.leading + current.ascent) - qMax(lbh.tmpData.ascent, current.leading + current.ascent) - qMax(lbh.tmpData.ascent,
current.ascent); current.ascent);
lbh.tmpData.ascent = qMax(lbh.tmpData.ascent, current.ascent); if (current.analysis.flags != QScriptAnalysis::Object) {
lbh.tmpData.descent = qMax(lbh.tmpData.descent, current.descent); // objects need some special treatment as they can special alignment or be floating
lbh.tmpData.ascent = qMax(lbh.tmpData.ascent, current.ascent);
lbh.tmpData.descent = qMax(lbh.tmpData.descent, current.descent);
}
if (current.analysis.flags == QScriptAnalysis::Tab && (alignment & (Qt::AlignLeft | Qt::AlignRight | Qt::AlignCenter | Qt::AlignJustify))) { if (current.analysis.flags == QScriptAnalysis::Tab && (alignment & (Qt::AlignLeft | Qt::AlignRight | Qt::AlignCenter | Qt::AlignJustify))) {
lbh.whiteSpaceOrObject = true; lbh.whiteSpaceOrObject = true;
@ -1911,9 +1917,18 @@ void QTextLine::layout_helper(int maxGlyphs)
if (eng->block.docHandle()) { if (eng->block.docHandle()) {
QTextInlineObject inlineObject(item, eng); QTextInlineObject inlineObject(item, eng);
eng->docLayout()->positionInlineObject(inlineObject, eng->block.position() + current.position, inlineObject.format()); QTextFormat f = inlineObject.format();
eng->docLayout()->positionInlineObject(inlineObject, eng->block.position() + current.position, f);
QTextCharFormat::VerticalAlignment valign = f.toCharFormat().verticalAlignment();
if (valign != QTextCharFormat::AlignTop && valign != QTextCharFormat::AlignBottom) {
lbh.tmpData.ascent = qMax(lbh.tmpData.ascent, current.ascent);
lbh.tmpData.descent = qMax(lbh.tmpData.descent, current.descent);
}
} }
hasInlineObject = true;
maxInlineObjectHeight = qMax(maxInlineObjectHeight, current.ascent + current.descent);
lbh.tmpData.textWidth += current.width; lbh.tmpData.textWidth += current.width;
newItem = item + 1; newItem = item + 1;
@ -2049,6 +2064,43 @@ found:
line += lbh.tmpData; line += lbh.tmpData;
} }
if (hasInlineObject && eng->block.docHandle()) {
// position top/bottom aligned inline objects
if (maxInlineObjectHeight > line.ascent + line.descent) {
// extend line height if required
QFixed toAdd = (maxInlineObjectHeight - line.ascent - line.descent)/2;
line.ascent += toAdd;
line.descent = maxInlineObjectHeight - line.ascent;
}
int startItem = eng->findItem(line.from);
int endItem = eng->findItem(line.from + line.length);
if (endItem < 0)
endItem = eng->layoutData->items.size();
for (int item = startItem; item < endItem; ++item) {
QScriptItem &current = eng->layoutData->items[item];
if (current.analysis.flags == QScriptAnalysis::Object) {
QTextInlineObject inlineObject(item, eng);
QTextCharFormat::VerticalAlignment align = inlineObject.format().toCharFormat().verticalAlignment();
QFixed height = current.ascent + current.descent;
switch (align) {
case QTextCharFormat::AlignTop:
current.ascent = line.ascent;
current.descent = height - line.ascent;
break;
case QTextCharFormat::AlignBottom:
current.descent = line.descent;
current.ascent = height - line.descent;
break;
default:
break;
}
Q_ASSERT(line.ascent >= current.ascent);
Q_ASSERT(line.descent >= current.descent);
}
}
}
LB_DEBUG("line length = %d, ascent=%f, descent=%f, textWidth=%f (spacew=%f)", line.length, line.ascent.toReal(), LB_DEBUG("line length = %d, ascent=%f, descent=%f, textWidth=%f (spacew=%f)", line.length, line.ascent.toReal(),
line.descent.toReal(), line.textWidth.toReal(), lbh.spaceData.width.toReal()); line.descent.toReal(), line.textWidth.toReal(), lbh.spaceData.width.toReal());
LB_DEBUG(" : '%s'", eng->layoutData->string.mid(line.from, line.length).toUtf8().data()); LB_DEBUG(" : '%s'", eng->layoutData->string.mid(line.from, line.length).toUtf8().data());
@ -2522,6 +2574,8 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR
QFixed itemY = y - si.ascent; QFixed itemY = y - si.ascent;
if (format.verticalAlignment() == QTextCharFormat::AlignTop) { if (format.verticalAlignment() == QTextCharFormat::AlignTop) {
itemY = y - lineBase; itemY = y - lineBase;
} else if (format.verticalAlignment() == QTextCharFormat::AlignBottom) {
itemY = y + line.descent - si.ascent - si.descent;
} }
QRectF itemRect(iterator.x.toReal(), itemY.toReal(), iterator.itemWidth.toReal(), si.height().toReal()); QRectF itemRect(iterator.x.toReal(), itemY.toReal(), iterator.itemWidth.toReal(), si.height().toReal());

View File

@ -424,7 +424,7 @@
Note that by combining this option with ReuseAddressHint, you will Note that by combining this option with ReuseAddressHint, you will
also allow your service to rebind an existing shared address. On also allow your service to rebind an existing shared address. On
Unix, this is equivalent to the SO_REUSEADDR socket option. On Windows, Unix, this is equivalent to the SO_REUSEADDR socket option. On Windows,
this option is ignored. this is the default behavior, so this option is ignored.
\value DontShareAddress Bind the address and port exclusively, so that \value DontShareAddress Bind the address and port exclusively, so that
no other services are allowed to rebind. By passing this option to no other services are allowed to rebind. By passing this option to
@ -444,7 +444,7 @@
\value DefaultForPlatform The default option for the current platform. \value DefaultForPlatform The default option for the current platform.
On Unix and \macos, this is equivalent to (DontShareAddress On Unix and \macos, this is equivalent to (DontShareAddress
+ ReuseAddressHint), and on Windows, its equivalent to ShareAddress. + ReuseAddressHint), and on Windows, it is equivalent to ShareAddress.
*/ */
/*! \enum QAbstractSocket::PauseMode /*! \enum QAbstractSocket::PauseMode
@ -455,7 +455,7 @@
The only notification currently supported is QSslSocket::sslErrors(). The only notification currently supported is QSslSocket::sslErrors().
\value PauseNever Do not pause data transfer on the socket. This is the \value PauseNever Do not pause data transfer on the socket. This is the
default and matches the behaviour of Qt 4. default and matches the behavior of Qt 4.
\value PauseOnSslErrors Pause data transfer on the socket upon receiving an \value PauseOnSslErrors Pause data transfer on the socket upon receiving an
SSL error notification. I.E. QSslSocket::sslErrors(). SSL error notification. I.E. QSslSocket::sslErrors().
*/ */
@ -1538,11 +1538,9 @@ void QAbstractSocket::setPauseMode(PauseModes pauseMode)
Binds to \a address on port \a port, using the BindMode \a mode. Binds to \a address on port \a port, using the BindMode \a mode.
Binds this socket to the address \a address and the port \a port.
For UDP sockets, after binding, the signal QUdpSocket::readyRead() is emitted For UDP sockets, after binding, the signal QUdpSocket::readyRead() is emitted
whenever a UDP datagram arrives on the specified address and port. whenever a UDP datagram arrives on the specified address and port.
Thus, This function is useful to write UDP servers. Thus, this function is useful to write UDP servers.
For TCP sockets, this function may be used to specify which interface to use For TCP sockets, this function may be used to specify which interface to use
for an outgoing connection, which is useful in case of multiple network for an outgoing connection, which is useful in case of multiple network

View File

@ -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.

View File

@ -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
}; };

View File

@ -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;
} }

View File

@ -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) {

View File

@ -1107,6 +1107,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) {

View File

@ -174,6 +174,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();
@ -285,6 +287,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;
@ -1291,6 +1295,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;

View File

@ -130,6 +130,10 @@ const char *q_OpenSSL_version(int type);
unsigned long q_SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session); unsigned long q_SSL_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"

View File

@ -161,6 +161,7 @@ DEFINEFUNC(void, OPENSSL_sk_free, OPENSSL_STACK *a, a, return, DUMMYARG)
DEFINEFUNC2(void *, OPENSSL_sk_value, OPENSSL_STACK *a, a, int b, b, return nullptr, return) 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)

View File

@ -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,

View File

@ -5202,25 +5202,6 @@ void QGLWidgetPrivate::cleanupColormaps()
{ {
} }
Q_GLOBAL_STATIC(QString, qt_gl_lib_name)
void qt_set_gl_library_name(const QString& name)
{
qt_gl_lib_name()->operator=(name);
}
const QString qt_gl_library_name()
{
if (qt_gl_lib_name()->isNull()) {
# if defined(QT_OPENGL_ES_2)
return QLatin1String("GLESv2");
# else
return QLatin1String("GL");
# endif
}
return *qt_gl_lib_name();
}
void QGLContextGroup::addShare(const QGLContext *context, const QGLContext *share) { void QGLContextGroup::addShare(const QGLContext *context, const QGLContext *share) {
Q_ASSERT(context && share); Q_ASSERT(context && share);
if (context->d_ptr->group == share->d_ptr->group) if (context->d_ptr->group == share->d_ptr->group)

View File

@ -50,7 +50,9 @@
#include "qcoretextfontdatabase_p.h" #include "qcoretextfontdatabase_p.h"
#include "qfontengine_coretext_p.h" #include "qfontengine_coretext_p.h"
#if QT_CONFIG(settings)
#include <QtCore/QSettings> #include <QtCore/QSettings>
#endif
#include <QtCore/QtEndian> #include <QtCore/QtEndian>
#ifndef QT_NO_FREETYPE #ifndef QT_NO_FREETYPE
#include <QtFontDatabaseSupport/private/qfontengine_ft_p.h> #include <QtFontDatabaseSupport/private/qfontengine_ft_p.h>
@ -116,21 +118,25 @@ QCoreTextFontDatabase::QCoreTextFontDatabase()
: m_hasPopulatedAliases(false) : m_hasPopulatedAliases(false)
{ {
#ifdef Q_OS_MACX #ifdef Q_OS_MACX
QSettings appleSettings(QLatin1String("apple.com"));
QVariant appleValue = appleSettings.value(QLatin1String("AppleAntiAliasingThreshold"));
if (appleValue.isValid())
QCoreTextFontEngine::antialiasingThreshold = appleValue.toInt();
/* /*
font_smoothing = 0 means no smoothing, while 1-3 means subpixel font_smoothing = 0 means no smoothing, while 1-3 means subpixel
antialiasing with different hinting styles (but we don't care about the antialiasing with different hinting styles (but we don't care about the
exact value, only if subpixel rendering is available or not) exact value, only if subpixel rendering is available or not)
*/ */
int font_smoothing = 0; int font_smoothing = 0;
#if QT_CONFIG(settings)
QSettings appleSettings(QLatin1String("apple.com"));
QVariant appleValue = appleSettings.value(QLatin1String("AppleAntiAliasingThreshold"));
if (appleValue.isValid())
QCoreTextFontEngine::antialiasingThreshold = appleValue.toInt();
appleValue = appleSettings.value(QLatin1String("AppleFontSmoothing")); appleValue = appleSettings.value(QLatin1String("AppleFontSmoothing"));
if (appleValue.isValid()) { if (appleValue.isValid()) {
font_smoothing = appleValue.toInt(); font_smoothing = appleValue.toInt();
} else { } else
#endif // settings
{
// non-Apple displays do not provide enough information about subpixel rendering so // non-Apple displays do not provide enough information about subpixel rendering so
// draw text with cocoa and compare pixel colors to see if subpixel rendering is enabled // draw text with cocoa and compare pixel colors to see if subpixel rendering is enabled
int w = 10; int w = 10;

View File

@ -41,7 +41,9 @@
#include <qpa/qplatformfontdatabase.h> #include <qpa/qplatformfontdatabase.h>
#include <QtCore/qendian.h> #include <QtCore/qendian.h>
#if QT_CONFIG(settings)
#include <QtCore/qsettings.h> #include <QtCore/qsettings.h>
#endif
#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qoperatingsystemversion.h>
#include <private/qimage_p.h> #include <private/qimage_p.h>

View File

@ -45,7 +45,9 @@
#if QT_CONFIG(process) #if QT_CONFIG(process)
# include <QtCore/QProcess> # include <QtCore/QProcess>
#endif #endif
#if QT_CONFIG(settings)
#include <QtCore/QSettings> #include <QtCore/QSettings>
#endif
#include <QtCore/QStandardPaths> #include <QtCore/QStandardPaths>
#include <QtCore/QUrl> #include <QtCore/QUrl>
@ -93,7 +95,7 @@ static inline QByteArray detectDesktopEnvironment()
// This can be a path in /usr/share/xsessions // This can be a path in /usr/share/xsessions
int slash = desktopSession.lastIndexOf('/'); int slash = desktopSession.lastIndexOf('/');
if (slash != -1) { if (slash != -1) {
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
QSettings desktopFile(QFile::decodeName(desktopSession + ".desktop"), QSettings::IniFormat); QSettings desktopFile(QFile::decodeName(desktopSession + ".desktop"), QSettings::IniFormat);
desktopFile.beginGroup(QStringLiteral("Desktop Entry")); desktopFile.beginGroup(QStringLiteral("Desktop Entry"));
QByteArray desktopName = desktopFile.value(QStringLiteral("DesktopNames")).toByteArray(); QByteArray desktopName = desktopFile.value(QStringLiteral("DesktopNames")).toByteArray();

View File

@ -53,7 +53,9 @@
#include <QtCore/QMimeDatabase> #include <QtCore/QMimeDatabase>
#endif #endif
#include <QtCore/QLoggingCategory> #include <QtCore/QLoggingCategory>
#if QT_CONFIG(settings)
#include <QtCore/QSettings> #include <QtCore/QSettings>
#endif
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <QtCore/QStandardPaths> #include <QtCore/QStandardPaths>
#include <QtCore/QStringList> #include <QtCore/QStringList>
@ -261,7 +263,7 @@ static QIcon xdgFileIcon(const QFileInfo &fileInfo)
} }
#endif #endif
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
class QKdeThemePrivate : public QPlatformThemePrivate class QKdeThemePrivate : public QPlatformThemePrivate
{ {
public: public:
@ -688,7 +690,7 @@ QPlatformSystemTrayIcon *QKdeTheme::createPlatformSystemTrayIcon() const
} }
#endif #endif
#endif // QT_NO_SETTINGS #endif // settings
/*! /*!
\class QGnomeTheme \class QGnomeTheme
@ -834,7 +836,7 @@ QPlatformTheme *QGenericUnixTheme::createUnixTheme(const QString &name)
{ {
if (name == QLatin1String(QGenericUnixTheme::name)) if (name == QLatin1String(QGenericUnixTheme::name))
return new QGenericUnixTheme; return new QGenericUnixTheme;
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
if (name == QLatin1String(QKdeTheme::name)) if (name == QLatin1String(QKdeTheme::name))
if (QPlatformTheme *kdeTheme = QKdeTheme::createKdeTheme()) if (QPlatformTheme *kdeTheme = QKdeTheme::createKdeTheme())
return kdeTheme; return kdeTheme;
@ -859,7 +861,7 @@ QStringList QGenericUnixTheme::themeNames()
const QList<QByteArray> desktopNames = desktopEnvironment.split(':'); const QList<QByteArray> desktopNames = desktopEnvironment.split(':');
for (const QByteArray &desktopName : desktopNames) { for (const QByteArray &desktopName : desktopNames) {
if (desktopEnvironment == "KDE") { if (desktopEnvironment == "KDE") {
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
result.push_back(QLatin1String(QKdeTheme::name)); result.push_back(QLatin1String(QKdeTheme::name));
#endif #endif
} else if (gtkBasedEnvironments.contains(desktopName)) { } else if (gtkBasedEnvironments.contains(desktopName)) {

View File

@ -96,7 +96,7 @@ public:
static const char *name; static const char *name;
}; };
#ifndef QT_NO_SETTINGS #if QT_CONFIG(settings)
class QKdeThemePrivate; class QKdeThemePrivate;
class QKdeTheme : public QPlatformTheme class QKdeTheme : public QPlatformTheme
@ -123,7 +123,7 @@ public:
static const char *name; static const char *name;
}; };
#endif // QT_NO_SETTINGS #endif // settings
class QGnomeThemePrivate; class QGnomeThemePrivate;

View File

@ -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:

View File

@ -1549,7 +1549,9 @@ QCocoaNSWindow *QCocoaWindow::createNSWindow(bool shouldBePanel)
QWindowSystemInterface::SynchronousDelivery>(window(), targetScreen); QWindowSystemInterface::SynchronousDelivery>(window(), targetScreen);
} }
nsWindow.delegate = [[QNSWindowDelegate alloc] initWithQCocoaWindow:this]; static QSharedPointer<QNSWindowDelegate> sharedDelegate([[QNSWindowDelegate alloc] init],
[](QNSWindowDelegate *delegate) { [delegate release]; });
nsWindow.delegate = sharedDelegate.get();
// Prevent Cocoa from releasing the window on close. Qt // Prevent Cocoa from releasing the window on close. Qt
// handles the close event asynchronously and we want to // handles the close event asynchronously and we want to

View File

@ -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
@ -177,6 +166,8 @@
- (void)dealloc - (void)dealloc
{ {
qCDebug(lcQpaWindow) << "Deallocating" << self;
if (m_trackingArea) { if (m_trackingArea) {
[self removeTrackingArea:m_trackingArea]; [self removeTrackingArea:m_trackingArea];
[m_trackingArea release]; [m_trackingArea release];

View File

@ -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

View File

@ -238,11 +238,7 @@ static bool isMouseEvent(NSEvent *ev)
- (void)closeAndRelease - (void)closeAndRelease
{ {
qCDebug(lcQpaWindow) << "closeAndRelease" << self; qCDebug(lcQpaWindow) << "Closing and releasing" << self;
[self.delegate release];
self.delegate = nil;
[self close]; [self close];
[self release]; [self release];
} }
@ -251,7 +247,9 @@ static bool isMouseEvent(NSEvent *ev)
#pragma clang diagnostic ignored "-Wobjc-missing-super-calls" #pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
- (void)dealloc - (void)dealloc
{ {
qCDebug(lcQpaWindow) << "dealloc" << self; qCDebug(lcQpaWindow) << "Deallocating" << self;
self.delegate = nil;
qt_objcDynamicSuper(); qt_objcDynamicSuper();
} }
#pragma clang diagnostic pop #pragma clang diagnostic pop

View File

@ -48,9 +48,6 @@ class QCocoaWindow;
QT_END_NAMESPACE QT_END_NAMESPACE
@interface QT_MANGLE_NAMESPACE(QNSWindowDelegate) : NSObject <NSWindowDelegate> @interface QT_MANGLE_NAMESPACE(QNSWindowDelegate) : NSObject <NSWindowDelegate>
- (instancetype)initWithQCocoaWindow:(QT_PREPEND_NAMESPACE(QCocoaWindow) *)cocoaWindow;
@end @end
QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSWindowDelegate); QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSWindowDelegate);

View File

@ -49,23 +49,17 @@
static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*")); static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
@implementation QNSWindowDelegate { static QCocoaWindow *toPlatformWindow(NSWindow *window)
QCocoaWindow *m_cocoaWindow; {
return qnsview_cast(window.contentView).platformWindow;
} }
- (instancetype)initWithQCocoaWindow:(QCocoaWindow *)cocoaWindow @implementation QNSWindowDelegate
{
if ((self = [self init]))
m_cocoaWindow = cocoaWindow;
return self;
}
- (BOOL)windowShouldClose:(NSNotification *)notification - (BOOL)windowShouldClose:(NSWindow *)window
{ {
Q_UNUSED(notification); if (QCocoaWindow *platformWindow = toPlatformWindow(window))
if (m_cocoaWindow) { return platformWindow->windowShouldClose();
return m_cocoaWindow->windowShouldClose();
}
return YES; return YES;
} }
@ -79,14 +73,16 @@ static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
- (NSRect)windowWillUseStandardFrame:(NSWindow *)window defaultFrame:(NSRect)proposedFrame - (NSRect)windowWillUseStandardFrame:(NSWindow *)window defaultFrame:(NSRect)proposedFrame
{ {
Q_UNUSED(proposedFrame); Q_UNUSED(proposedFrame);
Q_ASSERT(window == m_cocoaWindow->nativeWindow());
const QWindow *w = m_cocoaWindow->window(); QCocoaWindow *platformWindow = toPlatformWindow(window);
Q_ASSERT(platformWindow);
const QWindow *w = platformWindow->window();
// maximumSize() refers to the client size, but AppKit expects the full frame size // maximumSize() refers to the client size, but AppKit expects the full frame size
QSizeF maximumSize = w->maximumSize() + QSize(0, w->frameMargins().top()); QSizeF maximumSize = w->maximumSize() + QSize(0, w->frameMargins().top());
// The window should never be larger than the current screen geometry // The window should never be larger than the current screen geometry
const QRectF screenGeometry = m_cocoaWindow->screen()->geometry(); const QRectF screenGeometry = platformWindow->screen()->geometry();
maximumSize = maximumSize.boundedTo(screenGeometry.size()); maximumSize = maximumSize.boundedTo(screenGeometry.size());
// Use the current frame position for the initial maximized frame, // Use the current frame position for the initial maximized frame,
@ -113,6 +109,8 @@ static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
#pragma clang diagnostic ignored "-Wdeprecated-declarations" #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)frameSize - (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)frameSize
{ {
Q_ASSERT(toPlatformWindow(window));
qCDebug(lcQpaWindow) << window << "will resize to" << QSizeF::fromCGSize(frameSize) qCDebug(lcQpaWindow) << window << "will resize to" << QSizeF::fromCGSize(frameSize)
<< "- disabling screen updates temporarily"; << "- disabling screen updates temporarily";
@ -131,6 +129,8 @@ static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
- (void)windowDidResize:(NSNotification *)notification - (void)windowDidResize:(NSNotification *)notification
{ {
NSWindow *window = notification.object; NSWindow *window = notification.object;
Q_ASSERT(toPlatformWindow(window));
qCDebug(lcQpaWindow) << window << "was resized - re-enabling screen updates"; qCDebug(lcQpaWindow) << window << "was resized - re-enabling screen updates";
NSEnableScreenUpdates(); NSEnableScreenUpdates();
} }
@ -138,23 +138,27 @@ static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu - (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu
{ {
Q_UNUSED(window);
Q_UNUSED(menu); Q_UNUSED(menu);
QCocoaWindow *platformWindow = toPlatformWindow(window);
Q_ASSERT(platformWindow);
// Only pop up document path if the filename is non-empty. We allow whitespace, to // Only pop up document path if the filename is non-empty. We allow whitespace, to
// allow faking a window icon by setting the file path to a single space character. // allow faking a window icon by setting the file path to a single space character.
return !whitespaceRegex.exactMatch(m_cocoaWindow->window()->filePath()); return !whitespaceRegex.exactMatch(platformWindow->window()->filePath());
} }
- (BOOL)window:(NSWindow *)window shouldDragDocumentWithEvent:(NSEvent *)event from:(NSPoint)dragImageLocation withPasteboard:(NSPasteboard *)pasteboard - (BOOL)window:(NSWindow *)window shouldDragDocumentWithEvent:(NSEvent *)event from:(NSPoint)dragImageLocation withPasteboard:(NSPasteboard *)pasteboard
{ {
Q_UNUSED(window);
Q_UNUSED(event); Q_UNUSED(event);
Q_UNUSED(dragImageLocation); Q_UNUSED(dragImageLocation);
Q_UNUSED(pasteboard); Q_UNUSED(pasteboard);
QCocoaWindow *platformWindow = toPlatformWindow(window);
Q_ASSERT(platformWindow);
// Only allow drag if the filename is non-empty. We allow whitespace, to // Only allow drag if the filename is non-empty. We allow whitespace, to
// allow faking a window icon by setting the file path to a single space. // allow faking a window icon by setting the file path to a single space.
return !whitespaceRegex.exactMatch(m_cocoaWindow->window()->filePath()); return !whitespaceRegex.exactMatch(platformWindow->window()->filePath());
} }
@end @end

View File

@ -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
} }

View File

@ -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();
} }

View File

@ -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
} }

View File

@ -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()

View File

@ -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);
@ -609,6 +629,7 @@ bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd,
bool QWindowsPointerHandler::translatePenEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, bool QWindowsPointerHandler::translatePenEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et,
MSG msg, PVOID vPenInfo) MSG msg, PVOID vPenInfo)
{ {
#if QT_CONFIG(tabletevent)
if (et & QtWindows::NonClientEventFlag) if (et & QtWindows::NonClientEventFlag)
return false; // Let DefWindowProc() handle Non Client messages. return false; // Let DefWindowProc() handle Non Client messages.
@ -703,6 +724,14 @@ bool QWindowsPointerHandler::translatePenEvent(QWindow *window, HWND hwnd, QtWin
} }
} }
return true; return true;
#else
Q_UNUSED(window);
Q_UNUSED(hwnd);
Q_UNUSED(et);
Q_UNUSED(msg);
Q_UNUSED(vPenInfo);
return false;
#endif
} }
// Process old-style mouse messages here. // Process old-style mouse messages here.
@ -788,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,

View File

@ -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; }

Some files were not shown because too many files have changed in this diff Show More