QCursor: Associate cursor with screen.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Mon, 5 Mar 2012 13:42:42 +0000 (14:42 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 7 Mar 2012 21:43:43 +0000 (22:43 +0100)
- Introduce cursor() accessor to QPlatformScreen.
- Remove screen member of QPlatformCursor (a
  cursor can be shared by multiple screens
  of a virtual desktop).
- Add QCursor::pos()/ QCursor::setPos() taking
  a QScreen-parameter, use primaryScreen() for
  old overloads.  QCursor::pos() can then query
  the platform cursor for the position and return
  the position even if the mouse position is outside
  the windows owned by the Qt application.
- Fix tests

Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Task-number: QTBUG-22457
Task-number: QTBUG-22565
Task-number: QTBUG-20753
Change-Id: Ia69f37343f95772e934eab1cd806bd54cbdbbe51
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
34 files changed:
src/gui/kernel/qcursor.cpp
src/gui/kernel/qcursor.h
src/gui/kernel/qcursor_qpa.cpp
src/gui/kernel/qguiapplication.cpp
src/gui/kernel/qplatformcursor_qpa.cpp
src/gui/kernel/qplatformcursor_qpa.h
src/gui/kernel/qplatformscreen_qpa.cpp
src/gui/kernel/qplatformscreen_qpa.h
src/plugins/platforms/cocoa/qcocoacursor.h
src/plugins/platforms/cocoa/qcocoacursor.mm
src/plugins/platforms/cocoa/qcocoaintegration.h
src/plugins/platforms/cocoa/qcocoaintegration.mm
src/plugins/platforms/directfb/qdirectfbcursor.cpp
src/plugins/platforms/directfb/qdirectfbcursor.h
src/plugins/platforms/directfb/qdirectfbscreen.h
src/plugins/platforms/kms/qkmscursor.cpp
src/plugins/platforms/kms/qkmsscreen.cpp
src/plugins/platforms/kms/qkmsscreen.h
src/plugins/platforms/windows/qwindowscursor.cpp
src/plugins/platforms/windows/qwindowscursor.h
src/plugins/platforms/windows/qwindowsscreen.cpp
src/plugins/platforms/windows/qwindowsscreen.h
src/plugins/platforms/windows/qwindowswindow.cpp
src/plugins/platforms/xcb/qxcbcursor.cpp
src/plugins/platforms/xcb/qxcbscreen.cpp
src/plugins/platforms/xcb/qxcbscreen.h
src/plugins/platforms/xlib/qxlibcursor.cpp
src/plugins/platforms/xlib/qxlibcursor.h
src/plugins/platforms/xlib/qxlibscreen.cpp
src/plugins/platforms/xlib/qxlibscreen.h
src/widgets/kernel/qwidget_qpa.cpp
tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp

index f16e5c8..95b2b4a 100644 (file)
@@ -185,10 +185,10 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
-    \fn QPoint QCursor::pos()
+    \fn QPoint QCursor::pos(const QScreen *screen)
 
-    Returns the position of the cursor (hot spot) in global screen
-    coordinates.
+    Returns the position of the cursor (hot spot) of the \a screen
+    in global screen coordinates.
 
     You can call QWidget::mapFromGlobal() to translate it to widget
     coordinates.
@@ -197,10 +197,23 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
-    \fn void QCursor::setPos(int x, int y)
+    \fn QPoint QCursor::pos()
+
+    Returns the position of the cursor (hot spot) of
+    the primary screen in global screen coordinates.
+
+    You can call QWidget::mapFromGlobal() to translate it to widget
+    coordinates.
+
+    \sa setPos(), QWidget::mapFromGlobal(), QWidget::mapToGlobal(), QGuiApplication::primaryScreen()
+*/
 
-    Moves the cursor (hot spot) to the global screen position (\a x,
-    \a y).
+
+/*!
+    \fn void QCursor::setPos(QScreen *screen, int x, int y)
+
+    Moves the cursor (hot spot) of the \a screen to the global
+    screen position (\a x, \a y).
 
     You can call QWidget::mapToGlobal() to translate widget
     coordinates to global screen coordinates.
@@ -209,6 +222,18 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \fn void QCursor::setPos(int x, int y)
+
+    Moves the cursor (hot spot) of the primary screen
+    to the global screen position (\a x, \a y).
+
+    You can call QWidget::mapToGlobal() to translate widget
+    coordinates to global screen coordinates.
+
+    \sa pos(), QWidget::mapFromGlobal(), QWidget::mapToGlobal(), QGuiApplication::primaryScreen()
+*/
+
+/*!
     \fn void QCursor::setPos (const QPoint &p)
 
     \overload
@@ -217,6 +242,15 @@ QT_BEGIN_NAMESPACE
     \a p.
 */
 
+/*!
+    \fn void QCursor::setPos (QScreen *screen,const QPoint &p)
+
+    \overload
+
+    Moves the cursor (hot spot) to the global screen position of the
+    \a screen at point \a p.
+*/
+
 /*****************************************************************************
   QCursor stream functions
  *****************************************************************************/
index 00b709b..4820bce 100644 (file)
@@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE
 
 
 class QVariant;
+class QScreen;
 
 /*
   ### The fake cursor has to go first with old qdoc.
@@ -101,8 +102,11 @@ public:
     QPoint hotSpot() const;
 
     static QPoint pos();
+    static QPoint pos(const QScreen *screen);
     static void setPos(int x, int y);
+    static void setPos(QScreen *screen, int x, int y);
     inline static void setPos(const QPoint &p) { setPos(p.x(), p.y()); }
+    inline static void setPos(QScreen *screen, const QPoint &p) { setPos(screen, p.x(), p.y()); }
     
 #ifdef qdoc
     HCURSOR_or_HANDLE handle() const;
index 7ba2e1c..1c719c8 100644 (file)
@@ -40,6 +40,7 @@
 ****************************************************************************/
 
 #include <qcursor.h>
+#include <qscreen.h>
 #include <private/qcursor_p.h>
 #include <qplatformcursor_qpa.h>
 #include <private/qguiapplication_p.h>
@@ -110,27 +111,34 @@ void QCursorData::update()
 
 QPoint QCursor::pos()
 {
+    return QCursor::pos(QGuiApplication::primaryScreen());
+}
+
+QPoint QCursor::pos(const QScreen *screen)
+{
+    if (screen)
+        if (const QPlatformCursor *cursor = screen->handle()->cursor())
+            return cursor->pos();
     return QGuiApplicationPrivate::lastCursorPosition.toPoint();
 }
 
-void QCursor::setPos(int x, int y)
+void QCursor::setPos(QScreen *screen, int x, int y)
 {
-    QPoint target(x, y);
-
-    // Need to check, since some X servers generate null mouse move
-    // events, causing looping in applications which call setPos() on
-    // every mouse move event.
-    //
-    if (pos() == target)
-        return;
-
-    QList<QWeakPointer<QPlatformCursor> > cursors = QPlatformCursorPrivate::getInstances();
-    int cursorCount = cursors.count();
-    for (int i = 0; i < cursorCount; ++i) {
-        const QWeakPointer<QPlatformCursor> &cursor(cursors.at(i));
-        if (cursor)
-            cursor.data()->setPos(target);
+    if (screen) {
+        if (QPlatformCursor *cursor = screen->handle()->cursor()) {
+            const QPoint pos = QPoint(x, y);
+            // Need to check, since some X servers generate null mouse move
+            // events, causing looping in applications which call setPos() on
+            // every mouse move event.
+            if (pos != cursor->pos())
+                cursor->setPos(pos);
+        }
     }
 }
 
+void QCursor::setPos(int x, int y)
+{
+    QCursor::setPos(QGuiApplication::primaryScreen(), x, y);
+}
+
 QT_END_NAMESPACE
index f5aea65..42ce374 100644 (file)
@@ -978,10 +978,9 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo
         QMouseEvent ev(type, localPoint, localPoint, globalPoint, button, buttons, e->modifiers);
         ev.setTimestamp(e->timestamp);
 #ifndef QT_NO_CURSOR
-        QList<QWeakPointer<QPlatformCursor> > cursors = QPlatformCursorPrivate::getInstances();
-        for (int i = 0; i < cursors.count(); ++i)
-            if (cursors.at(i))
-                cursors.at(i).data()->pointerEvent(ev);
+        if (const QScreen *screen = window->screen())
+            if (QPlatformCursor *cursor = screen->handle()->cursor())
+                cursor->pointerEvent(ev);
 #endif
         QGuiApplication::sendSpontaneousEvent(window, &ev);
         if (!e->synthetic && !ev.isAccepted() && qApp->testAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents)) {
@@ -1814,16 +1813,11 @@ void QGuiApplication::changeOverrideCursor(const QCursor &cursor)
 
 
 #ifndef QT_NO_CURSOR
-static void applyCursor(QWindow *w, const QCursor &c)
-{
-    QCursor cc = c;
-    QList<QWeakPointer<QPlatformCursor> > cursors = QPlatformCursorPrivate::getInstances();
-    int cursorCount = cursors.count();
-    for (int i = 0; i < cursorCount; ++i) {
-        const QWeakPointer<QPlatformCursor> &cursor(cursors.at(i));
-        if (cursor)
-            cursor.data()->changeCursor(&cc, w);
-    }
+static inline void applyCursor(QWindow *w, QCursor c)
+{
+    if (const QScreen *screen = w->screen())
+        if (QPlatformCursor *cursor = screen->handle()->cursor())
+            cursor->changeCursor(&c, w);
 }
 
 static inline void applyCursor(const QList<QWindow *> &l, const QCursor &c)
index fd7bcdc..a4e998d 100644 (file)
 #include <QPainter>
 #include <QBitmap>
 #include <QGuiApplication>
+#include <QScreen>
+#include <QPlatformScreen>
 #include <private/qguiapplication_p.h>
 
 #include <QDebug>
 
 QT_BEGIN_NAMESPACE
 
-QList <QWeakPointer<QPlatformCursor> > QPlatformCursorPrivate::instances;
+QList<QPlatformCursor *> QPlatformCursorPrivate::getInstances()
+{
+    QList<QPlatformCursor *> result;
+    foreach (const QScreen *screen, QGuiApplicationPrivate::screen_list)
+        if (QPlatformCursor *cursor = screen->handle()->cursor())
+            result.push_back(cursor);
+    return result;
+}
 
 /*!
     \class QPlatformCursor
@@ -93,10 +102,8 @@ QList <QWeakPointer<QPlatformCursor> > QPlatformCursorPrivate::instances;
 
     Constructs a QPlatformCursor for the given \a screen.
 */
-QPlatformCursor::QPlatformCursor(QPlatformScreen *scr )
-        : screen(scr)
+QPlatformCursor::QPlatformCursor()
 {
-    QPlatformCursorPrivate::instances.append(this);
 }
 
 QPoint QPlatformCursor::pos() const
index a8cbb28..e29cf87 100644 (file)
@@ -74,13 +74,12 @@ class QPlatformCursor;
 
 class Q_GUI_EXPORT QPlatformCursorPrivate {
 public:
-    static QList<QWeakPointer<QPlatformCursor> > getInstances() { return instances; }
-    static QList<QWeakPointer<QPlatformCursor> > instances;
+    static QList<QPlatformCursor *> getInstances();
 };
 
 class Q_GUI_EXPORT QPlatformCursor : public QObject {
 public:
-    QPlatformCursor(QPlatformScreen *);
+    QPlatformCursor();
 
     // input methods
     virtual void pointerEvent(const QMouseEvent & event) { Q_UNUSED(event); }
@@ -88,11 +87,8 @@ public:
     virtual QPoint pos() const;
     virtual void setPos(const QPoint &pos);
 
-protected:
-    QPlatformScreen* screen;  // Where to request an update
-
 private:
-    Q_DECLARE_PRIVATE(QPlatformCursor);
+    Q_DECLARE_PRIVATE(QPlatformCursor)
     friend void qt_qpa_set_cursor(QWidget * w, bool force);
     friend class QApplicationPrivate;
 };
index c832d85..022f198 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "qplatformscreen_qpa.h"
 #include <QtGui/qguiapplication.h>
+#include <QtGui/qplatformcursor_qpa.h>
 #include <QtGui/private/qguiapplication_p.h>
 #include <QtGui/private/qplatformscreen_qpa_p.h>
 #include <QtGui/qplatformintegration_qpa.h>
@@ -250,4 +251,14 @@ QPlatformScreenPageFlipper *QPlatformScreen::pageFlipper() const
     return 0;
 }
 
+/*!
+    Reimplement this function in subclass to return the cursor of the screen.
+
+    The default implementation returns 0.
+*/
+QPlatformCursor *QPlatformScreen::cursor() const
+{
+    return 0;
+}
+
 QT_END_NAMESPACE
index 7d74698..b6eb91f 100644 (file)
@@ -63,6 +63,7 @@ class QPlatformBackingStore;
 class QPlatformOpenGLContext;
 class QPlatformScreenPrivate;
 class QPlatformWindow;
+class QPlatformCursor;
 class QPlatformScreenPageFlipper;
 class QScreen;
 class QSurfaceFormat;
@@ -103,6 +104,7 @@ public:
     virtual QString name() const { return QString(); }
 
     virtual QPlatformScreenPageFlipper *pageFlipper() const;
+    virtual QPlatformCursor *cursor() const;
 
 protected:
     QScopedPointer<QPlatformScreenPrivate> d_ptr;
index bccaa1e..85892ee 100644 (file)
@@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE
 class QCocoaCursor : public QPlatformCursor
 {
 public:
-    explicit QCocoaCursor(QPlatformScreen *);
+    QCocoaCursor();
 
     virtual void changeCursor(QCursor * widgetCursor, QWindow * widget);
     virtual QPoint pos() const;
index bddfaa7..56f0dcf 100644 (file)
@@ -47,8 +47,7 @@
 
 QT_BEGIN_NAMESPACE
 
-QCocoaCursor::QCocoaCursor(QPlatformScreen *s) :
-    QPlatformCursor(s)
+QCocoaCursor::QCocoaCursor()
 {
     // release cursors
     QHash<Qt::CursorShape, NSCursor *>::const_iterator i = m_cursors.constBegin();
index aa0c933..bf54915 100644 (file)
@@ -63,6 +63,7 @@ public:
     int depth() const { return m_depth; }
     QImage::Format format() const { return m_format; }
     QSizeF physicalSize() const { return m_physicalSize; }
+    QPlatformCursor *cursor() const  { return m_cursor; }
 
 public:
     NSScreen *m_screen;
index 7921cc6..8411a79 100644 (file)
@@ -79,7 +79,7 @@ QCocoaScreen::QCocoaScreen(int screenIndex)
     const qreal inch = 25.4;
     m_physicalSize = QSizeF(m_geometry.size()) * inch / dpi;
 
-    m_cursor = new QCocoaCursor(this);
+    m_cursor = new QCocoaCursor;
 };
 
 QCocoaScreen::~QCocoaScreen()
index e1660a9..a63bc48 100644 (file)
@@ -45,7 +45,7 @@
 QT_BEGIN_NAMESPACE
 
 QDirectFBCursor::QDirectFBCursor(QPlatformScreen *screen)
-    : QPlatformCursor(screen)
+    : m_screen(screen)
 {
     m_image.reset(new QPlatformCursorImage(0, 0, 0, 0, 0, 0));
 }
@@ -70,7 +70,7 @@ void QDirectFBCursor::changeCursor(QCursor *cursor, QWindow *)
     }
 
     DFBResult res;
-    IDirectFBDisplayLayer *layer = toDfbLayer(screen);
+    IDirectFBDisplayLayer *layer = toDfbLayer(m_screen);
     IDirectFBSurface* surface(QDirectFbConvenience::dfbSurfaceForPlatformPixmap(map.handle()));
 
     res = layer->SetCooperativeLevel(layer, DLSCL_ADMINISTRATIVE);
index 3cc2825..f28e225 100644 (file)
@@ -60,6 +60,7 @@ public:
 
 private:
     QScopedPointer<QPlatformCursorImage> m_image;
+    QPlatformScreen *m_screen;
 };
 
 QT_END_NAMESPACE
index ad80576..8535239 100644 (file)
@@ -61,6 +61,7 @@ public:
     int depth() const { return m_depth; }
     QImage::Format format() const { return m_format; }
     QSizeF physicalSize() const { return m_physicalSize; }
+    QPlatformCursor *cursor() const { return m_cursor.data(); }
 
     // DirectFb helpers
     IDirectFBDisplayLayer *dfbLayer() const;
index a38f66b..37817af 100644 (file)
@@ -46,7 +46,7 @@
 QT_BEGIN_NAMESPACE
 
 QKmsCursor::QKmsCursor(QKmsScreen *screen)
-    : QPlatformCursor(screen), m_screen(screen),
+    : m_screen(screen),
       m_graphicsBufferManager(screen->device()->gbmDevice())
 {
     gbm_bo *bo = gbm_bo_create(m_graphicsBufferManager, 64, 64,
index f1b9baf..76b9bce 100644 (file)
@@ -96,6 +96,11 @@ QSizeF QKmsScreen::physicalSize() const
     return m_physicalSize;
 }
 
+QPlatformCursor *QKmsScreen::cursor() const
+{
+    return m_cursor;
+}
+
 GLuint QKmsScreen::framebufferObject() const
 {
     return m_bufferManager.framebufferObject();
index 4cb547b..058314a 100644 (file)
@@ -61,6 +61,7 @@ public:
     int depth() const;
     QImage::Format format() const;
     QSizeF physicalSize() const;
+    QPlatformCursor *cursor() const;
 
     GLuint framebufferObject() const;
     quint32 crtcId() const { return m_crtcId; }
index f75cbeb..337ba9a 100644 (file)
@@ -72,11 +72,6 @@ Q_GUI_EXPORT HBITMAP qt_createIconMask(const QBitmap &bitmap);
     \sa QWindowsWindowCursor
 */
 
-QWindowsCursor::QWindowsCursor(QPlatformScreen *s) :
-    QPlatformCursor(s)
-{
-}
-
 HCURSOR QWindowsCursor::createPixmapCursor(const QPixmap &pixmap, int hotX, int hotY)
 {
     HCURSOR cur = 0;
index a03c77a..61c43dc 100644 (file)
@@ -70,7 +70,7 @@ private:
 class QWindowsCursor : public QPlatformCursor
 {
 public:
-    explicit QWindowsCursor(QPlatformScreen *);
+    QWindowsCursor() {}
 
     virtual void changeCursor(QCursor * widgetCursor, QWindow * widget);
     virtual QPoint pos() const { return mousePosition(); }
index 1dc5175..2476e15 100644 (file)
@@ -147,6 +147,14 @@ static QDebug operator<<(QDebug dbg, const QWindowsScreenData &d)
     return dbg;
 }
 
+// Return the cursor to be shared by all screens (virtual desktop).
+static inline QSharedPointer<QWindowsCursor> sharedCursor()
+{
+    if (const QScreen *primaryScreen = QGuiApplication::primaryScreen())
+        return static_cast<const QWindowsScreen *>(primaryScreen->handle())->windowsCursor();
+    return QSharedPointer<QWindowsCursor>(new QWindowsCursor);
+}
+
 /*!
     \class QWindowsScreen
     \brief Windows screen.
@@ -155,7 +163,7 @@ static QDebug operator<<(QDebug dbg, const QWindowsScreenData &d)
 */
 
 QWindowsScreen::QWindowsScreen(const QWindowsScreenData &data) :
-    m_data(data), m_cursor(this)
+    m_data(data), m_cursor(sharedCursor())
 {
 }
 
index 77a327a..5b9a50b 100644 (file)
@@ -46,6 +46,7 @@
 
 #include <QtCore/QList>
 #include <QtCore/QPair>
+#include <QtCore/QSharedPointer>
 #include <QtGui/QPlatformScreen>
 
 QT_BEGIN_NAMESPACE
@@ -74,6 +75,8 @@ struct QWindowsScreenData
 class QWindowsScreen : public QPlatformScreen
 {
 public:
+    typedef QSharedPointer<QWindowsCursor> WindowsCursorPtr;
+
     explicit QWindowsScreen(const QWindowsScreenData &data);
 
     static QWindowsScreen *screenOf(const QWindow *w = 0);
@@ -98,14 +101,14 @@ public:
 
     inline void handleChanges(const QWindowsScreenData &newData);
 
-    const QWindowsCursor &cursor() const    { return m_cursor; }
-    QWindowsCursor &cursor()                { return m_cursor; }
+    QPlatformCursor *cursor() const               { return m_cursor.data(); }
+    const WindowsCursorPtr &windowsCursor() const { return m_cursor; }
 
     const QWindowsScreenData &data() const  { return m_data; }
 
 private:
     QWindowsScreenData m_data;
-    QWindowsCursor m_cursor;
+    const WindowsCursorPtr m_cursor;
 };
 
 class QWindowsScreenManager
index f5cac4d..1edb243 100644 (file)
@@ -618,7 +618,7 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const WindowData &data) :
     m_windowState(aWindow->windowState()),
     m_opacity(1.0),
     m_mouseGrab(false),
-    m_cursor(QWindowsScreen::screenOf(aWindow)->cursor().standardWindowCursor()),
+    m_cursor(QWindowsScreen::screenOf(aWindow)->windowsCursor()->standardWindowCursor()),
     m_dropTarget(0),
     m_savedStyle(0)
 {
index ed7c22b..7e1b668 100644 (file)
@@ -261,7 +261,7 @@ static const char * const cursorNames[] = {
 };
 
 QXcbCursor::QXcbCursor(QXcbConnection *conn, QXcbScreen *screen)
-    : QXcbObject(conn), QPlatformCursor(screen), m_screen(screen)
+    : QXcbObject(conn), m_screen(screen)
 {
     if (cursorCount++)
         return;
index 15ffc5b..8b66ef4 100644 (file)
@@ -237,6 +237,11 @@ QSizeF QXcbScreen::physicalSize() const
     return QSizeF(m_screen->width_in_millimeters, m_screen->height_in_millimeters);
 }
 
+QPlatformCursor *QXcbScreen::cursor() const
+{
+    return m_cursor;
+}
+
 int QXcbScreen::screenNumber() const
 {
     return m_number;
index 870d4d5..ac4ecb1 100644 (file)
@@ -68,6 +68,7 @@ public:
     int depth() const;
     QImage::Format format() const;
     QSizeF physicalSize() const;
+    QPlatformCursor *cursor() const;
 
     int screenNumber() const;
 
index 8ab40e3..a714f82 100644 (file)
@@ -52,8 +52,7 @@
 
 QT_BEGIN_NAMESPACE
 
-QXlibCursor::QXlibCursor(QXlibScreen *screen)
-    : QPlatformCursor(screen)
+QXlibCursor::QXlibCursor(QXlibScreen *screen) : m_screen(screen)
 {
 }
 
@@ -191,9 +190,4 @@ Cursor QXlibCursor::createCursorShape(int cshape)
     return cursor;
 }
 
-QXlibScreen * QXlibCursor::testLiteScreen() const
-{
-    return static_cast<QXlibScreen *>(screen);
-}
-
 QT_END_NAMESPACE
index 92e42ac..0056aa9 100644 (file)
@@ -48,7 +48,7 @@
 
 QT_BEGIN_NAMESPACE
 
-class QXlibCursor : QPlatformCursor
+class QXlibCursor : public QPlatformCursor
 {
 public:
     QXlibCursor(QXlibScreen *screen);
@@ -59,8 +59,9 @@ private:
     Cursor createCursorBitmap(QCursor * cursor);
     Cursor createCursorShape(int cshape);
 
-    QXlibScreen *testLiteScreen() const;
+    QXlibScreen *testLiteScreen() const { return m_screen; }
     QMap<int, Cursor> cursorMap;
+    QXlibScreen *m_screen;
 };
 
 QT_END_NAMESPACE
index fc90370..62c80b6 100644 (file)
@@ -241,6 +241,11 @@ QXlibScreen::~QXlibScreen()
     delete mDisplay;
 }
 
+QPlatformCursor *QXlibScreen::cursor() const
+{
+    return mCursor;
+}
+
 Window QXlibScreen::rootWindow()
 {
     return RootWindow(mDisplay->nativeDisplay(), mScreen);
index c6672c3..5bb6cc7 100644 (file)
@@ -63,6 +63,7 @@ public:
     int depth() const { return mDepth; }
     QImage::Format format() const { return mFormat; }
     QSizeF physicalSize() const { return mPhysicalSize; }
+    QPlatformCursor *cursor() const;
 
     Window rootWindow();
     unsigned long blackPixel();
index a37de85..3d23b04 100644 (file)
@@ -905,16 +905,12 @@ void QWidgetPrivate::setModal_sys()
 }
 
 #ifndef QT_NO_CURSOR
-static void applyCursor(QWidget *w, const QCursor &c)
+static inline void applyCursor(QWidget *w, QCursor c)
 {
-    QCursor cc = c;
-    QList<QWeakPointer<QPlatformCursor> > cursors = QPlatformCursorPrivate::getInstances();
-    int cursorCount = cursors.count();
-    for (int i = 0; i < cursorCount; ++i) {
-        const QWeakPointer<QPlatformCursor> &cursor(cursors.at(i));
-        if (cursor)
-            cursor.data()->changeCursor(&cc, w->window()->windowHandle());
-    }
+    if (QWindow *window = w->windowHandle())
+        if (const QScreen *screen = window->screen())
+            if (QPlatformCursor *cursor = screen->handle()->cursor())
+                cursor->changeCursor(&c, window);
 }
 
 void qt_qpa_set_cursor(QWidget *w, bool force)
index af76b1c..ee7ec7b 100644 (file)
@@ -4338,9 +4338,16 @@ void tst_QGraphicsView::task255529_transformationAnchorMouseAndViewportMargins()
     QPointF newMouseScenePos = view.mapToScene(mouseViewPos);
 
     qreal slack = 1;
-    QEXPECT_FAIL("", "QTBUG-22455", Abort);
-    QVERIFY(qAbs(newMouseScenePos.x() - mouseScenePos.x()) < slack);
-    QVERIFY(qAbs(newMouseScenePos.y() - mouseScenePos.y()) < slack);
+
+    const qreal dx = qAbs(newMouseScenePos.x() - mouseScenePos.x());
+    const qreal dy = qAbs(newMouseScenePos.y() - mouseScenePos.y());
+    const QByteArray message = QString::fromLatin1("QTBUG-22455, distance: dx=%1, dy=%2 slack=%3 (%4).").
+                     arg(dx).arg(dy).arg(slack).arg(qApp->style()->metaObject()->className()).toLocal8Bit();
+    // This is highly unstable (observed to pass on Windows and some Linux configurations).
+#ifdef Q_OS_MAC
+    QEXPECT_FAIL("", message.constData(), Abort);
+#endif
+    QVERIFY2(dx < slack && dy < slack, message.constData());
 #endif
 }
 
index 0a2d0cd..c6b2b49 100644 (file)
@@ -1158,9 +1158,6 @@ void tst_QGraphicsWidget::initStyleOption()
     QCOMPARE(hasFocus, focus);
     bool isUnderMouse = option.state & QStyle::State_MouseOver;
 #ifndef Q_OS_WINCE
-# if !defined(Q_OS_MAC) && !defined(Q_OS_WIN)
-    QEXPECT_FAIL("all", "QTBUG-22457", Abort);
-# endif
     QCOMPARE(isUnderMouse, underMouse);
 #endif
     // if (layoutDirection != Qt::LeftToRight)
index 4fffd74..473c5e0 100644 (file)
@@ -562,9 +562,6 @@ void tst_QMenu::tearOff()
     QTest::mouseClick(menu, Qt::LeftButton, 0, QPoint(3, 3), 10);
     QTest::qWait(100);
 
-#ifndef Q_OS_MAC
-    QEXPECT_FAIL("", "QTBUG-22565", Abort);
-#endif
     QVERIFY(menu->isTearOffMenuVisible());
     QPointer<QMenu> torn = 0;
     foreach (QWidget *w, QApplication::allWidgets()) {
@@ -783,9 +780,6 @@ void tst_QMenu::task258920_mouseBorder()
 #ifdef Q_OS_WINCE_WM
     QSKIP("Mouse move related signals for Windows Mobile unavailable");
 #endif
-    // ### fixme: Check platforms
-    QSKIP("QTBUG-20753 QCursor::setPos() / QTest::mouseMove() doesn't work on qpa");
-
     Menu258920 menu;
     // For styles which inherit from QWindowsStyle, styleHint(QStyle::SH_Menu_MouseTracking) is true.
     menu.setMouseTracking(true);