summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/qguiapplication.cpp30
-rw-r--r--src/gui/kernel/qwindow.cpp4
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();
}