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
This commit is contained in:
Sergio Martins
2022-07-12 15:27:04 +01:00
parent 5894fd54f5
commit fedce40883
2 changed files with 29 additions and 2 deletions

View File

@@ -230,7 +230,13 @@ void FloatingWindow::maybeCreateResizeHandler()
{ {
if (!KDDockWidgets::usesNativeDraggingAndResizing()) { if (!KDDockWidgets::usesNativeDraggingAndResizing()) {
setFlag(Qt::FramelessWindowHint, true); 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));
} }
} }

View File

@@ -88,10 +88,31 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e)
if (!widget) if (!widget)
return false; return false;
if (m_isTopLevelWindowResizer) { auto me = mouseEvent(e);
if (!widget->isTopLevel() || o != mTarget) if (!me)
return false; return false;
if (m_isTopLevelWindowResizer) {
// 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()) { } else if (isMDI()) {
// Case #2: Resizing an embedded MDI "Window"
// Each Frame has a WidgetResizeHandler instance. // Each Frame has a WidgetResizeHandler instance.
// mTarget is the Frame we want to resize. // mTarget is the Frame we want to resize.
// but 'o' might not be mTarget, because we're using a global event filter. // but 'o' might not be mTarget, because we're using a global event filter.