From: Miikka Heikkinen Date: Mon, 15 Oct 2012 11:17:01 +0000 (+0300) Subject: Fix setting custom cursor for widgets and windows before showing them X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=74230f126be4d7d6d6a91892ddb91bf050a46396;p=profile%2Fivi%2Fqtbase.git 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 Reviewed-by: Gatis Paeglis Reviewed-by: Samuel Rødal --- diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 27e1571..39a6603 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 57f79f1..159f05d 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 86d8da2..e756426 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); }