From 6fa1fa110ad8b3377a74089f9ccaf5c2601a1ad4 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Thu, 31 Dec 2020 13:10:28 +0100 Subject: [PATCH] Fixed an issue with custom event scripts on Windows. --- es-core/src/Scripting.cpp | 24 ++++++++++++++++-------- es-core/src/Scripting.h | 4 ++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/es-core/src/Scripting.cpp b/es-core/src/Scripting.cpp index b2909b6b3..dddd4f36d 100644 --- a/es-core/src/Scripting.cpp +++ b/es-core/src/Scripting.cpp @@ -7,9 +7,9 @@ // By calling fireEvent() the scripts inside the directory corresponding to the // argument 'eventName' will be executed with arg1 and arg2 as the script arguments. // -// The scripts are searched for in $HOME/.emulationstation/scripts/. +// The scripts are searched for in ~/.emulationstation/scripts/ // For example, if the event is called 'game-start', all scripts inside the directory -// $HOME/.emulationstation/scripts/game-start/ will be executed. +// ~/.emulationstation/scripts/game-start/ will be executed. // #include "Scripting.h" @@ -30,20 +30,28 @@ namespace Scripting "\" \"" << arg2 << "\""; std::list scriptDirList; - std::string test; + std::string scriptDir; // Check in homepath. - test = Utils::FileSystem::getHomePath() + "/.emulationstation/scripts/" + eventName; - if (Utils::FileSystem::exists(test)) - scriptDirList.push_back(test); + scriptDir = Utils::FileSystem::getHomePath() + "/.emulationstation/scripts/" + eventName; + if (Utils::FileSystem::exists(scriptDir)) + scriptDirList.push_back(scriptDir); for (std::list::const_iterator dirIt = scriptDirList.cbegin(); dirIt != scriptDirList.cend(); ++dirIt) { std::list scripts = Utils::FileSystem::getDirContent(*dirIt); for (std::list::const_iterator it = scripts.cbegin(); it != scripts.cend(); ++it) { - // Append folder to path. - std::string script = *it + " \"" + arg1 + "\" \"" + arg2 + "\""; + std::string arg1Quotation; + std::string arg2Quotation; + // Add quotation marks around the arguments as long as these are not already + // present (i.e. for arguments with spaces in them). + if (arg1.front() != '\"') + arg1Quotation = "\""; + if (arg2.front() != '\"') + arg2Quotation = "\""; + std::string script = *it + " " + arg1Quotation + arg1 + arg1Quotation + " " + + arg2Quotation + arg2 + arg2Quotation; LOG(LogDebug) << "Executing: " << script; runSystemCommand(script); } diff --git a/es-core/src/Scripting.h b/es-core/src/Scripting.h index d115a81aa..294ddf227 100644 --- a/es-core/src/Scripting.h +++ b/es-core/src/Scripting.h @@ -7,9 +7,9 @@ // By calling fireEvent() the scripts inside the directory corresponding to the // argument 'eventName' will be executed with arg1 and arg2 as the script arguments. // -// The scripts are searched for in $HOME/.emulationstation/scripts/. +// The scripts are searched for in ~/.emulationstation/scripts/ // For example, if the event is called 'game-start', all scripts inside the directory -// $HOME/.emulationstation/scripts/game-start/ will be executed. +// ~/.emulationstation/scripts/game-start/ will be executed. // #ifndef ES_CORE_SCRIPTING_H