diff options
Diffstat (limited to 'src/gui/kernel')
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 30 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 4 |
2 files changed, 25 insertions, 9 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index a8a4ad1937..e1d0b1c01f 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -210,6 +210,11 @@ static inline void clearFontUnlocked() QGuiApplicationPrivate::app_font = 0; } +static inline bool isPopupWindow(const QWindow *w) +{ + return (w->flags() & Qt::WindowType_Mask) == Qt::Popup; +} + /*! \class QGuiApplication \brief The QGuiApplication class manages the GUI application's control @@ -477,26 +482,33 @@ QWindow *QGuiApplication::modalWindow() return QGuiApplicationPrivate::self->modalWindowList.first(); } -void QGuiApplicationPrivate::updateBlockedStatus(QWindow *window) +static void updateBlockedStatusRecursion(QWindow *window, bool shouldBeBlocked) { - bool shouldBeBlocked = false; - if ((window->type() & Qt::Popup) != Qt::Popup && !self->modalWindowList.isEmpty()) - shouldBeBlocked = self->isWindowBlocked(window); - - if (shouldBeBlocked != window->d_func()->blockedByModalWindow) { + QWindowPrivate *p = qt_window_private(window); + if (p->blockedByModalWindow != shouldBeBlocked) { + p->blockedByModalWindow = shouldBeBlocked; QEvent e(shouldBeBlocked ? QEvent::WindowBlocked : QEvent::WindowUnblocked); - - window->d_func()->blockedByModalWindow = shouldBeBlocked; QGuiApplication::sendEvent(window, &e); + foreach (QObject *c, window->children()) + if (c->isWindowType()) + updateBlockedStatusRecursion(static_cast<QWindow *>(c), shouldBeBlocked); } } +void QGuiApplicationPrivate::updateBlockedStatus(QWindow *window) +{ + bool shouldBeBlocked = false; + if (!isPopupWindow(window) && !self->modalWindowList.isEmpty()) + shouldBeBlocked = self->isWindowBlocked(window); + updateBlockedStatusRecursion(window, shouldBeBlocked); +} + void QGuiApplicationPrivate::showModalWindow(QWindow *modal) { self->modalWindowList.prepend(modal); // Send leave for currently entered window if it should be blocked - if (currentMouseWindow && (currentMouseWindow->type() & Qt::Popup) != Qt::Popup) { + if (currentMouseWindow && !isPopupWindow(currentMouseWindow)) { bool shouldBeBlocked = self->isWindowBlocked(currentMouseWindow); if (shouldBeBlocked) { // Remove the new window from modalWindowList temporarily so leave can go through diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 392407d86d..9ef19715ed 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -871,6 +871,10 @@ QRegion QWindow::mask() const void QWindow::requestActivate() { Q_D(QWindow); + if (flags() & Qt::WindowDoesNotAcceptFocus) { + qWarning() << "requestActivate() called for " << this << " which has Qt::WindowDoesNotAcceptFocus set."; + return; + } if (d->platformWindow) d->platformWindow->requestActivateWindow(); } |