From 71426a86da46db5fdfd3c970a970f553a0d3b134 Mon Sep 17 00:00:00 2001 From: Martin Piatka Date: Mon, 15 Feb 2021 13:18:12 +0100 Subject: [PATCH] GUI: Replace deprecated QProcess::start() The QProcess::start() method is replaced with a new one that requires executable path and arguments passed separately. Each argument must be now passed individualy using QStringList and have their spaces escaped automatically and passing argument list as a single string would no longer work. This is now handled by splitting the argument string on spaces. The executable path can no longer contain quotes as spaces are escaped by QT automatically now. --- gui/QT/main.cpp | 2 +- gui/QT/option/available_settings.cpp | 7 +++--- gui/QT/window/ultragrid_window.cpp | 36 ++++++++++++++++++---------- gui/QT/window/ultragrid_window.hpp | 3 ++- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/gui/QT/main.cpp b/gui/QT/main.cpp index 1838cfb3b..2efec8e93 100644 --- a/gui/QT/main.cpp +++ b/gui/QT/main.cpp @@ -35,7 +35,7 @@ int main(int argc, char *argv[]){ //important: If this line is removed parsing float numbers for vu meter fails std::setlocale(LC_NUMERIC, "C"); - process.start("\"" + ultragridExecutable + "\""); + process.start(ultragridExecutable, QStringList()); if(process.waitForStarted(1000) == false) { QMessageBox msgBox; msgBox.setText(ultragridExecutable + " doesn't seem to be executable."); diff --git a/gui/QT/option/available_settings.cpp b/gui/QT/option/available_settings.cpp index a67024353..95f177b29 100644 --- a/gui/QT/option/available_settings.cpp +++ b/gui/QT/option/available_settings.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -18,9 +19,9 @@ static bool vectorContains(const std::vector &v, const std::string return false; } -static QStringList getProcessOutput(const std::string& executable, const std::string& command){ +static QStringList getProcessOutput(const std::string& executable, const QStringList& args){ QProcess process; - process.start((executable + command).c_str()); + process.start(executable.c_str(), args); process.waitForFinished(); QString output = QString(process.readAllStandardOutput()); @@ -30,7 +31,7 @@ static QStringList getProcessOutput(const std::string& executable, const std::st } void AvailableSettings::queryAll(const std::string &executable){ - QStringList lines = getProcessOutput(executable, " --capabilities"); + QStringList lines = getProcessOutput(executable, QStringList() << "--capabilities"); queryCap(lines, VIDEO_SRC, "[cap][capture] "); queryCap(lines, VIDEO_DISPLAY, "[cap][display] "); diff --git a/gui/QT/window/ultragrid_window.cpp b/gui/QT/window/ultragrid_window.cpp index a849bd768..2b9aa9803 100644 --- a/gui/QT/window/ultragrid_window.cpp +++ b/gui/QT/window/ultragrid_window.cpp @@ -12,6 +12,20 @@ #include #endif +namespace { +QString argListToString(const QStringList& argList){ + return argList.join(" "); +} + +QStringList argStringToList(const QString& argString){ + return argString.split(" ", Qt::SkipEmptyParts); +} + +QStringList argStringToList(const std::string& argString){ + return QString::fromStdString(argString).split(" ", Qt::SkipEmptyParts); +} +} //anonymous namespace + UltragridWindow::UltragridWindow(QWidget *parent): QMainWindow(parent){ ui.setupUi(this); //ui.terminal->setVisible(false); @@ -19,7 +33,7 @@ UltragridWindow::UltragridWindow(QWidget *parent): QMainWindow(parent){ ui.actionTest->setVisible(true); #endif //DEBUG - ultragridExecutable = "\"" + UltragridWindow::findUltragridExecutable() + "\""; + ultragridExecutable = UltragridWindow::findUltragridExecutable(); #ifndef __linux ui.actionUse_hw_acceleration->setVisible(false); @@ -152,13 +166,9 @@ void UltragridWindow::start(){ stopPreview(); - QString command(ultragridExecutable); - - command += " "; - command += launchArgs; process.setProcessChannelMode(QProcess::MergedChannels); - log.write("Command: " + command + "\n\n"); - process.start(command); + log.write("Command args: " + argListToString(launchArgs) + "\n\n"); + process.start(ultragridExecutable, launchArgs); } void UltragridWindow::schedulePreview(){ @@ -176,8 +186,7 @@ void UltragridWindow::startPreview(){ while(previewProcess.state() != QProcess::NotRunning) stopPreview(); - QString command(ultragridExecutable); - command += QString::fromStdString(settings.getPreviewParams()); + QStringList previewArgs = argStringToList(settings.getPreviewParams()); /* if(sourceOption->getCurrentValue() != "none"){ //We prevent video from network overriding local sources @@ -187,9 +196,9 @@ void UltragridWindow::startPreview(){ */ #ifdef DEBUG - log.write("Preview: " + command + "\n\n"); + log.write("Preview: " + argListToString(previewArgs) + "\n\n"); #endif - previewProcess.start(command); + previewProcess.start(ultragridExecutable, previewArgs); } void UltragridWindow::stopPreview(){ @@ -203,11 +212,14 @@ void UltragridWindow::stopPreview(){ } void UltragridWindow::editArgs(const QString &text){ - launchArgs = text; + launchArgs = argStringToList(text); } void UltragridWindow::setArgs(){ QString args = QString::fromStdString(settings.getLaunchParams()); + + launchArgs = argStringToList(args); + #ifdef DEBUG log.write("set args: " + args + "\n"); #endif diff --git a/gui/QT/window/ultragrid_window.hpp b/gui/QT/window/ultragrid_window.hpp index 531d19370..9c5927ee1 100644 --- a/gui/QT/window/ultragrid_window.hpp +++ b/gui/QT/window/ultragrid_window.hpp @@ -2,6 +2,7 @@ #define ULTRAGRID_WINDOW_HPP #include +#include #include #include @@ -38,7 +39,7 @@ private: AvailableSettings availableSettings; - QString launchArgs; + QStringList launchArgs; QStringList getOptionsForParam(QString param); LogWindow log; SettingsWindow settingsWindow;