summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorJeremy Katz <jeremy.katz@nokia.com>2009-11-12 14:39:45 (GMT)
committerJeremy Katz <jeremy.katz@nokia.com>2009-11-12 14:39:45 (GMT)
commit3ca4be160028e042691fb990ed57126add3a5448 (patch)
tree4964115fa5bbca681682a45e9cc8a5827cb821a5 /src/gui
parentf50552ccfbe9a71d798d00a2d963898c98654256 (diff)
downloadQt-3ca4be160028e042691fb990ed57126add3a5448.zip
Qt-3ca4be160028e042691fb990ed57126add3a5448.tar.gz
Qt-3ca4be160028e042691fb990ed57126add3a5448.tar.bz2
Support for override cursors, and fixed cursor change without a widget enter/leave
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/kernel/qapplication_lite.cpp10
-rw-r--r--src/gui/kernel/qwidget_lite.cpp16
-rw-r--r--src/gui/painting/qgraphicssystemcursor.cpp29
-rw-r--r--src/gui/painting/qgraphicssystemcursor.h1
4 files changed, 38 insertions, 18 deletions
diff --git a/src/gui/kernel/qapplication_lite.cpp b/src/gui/kernel/qapplication_lite.cpp
index 0ddcfab..061ac5b 100644
--- a/src/gui/kernel/qapplication_lite.cpp
+++ b/src/gui/kernel/qapplication_lite.cpp
@@ -336,14 +336,18 @@ bool QApplication::isEffectEnabled(Qt::UIEffect effect)
}
#ifndef QT_NO_CURSOR
-void QApplication::setOverrideCursor(const QCursor &)
+void QApplication::setOverrideCursor(const QCursor &cursor)
{
- // XXX
+ qApp->d_func()->cursor_list.prepend(cursor);
+ qt_lite_set_cursor(0, false);
}
void QApplication::restoreOverrideCursor()
{
- // XXX
+ if (qApp->d_func()->cursor_list.isEmpty())
+ return;
+ qApp->d_func()->cursor_list.removeFirst();
+ qt_lite_set_cursor(0, false);
}
#endif// QT_NO_CURSOR
diff --git a/src/gui/kernel/qwidget_lite.cpp b/src/gui/kernel/qwidget_lite.cpp
index a4d60a7..6a579ad 100644
--- a/src/gui/kernel/qwidget_lite.cpp
+++ b/src/gui/kernel/qwidget_lite.cpp
@@ -167,14 +167,14 @@ void QWidgetPrivate::setCursor_sys(const QCursor &cursor)
Q_UNUSED(cursor);
Q_Q(QWidget);
if (q->isVisible())
- updateCursor();
+ qt_lite_set_cursor(q, false);
}
void QWidgetPrivate::unsetCursor_sys()
{
Q_Q(QWidget);
if (q->isVisible())
- updateCursor();
+ qt_lite_set_cursor(q, false);
}
void QWidgetPrivate::updateCursor() const
@@ -652,7 +652,16 @@ void QWidgetPrivate::setModal_sys()
void qt_lite_set_cursor(QWidget * w, bool force)
{
static QPointer<QWidget> lastUnderMouse = 0;
- if (force) {
+ if (w == 0) { // override cursor stack emptied
+ QCursor * override = QApplication::overrideCursor();
+ if (override) {
+ if (QGraphicsSystemCursor::instance) {
+ QGraphicsSystemCursor::instance->changeCursor(override);
+ }
+ return;
+ }
+ w = QApplication::widgetAt(QCursor::pos());
+ } else if (force) {
lastUnderMouse = w;
} else if (w->testAttribute(Qt::WA_WState_Created) && lastUnderMouse
&& lastUnderMouse->effectiveWinId() == w->effectiveWinId()) {
@@ -663,6 +672,7 @@ void qt_lite_set_cursor(QWidget * w, bool force)
if (!curWin && w && w->internalWinId())
return;
QWidget* cW = w && !w->internalWinId() ? w : curWin;
+
if (!cW || cW->window() != w->window() ||
!cW->isVisible() || !cW->underMouse() || QApplication::overrideCursor())
return;
diff --git a/src/gui/painting/qgraphicssystemcursor.cpp b/src/gui/painting/qgraphicssystemcursor.cpp
index 91a6535..9bf5d02 100644
--- a/src/gui/painting/qgraphicssystemcursor.cpp
+++ b/src/gui/painting/qgraphicssystemcursor.cpp
@@ -105,22 +105,27 @@ void QGraphicsSystemCursor::pointerEvent(QMouseEvent & e)
screen->pointerEvent(e);
}
+void QGraphicsSystemCursor::changeCursor(QCursor * widgetCursor)
+{
+ Qt::CursorShape shape = widgetCursor->shape();
+
+ if (shape == Qt::BitmapCursor) {
+ // application supplied cursor
+ const QBitmap * map = widgetCursor->bitmap();
+ const QBitmap * mask = widgetCursor->mask();
+ QPoint spot = widgetCursor->hotSpot();
+ setCursor(map->toImage().bits(), mask->toImage().bits(), map->width(), map->height(), spot.x(), spot.y());
+ } else {
+ // system cursor
+ setCursor(shape);
+ }
+}
+
void QGraphicsSystemCursor::changeCursor(QWidget * widget)
{
if (widget) {
QCursor widgetCursor = widget->cursor();
- Qt::CursorShape shape = widgetCursor.shape();
-
- if (shape == Qt::BitmapCursor) {
- // application supplied cursor
- const QBitmap * map = widgetCursor.bitmap();
- const QBitmap * mask = widgetCursor.mask();
- QPoint spot = widgetCursor.hotSpot();
- setCursor(map->toImage().bits(), mask->toImage().bits(), map->width(), map->height(), spot.x(), spot.y());
- } else {
- // system cursor
- setCursor(shape);
- }
+ changeCursor(&widgetCursor);
} else {
// default cursor
setCursor(Qt::ArrowCursor);
diff --git a/src/gui/painting/qgraphicssystemcursor.h b/src/gui/painting/qgraphicssystemcursor.h
index cb5c471..eab7203 100644
--- a/src/gui/painting/qgraphicssystemcursor.h
+++ b/src/gui/painting/qgraphicssystemcursor.h
@@ -75,6 +75,7 @@ public:
virtual void setCursor(Qt::CursorShape shape);
virtual void pointerEvent(QMouseEvent & event);
virtual void changeCursor(QWidget * widget);
+ virtual void changeCursor(QCursor * widgetCursor);
// output methods
virtual QRect drawCursor(QPainter &);