summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2012-10-15 14:17:01 +0300
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-16 15:29:15 +0200
commit74230f126be4d7d6d6a91892ddb91bf050a46396 (patch)
treeab0ca7b0a1ecfbe962240e0ee61941102592b739
parentc92ceb179f609de4d3c8ec9433c9329e48214224 (diff)
Fix setting custom cursor for widgets and windows before showing them
If custom cursor was set before the window was created, it didn't actually get set, and in some cases even caused a crash. Fixed by making sure the cursor is correct when showing widget/window. Task-number: QTBUG-27535 Change-Id: I3bc946a9c406c96af5b86869a3a54893f8980aba Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Gatis Paeglis <gatis.paeglis@digia.com> Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
-rw-r--r--src/gui/kernel/qwindow.cpp34
-rw-r--r--src/gui/kernel/qwindow_p.h3
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp3
3 files changed, 25 insertions, 15 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 27e1571184..39a6603c4b 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -286,6 +286,10 @@ void QWindow::setVisible(bool visible)
QGuiApplicationPrivate::hideModalWindow(this);
}
+#ifndef QT_NO_CURSOR
+ if (visible)
+ d->applyCursor();
+#endif
d->platformWindow->setVisible(visible);
if (!visible) {
@@ -1853,11 +1857,10 @@ QCursor QWindow::cursor() const
void QWindow::setCursor(const QCursor &cursor)
{
Q_D(QWindow);
- if (QPlatformCursor *platformCursor = d->screen->handle()->cursor()) {
- d->cursor = cursor;
- QCursor *oc = QGuiApplication::overrideCursor();
- QCursor c = oc ? *oc : d->cursor;
- platformCursor->changeCursor(&c, this);
+ d->cursor = cursor;
+ // Only attempt to set cursor and emit signal if there is an actual platform cursor
+ if (d->screen->handle()->cursor()) {
+ d->applyCursor();
QEvent event(QEvent::CursorChange);
QGuiApplication::sendEvent(this, &event);
}
@@ -1868,19 +1871,20 @@ void QWindow::setCursor(const QCursor &cursor)
*/
void QWindow::unsetCursor()
{
- Q_D(QWindow);
- if (QPlatformCursor *platformCursor = d->screen->handle()->cursor()) {
- d->cursor = Qt::ArrowCursor;
- QCursor *oc = QGuiApplication::overrideCursor();
- if (!oc) {
- QCursor c = d->cursor;
- platformCursor->changeCursor(&c, this);
+ setCursor(Qt::ArrowCursor);
+}
+
+void QWindowPrivate::applyCursor()
+{
+ Q_Q(QWindow);
+ if (platformWindow) {
+ if (QPlatformCursor *platformCursor = screen->handle()->cursor()) {
+ QCursor *oc = QGuiApplication::overrideCursor();
+ QCursor c = oc ? *oc : cursor;
+ platformCursor->changeCursor(&c, q);
}
- QEvent event(QEvent::CursorChange);
- QGuiApplication::sendEvent(this, &event);
}
}
-
#endif
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h
index 57f79f1faa..159f05d1a5 100644
--- a/src/gui/kernel/qwindow_p.h
+++ b/src/gui/kernel/qwindow_p.h
@@ -97,6 +97,9 @@ public:
}
void maybeQuitOnLastWindowClosed();
+#ifndef QT_NO_CURSOR
+ void applyCursor();
+#endif
QPoint globalPosition() const {
Q_Q(const QWindow);
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp
index 86d8da254a..e7564261f9 100644
--- a/src/widgets/kernel/qwidget_qpa.cpp
+++ b/src/widgets/kernel/qwidget_qpa.cpp
@@ -547,6 +547,9 @@ void QWidgetPrivate::show_sys()
}
}
+#ifndef QT_NO_CURSOR
+ qt_qpa_set_cursor(q, false); // Needed in case cursor was set before show
+#endif
invalidateBuffer(q->rect());
window->setVisible(true);
}