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/qlalr
/bin/qml
/bin/qml1plugindump
/bin/qmleasing
/bin/qmlimportscanner
/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);
m_device->setSize(size());
m_device->setSize(size() * devicePixelRatio());
m_device->setDevicePixelRatio(devicePixelRatio());
QPainter painter(m_device);
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_USE_LLVM = true
exists($$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++.so): \
ANDROID_CXX_STL_LIBS = -lc++
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_STDCPP_PATH = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libgnustl_shared.so
ANDROID_CXX_STL_LIBS = -lgnustl_shared -lgcc
ANDROID_USE_LLVM = false
exists($$NDK_ROOT/sysroot/usr/include): \
QMAKE_CFLAGS += --sysroot=$$NDK_ROOT/sysroot \

View File

@ -17,6 +17,10 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {
isEmpty(NDK_ROOT): NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT
FILE_CONTENT += " \"ndk\": $$emitString($$NDK_ROOT),"
equals(ANDROID_USE_LLVM, true) {
FILE_CONTENT += " \"toolchain-prefix\": \"llvm\","
FILE_CONTENT += " \"tool-prefix\": \"llvm\","
} else {
NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX)
isEmpty(NDK_TOOLCHAIN_PREFIX) {
equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86
@ -28,6 +32,7 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {
}
FILE_CONTENT += " \"toolchain-prefix\": $$emitString($$NDK_TOOLCHAIN_PREFIX),"
FILE_CONTENT += " \"tool-prefix\": $$emitString($$NDK_TOOLS_PREFIX),"
}
NDK_TOOLCHAIN_VERSION = $$(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_
FILE_CONTENT += " \"qml-root-path\": $$emitString($$QML_ROOT_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 += "}"

View File

@ -259,3 +259,10 @@ isEmpty(xcode_product_bundle_target): \
xcode_product_bundle_target = ${PRODUCT_NAME:rfc1034identifier}
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
!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)
qml1_target {
DESTDIR = $$MODULE_BASE_OUTDIR/imports/$$TARGETPATH
instbase = $$[QT_INSTALL_IMPORTS]
} else {
DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
instbase = $$[QT_INSTALL_QML]
}
DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
!qml1_target:static: \
static: \
CONFIG += builtin_resources
else: \
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
qmldir.files = $$qmldir_file $$fq_aux_qml_files
install_qml_files: qmldir.files += $$fq_qml_files
qmldir.path = $$instbase/$$TARGETPATH
qmldir.path = $$[QT_INSTALL_QML]/$$TARGETPATH
INSTALLS += qmldir
!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)
qml1_target {
DESTDIR = $$MODULE_BASE_OUTDIR/imports/$$TARGETPATH
instbase = $$[QT_INSTALL_IMPORTS]
} else {
DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
instbase = $$[QT_INSTALL_QML]
}
DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH
target.path = $$instbase/$$TARGETPATH
target.path = $$[QT_INSTALL_QML]/$$TARGETPATH
INSTALLS += target
# Some final setup
@ -75,20 +69,11 @@ load(qt_common)
# directory. Then review and commit the changes made to plugins.qmltypes.
#
!cross_compile {
qml1_target {
qmlplugindump = qml1plugindump
importpath.name = QML_IMPORT_PATH
} else {
qmlplugindump = qmlplugindump
importpath.name = QML2_IMPORT_PATH
}
importpath.value =
for(qmod, QTREPOS) {
qml1_target: \
qmod = $$qmod/imports
else: \
qmod = $$qmod/qml
exists($$qmod): importpath.value += $$shell_path($$qmod)
exists($$qmod/qml): importpath.value += $$shell_path($$qmod/qml)
}
importpath.value = $$unique(importpath.value)
QT_TOOL_ENV = importpath

View File

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

View File

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

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 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; }
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); }
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",
"Name": "LibJPEG-turbo",
"QDocModule": "qtgui",
"QtUsage": "Used in the QJPEG image plugin. Configure with -no-jpeg to avoid.",
"QtUsage": "Used in the qjpeg image plugin. Configure with -system-libjpeg or -no-libjpeg to avoid.",
"Description": "The Independent JPEG Group's JPEG software",
"Homepage": "http://libjpeg-turbo.virtualgl.org/",

View File

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

View File

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

View File

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

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

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

View File

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

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -41,7 +41,9 @@
#include "qdir.h"
#include "qstringlist.h"
#include "qfile.h"
#if QT_CONFIG(settings)
#include "qsettings.h"
#endif
#include "qlibraryinfo.h"
#include "qscopedpointer.h"
@ -67,7 +69,7 @@ QT_BEGIN_NAMESPACE
extern void qDumpCPUFeatures(); // in qsimd.cpp
#ifndef QT_NO_SETTINGS
#if QT_CONFIG(settings)
struct QLibrarySettings
{
@ -204,7 +206,7 @@ QSettings *QLibraryInfoPrivate::findConfiguration()
return 0; //no luck
}
#endif // QT_NO_SETTINGS
#endif // settings
/*!
\class QLibraryInfo
@ -464,7 +466,7 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
#endif // QT_BUILD_QMAKE, started inside location !
QString ret;
bool fromConf = false;
#ifndef QT_NO_SETTINGS
#if QT_CONFIG(settings)
#ifdef QT_BUILD_QMAKE
// 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
@ -547,7 +549,7 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
ret = QDir::fromNativeSeparators(ret);
}
}
#endif // QT_NO_SETTINGS
#endif // settings
#ifndef QT_BUILD_QMAKE_BOOTSTRAP
if (!fromConf) {
@ -646,7 +648,7 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
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());
if (!settings.isNull()) {
const QString key = QLatin1String(platformsSection)
@ -657,7 +659,7 @@ QStringList QLibraryInfo::platformPluginArguments(const QString &platformName)
}
#else
Q_UNUSED(platformName);
#endif // !QT_BUILD_QMAKE && !QT_NO_SETTINGS
#endif // !QT_BUILD_QMAKE && settings
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
// terminate the application.
# ifdef Q_CC_MSVC
# if defined(Q_CC_MSVC) && !defined(Q_CC_INTEL)
if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
__fastfail(FAST_FAIL_FATAL_APP_EXIT);
# else

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1288,7 +1288,6 @@ bool QResourceFileEngine::close()
{
Q_D(QResourceFileEngine);
d->offset = 0;
d->uncompressed.clear();
return true;
}
@ -1503,14 +1502,25 @@ uchar *QResourceFileEnginePrivate::map(qint64 offset, qint64 size, QFile::Memory
{
Q_Q(QResourceFileEngine);
Q_UNUSED(flags);
qint64 max = resource.size();
if (resource.isCompressed()) {
uncompress();
max = uncompressed.size();
}
qint64 end;
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());
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)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -100,6 +100,8 @@ public:
QMetaObject::Connection callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection);
template <typename Functor>
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
// singleShot to a QObject slot
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.
*/
/*!
\variable QCborStreamReader::StringResultCode QCborStreamReader::StringResult::status
\variable QCborStreamReader::StringResult::status
Contains the status of the attempt of reading the string from the stream.
*/

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -97,7 +97,7 @@ void QOpenGLTextureCacheWrapper::cleanupTexturesForPixmapData(QPlatformPixmap *p
QOpenGLTextureCache::QOpenGLTextureCache(QOpenGLContext *ctx)
: 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
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.
*/
static inline int hex2int(const char *s)
static inline int hex2int(const char *s, int n)
{
const int hi = QtMiscUtils::fromHex(s[0]);
if (hi < 0)
if (n < 0)
return -1;
const int lo = QtMiscUtils::fromHex(s[1]);
if (lo < 0)
int result = 0;
for (; n > 0; --n) {
result = result * 16;
const int h = QtMiscUtils::fromHex(*s++);
if (h < 0)
return -1;
return (hi << 4) | lo;
result += h;
}
return result;
}
/*!
\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)
static bool get_hex_rgb(const char *name, size_t len, QRgba64 *rgb)
{
if (name[0] != '#')
return false;
name++;
--len;
int a, r, g, b;
a = 255;
a = 65535;
if (len == 12) {
r = hex2int(name);
g = hex2int(name + 4);
b = hex2int(name + 8);
r = hex2int(name + 0, 4);
g = hex2int(name + 4, 4);
b = hex2int(name + 8, 4);
} else if (len == 9) {
r = hex2int(name);
g = hex2int(name + 3);
b = hex2int(name + 6);
r = hex2int(name + 0, 3);
g = hex2int(name + 3, 3);
b = hex2int(name + 6, 3);
r = (r << 4) | (r >> 8);
g = (g << 4) | (g >> 8);
b = (b << 4) | (b >> 8);
} else if (len == 8) {
a = hex2int(name);
r = hex2int(name + 2);
g = hex2int(name + 4);
b = hex2int(name + 6);
a = hex2int(name + 0, 2) * 0x101;
r = hex2int(name + 2, 2) * 0x101;
g = hex2int(name + 4, 2) * 0x101;
b = hex2int(name + 6, 2) * 0x101;
} else if (len == 6) {
r = hex2int(name);
g = hex2int(name + 2);
b = hex2int(name + 4);
r = hex2int(name + 0, 2) * 0x101;
g = hex2int(name + 2, 2) * 0x101;
b = hex2int(name + 4, 2) * 0x101;
} else if (len == 3) {
r = hex2int(name[0]);
g = hex2int(name[1]);
b = hex2int(name[2]);
r = hex2int(name + 0, 1) * 0x1111;
g = hex2int(name + 1, 1) * 0x1111;
b = hex2int(name + 2, 1) * 0x1111;
} else {
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;
return false;
}
*rgb = qRgba(r, g ,b, a);
*rgb = qRgba64(r, g ,b, a);
return true;
}
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)
return false;
@ -948,9 +948,9 @@ bool QColor::setColorFromString(String name)
}
if (name[0] == QLatin1Char('#')) {
QRgb rgba;
QRgba64 rgba;
if (get_hex_rgb(name.data(), name.size(), &rgba)) {
setRgba(rgba);
setRgba64(rgba);
return true;
} else {
invalidate();
@ -1366,7 +1366,7 @@ QRgba64 QColor::rgba64() const Q_DECL_NOTHROW
Sets the RGB64 value to \a rgba, including its alpha.
\sa \setRgba(), rgba64()
\sa setRgba(), rgba64()
*/
void QColor::setRgba64(QRgba64 rgba) Q_DECL_NOTHROW
{

View File

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

View File

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

View File

@ -2709,7 +2709,8 @@ void QTextDocumentLayoutPrivate::layoutBlock(const QTextBlock &bl, int blockPosi
qreal(q->paintDevice()->logicalDpiY()) / qreal(qt_defaultDpi()) : 1;
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();
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));
item.setWidth(inlineSize.width());
if (f.verticalAlignment() == QTextCharFormat::AlignMiddle) {
QFontMetrics m(f.font());
switch (f.verticalAlignment())
{
case QTextCharFormat::AlignMiddle:
item.setDescent(inlineSize.height() / 2);
item.setAscent(inlineSize.height() / 2);
break;
case QTextCharFormat::AlignBaseline:
item.setDescent(m.descent());
item.setAscent(inlineSize.height() - m.descent());
break;
default:
qreal halfX = m.xHeight()/2.;
item.setAscent((inlineSize.height() + halfX) / 2.);
item.setDescent((inlineSize.height() - halfX) / 2.);
} else {
item.setDescent(0);
item.setAscent(inlineSize.height());
}

View File

@ -1962,19 +1962,24 @@ const QCharAttributes *QTextEngine::attributes() 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);
if (block.docHandle()) {
docLayout()->resizeInlineObject(QTextInlineObject(item, const_cast<QTextEngine *>(this)),
layoutData->items[item].position + block.position(),
format(&layoutData->items[item]));
li.position + block.position(),
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
fontEngine(layoutData->items[item],
&layoutData->items[item].ascent,
&layoutData->items[item].descent,
&layoutData->items[item].leading);
fontEngine(li, &li.ascent, &li.descent, &li.leading);
// see the comment above
ushort *lc = logClusters(&li);
*lc = item ? lc[-1] : 0;
} else {
shapeText(item);
}

View File

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

View File

@ -1834,6 +1834,9 @@ void QTextLine::layout_helper(int maxGlyphs)
lbh.logClusters = eng->layoutData->logClustersPtr;
lbh.previousGlyph = 0;
bool hasInlineObject = false;
QFixed maxInlineObjectHeight = 0;
while (newItem < eng->layoutData->items.size()) {
lbh.resetRightBearing();
lbh.softHyphenWidth = 0;
@ -1862,8 +1865,11 @@ void QTextLine::layout_helper(int maxGlyphs)
lbh.tmpData.leading = qMax(lbh.tmpData.leading + lbh.tmpData.ascent,
current.leading + current.ascent) - qMax(lbh.tmpData.ascent,
current.ascent);
if (current.analysis.flags != QScriptAnalysis::Object) {
// 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))) {
lbh.whiteSpaceOrObject = true;
@ -1911,8 +1917,17 @@ void QTextLine::layout_helper(int maxGlyphs)
if (eng->block.docHandle()) {
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;
@ -2049,6 +2064,43 @@ found:
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(),
line.descent.toReal(), line.textWidth.toReal(), lbh.spaceData.width.toReal());
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;
if (format.verticalAlignment() == QTextCharFormat::AlignTop) {
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());

View File

@ -424,7 +424,7 @@
Note that by combining this option with ReuseAddressHint, you will
also allow your service to rebind an existing shared address. On
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
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.
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
@ -455,7 +455,7 @@
The only notification currently supported is QSslSocket::sslErrors().
\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
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 this socket to the address \a address and the port \a port.
For UDP sockets, after binding, the signal QUdpSocket::readyRead() is emitted
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 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_2 DTLSv1.2
\value DtlsV1_2OrLater DTLSv1.2 and later versions.
\value TlsV1_3 TLSv1.3. (Since Qt 5.12)
\value TlsV1_3OrLater TLSv1.3 and later versions. (Since Qt 5.12)
\value UnknownProtocol The cipher's protocol cannot be determined.
\value AnyProtocol The socket understands SSLv2, SSLv3, TLSv1.0 and all
supported later versions of TLS. This value is used by QSslSocket only.

View File

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

View File

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

View File

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

View File

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

View File

@ -174,6 +174,8 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSL_CIPHER(const SSL_CIPHER
ciph.d->protocol = QSsl::TlsV1_1;
else if (protoString == QLatin1String("TLSv1.2"))
ciph.d->protocol = QSsl::TlsV1_2;
else if (protoString == QLatin1String("TLSv1.3"))
ciph.d->protocol = QSsl::TlsV1_3;
if (descriptionList.at(2).startsWith(QLatin1String("Kx=")))
ciph.d->keyExchangeMethod = descriptionList.at(2).mid(3).toString();
@ -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;
else if (protocol == QSsl::TlsV1_2OrLater)
options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1;
else if (protocol == QSsl::TlsV1_3OrLater)
options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2;
#endif
else
options = SSL_OP_ALL;
@ -1291,6 +1295,8 @@ QSsl::SslProtocol QSslSocketBackendPrivate::sessionProtocol() const
return QSsl::TlsV1_1;
case 0x303:
return QSsl::TlsV1_2;
case 0x304:
return QSsl::TlsV1_3;
}
return QSsl::UnknownProtocol;

View File

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

View File

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

View File

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

View File

@ -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) {
Q_ASSERT(context && share);
if (context->d_ptr->group == share->d_ptr->group)

View File

@ -50,7 +50,9 @@
#include "qcoretextfontdatabase_p.h"
#include "qfontengine_coretext_p.h"
#if QT_CONFIG(settings)
#include <QtCore/QSettings>
#endif
#include <QtCore/QtEndian>
#ifndef QT_NO_FREETYPE
#include <QtFontDatabaseSupport/private/qfontengine_ft_p.h>
@ -116,21 +118,25 @@ QCoreTextFontDatabase::QCoreTextFontDatabase()
: m_hasPopulatedAliases(false)
{
#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
antialiasing with different hinting styles (but we don't care about the
exact value, only if subpixel rendering is available or not)
*/
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"));
if (appleValue.isValid()) {
font_smoothing = appleValue.toInt();
} else {
} else
#endif // settings
{
// 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
int w = 10;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1549,7 +1549,9 @@ QCocoaNSWindow *QCocoaWindow::createNSWindow(bool shouldBePanel)
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
// handles the close event asynchronously and we want to

View File

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

View File

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

View File

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

View File

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

View File

@ -49,23 +49,17 @@
static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
@implementation QNSWindowDelegate {
QCocoaWindow *m_cocoaWindow;
static QCocoaWindow *toPlatformWindow(NSWindow *window)
{
return qnsview_cast(window.contentView).platformWindow;
}
- (instancetype)initWithQCocoaWindow:(QCocoaWindow *)cocoaWindow
{
if ((self = [self init]))
m_cocoaWindow = cocoaWindow;
return self;
}
@implementation QNSWindowDelegate
- (BOOL)windowShouldClose:(NSNotification *)notification
- (BOOL)windowShouldClose:(NSWindow *)window
{
Q_UNUSED(notification);
if (m_cocoaWindow) {
return m_cocoaWindow->windowShouldClose();
}
if (QCocoaWindow *platformWindow = toPlatformWindow(window))
return platformWindow->windowShouldClose();
return YES;
}
@ -79,14 +73,16 @@ static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
- (NSRect)windowWillUseStandardFrame:(NSWindow *)window defaultFrame:(NSRect)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
QSizeF maximumSize = w->maximumSize() + QSize(0, w->frameMargins().top());
// 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());
// 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"
- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)frameSize
{
Q_ASSERT(toPlatformWindow(window));
qCDebug(lcQpaWindow) << window << "will resize to" << QSizeF::fromCGSize(frameSize)
<< "- disabling screen updates temporarily";
@ -131,6 +129,8 @@ static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
- (void)windowDidResize:(NSNotification *)notification
{
NSWindow *window = notification.object;
Q_ASSERT(toPlatformWindow(window));
qCDebug(lcQpaWindow) << window << "was resized - re-enabling screen updates";
NSEnableScreenUpdates();
}
@ -138,23 +138,27 @@ static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu
{
Q_UNUSED(window);
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
// 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
{
Q_UNUSED(window);
Q_UNUSED(event);
Q_UNUSED(dragImageLocation);
Q_UNUSED(pasteboard);
QCocoaWindow *platformWindow = toPlatformWindow(window);
Q_ASSERT(platformWindow);
// 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.
return !whitespaceRegex.exactMatch(m_cocoaWindow->window()->filePath());
return !whitespaceRegex.exactMatch(platformWindow->window()->filePath());
}
@end

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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