diff options
author | Philip Kaufmann <phil.kaufmann@t-online.de> | 2014-04-10 08:19:58 +0200 |
---|---|---|
committer | Philip Kaufmann <phil.kaufmann@t-online.de> | 2014-04-15 11:57:55 +0200 |
commit | d282c1fb64ae570caab951247e6ead4b9059043d (patch) | |
tree | 4e447f31035eeef8268a8c333e45cd2dcd01d092 /src/qt/bitcoin.cpp | |
parent | 74dd52a9fc13851a6ec847da985388a6bfb70be7 (diff) |
[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)
Diffstat (limited to 'src/qt/bitcoin.cpp')
-rw-r--r-- | src/qt/bitcoin.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
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(); |