From 68cb36a2b7eb9678c3cc3316c310776426a6a25b Mon Sep 17 00:00:00 2001 From: meribdt Date: Wed, 12 Jul 2023 23:52:24 +0300 Subject: [PATCH 1/2] #3: add acceleration curve. TODO: prepare UI to configure acceleration curve --- .../logic/include/logic/MouseActioner.h | 1 + .../logic/include/logic/MouseParams.h | 1 + .../logic/src/logic/MouseActioner.cpp | 16 +++++++- NeatMouseWtl/logic/src/logic/MouseParams.cpp | 2 + .../include/neatcommon/system/Helpers.h | 40 ++++++++++++++++++- .../include/neatcommon/system/IniFiles.h | 2 + .../neatcommon/src/system/IniFiles.cpp | 17 ++++++++ 7 files changed, 76 insertions(+), 3 deletions(-) diff --git a/NeatMouseWtl/logic/include/logic/MouseActioner.h b/NeatMouseWtl/logic/include/logic/MouseActioner.h index 405cca0..b73e733 100644 --- a/NeatMouseWtl/logic/include/logic/MouseActioner.h +++ b/NeatMouseWtl/logic/include/logic/MouseActioner.h @@ -32,6 +32,7 @@ struct KeyboardButtonsStatus bool isRightBtnPressed = false; bool isMiddleBtnPressed = false; bool isUnbindBtnPressed = false; + volatile UINT moveStepCount = 0; }; /** diff --git a/NeatMouseWtl/logic/include/logic/MouseParams.h b/NeatMouseWtl/logic/include/logic/MouseParams.h index aabaf7f..86bb18c 100644 --- a/NeatMouseWtl/logic/include/logic/MouseParams.h +++ b/NeatMouseWtl/logic/include/logic/MouseParams.h @@ -25,6 +25,7 @@ struct MouseParams LONG delta = 20; LONG adelta = 1; + std::vector accelerationCurve = { 10, 20, 30, 50, 70, 90 }; KeyboardUtils::VirtualKey_t VKEnabler = VK_SCROLL; KeyboardUtils::VirtualKey_t VKMoveUp = VK_NUMPAD8; diff --git a/NeatMouseWtl/logic/src/logic/MouseActioner.cpp b/NeatMouseWtl/logic/src/logic/MouseActioner.cpp index 1c793be..fc3acae 100644 --- a/NeatMouseWtl/logic/src/logic/MouseActioner.cpp +++ b/NeatMouseWtl/logic/src/logic/MouseActioner.cpp @@ -213,8 +213,12 @@ MouseActioner::processAction(const KBDLLHOOKSTRUCT & event, bool isKeyUp) const KeyboardButtonsStatus oldStatus = _keyboardStatus; const bool result = isKeyUp ? processKeyUp(vk) : processKeyDown(vk); - // figure out the movement vector - const LONG d = _isAlternativeSpeedButtonPressed ? _mouseParams.adelta : _mouseParams.delta; + // figure out the movement vector + const LONG d = _isAlternativeSpeedButtonPressed + ? _mouseParams.adelta + : _keyboardStatus.moveStepCount < _mouseParams.accelerationCurve.size() + ? _mouseParams.accelerationCurve[_keyboardStatus.moveStepCount++] * _mouseParams.delta / 100 + : _mouseParams.delta; const LONG dx = ((_keyboardStatus.isLeftPressed || _keyboardStatus.isLeftUpPressed || _keyboardStatus.isLeftDownPressed) ? - d : 0) + ((_keyboardStatus.isRightPressed || _keyboardStatus.isRightUpPressed || _keyboardStatus.isRightDownPressed) ? d : 0); @@ -269,41 +273,49 @@ MouseActioner::processKeyUp(KeyboardUtils::VirtualKey_t vk) { _rampUpCursorMover.stopMove(); _keyboardStatus.isRightPressed = false; + _keyboardStatus.moveStepCount = 0; } else if (vk == _mouseParams.VKMoveLeft) { _rampUpCursorMover.stopMove(); _keyboardStatus.isLeftPressed = false; + _keyboardStatus.moveStepCount = 0; } else if (vk == _mouseParams.VKMoveUp) { _rampUpCursorMover.stopMove(); _keyboardStatus.isUpPressed = false; + _keyboardStatus.moveStepCount = 0; } else if (vk == _mouseParams.VKMoveDown) { _rampUpCursorMover.stopMove(); _keyboardStatus.isDownPressed = false; + _keyboardStatus.moveStepCount = 0; } else if (vk == _mouseParams.VKMoveLeftDown) { _rampUpCursorMover.stopMove(); _keyboardStatus.isLeftDownPressed = false; + _keyboardStatus.moveStepCount = 0; } else if (vk == _mouseParams.VKMoveRightDown) { _rampUpCursorMover.stopMove(); _keyboardStatus.isRightDownPressed = false; + _keyboardStatus.moveStepCount = 0; } else if (vk == _mouseParams.VKMoveLeftUp) { _rampUpCursorMover.stopMove(); _keyboardStatus.isLeftUpPressed = false; + _keyboardStatus.moveStepCount = 0; } else if (vk == _mouseParams.VKMoveRightUp) { _rampUpCursorMover.stopMove(); _keyboardStatus.isRightUpPressed = false; + _keyboardStatus.moveStepCount = 0; } else // left button up ------------------------------------------------------- diff --git a/NeatMouseWtl/logic/src/logic/MouseParams.cpp b/NeatMouseWtl/logic/src/logic/MouseParams.cpp index a534d49..7b4c273 100644 --- a/NeatMouseWtl/logic/src/logic/MouseParams.cpp +++ b/NeatMouseWtl/logic/src/logic/MouseParams.cpp @@ -43,6 +43,7 @@ bool MouseParams::Save(const std::wstring & fileName) mif.writeIntValue(L"General", L"Delta", this->delta); mif.writeIntValue(L"General", L"ADelta", this->adelta); + mif.writeIntVector(L"General", L"AccelerationCurve", this->accelerationCurve); mif.writeIntValue(L"General", L"VKEnabler", this->VKEnabler); mif.writeIntValue(L"General", L"VKAccelerated", this->VKAccelerated); @@ -90,6 +91,7 @@ bool MouseParams::Load(const std::wstring & fileName) this->delta = mif.readIntValue(L"General", L"Delta", 20); this->adelta = mif.readIntValue(L"General", L"ADelta", 1); + this->accelerationCurve = mif.readIntVector(L"General", L"AccelerationCurve", { 100 }); this->VKEnabler = mif.readIntValue(L"General", L"VKEnabler", VK_SCROLL); this->VKAccelerated = mif.readIntValue(L"General", L"VKAccelerated", kVKNone); diff --git a/NeatMouseWtl/neatcommon/include/neatcommon/system/Helpers.h b/NeatMouseWtl/neatcommon/include/neatcommon/system/Helpers.h index 1b586a8..5304e07 100644 --- a/NeatMouseWtl/neatcommon/include/neatcommon/system/Helpers.h +++ b/NeatMouseWtl/neatcommon/include/neatcommon/system/Helpers.h @@ -10,6 +10,8 @@ #pragma once #include +#include +#include namespace neatcommon { @@ -19,7 +21,6 @@ bool wstring2string(const std::wstring & wVal, std::string & outValue); bool string2wstring(const std::string & value, std::wstring & outValue); bool wstring2utf8string(const std::wstring & value, std::string & outValue); - //---------------------------------------------------------------------------- template < class T > inline T from_string_def( const std::wstring & s, T def ) @@ -39,6 +40,43 @@ inline T from_string_def( const std::wstring & s, T def ) } +//---------------------------------------------------------------------------- +template < class T > +inline std::vector vec_from_string_def(const std::wstring& s, std::vector def) +{ + T value; + std::vector result; + std::wstringstream ss(s); + try + { + while (ss >> value) + { + result.push_back(value); + } + } + catch (...) + { + return def; + } + return result; +} + + +//---------------------------------------------------------------------------- +template < class T > +inline std::wstring vector2wstring(const std::vector& v) +{ + std::wstringstream ss; + for (size_t i = 0; i < v.size(); ++i) + { + if (i != 0) + ss << " "; + ss << v[i]; + } + return ss.str(); +} + + //---------------------------------------------------------------------------- struct ProductInfo { diff --git a/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h b/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h index 7100e8e..fb8f47d 100644 --- a/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h +++ b/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h @@ -27,12 +27,14 @@ class MyIniFile void writeBoolValue(const std::wstring & section, const std::wstring & name, bool value); void writeIntValue(const std::wstring & section, const std::wstring & name, int value); void writeUIntValue(const std::wstring & section, const std::wstring & name, unsigned int value); + void writeIntVector(const std::wstring& section, const std::wstring& name, std::vector value); std::string readUtf8Value(const std::wstring & section, const std::wstring & name, const std::string & defaultValue = ""); std::wstring readStringValue(const std::wstring & section, const std::wstring & name, const std::wstring & defaultValue = L""); bool readBoolValue(const std::wstring & section, const std::wstring & name, bool defaultValue = false); int readIntValue(const std::wstring & section, const std::wstring & name, int defaultValue = 0); unsigned int readUIntValue(const std::wstring & section, const std::wstring & name, unsigned int defaultValue = 0); + std::vector readIntVector(const std::wstring & section, const std::wstring & name, std::vector defaultValue = { 100 }); const IniValueMap & getSection(const std::wstring & section); void enumerateSections(std::vector & sections); diff --git a/NeatMouseWtl/neatcommon/src/system/IniFiles.cpp b/NeatMouseWtl/neatcommon/src/system/IniFiles.cpp index 2bf806b..b63bb43 100644 --- a/NeatMouseWtl/neatcommon/src/system/IniFiles.cpp +++ b/NeatMouseWtl/neatcommon/src/system/IniFiles.cpp @@ -13,6 +13,7 @@ #include #include "neatcommon/system/IniFiles.h" +#include "neatcommon/system/Helpers.h" namespace neatcommon { @@ -107,6 +108,13 @@ void MyIniFile::writeIntValue(const std::wstring & section, const std::wstring & } +//--------------------------------------------------------------------------------------------------------------------- +void MyIniFile::writeIntVector(const std::wstring & section, const std::wstring & name, std::vector value) +{ + writeStringValue(section, name, vector2wstring(value)); +} + + //--------------------------------------------------------------------------------------------------------------------- std::string MyIniFile::readUtf8Value(const std::wstring & section, const std::wstring & name, const std::string & defaultValue) @@ -154,6 +162,15 @@ MyIniFile::readUIntValue(const std::wstring & section, const std::wstring & name } +//--------------------------------------------------------------------------------------------------------------------- +std::vector +MyIniFile::readIntVector(const std::wstring & section, const std::wstring & name, std::vector defaultValue) +{ + const std::wstring & sValue = readStringValue(section, name); + return vec_from_string_def(sValue, defaultValue); +} + + //--------------------------------------------------------------------------------------------------------------------- int MyIniFile::readIntValue(const std::wstring & section, const std::wstring & name, int defaultValue) From b9c55aad72ccda98f72df2182bdbea08c5fb538d Mon Sep 17 00:00:00 2001 From: meribdt Date: Wed, 12 Jul 2023 23:56:56 +0300 Subject: [PATCH 2/2] #3: add spaces --- NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h b/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h index fb8f47d..127e03c 100644 --- a/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h +++ b/NeatMouseWtl/neatcommon/include/neatcommon/system/IniFiles.h @@ -27,7 +27,7 @@ class MyIniFile void writeBoolValue(const std::wstring & section, const std::wstring & name, bool value); void writeIntValue(const std::wstring & section, const std::wstring & name, int value); void writeUIntValue(const std::wstring & section, const std::wstring & name, unsigned int value); - void writeIntVector(const std::wstring& section, const std::wstring& name, std::vector value); + void writeIntVector(const std::wstring & section, const std::wstring & name, std::vector value); std::string readUtf8Value(const std::wstring & section, const std::wstring & name, const std::string & defaultValue = ""); std::wstring readStringValue(const std::wstring & section, const std::wstring & name, const std::wstring & defaultValue = L"");