From fedce408835cafe3a301fdfcebbf877e100b1c86 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Tue, 12 Jul 2022 15:27:04 +0100 Subject: [PATCH] Workaround for EGLFS not supporting per window mouse cursor shape When hovering over the floating window edges our mouse cursor changes to resize shape, but when leaving and entering the main window the mouse cursor wasn't unset. Workaround by using a global event filter and detecting the leave. Not using QEvent::Leave as we still allow for some margin outside the floating window to count as a resize cursor --- src/private/FloatingWindow.cpp | 8 +++++++- src/private/WidgetResizeHandler.cpp | 23 ++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index 175351ba..85f7fcaa 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -230,7 +230,13 @@ void FloatingWindow::maybeCreateResizeHandler() { if (!KDDockWidgets::usesNativeDraggingAndResizing()) { setFlag(Qt::FramelessWindowHint, true); - setWidgetResizeHandler(new WidgetResizeHandler(WidgetResizeHandler::EventFilterMode::Local, WidgetResizeHandler::WindowMode::TopLevel, this)); + // EGLFS can't have different mouse cursors per window, needs global filter hack to unset when cursor leaves + const auto filterMode = isEGLFS() ? WidgetResizeHandler::EventFilterMode::Global + : WidgetResizeHandler::EventFilterMode::Local; + + setWidgetResizeHandler(new WidgetResizeHandler(filterMode, + WidgetResizeHandler::WindowMode::TopLevel, + this)); } } diff --git a/src/private/WidgetResizeHandler.cpp b/src/private/WidgetResizeHandler.cpp index e3f7cc63..5ef52ff5 100644 --- a/src/private/WidgetResizeHandler.cpp +++ b/src/private/WidgetResizeHandler.cpp @@ -88,10 +88,31 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) if (!widget) return false; + auto me = mouseEvent(e); + if (!me) + return false; + if (m_isTopLevelWindowResizer) { - if (!widget->isTopLevel() || o != mTarget) + // Case #1.0: Resizing FloatingWindow + + if (!widget->isTopLevel() || o != mTarget) { + if (m_usesGlobalEventFilter) { + // Case #1.1: FloatingWindows on EGLFS + // EGLFS doesn't support storing mouse cursor shape per window, so we need to use global filter + // do detect mouse leaving the window + if (!m_resizingInProgress) { + const QPoint globalPos = Qt5Qt6Compat::eventGlobalPos(me); + updateCursor(cursorPosition(globalPos)); + } + } + + // Case #1.2: FloatingWindows on all other platforms + // Not needed to mess with the cursor, it gets set when moving over another window. return false; + } } else if (isMDI()) { + // Case #2: Resizing an embedded MDI "Window" + // Each Frame has a WidgetResizeHandler instance. // mTarget is the Frame we want to resize. // but 'o' might not be mTarget, because we're using a global event filter.