Fix crash in QWindowPrivate::applyCursor when screen is null
QWindow::setVisible calls QWindowPrivate::applyCursor without checking if screen() returns null. This patch adds a check in QWindowPrivate::applyCursor that the screen is not null. Now that it is tested there, no need to test it from the other caller (setCursor) This patch should not change behavior of setCursor at all, it should only fix the crash when coming from setVisible Task-number: QTBUG-59528 Change-Id: I06bbdb4e04c02ac840ba637242d1f2cfde5bdd62 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
This commit is contained in:
parent
e364384d9f
commit
5cda0172e0
@ -2559,26 +2559,29 @@ void QWindowPrivate::setCursor(const QCursor *newCursor)
|
|||||||
cursor = QCursor(Qt::ArrowCursor);
|
cursor = QCursor(Qt::ArrowCursor);
|
||||||
hasCursor = false;
|
hasCursor = false;
|
||||||
}
|
}
|
||||||
// Only attempt to set cursor and emit signal if there is an actual platform cursor
|
// Only attempt to emit signal if there is an actual platform cursor
|
||||||
QScreen* screen = q->screen();
|
if (applyCursor()) {
|
||||||
if (screen && screen->handle()->cursor()) {
|
|
||||||
applyCursor();
|
|
||||||
QEvent event(QEvent::CursorChange);
|
QEvent event(QEvent::CursorChange);
|
||||||
QGuiApplication::sendEvent(q, &event);
|
QGuiApplication::sendEvent(q, &event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowPrivate::applyCursor()
|
// Apply the cursor and returns true iff the platform cursor exists
|
||||||
|
bool QWindowPrivate::applyCursor()
|
||||||
{
|
{
|
||||||
Q_Q(QWindow);
|
Q_Q(QWindow);
|
||||||
if (platformWindow) {
|
if (QScreen *screen = q->screen()) {
|
||||||
if (QPlatformCursor *platformCursor = q->screen()->handle()->cursor()) {
|
if (QPlatformCursor *platformCursor = screen->handle()->cursor()) {
|
||||||
|
if (!platformWindow)
|
||||||
|
return true;
|
||||||
QCursor *c = QGuiApplication::overrideCursor();
|
QCursor *c = QGuiApplication::overrideCursor();
|
||||||
if (!c && hasCursor)
|
if (!c && hasCursor)
|
||||||
c = &cursor;
|
c = &cursor;
|
||||||
platformCursor->changeCursor(c, q);
|
platformCursor->changeCursor(c, q);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#endif // QT_NO_CURSOR
|
#endif // QT_NO_CURSOR
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ public:
|
|||||||
void maybeQuitOnLastWindowClosed();
|
void maybeQuitOnLastWindowClosed();
|
||||||
#ifndef QT_NO_CURSOR
|
#ifndef QT_NO_CURSOR
|
||||||
void setCursor(const QCursor *c = 0);
|
void setCursor(const QCursor *c = 0);
|
||||||
void applyCursor();
|
bool applyCursor();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void deliverUpdateRequest();
|
void deliverUpdateRequest();
|
||||||
|
Loading…
Reference in New Issue
Block a user