From d282c1fb64ae570caab951247e6ead4b9059043d Mon Sep 17 00:00:00 2001 From: Philip Kaufmann Date: Thu, 10 Apr 2014 08:19:58 +0200 Subject: [Qt] catch Windows shutdown events while client is running - prevents unsafe shutdowns on Windows, which is known to be able to cause problems with wallet.dat - if a users ends a Windows session, this will initiate a client shutdown and show a Windows dialog, that tells the user what is going on (for Windows Vista and higher it will even show a reason for blocking the Windows session end) --- src/qt/bitcoin.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/qt/bitcoin.cpp') diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 696e65ec19..c05692efa3 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -15,6 +15,7 @@ #include "optionsmodel.h" #include "splashscreen.h" #include "utilitydialog.h" +#include "winshutdownmonitor.h" #ifdef ENABLE_WALLET #include "paymentserver.h" #include "walletmodel.h" @@ -189,6 +190,9 @@ public: /// Get process return value int getReturnValue() { return returnValue; } + /// Get window identifier of QMainWindow (BitcoinGUI) + WId getMainWinId() const; + public slots: void initializeResult(int retval); void shutdownResult(int retval); @@ -444,6 +448,14 @@ void BitcoinApplication::handleRunawayException(const QString &message) ::exit(1); } +WId BitcoinApplication::getMainWinId() const +{ + if (!window) + return 0; + + return window->winId(); +} + #ifndef BITCOIN_QT_TEST int main(int argc, char *argv[]) { @@ -558,10 +570,15 @@ int main(int argc, char *argv[]) /// 9. Main GUI initialization // Install global event filter that makes sure that long tooltips can be word-wrapped app.installEventFilter(new GUIUtil::ToolTipToRichTextFilter(TOOLTIP_WRAP_THRESHOLD, &app)); - // Install qDebug() message handler to route to debug.log #if QT_VERSION < 0x050000 + // Install qDebug() message handler to route to debug.log qInstallMsgHandler(DebugMessageHandler); #else +#if defined(Q_OS_WIN) + // Install global event filter for processing Windows session related Windows messages (WM_QUERYENDSESSION and WM_ENDSESSION) + qApp->installNativeEventFilter(new WinShutdownMonitor()); +#endif + // Install qDebug() message handler to route to debug.log qInstallMessageHandler(DebugMessageHandler); #endif // Load GUI settings from QSettings @@ -577,6 +594,9 @@ int main(int argc, char *argv[]) { app.createWindow(isaTestNet); app.requestInitialize(); +#if defined(Q_OS_WIN) && QT_VERSION >= 0x050000 + WinShutdownMonitor::registerShutdownBlockReason(QObject::tr("Bitcoin Core did't yet exit safely..."), (HWND)app.getMainWinId()); +#endif app.exec(); app.requestShutdown(); app.exec(); -- cgit v1.2.3