summaryrefslogtreecommitdiff
path: root/src/organizercore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/organizercore.cpp')
-rw-r--r--src/organizercore.cpp22
1 files changed, 20 insertions, 2 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;