diff --git a/src/Platform.h b/src/Platform.h index b068e3e7..89ceda19 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -164,6 +164,9 @@ public: /// and see what's goign on virtual void tests_wait(int ms) = 0; + /// @brief Return whether we use the global event filter based mouse grabber + virtual bool usesFallbackMouseGrabber() const = 0; + virtual void installMessageHandler() = 0; virtual void uninstallMessageHandler() = 0; diff --git a/src/private/DragController.cpp b/src/private/DragController.cpp index 68654b15..521e50b8 100644 --- a/src/private/DragController.cpp +++ b/src/private/DragController.cpp @@ -618,7 +618,7 @@ DragController::DragController(QObject *parent) m_stateDraggingMDI->addTransition(this, &DragController::dragCanceled, m_stateNone); m_stateDraggingMDI->addTransition(this, &DragController::mdiPopOut, stateDragging); - if (usesFallbackMouseGrabber()) + if (Platform::instance()->usesFallbackMouseGrabber()) enableFallbackMouseGrabber(); setCurrentState(m_stateNone); diff --git a/src/private/Utils_p.h b/src/private/Utils_p.h index 70847857..5bd5e2b6 100644 --- a/src/private/Utils_p.h +++ b/src/private/Utils_p.h @@ -106,19 +106,6 @@ inline bool isNormalWindowState(Qt::WindowStates states) return !(states & Qt::WindowMaximized) && !(states & Qt::WindowFullScreen); } -inline bool usesFallbackMouseGrabber() -{ -#ifdef KDDOCKWIDGETS_QTWIDGETS - // Will use QWidget::grabMouse() - return false; -#else - // For QtQuick we use the global event filter as mouse delivery is flaky - // For example, the same QQuickItem that receives the press isn't receiving the mouse moves - // when the top-level window moves. - return true; -#endif -} - inline bool windowManagerHasTranslucency() { if (qEnvironmentVariableIsSet("KDDW_NO_TRANSLUCENCY") || (Config::self().internalFlags() & Config::InternalFlag_DisableTranslucency)) diff --git a/src/qtquick/Platform_qtquick.cpp b/src/qtquick/Platform_qtquick.cpp index 6d1192d3..ae14373c 100644 --- a/src/qtquick/Platform_qtquick.cpp +++ b/src/qtquick/Platform_qtquick.cpp @@ -163,3 +163,11 @@ Platform_qtquick *Platform_qtquick::instance() return static_cast(p); return nullptr; } + +bool Platform_qtquick::usesFallbackMouseGrabber() const +{ + // For QtQuick we use the global event filter as mouse delivery is flaky + // For example, the same QQuickItem that receives the press isn't receiving the mouse moves + // when the top-level window moves. + return true; +} diff --git a/src/qtquick/Platform_qtquick.h b/src/qtquick/Platform_qtquick.h index 3536061e..a9b951c0 100644 --- a/src/qtquick/Platform_qtquick.h +++ b/src/qtquick/Platform_qtquick.h @@ -40,6 +40,7 @@ public: void setQmlEngine(QQmlEngine *); QQmlEngine *qmlEngine() const; View *createView(View *parent = nullptr) const override; + bool usesFallbackMouseGrabber() const override; static Platform_qtquick *instance(); #ifdef DOCKS_DEVELOPER_MODE diff --git a/src/qtwidgets/Platform_qtwidgets.cpp b/src/qtwidgets/Platform_qtwidgets.cpp index 0ad62f36..837affec 100644 --- a/src/qtwidgets/Platform_qtwidgets.cpp +++ b/src/qtwidgets/Platform_qtwidgets.cpp @@ -124,3 +124,9 @@ View *Platform_qtwidgets::createView(View *parent) const { return new Views::View_qtwidgets(nullptr, Type::None, Views::View_qtwidgets::asQWidget(parent)); } + +bool Platform_qtwidgets::usesFallbackMouseGrabber() const +{ + // For QtWidgets we just use QWidget::grabMouse() + return false; +} diff --git a/src/qtwidgets/Platform_qtwidgets.h b/src/qtwidgets/Platform_qtwidgets.h index b069f9f8..a9e9ee66 100644 --- a/src/qtwidgets/Platform_qtwidgets.h +++ b/src/qtwidgets/Platform_qtwidgets.h @@ -39,6 +39,7 @@ public: int startDragDistance() const override; View *createView(View *parent = nullptr) const override; + bool usesFallbackMouseGrabber() const override; #ifdef DOCKS_DEVELOPER_MODE explicit Platform_qtwidgets(int &argc, char **argv);