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.