diff options
| author | Sérgio Martins <[email protected]> | 2022-09-25 22:15:52 +0100 | 
|---|---|---|
| committer | Sergio Martins <[email protected]> | 2022-10-29 19:44:10 +0100 | 
| commit | 732581885fbf95f367c3fe7ee8d71e490cc6cfe3 (patch) | |
| tree | cd34f44a01ec6856911db4b52cd3f7f93f90b5e4 | |
| parent | b1df84b9d8758c7a59e722a5deb952cfa99a6dcb (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 <[email protected]>
| -rw-r--r-- | src/opengl/qopenglcompositor.cpp | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/src/opengl/qopenglcompositor.cpp b/src/opengl/qopenglcompositor.cpp index 2c2facd4b93..3e1b2aebedf 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);                });  }  | 
