summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSérgio Martins <sergio.martins@kdab.com>2022-09-25 22:15:52 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-10-29 21:05:42 +0000
commit1005cc3aadfd7331decc7d5bd1c2f2e5e5cb6d11 (patch)
tree4f9f47b9aba09121e6abe7939e23cc290f8812a0
parentdddd08e1e781d5598c890d9dd31a7c3d50dc3c18 (diff)
downloadqtbase-1005cc3aadfd7331decc7d5bd1c2f2e5e5cb6d11.tar.gz
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 Change-Id: I00eba330864c7abc31652226d55f66f4b7f44dc0 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> (cherry picked from commit 732581885fbf95f367c3fe7ee8d71e490cc6cfe3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-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);
});
}