summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp4
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp7
-rw-r--r--src/plugins/platforms/android/androidjnimain.h2
-rw-r--r--src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp128
-rw-r--r--src/plugins/platforms/android/qandroidassetsfileenginehandler.h3
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.cpp13
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglwindow.cpp2
-rw-r--r--src/plugins/platforms/android/qandroidplatformrasterwindow.cpp5
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.cpp59
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm3
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.h26
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.mm199
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm13
-rw-r--r--src/plugins/platforms/cocoa/qmacmime.mm2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm17
-rw-r--r--src/plugins/platforms/cocoa/qpaintengine_mac.mm6
-rwxr-xr-x[-rw-r--r--]src/plugins/platforms/eglfs/cursor-atlas.pngbin2735 -> 2928 bytes
-rw-r--r--src/plugins/platforms/eglfs/cursor.json42
-rw-r--r--src/plugins/platforms/qnx/qqnxwindow.cpp6
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.cpp18
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.h1
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp10
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.h2
-rw-r--r--src/plugins/platforms/windows/qwindowsdialoghelpers.cpp16
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsfontengine.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp13
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.cpp16
-rw-r--r--src/plugins/platforms/windows/qwindowstabletsupport.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowstabletsupport.h4
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp35
-rw-r--r--src/plugins/platforms/winrt/qwinrtbackingstore.cpp30
-rw-r--r--src/plugins/platforms/winrt/winrt.pro2
-rw-r--r--src/plugins/platforms/xcb/qglxintegration.cpp22
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp13
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp1
-rw-r--r--src/plugins/printsupport/windows/qwindowsprintersupport.cpp4
43 files changed, 405 insertions, 340 deletions
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
index aee56eb034..797c30c7c6 100644
--- a/src/plugins/bearer/connman/qconnmanengine.cpp
+++ b/src/plugins/bearer/connman/qconnmanengine.cpp
@@ -98,8 +98,8 @@ void QConnmanEngine::initialize()
ofonoContextManager = new QOfonoDataConnectionManagerInterface(ofonoManager->currentModem(),this);
connect(ofonoContextManager,SIGNAL(roamingAllowedChanged(bool)),this,SLOT(reEvaluateCellular()));
- connect(connmanManager,SIGNAL(servicesChanged(ConnmanMapList, QList<QDBusObjectPath>)),
- this, SLOT(updateServices(ConnmanMapList, QList<QDBusObjectPath>)));
+ connect(connmanManager,SIGNAL(servicesChanged(ConnmanMapList,QList<QDBusObjectPath>)),
+ this, SLOT(updateServices(ConnmanMapList,QList<QDBusObjectPath>)));
connect(connmanManager,SIGNAL(servicesReady(QStringList)),this,SLOT(servicesReady(QStringList)));
connect(connmanManager,SIGNAL(scanFinished()),this,SLOT(finishedScan()));
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index 28a5da4b5d..784cc2e38b 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -334,7 +334,7 @@ namespace QtAndroid
return manufacturer + QStringLiteral(" ") + model;
}
- int createSurface(AndroidSurfaceClient *client, const QRect &geometry, bool onTop)
+ int createSurface(AndroidSurfaceClient *client, const QRect &geometry, bool onTop, int imageDepth)
{
QJNIEnvironmentPrivate env;
if (!env)
@@ -356,7 +356,8 @@ namespace QtAndroid
m_createSurfaceMethodID,
surfaceId,
jboolean(onTop),
- x, y, w, h);
+ x, y, w, h,
+ imageDepth);
return surfaceId;
}
@@ -689,7 +690,7 @@ static int registerNatives(JNIEnv *env)
return JNI_FALSE;
}
- GET_AND_CHECK_STATIC_METHOD(m_createSurfaceMethodID, m_applicationClass, "createSurface", "(IZIIII)V");
+ GET_AND_CHECK_STATIC_METHOD(m_createSurfaceMethodID, m_applicationClass, "createSurface", "(IZIIIII)V");
GET_AND_CHECK_STATIC_METHOD(m_insertNativeViewMethodID, m_applicationClass, "insertNativeView", "(ILandroid/view/View;IIII)V");
GET_AND_CHECK_STATIC_METHOD(m_setSurfaceGeometryMethodID, m_applicationClass, "setSurfaceGeometry", "(IIIII)V");
GET_AND_CHECK_STATIC_METHOD(m_destroySurfaceMethodID, m_applicationClass, "destroySurface", "(I)V");
diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h
index eb604c8da8..c00b23fff3 100644
--- a/src/plugins/platforms/android/androidjnimain.h
+++ b/src/plugins/platforms/android/androidjnimain.h
@@ -66,7 +66,7 @@ namespace QtAndroid
void setQtThread(QThread *thread);
- int createSurface(AndroidSurfaceClient * client, const QRect &geometry, bool onTop);
+ int createSurface(AndroidSurfaceClient * client, const QRect &geometry, bool onTop, int imageDepth);
int insertNativeView(jobject view, const QRect &geometry);
void setSurfaceGeometry(int surfaceId, const QRect &geometry);
void destroySurface(int surfaceId);
diff --git a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp
index 5f77d1645a..b112e265a5 100644
--- a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp
+++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp
@@ -51,10 +51,12 @@ struct AndroidAssetDir
{
AndroidAssetDir(AAssetDir* ad)
{
- const char *fileName;
- while ((fileName = AAssetDir_getNextFileName(ad)))
- m_items.push_back(QString::fromUtf8(fileName));
- AAssetDir_close(ad);
+ if (ad) {
+ const char *fileName;
+ while ((fileName = AAssetDir_getNextFileName(ad)))
+ m_items.push_back(QString::fromUtf8(fileName));
+ AAssetDir_close(ad);
+ }
}
FilesList m_items;
};
@@ -82,7 +84,10 @@ public:
{
if (m_index < 0 || m_index >= m_items.size())
return QString();
- return m_items[m_index];
+ QString fileName = m_items[m_index];
+ if (fileName.endsWith(QLatin1Char('/')))
+ fileName.chop(1);
+ return fileName;
}
virtual QString currentFilePath() const
@@ -254,33 +259,106 @@ private:
};
-AndroidAssetsFileEngineHandler::AndroidAssetsFileEngineHandler():m_assetsCache(std::max(5, qgetenv("QT_ANDROID_MAX_ASSETS_CACHE_SIZE").toInt()))
+AndroidAssetsFileEngineHandler::AndroidAssetsFileEngineHandler()
+ : m_assetsCache(std::max(5, qgetenv("QT_ANDROID_MAX_ASSETS_CACHE_SIZE").toInt()))
+ , m_hasPrepopulatedCache(false)
{
m_assetManager = QtAndroid::assetManager();
+ prepopulateCache();
}
AndroidAssetsFileEngineHandler::~AndroidAssetsFileEngineHandler()
{
}
+void AndroidAssetsFileEngineHandler::prepopulateCache()
+{
+ QMutexLocker locker(&m_assetsCacheMutext);
+ Q_ASSERT(m_assetsCache.isEmpty());
+
+ // Failsafe: Don't read cache files that are larger than 1MB
+ static qint64 maxPrepopulatedCacheSize = qMax(1024LL * 1024LL,
+ qgetenv("QT_ANDROID_MAX_PREPOPULATED_ASSETS_CACHE_SIZE").toLongLong());
+
+ const char *fileName = "--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list";
+ AAsset *asset = AAssetManager_open(m_assetManager, fileName, AASSET_MODE_BUFFER);
+ if (asset) {
+ m_hasPrepopulatedCache = true;
+ AndroidAbstractFileEngine fileEngine(asset, QString::fromLatin1(fileName));
+ if (fileEngine.open(QIODevice::ReadOnly)) {
+ qint64 size = fileEngine.size();
+
+ if (size <= maxPrepopulatedCacheSize) {
+ QByteArray bytes(size, Qt::Uninitialized);
+ qint64 read = fileEngine.read(bytes.data(), size);
+ if (read != size) {
+ qWarning("Failed to read prepopulated cache");
+ return;
+ }
+
+ QDataStream stream(&bytes, QIODevice::ReadOnly);
+ stream.setVersion(QDataStream::Qt_5_3);
+ if (stream.status() != QDataStream::Ok) {
+ qWarning("Failed to read prepopulated cache");
+ return;
+ }
+
+ while (!stream.atEnd()) {
+ QString directoryName;
+ stream >> directoryName;
+
+ int fileCount;
+ stream >> fileCount;
+
+ QVector<QString> fileList;
+ fileList.reserve(fileCount);
+ while (fileCount--) {
+ QString fileName;
+ stream >> fileName;
+ fileList.append(fileName);
+ }
+
+ QSharedPointer<AndroidAssetDir> *aad = new QSharedPointer<AndroidAssetDir>(new AndroidAssetDir(0));
+ (*aad)->m_items = fileList;
+
+ // Cost = 0, because we should always cache everything if there's a prepopulated cache
+ QByteArray key = directoryName != QLatin1String("/")
+ ? QByteArray("assets:/") + directoryName.toUtf8()
+ : QByteArray("assets:");
+
+ bool ok = m_assetsCache.insert(key, aad, 0);
+ if (!ok)
+ qWarning("Failed to insert in cache: %s", qPrintable(directoryName));
+ }
+ } else {
+ qWarning("Prepopulated cache is too large to read.\n"
+ "Use environment variable QT_ANDROID_MAX_PREPOPULATED_ASSETS_CACHE_SIZE to adjust size.");
+ }
+ }
+ }
+}
+
QAbstractFileEngine * AndroidAssetsFileEngineHandler::create(const QString &fileName) const
{
if (fileName.isEmpty())
return 0;
- if (!fileName.startsWith(QLatin1String("assets:/")))
+ static QLatin1String assetsPrefix("assets:");
+ if (!fileName.startsWith(assetsPrefix))
return 0;
- int prefixSize=8;
+ static int prefixSize = assetsPrefix.size() + 1;
QByteArray path;
if (!fileName.endsWith(QLatin1Char('/'))) {
path = fileName.toUtf8();
- AAsset *asset = AAssetManager_open(m_assetManager,
- path.constData() + prefixSize,
- AASSET_MODE_BUFFER);
- if (asset)
- return new AndroidAbstractFileEngine(asset, fileName);
+ if (path.size() > prefixSize) {
+ AAsset *asset = AAssetManager_open(m_assetManager,
+ path.constData() + prefixSize,
+ AASSET_MODE_BUFFER);
+ if (asset)
+ return new AndroidAbstractFileEngine(asset, fileName);
+ }
}
if (!path.size())
@@ -290,17 +368,19 @@ QAbstractFileEngine * AndroidAssetsFileEngineHandler::create(const QString &file
QSharedPointer<AndroidAssetDir> *aad = m_assetsCache.object(path);
m_assetsCacheMutext.unlock();
if (!aad) {
- AAssetDir *assetDir = AAssetManager_openDir(m_assetManager, path.constData() + prefixSize);
- if (assetDir) {
- if (AAssetDir_getNextFileName(assetDir)) {
- AAssetDir_rewind(assetDir);
- aad = new QSharedPointer<AndroidAssetDir>(new AndroidAssetDir(assetDir));
- m_assetsCacheMutext.lock();
- m_assetsCache.insert(path, aad);
- m_assetsCacheMutext.unlock();
- return new AndroidAbstractFileEngine(*aad, fileName);
- } else {
- AAssetDir_close(assetDir);
+ if (!m_hasPrepopulatedCache && path.size() > prefixSize) {
+ AAssetDir *assetDir = AAssetManager_openDir(m_assetManager, path.constData() + prefixSize);
+ if (assetDir) {
+ if (AAssetDir_getNextFileName(assetDir)) {
+ AAssetDir_rewind(assetDir);
+ aad = new QSharedPointer<AndroidAssetDir>(new AndroidAssetDir(assetDir));
+ m_assetsCacheMutext.lock();
+ m_assetsCache.insert(path, aad);
+ m_assetsCacheMutext.unlock();
+ return new AndroidAbstractFileEngine(*aad, fileName);
+ } else {
+ AAssetDir_close(assetDir);
+ }
}
}
} else {
diff --git a/src/plugins/platforms/android/qandroidassetsfileenginehandler.h b/src/plugins/platforms/android/qandroidassetsfileenginehandler.h
index 7bd560886c..d56367d4d8 100644
--- a/src/plugins/platforms/android/qandroidassetsfileenginehandler.h
+++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.h
@@ -58,9 +58,12 @@ public:
QAbstractFileEngine *create(const QString &fileName) const;
private:
+ void prepopulateCache();
+
AAssetManager *m_assetManager;
mutable QCache<QByteArray, QSharedPointer<AndroidAssetDir>> m_assetsCache;
mutable QMutex m_assetsCacheMutext;
+ bool m_hasPrepopulatedCache;
};
#endif // QANDROIDASSETSFILEENGINEHANDLER_H
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp
index 5848e94aca..2cca974b41 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp
@@ -50,21 +50,20 @@
#include <qpa/qwindowsysteminterface.h>
#include <qpa/qplatformwindow.h>
-#warning sort the headers
#include "androidjnimain.h"
#include "qabstracteventdispatcher.h"
-#include "qandroidplatformrasterwindow.h"
-#include "qandroidplatformopenglwindow.h"
#include "qandroidplatformbackingstore.h"
-#include "qandroidplatformservices.h"
-#include "qandroidplatformfontdatabase.h"
-#include "qandroidplatformclipboard.h"
#include "qandroidplatformaccessibility.h"
+#include "qandroidplatformclipboard.h"
+#include "qandroidplatformforeignwindow.h"
+#include "qandroidplatformfontdatabase.h"
#include "qandroidplatformopenglcontext.h"
+#include "qandroidplatformopenglwindow.h"
+#include "qandroidplatformrasterwindow.h"
#include "qandroidplatformscreen.h"
+#include "qandroidplatformservices.h"
#include "qandroidplatformtheme.h"
#include "qandroidsystemlocale.h"
-#include "qandroidplatformforeignwindow.h"
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
index 9df6610a99..34db729289 100644
--- a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
@@ -57,7 +57,7 @@ QAndroidPlatformOpenGLWindow::QAndroidPlatformOpenGLWindow(QWindow *window, EGLD
:QAndroidPlatformWindow(window), m_eglDisplay(display)
{
lockSurface();
- m_nativeSurfaceId = QtAndroid::createSurface(this, geometry(), bool(window->flags() & Qt::WindowStaysOnTopHint));
+ m_nativeSurfaceId = QtAndroid::createSurface(this, geometry(), bool(window->flags() & Qt::WindowStaysOnTopHint), 32);
m_surfaceWaitCondition.wait(&m_surfaceMutex);
unlockSurface();
}
diff --git a/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp b/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
index 68545c6562..334b9cdd23 100644
--- a/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
@@ -54,6 +54,9 @@ QAndroidPlatformRasterWindow::QAndroidPlatformRasterWindow(QWindow *window)
void QAndroidPlatformRasterWindow::repaint(const QRegion &region)
{
+ if (QAndroidPlatformWindow::parent())
+ return;
+
QRect currentGeometry = geometry().translated(mapToGlobal(QPoint(0,0)));
QRect dirtyClient = region.boundingRect();
@@ -71,7 +74,7 @@ void QAndroidPlatformRasterWindow::repaint(const QRegion &region)
void QAndroidPlatformRasterWindow::setGeometry(const QRect &rect)
{
- m_oldGeometry = geometry();
+ m_oldGeometry = geometry().translated(mapToGlobal(QPoint(0,0)));;
QAndroidPlatformWindow::setGeometry(rect);
}
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp
index dd86a80d23..dbf317696f 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.cpp
+++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp
@@ -64,6 +64,7 @@ public:
ScopedProfiler(const QString &msg)
{
m_msg = msg;
+ m_timer.start();
}
~ScopedProfiler()
{
@@ -197,7 +198,7 @@ void QAndroidPlatformScreen::scheduleUpdate()
void QAndroidPlatformScreen::setDirty(const QRect &rect)
{
QRect intersection = rect.intersected(m_geometry);
- m_repaintRegion += intersection;
+ m_dirtyRect |= intersection;
scheduleUpdate();
}
@@ -241,14 +242,12 @@ void QAndroidPlatformScreen::doRedraw()
{
PROFILE_SCOPE;
- if (m_repaintRegion.isEmpty())
+ if (m_dirtyRect.isEmpty())
return;
- QVector<QRect> rects = m_repaintRegion.rects();
-
QMutexLocker lock(&m_surfaceMutex);
if (m_id == -1) {
- m_id = QtAndroid::createSurface(this, m_geometry, true);
+ m_id = QtAndroid::createSurface(this, m_geometry, true, m_depth);
m_surfaceWaitCondition.wait(&m_surfaceMutex);
}
@@ -257,11 +256,10 @@ void QAndroidPlatformScreen::doRedraw()
ANativeWindow_Buffer nativeWindowBuffer;
ARect nativeWindowRect;
- QRect br = m_repaintRegion.boundingRect();
- nativeWindowRect.top = br.top();
- nativeWindowRect.left = br.left();
- nativeWindowRect.bottom = br.bottom() + 1; // for some reason that I don't understand the QRect bottom needs to +1 to be the same with ARect bottom
- nativeWindowRect.right = br.right() + 1; // same for the right
+ nativeWindowRect.top = m_dirtyRect.top();
+ nativeWindowRect.left = m_dirtyRect.left();
+ nativeWindowRect.bottom = m_dirtyRect.bottom() + 1; // for some reason that I don't understand the QRect bottom needs to +1 to be the same with ARect bottom
+ nativeWindowRect.right = m_dirtyRect.right() + 1; // same for the right
int ret;
if ((ret = ANativeWindow_lock(m_nativeSurface, &nativeWindowBuffer, &nativeWindowRect)) < 0) {
@@ -283,36 +281,35 @@ void QAndroidPlatformScreen::doRedraw()
QPainter compositePainter(&screenImage);
compositePainter.setCompositionMode(QPainter::CompositionMode_Source);
- for (int rectIndex = 0; rectIndex < rects.size(); rectIndex++) {
- QRegion visibleRegion = rects[rectIndex];
- foreach (QAndroidPlatformWindow *window, m_windowStack) {
- if (!window->window()->isVisible()
- || !window->isRaster())
- continue;
+ QRegion visibleRegion(m_dirtyRect);
+ foreach (QAndroidPlatformWindow *window, m_windowStack) {
+ if (!window->window()->isVisible()
+ || !window->isRaster())
+ continue;
- foreach (const QRect &rect, visibleRegion.rects()) {
- QRect targetRect = window->geometry();
- targetRect &= rect;
+ QVector<QRect> visibleRects = visibleRegion.rects();
+ foreach (const QRect &rect, visibleRects) {
+ QRect targetRect = window->geometry();
+ targetRect &= rect;
- if (targetRect.isNull())
- continue;
+ if (targetRect.isNull())
+ continue;
- visibleRegion -= targetRect;
- QRect windowRect = targetRect.translated(-window->geometry().topLeft());
- QAndroidPlatformBackingStore *backingStore = static_cast<QAndroidPlatformRasterWindow *>(window)->backingStore();
- if (backingStore)
- compositePainter.drawImage(targetRect.topLeft(), backingStore->image(), windowRect);
- }
+ visibleRegion -= targetRect;
+ QRect windowRect = targetRect.translated(-window->geometry().topLeft());
+ QAndroidPlatformBackingStore *backingStore = static_cast<QAndroidPlatformRasterWindow *>(window)->backingStore();
+ if (backingStore)
+ compositePainter.drawImage(targetRect.topLeft(), backingStore->image(), windowRect);
}
+ }
- foreach (const QRect &rect, visibleRegion.rects()) {
- compositePainter.fillRect(rect, QColor(Qt::transparent));
- }
+ foreach (const QRect &rect, visibleRegion.rects()) {
+ compositePainter.fillRect(rect, QColor(Qt::transparent));
}
ret = ANativeWindow_unlockAndPost(m_nativeSurface);
if (ret >= 0)
- m_repaintRegion = QRegion();
+ m_dirtyRect = QRect();
}
QDpi QAndroidPlatformScreen::logicalDpi() const
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.h b/src/plugins/platforms/android/qandroidplatformscreen.h
index d3de937548..625e77840e 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.h
+++ b/src/plugins/platforms/android/qandroidplatformscreen.h
@@ -91,7 +91,7 @@ public slots:
protected:
typedef QList<QAndroidPlatformWindow *> WindowStackType;
WindowStackType m_windowStack;
- QRegion m_repaintRegion;
+ QRect m_dirtyRect;
QTimer m_redrawTimer;
QRect m_geometry;
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
index 30c15d823a..3ca611b537 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
@@ -122,7 +122,7 @@ bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy)
CGImageRef QCocoaBackingStore::getBackingStoreCGImage()
{
if (!m_cgImage)
- m_cgImage = qt_mac_toCGImage(m_qImage, false, 0);
+ m_cgImage = qt_mac_toCGImage(m_qImage);
// Warning: do not retain/release/cache the returned image from
// outside the backingstore since it shares data with a QImage and
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
index f401459cc3..8728ab8764 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
@@ -318,7 +318,7 @@ static QString strippedText(QString s)
}
}
- QString qtFileName = QCFString::toQString(filename);
+ QString qtFileName = QFileInfo(QCFString::toQString(filename)).fileName();
// No filter means accept everything
bool nameMatches = mSelectedNameFilter->isEmpty();
// Check if the current file name filter accepts the file:
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 6f76892d93..9b4d8fd96f 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -162,6 +162,9 @@ QCocoaGLContext::QCocoaGLContext(const QSurfaceFormat &format, QPlatformOpenGLCo
QCocoaGLContext::~QCocoaGLContext()
{
+ if (m_currentWindow && m_currentWindow.data()->handle())
+ static_cast<QCocoaWindow *>(m_currentWindow.data()->handle())->setCurrentContext(0);
+
[m_context release];
}
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h
index 419bf631aa..3b72184d83 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.h
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.h
@@ -68,10 +68,12 @@ void *qt_mac_QStringListToNSMutableArrayVoid(const QStringList &list);
inline NSMutableArray *qt_mac_QStringListToNSMutableArray(const QStringList &qstrlist)
{ return reinterpret_cast<NSMutableArray *>(qt_mac_QStringListToNSMutableArrayVoid(qstrlist)); }
-CGImageRef qt_mac_image_to_cgimage(const QImage &image);
NSImage *qt_mac_cgimage_to_nsimage(CGImageRef iamge);
NSImage *qt_mac_create_nsimage(const QPixmap &pm);
NSImage *qt_mac_create_nsimage(const QIcon &icon);
+CGImageRef qt_mac_toCGImage(const QImage &qImage);
+CGImageRef qt_mac_toCGImageMask(const QImage &qImage);
+QImage qt_mac_toQImage(CGImageRef image);
NSSize qt_mac_toNSSize(const QSize &qtSize);
NSRect qt_mac_toNSRect(const QRect &rect);
@@ -101,23 +103,13 @@ CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget);
CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice);
QString qt_mac_applicationName();
-inline int qt_mac_flipYCoordinate(int y)
-{ return QGuiApplication::primaryScreen()->geometry().height() - y; }
-
-inline qreal qt_mac_flipYCoordinate(qreal y)
-{ return QGuiApplication::primaryScreen()->geometry().height() - y; }
-
-inline QPointF qt_mac_flipPoint(const NSPoint &p)
-{ return QPointF(p.x, qt_mac_flipYCoordinate(p.y)); }
-
-inline NSPoint qt_mac_flipPoint(const QPoint &p)
-{ return NSMakePoint(p.x(), qt_mac_flipYCoordinate(p.y())); }
-
-inline NSPoint qt_mac_flipPoint(const QPointF &p)
-{ return NSMakePoint(p.x(), qt_mac_flipYCoordinate(p.y())); }
+int qt_mac_flipYCoordinate(int y);
+qreal qt_mac_flipYCoordinate(qreal y);
+QPointF qt_mac_flipPoint(const NSPoint &p);
+NSPoint qt_mac_flipPoint(const QPoint &p);
+NSPoint qt_mac_flipPoint(const QPointF &p);
NSRect qt_mac_flipRect(const QRect &rect);
-NSRect qt_mac_flipRect(const QRect &rect, QWindow *window);
Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum);
@@ -159,8 +151,6 @@ public:
};
CGContextRef qt_mac_cg_context(QPaintDevice *pdev);
-CGImageRef qt_mac_toCGImage(const QImage &qImage, bool isMask, uchar **dataCopy);
-QImage qt_mac_toQImage(CGImageRef image);
template<typename T>
T qt_mac_resolveOption(const T &fallback, const QByteArray &environment)
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm
index d27c134fa3..8975605e5c 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.mm
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm
@@ -79,24 +79,28 @@ void *qt_mac_QStringListToNSMutableArrayVoid(const QStringList &list)
return result;
}
-static void drawImageReleaseData (void *info, const void *, size_t)
+static void qt_mac_deleteImage(void *image, const void *, size_t)
{
- delete static_cast<QImage *>(info);
+ delete static_cast<QImage *>(image);
}
-CGImageRef qt_mac_image_to_cgimage(const QImage &img)
+// Creates a CGDataProvider with the data from the given image.
+// The data provider retains a copy of the image.
+CGDataProviderRef qt_mac_CGDataProvider(const QImage &image)
{
- if (img.isNull())
+ return CGDataProviderCreateWithData(new QImage(image), image.bits(),
+ image.byteCount(), qt_mac_deleteImage);
+}
+
+CGImageRef qt_mac_toCGImage(const QImage &inImage)
+{
+ if (inImage.isNull())
return 0;
- QImage *image;
- if (img.depth() != 32)
- image = new QImage(img.convertToFormat(QImage::Format_ARGB32_Premultiplied));
- else
- image = new QImage(img);
+ QImage image = (inImage.depth() == 32) ? inImage : inImage.convertToFormat(QImage::Format_ARGB32_Premultiplied);
uint cgflags = kCGImageAlphaNone;
- switch (image->format()) {
+ switch (image.format()) {
case QImage::Format_ARGB32_Premultiplied:
cgflags = kCGImageAlphaPremultipliedFirst;
break;
@@ -105,20 +109,26 @@ CGImageRef qt_mac_image_to_cgimage(const QImage &img)
break;
case QImage::Format_RGB32:
cgflags = kCGImageAlphaNoneSkipFirst;
+ break;
+ case QImage::Format_RGB888:
+ cgflags |= kCGImageAlphaNone;
+ break;
default:
break;
}
cgflags |= kCGBitmapByteOrder32Host;
- QCFType<CGDataProviderRef> dataProvider = CGDataProviderCreateWithData(image,
- static_cast<const QImage *>(image)->bits(),
- image->byteCount(),
- drawImageReleaseData);
-
- return CGImageCreate(image->width(), image->height(), 8, 32,
- image->bytesPerLine(),
- qt_mac_genericColorSpace(),
- cgflags, dataProvider, 0, false, kCGRenderingIntentDefault);
+ QCFType<CGDataProviderRef> dataProvider = qt_mac_CGDataProvider(image);
+ return CGImageCreate(image.width(), image.height(), 8, 32,
+ image.bytesPerLine(),
+ qt_mac_genericColorSpace(),
+ cgflags, dataProvider, 0, false, kCGRenderingIntentDefault);
+}
+CGImageRef qt_mac_toCGImageMask(const QImage &image)
+{
+ QCFType<CGDataProviderRef> dataProvider = qt_mac_CGDataProvider(image);
+ return CGImageMaskCreate(image.width(), image.height(), 8, image.depth(),
+ image.bytesPerLine(), dataProvider, NULL, false);
}
NSImage *qt_mac_cgimage_to_nsimage(CGImageRef image)
@@ -132,7 +142,7 @@ NSImage *qt_mac_create_nsimage(const QPixmap &pm)
if (pm.isNull())
return 0;
QImage image = pm.toImage();
- CGImageRef cgImage = qt_mac_image_to_cgimage(image);
+ CGImageRef cgImage = qt_mac_toCGImage(image);
NSImage *nsImage = qt_mac_cgimage_to_nsimage(cgImage);
CGImageRelease(cgImage);
return nsImage;
@@ -147,7 +157,7 @@ NSImage *qt_mac_create_nsimage(const QIcon &icon)
foreach (QSize size, icon.availableSizes()) {
QPixmap pm = icon.pixmap(size);
QImage image = pm.toImage();
- CGImageRef cgImage = qt_mac_image_to_cgimage(image);
+ CGImageRef cgImage = qt_mac_toCGImage(image);
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage];
[nsImage addRepresentation:imageRep];
[imageRep release];
@@ -585,44 +595,42 @@ QString qt_mac_applicationName()
return appName;
}
-NSRect qt_mac_flipRect(const QRect &rect)
+int qt_mac_mainScreenHeight()
{
- int flippedY = qt_mac_flipYCoordinate(rect.y() + rect.height());
- return NSMakeRect(rect.x(), flippedY, rect.width(), rect.height());
+ // The first screen in the screens array is documented
+ // to have the (0,0) origin.
+ NSRect screenFrame = [[[NSScreen screens] firstObject] frame];
+ return screenFrame.size.height;
}
-/*
- Mac window coordinates are in the first quadrant: 0, 0 is at the lower-left
- corner of the primary screen. This function converts the given rect to an
- NSRect for the window geometry, flipping from 4th quadrant to 1st quadrant
- and simultaneously ensuring that as much of the window as possible will be
- onscreen. If the rect is too tall for the screen, the OS will reduce the
- window's height anyway; but by moving the window upwards we can have more
- of it onscreen. But the application can still control the y coordinate
- in case it really wants the window to be positioned partially offscreen.
-*/
-NSRect qt_mac_flipRect(const QRect &rect, QWindow *window)
-{
- QPlatformScreen *onScreen = QPlatformScreen::platformScreenForWindow(window);
- int flippedY = onScreen->geometry().height() - (rect.y() + rect.height());
- QList<QScreen *> screens = QGuiApplication::screens();
- if (screens.size() > 1) {
- int height = 0;
- foreach (QScreen *scr, screens)
- height = qMax(height, scr->size().height());
- int difference = height - onScreen->geometry().height();
- if (difference > 0)
- flippedY += difference;
- else
- flippedY -= difference;
- }
- // In case of automatic positioning, try to put as much of the window onscreen as possible.
- if (window->isTopLevel() && qt_window_private(const_cast<QWindow*>(window))->positionAutomatic && flippedY < 0)
- flippedY = onScreen->geometry().height() - onScreen->availableGeometry().height() - onScreen->availableGeometry().y();
-#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
- qDebug() << Q_FUNC_INFO << rect << "flippedY" << flippedY <<
- "screen" << onScreen->geometry() << "available" << onScreen->availableGeometry();
-#endif
+int qt_mac_flipYCoordinate(int y)
+{
+ return qt_mac_mainScreenHeight() - y;
+}
+
+qreal qt_mac_flipYCoordinate(qreal y)
+{
+ return qt_mac_mainScreenHeight() - y;
+}
+
+QPointF qt_mac_flipPoint(const NSPoint &p)
+{
+ return QPointF(p.x, qt_mac_flipYCoordinate(p.y));
+}
+
+NSPoint qt_mac_flipPoint(const QPoint &p)
+{
+ return NSMakePoint(p.x(), qt_mac_flipYCoordinate(p.y()));
+}
+
+NSPoint qt_mac_flipPoint(const QPointF &p)
+{
+ return NSMakePoint(p.x(), qt_mac_flipYCoordinate(p.y()));
+}
+
+NSRect qt_mac_flipRect(const QRect &rect)
+{
+ int flippedY = qt_mac_flipYCoordinate(rect.y() + rect.height());
return NSMakeRect(rect.x(), flippedY, rect.width(), rect.height());
}
@@ -780,85 +788,6 @@ CGContextRef qt_mac_cg_context(QPaintDevice *pdev)
return ret;
}
-// qpaintengine_mac.mm
-extern void qt_mac_cgimage_data_free(void *, const void *memoryToFree, size_t);
-
-CGImageRef qt_mac_toCGImage(const QImage &qImage, bool isMask, uchar **dataCopy)
-{
- int width = qImage.width();
- int height = qImage.height();
-
- if (width <= 0 || height <= 0) {
- qWarning() << Q_FUNC_INFO <<
- "setting invalid size" << width << "x" << height << "for qnsview image";
- return 0;
- }
-
- const uchar *imageData = qImage.bits();
- if (dataCopy) {
- *dataCopy = static_cast<uchar *>(malloc(qImage.byteCount()));
- memcpy(*dataCopy, imageData, qImage.byteCount());
- }
- int bitDepth = qImage.depth();
- int colorBufferSize = 8;
- int bytesPrLine = qImage.bytesPerLine();
-
- CGDataProviderRef cgDataProviderRef = CGDataProviderCreateWithData(
- NULL,
- dataCopy ? *dataCopy : imageData,
- qImage.byteCount(),
- dataCopy ? qt_mac_cgimage_data_free : NULL);
-
- CGImageRef cgImage = 0;
- if (isMask) {
- cgImage = CGImageMaskCreate(width,
- height,
- colorBufferSize,
- bitDepth,
- bytesPrLine,
- cgDataProviderRef,
- NULL,
- false);
- } else {
- CGColorSpaceRef cgColourSpaceRef = qt_mac_displayColorSpace(0);
-
- // Create a CGBitmapInfo contiaining the image format.
- // Support the 8-bit per component (A)RGB formats.
- CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;
- switch (qImage.format()) {
- case QImage::Format_ARGB32_Premultiplied :
- bitmapInfo |= kCGImageAlphaPremultipliedFirst;
- break;
- case QImage::Format_ARGB32 :
- bitmapInfo |= kCGImageAlphaFirst;
- break;
- case QImage::Format_RGB32 :
- bitmapInfo |= kCGImageAlphaNoneSkipFirst;
- break;
- case QImage::Format_RGB888 :
- bitmapInfo |= kCGImageAlphaNone;
- break;
- default:
- qWarning() << "qt_mac_toCGImage: Unsupported image format" << qImage.format();
- break;
- }
-
- cgImage = CGImageCreate(width,
- height,
- colorBufferSize,
- bitDepth,
- bytesPrLine,
- cgColourSpaceRef,
- bitmapInfo,
- cgDataProviderRef,
- NULL,
- false,
- kCGRenderingIntentDefault);
- }
- CGDataProviderRelease(cgDataProviderRef);
- return cgImage;
-}
-
QImage qt_mac_toQImage(CGImageRef image)
{
const size_t w = CGImageGetWidth(image),
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index 0c1ddf9ad8..dff7c9bd50 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -487,6 +487,7 @@ void QCocoaIntegration::clearToolbars()
QHash<QWindow *, NSToolbar *>::const_iterator it = mToolbars.constBegin();
while (it != mToolbars.constEnd()) {
[it.value() release];
+ ++it;
}
mToolbars.clear();
}
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
index 85ce96a8b6..f4776342de 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
@@ -248,7 +248,7 @@ void *QCocoaNativeInterface::qMenuBarToNSMenu(QPlatformMenuBar *platformMenuBar)
CGImageRef QCocoaNativeInterface::qImageToCGImage(const QImage &image)
{
- return qt_mac_toCGImage(image, false, 0);
+ return qt_mac_toCGImage(image);
}
QImage QCocoaNativeInterface::cgImageToQImage(CGImageRef image)
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index d972782f31..bf41270d12 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -392,12 +392,15 @@ void QCocoaWindow::setCocoaGeometry(const QRect &rect)
QWindowSystemInterface::handleGeometryChange(window(), rect);
QWindowSystemInterface::handleExposeEvent(window(), rect);
} else if (m_nsWindow) {
- NSRect bounds = qt_mac_flipRect(rect, window());
+ NSRect bounds = qt_mac_flipRect(rect);
[m_nsWindow setFrame:[m_nsWindow frameRectForContentRect:bounds] display:YES animate:NO];
} else {
[m_contentView setFrame : NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height())];
}
+ if (!m_qtView)
+ QPlatformWindow::setGeometry(rect);
+
// will call QPlatformWindow::setGeometry(rect) during resize confirmation (see qnsview.mm)
}
@@ -415,7 +418,7 @@ void QCocoaWindow::clipWindow(const NSRect &clipRect)
NSRect clippedWindowRect = NSZeroRect;
if (!NSIsEmptyRect(clipRect)) {
- NSRect windowFrame = qt_mac_flipRect(QRect(window()->mapToGlobal(QPoint(0, 0)), geometry().size()), window());
+ NSRect windowFrame = qt_mac_flipRect(QRect(window()->mapToGlobal(QPoint(0, 0)), geometry().size()));
clippedWindowRect = NSIntersectionRect(windowFrame, clipRect);
// Clipping top/left offsets the content. Move it back.
NSPoint contentViewOffset = NSMakePoint(qMax(CGFloat(0), NSMinX(clippedWindowRect) - NSMinX(windowFrame)),
@@ -1153,6 +1156,10 @@ void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow)
// Child windows have no NSWindow, link the NSViews instead.
[m_parentCocoaWindow->m_contentView addSubview : m_contentView];
QRect rect = window()->geometry();
+ // Prevent setting a (0,0) window size; causes opengl context
+ // "Invalid Drawable" warnings.
+ if (rect.isNull())
+ rect.setSize(QSize(1, 1));
NSRect frame = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height());
[m_contentView setFrame:frame];
[m_contentView setHidden: YES];
@@ -1201,7 +1208,7 @@ NSWindow * QCocoaWindow::createNSWindow()
QCocoaAutoReleasePool pool;
QRect rect = initialGeometry(window(), window()->geometry(), defaultWindowWidth, defaultWindowHeight);
- NSRect frame = qt_mac_flipRect(rect, window());
+ NSRect frame = qt_mac_flipRect(rect);
Qt::WindowType type = window()->type();
Qt::WindowFlags flags = window()->flags();
diff --git a/src/plugins/platforms/cocoa/qmacmime.mm b/src/plugins/platforms/cocoa/qmacmime.mm
index 89d1b5f681..4274e178f7 100644
--- a/src/plugins/platforms/cocoa/qmacmime.mm
+++ b/src/plugins/platforms/cocoa/qmacmime.mm
@@ -565,7 +565,7 @@ QList<QByteArray> QMacPasteboardMimeTiff::convertFromMime(const QString &mime, Q
return ret;
QImage img = qvariant_cast<QImage>(variant);
- QCFType<CGImageRef> cgimage = qt_mac_image_to_cgimage(img);
+ QCFType<CGImageRef> cgimage = qt_mac_toCGImage(img);
QCFType<CFMutableDataRef> data = CFDataCreateMutable(0, 0);
QCFType<CGImageDestinationRef> imageDestination = CGImageDestinationCreateWithData(data, kUTTypeTIFF, 1, 0);
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 58c732de98..fcca96a8a8 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -80,7 +80,6 @@ static QTouchDevice *touchDevice = 0;
if (self) {
m_backingStore = 0;
m_maskImage = 0;
- m_maskData = 0;
m_shouldInvalidateWindowShadow = false;
m_window = 0;
m_buttons = Qt::NoButton;
@@ -106,7 +105,6 @@ static QTouchDevice *touchDevice = 0;
{
CGImageRelease(m_maskImage);
m_maskImage = 0;
- m_maskData = 0;
m_window = 0;
m_subscribesForGlobalFrameNotifications = false;
[m_inputSource release];
@@ -372,7 +370,7 @@ static QTouchDevice *touchDevice = 0;
- (BOOL) hasMask
{
- return m_maskData != 0;
+ return m_maskImage != 0;
}
- (BOOL) isOpaque
@@ -405,7 +403,7 @@ static QTouchDevice *touchDevice = 0;
dst[x] = src[x] & 0xff;
}
}
- m_maskImage = qt_mac_toCGImage(maskImage, true, &m_maskData);
+ m_maskImage = qt_mac_toCGImageMask(maskImage);
}
- (void)invalidateWindowShadowIfNeeded
@@ -861,14 +859,9 @@ Q_GLOBAL_STATIC(QCocoaTabletDeviceDataHash, tabletDeviceDataHash)
uint deviceId = [theEvent deviceID];
if (!tabletDeviceDataHash->contains(deviceId)) {
- // 10.6 sends tablet events for trackpad interaction, but
- // not proximity events. Silence the warning to prevent
- // flooding the console.
- if (QSysInfo::QSysInfo::MacintoshVersion == QSysInfo::MV_10_6)
- return;
-
- qWarning("QNSView handleTabletEvent: This tablet device is unknown"
- " (received no proximity event for it). Discarding event.");
+ // Error: Unknown tablet device. Qt also gets into this state
+ // when running on a VM. This appears to be harmless; don't
+ // print a warning.
return;
}
const QCocoaTabletDeviceData &deviceData = tabletDeviceDataHash->value(deviceId);
diff --git a/src/plugins/platforms/cocoa/qpaintengine_mac.mm b/src/plugins/platforms/cocoa/qpaintengine_mac.mm
index 40d60a6a0a..61fbe3a61f 100644
--- a/src/plugins/platforms/cocoa/qpaintengine_mac.mm
+++ b/src/plugins/platforms/cocoa/qpaintengine_mac.mm
@@ -488,7 +488,7 @@ static void qt_mac_draw_pattern(void *info, CGContextRef c)
if (isBitmap)
pat->image = qt_mac_create_imagemask(pat->data.pixmap, pat->data.pixmap.rect());
else
- pat->image = qt_mac_image_to_cgimage(pat->data.pixmap.toImage());
+ pat->image = qt_mac_toCGImage(pat->data.pixmap.toImage());
}
} else {
w = CGImageGetWidth(pat->image);
@@ -963,11 +963,11 @@ void QCoreGraphicsPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, co
CGContextSetFillColorWithColor(d->hd, cgColorForQColor(col, d->pdev));
image = qt_mac_create_imagemask(pm, sr);
} else if (differentSize) {
- QCFType<CGImageRef> img = qt_mac_image_to_cgimage(pm.toImage());
+ QCFType<CGImageRef> img = qt_mac_toCGImage(pm.toImage());
if (img)
image = CGImageCreateWithImageInRect(img, CGRectMake(qRound(sr.x()), qRound(sr.y()), qRound(sr.width()), qRound(sr.height())));
} else {
- image = qt_mac_image_to_cgimage(pm.toImage());
+ image = qt_mac_toCGImage(pm.toImage());
}
qt_mac_drawCGImage(d->hd, &rect, image);
if (doRestore)
diff --git a/src/plugins/platforms/eglfs/cursor-atlas.png b/src/plugins/platforms/eglfs/cursor-atlas.png
index 8d89a7ab86..4ddb7708e1 100644..100755
--- a/src/plugins/platforms/eglfs/cursor-atlas.png
+++ b/src/plugins/platforms/eglfs/cursor-atlas.png
Binary files differ
diff --git a/src/plugins/platforms/eglfs/cursor.json b/src/plugins/platforms/eglfs/cursor.json
index 7b6b6d95fa..307d5cf6cd 100644
--- a/src/plugins/platforms/eglfs/cursor.json
+++ b/src/plugins/platforms/eglfs/cursor.json
@@ -3,26 +3,26 @@
"cursorsPerRow": 8,
"hotSpots": [
[7, 2],
- [13, 3],
- [13, 13],
- [13, 13],
- [14, 15],
- [13, 13],
- [13, 13],
- [13, 13],
- [13, 13],
- [13, 13],
- [13, 13],
- [13, 13],
- [13, 13],
- [13, 13],
- [13, 13],
- [10, 1],
- [13, 13],
- [0, 0],
- [0, 0],
- [13, 13],
- [13, 13]
+ [12, 3],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [11, 11],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [9, 1],
+ [12, 12],
+ [1, 1],
+ [1, 1],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [12, 12],
+ [12, 12]
]
}
-
diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp
index e57025cbc6..f2b57aec9a 100644
--- a/src/plugins/platforms/qnx/qqnxwindow.cpp
+++ b/src/plugins/platforms/qnx/qqnxwindow.cpp
@@ -88,8 +88,10 @@ QQnxWindow::QQnxWindow(QWindow *window, screen_context_t context, bool needRootW
QQnxScreen *platformScreen = static_cast<QQnxScreen *>(window->screen()->handle());
- if (window->type() == Qt::CoverWindow) {
+ if (window->type() == Qt::CoverWindow || window->type() == Qt::Desktop) {
// Cover windows have to be top level to be accessible to window delegate (i.e. navigator)
+ // Desktop windows also need to be toplevel because they are not
+ // supposed to be part of the window hierarchy tree
m_isTopLevel = true;
} else if (parent() || (window->type() & Qt::Dialog) == Qt::Dialog) {
// If we have a parent we are a child window. Sometimes we have to be a child even if we
@@ -104,7 +106,7 @@ QQnxWindow::QQnxWindow(QWindow *window, screen_context_t context, bool needRootW
if (m_isTopLevel) {
Q_SCREEN_CRITICALERROR(screen_create_window(&m_window, m_screenContext),
"Could not create top level window"); // Creates an application window
- if (window->type() != Qt::CoverWindow) {
+ if (window->type() != Qt::CoverWindow && window->type() != Qt::Desktop) {
if (needRootWindow)
platformScreen->setRootWindow(this);
}
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.cpp b/src/plugins/platforms/windows/qwindowsclipboard.cpp
index 5370d556fd..dcfeba12fa 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.cpp
+++ b/src/plugins/platforms/windows/qwindowsclipboard.cpp
@@ -132,19 +132,35 @@ extern "C" LRESULT QT_WIN_CALLBACK qClipboardViewerWndProc(HWND hwnd, UINT messa
return DefWindowProc(hwnd, message, wParam, lParam);
}
+// QTBUG-36958, ensure the clipboard is flushed before
+// QGuiApplication is destroyed since OleFlushClipboard()
+// might query the data again which causes problems
+// for QMimeData-derived classes using QPixmap/QImage.
+static void cleanClipboardPostRoutine()
+{
+ if (QWindowsClipboard *cl = QWindowsClipboard::instance())
+ cl->cleanup();
+}
+
QWindowsClipboard *QWindowsClipboard::m_instance = 0;
QWindowsClipboard::QWindowsClipboard() :
m_data(0), m_clipboardViewer(0), m_nextClipboardViewer(0)
{
QWindowsClipboard::m_instance = this;
+ qAddPostRoutine(cleanClipboardPostRoutine);
}
QWindowsClipboard::~QWindowsClipboard()
{
+ cleanup();
+ QWindowsClipboard::m_instance = 0;
+}
+
+void QWindowsClipboard::cleanup()
+{
unregisterViewer(); // Should release data if owner.
releaseIData();
- QWindowsClipboard::m_instance = 0;
}
void QWindowsClipboard::releaseIData()
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.h b/src/plugins/platforms/windows/qwindowsclipboard.h
index ad7ee6437f..30bc0143f4 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.h
+++ b/src/plugins/platforms/windows/qwindowsclipboard.h
@@ -64,6 +64,7 @@ public:
QWindowsClipboard();
~QWindowsClipboard();
void registerViewer(); // Call in initialization, when context is up.
+ void cleanup();
virtual QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard);
virtual void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard);
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index 08f3ab4dbd..f67fb9bc19 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -341,6 +341,16 @@ QWindowsContext::~QWindowsContext()
m_instance = 0;
}
+void QWindowsContext::setTabletAbsoluteRange(int a)
+{
+#if !defined(QT_NO_TABLETEVENT) && !defined(Q_OS_WINCE)
+ if (!d->m_tabletSupport.isNull())
+ d->m_tabletSupport->setAbsoluteRange(a);
+#else
+ Q_UNUSED(a)
+#endif
+}
+
QWindowsContext *QWindowsContext::instance()
{
return m_instance;
diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h
index 1fea059ed9..f5dbd072c7 100644
--- a/src/plugins/platforms/windows/qwindowscontext.h
+++ b/src/plugins/platforms/windows/qwindowscontext.h
@@ -183,6 +183,8 @@ public:
void setWindowCreationContext(const QSharedPointer<QWindowCreationContext> &ctx);
+ void setTabletAbsoluteRange(int a);
+
// Returns a combination of SystemInfoFlags
unsigned systemInfo() const;
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
index 7307d52cf9..b6ff3dc3ce 100644
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
@@ -880,7 +880,7 @@ public:
inline static QWindowsNativeFileDialogBase *create(QFileDialogOptions::AcceptMode am, const QWindowsFileDialogSharedData &data);
virtual void setWindowTitle(const QString &title);
- inline void setMode(QFileDialogOptions::FileMode mode, QFileDialogOptions::FileDialogOptions options);
+ inline void setMode(QFileDialogOptions::FileMode mode, QFileDialogOptions::AcceptMode acceptMode, QFileDialogOptions::FileDialogOptions options);
inline void setDirectory(const QString &directory);
inline void updateDirectory() { setDirectory(m_data.directory().toLocalFile()); }
inline QString directory() const;
@@ -1037,14 +1037,17 @@ void QWindowsNativeFileDialogBase::doExec(HWND owner)
}
}
-void QWindowsNativeFileDialogBase::setMode(QFileDialogOptions::FileMode mode, QFileDialogOptions::FileDialogOptions options)
+void QWindowsNativeFileDialogBase::setMode(QFileDialogOptions::FileMode mode,
+ QFileDialogOptions::AcceptMode acceptMode,
+ QFileDialogOptions::FileDialogOptions options)
{
DWORD flags = FOS_PATHMUSTEXIST | FOS_FORCESHOWHIDDEN;
if (options & QFileDialogOptions::DontResolveSymlinks)
flags |= FOS_NODEREFERENCELINKS;
switch (mode) {
case QFileDialogOptions::AnyFile:
- flags |= FOS_NOREADONLYRETURN;
+ if (acceptMode == QFileDialogOptions::AcceptSave)
+ flags |= FOS_NOREADONLYRETURN;
if (!(options & QFileDialogOptions::DontConfirmOverwrite))
flags |= FOS_OVERWRITEPROMPT;
break;
@@ -1059,8 +1062,9 @@ void QWindowsNativeFileDialogBase::setMode(QFileDialogOptions::FileMode mode, QF
flags |= FOS_FILEMUSTEXIST | FOS_ALLOWMULTISELECT;
break;
}
- qCDebug(lcQpaDialogs) << __FUNCTION__ << " mode=" << mode << " options"
- << options << " results in 0x" << flags;
+ qCDebug(lcQpaDialogs) << __FUNCTION__ << "mode=" << mode
+ << "acceptMode=" << acceptMode << "options=" << options
+ << "results in" << showbase << hex << flags;
if (FAILED(m_fileDialog->SetOptions(flags)))
qErrnoWarning("%s: SetOptions() failed", __FUNCTION__);
@@ -1592,7 +1596,7 @@ QWindowsNativeDialogBase *QWindowsFileDialogHelper::createNativeDialog()
m_data.fromOptions(opts);
const QFileDialogOptions::FileMode mode = opts->fileMode();
result->setWindowTitle(opts->windowTitle());
- result->setMode(mode, opts->options());
+ result->setMode(mode, opts->acceptMode(), opts->options());
result->setHideFiltersDetails(opts->testOption(QFileDialogOptions::HideNameFilterDetails));
const QStringList nameFilters = opts->nameFilters();
if (!nameFilters.isEmpty())
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
index 96659c505f..854444b254 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
@@ -1745,7 +1745,7 @@ QFontEngine *QWindowsFontDatabase::createEngine(int script, const QFontDef &requ
if (!useDirectWrite) {
QWindowsFontEngine *few = new QWindowsFontEngine(request.family, hfont, stockFont, lf, data);
if (preferClearTypeAA)
- few->glyphFormat = QFontEngineGlyphCache::Raster_RGBMask;
+ few->glyphFormat = QFontEngine::Format_A32;
few->initFontInfo(request, fontHdc, dpi);
fe = few;
}
diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp
index 1676b73658..86fcb666b0 100644
--- a/src/plugins/platforms/windows/qwindowsfontengine.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp
@@ -1148,7 +1148,7 @@ glyph_metrics_t QWindowsFontEngine::alphaMapBoundingBox(glyph_t glyph, QFixed, c
{
int margin = 0;
if (format == QFontEngine::Format_A32 || format == QFontEngine::Format_ARGB)
- margin = glyphMargin(QFontEngineGlyphCache::Raster_RGBMask);
+ margin = glyphMargin(QFontEngine::Format_A32);
glyph_metrics_t gm = boundingBox(glyph, matrix);
gm.width += margin * 2;
gm.height += margin * 2;
@@ -1221,7 +1221,7 @@ QImage QWindowsFontEngine::alphaRGBMapForGlyph(glyph_t glyph, QFixed, const QTra
SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &contrast, 0);
SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, (void *) 1000, 0);
- int margin = glyphMargin(QFontEngineGlyphCache::Raster_RGBMask);
+ int margin = glyphMargin(QFontEngine::Format_A32);
QWindowsNativeImage *mask = drawGDIGlyph(font, glyph, margin, t, QImage::Format_RGB32);
SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, (void *) quintptr(contrast), 0);
diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp
index ce5ea8167f..1c5e4508ac 100644
--- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp
@@ -620,7 +620,7 @@ QImage QWindowsFontEngineDirectWrite::alphaRGBMapForGlyph(glyph_t t,
{
QImage mask = imageForGlyph(t,
subPixelPosition,
- glyphMargin(QFontEngineGlyphCache::Raster_RGBMask),
+ glyphMargin(QFontEngine::Format_A32),
xform);
return mask.depth() == 32
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index e5d9444966..3735865845 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -143,7 +143,7 @@ struct QWindowsIntegrationPrivate
explicit QWindowsIntegrationPrivate(const QStringList &paramList);
~QWindowsIntegrationPrivate();
- const unsigned m_options;
+ unsigned m_options;
QWindowsContext m_context;
QPlatformFontDatabase *m_fontDatabase;
#ifndef QT_NO_CLIPBOARD
@@ -165,7 +165,8 @@ struct QWindowsIntegrationPrivate
QWindowsServices m_services;
};
-static inline unsigned parseOptions(const QStringList &paramList)
+static inline unsigned parseOptions(const QStringList &paramList,
+ int *tabletAbsoluteRange)
{
unsigned options = 0;
foreach (const QString &param, paramList) {
@@ -187,15 +188,21 @@ static inline unsigned parseOptions(const QStringList &paramList)
options |= QWindowsIntegration::DontPassOsMouseEventsSynthesizedFromTouch;
} else if (param.startsWith(QLatin1String("verbose="))) {
QWindowsContext::verbose = param.right(param.size() - 8).toInt();
+ } else if (param.startsWith(QLatin1String("tabletabsoluterange="))) {
+ *tabletAbsoluteRange = param.rightRef(param.size() - 20).toInt();
}
}
return options;
}
QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramList)
- : m_options(parseOptions(paramList))
+ : m_options(0)
, m_fontDatabase(0)
{
+ int tabletAbsoluteRange = -1;
+ m_options = parseOptions(paramList, &tabletAbsoluteRange);
+ if (tabletAbsoluteRange >= 0)
+ m_context.setTabletAbsoluteRange(tabletAbsoluteRange);
}
QWindowsIntegrationPrivate::~QWindowsIntegrationPrivate()
diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
index d8c0a9e426..dfa400285a 100644
--- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp
+++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
@@ -173,15 +173,15 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd,
// Check for events synthesized from touch. Lower byte is touch index, 0 means pen.
static const bool passSynthesizedMouseEvents =
!(QWindowsIntegration::instance()->options() & QWindowsIntegration::DontPassOsMouseEventsSynthesizedFromTouch);
- if (!passSynthesizedMouseEvents) {
- // Check for events synthesized from touch. Lower 7 bits are touch/pen index, bit 8 indicates touch.
- // However, when tablet support is active, extraInfo is a packet serial number. This is not a problem
- // since we do not want to ignore mouse events coming from a tablet.
- const quint64 extraInfo = GetMessageExtraInfo();
- const bool fromTouch = (extraInfo & signatureMask) == miWpSignature && (extraInfo & 0x80);
- if (fromTouch)
- return false;
+ // Check for events synthesized from touch. Lower 7 bits are touch/pen index, bit 8 indicates touch.
+ // However, when tablet support is active, extraInfo is a packet serial number. This is not a problem
+ // since we do not want to ignore mouse events coming from a tablet.
+ const quint64 extraInfo = GetMessageExtraInfo();
+ if ((extraInfo & signatureMask) == miWpSignature) {
source = Qt::MouseEventSynthesizedBySystem;
+ const bool fromTouch = extraInfo & 0x80; // (else: Tablet PC)
+ if (fromTouch && !passSynthesizedMouseEvents)
+ return false;
}
#endif // !Q_OS_WINCE
diff --git a/src/plugins/platforms/windows/qwindowstabletsupport.cpp b/src/plugins/platforms/windows/qwindowstabletsupport.cpp
index 8b863ec43d..484ed9cb05 100644
--- a/src/plugins/platforms/windows/qwindowstabletsupport.cpp
+++ b/src/plugins/platforms/windows/qwindowstabletsupport.cpp
@@ -159,6 +159,7 @@ bool QWindowsWinTab32DLL::init()
QWindowsTabletSupport::QWindowsTabletSupport(HWND window, HCTX context)
: m_window(window)
, m_context(context)
+ , m_absoluteRange(20)
, m_tiltSupport(false)
, m_currentDevice(-1)
{
@@ -402,7 +403,6 @@ bool QWindowsTabletSupport::translateTabletPacketEvent()
// in which case we snap the position to the mouse position.
// It seems there is no way to find out the mode programmatically, the LOGCONTEXT orgX/Y/Ext
// area is always the virtual desktop.
- enum { absoluteRange = 20 };
const QRect virtualDesktopArea = QGuiApplication::primaryScreen()->virtualGeometry();
qCDebug(lcQpaTablet) << __FUNCTION__ << "processing " << packetCount
@@ -427,7 +427,7 @@ bool QWindowsTabletSupport::translateTabletPacketEvent()
// Positions should be almost the same if we are in absolute
// mode. If they are not, use the mouse location.
- if ((mouseLocation - globalPos).manhattanLength() > absoluteRange) {
+ if ((mouseLocation - globalPos).manhattanLength() > m_absoluteRange) {
globalPos = mouseLocation;
globalPosF = globalPos;
}
diff --git a/src/plugins/platforms/windows/qwindowstabletsupport.h b/src/plugins/platforms/windows/qwindowstabletsupport.h
index 5e29cd9554..527d9dbf37 100644
--- a/src/plugins/platforms/windows/qwindowstabletsupport.h
+++ b/src/plugins/platforms/windows/qwindowstabletsupport.h
@@ -124,6 +124,9 @@ public:
bool translateTabletProximityEvent(WPARAM wParam, LPARAM lParam);
bool translateTabletPacketEvent();
+ int absoluteRange() const { return m_absoluteRange; }
+ void setAbsoluteRange(int a) { m_absoluteRange = a; }
+
private:
unsigned options() const;
QWindowsTabletDeviceData tabletInit(const quint64 uniqueId, const UINT cursorType) const;
@@ -131,6 +134,7 @@ private:
static QWindowsWinTab32DLL m_winTab32DLL;
const HWND m_window;
const HCTX m_context;
+ int m_absoluteRange;
bool m_tiltSupport;
QVector<QWindowsTabletDeviceData> m_devices;
int m_currentDevice;
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index a0a9e75e2d..d77f587b92 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -924,11 +924,23 @@ void QWindowsWindow::fireExpose(const QRegion &region, bool force)
QWindowSystemInterface::handleExposeEvent(window(), region);
}
+static inline QWindow *findTransientChild(const QWindow *parent)
+{
+ foreach (QWindow *w, QGuiApplication::topLevelWindows())
+ if (w->transientParent() == parent)
+ return w;
+ return 0;
+}
+
void QWindowsWindow::destroyWindow()
{
qCDebug(lcQpaWindows) << __FUNCTION__ << this << window() << m_data.hwnd;
if (m_data.hwnd) { // Stop event dispatching before Window is destroyed.
setFlag(WithinDestroy);
+ // Clear any transient child relationships as Windows will otherwise destroy them (QTBUG-35499, QTBUG-36666)
+ if (QWindow *transientChild = findTransientChild(window()))
+ if (QWindowsWindow *tw = QWindowsWindow::baseWindowOf(transientChild))
+ tw->updateTransientParent();
QWindowsContext *context = QWindowsContext::instance();
if (context->windowUnderMouse() == window())
context->clearWindowUnderMouse();
@@ -1065,7 +1077,7 @@ bool QWindowsWindow::isVisible() const
bool QWindowsWindow::isActive() const
{
// Check for native windows or children of the active native window.
- if (const HWND activeHwnd = GetActiveWindow())
+ if (const HWND activeHwnd = GetForegroundWindow())
if (m_data.hwnd == activeHwnd || IsChild(activeHwnd, m_data.hwnd))
return true;
return false;
@@ -1102,6 +1114,18 @@ QPoint QWindowsWindow::mapFromGlobal(const QPoint &pos) const
return pos;
}
+#ifndef Q_OS_WINCE
+static inline HWND transientParentHwnd(HWND hwnd)
+{
+ if (GetAncestor(hwnd, GA_PARENT) == GetDesktopWindow()) {
+ const HWND rootOwnerHwnd = GetAncestor(hwnd, GA_ROOTOWNER);
+ if (rootOwnerHwnd != hwnd) // May return itself for toplevels.
+ return rootOwnerHwnd;
+ }
+ return 0;
+}
+#endif // !Q_OS_WINCE
+
// Update the transient parent for a toplevel window. The concept does not
// really exist on Windows, the relationship is set by passing a parent along with !WS_CHILD
// to window creation or by setting the parent using GWL_HWNDPARENT (as opposed to
@@ -1112,12 +1136,13 @@ void QWindowsWindow::updateTransientParent() const
if (window()->type() == Qt::Popup)
return; // QTBUG-34503, // a popup stays on top, no parent, see also WindowCreationData::fromWindow().
// Update transient parent.
- const HWND oldTransientParent =
- GetAncestor(m_data.hwnd, GA_PARENT) == GetDesktopWindow() ? GetAncestor(m_data.hwnd, GA_ROOTOWNER) : HWND(0);
+ const HWND oldTransientParent = transientParentHwnd(m_data.hwnd);
HWND newTransientParent = 0;
if (const QWindow *tp = window()->transientParent())
- newTransientParent = QWindowsWindow::handleOf(tp);
- if (newTransientParent && newTransientParent != oldTransientParent)
+ if (const QWindowsWindow *tw = QWindowsWindow::baseWindowOf(tp))
+ if (!tw->testFlag(WithinDestroy)) // Prevent destruction by parent window (QTBUG-35499, QTBUG-36666)
+ newTransientParent = tw->handle();
+ if (newTransientParent != oldTransientParent)
SetWindowLongPtr(m_data.hwnd, GWL_HWNDPARENT, (LONG_PTR)newTransientParent);
#endif // !Q_OS_WINCE
}
diff --git a/src/plugins/platforms/winrt/qwinrtbackingstore.cpp b/src/plugins/platforms/winrt/qwinrtbackingstore.cpp
index b219548788..10136dbead 100644
--- a/src/plugins/platforms/winrt/qwinrtbackingstore.cpp
+++ b/src/plugins/platforms/winrt/qwinrtbackingstore.cpp
@@ -49,8 +49,6 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
-#include <dxgi.h>
-
// Generated shader headers
#include "blitps.h"
#include "blitvs.h"
@@ -60,10 +58,7 @@ namespace { // Utility namespace for writing out an ANGLE-compatible binary blob
// Must match packaged ANGLE
enum : quint32 {
AngleMajorVersion = 1,
- AngleMinorVersion = 2,
- AngleBuildRevision = 2446,
- AngleVersion = ((AngleMajorVersion << 24) | (AngleMinorVersion << 16) | AngleBuildRevision),
- AngleOptimizationLevel = (1 << 14)
+ AngleMinorVersion = 3
};
struct ShaderString
@@ -145,8 +140,8 @@ static const QByteArray createAngleBinary(
stream.setByteOrder(QDataStream::LittleEndian);
stream << quint32(GL_PROGRAM_BINARY_ANGLE)
- << quint32(AngleVersion)
- << quint32(AngleOptimizationLevel);
+ << qint32(AngleMajorVersion)
+ << qint32(AngleMinorVersion);
// Vertex attributes
for (int i = 0; i < 16; ++i) {
@@ -190,25 +185,6 @@ static const QByteArray createAngleBinary(
<< quint32(vertexShader.size())
<< quint32(geometryShader.size());
- // ANGLE requires that we query the adapter for its LUID. Later on, it may be useful
- // for checking feature level support, picking the best adapter on the system, etc.
- IDXGIFactory1 *dxgiFactory;
- if (FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory)))) {
- qCritical("QWinRTBackingStore: failed to create DXGI factory.");
- return QByteArray();
- }
- IDXGIAdapter *dxgiAdapter;
- if (FAILED(dxgiFactory->EnumAdapters(0, &dxgiAdapter))) {
- qCritical("QWinRTBackingStore:: failed to enumerate adapter.");
- dxgiFactory->Release();
- return QByteArray();
- }
- DXGI_ADAPTER_DESC desc;
- dxgiAdapter->GetDesc(&desc);
- dxgiAdapter->Release();
- QByteArray guid(sizeof(GUID), '\0');
- memcpy(guid.data(), &desc.AdapterLuid, sizeof(LUID));
- stream.writeRawData(guid.constData(), guid.size());
stream.writeRawData(pixelShader.constData(), pixelShader.size());
stream.writeRawData(vertexShader.constData(), vertexShader.size());
if (!geometryShader.isEmpty())
diff --git a/src/plugins/platforms/winrt/winrt.pro b/src/plugins/platforms/winrt/winrt.pro
index 3bd688c069..6e3cfb1d20 100644
--- a/src/plugins/platforms/winrt/winrt.pro
+++ b/src/plugins/platforms/winrt/winrt.pro
@@ -9,7 +9,7 @@ QT += core-private gui-private platformsupport-private
DEFINES *= QT_NO_CAST_FROM_ASCII __WRL_NO_DEFAULT_LIB__ GL_GLEXT_PROTOTYPES
-LIBS += $$QMAKE_LIBS_CORE -ldxgi
+LIBS += $$QMAKE_LIBS_CORE
SOURCES = \
main.cpp \
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
index f7abb4662b..ed2f685770 100644
--- a/src/plugins/platforms/xcb/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -493,19 +493,21 @@ void QGLXContext::queryDummyContext()
m_supportsThreading = true;
- const char *renderer = (const char *) glGetString(GL_RENDERER);
- for (int i = 0; qglx_threadedgl_blacklist_renderer[i]; ++i) {
- if (strstr(renderer, qglx_threadedgl_blacklist_renderer[i]) != 0) {
- m_supportsThreading = false;
- break;
+ if (const char *renderer = (const char *) glGetString(GL_RENDERER)) {
+ for (int i = 0; qglx_threadedgl_blacklist_renderer[i]; ++i) {
+ if (strstr(renderer, qglx_threadedgl_blacklist_renderer[i]) != 0) {
+ m_supportsThreading = false;
+ break;
+ }
}
}
- const char *vendor = (const char *) glGetString(GL_VENDOR);
- for (int i = 0; qglx_threadedgl_blacklist_vendor[i]; ++i) {
- if (strstr(vendor, qglx_threadedgl_blacklist_vendor[i]) != 0) {
- m_supportsThreading = false;
- break;
+ if (const char *vendor = (const char *) glGetString(GL_VENDOR)) {
+ for (int i = 0; qglx_threadedgl_blacklist_vendor[i]; ++i) {
+ if (strstr(vendor, qglx_threadedgl_blacklist_vendor[i]) != 0) {
+ m_supportsThreading = false;
+ break;
+ }
}
}
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 768a591ab5..aaa2e81c40 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -253,7 +253,18 @@ QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *wind
QPlatformOffscreenSurface *QXcbIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const
{
#if defined(XCB_USE_GLX)
- return new QGLXPbuffer(surface);
+ static bool vendorChecked = false;
+ static bool glxPbufferUsable = true;
+ if (!vendorChecked) {
+ vendorChecked = true;
+ const char *glxvendor = glXGetClientString(glXGetCurrentDisplay(), GLX_VENDOR);
+ if (glxvendor && !strcmp(glxvendor, "ATI"))
+ glxPbufferUsable = false;
+ }
+ if (glxPbufferUsable)
+ return new QGLXPbuffer(surface);
+ else
+ return 0; // trigger fallback to hidden QWindow
#elif defined(XCB_USE_EGL)
QXcbScreen *screen = static_cast<QXcbScreen *>(surface->screen()->handle());
return new QEGLPbuffer(screen->connection()->egl_display(), surface->requestedFormat(), surface);
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index d0106984a2..29f71e6972 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -1859,6 +1859,7 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev
if (m_lastWindowStateEvent != newState) {
QWindowSystemInterface::handleWindowStateChanged(window(), newState);
m_lastWindowStateEvent = newState;
+ m_windowState = newState;
}
return;
}
diff --git a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp
index 2faebf6f64..b7ba9ef5e7 100644
--- a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp
+++ b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp
@@ -101,9 +101,7 @@ QList<QPrinterInfo> QWindowsPrinterSupport::queryPrinters()
return result;
PPRINTER_INFO_4 infoList = reinterpret_cast<PPRINTER_INFO_4>(buffer.data());
QString defaultPrinterName;
- QString program;
- QString port;
- QWin32PrintEngine::queryDefaultPrinter(defaultPrinterName, program, port);
+ QWin32PrintEngine::queryDefaultPrinter(defaultPrinterName);
for (uint i = 0; i < returned; ++i) {
const QString printerName(QString::fromWCharArray(infoList[i].pPrinterName));
const bool isDefault = (printerName == defaultPrinterName);