aboutsummaryrefslogtreecommitdiff
path: root/src/qt/bitcoin.cpp
diff options
context:
space:
mode:
authorPhilip Kaufmann <phil.kaufmann@t-online.de>2014-04-10 08:19:58 +0200
committerPhilip Kaufmann <phil.kaufmann@t-online.de>2014-04-15 11:57:55 +0200
commitd282c1fb64ae570caab951247e6ead4b9059043d (patch)
tree4e447f31035eeef8268a8c333e45cd2dcd01d092 /src/qt/bitcoin.cpp
parent74dd52a9fc13851a6ec847da985388a6bfb70be7 (diff)
downloadbitcoin-d282c1fb64ae570caab951247e6ead4b9059043d.tar.xz
[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.cpp22
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();