summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp1
-rw-r--r--src/mainwindow.cpp22
-rw-r--r--src/processrunner.cpp26
-rw-r--r--src/spawn.cpp6
-rw-r--r--src/uilocker.cpp5
-rw-r--r--src/uilocker.h1
6 files changed, 50 insertions, 11 deletions
diff --git a/src/main.cpp b/src/main.cpp
index eeabd497..29d2d02c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -745,7 +745,6 @@ int runApplication(MOApplication &application, SingleInstance &instance,
splash.finish(&mainWindow);
res = application.exec();
- mainWindow.onBeforeClose();
mainWindow.close();
NexusInterface::instance(&pluginContainer)
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index d1578d85..284c33e3 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1306,6 +1306,21 @@ void MainWindow::onBeforeClose()
void MainWindow::closeEvent(QCloseEvent* event)
{
+ if (isVisible()) {
+ // this is messy
+ //
+ // the main problem this is solving is when closing MO, then getting the
+ // lock overlay because processes are still running, then pressing the X
+ // again
+ //
+ // in this case, closeEvent() is _not_ called for the second event and the
+ // window is immediately hidden
+ //
+ // this always saves the settings here; in the event where a lock overlay
+ // is then shown, it might save settings multiple times, but it's harmless
+ onBeforeClose();
+ }
+
// this happens for two reasons:
// 1) the user requested to close the window, such as clicking the X
// 2) close() is called in runApplication() after application.exec()
@@ -1324,6 +1339,13 @@ void MainWindow::closeEvent(QCloseEvent* event)
return;
}
+ if (UILocker::instance().locked()) {
+ // don't bother asking the user to confirm if the ui is already locked
+ event->ignore();
+ ExitModOrganizer(Exit::Force);
+ return;
+ }
+
if (ModOrganizerExiting()) {
// ignore repeated attempts
event->ignore();
diff --git a/src/processrunner.cpp b/src/processrunner.cpp
index aead42d1..945d61c3 100644
--- a/src/processrunner.cpp
+++ b/src/processrunner.cpp
@@ -344,6 +344,9 @@ ProcessRunner::Results waitForProcessesThreadImpl(
// processes
wait = std::min(wait * 2, milliseconds(2000));
}
+
+ log::debug("waiting for processes interrupted");
+ return ProcessRunner::ForceUnlocked;
}
void waitForProcessesThread(
@@ -374,9 +377,12 @@ ProcessRunner::Results waitForProcesses(
if (!::AssignProcessToJobObject(job.get(), h)) {
const auto e = GetLastError();
- log::error(
- "can't assign process to job to wait for processes, {}",
- formatSystemMessage(e));
+ // this happens when closing MO while multiple processes are running,
+ // so the logging is disabled until it gets fixed
+
+ //log::error(
+ // "can't assign process to job to wait for processes, {}",
+ // formatSystemMessage(e));
// keep going
}
@@ -871,11 +877,12 @@ ProcessRunner::Results ProcessRunner::waitForAllUSVFSProcessesWithLock(
auto r = Error;
- withLock([&](auto& ls) {
for (;;) {
+ withLock([&](auto& ls) {
const auto processes = getRunningUSVFSProcesses();
if (processes.empty()) {
- break;
+ r = Completed;
+ return;
}
r = waitForProcesses(processes, ls);
@@ -886,11 +893,14 @@ ProcessRunner::Results ProcessRunner::waitForAllUSVFSProcessesWithLock(
}
// this process is completed, check for others
- }
-
- r = Completed;
+ r = Running;
});
+ if (r != Running) {
+ break;
+ }
+ }
+
return r;
}
diff --git a/src/spawn.cpp b/src/spawn.cpp
index f95846c8..33bdbc05 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -498,14 +498,16 @@ DWORD spawn(const SpawnParameters& sp, HANDLE& processHandle)
const auto wcommandLine = commandLine.toStdWString();
const auto wcwd = cwd.toStdWString();
+ const DWORD flags = CREATE_BREAKAWAY_FROM_JOB;
+
if (sp.hooked) {
success = ::CreateProcessHooked(
nullptr, const_cast<wchar_t*>(wcommandLine.c_str()), nullptr, nullptr,
- inheritHandles, 0, nullptr, wcwd.c_str(), &si, &pi);
+ inheritHandles, flags, nullptr, wcwd.c_str(), &si, &pi);
} else {
success = ::CreateProcess(
nullptr, const_cast<wchar_t*>(wcommandLine.c_str()), nullptr, nullptr,
- inheritHandles, 0, nullptr, wcwd.c_str(), &si, &pi);
+ inheritHandles, flags, nullptr, wcwd.c_str(), &si, &pi);
}
const auto e = GetLastError();
diff --git a/src/uilocker.cpp b/src/uilocker.cpp
index af9b9b96..07fe7f1b 100644
--- a/src/uilocker.cpp
+++ b/src/uilocker.cpp
@@ -461,6 +461,11 @@ std::shared_ptr<UILocker::Session> UILocker::lock(Reasons reason)
return ls;
}
+bool UILocker::locked() const
+{
+ return !m_sessions.empty();
+}
+
void UILocker::unlock(Session* s)
{
auto itor = m_sessions.begin();
diff --git a/src/uilocker.h b/src/uilocker.h
index d8c22999..cc467184 100644
--- a/src/uilocker.h
+++ b/src/uilocker.h
@@ -70,6 +70,7 @@ public:
void setUserInterface(QWidget* parent);
std::shared_ptr<Session> lock(Reasons reason);
+ bool locked() const;
Results result() const;