From c0f0b9ef1d527c64c65794a8c3e5d31e8bd0bc5a Mon Sep 17 00:00:00 2001 From: TauAkiou Date: Sun, 13 Dec 2020 09:57:19 -0500 Subject: [PATCH 1/4] fix building issues under Linux --- JoyShockMapper/src/linux/InputHelpers.cpp | 4 +++ .../src/linux/PlatformDefinitions.cpp | 14 ++++---- JoyShockMapper/src/main.cpp | 36 ++++++++++++++----- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/JoyShockMapper/src/linux/InputHelpers.cpp b/JoyShockMapper/src/linux/InputHelpers.cpp index 45efd96..5f88bc3 100644 --- a/JoyShockMapper/src/linux/InputHelpers.cpp +++ b/JoyShockMapper/src/linux/InputHelpers.cpp @@ -696,6 +696,10 @@ std::string GetCWD() return pathBuffer.get(); } +bool SetCWD(in_string newCWD) { + return chdir(newCWD.c_str()) != 0; +} + DWORD ShowOnlineHelp() { ::system("xdg-open https://github.com/JibbSmart/JoyShockMapper/blob/master/README.md"); diff --git a/JoyShockMapper/src/linux/PlatformDefinitions.cpp b/JoyShockMapper/src/linux/PlatformDefinitions.cpp index cad417e..b5ac99e 100644 --- a/JoyShockMapper/src/linux/PlatformDefinitions.cpp +++ b/JoyShockMapper/src/linux/PlatformDefinitions.cpp @@ -10,7 +10,7 @@ #include "JoyShockMapper.h" #include "PlatformDefinitions.h" -const char *AUTOLOAD_FOLDER = [] { +const char *AUTOLOAD_FOLDER() { std::string directory; const auto XDG_CONFIG_HOME = getenv("XDG_CONFIG_HOME"); @@ -25,9 +25,9 @@ const char *AUTOLOAD_FOLDER = [] { directory = directory + "/JoyShockMapper/AutoLoad/"; return strdup(directory.c_str()); -}(); +}; -const char *GYRO_CONFIGS_FOLDER = [] { +const char *GYRO_CONFIGS_FOLDER() { std::string directory; const auto XDG_CONFIG_HOME = getenv("XDG_CONFIG_HOME"); @@ -42,9 +42,9 @@ const char *GYRO_CONFIGS_FOLDER = [] { directory = directory + "/JoyShockMapper/GyroConfigs/"; return strdup(directory.c_str()); -}(); +}; -const char *BASE_JSM_CONFIG_FOLDER = [] { +const char *BASE_JSM_CONFIG_FOLDER() { std::string directory; const auto XDG_CONFIG_HOME = getenv("XDG_CONFIG_HOME"); @@ -59,7 +59,7 @@ const char *BASE_JSM_CONFIG_FOLDER = [] { directory = directory + "/JoyShockMapper/"; return strdup(directory.c_str()); -}(); +}; unsigned long GetCurrentProcessId() { @@ -73,7 +73,7 @@ unsigned long GetCurrentProcessId() /// NONE /// And characters: ; ' , . / \ [ ] + - ` /// Yes, this looks slow. But it's only there to help set up faster mappings -WORD KeyCode::nameToKey(const std::string &name) +WORD nameToKey(const std::string &name) { // https://msdn.microsoft.com/en-us/library/dd375731%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 auto length = name.length(); diff --git a/JoyShockMapper/src/main.cpp b/JoyShockMapper/src/main.cpp index 9b65896..b07a15d 100644 --- a/JoyShockMapper/src/main.cpp +++ b/JoyShockMapper/src/main.cpp @@ -252,7 +252,7 @@ class DigitalButton } } // Chord stack should always include NONE which will provide a value in the loop above - throw exception("ChordStack should always include ButtonID::NONE, for the chorded variable to return the base value."); + throw runtime_error("ChordStack should always include ButtonID::NONE, for the chorded variable to return the base value."); } return _keyToRelease.get(); } @@ -505,11 +505,20 @@ void Mapping::ProcessEvent(BtnEvent evt, DigitalButton &button, in_string displa } } -void Mapping::InsertEventMapping(BtnEvent evt, OnEventAction action) -{ - auto existingActions = eventMapping.find(evt); - eventMapping[evt] = existingActions == eventMapping.end() ? action : - bind(&RunAllActions, placeholders::_1, 2, existingActions->second, action); // Chain with already existing mapping, if any +void Mapping::InsertEventMapping(BtnEvent evt, OnEventAction action) { + auto existingActions = eventMapping.find(evt); + //eventMapping[evt] = existingActions == eventMapping.end() ? action : + //bind(&RunAllActions, placeholders::_1, 2, existingActions->second, + // action); // Chain with already existing mapping, if any + + if (existingActions == eventMapping.end()) { + eventMapping[evt] = action; + } else { + eventMapping[evt] = [=](DigitalButton* btn) { + if(existingActions->second) existingActions->second(btn); + if(action) action(btn); + }; + } } bool Mapping::AddMapping(KeyCode key, EventModifier evtMod, ActionModifier actMod) @@ -581,7 +590,11 @@ bool Mapping::AddMapping(KeyCode key, EventModifier evtMod, ActionModifier actMo case ActionModifier::Instant: { OnEventAction action2 = bind(&DigitalButton::RegisterInstant, placeholders::_1, applyEvt); - apply = bind(&Mapping::RunAllActions, placeholders::_1, 2, apply, action2); + //apply = bind(&Mapping::RunAllActions, placeholders::_1, 2, apply, action2); + apply = [=](DigitalButton* btn) { + if(apply) apply(btn); + if(action2) action2(btn); + }; releaseEvt = BtnEvent::OnInstantRelease; } break; case ActionModifier::INVALID: @@ -595,8 +608,10 @@ bool Mapping::AddMapping(KeyCode key, EventModifier evtMod, ActionModifier actMo return true; } + void Mapping::RunAllActions(DigitalButton *btn, int numEventActions, ...) { + /* va_list arguments; va_start(arguments, numEventActions); for (int x = 0; x < numEventActions; x++) @@ -607,6 +622,7 @@ void Mapping::RunAllActions(DigitalButton *btn, int numEventActions, ...) } va_end(arguments); return; + */ } // An instance of this class represents a single controller device that JSM is listening to. @@ -2833,7 +2849,11 @@ int main(int argc, char *argv[]) { currentWorkingDir.SetFilter( [] (PathString current, PathString next) { return SetCWD(string(next)) ? next : current; }); autoloadSwitch.SetFilter(&filterInvalidValue)->AddOnChangeListener(&UpdateAutoload); - currentWorkingDir = string(&cmdLine[0], &cmdLine[wcslen(cmdLine)]); +#if _WIN32 + currentWorkingDir = string(&cmdLine[0], &cmdLine[wcslen(cmdLine)]); +#else + currentWorkingDir = string(argv[0]); +#endif CmdRegistry commandRegistry; autoLoadThread.reset(new PollingThread(&AutoLoadPoll, &commandRegistry, 1000, true)); // Start by default From 11fa60297f5aad0365ded354d5d95265bacd2be3 Mon Sep 17 00:00:00 2001 From: TauAkiou Date: Sun, 13 Dec 2020 11:06:56 -0500 Subject: [PATCH 2/4] moved tray.reset() to alleviate _isRunning() race condition --- JoyShockMapper/src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/JoyShockMapper/src/main.cpp b/JoyShockMapper/src/main.cpp index b07a15d..7da5e52 100644 --- a/JoyShockMapper/src/main.cpp +++ b/JoyShockMapper/src/main.cpp @@ -2774,7 +2774,6 @@ int main(int argc, char *argv[]) { newButton.SetFilter(&filterMapping); mappings.push_back(newButton); } - tray.reset(new TrayIcon(trayIconData, &beforeShowTrayMenu )); // console initConsole(&CleanUp); printf("Welcome to JoyShockMapper version %s!\n", version); @@ -2782,7 +2781,8 @@ int main(int argc, char *argv[]) { // prepare for input connectDevices(); JslSetCallback(&joyShockPollCallback); - tray->Show(); + tray.reset(new TrayIcon(trayIconData, &beforeShowTrayMenu )); + tray->Show(); left_stick_mode.SetFilter(&filterInvalidValue)-> AddOnChangeListener(bind(&UpdateRingModeFromStickMode, &left_ring_mode, ::placeholders::_1)); From cb95f6794dc70400f7e7911576fab054d7d45ff8 Mon Sep 17 00:00:00 2001 From: TauAkiou Date: Wed, 16 Dec 2020 05:49:37 -0500 Subject: [PATCH 3/4] Implemented some fixes from @Electronicks to fix another tray race condition on Windows. --- JoyShockMapper/include/win32/WindowsTrayIcon.h | 2 ++ JoyShockMapper/src/win32/WindowsTrayIcon.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/JoyShockMapper/include/win32/WindowsTrayIcon.h b/JoyShockMapper/include/win32/WindowsTrayIcon.h index f6574b1..3f655a1 100644 --- a/JoyShockMapper/include/win32/WindowsTrayIcon.h +++ b/JoyShockMapper/include/win32/WindowsTrayIcon.h @@ -7,6 +7,7 @@ #include #include #include +#include struct MenuItem; @@ -17,6 +18,7 @@ class WindowsTrayIcon { std::map> _clickMap; HANDLE _thread; std::function _beforeShow; + std::atomic_bool _init; public: WindowsTrayIcon(HINSTANCE hInstance, std::function beforeShow); diff --git a/JoyShockMapper/src/win32/WindowsTrayIcon.cpp b/JoyShockMapper/src/win32/WindowsTrayIcon.cpp index fc248a7..2598767 100644 --- a/JoyShockMapper/src/win32/WindowsTrayIcon.cpp +++ b/JoyShockMapper/src/win32/WindowsTrayIcon.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "win32/resource.h" //#include "wintoastlib.h" @@ -84,6 +85,7 @@ WindowsTrayIcon::WindowsTrayIcon(HINSTANCE hInstance, std::function befo , _menuMap() , _thread (0) , _beforeShow(beforeShow) + ,_init(false) { registry.push_back(this); @@ -104,7 +106,9 @@ WindowsTrayIcon::WindowsTrayIcon(HINSTANCE hInstance, std::function befo MessageHandlerLoop, // thread function name this, // argument to thread function 0, // use default creation flags - nullptr); // returns the thread identifier + nullptr); // returns the thread identifier + + Sleep(100); // Longest measured time was 33ms, but performance depends on CPU speed. 100ms should be plenty. } WindowsTrayIcon::~WindowsTrayIcon() @@ -260,6 +264,8 @@ BOOL WindowsTrayIcon::InitInstance() // call ShowWindow here to make the dialog initially visible + _init = true; + return TRUE; } From 094d4a1339747961214efbd06f932665f2cb570e Mon Sep 17 00:00:00 2001 From: Nicolas Lessard Date: Wed, 16 Dec 2020 08:41:20 -0600 Subject: [PATCH 4/4] Move dupicate lambda content to named function --- JoyShockMapper/include/JoyShockMapper.h | 2 +- JoyShockMapper/src/main.cpp | 33 ++++++------------------- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/JoyShockMapper/include/JoyShockMapper.h b/JoyShockMapper/include/JoyShockMapper.h index 62450e3..2cb9a70 100644 --- a/JoyShockMapper/include/JoyShockMapper.h +++ b/JoyShockMapper/include/JoyShockMapper.h @@ -292,7 +292,7 @@ class Mapping map eventMapping; float tapDurationMs = MAGIC_TAP_DURATION; void InsertEventMapping(BtnEvent evt, OnEventAction action); - static void RunAllActions(DigitalButton *btn, int numEventActions, ...); + static void RunBothActions(DigitalButton *btn, OnEventAction action1, OnEventAction action2); public: Mapping() = default; diff --git a/JoyShockMapper/src/main.cpp b/JoyShockMapper/src/main.cpp index 7da5e52..831f3f7 100644 --- a/JoyShockMapper/src/main.cpp +++ b/JoyShockMapper/src/main.cpp @@ -507,17 +507,12 @@ void Mapping::ProcessEvent(BtnEvent evt, DigitalButton &button, in_string displa void Mapping::InsertEventMapping(BtnEvent evt, OnEventAction action) { auto existingActions = eventMapping.find(evt); - //eventMapping[evt] = existingActions == eventMapping.end() ? action : - //bind(&RunAllActions, placeholders::_1, 2, existingActions->second, - // action); // Chain with already existing mapping, if any if (existingActions == eventMapping.end()) { eventMapping[evt] = action; } else { - eventMapping[evt] = [=](DigitalButton* btn) { - if(existingActions->second) existingActions->second(btn); - if(action) action(btn); - }; + // Chain with already existing mapping, if any + eventMapping[evt] = bind(&RunBothActions, placeholders::_1, existingActions->second, action); } } @@ -590,11 +585,7 @@ bool Mapping::AddMapping(KeyCode key, EventModifier evtMod, ActionModifier actMo case ActionModifier::Instant: { OnEventAction action2 = bind(&DigitalButton::RegisterInstant, placeholders::_1, applyEvt); - //apply = bind(&Mapping::RunAllActions, placeholders::_1, 2, apply, action2); - apply = [=](DigitalButton* btn) { - if(apply) apply(btn); - if(action2) action2(btn); - }; + apply = bind(&Mapping::RunBothActions, placeholders::_1, apply, action2); releaseEvt = BtnEvent::OnInstantRelease; } break; case ActionModifier::INVALID: @@ -609,20 +600,12 @@ bool Mapping::AddMapping(KeyCode key, EventModifier evtMod, ActionModifier actMo } -void Mapping::RunAllActions(DigitalButton *btn, int numEventActions, ...) +void Mapping::RunBothActions(DigitalButton *btn, OnEventAction action1, OnEventAction action2) { - /* - va_list arguments; - va_start(arguments, numEventActions); - for (int x = 0; x < numEventActions; x++) - { - auto action = va_arg(arguments, OnEventAction); - if(action) - action(btn); - } - va_end(arguments); - return; - */ + if (action1) + action1(btn); + if (action2) + action2(btn); } // An instance of this class represents a single controller device that JSM is listening to.