diff options
Diffstat (limited to 'src/plugins')
68 files changed, 523 insertions, 241 deletions
diff --git a/src/plugins/bearer/android/src/main.cpp b/src/plugins/bearer/android/src/main.cpp index 777d262d6b..7b24f5b2ce 100644 --- a/src/plugins/bearer/android/src/main.cpp +++ b/src/plugins/bearer/android/src/main.cpp @@ -46,7 +46,7 @@ class QAndroidBearerEnginePlugin : public QBearerEnginePlugin public: QBearerEngine *create(const QString &key) const Q_DECL_OVERRIDE { - return (key == QStringLiteral("android")) ? new QAndroidBearerEngine() : 0; + return (key == QLatin1String("android")) ? new QAndroidBearerEngine() : 0; } }; diff --git a/src/plugins/bearer/blackberry/main.cpp b/src/plugins/bearer/blackberry/main.cpp index a8177ff192..bc25647f8a 100644 --- a/src/plugins/bearer/blackberry/main.cpp +++ b/src/plugins/bearer/blackberry/main.cpp @@ -50,7 +50,7 @@ public: QBearerEngine *QBBEnginePlugin::create(const QString &key) const { - if (key == QStringLiteral("blackberry")) + if (key == QLatin1String("blackberry")) return new QBBEngine; return 0; diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp index bbff154ff5..733b6f131f 100644 --- a/src/plugins/bearer/connman/qconnmanengine.cpp +++ b/src/plugins/bearer/connman/qconnmanengine.cpp @@ -332,7 +332,7 @@ void QConnmanEngine::serviceStateChanged(const QString &state) QConnmanServiceInterface *service = qobject_cast<QConnmanServiceInterface *>(sender()); configurationChange(service); - if (state == QStringLiteral("failure")) { + if (state == QLatin1String("failure")) { emit connectionError(service->path(), ConnectError); } } @@ -516,7 +516,7 @@ void QConnmanEngine::addServiceConfiguration(const QString &servicePath) cpPriv->id = servicePath; cpPriv->type = QNetworkConfiguration::InternetAccessPoint; - if (service->security() == QStringLiteral("none")) { + if (service->security() == QLatin1String("none")) { cpPriv->purpose = QNetworkConfiguration::PublicPurpose; } else { cpPriv->purpose = QNetworkConfiguration::PrivatePurpose; diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp index 23860077d7..65c4ac307a 100644 --- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp +++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp @@ -338,7 +338,7 @@ void QConnmanServiceInterface::connectNotify(const QMetaMethod &signal) void QConnmanServiceInterface::changedProperty(const QString &name, const QDBusVariant &value) { propertiesCacheMap[name] = value.variant(); - if (name == QStringLiteral("State")) + if (name == QLatin1String("State")) Q_EMIT stateChanged(value.variant().toString()); } diff --git a/src/plugins/bearer/connman/qofonoservice_linux.cpp b/src/plugins/bearer/connman/qofonoservice_linux.cpp index fdd8a9c8d5..acc82bda04 100644 --- a/src/plugins/bearer/connman/qofonoservice_linux.cpp +++ b/src/plugins/bearer/connman/qofonoservice_linux.cpp @@ -290,7 +290,7 @@ QVariantMap &QOfonoDataConnectionManagerInterface::getProperties() void QOfonoDataConnectionManagerInterface::propertyChanged(const QString &name, const QDBusVariant &value) { propertiesMap[name] = value.variant(); - if (name == QStringLiteral("RoamingAllowed")) + if (name == QLatin1String("RoamingAllowed")) Q_EMIT roamingAllowedChanged(value.variant().toBool()); } diff --git a/src/plugins/imageformats/ico/qicohandler.cpp b/src/plugins/imageformats/ico/qicohandler.cpp index 73deb00941..00de0c80ad 100644 --- a/src/plugins/imageformats/ico/qicohandler.cpp +++ b/src/plugins/imageformats/ico/qicohandler.cpp @@ -163,7 +163,7 @@ static bool writeIconDirEntry(QIODevice *iodev, const ICONDIRENTRY &iconEntry) qToLittleEndian<quint16>(iconEntry.wBitCount, &tmp[6]); qToLittleEndian<quint32>(iconEntry.dwBytesInRes, &tmp[8]); qToLittleEndian<quint32>(iconEntry.dwImageOffset, &tmp[12]); - return (iodev->write((char*)tmp, ICONDIRENTRY_SIZE) == ICONDIRENTRY_SIZE) ? true : false; + return iodev->write((char*)tmp, ICONDIRENTRY_SIZE) == ICONDIRENTRY_SIZE; } return false; @@ -190,7 +190,7 @@ static bool writeIconDir(QIODevice *iodev, const ICONDIR &iconDir) qToLittleEndian(iconDir.idReserved, tmp); qToLittleEndian(iconDir.idType, &tmp[2]); qToLittleEndian(iconDir.idCount, &tmp[4]); - return (iodev->write((char*)tmp, 6) == 6) ? true : false; + return iodev->write((char*)tmp, 6) == 6; } return false; } @@ -233,7 +233,7 @@ static bool writeBMPInfoHeader(QIODevice *iodev, const BMP_INFOHDR &header) qToLittleEndian<quint32>(header.biClrUsed, &tmp[32]); qToLittleEndian<quint32>(header.biClrImportant, &tmp[36]); - return (iodev->write((char*)tmp, BMP_INFOHDR_SIZE) == BMP_INFOHDR_SIZE) ? true : false; + return iodev->write((char*)tmp, BMP_INFOHDR_SIZE) == BMP_INFOHDR_SIZE; } return false; } @@ -881,7 +881,7 @@ bool QtIcoHandler::jumpToImage(int imageNumber) m_currentIconIndex = imageNumber; } - return (imageNumber < imageCount()) ? true : false; + return imageNumber < imageCount(); } /*! \reimp diff --git a/src/plugins/platforminputcontexts/compose/main.cpp b/src/plugins/platforminputcontexts/compose/main.cpp index 4f9362fa5a..ee0a147dd4 100644 --- a/src/plugins/platforminputcontexts/compose/main.cpp +++ b/src/plugins/platforminputcontexts/compose/main.cpp @@ -52,7 +52,7 @@ QComposeInputContext *QComposePlatformInputContextPlugin::create(const QString & { Q_UNUSED(paramList); - if (system.compare(system, QStringLiteral("compose"), Qt::CaseInsensitive) == 0) + if (system.compare(system, QLatin1String("compose"), Qt::CaseInsensitive) == 0) return new QComposeInputContext; return 0; } diff --git a/src/plugins/platforminputcontexts/ibus/main.cpp b/src/plugins/platforminputcontexts/ibus/main.cpp index a3fc05bfc3..8460b62a4f 100644 --- a/src/plugins/platforminputcontexts/ibus/main.cpp +++ b/src/plugins/platforminputcontexts/ibus/main.cpp @@ -52,7 +52,7 @@ QIBusPlatformInputContext *QIbusPlatformInputContextPlugin::create(const QString { Q_UNUSED(paramList); - if (system.compare(system, QStringLiteral("ibus"), Qt::CaseInsensitive) == 0) { + if (system.compare(system, QLatin1String("ibus"), Qt::CaseInsensitive) == 0) { qDBusRegisterMetaType<QIBusSerializable>(); qDBusRegisterMetaType<QIBusAttribute>(); qDBusRegisterMetaType<QIBusAttributeList>(); diff --git a/src/plugins/platforms/android/android.pro b/src/plugins/platforms/android/android.pro index ffbad08c10..f55bc40a55 100644 --- a/src/plugins/platforms/android/android.pro +++ b/src/plugins/platforms/android/android.pro @@ -50,7 +50,6 @@ SOURCES += $$PWD/androidplatformplugin.cpp \ $$PWD/qandroidplatformbackingstore.cpp \ $$PWD/qandroidplatformopenglcontext.cpp \ $$PWD/qandroidplatformforeignwindow.cpp \ - $$PWD/extract.cpp \ $$PWD/qandroideventdispatcher.cpp HEADERS += $$PWD/qandroidplatformintegration.h \ @@ -80,6 +79,9 @@ HEADERS += $$PWD/qandroidplatformintegration.h \ $$PWD/qandroidplatformforeignwindow.h \ $$PWD/qandroideventdispatcher.h +android-style-assets: SOURCES += $$PWD/extract.cpp +else: SOURCES += $$PWD/extract-dummy.cpp + #Non-standard install directory, QTBUG-29859 DESTDIR = $$DESTDIR/android target.path = $${target.path}/android diff --git a/src/plugins/platforms/android/androidjnimenu.cpp b/src/plugins/platforms/android/androidjnimenu.cpp index 94454b8912..1251bbf193 100644 --- a/src/plugins/platforms/android/androidjnimenu.cpp +++ b/src/plugins/platforms/android/androidjnimenu.cpp @@ -38,9 +38,12 @@ #include "qandroidplatformmenuitem.h" #include <QMutex> -#include <QSet> +#include <QPoint> #include <QQueue> +#include <QRect> +#include <QSet> #include <QWindow> +#include <QtCore/private/qjnihelpers_p.h> QT_BEGIN_NAMESPACE @@ -48,7 +51,7 @@ using namespace QtAndroid; namespace QtAndroidMenu { - static QQueue<QAndroidPlatformMenu *> pendingContextMenus; + static QList<QAndroidPlatformMenu *> pendingContextMenus; static QAndroidPlatformMenu *visibleMenu = 0; static QMutex visibleMenuMutex(QMutex::Recursive); @@ -87,21 +90,25 @@ namespace QtAndroidMenu env.jniEnv->CallStaticVoidMethod(applicationClass(), openOptionsMenuMethodID); } - void showContextMenu(QAndroidPlatformMenu *menu, JNIEnv *env) + void showContextMenu(QAndroidPlatformMenu *menu, const QRect &anchorRect, JNIEnv *env) { QMutexLocker lock(&visibleMenuMutex); - if (visibleMenu) { - pendingContextMenus.enqueue(menu); + if (QtAndroidPrivate::androidSdkVersion() > 10 && + QtAndroidPrivate::androidSdkVersion() < 14 && + anchorRect.isValid()) { + pendingContextMenus.clear(); + } else if (visibleMenu) { + pendingContextMenus.append(visibleMenu); + } + + visibleMenu = menu; + menu->aboutToShow(); + if (env) { + env->CallStaticVoidMethod(applicationClass(), openContextMenuMethodID, anchorRect.x(), anchorRect.y(), anchorRect.width(), anchorRect.height()); } else { - visibleMenu = menu; - menu->aboutToShow(); - if (env) { - env->CallStaticVoidMethod(applicationClass(), openContextMenuMethodID); - } else { - AttachedJNIEnv aenv; - if (aenv.jniEnv) - aenv.jniEnv->CallStaticVoidMethod(applicationClass(), openContextMenuMethodID); - } + AttachedJNIEnv aenv; + if (aenv.jniEnv) + aenv.jniEnv->CallStaticVoidMethod(applicationClass(), openContextMenuMethodID, anchorRect.x(), anchorRect.y(), anchorRect.width(), anchorRect.height()); } } @@ -111,7 +118,8 @@ namespace QtAndroidMenu if (visibleMenu == menu) { AttachedJNIEnv env; if (env.jniEnv) - env.jniEnv->CallStaticVoidMethod(applicationClass(), openContextMenuMethodID); + env.jniEnv->CallStaticVoidMethod(applicationClass(), closeContextMenuMethodID); + pendingContextMenus.clear(); } else { pendingContextMenus.removeOne(menu); } @@ -298,7 +306,7 @@ namespace QtAndroidMenu QAndroidPlatformMenuItem *item = static_cast<QAndroidPlatformMenuItem *>(menus.front()->menuItemForTag(menuId)); if (item) { if (item->menu()) { - showContextMenu(item->menu(), env); + showContextMenu(item->menu(), QRect(), env); } else { if (item->isCheckable()) item->setChecked(checked); @@ -308,7 +316,7 @@ namespace QtAndroidMenu } else { QAndroidPlatformMenu *menu = static_cast<QAndroidPlatformMenu *>(visibleMenuBar->menuForTag(menuId)); if (menu) - showContextMenu(menu, env); + showContextMenu(menu, QRect(), env); } return JNI_TRUE; @@ -333,17 +341,30 @@ namespace QtAndroidMenu addAllMenuItemsToMenu(env, menu, visibleMenu); } + static void fillContextMenu(JNIEnv *env, jobject /*thiz*/, jobject menu) + { + env->CallVoidMethod(menu, clearMenuMethodID); + QMutexLocker lock(&visibleMenuMutex); + if (!visibleMenu) + return; + + addAllMenuItemsToMenu(env, menu, visibleMenu); + } + static jboolean onContextItemSelected(JNIEnv *env, jobject /*thiz*/, jint menuId, jboolean checked) { QMutexLocker lock(&visibleMenuMutex); QAndroidPlatformMenuItem * item = static_cast<QAndroidPlatformMenuItem *>(visibleMenu->menuItemForTag(menuId)); if (item) { if (item->menu()) { - showContextMenu(item->menu(), env); + showContextMenu(item->menu(), QRect(), env); } else { if (item->isCheckable()) item->setChecked(checked); item->activated(); + visibleMenu->aboutToHide(); + visibleMenu = 0; + pendingContextMenus.clear(); } } return JNI_TRUE; @@ -354,10 +375,11 @@ namespace QtAndroidMenu QMutexLocker lock(&visibleMenuMutex); if (!visibleMenu) return; + visibleMenu->aboutToHide(); visibleMenu = 0; if (!pendingContextMenus.empty()) - showContextMenu(pendingContextMenus.dequeue(), env); + showContextMenu(pendingContextMenus.takeLast(), QRect(), env); } static JNINativeMethod methods[] = { @@ -365,6 +387,7 @@ namespace QtAndroidMenu {"onOptionsItemSelected", "(IZ)Z", (void *)onOptionsItemSelected}, {"onOptionsMenuClosed", "(Landroid/view/Menu;)V", (void*)onOptionsMenuClosed}, {"onCreateContextMenu", "(Landroid/view/ContextMenu;)V", (void *)onCreateContextMenu}, + {"fillContextMenu", "(Landroid/view/Menu;)V", (void *)fillContextMenu}, {"onContextItemSelected", "(IZ)Z", (void *)onContextItemSelected}, {"onContextMenuClosed", "(Landroid/view/Menu;)V", (void*)onContextMenuClosed}, }; @@ -406,7 +429,7 @@ namespace QtAndroidMenu return false; } - GET_AND_CHECK_STATIC_METHOD(openContextMenuMethodID, appClass, "openContextMenu", "()V"); + GET_AND_CHECK_STATIC_METHOD(openContextMenuMethodID, appClass, "openContextMenu", "(IIII)V"); GET_AND_CHECK_STATIC_METHOD(closeContextMenuMethodID, appClass, "closeContextMenu", "()V"); GET_AND_CHECK_STATIC_METHOD(resetOptionsMenuMethodID, appClass, "resetOptionsMenu", "()V"); GET_AND_CHECK_STATIC_METHOD(openOptionsMenuMethodID, appClass, "openOptionsMenu", "()V"); diff --git a/src/plugins/platforms/android/androidjnimenu.h b/src/plugins/platforms/android/androidjnimenu.h index 161fe004db..c54eb37f37 100644 --- a/src/plugins/platforms/android/androidjnimenu.h +++ b/src/plugins/platforms/android/androidjnimenu.h @@ -43,12 +43,14 @@ class QAndroidPlatformMenuBar; class QAndroidPlatformMenu; class QAndroidPlatformMenuItem; class QWindow; +class QRect; +class QPoint; namespace QtAndroidMenu { // Menu support void openOptionsMenu(); - void showContextMenu(QAndroidPlatformMenu *menu, JNIEnv *env = 0); + void showContextMenu(QAndroidPlatformMenu *menu, const QRect &anchorRect, JNIEnv *env = 0); void hideContextMenu(QAndroidPlatformMenu *menu); void syncMenu(QAndroidPlatformMenu *menu); void androidPlatformMenuDestroyed(QAndroidPlatformMenu *menu); diff --git a/src/plugins/platforms/android/extract-dummy.cpp b/src/plugins/platforms/android/extract-dummy.cpp new file mode 100644 index 0000000000..86ac554531 --- /dev/null +++ b/src/plugins/platforms/android/extract-dummy.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <jni.h> +#include <extract.h> + +extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractStyle_extractNativeChunkInfo(JNIEnv *, jobject, Res_png_9patch*) +{ + return 0; +} + +extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractStyle_extractChunkInfo(JNIEnv *, jobject, jbyteArray) +{ + return 0; +} + +extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractStyle_extractNativeChunkInfo20(JNIEnv *, jobject, long) +{ + return 0; +} + +extern "C" JNIEXPORT jintArray JNICALL Java_org_qtproject_qt5_android_ExtractStyle_extractChunkInfo20(JNIEnv *, jobject, jbyteArray) +{ + return 0; +} diff --git a/src/plugins/platforms/android/extract.cpp b/src/plugins/platforms/android/extract.cpp index b778264573..15a48d2601 100644 --- a/src/plugins/platforms/android/extract.cpp +++ b/src/plugins/platforms/android/extract.cpp @@ -5,27 +5,22 @@ ** ** This file is part of the plugins of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL21$ +** $QT_BEGIN_LICENSE:LGPL3$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. ** ** $QT_END_LICENSE$ ** diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index abda72e636..a23d05520c 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -441,10 +441,14 @@ void QAndroidInputContext::reset() { clear(); m_batchEditNestingLevel = 0; - if (qGuiApp->focusObject()) - QtAndroidInput::resetSoftwareKeyboard(); - else - QtAndroidInput::hideSoftwareKeyboard(); + if (qGuiApp->focusObject()) { + QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQueryThreadSafe(Qt::ImEnabled); + if (!query.isNull() && query->value(Qt::ImEnabled).toBool()) { + QtAndroidInput::resetSoftwareKeyboard(); + return; + } + } + QtAndroidInput::hideSoftwareKeyboard(); } void QAndroidInputContext::commit() diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index 495e80eb09..8a3a958d3b 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -164,9 +164,9 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList ¶ bool QAndroidPlatformIntegration::needsBasicRenderloopWorkaround() { static bool needsWorkaround = - QtAndroid::deviceName().compare(QStringLiteral("samsung SM-T211"), Qt::CaseInsensitive) == 0 - || QtAndroid::deviceName().compare(QStringLiteral("samsung SM-T210"), Qt::CaseInsensitive) == 0 - || QtAndroid::deviceName().compare(QStringLiteral("samsung SM-T215"), Qt::CaseInsensitive) == 0; + QtAndroid::deviceName().compare(QLatin1String("samsung SM-T211"), Qt::CaseInsensitive) == 0 + || QtAndroid::deviceName().compare(QLatin1String("samsung SM-T210"), Qt::CaseInsensitive) == 0 + || QtAndroid::deviceName().compare(QLatin1String("samsung SM-T215"), Qt::CaseInsensitive) == 0; return needsWorkaround; } diff --git a/src/plugins/platforms/android/qandroidplatformmenu.cpp b/src/plugins/platforms/android/qandroidplatformmenu.cpp index a282ecd136..f3505fac3c 100644 --- a/src/plugins/platforms/android/qandroidplatformmenu.cpp +++ b/src/plugins/platforms/android/qandroidplatformmenu.cpp @@ -135,13 +135,12 @@ bool QAndroidPlatformMenu::isVisible() const return m_isVisible; } -void QAndroidPlatformMenu::showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item) +void QAndroidPlatformMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) { Q_UNUSED(parentWindow); - Q_UNUSED(pos); Q_UNUSED(item); setVisible(true); - QtAndroidMenu::showContextMenu(this); + QtAndroidMenu::showContextMenu(this, targetRect); } QPlatformMenuItem *QAndroidPlatformMenu::menuItemAt(int position) const diff --git a/src/plugins/platforms/android/qandroidplatformmenu.h b/src/plugins/platforms/android/qandroidplatformmenu.h index 1499b3b77f..221c7d33f4 100644 --- a/src/plugins/platforms/android/qandroidplatformmenu.h +++ b/src/plugins/platforms/android/qandroidplatformmenu.h @@ -65,7 +65,7 @@ public: bool isEnabled() const; void setVisible(bool visible); bool isVisible() const; - void showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item); + void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item); QPlatformMenuItem *menuItemAt(int position) const; QPlatformMenuItem *menuItemForTag(quintptr tag) const; diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h index 9cbf8fe5f1..97fa56bd01 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h @@ -37,6 +37,8 @@ #include <QObject> #include <qpa/qplatformdialoghelper.h> +Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate)); + QT_BEGIN_NAMESPACE class QFileDialog; @@ -73,7 +75,7 @@ public: void QNSOpenSavePanelDelegate_filterSelected(int menuIndex); private: - void *mDelegate; + QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *mDelegate; QUrl mDir; }; diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index f021446438..084b53af79 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -77,8 +77,6 @@ QT_USE_NAMESPACE typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions; -@class QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate); - @interface QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) : NSObject<NSOpenSavePanelDelegate> { @@ -568,7 +566,7 @@ QCocoaFileDialogHelper::~QCocoaFileDialogHelper() if (!mDelegate) return; QCocoaAutoReleasePool pool; - [reinterpret_cast<QNSOpenSavePanelDelegate *>(mDelegate) release]; + [mDelegate release]; mDelegate = 0; } @@ -604,18 +602,16 @@ extern void qt_mac_to_pascal_string(QString s, Str255 str, TextEncoding encoding void QCocoaFileDialogHelper::setDirectory(const QUrl &directory) { - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if (delegate) - [delegate->mSavePanel setDirectoryURL:[NSURL fileURLWithPath:QCFString::toNSString(directory.toLocalFile())]]; + if (mDelegate) + [mDelegate->mSavePanel setDirectoryURL:[NSURL fileURLWithPath:QCFString::toNSString(directory.toLocalFile())]]; else mDir = directory; } QUrl QCocoaFileDialogHelper::directory() const { - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if (delegate) { - QString path = QCFString::toQString([[delegate->mSavePanel directoryURL] path]).normalized(QString::NormalizationForm_C); + if (mDelegate) { + QString path = QCFString::toQString([[mDelegate->mSavePanel directoryURL] path]).normalized(QString::NormalizationForm_C); return QUrl::fromLocalFile(path); } return mDir; @@ -634,25 +630,23 @@ void QCocoaFileDialogHelper::selectFile(const QUrl &filename) QList<QUrl> QCocoaFileDialogHelper::selectedFiles() const { - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if (delegate) - return [delegate selectedFiles]; + if (mDelegate) + return [mDelegate selectedFiles]; return QList<QUrl>(); } void QCocoaFileDialogHelper::setFilter() { - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if (!delegate) + if (!mDelegate) return; const SharedPointerFileDialogOptions &opts = options(); - [delegate->mSavePanel setTitle:QCFString::toNSString(opts->windowTitle())]; + [mDelegate->mSavePanel setTitle:QCFString::toNSString(opts->windowTitle())]; if (opts->isLabelExplicitlySet(QFileDialogOptions::Accept)) - [delegate->mSavePanel setPrompt:[delegate strip:opts->labelText(QFileDialogOptions::Accept)]]; + [mDelegate->mSavePanel setPrompt:[mDelegate strip:opts->labelText(QFileDialogOptions::Accept)]]; if (opts->isLabelExplicitlySet(QFileDialogOptions::FileName)) - [delegate->mSavePanel setNameFieldLabel:[delegate strip:opts->labelText(QFileDialogOptions::FileName)]]; + [mDelegate->mSavePanel setNameFieldLabel:[mDelegate strip:opts->labelText(QFileDialogOptions::FileName)]]; - [delegate updateProperties]; + [mDelegate updateProperties]; } void QCocoaFileDialogHelper::selectNameFilter(const QString &filter) @@ -661,22 +655,20 @@ void QCocoaFileDialogHelper::selectNameFilter(const QString &filter) return; const int index = options()->nameFilters().indexOf(filter); if (index != -1) { - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if (!delegate) { + if (!mDelegate) { options()->setInitiallySelectedNameFilter(filter); return; } - [delegate->mPopUpButton selectItemAtIndex:index]; - [delegate filterChanged:nil]; + [mDelegate->mPopUpButton selectItemAtIndex:index]; + [mDelegate filterChanged:nil]; } } QString QCocoaFileDialogHelper::selectedNameFilter() const { - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if (!delegate) + if (!mDelegate) return options()->initiallySelectedNameFilter(); - int index = [delegate->mPopUpButton indexOfSelectedItem]; + int index = [mDelegate->mPopUpButton indexOfSelectedItem]; if (index >= options()->nameFilters().count()) return QString(); return index != -1 ? options()->nameFilters().at(index) : QString(); @@ -703,9 +695,8 @@ bool QCocoaFileDialogHelper::show(Qt::WindowFlags windowFlags, Qt::WindowModalit void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate() { - if (mDelegate) - return; QCocoaAutoReleasePool pool; + const SharedPointerFileDialogOptions &opts = options(); const QList<QUrl> selectedFiles = opts->initiallySelectedFiles(); const QUrl directory = mDir.isEmpty() ? opts->initialDirectory() : mDir; @@ -717,19 +708,19 @@ void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate() options:opts helper:this]; + [static_cast<QNSOpenSavePanelDelegate *>(mDelegate) release]; mDelegate = delegate; } bool QCocoaFileDialogHelper::showCocoaFilePanel(Qt::WindowModality windowModality, QWindow *parent) { createNSOpenSavePanelDelegate(); - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if (!delegate) + if (!mDelegate) return false; if (windowModality == Qt::NonModal) - [delegate showModelessPanel]; + [mDelegate showModelessPanel]; else if (windowModality == Qt::WindowModal && parent) - [delegate showWindowModalSheet:parent]; + [mDelegate showWindowModalSheet:parent]; // no need to show a Qt::ApplicationModal dialog here, since it will be done in _q_platformRunNativeAppModalPanel() return true; } @@ -741,8 +732,7 @@ bool QCocoaFileDialogHelper::hideCocoaFilePanel() // open regarding whether or not to go native: return false; } else { - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - [delegate closePanel]; + [mDelegate closePanel]; // Even when we hide it, we are still using a // native dialog, so return true: return true; @@ -756,8 +746,7 @@ void QCocoaFileDialogHelper::exec() // yet been reactivated (regardless if [NSApp run] is still on the stack)), // showing a native modal dialog will fail. QCocoaAutoReleasePool pool; - QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate); - if ([delegate runApplicationModalPanel]) + if ([mDelegate runApplicationModalPanel]) emit accept(); else emit reject(); diff --git a/src/plugins/platforms/cocoa/qcocoamenu.h b/src/plugins/platforms/cocoa/qcocoamenu.h index b2a0beb539..85913a67e1 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.h +++ b/src/plugins/platforms/cocoa/qcocoamenu.h @@ -59,7 +59,7 @@ public: void syncMenuItem(QPlatformMenuItem *menuItem); void setEnabled(bool enabled); void setVisible(bool visible); - void showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item); + void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item); void dismiss(); void syncSeparatorsCollapsible(bool enable); @@ -86,6 +86,10 @@ public: QList<QCocoaMenuItem *> merged() const; void setMenuBar(QCocoaMenuBar *menuBar); QCocoaMenuBar *menuBar() const; + + void setContainingMenuItem(QCocoaMenuItem *menuItem); + QCocoaMenuItem *containingMenuItem() const; + private: QCocoaMenuItem *itemOrNull(int index) const; void insertNative(QCocoaMenuItem *item, QCocoaMenuItem *beforeItem); @@ -98,6 +102,7 @@ private: bool m_visible; quintptr m_tag; QCocoaMenuBar *m_menuBar; + QCocoaMenuItem *m_containingMenuItem; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm index 3d0201e1a0..736e02a3ca 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.mm +++ b/src/plugins/platforms/cocoa/qcocoamenu.mm @@ -222,7 +222,8 @@ QCocoaMenu::QCocoaMenu() : m_enabled(true), m_visible(true), m_tag(0), - m_menuBar(0) + m_menuBar(0), + m_containingMenuItem(0) { m_delegate = [[QCocoaMenuDelegate alloc] initWithMenu:this]; m_nativeItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; @@ -238,6 +239,10 @@ QCocoaMenu::~QCocoaMenu() if (COCOA_MENU_ANCESTOR(item) == this) SET_COCOA_MENU_ANCESTOR(item, 0); } + + if (m_containingMenuItem) + m_containingMenuItem->clearMenu(this); + QCocoaAutoReleasePool pool; [m_nativeItem setSubmenu:nil]; [m_nativeMenu release]; @@ -433,10 +438,11 @@ void QCocoaMenu::setVisible(bool visible) m_visible = visible; } -void QCocoaMenu::showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item) +void QCocoaMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) { QCocoaAutoReleasePool pool; + QPoint pos = QPoint(targetRect.left(), targetRect.top() + targetRect.height()); QCocoaWindow *cocoaWindow = parentWindow ? static_cast<QCocoaWindow *>(parentWindow->handle()) : 0; NSView *view = cocoaWindow ? cocoaWindow->contentView() : nil; NSMenuItem *nsItem = item ? ((QCocoaMenuItem *)item)->nsItem() : nil; @@ -567,4 +573,14 @@ QCocoaMenuBar *QCocoaMenu::menuBar() const return m_menuBar; } +void QCocoaMenu::setContainingMenuItem(QCocoaMenuItem *menuItem) +{ + m_containingMenuItem = menuItem; +} + +QCocoaMenuItem *QCocoaMenu::containingMenuItem() const +{ + return m_containingMenuItem; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.h b/src/plugins/platforms/cocoa/qcocoamenuitem.h index 0ad8eada2b..4b94fa0020 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.h +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.h @@ -94,6 +94,7 @@ public: inline bool isSeparator() const { return m_isSeparator; } QCocoaMenu *menu() const { return m_menu; } + void clearMenu(QCocoaMenu *menu); MenuRole effectiveRole() const; private: diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm index d0d1e7e8b8..3d3b6bf598 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm @@ -132,13 +132,19 @@ void QCocoaMenuItem::setMenu(QPlatformMenu *menu) { if (menu == m_menu) return; - if (m_menu && COCOA_MENU_ANCESTOR(m_menu) == this) - SET_COCOA_MENU_ANCESTOR(m_menu, 0); + + if (m_menu) { + if (COCOA_MENU_ANCESTOR(m_menu) == this) + SET_COCOA_MENU_ANCESTOR(m_menu, 0); + if (m_menu->containingMenuItem() == this) + m_menu->setContainingMenuItem(0); + } QCocoaAutoReleasePool pool; m_menu = static_cast<QCocoaMenu *>(menu); if (m_menu) { SET_COCOA_MENU_ANCESTOR(m_menu, this); + m_menu->setContainingMenuItem(this); } else { // we previously had a menu, but no longer // clear out our item so the nexy sync() call builds a new one @@ -147,6 +153,12 @@ void QCocoaMenuItem::setMenu(QPlatformMenu *menu) } } +void QCocoaMenuItem::clearMenu(QCocoaMenu *menu) +{ + if (menu == m_menu) + m_menu = 0; +} + void QCocoaMenuItem::setVisible(bool isVisible) { m_isVisible = isVisible; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 7e22351818..9259c2c772 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -82,6 +82,32 @@ static bool isMouseEvent(NSEvent *ev) } } +static void selectNextKeyWindow(NSWindow *currentKeyWindow) +{ + if (!currentKeyWindow) + return; + + const QCocoaAutoReleasePool pool; + + if ([[NSApplication sharedApplication] keyWindow] != currentKeyWindow) + return;//currentKeyWindow is not a key window actually. + + NSArray *const windows = [[NSApplication sharedApplication] windows]; + bool startLookup = false; + for (NSWindow *candidate in [windows reverseObjectEnumerator]) { + if (!startLookup) { + if (candidate == currentKeyWindow) + startLookup = true; + } else { + if ([candidate isVisible] && [candidate canBecomeKeyWindow]) { + [candidate makeKeyWindow]; + break; + } + } + } +} + + @interface NSWindow (CocoaWindowCategory) - (NSRect) legacyConvertRectFromScreen:(NSRect) rect; @end @@ -592,6 +618,9 @@ void QCocoaWindow::hide(bool becauseOfAncestor) foreach (QCocoaWindow *childWindow, m_childWindows) childWindow->hide(true); + if (window()->transientParent() && m_nsWindow == [[NSApplication sharedApplication] keyWindow]) + selectNextKeyWindow(m_nsWindow); // Otherwise, Cocoa can do it wrong. + [m_nsWindow orderOut:nil]; } @@ -1456,7 +1485,11 @@ void QCocoaWindow::setNSWindow(QCocoaNSWindow *window) { if (window.contentView != m_contentView) { [m_contentView setPostsFrameChangedNotifications: NO]; + [m_contentView retain]; + if (m_contentView.superview) // m_contentView comes from another NSWindow + [m_contentView removeFromSuperview]; [window setContentView:m_contentView]; + [m_contentView release]; [m_contentView setPostsFrameChangedNotifications: YES]; } } @@ -1713,12 +1746,13 @@ qreal QCocoaWindow::devicePixelRatio() const { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) { - NSWindow* window = [m_contentView window]; - if (window) { - return qreal([window backingScaleFactor]); - } else { - return 1.0; - } + // The documented way to observe the relationship between device-independent + // and device pixels is to use one for the convertToBacking functions. Other + // methods such as [NSWindow backingScaleFacor] might not give the correct + // result, for example if setWantsBestResolutionOpenGLSurface is not set or + // or ignored by the OpenGL driver. + NSSize backingSize = [m_contentView convertSizeToBacking:NSMakeSize(1.0, 1.0)]; + return backingSize.height; } else #endif { diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm index 6549f127b6..65665ef790 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.mm +++ b/src/plugins/platforms/cocoa/qmacclipboard.mm @@ -308,7 +308,7 @@ QMacPasteboard::setMimeData(QMimeData *mime_src) // Hack: The Rtf handler converts incoming Rtf to Html. We do // not want to convert outgoing Html to Rtf but instead keep // posting it as Html. Skip the Rtf handler here. - if (c->convertorName() == QStringLiteral("Rtf")) + if (c->convertorName() == QLatin1String("Rtf")) continue; QString flavor(c->flavorFor(mimeType)); if (!flavor.isEmpty()) { diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index d72664f0a0..10a92667c1 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -301,7 +301,7 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; // For widgets we need to do a bit of trickery as the window // to activate is the window of the top-level widget. - if (m_window->metaObject()->className() == QStringLiteral("QWidgetWindow")) { + if (qstrcmp(m_window->metaObject()->className(), "QWidgetWindow") == 0) { while (focusWindow->parent()) { focusWindow = focusWindow->parent(); } @@ -594,6 +594,8 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; CGImageRelease(subMask); [self invalidateWindowShadowIfNeeded]; + + m_backingStore = 0; } - (BOOL) isFlipped diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dplatformplugin.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dplatformplugin.cpp index 79e4be7564..5541f8991e 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dplatformplugin.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dplatformplugin.cpp @@ -48,7 +48,7 @@ public: QPlatformIntegration *QWindowsDirect2DIntegrationPlugin::create(const QString& system, const QStringList& paramList) { - if (system.compare(system, QStringLiteral("direct2d"), Qt::CaseInsensitive) == 0) + if (system.compare(system, QLatin1String("direct2d"), Qt::CaseInsensitive) == 0) return QWindowsDirect2DIntegration::create(paramList); return 0; } diff --git a/src/plugins/platforms/ios/qiosscreen.h b/src/plugins/platforms/ios/qiosscreen.h index 69fe17d9af..7987ef82d5 100644 --- a/src/plugins/platforms/ios/qiosscreen.h +++ b/src/plugins/platforms/ios/qiosscreen.h @@ -66,9 +66,6 @@ public: void updateProperties(); -public slots: - void updateStatusBarVisibility(); - private: UIScreen *m_uiScreen; UIWindow *m_uiWindow; diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index 266e6848e2..e70b369b79 100644 --- a/src/plugins/platforms/ios/qiosscreen.mm +++ b/src/plugins/platforms/ios/qiosscreen.mm @@ -187,8 +187,8 @@ QIOSScreen::QIOSScreen(UIScreen *screen) if (screen == [UIScreen mainScreen]) { QString deviceIdentifier = deviceModelIdentifier(); - if (deviceIdentifier == QStringLiteral("iPhone2,1") /* iPhone 3GS */ - || deviceIdentifier == QStringLiteral("iPod3,1") /* iPod touch 3G */) { + if (deviceIdentifier == QLatin1String("iPhone2,1") /* iPhone 3GS */ + || deviceIdentifier == QLatin1String("iPod3,1") /* iPod touch 3G */) { m_depth = 18; } else { m_depth = 24; @@ -225,8 +225,6 @@ QIOSScreen::QIOSScreen(UIScreen *screen) } } - connect(qGuiApp, &QGuiApplication::focusWindowChanged, this, &QIOSScreen::updateStatusBarVisibility); - updateProperties(); } @@ -254,44 +252,6 @@ void QIOSScreen::updateProperties() } } -void QIOSScreen::updateStatusBarVisibility() -{ - if (!isQtApplication()) - return; - - QWindow *focusWindow = QGuiApplication::focusWindow(); - - // If we don't have a focus window we leave the status - // bar as is, so that the user can activate a new window - // with the same window state without the status bar jumping - // back and forth. - if (!focusWindow) - return; - - UIView *view = reinterpret_cast<UIView *>(focusWindow->handle()->winId()); - QIOSViewController *viewController = static_cast<QIOSViewController *>(view.viewController); - - bool currentStatusBarVisibility = [UIApplication sharedApplication].statusBarHidden; - if (viewController.prefersStatusBarHidden == currentStatusBarVisibility) - return; - -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { - [viewController setNeedsStatusBarAppearanceUpdate]; - dispatch_async(dispatch_get_main_queue(), ^{ - updateProperties(); - }); - } else -#endif - { - [[UIApplication sharedApplication] - setStatusBarHidden:[viewController prefersStatusBarHidden] - withAnimation:UIStatusBarAnimationNone]; - - updateProperties(); - } -} - QRect QIOSScreen::geometry() const { return m_geometry; diff --git a/src/plugins/platforms/ios/qiostheme.h b/src/plugins/platforms/ios/qiostheme.h index 16b330a030..4cedc7b879 100644 --- a/src/plugins/platforms/ios/qiostheme.h +++ b/src/plugins/platforms/ios/qiostheme.h @@ -35,6 +35,7 @@ #define QIOSTHEME_H #include <QtCore/QHash> +#include <QtGui/QPalette> #include <qpa/qplatformtheme.h> QT_BEGIN_NAMESPACE @@ -45,6 +46,7 @@ public: QIOSTheme(); ~QIOSTheme(); + const QPalette *palette(Palette type = SystemPalette) const Q_DECL_OVERRIDE; QVariant themeHint(ThemeHint hint) const; QPlatformMenuItem* createPlatformMenuItem() const Q_DECL_OVERRIDE; @@ -56,6 +58,7 @@ public: private: mutable QHash<QPlatformTheme::Font, QFont *> m_fonts; + QPalette m_systemPalette; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiostheme.mm b/src/plugins/platforms/ios/qiostheme.mm index cbeb157cf2..c89dd7dc05 100644 --- a/src/plugins/platforms/ios/qiostheme.mm +++ b/src/plugins/platforms/ios/qiostheme.mm @@ -60,7 +60,10 @@ QT_BEGIN_NAMESPACE const char *QIOSTheme::name = "ios"; QIOSTheme::QIOSTheme() + : m_systemPalette(*QPlatformTheme::palette(QPlatformTheme::SystemPalette)) { + m_systemPalette.setBrush(QPalette::Highlight, QColor(204, 221, 237)); + m_systemPalette.setBrush(QPalette::HighlightedText, Qt::black); } QIOSTheme::~QIOSTheme() @@ -68,6 +71,13 @@ QIOSTheme::~QIOSTheme() qDeleteAll(m_fonts); } +const QPalette *QIOSTheme::palette(QPlatformTheme::Palette type) const +{ + if (type == QPlatformTheme::SystemPalette) + return &m_systemPalette; + return 0; +} + QPlatformMenuItem* QIOSTheme::createPlatformMenuItem() const { return new QIOSMenuItem(); diff --git a/src/plugins/platforms/ios/qiosviewcontroller.h b/src/plugins/platforms/ios/qiosviewcontroller.h index 2ef6400b26..cbb28aec0d 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.h +++ b/src/plugins/platforms/ios/qiosviewcontroller.h @@ -40,8 +40,9 @@ class QIOSScreen; } @property (nonatomic, assign) BOOL changingOrientation; +@property (nonatomic, assign) BOOL prefersStatusBarHidden; - (id)initWithQIOSScreen:(QIOSScreen *)screen; -- (BOOL)prefersStatusBarHidden; +- (void)updateProperties; @end diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm index 1c06228e81..ca8d48bf6d 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.mm +++ b/src/plugins/platforms/ios/qiosviewcontroller.mm @@ -147,6 +147,13 @@ #endif self.changingOrientation = NO; + + // Status bar may be initially hidden at startup through Info.plist + self.prefersStatusBarHidden = infoPlistValue(@"UIStatusBarHidden", false); + + QObject::connect(qApp, &QGuiApplication::focusWindowChanged, [self]() { + [self updateProperties]; + }); } return self; @@ -173,6 +180,49 @@ [super viewDidUnload]; } +// ------------------------------------------------------------------------- + +- (void)updateProperties +{ + if (!isQtApplication()) + return; + + QWindow *focusWindow = QGuiApplication::focusWindow(); + + // If we don't have a focus window we leave the statusbar + // as is, so that the user can activate a new window with + // the same window state without the status bar jumping + // back and forth. + if (!focusWindow) + return; + + // We only care about changes to focusWindow that involves our screen + if (!focusWindow->screen() || focusWindow->screen()->handle() != m_screen) + return; + + // All decisions are based on the the top level window + focusWindow = qt_window_private(focusWindow)->topLevelWindow(); + + bool currentStatusBarVisibility = self.prefersStatusBarHidden; + self.prefersStatusBarHidden = focusWindow->windowState() == Qt::WindowFullScreen; + if (self.prefersStatusBarHidden != currentStatusBarVisibility) { +#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { + [self setNeedsStatusBarAppearanceUpdate]; + } else +#endif + { + [[UIApplication sharedApplication] + setStatusBarHidden:self.prefersStatusBarHidden + withAnimation:UIStatusBarAnimationNone]; + } + + [self.view setNeedsLayout]; + } +} + +// ------------------------------------------------------------------------- + -(BOOL)shouldAutorotate { // Until a proper orientation and rotation API is in place, we always auto rotate. @@ -261,17 +311,5 @@ } #endif -- (BOOL)prefersStatusBarHidden -{ - static bool hiddenFromPlist = infoPlistValue(@"UIStatusBarHidden", false); - if (hiddenFromPlist) - return YES; - QWindow *focusWindow = QGuiApplication::focusWindow(); - if (!focusWindow) - return [UIApplication sharedApplication].statusBarHidden; - - return qt_window_private(focusWindow)->topLevelWindow()->windowState() == Qt::WindowFullScreen; -} - @end diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 1c9fc6f28a..e29ff53876 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -119,7 +119,6 @@ void QIOSWindow::setVisible(bool visible) if (visible) { requestActivateWindow(); - static_cast<QIOSScreen *>(screen())->updateStatusBarVisibility(); } else { // Activate top-most visible QWindow: NSArray *subviews = m_view.viewController.view.subviews; @@ -202,7 +201,7 @@ void QIOSWindow::setWindowState(Qt::WindowState state) qt_window_private(window())->windowState = state; if (window()->isTopLevel() && window()->isVisible() && window()->isActive()) - static_cast<QIOSScreen *>(screen())->updateStatusBarVisibility(); + [m_view.qtViewController updateProperties]; switch (state) { case Qt::WindowNoState: diff --git a/src/plugins/platforms/ios/quiview.h b/src/plugins/platforms/ios/quiview.h index a6a8690c2f..fe71e5bed7 100644 --- a/src/plugins/platforms/ios/quiview.h +++ b/src/plugins/platforms/ios/quiview.h @@ -40,6 +40,8 @@ class QIOSWindow; +@class QIOSViewController; + @interface QUIView : UIView { @public @@ -50,7 +52,7 @@ class QIOSWindow; @private NSMutableArray *m_accessibleElements; -} +}; - (id)initWithQIOSWindow:(QIOSWindow *)window; - (void)sendUpdatedExposeEvent; @@ -59,3 +61,8 @@ class QIOSWindow; @interface QUIView (Accessibility) - (void)clearAccessibleCache; @end + +@interface QUIView (QtHelpers) +- (QIOSViewController*)qtViewController; +@end + diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index 4e720941f9..200b07b5fc 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -43,6 +43,7 @@ #include "qiosglobal.h" #include "qiosintegration.h" +#include "qiosviewcontroller.h" #include "qioswindow.h" #include "qiosmenu.h" @@ -207,9 +208,10 @@ // of activating another window. The handleWindowActivated of the activation // will take care of both. dispatch_async(dispatch_get_main_queue (), ^{ - if (![[UIResponder currentFirstResponder] isKindOfClass:[QUIView class]]) + if (![[UIResponder currentFirstResponder] isKindOfClass:[QUIView class]]) { QWindowSystemInterface::handleWindowActivated(0); QWindowSystemInterface::flushWindowSystemEvents(); + } }); return YES; @@ -368,6 +370,15 @@ return nil; } +- (QIOSViewController*)qtViewController +{ + UIViewController *vc = self.viewController; + if ([vc isKindOfClass:QIOSViewController.class]) + return static_cast<QIOSViewController *>(vc); + + return nil; +} + @end // Include category as an alternative to using -ObjC (Apple QA1490) diff --git a/src/plugins/platforms/kms/qkmsbackingstore.cpp b/src/plugins/platforms/kms/qkmsbackingstore.cpp index 29a673b876..ee79145671 100644 --- a/src/plugins/platforms/kms/qkmsbackingstore.cpp +++ b/src/plugins/platforms/kms/qkmsbackingstore.cpp @@ -49,7 +49,6 @@ QKmsBackingStore::QKmsBackingStore(QWindow *window) m_context->setFormat(window->requestedFormat()); m_context->setScreen(window->screen()); m_context->create(); - window->setSurfaceType(QSurface::OpenGLSurface); } QKmsBackingStore::~QKmsBackingStore() diff --git a/src/plugins/platforms/kms/qkmsbackingstore.h b/src/plugins/platforms/kms/qkmsbackingstore.h index 91c04c32d0..56d57313e8 100644 --- a/src/plugins/platforms/kms/qkmsbackingstore.h +++ b/src/plugins/platforms/kms/qkmsbackingstore.h @@ -56,6 +56,8 @@ public: void flush(QWindow *window, const QRegion ®ion, const QPoint &offset); void resize(const QSize &size, const QRegion &staticContents); + QImage toImage() const Q_DECL_OVERRIDE { return m_image; } + private: QOpenGLContext *m_context; QImage m_image; diff --git a/src/plugins/platforms/kms/qkmscontext.cpp b/src/plugins/platforms/kms/qkmscontext.cpp index c3a4923ce1..4b4505294c 100644 --- a/src/plugins/platforms/kms/qkmscontext.cpp +++ b/src/plugins/platforms/kms/qkmscontext.cpp @@ -35,19 +35,18 @@ #include "qkmsdevice.h" #include "qkmscontext.h" #include "qkmswindow.h" +#include "qkmsintegration.h" -#include <QOpenGLContext> - +#include <QtGui/QOpenGLContext> #include <QtPlatformSupport/private/qeglconvenience_p.h> QT_BEGIN_NAMESPACE QKmsContext::QKmsContext(QOpenGLContext *context, QKmsDevice *device) - : QPlatformOpenGLContext() - , m_device(device) + : m_device(device) { EGLDisplay display = m_device->eglDisplay(); - EGLConfig config = q_configFromGLFormat(display, QKmsScreen::tweakFormat(context->format()), true); + EGLConfig config = q_configFromGLFormat(display, QKmsScreen::tweakFormat(context->format())); m_format = q_glFormatFromConfig(display, config); //Initialize EGLContext @@ -57,7 +56,12 @@ QKmsContext::QKmsContext(QOpenGLContext *context, QKmsDevice *device) }; eglBindAPI(EGL_OPENGL_ES_API); - m_eglContext = eglCreateContext(display, config, 0, contextAttribs); + + EGLContext share = EGL_NO_CONTEXT; + if (context->shareContext()) + share = static_cast<QKmsContext *>(context->shareContext()->handle())->eglContext(); + + m_eglContext = eglCreateContext(display, config, share, contextAttribs); if (m_eglContext == EGL_NO_CONTEXT) { qWarning("QKmsContext::QKmsContext(): eglError: %x, this: %p", eglGetError(), this); @@ -72,16 +76,19 @@ bool QKmsContext::isValid() const bool QKmsContext::makeCurrent(QPlatformSurface *surface) { - Q_ASSERT(surface->surface()->surfaceType() == QSurface::OpenGLSurface); + Q_ASSERT(surface->surface()->supportsOpenGL()); EGLDisplay display = m_device->eglDisplay(); - - QPlatformWindow *window = static_cast<QPlatformWindow *>(surface); - QKmsScreen *screen = static_cast<QKmsScreen *> (QPlatformScreen::platformScreenForWindow(window->window())); - - EGLSurface eglSurface = screen->eglSurface(); - - screen->waitForPageFlipComplete(); + EGLSurface eglSurface; + + if (surface->surface()->surfaceClass() == QSurface::Window) { + QPlatformWindow *window = static_cast<QPlatformWindow *>(surface); + QKmsScreen *screen = static_cast<QKmsScreen *>(QPlatformScreen::platformScreenForWindow(window->window())); + eglSurface = screen->eglSurface(); + screen->waitForPageFlipComplete(); + } else { + eglSurface = static_cast<QKmsOffscreenWindow *>(surface)->surface(); + } bool ok = eglMakeCurrent(display, eglSurface, eglSurface, m_eglContext); if (!ok) diff --git a/src/plugins/platforms/kms/qkmscursor.cpp b/src/plugins/platforms/kms/qkmscursor.cpp index 91b0ad236d..99af805bad 100644 --- a/src/plugins/platforms/kms/qkmscursor.cpp +++ b/src/plugins/platforms/kms/qkmscursor.cpp @@ -37,14 +37,29 @@ QT_BEGIN_NAMESPACE +#ifndef DRM_CAP_CURSOR_WIDTH +#define DRM_CAP_CURSOR_WIDTH 0x8 +#endif + +#ifndef DRM_CAP_CURSOR_HEIGHT +#define DRM_CAP_CURSOR_HEIGHT 0x9 +#endif + QKmsCursor::QKmsCursor(QKmsScreen *screen) : m_screen(screen), m_graphicsBufferManager(screen->device()->gbmDevice()), - m_cursorBufferObject(gbm_bo_create(m_graphicsBufferManager, 64, 64, GBM_FORMAT_ARGB8888, - GBM_BO_USE_CURSOR_64X64|GBM_BO_USE_WRITE)), m_cursorImage(new QPlatformCursorImage(0, 0, 0, 0, 0, 0)), - m_moved(false) + m_moved(false), + m_cursorSize(64, 64) { + uint64_t value = 0; + if (!drmGetCap(m_screen->device()->fd(), DRM_CAP_CURSOR_WIDTH, &value)) + m_cursorSize.setWidth(value); + if (!drmGetCap(m_screen->device()->fd(), DRM_CAP_CURSOR_HEIGHT, &value)) + m_cursorSize.setHeight(value); + + m_cursorBufferObject = gbm_bo_create(m_graphicsBufferManager, m_cursorSize.width(), m_cursorSize.height(), + GBM_FORMAT_ARGB8888, GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE); } QKmsCursor::~QKmsCursor() @@ -81,16 +96,17 @@ void QKmsCursor::changeCursor(QCursor *windowCursor, QWindow *window) windowCursor->hotSpot().y()); } - if ((m_cursorImage->image()->width() > 64) || (m_cursorImage->image()->width() > 64)) - qWarning("Warning: cursor larger than 64x64; only 64x64 pixels will be shown."); + if (m_cursorImage->image()->width() > m_cursorSize.width() || m_cursorImage->image()->width() > m_cursorSize.height()) + qWarning("cursor larger than %dx%d, cursor truncated", m_cursorSize.width(), m_cursorSize.height()); - QImage cursorImage = m_cursorImage->image()-> - convertToFormat(QImage::Format_ARGB32).copy(0, 0, 64, 64); + QImage cursorImage = m_cursorImage->image()->convertToFormat(QImage::Format_ARGB32) + .copy(0, 0, m_cursorSize.width(), m_cursorSize.height()); gbm_bo_write(m_cursorBufferObject, cursorImage.constBits(), cursorImage.byteCount()); quint32 handle = gbm_bo_get_handle(m_cursorBufferObject).u32; int status = drmModeSetCursor(m_screen->device()->fd(), - m_screen->crtcId(), handle, 64, 64); + m_screen->crtcId(), handle, + m_cursorSize.width(), m_cursorSize.height()); if (status) { qWarning("failed to set cursor: %d", status); diff --git a/src/plugins/platforms/kms/qkmscursor.h b/src/plugins/platforms/kms/qkmscursor.h index 21d447aaa9..3eef4e599c 100644 --- a/src/plugins/platforms/kms/qkmscursor.h +++ b/src/plugins/platforms/kms/qkmscursor.h @@ -58,6 +58,7 @@ private: gbm_bo *m_cursorBufferObject; QPlatformCursorImage *m_cursorImage; bool m_moved; + QSize m_cursorSize; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/kms/qkmsintegration.cpp b/src/plugins/platforms/kms/qkmsintegration.cpp index ed6ab8f885..d94d7d9aaa 100644 --- a/src/plugins/platforms/kms/qkmsintegration.cpp +++ b/src/plugins/platforms/kms/qkmsintegration.cpp @@ -48,10 +48,13 @@ #include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h> #include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h> #include <QtPlatformSupport/private/qfbvthandler_p.h> +#include <QtPlatformSupport/private/qeglconvenience_p.h> #include <QtGui/private/qguiapplication_p.h> #include <QtGui/QOpenGLContext> #include <QtGui/QScreen> +#include <QtGui/QOffscreenSurface> +#include <qpa/qplatformoffscreensurface.h> QT_BEGIN_NAMESPACE @@ -116,6 +119,7 @@ bool QKmsIntegration::hasCapability(QPlatformIntegration::Capability cap) const case ThreadedPixmaps: return true; case OpenGL: return true; case ThreadedOpenGL: return false; + case RasterGLSurface: return true; default: return QPlatformIntegration::hasCapability(cap); } } @@ -138,6 +142,44 @@ QPlatformBackingStore *QKmsIntegration::createPlatformBackingStore(QWindow *wind return new QKmsBackingStore(window); } +// Neither a pbuffer nor a hidden QWindow is suitable. Just use an additional, small gbm surface. +QKmsOffscreenWindow::QKmsOffscreenWindow(EGLDisplay display, const QSurfaceFormat &format, QOffscreenSurface *offscreenSurface) + : QPlatformOffscreenSurface(offscreenSurface) + , m_format(format) + , m_display(display) + , m_surface(EGL_NO_SURFACE) + , m_window(0) +{ + QKmsScreen *screen = static_cast<QKmsScreen *>(offscreenSurface->screen()->handle()); + m_window = gbm_surface_create(screen->device()->gbmDevice(), + 10, 10, + GBM_FORMAT_XRGB8888, + GBM_BO_USE_RENDERING); + if (!m_window) { + qWarning("QKmsOffscreenWindow: Failed to create native window"); + return; + } + + EGLConfig config = q_configFromGLFormat(m_display, m_format); + m_surface = eglCreateWindowSurface(m_display, config, m_window, 0); + if (m_surface != EGL_NO_SURFACE) + m_format = q_glFormatFromConfig(m_display, config); +} + +QKmsOffscreenWindow::~QKmsOffscreenWindow() +{ + if (m_surface != EGL_NO_SURFACE) + eglDestroySurface(m_display, m_surface); + if (m_window) + gbm_surface_destroy((gbm_surface *) m_window); +} + +QPlatformOffscreenSurface *QKmsIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const +{ + QKmsScreen *screen = static_cast<QKmsScreen *>(surface->screen()->handle()); + return new QKmsOffscreenWindow(screen->device()->eglDisplay(), QKmsScreen::tweakFormat(surface->format()), surface); +} + QPlatformFontDatabase *QKmsIntegration::fontDatabase() const { return m_fontDatabase; diff --git a/src/plugins/platforms/kms/qkmsintegration.h b/src/plugins/platforms/kms/qkmsintegration.h index b13fbb2793..3ca2510e68 100644 --- a/src/plugins/platforms/kms/qkmsintegration.h +++ b/src/plugins/platforms/kms/qkmsintegration.h @@ -36,7 +36,9 @@ #include <qpa/qplatformintegration.h> #include <qpa/qplatformnativeinterface.h> +#include <qpa/qplatformoffscreensurface.h> #include <QtPlatformSupport/private/qdevicediscovery_p.h> +#include <EGL/egl.h> QT_BEGIN_NAMESPACE @@ -44,6 +46,24 @@ class QKmsScreen; class QKmsDevice; class QFbVtHandler; +class QKmsOffscreenWindow : public QPlatformOffscreenSurface +{ +public: + QKmsOffscreenWindow(EGLDisplay display, const QSurfaceFormat &format, QOffscreenSurface *offscreenSurface); + ~QKmsOffscreenWindow(); + + QSurfaceFormat format() const Q_DECL_OVERRIDE { return m_format; } + bool isValid() const Q_DECL_OVERRIDE { return m_surface != EGL_NO_SURFACE; } + + EGLSurface surface() const { return m_surface; } + +private: + QSurfaceFormat m_format; + EGLDisplay m_display; + EGLSurface m_surface; + EGLNativeWindowType m_window; +}; + class QKmsIntegration : public QObject, public QPlatformIntegration { Q_OBJECT @@ -58,6 +78,7 @@ public: QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const Q_DECL_OVERRIDE; QPlatformWindow *createPlatformWindow(QWindow *window) const Q_DECL_OVERRIDE; QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const Q_DECL_OVERRIDE; + QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const Q_DECL_OVERRIDE; QPlatformFontDatabase *fontDatabase() const Q_DECL_OVERRIDE; QAbstractEventDispatcher *createEventDispatcher() const Q_DECL_OVERRIDE; diff --git a/src/plugins/platforms/kms/qkmsscreen.cpp b/src/plugins/platforms/kms/qkmsscreen.cpp index d14e91a259..84c1eba448 100644 --- a/src/plugins/platforms/kms/qkmsscreen.cpp +++ b/src/plugins/platforms/kms/qkmsscreen.cpp @@ -170,10 +170,11 @@ QSurfaceFormat QKmsScreen::tweakFormat(const QSurfaceFormat &format) void QKmsScreen::initializeWithFormat(const QSurfaceFormat &format) { EGLDisplay display = m_device->eglDisplay(); - EGLConfig config = q_configFromGLFormat(display, tweakFormat(format), true); + EGLConfig config = q_configFromGLFormat(display, tweakFormat(format)); m_eglWindowSurface = eglCreateWindowSurface(display, config, (EGLNativeWindowType)m_gbmSurface, NULL); qCDebug(lcQpaScreen) << "created window surface"; + m_surfaceFormat = q_glFormatFromConfig(display, config); } void QKmsScreen::swapBuffers() diff --git a/src/plugins/platforms/kms/qkmsscreen.h b/src/plugins/platforms/kms/qkmsscreen.h index 40661ef709..552541503c 100644 --- a/src/plugins/platforms/kms/qkmsscreen.h +++ b/src/plugins/platforms/kms/qkmsscreen.h @@ -48,6 +48,7 @@ extern "C" { #include <EGL/egl.h> #include <EGL/eglext.h> #include <QtGui/qopengl.h> +#include <QtGui/qsurfaceformat.h> #include <QtCore/qloggingcategory.h> #include <qpa/qplatformscreen.h> @@ -87,6 +88,8 @@ public: static QSurfaceFormat tweakFormat(const QSurfaceFormat &format); + QSurfaceFormat surfaceFormat() const { return m_surfaceFormat; } + private: void performPageFlip(); void initializeScreenMode(const drmModeRes *resources, const drmModeConnector *connector); @@ -111,6 +114,7 @@ private: EGLSurface m_eglWindowSurface; bool m_modeSet; + QSurfaceFormat m_surfaceFormat; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/kms/qkmswindow.cpp b/src/plugins/platforms/kms/qkmswindow.cpp index d2c3bb78fe..bc803d0dbb 100644 --- a/src/plugins/platforms/kms/qkmswindow.cpp +++ b/src/plugins/platforms/kms/qkmswindow.cpp @@ -58,4 +58,9 @@ void QKmsWindow::setGeometry(const QRect &rect) QPlatformWindow::setGeometry(fullscreenRect); } +QSurfaceFormat QKmsWindow::format() const +{ + return static_cast<QKmsScreen *>(m_screen)->surfaceFormat(); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/kms/qkmswindow.h b/src/plugins/platforms/kms/qkmswindow.h index fd6f568580..ca7eb209db 100644 --- a/src/plugins/platforms/kms/qkmswindow.h +++ b/src/plugins/platforms/kms/qkmswindow.h @@ -45,7 +45,8 @@ class QKmsWindow : public QPlatformWindow public: QKmsWindow(QWindow *window); - void setGeometry(const QRect &rect); + void setGeometry(const QRect &rect) Q_DECL_OVERRIDE; + QSurfaceFormat format() const Q_DECL_OVERRIDE; private: QPlatformScreen *m_screen; diff --git a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp index bd5c3d51d2..4e83f75a1a 100644 --- a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp +++ b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp @@ -127,7 +127,7 @@ void QQnxButtonEventNotifier::updateButtonStates() for (int buttonId = bid_minus; buttonId < ButtonCount; ++buttonId) { // Extract the new button state QByteArray key = m_buttonKeys.at(buttonId); - ButtonState newState = (fields.value(key) == QByteArrayLiteral("b_up") ? ButtonUp : ButtonDown); + ButtonState newState = (fields.value(key) == "b_up" ? ButtonUp : ButtonDown); // If state has changed, update our state and inject a keypress event if (m_state[buttonId] != newState) { diff --git a/src/plugins/platforms/qnx/qqnxnativeinterface.cpp b/src/plugins/platforms/qnx/qqnxnativeinterface.cpp index 224a3c130d..c837e67482 100644 --- a/src/plugins/platforms/qnx/qqnxnativeinterface.cpp +++ b/src/plugins/platforms/qnx/qqnxnativeinterface.cpp @@ -107,9 +107,9 @@ void QQnxNativeInterface::setWindowProperty(QPlatformWindow *window, const QStri { QQnxWindow *qnxWindow = static_cast<QQnxWindow*>(window); - if (name == QStringLiteral("mmRendererWindowName")) { + if (name == QLatin1String("mmRendererWindowName")) { qnxWindow->setMMRendererWindowName(value.toString()); - } else if (name == QStringLiteral("qnxWindowGroup")) { + } else if (name == QLatin1String("qnxWindowGroup")) { if (value.isNull()) qnxWindow->joinWindowGroup(QByteArray()); else if (value.canConvert<QByteArray>()) diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp index 1a56dc0f04..0ea6693c64 100644 --- a/src/plugins/platforms/qnx/qqnxwindow.cpp +++ b/src/plugins/platforms/qnx/qqnxwindow.cpp @@ -75,7 +75,7 @@ QT_BEGIN_NAMESPACE the default behavior suffices, some circumstances require greater control over the interaction with screen. - \section1 Window types + \section1 Window Types The QNX QPA plugin can operate in two modes, with or without a root window. The selection of mode is made via the \e rootwindow and \e no-rootwindow options to the diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp index 69541b4c1a..d0eb8485fa 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp @@ -151,7 +151,7 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) // An event has to be associated with a window, // so find the first parent that is a widget and that has a WId QAccessibleInterface *iface = event->accessibleInterface(); - if (!iface) // ### This should not happen, maybe make it an assert. + if (!iface || !iface->isValid()) return; QWindow *window = QWindowsAccessibility::windowHelper(iface); diff --git a/src/plugins/platforms/windows/main.cpp b/src/plugins/platforms/windows/main.cpp index 5340ccc025..8efc0c017e 100644 --- a/src/plugins/platforms/windows/main.cpp +++ b/src/plugins/platforms/windows/main.cpp @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE \brief Class documentation of the Qt Lighthouse plugin for Windows. - \section1 Supported parameters + \section1 Supported Parameters The following parameters can be passed on to the -platform argument of QGuiApplication: @@ -104,7 +104,7 @@ public: QPlatformIntegration *QWindowsIntegrationPlugin::create(const QString& system, const QStringList& paramList, int &, char **) { - if (system.compare(system, QStringLiteral("windows"), Qt::CaseInsensitive) == 0) + if (system.compare(system, QLatin1String("windows"), Qt::CaseInsensitive) == 0) return new QWindowsGdiIntegration(paramList); return 0; } diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index 60eacd6ec3..449453cf28 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -853,7 +853,7 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet, int type) { // the "@family" fonts are just the same as "family". Ignore them. - if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QStringLiteral("WST_"))) + if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_"))) return false; static const int SMOOTH_SCALABLE = 0xffff; @@ -918,7 +918,7 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet, // display Thai text by default. As a temporary work around, we special case Segoe UI // and remove the Thai script from its list of supported writing systems. if (writingSystems.supported(QFontDatabase::Thai) && - familyName == QStringLiteral("Segoe UI")) + familyName == QLatin1String("Segoe UI")) writingSystems.setSupported(QFontDatabase::Thai, false); } else { const QFontDatabase::WritingSystem ws = writingSystemFromCharSet(charSet); @@ -1591,7 +1591,7 @@ LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request) && (request.style == QFont::StyleItalic || (-lf.lfHeight > 18 && -lf.lfHeight != 24))) { fam = QStringLiteral("Arial"); // MS Sans Serif has bearing problems in italic, and does not scale } - if (fam == QStringLiteral("Courier") && !(request.styleStrategy & QFont::PreferBitmap)) + if (fam == QLatin1String("Courier") && !(request.styleStrategy & QFont::PreferBitmap)) fam = QStringLiteral("Courier New"); memcpy(lf.lfFaceName, fam.utf16(), sizeof(wchar_t) * qMin(fam.length() + 1, 32)); // 32 = Windows hard-coded @@ -1703,18 +1703,18 @@ QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, if (rawMode) { // will choose a stock font int f = SYSTEM_FONT; const QString fam = request.family.toLower(); - if (fam == QStringLiteral("default") || fam == QStringLiteral("system")) + if (fam == QLatin1String("default") || fam == QLatin1String("system")) f = SYSTEM_FONT; #ifndef Q_OS_WINCE - else if (fam == QStringLiteral("system_fixed")) + else if (fam == QLatin1String("system_fixed")) f = SYSTEM_FIXED_FONT; - else if (fam == QStringLiteral("ansi_fixed")) + else if (fam == QLatin1String("ansi_fixed")) f = ANSI_FIXED_FONT; - else if (fam == QStringLiteral("ansi_var")) + else if (fam == QLatin1String("ansi_var")) f = ANSI_VAR_FONT; - else if (fam == QStringLiteral("device_default")) + else if (fam == QLatin1String("device_default")) f = DEVICE_DEFAULT_FONT; - else if (fam == QStringLiteral("oem_fixed")) + else if (fam == QLatin1String("oem_fixed")) f = OEM_FIXED_FONT; #endif else if (fam.at(0) == QLatin1Char('#')) @@ -1835,7 +1835,7 @@ QFont QWindowsFontDatabase::systemDefaultFont() GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf); QFont systemFont = QWindowsFontDatabase::LOGFONT_to_QFont(lf); // "MS Shell Dlg 2" is the correct system font >= Win2k - if (systemFont.family() == QStringLiteral("MS Shell Dlg")) + if (systemFont.family() == QLatin1String("MS Shell Dlg")) systemFont.setFamily(QStringLiteral("MS Shell Dlg 2")); qCDebug(lcQpaFonts) << __FUNCTION__ << systemFont; return systemFont; diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp index 011fc9facb..42e5a8c6ad 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp @@ -122,7 +122,7 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet, typedef QPair<QString, QStringList> FontKey; // the "@family" fonts are just the same as "family". Ignore them. - if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QStringLiteral("WST_"))) + if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_"))) return false; const int separatorPos = familyName.indexOf(QStringLiteral("::")); @@ -181,7 +181,7 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet, // display Thai text by default. As a temporary work around, we special case Segoe UI // and remove the Thai script from its list of supported writing systems. if (writingSystems.supported(QFontDatabase::Thai) && - faceName == QStringLiteral("Segoe UI")) + faceName == QLatin1String("Segoe UI")) writingSystems.setSupported(QFontDatabase::Thai, false); } else { const QFontDatabase::WritingSystem ws = writingSystemFromCharSet(charSet); diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp index d0f23acb07..f8747a741e 100644 --- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp +++ b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp @@ -457,8 +457,8 @@ QFixed QWindowsFontEngineDirectWrite::ascent() const QFixed QWindowsFontEngineDirectWrite::descent() const { return fontDef.styleStrategy & QFont::ForceIntegerMetrics - ? (m_descent - 1).round() - : (m_descent - 1); + ? m_descent.round() + : m_descent; } QFixed QWindowsFontEngineDirectWrite::leading() const diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index c0dca0a220..54fb138d85 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -336,9 +336,9 @@ QWindowsStaticOpenGLContext *QWindowsStaticOpenGLContext::create() #if defined(QT_OPENGL_DYNAMIC) const QByteArray requested = qgetenv("QT_OPENGL"); // angle, desktop, software - const bool angleRequested = QCoreApplication::testAttribute(Qt::AA_UseOpenGLES) || requested == QByteArrayLiteral("angle"); - const bool desktopRequested = QCoreApplication::testAttribute(Qt::AA_UseDesktopOpenGL) || requested == QByteArrayLiteral("desktop"); - const bool softwareRequested = QCoreApplication::testAttribute(Qt::AA_UseSoftwareOpenGL) || requested == QByteArrayLiteral("software"); + const bool angleRequested = QCoreApplication::testAttribute(Qt::AA_UseOpenGLES) || requested == "angle"; + const bool desktopRequested = QCoreApplication::testAttribute(Qt::AA_UseDesktopOpenGL) || requested == "desktop"; + const bool softwareRequested = QCoreApplication::testAttribute(Qt::AA_UseSoftwareOpenGL) || requested == "software"; // If ANGLE is requested, use it, don't try anything else. if (angleRequested) { @@ -354,8 +354,10 @@ QWindowsStaticOpenGLContext *QWindowsStaticOpenGLContext::create() if (!ctx) { ctx = QOpenGLStaticContext::create(true); // If software was explicitly requested but failed, try the regular one. - if (!ctx && softwareRequested && QWindowsOpenGLTester::testDesktopGL()) + if (!ctx && softwareRequested && QWindowsOpenGLTester::testDesktopGL()) { + qCWarning(lcQpaGl, "Software OpenGL failed. Falling back to system OpenGL."); ctx = QOpenGLStaticContext::create(); + } } } #elif defined(QT_OPENGL_ES_2) diff --git a/src/plugins/platforms/windows/qwindowsmime.cpp b/src/plugins/platforms/windows/qwindowsmime.cpp index a43e8823aa..bc8e9347dc 100644 --- a/src/plugins/platforms/windows/qwindowsmime.cpp +++ b/src/plugins/platforms/windows/qwindowsmime.cpp @@ -611,7 +611,7 @@ bool QWindowsMimeText::convertFromMime(const FORMATETC &formatetc, const QMimeDa bool QWindowsMimeText::canConvertToMime(const QString &mimeType, IDataObject *pDataObj) const { - return mimeType.startsWith(QStringLiteral("text/plain")) + return mimeType.startsWith(QLatin1String("text/plain")) && (canGetData(CF_UNICODETEXT, pDataObj) || canGetData(CF_TEXT, pDataObj)); } @@ -628,7 +628,7 @@ QString QWindowsMimeText::mimeForFormat(const FORMATETC &formatetc) const QVector<FORMATETC> QWindowsMimeText::formatsForMime(const QString &mimeType, const QMimeData *mimeData) const { QVector<FORMATETC> formatics; - if (mimeType.startsWith(QStringLiteral("text/plain")) && mimeData->hasText()) { + if (mimeType.startsWith(QLatin1String("text/plain")) && mimeData->hasText()) { formatics += setCf(CF_UNICODETEXT); formatics += setCf(CF_TEXT); } @@ -761,7 +761,7 @@ bool QWindowsMimeURI::convertFromMime(const FORMATETC &formatetc, const QMimeDat bool QWindowsMimeURI::canConvertToMime(const QString &mimeType, IDataObject *pDataObj) const { - return mimeType == QStringLiteral("text/uri-list") + return mimeType == QLatin1String("text/uri-list") && (canGetData(CF_HDROP, pDataObj) || canGetData(CF_INETURL_W, pDataObj) || canGetData(CF_INETURL, pDataObj)); } @@ -776,7 +776,7 @@ QString QWindowsMimeURI::mimeForFormat(const FORMATETC &formatetc) const QVector<FORMATETC> QWindowsMimeURI::formatsForMime(const QString &mimeType, const QMimeData *mimeData) const { QVector<FORMATETC> formatics; - if (mimeType == QStringLiteral("text/uri-list")) { + if (mimeType == QLatin1String("text/uri-list")) { if (canConvertFromMime(setCf(CF_HDROP), mimeData)) formatics += setCf(CF_HDROP); if (canConvertFromMime(setCf(CF_INETURL_W), mimeData)) @@ -789,7 +789,7 @@ QVector<FORMATETC> QWindowsMimeURI::formatsForMime(const QString &mimeType, cons QVariant QWindowsMimeURI::convertToMime(const QString &mimeType, LPDATAOBJECT pDataObj, QVariant::Type preferredType) const { - if (mimeType == QStringLiteral("text/uri-list")) { + if (mimeType == QLatin1String("text/uri-list")) { if (canGetData(CF_HDROP, pDataObj)) { QByteArray texturi; QList<QVariant> urls; @@ -862,7 +862,7 @@ QWindowsMimeHtml::QWindowsMimeHtml() QVector<FORMATETC> QWindowsMimeHtml::formatsForMime(const QString &mimeType, const QMimeData *mimeData) const { QVector<FORMATETC> formatetcs; - if (mimeType == QStringLiteral("text/html") && (!mimeData->html().isEmpty())) + if (mimeType == QLatin1String("text/html") && (!mimeData->html().isEmpty())) formatetcs += setCf(CF_HTML); return formatetcs; } @@ -876,7 +876,7 @@ QString QWindowsMimeHtml::mimeForFormat(const FORMATETC &formatetc) const bool QWindowsMimeHtml::canConvertToMime(const QString &mimeType, IDataObject *pDataObj) const { - return mimeType == QStringLiteral("text/html") && canGetData(CF_HTML, pDataObj); + return mimeType == QLatin1String("text/html") && canGetData(CF_HTML, pDataObj); } @@ -998,7 +998,7 @@ QWindowsMimeImage::QWindowsMimeImage() QVector<FORMATETC> QWindowsMimeImage::formatsForMime(const QString &mimeType, const QMimeData *mimeData) const { QVector<FORMATETC> formatetcs; - if (mimeData->hasImage() && mimeType == QStringLiteral("application/x-qt-image")) { + if (mimeData->hasImage() && mimeType == QLatin1String("application/x-qt-image")) { //add DIBV5 if image has alpha channel QImage image = qvariant_cast<QImage>(mimeData->imageData()); if (!image.isNull() && image.hasAlphaChannel()) @@ -1018,7 +1018,7 @@ QString QWindowsMimeImage::mimeForFormat(const FORMATETC &formatetc) const bool QWindowsMimeImage::canConvertToMime(const QString &mimeType, IDataObject *pDataObj) const { - if ((mimeType == QStringLiteral("application/x-qt-image")) && + if (mimeType == QLatin1String("application/x-qt-image") && (canGetData(CF_DIB, pDataObj) || canGetData(CF_PNG, pDataObj))) return true; return false; @@ -1158,7 +1158,7 @@ bool QBuiltInMimes::convertFromMime(const FORMATETC &formatetc, const QMimeData { if (canConvertFromMime(formatetc, mimeData)) { QByteArray data; - if (outFormats.value(getCf(formatetc)) == QStringLiteral("text/html")) { + if (outFormats.value(getCf(formatetc)) == QLatin1String("text/html")) { // text/html is in wide chars on windows (compatible with mozillia) QString html = mimeData->html(); // same code as in the text converter up above @@ -1224,7 +1224,7 @@ QVariant QBuiltInMimes::convertToMime(const QString &mimeType, IDataObject *pDat #ifdef QMIME_DEBUG qDebug("QBuiltInMimes::convertToMime()"); #endif - if (mimeType == QStringLiteral("text/html") && preferredType == QVariant::String) { + if (mimeType == QLatin1String("text/html") && preferredType == QVariant::String) { // text/html is in wide chars on windows (compatible with Mozilla) val = QString::fromWCharArray((const wchar_t *)data.data()); } else { diff --git a/src/plugins/platforms/windows/qwindowsscaling.cpp b/src/plugins/platforms/windows/qwindowsscaling.cpp index ae1a7d4ded..8f0dab82f6 100644 --- a/src/plugins/platforms/windows/qwindowsscaling.cpp +++ b/src/plugins/platforms/windows/qwindowsscaling.cpp @@ -58,7 +58,7 @@ int QWindowsScaling::determineUiScaleFactor() return 1; const QByteArray envDevicePixelRatioEnv = qgetenv(devicePixelRatioEnvVar); // Auto: Suggest a scale factor by checking monitor resolution. - if (envDevicePixelRatioEnv == QByteArrayLiteral("auto")) { + if (envDevicePixelRatioEnv == "auto") { const int maxResolution = QWindowsScreen::maxMonitorHorizResolution(); return maxResolution > 180 ? maxResolution / 96 : 1; } diff --git a/src/plugins/platforms/windows/qwindowsservices.cpp b/src/plugins/platforms/windows/qwindowsservices.cpp index 7d859ca57a..8a55ab85d3 100644 --- a/src/plugins/platforms/windows/qwindowsservices.cpp +++ b/src/plugins/platforms/windows/qwindowsservices.cpp @@ -146,7 +146,7 @@ static inline bool launchMail(const QUrl &url) bool QWindowsServices::openUrl(const QUrl &url) { const QString scheme = url.scheme(); - if (scheme == QStringLiteral("mailto") && launchMail(url)) + if (scheme == QLatin1String("mailto") && launchMail(url)) return true; return shellExecute(url); } diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 15c199f6dc..dd9b9de0b6 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1826,7 +1826,7 @@ static HRGN qRegionToWinRegion(const QRegion ®ionDip) const int rectCount = rects.size(); if (rectCount == 1) return createRectRegion(QWindowsScaling::mapToNative(regionDip.boundingRect())); - HRGN hRegion = createRectRegion(rects.front()); + HRGN hRegion = createRectRegion(QWindowsScaling::mapToNative(rects.front())); for (int i = 1; i < rectCount; ++i) addRectToWinRegion(QWindowsScaling::mapToNative(rects.at(i)), &hRegion); return hRegion; diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp index 5bdbdfb25b..3933902ae3 100644 --- a/src/plugins/platforms/winrt/qwinrtscreen.cpp +++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp @@ -501,6 +501,8 @@ QWinRTScreen::QWinRTScreen() d->surfaceFormat.setRedBufferSize(8); d->surfaceFormat.setGreenBufferSize(8); d->surfaceFormat.setBlueBufferSize(8); + d->surfaceFormat.setDepthBufferSize(24); + d->surfaceFormat.setStencilBufferSize(8); d->surfaceFormat.setRenderableType(QSurfaceFormat::OpenGLES); d->surfaceFormat.setSamples(1); d->surfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer); diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp index d1e3ae6a88..45856f3e6c 100644 --- a/src/plugins/platforms/xcb/qxcbclipboard.cpp +++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp @@ -731,6 +731,9 @@ void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_event_t *event) { QClipboard::Mode mode = modeForAtom(event->selection); + if (mode > QClipboard::Selection) + return; + // here we care only about the xfixes events that come from non Qt processes if (event->owner != XCB_NONE && event->owner != owner()) { if (!m_xClipboard[mode]) { diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp index 84e46a7339..90d323ed34 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp @@ -361,8 +361,10 @@ XInput2TouchDeviceData *QXcbConnection::touchDeviceForId(int id) QTouchDevice::Capabilities caps = 0; dev = new XInput2TouchDeviceData; dev->xiDeviceInfo = XIQueryDevice(static_cast<Display *>(m_xlib_display), id, &nrDevices); - if (nrDevices <= 0) + if (nrDevices <= 0) { + delete dev; return 0; + } int type = -1; int maxTouchPoints = 1; bool hasRelativeCoords = false; diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index 90479f39eb..7e70e7258d 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -848,8 +848,10 @@ QList<int> QXcbKeyboard::possibleKeys(const QKeyEvent *event) const baseLayout, latchedLayout, lockedLayout); xkb_keysym_t sym = xkb_state_key_get_one_sym(kb_state, event->nativeScanCode()); - if (sym == XKB_KEY_NoSymbol) + if (sym == XKB_KEY_NoSymbol) { + xkb_state_unref(kb_state); return QList<int>(); + } QList<int> result; int baseQtKey = keysymToQtKey(sym, modifiers, lookupString(kb_state, event->nativeScanCode())); diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 121e979765..c4cf3b4416 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -2106,13 +2106,17 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev newState = Qt::WindowMinimized; } free(reply); + } else { // _NET_WM_STATE can't change minimized state + if (m_lastWindowStateEvent == Qt::WindowMinimized) + newState = Qt::WindowMinimized; } + if (newState != Qt::WindowMinimized) { // Something else changed, get _NET_WM_STATE. const NetWmStates states = netWmStates(); - if ((states & NetWmStateMaximizedHorz) && (states & NetWmStateMaximizedVert)) - newState = Qt::WindowMaximized; - else if (states & NetWmStateFullScreen) + if (states & NetWmStateFullScreen) newState = Qt::WindowFullScreen; + else if ((states & NetWmStateMaximizedHorz) && (states & NetWmStateMaximizedVert)) + newState = Qt::WindowMaximized; } // Send Window state, compress events in case other flags (modality, etc) are changed. if (m_lastWindowStateEvent != newState) { diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp index 76221875b6..c5f8338dab 100644 --- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp +++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp @@ -124,6 +124,7 @@ bool QGtk2Dialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWind } gtk_widget_show(gtkWidget); + gdk_window_focus(gtkWidget->window, 0); return true; } diff --git a/src/plugins/printsupport/cups/main.cpp b/src/plugins/printsupport/cups/main.cpp index 5391b4dbeb..5a7b9d7440 100644 --- a/src/plugins/printsupport/cups/main.cpp +++ b/src/plugins/printsupport/cups/main.cpp @@ -58,7 +58,7 @@ QStringList QCupsPrinterSupportPlugin::keys() const QPlatformPrinterSupport *QCupsPrinterSupportPlugin::create(const QString &key) { - if (key.compare(key, QStringLiteral("cupsprintersupport"), Qt::CaseInsensitive) == 0) + if (key.compare(key, QLatin1String("cupsprintersupport"), Qt::CaseInsensitive) == 0) return new QCupsPrinterSupport; return 0; } diff --git a/src/plugins/printsupport/windows/main.cpp b/src/plugins/printsupport/windows/main.cpp index 2f083ae668..149fe7d138 100644 --- a/src/plugins/printsupport/windows/main.cpp +++ b/src/plugins/printsupport/windows/main.cpp @@ -50,7 +50,7 @@ public: QPlatformPrinterSupport *QWindowsPrinterSupportPlugin::create(const QString &key) { - if (key.compare(key, QStringLiteral("windowsprintsupport"), Qt::CaseInsensitive) == 0) + if (key.compare(key, QLatin1String("windowsprintsupport"), Qt::CaseInsensitive) == 0) return new QWindowsPrinterSupport; return 0; } |