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