Windows: Create one QPlatformCursor per screen.

The pixmap-based cursors and some of the standard cursors we
create from resource pixmaps need to be separated per screen.

Use a QScopedPointer containing the per-screen cursor instead
of the previously used QSharedPointer containing the cursor
shared by all screens.

Task-number: QTBUG-49511
Change-Id: I5203fcc4ecf5a7ff3fea833a4eaeb5300a6e6d54
Reviewed-by: Oliver Wolff <oliver.wolff@theqtcompany.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
This commit is contained in:
Friedemann Kleint 2015-11-18 13:36:02 +01:00
parent 436ad32f9f
commit f39db6c3f8
4 changed files with 11 additions and 17 deletions

View File

@ -47,11 +47,12 @@
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QScopedArrayPointer> #include <QtCore/QScopedArrayPointer>
static void initResources() static bool initResources()
{ {
#if !defined (Q_OS_WINCE) && !defined (QT_NO_IMAGEFORMAT_PNG) #if !defined (Q_OS_WINCE) && !defined (QT_NO_IMAGEFORMAT_PNG)
Q_INIT_RESOURCE(cursors); Q_INIT_RESOURCE(cursors);
#endif #endif
return true;
} }
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -590,9 +591,11 @@ CursorHandlePtr QWindowsCursor::pixmapWindowCursor(const QCursor &c)
return it.value(); return it.value();
} }
QWindowsCursor::QWindowsCursor() QWindowsCursor::QWindowsCursor(const QPlatformScreen *screen)
: m_screen(screen)
{ {
initResources(); static const bool dummy = initResources();
Q_UNUSED(dummy)
} }
/*! /*!

View File

@ -96,7 +96,7 @@ public:
QPoint hotSpot; QPoint hotSpot;
}; };
QWindowsCursor(); explicit QWindowsCursor(const QPlatformScreen *screen);
void changeCursor(QCursor * widgetCursor, QWindow * widget) Q_DECL_OVERRIDE; void changeCursor(QCursor * widgetCursor, QWindow * widget) Q_DECL_OVERRIDE;
QPoint pos() const Q_DECL_OVERRIDE; QPoint pos() const Q_DECL_OVERRIDE;
@ -117,6 +117,7 @@ private:
typedef QHash<Qt::CursorShape, CursorHandlePtr> StandardCursorCache; typedef QHash<Qt::CursorShape, CursorHandlePtr> StandardCursorCache;
typedef QHash<QWindowsPixmapCursorCacheKey, CursorHandlePtr> PixmapCursorCache; typedef QHash<QWindowsPixmapCursorCacheKey, CursorHandlePtr> PixmapCursorCache;
const QPlatformScreen *const m_screen;
StandardCursorCache m_standardCursorCache; StandardCursorCache m_standardCursorCache;
PixmapCursorCache m_pixmapCursorCache; PixmapCursorCache m_pixmapCursorCache;
}; };

View File

@ -195,16 +195,6 @@ static QDebug operator<<(QDebug dbg, const QWindowsScreenData &d)
} }
#endif // !QT_NO_DEBUG_STREAM #endif // !QT_NO_DEBUG_STREAM
// Return the cursor to be shared by all screens (virtual desktop).
static inline QSharedPointer<QPlatformCursor> sharedCursor()
{
#ifndef QT_NO_CURSOR
if (const QScreen *primaryScreen = QGuiApplication::primaryScreen())
return static_cast<const QWindowsScreen *>(primaryScreen->handle())->cursorPtr();
#endif
return QSharedPointer<QPlatformCursor>(new QWindowsCursor);
}
/*! /*!
\class QWindowsScreen \class QWindowsScreen
\brief Windows screen. \brief Windows screen.
@ -216,7 +206,7 @@ static inline QSharedPointer<QPlatformCursor> sharedCursor()
QWindowsScreen::QWindowsScreen(const QWindowsScreenData &data) : QWindowsScreen::QWindowsScreen(const QWindowsScreenData &data) :
m_data(data) m_data(data)
#ifndef QT_NO_CURSOR #ifndef QT_NO_CURSOR
,m_cursor(sharedCursor()) , m_cursor(new QWindowsCursor(this))
#endif #endif
{ {
} }

View File

@ -42,7 +42,7 @@
#include <QtCore/QList> #include <QtCore/QList>
#include <QtCore/QVector> #include <QtCore/QVector>
#include <QtCore/QPair> #include <QtCore/QPair>
#include <QtCore/QSharedPointer> #include <QtCore/QScopedPointer>
#include <qpa/qplatformscreen.h> #include <qpa/qplatformscreen.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -74,7 +74,7 @@ class QWindowsScreen : public QPlatformScreen
{ {
public: public:
#ifndef QT_NO_CURSOR #ifndef QT_NO_CURSOR
typedef QSharedPointer<QPlatformCursor> CursorPtr; typedef QScopedPointer<QPlatformCursor> CursorPtr;
#endif #endif
explicit QWindowsScreen(const QWindowsScreenData &data); explicit QWindowsScreen(const QWindowsScreenData &data);