summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Katz <jeremy.katz@nokia.com>2010-05-05 11:40:19 (GMT)
committerJeremy Katz <jeremy.katz@nokia.com>2010-05-05 11:40:19 (GMT)
commit208e207925f9073fdca55f5824ce4d0051c86c6c (patch)
tree5588d7d72640e7f5ae558e2789c66f57fc224bec
parent47f886467b04ce712b4dcd90f0201720d614ff28 (diff)
downloadQt-208e207925f9073fdca55f5824ce4d0051c86c6c.zip
Qt-208e207925f9073fdca55f5824ce4d0051c86c6c.tar.gz
Qt-208e207925f9073fdca55f5824ce4d0051c86c6c.tar.bz2
allow multiple cursors
-rw-r--r--src/gui/kernel/qapplication_lite.cpp8
-rw-r--r--src/gui/kernel/qwidget_lite.cpp67
-rw-r--r--src/gui/painting/qgraphicssystemcursor_lite.cpp4
-rw-r--r--src/gui/painting/qgraphicssystemcursor_lite.h9
-rw-r--r--src/plugins/platforms/fb_base/fb_base.h1
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;