diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-03-06 10:36:43 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-03-14 02:14:00 +0000 |
commit | 048918d4bd73886e1a8999a06b7af2cd2ddbe5f2 (patch) | |
tree | b41dc86f2f6fa3ff3fcc83361de272271835f5d4 /src/platformsupport/eglconvenience/qeglplatformscreen.cpp | |
parent | f5edf2b6fb20722bb63c8855793bc2552721748c (diff) |
eglfs: Generate enter and leave events
In addition the logic in QGuiApplication that picks the target window for input
events with a null window has to be enhanced to be compatible with how real windowing
systems work: mouse events following a press are delivered to the same window until the
release, even if the cursor has left the original target window.
Task-number: QTBUG-44814
Change-Id: I3fea84ac77a5ccebeae5def64f92d8d2e03d13ff
Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
Diffstat (limited to 'src/platformsupport/eglconvenience/qeglplatformscreen.cpp')
-rw-r--r-- | src/platformsupport/eglconvenience/qeglplatformscreen.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/platformsupport/eglconvenience/qeglplatformscreen.cpp b/src/platformsupport/eglconvenience/qeglplatformscreen.cpp index dd4a97cdf5..6e2fc81c42 100644 --- a/src/platformsupport/eglconvenience/qeglplatformscreen.cpp +++ b/src/platformsupport/eglconvenience/qeglplatformscreen.cpp @@ -32,6 +32,8 @@ ****************************************************************************/ #include "qeglplatformscreen_p.h" +#include <QtGui/qwindow.h> +#include <qpa/qwindowsysteminterface.h> #include <QtPlatformSupport/private/qopenglcompositor_p.h> QT_BEGIN_NAMESPACE @@ -45,7 +47,8 @@ QT_BEGIN_NAMESPACE */ QEGLPlatformScreen::QEGLPlatformScreen(EGLDisplay dpy) - : m_dpy(dpy) + : m_dpy(dpy), + m_pointerWindow(0) { } @@ -54,4 +57,41 @@ QEGLPlatformScreen::~QEGLPlatformScreen() QOpenGLCompositor::destroy(); } +void QEGLPlatformScreen::handleCursorMove(const QPoint &pos) +{ + const QOpenGLCompositor *compositor = QOpenGLCompositor::instance(); + const QList<QOpenGLCompositorWindow *> windows = compositor->windows(); + + // Generate enter and leave events like a real windowing system would do. + if (windows.isEmpty()) + return; + + // First window is always fullscreen. + if (windows.count() == 1) { + QWindow *window = windows[0]->sourceWindow(); + if (m_pointerWindow != window) { + m_pointerWindow = window; + QWindowSystemInterface::handleEnterEvent(window, window->mapFromGlobal(pos), pos); + } + return; + } + + QWindow *enter = 0, *leave = 0; + for (int i = windows.count() - 1; i >= 0; --i) { + QWindow *window = windows[i]->sourceWindow(); + const QRect geom = window->geometry(); + if (geom.contains(pos)) { + if (m_pointerWindow != window) { + leave = m_pointerWindow; + m_pointerWindow = window; + enter = window; + } + break; + } + } + + if (enter && leave) + QWindowSystemInterface::handleEnterLeaveEvent(enter, leave, enter->mapFromGlobal(pos), pos); +} + QT_END_NAMESPACE |