mirror of
https://github.com/PixlOne/logiops.git
synced 2025-09-14 13:56:50 +08:00
Fix none gesture not working
Also fixes gestures on MX Master 3S by ignoring the first movement event. Fixes #366 and #339.
This commit is contained in:
parent
5547f52cad
commit
5e436a2bdf
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
@ -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 {
|
||||
|
@ -36,11 +36,11 @@ namespace logid::features {
|
||||
Info info, int index, Device* device, ConfigFunction conf_func,
|
||||
const std::shared_ptr<ipcgull::node>& 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<actions::Action> _action;
|
||||
const Info _info;
|
||||
|
||||
bool _first_move{};
|
||||
|
||||
std::weak_ptr<Button> _self;
|
||||
|
||||
std::shared_ptr<IPC> _ipc_interface;
|
||||
|
Loading…
Reference in New Issue
Block a user