summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-10-24 05:27:39 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-11-06 07:44:53 -0500
commit8f24f6298f62e36db1c7a624052e70b41c5e7e27 (patch)
tree19339b4dd0c83c8dba894023f5044fe030545159
parent4e8dcc5157706e1478396179f5dc11305532b159 (diff)
wait for executable when opening files
-rw-r--r--src/organizercore.cpp22
-rw-r--r--src/organizercore.h5
-rw-r--r--src/spawn.cpp4
3 files changed, 26 insertions, 5 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 78f9517c..d3f4a83c 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -1120,8 +1120,19 @@ bool OrganizerCore::runFile(
case spawn::FileExecutionTypes::Other: // fall-through
default:
{
- const auto r = shell::Open(targetInfo.absoluteFilePath());
- return r.success();
+ auto r = shell::Open(targetInfo.absoluteFilePath());
+ if (!r.success()) {
+ return false;
+ }
+
+ // not all files will return a valid handle even if opening them was
+ // successful, such as inproc handlers (like the photo viewer)
+ if (r.processHandle() != INVALID_HANDLE_VALUE) {
+ // steal because it gets closed after the wait
+ return waitForProcessCompletionWithLock(r.stealProcessHandle(), nullptr);
+ }
+
+ return true;
}
}
}
@@ -1333,6 +1344,13 @@ HANDLE OrganizerCore::spawnAndWait(
return INVALID_HANDLE_VALUE;
}
+ waitForProcessCompletionWithLock(handle, exitCode);
+ return handle;
+}
+
+bool OrganizerCore::waitForProcessCompletionWithLock(
+ HANDLE handle, LPDWORD exitCode)
+{
if (Settings::instance().interface().lockGUI()) {
std::unique_ptr<LockedDialog> dlg;
ILockedWaitingForProcess* uilock = nullptr;
diff --git a/src/organizercore.h b/src/organizercore.h
index f802c8cb..3d3c7325 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -306,7 +306,10 @@ private:
const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries = QList<MOBase::ExecutableForcedLoadSetting>(),
LPDWORD exitCode = nullptr);
- bool waitForProcessCompletion(HANDLE handle, LPDWORD exitCode, ILockedWaitingForProcess* uilock);
+ bool waitForProcessCompletionWithLock(HANDLE handle, LPDWORD exitCode);
+
+ bool waitForProcessCompletion(
+ HANDLE handle, LPDWORD exitCode, ILockedWaitingForProcess* uilock);
private slots:
diff --git a/src/spawn.cpp b/src/spawn.cpp
index dd93bfaa..fe1e9e3e 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -1029,7 +1029,7 @@ bool isJavaFile(const QFileInfo& target)
QFileInfo getCmdPath()
{
- const auto p = env::get("COMSPEC2");
+ const auto p = env::get("COMSPEC");
if (!p.isEmpty()) {
return p;
}
@@ -1111,7 +1111,7 @@ bool helperExec(
{
SHELLEXECUTEINFOW execInfo = {};
- ULONG flags = SEE_MASK_FLAG_NO_UI ;
+ ULONG flags = SEE_MASK_FLAG_NO_UI;
if (!async)
flags |= SEE_MASK_NOCLOSEPROCESS;