ButtonRebindsFilter: Support disabled buttons
It's sometimes wanted that you disable certain buttons on the device, such as an annoyingly place side button on a drawing tablet. This now makes it possible to do so by putting "Disabled" in the config. The rebind filter will then ensure the events are stopped and none are emitted.
This commit is contained in:
parent
5b17454aa5
commit
09003d03bc
2 changed files with 27 additions and 2 deletions
|
@ -224,16 +224,26 @@ bool ButtonRebindsFilter::tabletToolButtonEvent(uint button, bool pressed, const
|
||||||
|
|
||||||
void ButtonRebindsFilter::insert(TriggerType type, const Trigger &trigger, const QStringList &entry)
|
void ButtonRebindsFilter::insert(TriggerType type, const Trigger &trigger, const QStringList &entry)
|
||||||
{
|
{
|
||||||
if (entry.size() != 2) {
|
if (entry.empty()) {
|
||||||
qCWarning(KWIN_BUTTONREBINDS) << "Failed to rebind to" << entry;
|
qCWarning(KWIN_BUTTONREBINDS) << "Failed to rebind to" << entry;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (entry.first() == QLatin1String("Key")) {
|
if (entry.first() == QLatin1String("Key")) {
|
||||||
|
if (entry.size() != 2) {
|
||||||
|
qCWarning(KWIN_BUTTONREBINDS) << "Invalid key" << entry;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const auto keys = QKeySequence::fromString(entry.at(1), QKeySequence::PortableText);
|
const auto keys = QKeySequence::fromString(entry.at(1), QKeySequence::PortableText);
|
||||||
if (!keys.isEmpty()) {
|
if (!keys.isEmpty()) {
|
||||||
m_actions.at(type).insert(trigger, keys);
|
m_actions.at(type).insert(trigger, keys);
|
||||||
}
|
}
|
||||||
} else if (entry.first() == QLatin1String("MouseButton")) {
|
} else if (entry.first() == QLatin1String("MouseButton")) {
|
||||||
|
if (entry.size() != 2) {
|
||||||
|
qCWarning(KWIN_BUTTONREBINDS) << "Invalid mouse button" << entry;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
const MouseButton mb{entry.last().toUInt(&ok)};
|
const MouseButton mb{entry.last().toUInt(&ok)};
|
||||||
if (ok) {
|
if (ok) {
|
||||||
|
@ -242,6 +252,12 @@ void ButtonRebindsFilter::insert(TriggerType type, const Trigger &trigger, const
|
||||||
qCWarning(KWIN_BUTTONREBINDS) << "Could not convert" << entry << "into a mouse button";
|
qCWarning(KWIN_BUTTONREBINDS) << "Could not convert" << entry << "into a mouse button";
|
||||||
}
|
}
|
||||||
} else if (entry.first() == QLatin1String("TabletToolButton")) {
|
} else if (entry.first() == QLatin1String("TabletToolButton")) {
|
||||||
|
if (entry.size() != 2) {
|
||||||
|
qCWarning(KWIN_BUTTONREBINDS)
|
||||||
|
<< "Invalid tablet tool button" << entry;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
const TabletToolButton tb{entry.last().toUInt(&ok)};
|
const TabletToolButton tb{entry.last().toUInt(&ok)};
|
||||||
if (ok) {
|
if (ok) {
|
||||||
|
@ -249,6 +265,8 @@ void ButtonRebindsFilter::insert(TriggerType type, const Trigger &trigger, const
|
||||||
} else {
|
} else {
|
||||||
qCWarning(KWIN_BUTTONREBINDS) << "Could not convert" << entry << "into a mouse button";
|
qCWarning(KWIN_BUTTONREBINDS) << "Could not convert" << entry << "into a mouse button";
|
||||||
}
|
}
|
||||||
|
} else if (entry.first() == QLatin1String("Disabled")) {
|
||||||
|
m_actions.at(type).insert(trigger, DisabledButton{});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,6 +287,10 @@ bool ButtonRebindsFilter::send(TriggerType type, const Trigger &trigger, bool pr
|
||||||
if (const auto tb = std::get_if<TabletToolButton>(&action)) {
|
if (const auto tb = std::get_if<TabletToolButton>(&action)) {
|
||||||
return sendTabletToolButton(tb->button, pressed, timestamp);
|
return sendTabletToolButton(tb->button, pressed, timestamp);
|
||||||
}
|
}
|
||||||
|
if (std::get_if<DisabledButton>(&action)) {
|
||||||
|
// Intentional, we don't want to anything to anybody
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,9 @@ public:
|
||||||
{
|
{
|
||||||
quint32 button;
|
quint32 button;
|
||||||
};
|
};
|
||||||
|
struct DisabledButton
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
explicit ButtonRebindsFilter();
|
explicit ButtonRebindsFilter();
|
||||||
bool pointerEvent(KWin::MouseEvent *event, quint32 nativeButton) override;
|
bool pointerEvent(KWin::MouseEvent *event, quint32 nativeButton) override;
|
||||||
|
@ -83,7 +86,7 @@ private:
|
||||||
bool sendTabletToolButton(quint32 button, bool pressed, std::chrono::microseconds time);
|
bool sendTabletToolButton(quint32 button, bool pressed, std::chrono::microseconds time);
|
||||||
|
|
||||||
InputDevice m_inputDevice;
|
InputDevice m_inputDevice;
|
||||||
std::array<QHash<Trigger, std::variant<QKeySequence, MouseButton, TabletToolButton>>, LastType> m_actions;
|
std::array<QHash<Trigger, std::variant<QKeySequence, MouseButton, TabletToolButton, DisabledButton>>, LastType> m_actions;
|
||||||
KConfigWatcher::Ptr m_configWatcher;
|
KConfigWatcher::Ptr m_configWatcher;
|
||||||
std::optional<KWin::TabletToolId> m_tabletTool;
|
std::optional<KWin::TabletToolId> m_tabletTool;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue