From 36ec1aa35b65a7ec89ad4232865bd43e9b312065 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sat, 28 Sep 2024 09:02:57 -0400 Subject: [PATCH] Prevent multiple lock requests on Linux * Fixes #11000 When the screen locks on e.g. gnome we receive multiple independent signals of that, namely the Gnome session manager and the gnome / freedesktop screensaver. When this happens, this causes multiple "lock database" requests to be issued. The first one correctly shows the question to discard/cancel, but the second one while the first is still asking goes and dismisses the question and then goes to ask it again. The result is it acts like you didn't answer correctly (ie, to cancel) and the database is locked. --- src/gui/DatabaseWidget.cpp | 10 ++++++++-- src/gui/DatabaseWidget.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 263a265f7..f549b2005 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1787,8 +1787,8 @@ bool DatabaseWidget::focusNextPrevChild(bool next) bool DatabaseWidget::lock() { - if (isLocked()) { - return true; + if (isLocked() || m_attemptingLock) { + return isLocked(); } // Don't try to lock the database while saving, this will cause a deadlock @@ -1797,6 +1797,8 @@ bool DatabaseWidget::lock() return false; } + m_attemptingLock = true; + emit databaseLockRequested(); // Force close any modal widgets associated with this widget @@ -1821,6 +1823,7 @@ bool DatabaseWidget::lock() MessageBox::Discard | MessageBox::Cancel, MessageBox::Cancel); if (result == MessageBox::Cancel) { + m_attemptingLock = false; return false; } } @@ -1847,9 +1850,11 @@ bool DatabaseWidget::lock() MessageBox::Save); if (result == MessageBox::Save) { if (!save()) { + m_attemptingLock = false; return false; } } else if (result == MessageBox::Cancel) { + m_attemptingLock = false; return false; } } @@ -1881,6 +1886,7 @@ bool DatabaseWidget::lock() auto newDb = QSharedPointer::create(m_db->filePath()); replaceDatabase(newDb); + m_attemptingLock = false; emit databaseLocked(); return true; diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 4e564ea2f..dbee174ec 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -305,6 +305,7 @@ private: QUuid m_entryBeforeLock; int m_saveAttempts; + bool m_attemptingLock = false; // Search state QScopedPointer m_entrySearcher;