From 5e436a2bdf4b36473e3a258bdd187a6fbfba7344 Mon Sep 17 00:00:00 2001 From: pixl Date: Wed, 3 May 2023 18:38:46 -0400 Subject: [PATCH] Fix none gesture not working Also fixes gestures on MX Master 3S by ignoring the first movement event. Fixes #366 and #339. --- src/logid/actions/GestureAction.cpp | 32 ++++++++++++++--------- src/logid/actions/gesture/NullGesture.cpp | 2 +- src/logid/features/RemapButton.cpp | 9 ++++--- src/logid/features/RemapButton.h | 6 +++-- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/logid/actions/GestureAction.cpp b/src/logid/actions/GestureAction.cpp index b12d9be..8afceb6 100644 --- a/src/logid/actions/GestureAction.cpp +++ b/src/logid/actions/GestureAction.cpp @@ -92,6 +92,12 @@ GestureAction::GestureAction(Device* dev, config::GestureAction& config, direction,Gesture::makeGesture( dev, x.second, _node->make_child(fromDirection(direction)))); + if (direction == None) { + auto& gesture = x.second; + std::visit([](auto&& x) { + x.threshold.emplace(0); + }, gesture); + } } catch (std::invalid_argument& e) { logPrintf(WARN, "%s is not a direction", x.first.c_str()); } @@ -122,7 +128,7 @@ void GestureAction::release() { } for (auto& gesture: _gestures) { - if (gesture.first == d) + if (gesture.first == d || gesture.first == None) continue; if (!threshold_met) { if (gesture.second->metThreshold()) { @@ -130,21 +136,15 @@ void GestureAction::release() { // secondary one. threshold_met = true; gesture.second->release(true); - break; } } else { gesture.second->release(false); } } - if (!threshold_met) { - try { - auto none = _gestures.at(None); - if (none) { - none->press(false); - none->release(false); - } - } catch (std::out_of_range& e) {} + auto none_gesture = _gestures.find(None); + if (none_gesture != _gestures.end()) { + none_gesture->second->release(!threshold_met); } } @@ -239,15 +239,23 @@ void GestureAction::setGesture(const std::string& direction, const std::string& auto dir_name = fromDirection(d); + auto& gesture = _config.gestures.value()[dir_name]; + _gestures[d].reset(); try { _gestures[d] = Gesture::makeGesture( - _device, type, _config.gestures.value()[dir_name], + _device, type, gesture, _node->make_child(dir_name)); } catch (InvalidGesture& e) { _gestures[d] = Gesture::makeGesture( - _device, _config.gestures.value()[dir_name], + _device, gesture, _node->make_child(dir_name)); throw std::invalid_argument("Invalid gesture type"); } + + if (d == None) { + std::visit([](auto&& x) { + x.threshold = 0; + }, gesture); + } } diff --git a/src/logid/actions/gesture/NullGesture.cpp b/src/logid/actions/gesture/NullGesture.cpp index 4be3cd6..9cdb39b 100644 --- a/src/logid/actions/gesture/NullGesture.cpp +++ b/src/logid/actions/gesture/NullGesture.cpp @@ -47,5 +47,5 @@ bool NullGesture::wheelCompatibility() const { } bool NullGesture::metThreshold() const { - return _axis > _config.threshold.value_or(defaults::gesture_threshold); + return _axis >= _config.threshold.value_or(defaults::gesture_threshold); } \ No newline at end of file diff --git a/src/logid/features/RemapButton.cpp b/src/logid/features/RemapButton.cpp index 199cbc6..d1f885e 100644 --- a/src/logid/features/RemapButton.cpp +++ b/src/logid/features/RemapButton.cpp @@ -220,8 +220,9 @@ void Button::_makeConfig() { } } -void Button::press() const { +void Button::press() { std::shared_lock lock(_action_lock); + _first_move = true; if (_action) _action->press(); } @@ -232,10 +233,12 @@ void Button::release() const { _action->release(); } -void Button::move(int16_t x, int16_t y) const { +void Button::move(int16_t x, int16_t y) { std::shared_lock lock(_action_lock); - if (_action) + if (_action && !_first_move) _action->move(x, y); + else if (_first_move) + _first_move = false; } bool Button::pressed() const { diff --git a/src/logid/features/RemapButton.h b/src/logid/features/RemapButton.h index 231e244..2a6bc8e 100644 --- a/src/logid/features/RemapButton.h +++ b/src/logid/features/RemapButton.h @@ -36,11 +36,11 @@ namespace logid::features { Info info, int index, Device* device, ConfigFunction conf_func, const std::shared_ptr& root, config::Button& config); - void press() const; + void press(); void release() const; - void move(int16_t x, int16_t y) const; + void move(int16_t x, int16_t y); void setProfile(config::Button& config); @@ -82,6 +82,8 @@ namespace logid::features { std::shared_ptr _action; const Info _info; + bool _first_move{}; + std::weak_ptr