Merge remote-tracking branch 'origin/5.12' into dev
Change-Id: I1df9adea124326ef7c7802839eb93efc4302b287bb10
commit
5d92f1793a
|
|
@ -310,7 +310,13 @@
|
|||
"#else",
|
||||
"# error __cplusplus must be > 201402L (the value for C++14)",
|
||||
"#endif",
|
||||
"#include <map> // https://bugs.llvm.org//show_bug.cgi?id=33117"
|
||||
"#include <map> // https://bugs.llvm.org//show_bug.cgi?id=33117",
|
||||
"#include <variant>"
|
||||
],
|
||||
"main": [
|
||||
"std::variant<int> v(42);",
|
||||
"int i = std::get<int>(v);",
|
||||
"std::visit([](const auto &) { return 1; }, v);"
|
||||
],
|
||||
"qmake": "CONFIG += c++11 c++14 c++1z"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1132,6 +1132,8 @@ defineReplace(qtConfOutputPostProcess_publicPro) {
|
|||
"QT_GCC_MINOR_VERSION = $$QMAKE_GCC_MINOR_VERSION" \
|
||||
"QT_GCC_PATCH_VERSION = $$QMAKE_GCC_PATCH_VERSION"
|
||||
}
|
||||
!isEmpty(QMAKE_MAC_SDK_VERSION): \
|
||||
output += "QT_MAC_SDK_VERSION = $$QMAKE_MAC_SDK_VERSION"
|
||||
!isEmpty(QMAKE_CLANG_MAJOR_VERSION) {
|
||||
output += \
|
||||
"QT_CLANG_MAJOR_VERSION = $$QMAKE_CLANG_MAJOR_VERSION" \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,129 @@
|
|||
Qt 5.11.2 is a bug-fix release. It maintains both forward and backward
|
||||
compatibility (source and binary) with Qt 5.11.0 through 5.11.1.
|
||||
|
||||
For more details, refer to the online documentation included in this
|
||||
distribution. The documentation is also available online:
|
||||
|
||||
http://doc.qt.io/qt-5/index.html
|
||||
|
||||
The Qt version 5.11 series is binary compatible with the 5.10.x series.
|
||||
Applications compiled for 5.10 will continue to run with 5.11.
|
||||
|
||||
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.
|
||||
|
||||
****************************************************************************
|
||||
* Qt 5.11.2 Changes *
|
||||
****************************************************************************
|
||||
|
||||
****************************************************************************
|
||||
* Licensing *
|
||||
****************************************************************************
|
||||
|
||||
- [QTBUG-52222] The commercial preview license in the git checkout has
|
||||
been replaced by the Qt License Agreement 4.0 text. This makes it
|
||||
explicit that commercial customers of The Qt Company can use the git
|
||||
version under commercial terms. However, support is (still) only
|
||||
provided for builds from released branches of Qt.
|
||||
|
||||
****************************************************************************
|
||||
* QtCore *
|
||||
****************************************************************************
|
||||
|
||||
- QFile:
|
||||
* [QTBUG-69417] Fixed a regression in QFile::copy() that caused the
|
||||
original file not to be copied entirely if it was modified outside of
|
||||
this QFile object between the last time we checked its size and the
|
||||
copy() call. Note this is not a prevention against race conditions.
|
||||
* [QTBUG-69148] Fixed a regression that caused QFile::map() to succeed
|
||||
or produce incorrect results when trying to map a file at an offset
|
||||
beyond 4 GB on 32-bit Android systems and on some special Linux
|
||||
configurations.
|
||||
|
||||
- QObject:
|
||||
* [QTBUG-69744] Fixed a bug in setProperty() that caused a property
|
||||
change not to take effect if the old value compared equal using
|
||||
QVariant's equality operator, but the values were not strictly equal.
|
||||
|
||||
- QPluginLoader:
|
||||
* Fixed an issue that could cause a crash when certain damaged or
|
||||
corrupt plugin files were scanned.
|
||||
|
||||
- QSortFilterProxyModel:
|
||||
* [QTBUG-58499][QTBUG-69158] insertRows(row,count,parent) with row ==
|
||||
rowCount will insert at the bottom of the source model rather than
|
||||
at the row QSortFilterProxyModel::rowCount of the source model.
|
||||
|
||||
- QStorageInfo:
|
||||
* [QTBUG-60215] Fixed a bug that caused the last entry in the mtab file
|
||||
to be ignored on Android.
|
||||
* Fixed a bug on Android that could cause QStorageInfo to skip some
|
||||
filesystems (if the mount table is a virtual file and contains any
|
||||
short lines) or crash (if the mount table contains any 3-field lines).
|
||||
|
||||
- QString:
|
||||
* [QTBUG-63620] Formatting of doubles with single-digit exponent, by
|
||||
number() or args(), now includes a leading zero in that exponent,
|
||||
consistently with sprintf(), as it did up to 5.6.
|
||||
|
||||
- QSysInfo:
|
||||
* Fixed QSysInfo::productType() to properly detect some Linux
|
||||
distributions that ship with a minimal /etc.
|
||||
|
||||
- QTemporaryFile:
|
||||
* [QTBUG-69436] Worked around a bug in the GNU C Library versions 2.21
|
||||
and earlier (used on Linux) that caused temporary files to be created
|
||||
with permissions 000.
|
||||
|
||||
- QUrl:
|
||||
* Fixed a bug that caused URLs whose hostnames contained unassigned or
|
||||
prohibited Unicode codepoints to report isValid() == true, despite
|
||||
clearing the hostname.
|
||||
|
||||
****************************************************************************
|
||||
* QtGui *
|
||||
****************************************************************************
|
||||
|
||||
- QMatrix:
|
||||
* The qHash() implementation for QMatrix has been changed.
|
||||
|
||||
- QTransform:
|
||||
* The qHash() implementation for QTransform has been changed.
|
||||
|
||||
- Text:
|
||||
* [QTBUG-69661] Fixed potential crash when using
|
||||
QTextOption::ShowLineAndParagraphSeparators.
|
||||
* [QTBUG-70096] Fixed a possible crash when combining QStaticText,
|
||||
QOpenGLWidget and Qt Quick in the same application.
|
||||
|
||||
****************************************************************************
|
||||
* QtWidgets *
|
||||
****************************************************************************
|
||||
|
||||
- QMessageBox:
|
||||
* [QTBUG-69526] A message box with two buttons, one of which is the "Show
|
||||
Details..." button, can now be closed by clicking the X button on the
|
||||
window's title bar.
|
||||
|
||||
- QFileDialog:
|
||||
* QFileDialog::selectedMimeTypeFilter() now returns the actually
|
||||
selected name filter.
|
||||
|
||||
****************************************************************************
|
||||
* Third-Party Code *
|
||||
****************************************************************************
|
||||
|
||||
- [QTBUG-69274] SQLite was updated to version 3.24.0.
|
||||
- [QTBUG-69271] PCRE2 was updated to version 10.31.
|
||||
|
||||
****************************************************************************
|
||||
* plugins *
|
||||
****************************************************************************
|
||||
|
||||
- ibus:
|
||||
* Qt programs in Flatpak environment can now trigger IBus input method.
|
||||
|
|
@ -483,6 +483,10 @@ void PathDeformRenderer::timerEvent(QTimerEvent *e)
|
|||
|
||||
void PathDeformRenderer::mousePressEvent(QMouseEvent *e)
|
||||
{
|
||||
if (m_show_doc) {
|
||||
setDescriptionEnabled(false);
|
||||
return;
|
||||
}
|
||||
setDescriptionEnabled(false);
|
||||
|
||||
m_repaintTimer.stop();
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ QMAKE_MAC_SDK = macosx
|
|||
|
||||
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.12
|
||||
QMAKE_APPLE_DEVICE_ARCHS = x86_64
|
||||
QT_MAC_SDK_VERSION_TESTED_WITH = 10.13
|
||||
|
||||
device.sdk = macosx
|
||||
device.target = device
|
||||
|
|
|
|||
|
|
@ -1,5 +1,43 @@
|
|||
load(default_post)
|
||||
|
||||
contains(TEMPLATE, .*app) {
|
||||
!macx-xcode {
|
||||
# Detect changes to the platform SDK
|
||||
QMAKE_EXTRA_VARIABLES += QMAKE_MAC_SDK QMAKE_MAC_SDK_VERSION
|
||||
QMAKE_EXTRA_INCLUDES += $$shell_quote($$PWD/sdk.mk)
|
||||
}
|
||||
|
||||
# Detect incompatible SDK versions
|
||||
|
||||
!versionAtLeast(QMAKE_MAC_SDK_VERSION, $$QT_MAC_SDK_VERSION): \
|
||||
warning("Qt requires at least version $$QT_MAC_SDK_VERSION of the platform SDK," \
|
||||
"you're using $${QMAKE_MAC_SDK_VERSION}. Please upgrade.")
|
||||
|
||||
!isEmpty(QT_MAC_SDK_VERSION_TESTED_WITH) {
|
||||
# For Qt developers only
|
||||
!isEmpty($$list($$(QT_MAC_SDK_NO_VERSION_CHECK))): \
|
||||
CONFIG += sdk_no_version_check
|
||||
|
||||
!sdk_no_version_check:!versionAtMost(QMAKE_MAC_SDK_VERSION, $$QT_MAC_SDK_VERSION_TESTED_WITH) {
|
||||
warning("Qt has only been tested with version $$QT_MAC_SDK_VERSION_TESTED_WITH"\
|
||||
"of the platform SDK, you're using $${QMAKE_MAC_SDK_VERSION}.")
|
||||
warning("This is an unsupported configuration. You may experience build issues," \
|
||||
"and by using")
|
||||
warning("the $$QMAKE_MAC_SDK_VERSION SDK you are opting in to new features" \
|
||||
"that Qt has not been prepared for.")
|
||||
|
||||
isEqual(QMAKE_MAC_SDK_VERSION, 10.14): \
|
||||
warning("E.g., 10.14 enables dark mode and layer-backed views," \
|
||||
"which Qt $${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION} does not support.")
|
||||
|
||||
warning("Please downgrade the SDK you use to build your app to version" \
|
||||
"$$QT_MAC_SDK_VERSION_TESTED_WITH, or configure")
|
||||
warning("with CONFIG+=sdk_no_version_check when running qmake" \
|
||||
"to silence this warning.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
!no_objective_c:CONFIG += objective_c
|
||||
|
||||
qt {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
CURRENT_MAC_SDK_VERSION := $(shell /usr/bin/xcrun --sdk $(EXPORT_QMAKE_MAC_SDK) -show-sdk-version)
|
||||
|
||||
ifneq ($(CURRENT_MAC_SDK_VERSION),$(EXPORT_QMAKE_MAC_SDK_VERSION))
|
||||
$(info The platform SDK has been changed from version $(EXPORT_QMAKE_MAC_SDK_VERSION) to version $(CURRENT_MAC_SDK_VERSION).)
|
||||
$(info This requires a fresh build. Please wipe the build directory completely,)
|
||||
$(info including any .qmake.stash and .qmake.cache files generated by qmake.)
|
||||
# FIXME: Ideally this should be advertised as just running make distclean, or we
|
||||
# should even do it automatically by having proper makefile dependencies between
|
||||
# .qmake.stash and the SDK version, but as qmake doesn't seem to be consistent in
|
||||
# how it deals with .qmake.stash as a dependency we need to defer that until later.
|
||||
$(error ^)
|
||||
endif
|
||||
|
|
@ -73,7 +73,7 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
The QRect class provides a collection of functions that return the
|
||||
various rectangle coordinates, and enable manipulation of
|
||||
these. QRect also provide functions to move the rectangle relative
|
||||
these. QRect also provides functions to move the rectangle relative
|
||||
to the various coordinates. In addition there is a moveTo()
|
||||
function that moves the rectangle, leaving its top left corner at
|
||||
the given coordinates. Alternatively, the translate() function
|
||||
|
|
@ -155,7 +155,7 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
The QRect class provides a collection of functions that return the
|
||||
various rectangle coordinates, and enable manipulation of
|
||||
these. QRect also provide functions to move the rectangle relative
|
||||
these. QRect also provides functions to move the rectangle relative
|
||||
to the various coordinates.
|
||||
|
||||
For example the left(), setLeft() and moveLeft() functions as an
|
||||
|
|
@ -1335,7 +1335,7 @@ QDebug operator<<(QDebug dbg, const QRect &r)
|
|||
|
||||
The QRectF class provides a collection of functions that return
|
||||
the various rectangle coordinates, and enable manipulation of
|
||||
these. QRectF also provide functions to move the rectangle
|
||||
these. QRectF also provides functions to move the rectangle
|
||||
relative to the various coordinates. In addition there is a
|
||||
moveTo() function that moves the rectangle, leaving its top left
|
||||
corner at the given coordinates. Alternatively, the translate()
|
||||
|
|
@ -1418,7 +1418,7 @@ QDebug operator<<(QDebug dbg, const QRect &r)
|
|||
|
||||
The QRectF class provides a collection of functions that return
|
||||
the various rectangle coordinates, and enable manipulation of
|
||||
these. QRectF also provide functions to move the rectangle
|
||||
these. QRectF also provides functions to move the rectangle
|
||||
relative to the various coordinates.
|
||||
|
||||
For example: the bottom(), setBottom() and moveBottom() functions:
|
||||
|
|
|
|||
|
|
@ -335,6 +335,15 @@ static bool stringList_contains(const QStringList &stringList, const T &str, Qt:
|
|||
*/
|
||||
#endif
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
/// Not really needed anymore, but kept for binary compatibility
|
||||
bool QtPrivate::QStringList_contains(const QStringList *that, const QString &str,
|
||||
Qt::CaseSensitivity cs)
|
||||
{
|
||||
return stringList_contains(*that, str, cs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
\fn bool QStringList::contains(QStringView str, Qt::CaseSensitivity cs) const
|
||||
\overload
|
||||
|
|
|
|||
|
|
@ -164,6 +164,9 @@ namespace QtPrivate {
|
|||
QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QString &str,
|
||||
Qt::CaseSensitivity cs);
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, const QString &str, Qt::CaseSensitivity cs);
|
||||
#endif
|
||||
bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QStringView str, Qt::CaseSensitivity cs);
|
||||
bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QLatin1String str, Qt::CaseSensitivity cs);
|
||||
void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QString &before, const QString &after,
|
||||
|
|
|
|||
|
|
@ -1817,6 +1817,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngine::GlyphFormat gly
|
|||
// we may have to re-bind brush textures after filling in the cache.
|
||||
brushTextureDirty = (QT_BRUSH_TEXTURE_UNIT == glypchCacheTextureUnit);
|
||||
}
|
||||
cache->setPaintEnginePrivate(nullptr);
|
||||
}
|
||||
|
||||
if (cache->width() == 0 || cache->height() == 0)
|
||||
|
|
|
|||
|
|
@ -152,6 +152,11 @@ public:
|
|||
|
||||
void clear();
|
||||
|
||||
QOpenGL2PaintEngineExPrivate *paintEnginePrivate() const
|
||||
{
|
||||
return pex;
|
||||
}
|
||||
|
||||
private:
|
||||
void setupVertexAttribs();
|
||||
|
||||
|
|
|
|||
|
|
@ -453,6 +453,13 @@ QDtlsClientVerifier::QDtlsClientVerifier(QObject *parent)
|
|||
d->setConfiguration(conf);
|
||||
}
|
||||
|
||||
/*!
|
||||
Destroys the QDtlsClientVerifier object.
|
||||
*/
|
||||
QDtlsClientVerifier::~QDtlsClientVerifier()
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the secret and the cryptographic hash algorithm from \a params. This
|
||||
QDtlsClientVerifier will use these to generate cookies. If the new secret
|
||||
|
|
@ -576,6 +583,13 @@ QDtls::QDtls(QSslSocket::SslMode mode, QObject *parent)
|
|||
setDtlsConfiguration(QSslConfiguration::defaultDtlsConfiguration());
|
||||
}
|
||||
|
||||
/*!
|
||||
Destroys the QDtls object.
|
||||
*/
|
||||
QDtls::~QDtls()
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the peer's address, \a port, and host name and returns \c true
|
||||
if successful. \a address must not be null, multicast, or broadcast.
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ class Q_NETWORK_EXPORT QDtlsClientVerifier : public QObject
|
|||
public:
|
||||
|
||||
explicit QDtlsClientVerifier(QObject *parent = nullptr);
|
||||
~QDtlsClientVerifier();
|
||||
|
||||
struct Q_NETWORK_EXPORT GeneratorParameters
|
||||
{
|
||||
|
|
@ -125,6 +126,7 @@ public:
|
|||
};
|
||||
|
||||
explicit QDtls(QSslSocket::SslMode mode, QObject *parent = nullptr);
|
||||
~QDtls();
|
||||
|
||||
bool setPeer(const QHostAddress &address, quint16 port,
|
||||
const QString &verificationName = {});
|
||||
|
|
|
|||
|
|
@ -65,8 +65,6 @@ public:
|
|||
bool isSharing() const override;
|
||||
bool isValid() const override;
|
||||
|
||||
void windowWasHidden();
|
||||
|
||||
NSOpenGLContext *nativeContext() const;
|
||||
|
||||
QFunctionPointer getProcAddress(const char *procName) override;
|
||||
|
|
@ -80,7 +78,6 @@ private:
|
|||
NSOpenGLContext *m_context = nil;
|
||||
NSOpenGLContext *m_shareContext = nil;
|
||||
QSurfaceFormat m_format;
|
||||
QPointer<QWindow> m_currentWindow;
|
||||
bool m_didCheckForSoftwareContext = false;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -318,9 +318,6 @@ void QCocoaGLContext::updateSurfaceFormat()
|
|||
|
||||
QCocoaGLContext::~QCocoaGLContext()
|
||||
{
|
||||
if (m_currentWindow && m_currentWindow.data()->handle())
|
||||
static_cast<QCocoaWindow *>(m_currentWindow.data()->handle())->setCurrentContext(0);
|
||||
|
||||
[m_context release];
|
||||
}
|
||||
|
||||
|
|
@ -366,26 +363,26 @@ bool QCocoaGLContext::makeCurrent(QPlatformSurface *surface)
|
|||
*/
|
||||
bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
|
||||
{
|
||||
// Make sure any surfaces released during this process are deallocated
|
||||
// straight away, otherwise we may run out of surfaces when spinning a
|
||||
// render-loop that doesn't return to one of the outer pools.
|
||||
QMacAutoReleasePool pool;
|
||||
|
||||
if (!surface || surface->surface()->surfaceClass() == QSurface::Offscreen) {
|
||||
// Clear the current drawable and reset the active window, so that GL
|
||||
// commands that don't target a specific FBO will not end up stomping
|
||||
// on the previously set drawable.
|
||||
qCDebug(lcQpaOpenGLContext) << "Clearing current drawable" << m_context.view << "for" << m_context;
|
||||
[m_context clearDrawable];
|
||||
m_currentWindow.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
Q_ASSERT(surface->surface()->surfaceClass() == QSurface::Window);
|
||||
QWindow *window = static_cast<QCocoaWindow *>(surface)->window();
|
||||
QNSView *view = qnsview_cast(static_cast<QCocoaWindow *>(surface)->view());
|
||||
|
||||
if (window == m_currentWindow.data())
|
||||
if (view == m_context.view)
|
||||
return true;
|
||||
|
||||
Q_ASSERT(window->handle());
|
||||
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
|
||||
NSView *view = cocoaWindow->view();
|
||||
|
||||
if ((m_context.view = view) != view) {
|
||||
qCInfo(lcQpaOpenGLContext) << "Failed to set" << view << "as drawable for" << m_context;
|
||||
return false;
|
||||
|
|
@ -393,12 +390,6 @@ bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
|
|||
|
||||
qCInfo(lcQpaOpenGLContext) << "Set drawable for" << m_context << "to" << m_context.view;
|
||||
|
||||
if (m_currentWindow && m_currentWindow.data()->handle())
|
||||
static_cast<QCocoaWindow *>(m_currentWindow.data()->handle())->setCurrentContext(0);
|
||||
|
||||
m_currentWindow = window;
|
||||
|
||||
cocoaWindow->setCurrentContext(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -407,6 +398,11 @@ static QMutex s_contextMutex;
|
|||
|
||||
void QCocoaGLContext::update()
|
||||
{
|
||||
// Make sure any surfaces released during this process are deallocated
|
||||
// straight away, otherwise we may run out of surfaces when spinning a
|
||||
// render-loop that doesn't return to one of the outer pools.
|
||||
QMacAutoReleasePool pool;
|
||||
|
||||
QMutexLocker locker(&s_contextMutex);
|
||||
qCInfo(lcQpaOpenGLContext) << "Updating" << m_context << "for" << m_context.view;
|
||||
[m_context update];
|
||||
|
|
@ -435,24 +431,13 @@ void QCocoaGLContext::doneCurrent()
|
|||
qCDebug(lcQpaOpenGLContext) << "Clearing current context"
|
||||
<< [NSOpenGLContext currentContext] << "in" << QThread::currentThread();
|
||||
|
||||
if (m_currentWindow && m_currentWindow.data()->handle())
|
||||
static_cast<QCocoaWindow *>(m_currentWindow.data()->handle())->setCurrentContext(nullptr);
|
||||
|
||||
m_currentWindow.clear();
|
||||
// Note: We do not need to clear the current drawable here.
|
||||
// As long as there is no current context, GL calls will
|
||||
// do nothing.
|
||||
|
||||
[NSOpenGLContext clearCurrentContext];
|
||||
}
|
||||
|
||||
void QCocoaGLContext::windowWasHidden()
|
||||
{
|
||||
// If the window is hidden, we need to unset the m_currentWindow
|
||||
// variable so that succeeding makeCurrent's will not abort prematurely
|
||||
// because of the optimization in setDrawable.
|
||||
// Doing a full doneCurrent here is not preferable, because the GL context
|
||||
// might be rendering in a different thread at this time.
|
||||
m_currentWindow.clear();
|
||||
}
|
||||
|
||||
QSurfaceFormat QCocoaGLContext::format() const
|
||||
{
|
||||
return m_format;
|
||||
|
|
|
|||
|
|
@ -72,12 +72,6 @@
|
|||
|
||||
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||
|
||||
#if !QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
|
||||
@interface NSApplication (MojaveForwardDeclarations)
|
||||
@property (strong) NSAppearance *appearance NS_AVAILABLE_MAC(10_14);
|
||||
@end
|
||||
#endif
|
||||
|
||||
static void initResources()
|
||||
{
|
||||
Q_INIT_RESOURCE(qcocoaresources);
|
||||
|
|
@ -139,21 +133,6 @@ QCocoaIntegration::QCocoaIntegration(const QStringList ¶mList)
|
|||
NSApplication *cocoaApplication = [QNSApplication sharedApplication];
|
||||
qt_redirectNSApplicationSendEvent();
|
||||
|
||||
if (__builtin_available(macOS 10.14, *)) {
|
||||
// Disable dark appearance, unless the Info.plist or environment requests that it should be enabled
|
||||
bool plistEnablesDarkAppearance = [[[NSBundle mainBundle] objectForInfoDictionaryKey:
|
||||
@"NSRequiresAquaSystemAppearance"] boolValue];
|
||||
|
||||
bool hasEnvironmentRequiresAquaAppearance;
|
||||
int environmentRequiresAquaAppearance = qEnvironmentVariableIntValue(
|
||||
"QT_MAC_REQUIRES_AQUA_SYSTEM_APPEARANCE", &hasEnvironmentRequiresAquaAppearance);
|
||||
bool environmentEnablesDarkAppearance = hasEnvironmentRequiresAquaAppearance
|
||||
&& environmentRequiresAquaAppearance == 0;
|
||||
|
||||
if (!(plistEnablesDarkAppearance || environmentEnablesDarkAppearance))
|
||||
NSApp.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];
|
||||
}
|
||||
|
||||
if (qEnvironmentVariableIsEmpty("QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM")) {
|
||||
// Applications launched from plain executables (without an app
|
||||
// bundle) are "background" applications that does not take keybaord
|
||||
|
|
|
|||
|
|
@ -102,10 +102,6 @@ void *QCocoaNativeInterface::nativeResourceForWindow(const QByteArray &resourceS
|
|||
|
||||
if (resourceString == "nsview") {
|
||||
return static_cast<QCocoaWindow *>(window->handle())->m_view;
|
||||
#ifndef QT_NO_OPENGL
|
||||
} else if (resourceString == "nsopenglcontext") {
|
||||
return static_cast<QCocoaWindow *>(window->handle())->currentContext()->nativeContext();
|
||||
#endif
|
||||
} else if (resourceString == "nswindow") {
|
||||
return static_cast<QCocoaWindow *>(window->handle())->nativeWindow();
|
||||
#if QT_CONFIG(vulkan)
|
||||
|
|
|
|||
|
|
@ -169,11 +169,6 @@ public:
|
|||
NSUInteger windowStyleMask(Qt::WindowFlags flags);
|
||||
void setWindowZoomButton(Qt::WindowFlags flags);
|
||||
|
||||
#ifndef QT_NO_OPENGL
|
||||
void setCurrentContext(QCocoaGLContext *context);
|
||||
QCocoaGLContext *currentContext() const;
|
||||
#endif
|
||||
|
||||
bool setWindowModified(bool modified) override;
|
||||
|
||||
void setFrameStrutEventsEnabled(bool enabled) override;
|
||||
|
|
@ -253,9 +248,6 @@ public: // for QNSView
|
|||
bool m_inSetVisible;
|
||||
bool m_inSetGeometry;
|
||||
bool m_inSetStyleMask;
|
||||
#ifndef QT_NO_OPENGL
|
||||
QCocoaGLContext *m_glContext;
|
||||
#endif
|
||||
QCocoaMenuBar *m_menubar;
|
||||
|
||||
bool m_needsInvalidateShadow;
|
||||
|
|
|
|||
|
|
@ -151,9 +151,6 @@ QCocoaWindow::QCocoaWindow(QWindow *win, WId nativeHandle)
|
|||
, m_inSetVisible(false)
|
||||
, m_inSetGeometry(false)
|
||||
, m_inSetStyleMask(false)
|
||||
#ifndef QT_NO_OPENGL
|
||||
, m_glContext(nullptr)
|
||||
#endif
|
||||
, m_menubar(nullptr)
|
||||
, m_needsInvalidateShadow(false)
|
||||
, m_hasModalSession(false)
|
||||
|
|
@ -405,10 +402,6 @@ void QCocoaWindow::setVisible(bool visible)
|
|||
[m_view setHidden:NO];
|
||||
} else {
|
||||
// qDebug() << "close" << this;
|
||||
#ifndef QT_NO_OPENGL
|
||||
if (m_glContext)
|
||||
m_glContext->windowWasHidden();
|
||||
#endif
|
||||
QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast<QCocoaEventDispatcher *>(QGuiApplication::instance()->eventDispatcher());
|
||||
QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = nullptr;
|
||||
if (cocoaEventDispatcher)
|
||||
|
|
@ -1336,18 +1329,6 @@ bool QCocoaWindow::windowIsPopupType(Qt::WindowType type) const
|
|||
return ((type & Qt::Popup) == Qt::Popup);
|
||||
}
|
||||
|
||||
#ifndef QT_NO_OPENGL
|
||||
void QCocoaWindow::setCurrentContext(QCocoaGLContext *context)
|
||||
{
|
||||
m_glContext = context;
|
||||
}
|
||||
|
||||
QCocoaGLContext *QCocoaWindow::currentContext() const
|
||||
{
|
||||
return m_glContext;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
Checks if the window is the content view of its immediate NSWindow.
|
||||
|
||||
|
|
|
|||
|
|
@ -253,33 +253,50 @@ QVector<QPointer<QObject> > QMacStylePrivate::scrollBars;
|
|||
|
||||
static QLinearGradient titlebarGradientActive()
|
||||
{
|
||||
static QLinearGradient gradient;
|
||||
if (gradient == QLinearGradient()) {
|
||||
static QLinearGradient darkGradient = [](){
|
||||
QLinearGradient gradient;
|
||||
// FIXME: colors are chosen somewhat arbitrarily and could be fine-tuned,
|
||||
// or ideally determined by calling a native API.
|
||||
gradient.setColorAt(0, QColor(47, 47, 47));
|
||||
return gradient;
|
||||
}();
|
||||
static QLinearGradient lightGradient = [](){
|
||||
QLinearGradient gradient;
|
||||
gradient.setColorAt(0, QColor(235, 235, 235));
|
||||
gradient.setColorAt(0.5, QColor(210, 210, 210));
|
||||
gradient.setColorAt(0.75, QColor(195, 195, 195));
|
||||
gradient.setColorAt(1, QColor(180, 180, 180));
|
||||
}
|
||||
return gradient;
|
||||
return gradient;
|
||||
}();
|
||||
return qt_mac_applicationIsInDarkMode() ? darkGradient : lightGradient;
|
||||
}
|
||||
|
||||
static QLinearGradient titlebarGradientInactive()
|
||||
{
|
||||
static QLinearGradient gradient;
|
||||
if (gradient == QLinearGradient()) {
|
||||
static QLinearGradient darkGradient = [](){
|
||||
QLinearGradient gradient;
|
||||
gradient.setColorAt(1, QColor(42, 42, 42));
|
||||
return gradient;
|
||||
}();
|
||||
static QLinearGradient lightGradient = [](){
|
||||
QLinearGradient gradient;
|
||||
gradient.setColorAt(0, QColor(250, 250, 250));
|
||||
gradient.setColorAt(1, QColor(225, 225, 225));
|
||||
}
|
||||
return gradient;
|
||||
return gradient;
|
||||
}();
|
||||
return qt_mac_applicationIsInDarkMode() ? darkGradient : lightGradient;
|
||||
}
|
||||
|
||||
static const QColor titlebarSeparatorLineActive(111, 111, 111);
|
||||
static const QColor titlebarSeparatorLineInactive(131, 131, 131);
|
||||
static const QColor darkModeSeparatorLine(88, 88, 88);
|
||||
|
||||
// Gradient colors used for the dock widget title bar and
|
||||
// non-unifed tool bar bacground.
|
||||
static const QColor mainWindowGradientBegin(240, 240, 240);
|
||||
static const QColor mainWindowGradientEnd(200, 200, 200);
|
||||
static const QColor lightMainWindowGradientBegin(240, 240, 240);
|
||||
static const QColor lightMainWindowGradientEnd(200, 200, 200);
|
||||
static const QColor darkMainWindowGradientBegin(47, 47, 47);
|
||||
static const QColor darkMainWindowGradientEnd(47, 47, 47);
|
||||
|
||||
static const int DisclosureOffset = 4;
|
||||
|
||||
|
|
@ -4233,12 +4250,13 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
|||
#ifndef QT_NO_TOOLBAR
|
||||
case CE_ToolBar: {
|
||||
const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(opt);
|
||||
const bool isDarkMode = qt_mac_applicationIsInDarkMode();
|
||||
|
||||
// Unified title and toolbar drawing. In this mode the cocoa platform plugin will
|
||||
// fill the top toolbar area part with a background gradient that "unifies" with
|
||||
// the title bar. The following code fills the toolBar area with transparent pixels
|
||||
// to make that gradient visible.
|
||||
if (w) {
|
||||
if (w) {
|
||||
#if QT_CONFIG(mainwindow)
|
||||
if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(w->window())) {
|
||||
if (toolBar && toolBar->toolBarArea == Qt::TopToolBarArea && mainWindow->unifiedTitleAndToolBarOnMac()) {
|
||||
|
|
@ -4248,7 +4266,7 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
|||
p->fillRect(opt->rect, Qt::transparent);
|
||||
p->restore();
|
||||
|
||||
// Drow a horizontal separator line at the toolBar bottom if the "unified" area ends here.
|
||||
// Draw a horizontal separator line at the toolBar bottom if the "unified" area ends here.
|
||||
// There might be additional toolbars or other widgets such as tab bars in document
|
||||
// mode below. Determine this by making a unified toolbar area test for the row below
|
||||
// this toolbar.
|
||||
|
|
@ -4257,7 +4275,7 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
|||
if (isEndOfUnifiedArea) {
|
||||
const int margin = qt_mac_aqua_get_metric(SeparatorSize);
|
||||
const auto separatorRect = QRect(opt->rect.left(), opt->rect.bottom(), opt->rect.width(), margin);
|
||||
p->fillRect(separatorRect, opt->palette.dark().color());
|
||||
p->fillRect(separatorRect, isDarkMode ? darkModeSeparatorLine : opt->palette.dark().color());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -4272,21 +4290,23 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
|||
else
|
||||
linearGrad = QLinearGradient(opt->rect.left(), 0, opt->rect.right(), 0);
|
||||
|
||||
QColor mainWindowGradientBegin = isDarkMode ? darkMainWindowGradientBegin : lightMainWindowGradientBegin;
|
||||
QColor mainWindowGradientEnd = isDarkMode ? darkMainWindowGradientEnd : lightMainWindowGradientEnd;
|
||||
|
||||
linearGrad.setColorAt(0, mainWindowGradientBegin);
|
||||
linearGrad.setColorAt(1, mainWindowGradientEnd);
|
||||
p->fillRect(opt->rect, linearGrad);
|
||||
|
||||
p->save();
|
||||
if (opt->state & State_Horizontal) {
|
||||
p->setPen(mainWindowGradientBegin.lighter(114));
|
||||
p->setPen(isDarkMode ? darkModeSeparatorLine : mainWindowGradientBegin.lighter(114));
|
||||
p->drawLine(opt->rect.topLeft(), opt->rect.topRight());
|
||||
p->setPen(mainWindowGradientEnd.darker(114));
|
||||
p->setPen(isDarkMode ? darkModeSeparatorLine :mainWindowGradientEnd.darker(114));
|
||||
p->drawLine(opt->rect.bottomLeft(), opt->rect.bottomRight());
|
||||
|
||||
} else {
|
||||
p->setPen(mainWindowGradientBegin.lighter(114));
|
||||
p->setPen(isDarkMode ? darkModeSeparatorLine : mainWindowGradientBegin.lighter(114));
|
||||
p->drawLine(opt->rect.topLeft(), opt->rect.bottomLeft());
|
||||
p->setPen(mainWindowGradientEnd.darker(114));
|
||||
p->setPen(isDarkMode ? darkModeSeparatorLine : mainWindowGradientEnd.darker(114));
|
||||
p->drawLine(opt->rect.topRight(), opt->rect.bottomRight());
|
||||
}
|
||||
p->restore();
|
||||
|
|
|
|||
|
|
@ -82,8 +82,10 @@ private:
|
|||
void putChar(char c)
|
||||
{
|
||||
putNewline();
|
||||
if (c < 0x20 || c >= 0x7f)
|
||||
if (uchar(c) < 0x20)
|
||||
fprintf(out, " '\\x%x',", uint8_t(c));
|
||||
else if (uchar(c) >= 0x7f)
|
||||
fprintf(out, " uchar('\\x%x'),", uint8_t(c));
|
||||
else if (c == '\'' || c == '\\')
|
||||
fprintf(out, " '\\%c',", c);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -165,6 +165,11 @@ void QMacCocoaViewContainer::setCocoaView(NSView *view)
|
|||
Q_ASSERT(window->handle());
|
||||
|
||||
[oldView release];
|
||||
|
||||
// The QWindow::destroy()) call above will explicitly hide this widget.
|
||||
// Clear the hidden state here so it can be implicitly shown again.
|
||||
setAttribute(Qt::WA_WState_Hidden, false);
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -6666,8 +6666,6 @@ bool QDomDocument::setContent(const QString& text, bool namespaceProcessing, QSt
|
|||
}
|
||||
|
||||
/*!
|
||||
\nonreentrant
|
||||
|
||||
This function parses the XML document from the byte array \a
|
||||
data and sets it as the content of the document. It tries to
|
||||
detect the encoding of the document as required by the XML
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
class ThePlugin : public QObject, public PluginInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.autotests.plugininterface" FILE "../empty.json")
|
||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.autotests.plugininterface" FILE "../utf8_data.json")
|
||||
Q_INTERFACES(PluginInterface)
|
||||
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -213,6 +213,14 @@ void tst_QPluginLoader::errorString()
|
|||
|
||||
{
|
||||
QPluginLoader loader( sys_qualifiedLibraryName("theplugin")); //a plugin
|
||||
|
||||
// Check metadata
|
||||
const QJsonObject metaData = loader.metaData();
|
||||
QCOMPARE(metaData.value("IID").toString(), QStringLiteral("org.qt-project.Qt.autotests.plugininterface"));
|
||||
const QJsonObject kpluginObject = metaData.value("MetaData").toObject().value("KPlugin").toObject();
|
||||
QCOMPARE(kpluginObject.value("Name[mr]").toString(), QString::fromUtf8("चौकट भूमिती"));
|
||||
|
||||
// Load
|
||||
QCOMPARE(loader.load(), true);
|
||||
QCOMPARE(loader.errorString(), unknown);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"KPlugin": {
|
||||
"Name": "WindowGeometry",
|
||||
"Name[mr]": "चौकट भूमिती",
|
||||
"Name[pa]": "ਵਿੰਡੋਜੁਮੈਟਰੀ",
|
||||
"Name[th]": "มิติขนาดของหน้าต่าง",
|
||||
"Name[uk]": "Розміри вікна",
|
||||
"Name[zh_CN]": "窗口形状",
|
||||
"Name[zh_TW]": "視窗位置",
|
||||
"ServiceTypes": [
|
||||
"KCModule"
|
||||
]
|
||||
},
|
||||
"X-KDE-ParentComponents": [
|
||||
"windowgeometry"
|
||||
]
|
||||
}
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
#include <QtGui/QOpenGLFunctions>
|
||||
#include <QtGui/QPainter>
|
||||
#include <QtGui/QScreen>
|
||||
#include <QtGui/QStaticText>
|
||||
#include <QtWidgets/QDesktopWidget>
|
||||
#include <QtWidgets/QGraphicsView>
|
||||
#include <QtWidgets/QGraphicsScene>
|
||||
|
|
@ -40,6 +41,8 @@
|
|||
#include <QtTest/QtTest>
|
||||
#include <QSignalSpy>
|
||||
#include <private/qguiapplication_p.h>
|
||||
#include <private/qstatictext_p.h>
|
||||
#include <private/qopengltextureglyphcache_p.h>
|
||||
#include <qpa/qplatformintegration.h>
|
||||
|
||||
class tst_QOpenGLWidget : public QObject
|
||||
|
|
@ -64,6 +67,10 @@ private slots:
|
|||
void stackWidgetOpaqueChildIsVisible();
|
||||
void offscreen();
|
||||
void offscreenThenOnscreen();
|
||||
|
||||
#ifdef QT_BUILD_INTERNAL
|
||||
void staticTextDanglingPointer();
|
||||
#endif
|
||||
};
|
||||
|
||||
void tst_QOpenGLWidget::initTestCase()
|
||||
|
|
@ -675,6 +682,53 @@ void tst_QOpenGLWidget::offscreenThenOnscreen()
|
|||
QVERIFY(image.pixel(30, 40) == qRgb(0, 0, 255));
|
||||
}
|
||||
|
||||
class StaticTextPainterWidget : public QOpenGLWidget
|
||||
{
|
||||
public:
|
||||
StaticTextPainterWidget(QWidget *parent = nullptr)
|
||||
: QOpenGLWidget(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void paintEvent(QPaintEvent *)
|
||||
{
|
||||
QPainter p(this);
|
||||
text.setText(QStringLiteral("test"));
|
||||
p.drawStaticText(0, 0, text);
|
||||
|
||||
ctx = QOpenGLContext::currentContext();
|
||||
}
|
||||
|
||||
QStaticText text;
|
||||
QOpenGLContext *ctx;
|
||||
};
|
||||
|
||||
#ifdef QT_BUILD_INTERNAL
|
||||
void tst_QOpenGLWidget::staticTextDanglingPointer()
|
||||
{
|
||||
QWidget w;
|
||||
StaticTextPainterWidget *glw = new StaticTextPainterWidget(&w);
|
||||
w.resize(640, 480);
|
||||
glw->resize(320, 200);
|
||||
w.show();
|
||||
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&w));
|
||||
QStaticTextPrivate *d = QStaticTextPrivate::get(&glw->text);
|
||||
|
||||
QCOMPARE(d->itemCount, 1);
|
||||
QFontEngine *fe = d->items->fontEngine();
|
||||
|
||||
for (int i = QFontEngine::Format_None; i <= QFontEngine::Format_ARGB; ++i) {
|
||||
QOpenGLTextureGlyphCache *cache =
|
||||
(QOpenGLTextureGlyphCache *) fe->glyphCache(glw->ctx,
|
||||
QFontEngine::GlyphFormat(i),
|
||||
QTransform());
|
||||
if (cache != nullptr)
|
||||
QCOMPARE(cache->paintEnginePrivate(), nullptr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
QTEST_MAIN(tst_QOpenGLWidget)
|
||||
|
||||
#include "tst_qopenglwidget.moc"
|
||||
|
|
|
|||
Loading…
Reference in New Issue