workspace: take touch and tablet into account for active output follows mouse

While not technically fitting for the name of the option, the behavior is what a user
would expect and it also matches with X11 (where the cursor goes to the touch position).
This commit is contained in:
Xaver Hugl 2022-09-26 02:14:13 +02:00
parent fb1a6ecd8d
commit 6e13e21a08
5 changed files with 24 additions and 1 deletions

View file

@ -766,6 +766,7 @@ void PointerInputRedirection::updatePosition(const QPointF &pos)
m_pos = p;
workspace()->setActiveCursorOutput(m_pos);
updateCursorOutputs();
Q_EMIT input()->globalPointerChanged(m_pos);

View file

@ -70,6 +70,7 @@ void TabletInputRedirection::tabletToolEvent(KWin::InputRedirection::TabletEvent
}
update();
workspace()->setActiveCursorOutput(pos);
const auto button = m_tipDown ? Qt::LeftButton : Qt::NoButton;

View file

@ -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));

View file

@ -1566,6 +1566,9 @@ void Workspace::updateOutputs(const QVector<Output *> &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<Output *> 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

View file

@ -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<Output *> m_outputs;
Output *m_activeOutput = nullptr;
Output *m_activeCursorOutput = nullptr;
QString m_outputsHash;
QVector<Output *> m_outputOrder;