|
58 | 58 | #include <QThread> |
59 | 59 | #include <QTimer> |
60 | 60 | #include <QTranslator> |
| 61 | +#include <QWindow> |
61 | 62 |
|
62 | 63 | #if defined(QT_STATIC) |
63 | 64 | #include <QtPlugin> |
@@ -256,6 +257,8 @@ void BitcoinApplication::createOptionsModel(bool resetSettings) |
256 | 257 | void BitcoinApplication::createWindow(const NetworkStyle *networkStyle) |
257 | 258 | { |
258 | 259 | window = new BitcoinGUI(node(), networkStyle, nullptr); |
| 260 | + connect(window, &BitcoinGUI::quitRequested, this, &BitcoinApplication::requestShutdown); |
| 261 | + |
259 | 262 | pollShutdownTimer = new QTimer(window); |
260 | 263 | connect(pollShutdownTimer, &QTimer::timeout, window, &BitcoinGUI::detectShutdown); |
261 | 264 | } |
@@ -290,7 +293,7 @@ void BitcoinApplication::startThread() |
290 | 293 |
|
291 | 294 | /* communication to and from thread */ |
292 | 295 | connect(&m_executor.value(), &InitExecutor::initializeResult, this, &BitcoinApplication::initializeResult); |
293 | | - connect(&m_executor.value(), &InitExecutor::shutdownResult, this, &BitcoinApplication::shutdownResult); |
| 296 | + connect(&m_executor.value(), &InitExecutor::shutdownResult, this, &QCoreApplication::quit); |
294 | 297 | connect(&m_executor.value(), &InitExecutor::runawayException, this, &BitcoinApplication::handleRunawayException); |
295 | 298 | connect(this, &BitcoinApplication::requestedInitialize, &m_executor.value(), &InitExecutor::initialize); |
296 | 299 | connect(this, &BitcoinApplication::requestedShutdown, &m_executor.value(), &InitExecutor::shutdown); |
@@ -321,13 +324,17 @@ void BitcoinApplication::requestInitialize() |
321 | 324 |
|
322 | 325 | void BitcoinApplication::requestShutdown() |
323 | 326 | { |
| 327 | + for (const auto w : QGuiApplication::topLevelWindows()) { |
| 328 | + w->hide(); |
| 329 | + } |
| 330 | + |
324 | 331 | // Show a simple window indicating shutdown status |
325 | 332 | // Do this first as some of the steps may take some time below, |
326 | 333 | // for example the RPC console may still be executing a command. |
327 | 334 | shutdownWindow.reset(ShutdownWindow::showShutdownWindow(window)); |
328 | 335 |
|
329 | 336 | qDebug() << __func__ << ": Requesting shutdown"; |
330 | | - window->hide(); |
| 337 | + |
331 | 338 | // Must disconnect node signals otherwise current thread can deadlock since |
332 | 339 | // no event loop is running. |
333 | 340 | window->unsubscribeFromCoreSignals(); |
@@ -407,15 +414,10 @@ void BitcoinApplication::initializeResult(bool success, interfaces::BlockAndHead |
407 | 414 | pollShutdownTimer->start(SHUTDOWN_POLLING_DELAY); |
408 | 415 | } else { |
409 | 416 | Q_EMIT splashFinished(); // Make sure splash screen doesn't stick around during shutdown |
410 | | - quit(); // Exit first main loop invocation |
| 417 | + requestShutdown(); |
411 | 418 | } |
412 | 419 | } |
413 | 420 |
|
414 | | -void BitcoinApplication::shutdownResult() |
415 | | -{ |
416 | | - quit(); // Exit second main loop invocation after shutdown finished |
417 | | -} |
418 | | - |
419 | 421 | void BitcoinApplication::handleRunawayException(const QString &message) |
420 | 422 | { |
421 | 423 | QMessageBox::critical( |
@@ -745,8 +747,6 @@ int GuiMain(int argc, char* argv[]) |
745 | 747 | #if defined(Q_OS_WIN) |
746 | 748 | WinShutdownMonitor::registerShutdownBlockReason(QObject::tr("%1 didn't yet exit safely…").arg(PACKAGE_NAME), (HWND)app.getMainWinId()); |
747 | 749 | #endif |
748 | | - app.exec(); |
749 | | - app.requestShutdown(); |
750 | 750 | app.exec(); |
751 | 751 | rv = app.getReturnValue(); |
752 | 752 | } else { |
|
0 commit comments