mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-08-20 00:05:41 -05:00
Add Run action/condition temp vars
This commit is contained in:
committed by
WarmUpTill
parent
c8545dea4d
commit
74dc0c871b
@@ -4,7 +4,6 @@
|
||||
#include "name-dialog.hpp"
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QProcess>
|
||||
|
||||
namespace advss {
|
||||
|
||||
@@ -16,6 +15,7 @@ bool ProcessConfig::Save(obs_data_t *obj) const
|
||||
_args.Save(data, "args", "arg");
|
||||
obs_data_set_obj(obj, "processConfig", data);
|
||||
obs_data_release(data);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ bool ProcessConfig::Load(obs_data_t *obj)
|
||||
_workingDirectory =
|
||||
obs_data_get_string(obj, "workingDirectory");
|
||||
_args.Load(obj, "args", "arg");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -35,6 +36,7 @@ bool ProcessConfig::Load(obs_data_t *obj)
|
||||
_workingDirectory.Load(data, "workingDirectory");
|
||||
_args.Load(data, "args", "arg");
|
||||
obs_data_release(data);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -44,6 +46,7 @@ QStringList ProcessConfig::Args() const
|
||||
for (auto &arg : _args) {
|
||||
result << QString::fromStdString(arg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -61,11 +64,14 @@ void ProcessConfig::ResolveVariables()
|
||||
}
|
||||
|
||||
std::variant<int, ProcessConfig::ProcStartError>
|
||||
ProcessConfig::StartProcessAndWait(int timeout) const
|
||||
ProcessConfig::StartProcessAndWait(int timeout)
|
||||
{
|
||||
ResetFinishedProcessData();
|
||||
|
||||
QProcess process;
|
||||
process.setWorkingDirectory(QString::fromStdString(WorkingDir()));
|
||||
process.start(QString::fromStdString(Path()), Args());
|
||||
SetProcessId(QString::number(process.processId()).toStdString());
|
||||
vblog(LOG_INFO, "run \"%s\" with a timeout of %d ms", Path().c_str(),
|
||||
timeout);
|
||||
|
||||
@@ -75,21 +81,47 @@ ProcessConfig::StartProcessAndWait(int timeout) const
|
||||
Path().c_str());
|
||||
return ProcStartError::FAILED_TO_START;
|
||||
}
|
||||
|
||||
SetFinishedProcessData(process);
|
||||
vblog(LOG_INFO,
|
||||
"timeout while running \"%s\"\nAttempting to kill process!",
|
||||
Path().c_str());
|
||||
process.kill();
|
||||
process.waitForFinished();
|
||||
|
||||
return ProcStartError::TIMEOUT;
|
||||
}
|
||||
|
||||
SetFinishedProcessData(process);
|
||||
|
||||
if (process.exitStatus() == QProcess::NormalExit) {
|
||||
return process.exitCode();
|
||||
}
|
||||
|
||||
vblog(LOG_INFO, "process \"%s\" crashed!", Path().c_str());
|
||||
return ProcStartError::CRASH;
|
||||
}
|
||||
|
||||
void ProcessConfig::SetFinishedProcessData(QProcess &process)
|
||||
{
|
||||
static const QRegularExpression regex("(\\r\\n|\\r|\\n)$");
|
||||
_processExitCode = QString::number(process.exitCode()).toStdString();
|
||||
// Qt reads extra newline, at least on Windows, hence the workaround
|
||||
_processOutputStream = QString(process.readAllStandardOutput())
|
||||
.remove(regex)
|
||||
.toStdString();
|
||||
_processErrorStream = QString(process.readAllStandardError())
|
||||
.remove(regex)
|
||||
.toStdString();
|
||||
}
|
||||
|
||||
void ProcessConfig::ResetFinishedProcessData()
|
||||
{
|
||||
_processExitCode = "";
|
||||
_processOutputStream = "";
|
||||
_processErrorStream = "";
|
||||
}
|
||||
|
||||
ProcessConfigEdit::ProcessConfigEdit(QWidget *parent)
|
||||
: QWidget(parent),
|
||||
_filePath(new FileSelection()),
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
#include <obs-data.h>
|
||||
#include <obs-module-helper.hpp>
|
||||
|
||||
#include <QPushButton>
|
||||
#include <QListWidget>
|
||||
#include <QProcess>
|
||||
#include <QPushButton>
|
||||
#include <QStringList>
|
||||
#include <QVBoxLayout>
|
||||
#include <variant>
|
||||
@@ -23,6 +24,20 @@ public:
|
||||
std::string WorkingDir() const { return _workingDirectory; }
|
||||
QStringList Args() const; // Resolves variables
|
||||
|
||||
void SetProcessId(std::string processId) { _processId = processId; }
|
||||
std::string GetProcessId() const { return _processId; }
|
||||
void SetFinishedProcessData(QProcess &process);
|
||||
void ResetFinishedProcessData();
|
||||
std::string GetProcessExitCode() const { return _processExitCode; }
|
||||
std::string GetProcessOutputStream() const
|
||||
{
|
||||
return _processOutputStream;
|
||||
}
|
||||
std::string GetProcessErrorStream() const
|
||||
{
|
||||
return _processErrorStream;
|
||||
}
|
||||
|
||||
enum class ProcStartError {
|
||||
NONE,
|
||||
FAILED_TO_START,
|
||||
@@ -30,8 +45,7 @@ public:
|
||||
CRASH,
|
||||
};
|
||||
|
||||
std::variant<int, ProcStartError>
|
||||
StartProcessAndWait(int timeoutInMs) const;
|
||||
std::variant<int, ProcStartError> StartProcessAndWait(int timeoutInMs);
|
||||
bool StartProcessDetached() const;
|
||||
|
||||
void ResolveVariables();
|
||||
@@ -41,6 +55,11 @@ private:
|
||||
StringVariable _workingDirectory = "";
|
||||
StringList _args;
|
||||
|
||||
std::string _processId;
|
||||
std::string _processExitCode;
|
||||
std::string _processOutputStream;
|
||||
std::string _processErrorStream;
|
||||
|
||||
friend class ProcessConfigEdit;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user