diff options
author | Jeremy Katz <jeremy.katz@nokia.com> | 2010-05-05 11:40:19 (GMT) |
---|---|---|
committer | Jeremy Katz <jeremy.katz@nokia.com> | 2010-05-05 11:40:19 (GMT) |
commit | 208e207925f9073fdca55f5824ce4d0051c86c6c (patch) | |
tree | 5588d7d72640e7f5ae558e2789c66f57fc224bec | |
parent | 47f886467b04ce712b4dcd90f0201720d614ff28 (diff) | |
download | Qt-208e207925f9073fdca55f5824ce4d0051c86c6c.zip Qt-208e207925f9073fdca55f5824ce4d0051c86c6c.tar.gz Qt-208e207925f9073fdca55f5824ce4d0051c86c6c.tar.bz2 |
allow multiple cursors
-rw-r--r-- | src/gui/kernel/qapplication_lite.cpp | 8 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_lite.cpp | 67 | ||||
-rw-r--r-- | src/gui/painting/qgraphicssystemcursor_lite.cpp | 4 | ||||
-rw-r--r-- | src/gui/painting/qgraphicssystemcursor_lite.h | 9 | ||||
-rw-r--r-- | src/plugins/platforms/fb_base/fb_base.h | 1 |
5 files changed, 48 insertions, 41 deletions
diff --git a/src/gui/kernel/qapplication_lite.cpp b/src/gui/kernel/qapplication_lite.cpp index f9e4242..31db7d0 100644 --- a/src/gui/kernel/qapplication_lite.cpp +++ b/src/gui/kernel/qapplication_lite.cpp @@ -691,9 +691,11 @@ void QApplicationPrivate::processMouseEvent(QWindowSystemInterface::MouseEvent * QMouseEvent ev(type, localPoint, globalPoint, button, buttons, modifiers); - QPointer<QGraphicsSystemCursor> cursor = QGraphicsSystemCursor::getInstance(); - if (cursor) - cursor->pointerEvent(ev); + QList<QWeakPointer<QGraphicsSystemCursor> > cursors = QGraphicsSystemCursor::getInstances(); + foreach (QWeakPointer<QGraphicsSystemCursor> cursor, cursors) { + if (cursor) + cursor.data()->pointerEvent(ev); + } QApplication::sendSpontaneousEvent(mouseWidget, &ev); } diff --git a/src/gui/kernel/qwidget_lite.cpp b/src/gui/kernel/qwidget_lite.cpp index 64fb6f7..ed731c0 100644 --- a/src/gui/kernel/qwidget_lite.cpp +++ b/src/gui/kernel/qwidget_lite.cpp @@ -689,6 +689,7 @@ void QWidgetPrivate::setModal_sys() #ifndef QT_NO_CURSOR void qt_lite_set_cursor(QWidget * w, bool force) { + static QCursor arrowCursor(Qt::ArrowCursor); static QPointer<QWidget> lastUnderMouse = 0; QCursor * override = QApplication::overrideCursor(); @@ -696,42 +697,46 @@ void qt_lite_set_cursor(QWidget * w, bool force) if (override && w != 0) return; - QPointer<QGraphicsSystemCursor> cursor = QGraphicsSystemCursor::getInstance(); - if (!cursor) - return; + QWidget *cursorWidget; + QCursor cursorCursor; - if (w == 0) { - if (override) { - cursor->changeCursor(override, QApplication::topLevelAt(QCursor::pos())); - return; + do { + if (w == 0) { + if (override) { + cursorCursor = *override; + cursorWidget = QApplication::topLevelAt(QCursor::pos()); + break; + } + w = QApplication::widgetAt(QCursor::pos()); + if (w == 0) // clear the override cursor while over empty space + w = QApplication::desktop(); + } else if (force) { + lastUnderMouse = w; + } else if (w->testAttribute(Qt::WA_WState_Created) && lastUnderMouse + && lastUnderMouse->effectiveWinId() == w->effectiveWinId()) { + w = lastUnderMouse; + } + if (w == QApplication::desktop() && !override) { + cursorCursor = arrowCursor; + cursorWidget = w; + break; } - w = QApplication::widgetAt(QCursor::pos()); - if (w == 0) // clear the override cursor while over empty space - w = QApplication::desktop(); - } else if (force) { - lastUnderMouse = w; - } else if (w->testAttribute(Qt::WA_WState_Created) && lastUnderMouse - && lastUnderMouse->effectiveWinId() == w->effectiveWinId()) { - w = lastUnderMouse; - } - - if (w == QApplication::desktop() && !override) { - QCursor c(Qt::ArrowCursor); - cursor->changeCursor(&c, w); - return; - } - QWidget * curWin = QApplication::activeWindow(); - if (!curWin && w && w->internalWinId()) - return; - QWidget* cW = w && !w->internalWinId() ? w : curWin; + QWidget * curWin = QApplication::activeWindow(); + if (!curWin && w && w->internalWinId()) + return; + QWidget* cW = w && !w->internalWinId() ? w : curWin; - if (!cW || cW->window() != w->window() || - !cW->isVisible() || !cW->underMouse() || override) - return; + if (!cW || cW->window() != w->window() || + !cW->isVisible() || !cW->underMouse() || override) + return; - QCursor c = w->cursor(); - cursor->changeCursor(&c, w); + cursorCursor = w->cursor(); + cursorWidget = w; + } while (0); + foreach (QWeakPointer<QGraphicsSystemCursor> cursor, QGraphicsSystemCursor::getInstances()) + if (cursor) + cursor.data()->changeCursor(&cursorCursor, cursorWidget); } #endif //QT_NO_CURSOR diff --git a/src/gui/painting/qgraphicssystemcursor_lite.cpp b/src/gui/painting/qgraphicssystemcursor_lite.cpp index 4c97948..623a75a 100644 --- a/src/gui/painting/qgraphicssystemcursor_lite.cpp +++ b/src/gui/painting/qgraphicssystemcursor_lite.cpp @@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE -QPointer<QGraphicsSystemCursor> QGraphicsSystemCursor::instance = 0; +QList <QWeakPointer<QGraphicsSystemCursor> > QGraphicsSystemCursor::instances; /*! \class QGraphicsSystemCursor @@ -98,7 +98,7 @@ QPointer<QGraphicsSystemCursor> QGraphicsSystemCursor::instance = 0; QGraphicsSystemCursor::QGraphicsSystemCursor(QPlatformScreen *scr ) : screen(scr) { - instance = this; + instances.append(this); } // End of display and pointer event handling code diff --git a/src/gui/painting/qgraphicssystemcursor_lite.h b/src/gui/painting/qgraphicssystemcursor_lite.h index 1f4cfd6..a8a574e 100644 --- a/src/gui/painting/qgraphicssystemcursor_lite.h +++ b/src/gui/painting/qgraphicssystemcursor_lite.h @@ -44,10 +44,10 @@ #include <QList> #include <QImage> #include <QMouseEvent> -#include <QPointer> +#include <QWeakPointer> #include <QObject> -#include "qgraphicssystem_p.h" #include <QPlatformScreen> +#include <QCursor> QT_BEGIN_NAMESPACE @@ -75,13 +75,12 @@ public: virtual void pointerEvent(const QMouseEvent & event) { Q_UNUSED(event); } virtual void changeCursor(QCursor * widgetCursor, QWidget * widget) = 0; - static QPointer<QGraphicsSystemCursor> getInstance() { return instance; } - protected: QPlatformScreen* screen; // Where to request an update private: - static QPointer<QGraphicsSystemCursor> instance; // limit 1 cursor at a time + static QList<QWeakPointer<QGraphicsSystemCursor> > getInstances() { return instances; } + static QList<QWeakPointer<QGraphicsSystemCursor> > instances; friend void qt_lite_set_cursor(QWidget * w, bool force); friend class QApplicationPrivate; }; diff --git a/src/plugins/platforms/fb_base/fb_base.h b/src/plugins/platforms/fb_base/fb_base.h index 2b32209..13638a0 100644 --- a/src/plugins/platforms/fb_base/fb_base.h +++ b/src/plugins/platforms/fb_base/fb_base.h @@ -8,6 +8,7 @@ #include <QGraphicsSystemCursor> #include <QPlatformScreen> #include <QPlatformWindow> +#include <QtGui/private/qwindowsurface_p.h> class QMouseEvent; class QSize; |