From 8f24f6298f62e36db1c7a624052e70b41c5e7e27 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Thu, 24 Oct 2019 05:27:39 -0400 Subject: wait for executable when opening files --- src/organizercore.cpp | 22 ++++++++++++++++++++-- src/organizercore.h | 5 ++++- src/spawn.cpp | 4 ++-- 3 files changed, 26 insertions(+), 5 deletions(-) (limited to 'src') 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 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 &forcedLibraries = QList(), 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; -- cgit v1.3.1