diff --git a/src/pointer_input.cpp b/src/pointer_input.cpp index 2989fd1d8f..01d99c65ff 100644 --- a/src/pointer_input.cpp +++ b/src/pointer_input.cpp @@ -766,6 +766,7 @@ void PointerInputRedirection::updatePosition(const QPointF &pos) m_pos = p; + workspace()->setActiveCursorOutput(m_pos); updateCursorOutputs(); Q_EMIT input()->globalPointerChanged(m_pos); diff --git a/src/tablet_input.cpp b/src/tablet_input.cpp index 2725ae5b45..55aaf2b4cb 100644 --- a/src/tablet_input.cpp +++ b/src/tablet_input.cpp @@ -70,6 +70,7 @@ void TabletInputRedirection::tabletToolEvent(KWin::InputRedirection::TabletEvent } update(); + workspace()->setActiveCursorOutput(pos); const auto button = m_tipDown ? Qt::LeftButton : Qt::NoButton; diff --git a/src/touch_input.cpp b/src/touch_input.cpp index 5eefc81f30..e088113a41 100644 --- a/src/touch_input.cpp +++ b/src/touch_input.cpp @@ -138,6 +138,7 @@ void TouchInputRedirection::processDown(qint32 id, const QPointF &pos, std::chro m_activeTouchPoints.insert(id); if (m_activeTouchPoints.count() == 1) { update(); + workspace()->setActiveCursorOutput(pos); } input()->setLastInputHandler(this); input()->processSpies(std::bind(&InputEventSpy::touchDown, std::placeholders::_1, id, pos, time)); diff --git a/src/workspace.cpp b/src/workspace.cpp index 69a90bb895..9f6d59065c 100644 --- a/src/workspace.cpp +++ b/src/workspace.cpp @@ -1566,6 +1566,9 @@ void Workspace::updateOutputs(const QVector &outputOrder) if (!m_activeOutput || !m_outputs.contains(m_activeOutput)) { setActiveOutput(m_outputs[0]); } + if (!m_outputs.contains(m_activeCursorOutput)) { + m_activeCursorOutput = nullptr; + } if (!outputOrder.empty()) { setOutputOrder(outputOrder); @@ -2772,7 +2775,11 @@ QVector Workspace::outputOrder() const Output *Workspace::activeOutput() const { if (options->activeMouseScreen()) { - return outputAt(Cursors::self()->mouse()->pos()); + if (m_activeCursorOutput) { + return m_activeCursorOutput; + } else { + return outputAt(Cursors::self()->mouse()->pos()); + } } if (m_activeWindow && !m_activeWindow->isOnOutput(m_activeOutput)) { @@ -2792,6 +2799,16 @@ void Workspace::setActiveOutput(const QPointF &pos) setActiveOutput(outputAt(pos)); } +void Workspace::setActiveCursorOutput(Output *output) +{ + m_activeCursorOutput = output; +} + +void Workspace::setActiveCursorOutput(const QPointF &pos) +{ + setActiveCursorOutput(outputAt(pos)); +} + /** * \a window is moved around to position \a pos. This gives the * workspace the opportunity to interveniate and to implement diff --git a/src/workspace.h b/src/workspace.h index fd15ae519c..ba01d5382f 100644 --- a/src/workspace.h +++ b/src/workspace.h @@ -182,6 +182,8 @@ public: Output *activeOutput() const; void setActiveOutput(Output *output); void setActiveOutput(const QPointF &pos); + void setActiveCursorOutput(Output *output); + void setActiveCursorOutput(const QPointF &pos); /** * Returns the active window, i.e. the window that has the focus (or None @@ -678,6 +680,7 @@ private: QList m_outputs; Output *m_activeOutput = nullptr; + Output *m_activeCursorOutput = nullptr; QString m_outputsHash; QVector m_outputOrder;