summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lockwidget.cpp5
-rw-r--r--src/main.cpp16
-rw-r--r--src/organizerproxy.cpp32
-rw-r--r--src/processrunner.cpp14
-rw-r--r--src/processrunner.h19
-rw-r--r--src/spawn.cpp44
6 files changed, 83 insertions, 47 deletions
diff --git a/src/lockwidget.cpp b/src/lockwidget.cpp
index cc66112e..7b6e8430 100644
--- a/src/lockwidget.cpp
+++ b/src/lockwidget.cpp
@@ -183,6 +183,11 @@ void LockWidget::createUi(Reasons reason)
m_overlay->setFocus();
m_overlay->show();
m_overlay->setEnabled(true);
+
+ if (!overlayTarget) {
+ m_overlay->raise();
+ m_overlay->activateWindow();
+ }
}
void LockWidget::onForceUnlock()
diff --git a/src/main.cpp b/src/main.cpp
index 9decb94e..2b9a2f4d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -653,15 +653,21 @@ int runApplication(MOApplication &application, SingleInstance &instance,
else {
QString exeName = arguments.at(1);
log::debug("starting {} from command line", exeName);
+
arguments.removeFirst(); // remove application name (ModOrganizer.exe)
arguments.removeFirst(); // remove binary name
- // pass the remaining parameters to the binary
- try {
- organizer.processRunner().runExecutableOrExecutableFile(
- exeName, arguments, QString(), QString());
+
+ try
+ {
+ // pass the remaining parameters to the binary
+ organizer.processRunner()
+ .setFromFileOrExecutable(exeName, arguments)
+ .setWaitForCompletion(ProcessRunner::NoRefresh)
+ .run();
return 0;
}
- catch (const std::exception &e) {
+ catch (const std::exception &e)
+ {
reportError(
QObject::tr("failed to start application: %1").arg(e.what()));
return 1;
diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp
index 3ee35fe2..9de5b4ba 100644
--- a/src/organizerproxy.cpp
+++ b/src/organizerproxy.cpp
@@ -108,17 +108,37 @@ QString OrganizerProxy::pluginDataPath() const
}
HANDLE OrganizerProxy::startApplication(
- const QString &executable, const QStringList &args, const QString &cwd,
- const QString &profile, const QString &forcedCustomOverwrite,
- bool ignoreCustomOverwrite)
+ const QString& exe, const QStringList& args, const QString &cwd,
+ const QString& profile, const QString &overwrite, bool ignoreOverwrite)
{
- return m_Proxied->processRunner().runExecutableOrExecutableFile(
- executable, args, cwd, profile,
- forcedCustomOverwrite, ignoreCustomOverwrite);
+ log::debug(
+ "a plugin has requested to start an application:\n"
+ " . executable: '{}'\n"
+ " . args: '{}'\n"
+ " . cwd: '{}'\n"
+ " . profile: '{}'\n"
+ " . overwrite: '{}'\n"
+ " . ignore overwrite: {}",
+ exe, args.join(" "), cwd, profile, overwrite, ignoreOverwrite);
+
+ auto runner = m_Proxied->processRunner();
+
+ runner
+ .setFromFileOrExecutable(exe, args, cwd, profile, overwrite, ignoreOverwrite)
+ .setWaitForCompletion(ProcessRunner::Refresh)
+ .run();
+
+ return runner.processHandle();
}
bool OrganizerProxy::waitForApplication(HANDLE handle, LPDWORD exitCode) const
{
+ const auto pid = ::GetProcessId(handle);
+
+ log::debug(
+ "a plugin wants to wait for an application to complete, pid {}{}",
+ pid, (pid == 0 ? "unknown (probably already completed)" : ""));
+
const auto r = m_Proxied->processRunner().waitForApplication(
handle, exitCode, LockWidget::OutputRequired);
diff --git a/src/processrunner.cpp b/src/processrunner.cpp
index 6ca05147..e6f916c5 100644
--- a/src/processrunner.cpp
+++ b/src/processrunner.cpp
@@ -661,22 +661,12 @@ DWORD ProcessRunner::exitCode()
return m_exitCode;
}
-
-HANDLE ProcessRunner::runExecutableOrExecutableFile(
- const QString& executable, const QStringList &args, const QString &cwd,
- const QString& profileOverride, const QString &forcedCustomOverwrite,
- bool ignoreCustomOverwrite)
+HANDLE ProcessRunner::processHandle()
{
- setFromFileOrExecutable(
- executable, args, cwd, profileOverride, forcedCustomOverwrite,
- ignoreCustomOverwrite);
-
- setWaitForCompletion(Refresh);
-
- run();
return m_handle;
}
+
void ProcessRunner::withLock(
LockWidget::Reasons reason, std::function<void (LockWidget&)> f)
{
diff --git a/src/processrunner.h b/src/processrunner.h
index 4860be7c..bdd0b260 100644
--- a/src/processrunner.h
+++ b/src/processrunner.h
@@ -71,23 +71,14 @@ public:
ProcessRunner& setFromFileOrExecutable(
const QString &executable,
const QStringList &args,
- const QString &cwd,
- const QString &profile,
- const QString &forcedCustomOverwrite = "",
- bool ignoreCustomOverwrite = false);
+ const QString &cwd={},
+ const QString &profile={},
+ const QString &forcedCustomOverwrite={},
+ bool ignoreCustomOverwrite=false);
Results run();
DWORD exitCode();
-
-
- HANDLE runExecutableOrExecutableFile(
- const QString &executable,
- const QStringList &args,
- const QString &cwd,
- const QString &profile,
- const QString &forcedCustomOverwrite = "",
- bool ignoreCustomOverwrite = false);
-
+ HANDLE processHandle();
Results waitForApplication(
HANDLE processHandle, LPDWORD exitCode, LockWidget::Reasons reason);
diff --git a/src/spawn.cpp b/src/spawn.cpp
index c8d7c76a..b331db01 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -442,6 +442,25 @@ QMessageBox::StandardButton confirmBlacklisted(
namespace spawn
{
+void logSpawning(const SpawnParameters& sp, const QString& realCmd)
+{
+ log::debug(
+ "spawning binary:\n"
+ " . exe: '{}'\n"
+ " . args: '{}'\n"
+ " . cwd: '{}'\n"
+ " . steam id: '{}'\n"
+ " . hooked: {}\n"
+ " . stdout: {}\n"
+ " . stderr: {}\n"
+ " . real cmd: '{}'",
+ sp.binary.absoluteFilePath(), sp.arguments,
+ sp.currentDirectory.absolutePath(), sp.steamAppID, sp.hooked,
+ (sp.stdOut == INVALID_HANDLE_VALUE ? "no" : "yes"),
+ (sp.stdErr == INVALID_HANDLE_VALUE ? "no" : "yes"),
+ realCmd);
+}
+
DWORD spawn(const SpawnParameters& sp, HANDLE& processHandle)
{
BOOL inheritHandles = FALSE;
@@ -462,30 +481,35 @@ DWORD spawn(const SpawnParameters& sp, HANDLE& processHandle)
si.dwFlags |= STARTF_USESTDHANDLES;
}
- const auto bin = QDir::toNativeSeparators(sp.binary.absoluteFilePath()).toStdWString();
- const auto cwd = QDir::toNativeSeparators(sp.currentDirectory.absolutePath()).toStdWString();
+ const auto bin = QDir::toNativeSeparators(sp.binary.absoluteFilePath());
+ const auto cwd = QDir::toNativeSeparators(sp.currentDirectory.absolutePath());
- std::wstring commandLine = L"\"" + bin + L"\"";
- if (sp.arguments[0] != L'\0') {
- commandLine += L" " + sp.arguments.toStdWString();
+ QString commandLine = "\"" + bin + "\"";
+ if (!sp.arguments.isEmpty()) {
+ commandLine += " " + sp.arguments;
}
- QString moPath = QCoreApplication::applicationDirPath();
+ const QString moPath = QCoreApplication::applicationDirPath();
const auto oldPath = env::addPath(QDir::toNativeSeparators(moPath));
PROCESS_INFORMATION pi;
BOOL success = FALSE;
+ logSpawning(sp, commandLine);
+
+ const auto wcommandLine = commandLine.toStdWString();
+ const auto wcwd = cwd.toStdWString();
+
if (sp.hooked) {
success = ::CreateProcessHooked(
- nullptr, const_cast<wchar_t*>(commandLine.c_str()), nullptr, nullptr,
+ nullptr, const_cast<wchar_t*>(wcommandLine.c_str()), nullptr, nullptr,
inheritHandles, CREATE_BREAKAWAY_FROM_JOB, nullptr,
- cwd.c_str(), &si, &pi);
+ wcwd.c_str(), &si, &pi);
} else {
success = ::CreateProcess(
- nullptr, const_cast<wchar_t*>(commandLine.c_str()), nullptr, nullptr,
+ nullptr, const_cast<wchar_t*>(wcommandLine.c_str()), nullptr, nullptr,
inheritHandles, CREATE_BREAKAWAY_FROM_JOB, nullptr,
- cwd.c_str(), &si, &pi);
+ wcwd.c_str(), &si, &pi);
}
const auto e = GetLastError();