From 80e209df42c091fabd03c229aea5e49826c44b9b Mon Sep 17 00:00:00 2001 From: selsta Date: Tue, 20 Jan 2026 20:53:20 +0100 Subject: [PATCH] filter: intercept quit event to avoid deadlock --- main.qml | 10 ++++++++++ src/main/filter.cpp | 5 +++++ src/main/filter.h | 1 + src/main/main.cpp | 1 + 4 files changed, 17 insertions(+) diff --git a/main.qml b/main.qml index 16fcff21..d3cd7b81 100644 --- a/main.qml +++ b/main.qml @@ -100,6 +100,7 @@ ApplicationWindow { property bool splashDisplayedBeforeButtonRequest; property bool themeTransition: false property int backgroundSyncType: Wallet.BackgroundSync_Off; + property bool isQuitting: false // fiat price conversion property real fiatPrice: 0 @@ -282,6 +283,15 @@ ApplicationWindow { persistentSettings.kdfRounds); } + function gracefulQuit() { + if (isQuitting) + return; + isQuitting = true; + closeWallet(function() { + Qt.quit(); + }) + } + function closeWallet(callback) { // Disconnect all listeners diff --git a/src/main/filter.cpp b/src/main/filter.cpp index 1f8155a9..a68f4cac 100644 --- a/src/main/filter.cpp +++ b/src/main/filter.cpp @@ -38,6 +38,11 @@ filter::filter(QObject *parent) : } bool filter::eventFilter(QObject *obj, QEvent *ev) { + if (ev->type() == QEvent::Quit) { + emit quitRequested(); + return true; + } + // macOS sends fileopen signal for incoming uri handlers if (ev->type() == QEvent::FileOpen) { QFileOpenEvent *openEvent = static_cast(ev); diff --git a/src/main/filter.h b/src/main/filter.h index 5c5bf57a..6ed643d2 100644 --- a/src/main/filter.h +++ b/src/main/filter.h @@ -44,6 +44,7 @@ protected: bool eventFilter(QObject *obj, QEvent *ev); signals: + void quitRequested(); void sequencePressed(const QVariant &o, const QVariant &seq); void sequenceReleased(const QVariant &o, const QVariant &seq); void mousePressed(const QVariant &o, const QVariant &x, const QVariant &y); diff --git a/src/main/main.cpp b/src/main/main.cpp index 38901d3f..7ed9e61c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -562,6 +562,7 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw qCritical() << "QrCodeScanner : something went wrong !"; #endif + QObject::connect(eventFilter, &filter::quitRequested, rootObject, [rootObject]{ QMetaObject::invokeMethod(rootObject, "gracefulQuit", Qt::QueuedConnection); }); QObject::connect(eventFilter, SIGNAL(sequencePressed(QVariant,QVariant)), rootObject, SLOT(sequencePressed(QVariant,QVariant))); QObject::connect(eventFilter, SIGNAL(sequenceReleased(QVariant,QVariant)), rootObject, SLOT(sequenceReleased(QVariant,QVariant))); QObject::connect(eventFilter, SIGNAL(mousePressed(QVariant,QVariant,QVariant)), rootObject, SLOT(mousePressed(QVariant,QVariant,QVariant)));