From 02d361b54136120c6e1110e8c636a702d495e356 Mon Sep 17 00:00:00 2001 From: pixl Date: Wed, 8 Jul 2020 17:12:37 -0400 Subject: [PATCH] Add ToggleHiresScroll action --- src/logid/CMakeLists.txt | 1 + src/logid/actions/Action.cpp | 3 ++ src/logid/actions/ToggleHiresScroll.cpp | 64 +++++++++++++++++++++++++ src/logid/actions/ToggleHiresScroll.h | 48 +++++++++++++++++++ src/logid/features/HiresScroll.cpp | 10 ++++ src/logid/features/HiresScroll.h | 3 ++ 6 files changed, 129 insertions(+) create mode 100644 src/logid/actions/ToggleHiresScroll.cpp create mode 100644 src/logid/actions/ToggleHiresScroll.h diff --git a/src/logid/CMakeLists.txt b/src/logid/CMakeLists.txt index a8f76ad..052ba5c 100644 --- a/src/logid/CMakeLists.txt +++ b/src/logid/CMakeLists.txt @@ -22,6 +22,7 @@ add_executable(logid features/RemapButton.cpp actions/Action.cpp actions/KeypressAction.cpp + actions/ToggleHiresScroll.cpp actions/ToggleSmartShift.cpp backend/Error.cpp backend/raw/DeviceMonitor.cpp diff --git a/src/logid/actions/Action.cpp b/src/logid/actions/Action.cpp index b60a37d..5f52987 100644 --- a/src/logid/actions/Action.cpp +++ b/src/logid/actions/Action.cpp @@ -21,6 +21,7 @@ #include "../util/log.h" #include "KeypressAction.h" #include "ToggleSmartShift.h" +#include "ToggleHiresScroll.h" using namespace logid; using namespace logid::actions; @@ -50,6 +51,8 @@ std::shared_ptr Action::makeAction(Device *device, libconfig::Setting return std::make_shared(device, setting); else if(type == "togglesmartshift") return std::make_shared(device, setting); + else if(type == "togglehiresscroll") + return std::make_shared(device, setting); else throw InvalidAction(type); diff --git a/src/logid/actions/ToggleHiresScroll.cpp b/src/logid/actions/ToggleHiresScroll.cpp new file mode 100644 index 0000000..6dc9703 --- /dev/null +++ b/src/logid/actions/ToggleHiresScroll.cpp @@ -0,0 +1,64 @@ +/* + * Copyright 2019-2020 PixlOne + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "ToggleHiresScroll.h" +#include "../Device.h" +#include "../util/log.h" +#include "../util/thread.h" +#include "../backend/hidpp20/features/ReprogControls.h" + +using namespace logid::actions; +using namespace logid::backend; + +ToggleHiresScroll::ToggleHiresScroll(Device *dev, libconfig::Setting &config) : + Action (dev), _config (dev, config) +{ + _hires_scroll = _device->getFeature("hiresscroll"); + if(!_hires_scroll) + logPrintf(WARN, "%s:%d: HiresScroll feature not found, cannot use " + "ToggleHiresScroll action.", + _device->hidpp20().devicePath().c_str(), + _device->hidpp20().devicePath().c_str()); +} + +void ToggleHiresScroll::press() +{ + _pressed = true; + if(_hires_scroll) + { + thread::spawn([hires=this->_hires_scroll](){ + auto mode = hires->getMode(); + mode ^= backend::hidpp20::HiresScroll::HiRes; + hires->setMode(mode); + }); + } +} + +void ToggleHiresScroll::release() +{ + _pressed = false; +} + +uint8_t ToggleHiresScroll::reprogFlags() const +{ + return hidpp20::ReprogControls::TemporaryDiverted; +} + +ToggleHiresScroll::Config::Config(Device *device, libconfig::Setting &root) : + Action::Config(device) +{ +} \ No newline at end of file diff --git a/src/logid/actions/ToggleHiresScroll.h b/src/logid/actions/ToggleHiresScroll.h new file mode 100644 index 0000000..39377f5 --- /dev/null +++ b/src/logid/actions/ToggleHiresScroll.h @@ -0,0 +1,48 @@ +/* + * Copyright 2019-2020 PixlOne + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifndef LOGID_ACTION_TOGGLEHIRESSCROLL_H +#define LOGID_ACTION_TOGGLEHIRESSCROLL_H + +#include "Action.h" +#include "../features/HiresScroll.h" + +namespace logid { +namespace actions +{ + class ToggleHiresScroll : public Action + { + public: + ToggleHiresScroll(Device* dev, libconfig::Setting& config); + + virtual void press(); + virtual void release(); + + virtual uint8_t reprogFlags() const; + + class Config : public Action::Config + { + public: + explicit Config(Device* device, libconfig::Setting& root); + }; + protected: + Config _config; + std::shared_ptr _hires_scroll; + }; +}} + +#endif //LOGID_ACTION_TOGGLEHIRESSCROLL_H diff --git a/src/logid/features/HiresScroll.cpp b/src/logid/features/HiresScroll.cpp index 7accd6d..e21a8b0 100644 --- a/src/logid/features/HiresScroll.cpp +++ b/src/logid/features/HiresScroll.cpp @@ -39,6 +39,16 @@ void HiresScroll::listen() ///TODO: Map hires scroll events } +uint8_t HiresScroll::getMode() +{ + return _hires_scroll.getMode(); +} + +void HiresScroll::setMode(uint8_t mode) +{ + _hires_scroll.setMode(mode); +} + HiresScroll::Config::Config(Device *dev) : DeviceFeature::Config(dev) { try { diff --git a/src/logid/features/HiresScroll.h b/src/logid/features/HiresScroll.h index 6eaf356..7e81c97 100644 --- a/src/logid/features/HiresScroll.h +++ b/src/logid/features/HiresScroll.h @@ -31,6 +31,9 @@ namespace features virtual void configure(); virtual void listen(); + uint8_t getMode(); + void setMode(uint8_t mode); + class Config : public DeviceFeature::Config { public: