diff options
author | Sergio Martins <sergio.martins@kdab.com> | 2022-08-01 16:16:45 +0100 |
---|---|---|
committer | Sergio Martins <sergio.martins@kdab.com> | 2022-08-04 02:55:27 +0100 |
commit | 40d781b7b5e7925e4559cd725ddbfef307d5f455 (patch) | |
tree | 1ed6f7e46d85a5fcd21ca1ab4094d94767b341fc /src/plugins/platforms/eglfs | |
parent | 8669949f0df98610d9e4ce71cb80368357cd78ea (diff) |
eglfs: Fix mouse events not being delivered to the frontmost window
Since QPlatformScreen::topLevelAt() wasn't implemented it would just fallback
to use QGuiApplication's window list.
Possibly fixes any other bug that relied on QApplication::topLevelAt().
The fix is to consult the compositor, which has proper z-order information,
unlike QGuiApplicationPrivate::window_list.
Task-Id: QTBUG-105256
Pick-to: 6.3 6.4
Change-Id: I4202dd5d87e41b69c461c808d29b809af5b52d09
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/plugins/platforms/eglfs')
-rw-r--r-- | src/plugins/platforms/eglfs/api/qeglfsscreen.cpp | 18 | ||||
-rw-r--r-- | src/plugins/platforms/eglfs/api/qeglfsscreen_p.h | 2 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp b/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp index b081406258..a6345f693d 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp @@ -212,4 +212,22 @@ QPixmap QEglFSScreen::grabWindow(WId wid, int x, int y, int width, int height) c return QPixmap(); } +QWindow *QEglFSScreen::topLevelAt(const QPoint &point) const +{ +#ifndef QT_NO_OPENGL + QOpenGLCompositor *compositor = QOpenGLCompositor::instance(); + const QList<QOpenGLCompositorWindow *> windows = compositor->windows(); + const int windowCount = windows.size(); + + // Higher z-order is at the end of the list + for (int i = windowCount - 1; i >= 0; i--) { + QWindow *window = windows[i]->sourceWindow(); + if (window->isVisible() && window->geometry().contains(point)) + return window; + } +#endif + + return QPlatformScreen::topLevelAt(point); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/api/qeglfsscreen_p.h b/src/plugins/platforms/eglfs/api/qeglfsscreen_p.h index 8f1eb91206..bbfc9a9259 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsscreen_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfsscreen_p.h @@ -54,6 +54,8 @@ public: void handleCursorMove(const QPoint &pos); + QWindow *topLevelAt(const QPoint &point) const override; + private: void setPrimarySurface(EGLSurface surface); |