summaryrefslogtreecommitdiffstats
path: root/src/opengl
diff options
context:
space:
mode:
authorSérgio Martins <sergio.martins@kdab.com>2022-09-25 22:15:52 +0100
committerSergio Martins <iamsergio@gmail.com>2022-10-29 19:44:10 +0100
commit732581885fbf95f367c3fe7ee8d71e490cc6cfe3 (patch)
treecd34f44a01ec6856911db4b52cd3f7f93f90b5e4 /src/opengl
parentb1df84b9d8758c7a59e722a5deb952cfa99a6dcb (diff)
eglfs: Improve z-order handling
In 9ccbbeecbd we've added basic z-order handling, so main window always stacks behind tool windows. After extensive testing we found more basic cases to be handled: - Modal windows go on top - Qt::Popup goes on top of Qt::Tool Fixes: QTBUG-105707 Pick-to: 6.4 Change-Id: I00eba330864c7abc31652226d55f66f4b7f44dc0 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/opengl')
-rw-r--r--src/opengl/qopenglcompositor.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/opengl/qopenglcompositor.cpp b/src/opengl/qopenglcompositor.cpp
index 2c2facd4b9..3e1b2aebed 100644
--- a/src/opengl/qopenglcompositor.cpp
+++ b/src/opengl/qopenglcompositor.cpp
@@ -310,14 +310,28 @@ void QOpenGLCompositor::ensureCorrectZOrder()
return true;
}
- // Case #3: One of the window is a Tool, that goes to front, as done in other QPAs
+ // Case #3: Modality gets higher Z
+ if (w1->modality() != Qt::NonModal && w2->modality() == Qt::NonModal)
+ return false;
+
+ if (w2->modality() != Qt::NonModal && w1->modality() == Qt::NonModal)
+ return true;
+
const bool isTool1 = (w1->flags() & Qt::Tool) == Qt::Tool;
const bool isTool2 = (w2->flags() & Qt::Tool) == Qt::Tool;
- if (isTool1 != isTool2) {
+ const bool isPurePopup1 = !isTool1 && (w1->flags() & Qt::Popup) == Qt::Popup;
+ const bool isPurePopup2 = !isTool2 && (w2->flags() & Qt::Popup) == Qt::Popup;
+
+ // Case #4: By pure-popup we mean menus and tooltips. Qt::Tool implies Qt::Popup
+ // and we don't want to catch QDockWidget and other tool windows just yet
+ if (isPurePopup1 != isPurePopup2)
+ return !isPurePopup1;
+
+ // Case #5: One of the window is a Tool, that goes to front, as done in other QPAs
+ if (isTool1 != isTool2)
return !isTool1;
- }
- // Case #4: Just preserve original sorting:
+ // Case #6: Just preserve original sorting:
return originalOrder.indexOf(cw1) < originalOrder.indexOf(cw2);
});
}