From 9af666f8633cd824686058fe43dcf841978b5f43 Mon Sep 17 00:00:00 2001 From: pixl Date: Thu, 27 Apr 2023 13:47:14 -0400 Subject: [PATCH] Add ChangeHostAction IPC interface --- src/logid/actions/Action.cpp | 11 ++----- src/logid/actions/ChangeDPI.cpp | 6 ++-- src/logid/actions/ChangeDPI.h | 7 ++--- src/logid/actions/ChangeHostAction.cpp | 42 ++++++++++++++++++++++---- src/logid/actions/ChangeHostAction.h | 9 ++++-- src/logid/actions/CycleDPI.cpp | 3 +- src/logid/actions/CycleDPI.h | 7 ++--- 7 files changed, 54 insertions(+), 31 deletions(-) diff --git a/src/logid/actions/Action.cpp b/src/logid/actions/Action.cpp index 26601d7..de0b935 100644 --- a/src/logid/actions/Action.cpp +++ b/src/logid/actions/Action.cpp @@ -58,31 +58,26 @@ std::shared_ptr _makeAction( { if(name == ChangeDPI::interface_name) { config = config::ChangeDPI(); - return Action::makeAction(device, config.value(), parent); } else if(name == ChangeHostAction::interface_name) { config = config::ChangeHost(); - return Action::makeAction(device, config.value(), parent); } else if(name == CycleDPI::interface_name) { config = config::CycleDPI(); - return Action::makeAction(device, config.value(), parent); } else if(name == KeypressAction::interface_name) { config = config::KeypressAction(); - return Action::makeAction(device, config.value(), parent); } else if(name == NullAction::interface_name) { config = config::NoAction(); - return Action::makeAction(device, config.value(), parent); + } else if(name == ChangeHostAction::interface_name) { + config = config::ChangeHost(); } else if(name == ToggleHiresScroll::interface_name) { config = config::ToggleHiresScroll(); - return Action::makeAction(device, config.value(), parent); } else if(name == ToggleSmartShift::interface_name) { config = config::ToggleHiresScroll(); - return Action::makeAction(device, config.value(), parent); } else if(name == "Default") { config.reset(); return nullptr; } - throw InvalidAction(); + return Action::makeAction(device, config.value(), parent); } std::shared_ptr Action::makeAction( diff --git a/src/logid/actions/ChangeDPI.cpp b/src/logid/actions/ChangeDPI.cpp index 5447985..3d4ee6f 100644 --- a/src/logid/actions/ChangeDPI.cpp +++ b/src/logid/actions/ChangeDPI.cpp @@ -18,8 +18,6 @@ #include "ChangeDPI.h" #include "../Device.h" #include "../util/task.h" -#include "../util/log.h" -#include "../backend/hidpp20/Error.h" #include "../backend/hidpp20/features/ReprogControls.h" using namespace logid::actions; @@ -28,7 +26,7 @@ const char* ChangeDPI::interface_name = "ChangeDPI"; ChangeDPI::ChangeDPI( Device *device, config::ChangeDPI& config, - const std::shared_ptr& parent) : + [[maybe_unused]] const std::shared_ptr& parent) : Action(device, interface_name, { { {"GetConfig", {this, &ChangeDPI::getConfig, {"change", "sensor"}}}, @@ -44,7 +42,7 @@ ChangeDPI::ChangeDPI( _device->hidpp20().deviceIndex()); } -std::tuple ChangeDPI::getConfig() +std::tuple ChangeDPI::getConfig() const { return {_config.inc.value_or(0), _config.sensor.value_or(0)}; } diff --git a/src/logid/actions/ChangeDPI.h b/src/logid/actions/ChangeDPI.h index 041eb56..1a0db62 100644 --- a/src/logid/actions/ChangeDPI.h +++ b/src/logid/actions/ChangeDPI.h @@ -22,8 +22,7 @@ #include "Action.h" #include "../features/DPI.h" -namespace logid { - namespace actions { +namespace logid::actions { class ChangeDPI : public Action { public: @@ -35,7 +34,7 @@ namespace logid { virtual void press(); virtual void release(); - std::tuple getConfig(); + [[nodiscard]] std::tuple getConfig() const; void setChange(int16_t change); void setSensor(uint8_t sensor, bool reset); @@ -45,6 +44,6 @@ namespace logid { config::ChangeDPI& _config; std::shared_ptr _dpi; }; - }} + } #endif //LOGID_ACTION_CHANGEDPI_H \ No newline at end of file diff --git a/src/logid/actions/ChangeHostAction.cpp b/src/logid/actions/ChangeHostAction.cpp index 9b34830..8253d3a 100644 --- a/src/logid/actions/ChangeHostAction.cpp +++ b/src/logid/actions/ChangeHostAction.cpp @@ -29,12 +29,19 @@ const char* ChangeHostAction::interface_name = "ChangeHost"; ChangeHostAction::ChangeHostAction( Device *device, config::ChangeHost& config, [[maybe_unused]] const std::shared_ptr& parent) - : Action(device, interface_name), _config (config) + : Action(device, interface_name, { + { + {"GetHost", {this, &ChangeHostAction::getHost, {"host"}}}, + {"SetHost", {this, &ChangeHostAction::setHost, {"host"}}} + }, {}, {} + }), _config (config) { - if(std::holds_alternative(_config.host.value())) { - auto& host = std::get(_config.host.value()); - std::transform(host.begin(), host.end(), - host.begin(), ::tolower); + if (_config.host.has_value()) { + if(std::holds_alternative(_config.host.value())) { + auto& host = std::get(_config.host.value()); + std::transform(host.begin(), host.end(), + host.begin(), ::tolower); + } } try { _change_host = std::make_shared(&device->hidpp20()); @@ -45,6 +52,29 @@ ChangeHostAction::ChangeHostAction( } } +std::string ChangeHostAction::getHost() const +{ + if(_config.host.has_value()) { + if (std::holds_alternative(_config.host.value())) + return std::get(_config.host.value()); + else + return std::to_string(std::get(_config.host.value())); + } else { + return ""; + } +} + +void ChangeHostAction::setHost(std::string host) +{ + std::transform(host.begin(), host.end(), + host.begin(), ::tolower); + if (host == "next" || host == "prev" || host == "previous") { + _config.host = std::move(host); + } else { + _config.host = std::stoi(host); + } +} + void ChangeHostAction::press() { // Do nothing, wait until release @@ -70,7 +100,7 @@ void ChangeHostAction::release() } next_host %= host_info.hostCount; if(next_host != host_info.currentHost) - _change_host->setHost(next_host-1); + _change_host->setHost(next_host); }); } } diff --git a/src/logid/actions/ChangeHostAction.h b/src/logid/actions/ChangeHostAction.h index 1f26f04..1a5cdb9 100644 --- a/src/logid/actions/ChangeHostAction.h +++ b/src/logid/actions/ChangeHostAction.h @@ -22,8 +22,7 @@ #include "Action.h" #include "../backend/hidpp20/features/ChangeHost.h" -namespace logid { -namespace actions +namespace logid::actions { class ChangeHostAction : public Action { @@ -36,12 +35,16 @@ namespace actions virtual void press(); virtual void release(); + + [[nodiscard]] std::string getHost() const; + void setHost(std::string host); + virtual uint8_t reprogFlags() const; protected: std::shared_ptr _change_host; config::ChangeHost& _config; }; -}} +} #endif //LOGID_ACTION_CHANGEHOSTACTION_H diff --git a/src/logid/actions/CycleDPI.cpp b/src/logid/actions/CycleDPI.cpp index dd78acc..615291f 100644 --- a/src/logid/actions/CycleDPI.cpp +++ b/src/logid/actions/CycleDPI.cpp @@ -49,9 +49,8 @@ CycleDPI::CycleDPI(Device* device, config::CycleDPI& config, } } -std::vector CycleDPI::getDPIs() +std::vector CycleDPI::getDPIs() const { - std::lock_guard lock(_dpi_lock); auto dpis = _config.dpis.value_or(std::list()); return {dpis.begin(), dpis.end()}; } diff --git a/src/logid/actions/CycleDPI.h b/src/logid/actions/CycleDPI.h index d55e9f3..e1a66cd 100644 --- a/src/logid/actions/CycleDPI.h +++ b/src/logid/actions/CycleDPI.h @@ -22,8 +22,7 @@ #include "Action.h" #include "../features/DPI.h" -namespace logid { -namespace actions { +namespace logid::actions { class CycleDPI : public Action { public: @@ -35,7 +34,7 @@ namespace actions { virtual void press(); virtual void release(); - std::vector getDPIs(); + [[nodiscard]] std::vector getDPIs() const; void setDPIs(const std::vector& dpis); virtual uint8_t reprogFlags() const; @@ -46,6 +45,6 @@ namespace actions { std::shared_ptr _dpi; std::list::const_iterator _current_dpi; }; -}} +} #endif //LOGID_ACTION_CYCLEDPI_H \ No newline at end of file