/* Internal function called from QWidget::setCursor() force is true if this function is called from dispatchEnterLeave, it means that the mouse is actually directly under this widget. */ void qt_symbian_set_cursor(QWidget *w, bool force) { static QPointer<QWidget> lastUnderMouse = 0; if (force) { lastUnderMouse = w; } else if (w->testAttribute(Qt::WA_WState_Created) && lastUnderMouse && lastUnderMouse->effectiveWinId() == w->effectiveWinId()) { w = lastUnderMouse; } if (!S60->curWin && w && w->internalWinId()) return; QWidget* cW = w && !w->internalWinId() ? w : QWidget::find(S60->curWin); if (!cW || cW->window() != w->window() || !cW->isVisible() || !cW->underMouse() || QApplication::overrideCursor()) return; #ifndef Q_SYMBIAN_FIXED_POINTER_CURSORS if (S60->brokenPointerCursors) qt_symbian_set_pointer_sprite(cW->cursor()); else #endif qt_symbian_setWindowCursor(cW->cursor(), w->effectiveWinId()); }
void qt_qpa_set_cursor(QWidget *w, bool force) { if (!w->testAttribute(Qt::WA_WState_Created)) return; static QPointer<QWidget> lastUnderMouse = 0; if (force) { lastUnderMouse = w; } else if (lastUnderMouse) { const WId lastWinId = lastUnderMouse->effectiveWinId(); const WId winId = w->effectiveWinId(); if (lastWinId && lastWinId == winId) w = lastUnderMouse; } else if (!w->internalWinId()) { return; // The mouse is not under this widget, and it's not native, so don't change it. } while (!w->internalWinId() && w->parentWidget() && !w->isWindow() && !w->testAttribute(Qt::WA_SetCursor)) w = w->parentWidget(); QWidget *nativeParent = w; if (!w->internalWinId()) nativeParent = w->nativeParentWidget(); if (!nativeParent || !nativeParent->internalWinId()) return; if (w->isWindow() || w->testAttribute(Qt::WA_SetCursor)) { if (w->isEnabled()) applyCursor(nativeParent, w->cursor()); else // Enforce the windows behavior of clearing the cursor on // disabled widgets. unsetCursor(nativeParent); } else { unsetCursor(nativeParent); } }