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

Change-Id: I1df9adea124326ef7c7802839eb93efc4302b287
bb10
Qt Forward Merge Bot 2018-09-11 01:00:36 +02:00
commit 5d92f1793a
28 changed files with 372 additions and 112 deletions

View File

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

View File

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

129
dist/changes-5.11.2 vendored Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -152,6 +152,11 @@ public:
void clear();
QOpenGL2PaintEngineExPrivate *paintEnginePrivate() const
{
return pex;
}
private:
void setupVertexAttribs();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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