libinput: Support switching the targetted output with a shortcut
I was told it's how artists are used to using these tablets so it makes sense to support the workflow.
This commit is contained in:
parent
77c5198dc8
commit
47c3c2d143
3 changed files with 52 additions and 2 deletions
|
@ -191,7 +191,7 @@ public:
|
||||||
{
|
{
|
||||||
return m_sysName;
|
return m_sysName;
|
||||||
}
|
}
|
||||||
QString outputName() const
|
QString outputName() const override
|
||||||
{
|
{
|
||||||
return m_outputName;
|
return m_outputName;
|
||||||
}
|
}
|
||||||
|
@ -586,7 +586,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Used to deserialize monitor data from KConfig when initializing a device
|
* Used to deserialize monitor data from KConfig when initializing a device
|
||||||
*/
|
*/
|
||||||
void setOutputName(const QString &uuid);
|
void setOutputName(const QString &uuid) override;
|
||||||
QString defaultOutputName() const
|
QString defaultOutputName() const
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -44,6 +44,15 @@ public:
|
||||||
virtual bool isTabletModeSwitch() const = 0;
|
virtual bool isTabletModeSwitch() const = 0;
|
||||||
virtual bool isLidSwitch() const = 0;
|
virtual bool isLidSwitch() const = 0;
|
||||||
|
|
||||||
|
virtual QString outputName() const
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
virtual void setOutputName(const QString &outputName)
|
||||||
|
{
|
||||||
|
Q_UNUSED(outputName)
|
||||||
|
}
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void keyChanged(quint32 key, InputRedirection::KeyboardKeyState, quint32 time, InputDevice *device);
|
void keyChanged(quint32 key, InputRedirection::KeyboardKeyState, quint32 time, InputDevice *device);
|
||||||
void pointerButtonChanged(quint32 button, InputRedirection::PointerButtonState state, quint32 time, InputDevice *device);
|
void pointerButtonChanged(quint32 button, InputRedirection::PointerButtonState state, quint32 time, InputDevice *device);
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
|
|
||||||
#include <xkbcommon/xkbcommon.h>
|
#include <xkbcommon/xkbcommon.h>
|
||||||
|
|
||||||
|
#include "osd.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
namespace KWin
|
namespace KWin
|
||||||
|
@ -2060,6 +2061,13 @@ public:
|
||||||
}
|
}
|
||||||
connect(input(), &InputRedirection::deviceAdded, this, &TabletInputFilter::integrateDevice);
|
connect(input(), &InputRedirection::deviceAdded, this, &TabletInputFilter::integrateDevice);
|
||||||
connect(input(), &InputRedirection::deviceRemoved, this, &TabletInputFilter::removeDevice);
|
connect(input(), &InputRedirection::deviceRemoved, this, &TabletInputFilter::removeDevice);
|
||||||
|
|
||||||
|
auto tabletNextOutput = new QAction(this);
|
||||||
|
tabletNextOutput->setProperty("componentName", QStringLiteral(KWIN_NAME));
|
||||||
|
tabletNextOutput->setText(i18n("Move the tablet to the next output"));
|
||||||
|
tabletNextOutput->setObjectName(QStringLiteral("Move Tablet to Next Output"));
|
||||||
|
KGlobalAccel::setGlobalShortcut(tabletNextOutput, QList<QKeySequence>());
|
||||||
|
connect(tabletNextOutput, &QAction::triggered, this, &TabletInputFilter::trackNextOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
static KWaylandServer::TabletSeatV2Interface *findTabletSeat()
|
static KWaylandServer::TabletSeatV2Interface *findTabletSeat()
|
||||||
|
@ -2105,6 +2113,39 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void trackNextOutput()
|
||||||
|
{
|
||||||
|
const auto outputs = workspace()->outputs();
|
||||||
|
if (outputs.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tabletToolCount = 0;
|
||||||
|
InputDevice *changedDevice = nullptr;
|
||||||
|
const auto devices = input()->devices();
|
||||||
|
for (const auto device : devices) {
|
||||||
|
if (!device->isTabletTool()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
tabletToolCount++;
|
||||||
|
if (device->outputName().isEmpty()) {
|
||||||
|
device->setOutputName(outputs.constFirst()->name());
|
||||||
|
changedDevice = device;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto it = std::find_if(outputs.begin(), outputs.end(), [device](const auto &output) {
|
||||||
|
return output->name() == device->outputName();
|
||||||
|
});
|
||||||
|
++it;
|
||||||
|
auto nextOutput = it == outputs.end() ? outputs.first() : *it;
|
||||||
|
device->setOutputName(nextOutput->name());
|
||||||
|
changedDevice = device;
|
||||||
|
}
|
||||||
|
OSD::show(i18np("Tablet moved to %2", "Tablets switched outputs", tabletToolCount, changedDevice->outputName()), QStringLiteral("input-tablet"), 5000);
|
||||||
|
}
|
||||||
|
|
||||||
void removeDevice(InputDevice *inputDevice)
|
void removeDevice(InputDevice *inputDevice)
|
||||||
{
|
{
|
||||||
auto device = qobject_cast<LibInput::Device *>(inputDevice);
|
auto device = qobject_cast<LibInput::Device *>(inputDevice);
|
||||||
|
|
Loading…
Reference in a new issue