From d61959466e304d6cebf4b78cfcf16041b2d37683 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Mon, 26 May 2025 02:07:12 +0100 Subject: [PATCH 1/2] Bring the database open/unlock dialogue box into line with other on-top windows. --- src/gui/DatabaseOpenDialog.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/gui/DatabaseOpenDialog.cpp b/src/gui/DatabaseOpenDialog.cpp index 881db4087..b562c084d 100644 --- a/src/gui/DatabaseOpenDialog.cpp +++ b/src/gui/DatabaseOpenDialog.cpp @@ -35,12 +35,8 @@ DatabaseOpenDialog::DatabaseOpenDialog(QWidget* parent) , m_tabBar(new QTabBar(this)) { setWindowTitle(tr("Unlock Database - KeePassXC")); - setWindowFlags(Qt::Dialog); + setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint); setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#ifdef Q_OS_LINUX - // Linux requires this to overcome some Desktop Environments (also no Quick Unlock) - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); -#endif // block input to the main window/application while the dialog is open setWindowModality(Qt::ApplicationModal); #ifdef Q_OS_WIN From 9bd8b40e949f9b1e651cb99c185bf988cc2b6a9e Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Mon, 26 May 2025 02:09:00 +0100 Subject: [PATCH 2/2] Make browser-prompted dialogue boxes unparented so that they appear on the current monitor. Previously, they would be opened wherever the main window is. This could easily be on a different virtual desktop (or workspace): if so, the dialogue box would not be visible on any attached monitor until that workspace was selected. (This breaks some tests involving the database-open dialogue box.) --- src/browser/BrowserAccessControlDialog.cpp | 5 ++--- src/browser/BrowserAccessControlDialog.h | 2 +- src/browser/BrowserPasskeysConfirmationDialog.cpp | 5 ++--- src/browser/BrowserPasskeysConfirmationDialog.h | 2 +- src/browser/BrowserService.cpp | 10 +++++----- src/gui/DatabaseTabWidget.cpp | 2 +- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/browser/BrowserAccessControlDialog.cpp b/src/browser/BrowserAccessControlDialog.cpp index b3d9944d3..555072d2e 100644 --- a/src/browser/BrowserAccessControlDialog.cpp +++ b/src/browser/BrowserAccessControlDialog.cpp @@ -23,9 +23,8 @@ #include "core/Entry.h" #include "gui/Icons.h" -BrowserAccessControlDialog::BrowserAccessControlDialog(QWidget* parent) - : QDialog(parent) - , m_ui(new Ui::BrowserAccessControlDialog()) +BrowserAccessControlDialog::BrowserAccessControlDialog() + : m_ui(new Ui::BrowserAccessControlDialog()) { setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); diff --git a/src/browser/BrowserAccessControlDialog.h b/src/browser/BrowserAccessControlDialog.h index 3ecf5b506..d8301b291 100644 --- a/src/browser/BrowserAccessControlDialog.h +++ b/src/browser/BrowserAccessControlDialog.h @@ -41,7 +41,7 @@ class BrowserAccessControlDialog : public QDialog Q_OBJECT public: - explicit BrowserAccessControlDialog(QWidget* parent = nullptr); + explicit BrowserAccessControlDialog(); ~BrowserAccessControlDialog() override; void setEntries(const QList& entriesToConfirm, const QString& urlString, bool httpAuth); diff --git a/src/browser/BrowserPasskeysConfirmationDialog.cpp b/src/browser/BrowserPasskeysConfirmationDialog.cpp index 50bdfbc49..ba429f425 100644 --- a/src/browser/BrowserPasskeysConfirmationDialog.cpp +++ b/src/browser/BrowserPasskeysConfirmationDialog.cpp @@ -24,9 +24,8 @@ #define STEP 1000 -BrowserPasskeysConfirmationDialog::BrowserPasskeysConfirmationDialog(QWidget* parent) - : QDialog(parent) - , m_ui(new Ui::BrowserPasskeysConfirmationDialog()) +BrowserPasskeysConfirmationDialog::BrowserPasskeysConfirmationDialog() + : m_ui(new Ui::BrowserPasskeysConfirmationDialog()) , m_passkeyUpdated(false) { setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); diff --git a/src/browser/BrowserPasskeysConfirmationDialog.h b/src/browser/BrowserPasskeysConfirmationDialog.h index 6e262ffda..7a11e6acc 100644 --- a/src/browser/BrowserPasskeysConfirmationDialog.h +++ b/src/browser/BrowserPasskeysConfirmationDialog.h @@ -34,7 +34,7 @@ class BrowserPasskeysConfirmationDialog : public QDialog Q_OBJECT public: - explicit BrowserPasskeysConfirmationDialog(QWidget* parent = nullptr); + explicit BrowserPasskeysConfirmationDialog(); ~BrowserPasskeysConfirmationDialog() override; void registerCredential(const QString& username, diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index edca82270..fea692dd4 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -470,7 +470,7 @@ QList BrowserService::confirmEntries(QList& entriesToConfirm, m_dialogActive = true; updateWindowState(); - BrowserAccessControlDialog accessControlDialog(m_currentDatabaseWidget); + BrowserAccessControlDialog accessControlDialog; connect(m_currentDatabaseWidget, SIGNAL(databaseLockRequested()), &accessControlDialog, SLOT(reject())); @@ -583,7 +583,7 @@ QString BrowserService::storeKey(const QString& key) QString id; do { - QInputDialog keyDialog(m_currentDatabaseWidget); + QInputDialog keyDialog; connect(m_currentDatabaseWidget, SIGNAL(databaseLockRequested()), &keyDialog, SLOT(reject())); keyDialog.setWindowTitle(tr("KeePassXC - New key association request")); keyDialog.setLabelText(tr("You have received an association request for the following database:\n%1\n\n" @@ -607,7 +607,7 @@ QString BrowserService::storeKey(const QString& key) contains = db->metadata()->customData()->contains(CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, id)); if (contains) { - dialogResult = MessageBox::warning(m_currentDatabaseWidget, + dialogResult = MessageBox::warning(nullptr, tr("KeePassXC - Overwrite existing key?"), tr("A shared encryption key with the name \"%1\" " "already exists.\nDo you want to overwrite it?") @@ -668,7 +668,7 @@ QJsonObject BrowserService::showPasskeysRegisterPrompt(const QJsonObject& public const auto existingEntries = getPasskeyEntriesWithUserHandle(rpId, userId, keyList); raiseWindow(); - BrowserPasskeysConfirmationDialog confirmDialog(m_currentDatabaseWidget); + BrowserPasskeysConfirmationDialog confirmDialog; confirmDialog.registerCredential(username, rpId, existingEntries, timeout); auto dialogResult = confirmDialog.exec(); @@ -761,7 +761,7 @@ QJsonObject BrowserService::showPasskeysAuthenticationPrompt(const QJsonObject& const auto timeout = publicKeyOptions["timeout"].toInt(); raiseWindow(); - BrowserPasskeysConfirmationDialog confirmDialog(m_currentDatabaseWidget); + BrowserPasskeysConfirmationDialog confirmDialog; confirmDialog.authenticateCredential(entries, rpId, timeout); auto dialogResult = confirmDialog.exec(); if (dialogResult == QDialog::Accepted) { diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index c8639eb44..58fdfca39 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -41,7 +41,7 @@ DatabaseTabWidget::DatabaseTabWidget(QWidget* parent) : QTabWidget(parent) , m_dbWidgetStateSync(new DatabaseWidgetStateSync(this)) , m_dbWidgetPendingLock(nullptr) - , m_databaseOpenDialog(new DatabaseOpenDialog(this)) + , m_databaseOpenDialog(new DatabaseOpenDialog()) , m_importWizard(nullptr) , m_databaseOpenInProgress(false) {