Package: pinentry-qt
X-Debbugs-Cc: g...@nonempty.org
Version: 1.2.0-1
Severity: normal

Dear Maintainer,

With pinentry-qt 1.1.0-4, running

 echo getpin | pinentry-qt --display "Test"

would display a *floating* dialog box under the Sway WM. This is the
desired behavior. As of 1.2.0-1, it instead displays a "full-size"/tiled
window.

I bisected through upstream's later commits, and found that

 dd9f765258230cad6704afb4fab6c3deb4a8de56

fixes the problem. I'm including a patch based on

 8f239a2b133cae8ca9c1876c732d4e00d06c7d26
 7d5c123f802abce11c711d57e8796d58d6ff1a16
 dd9f765258230cad6704afb4fab6c3deb4a8de56

(read top to bottom) that I have confirmed fixes the problem. I'll also
place an MR on Salsa.


 Best,
 Gard

-- System Information:
Debian Release: bookworm/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.18.0-1-amd64 (SMP w/6 CPU threads; PREEMPT)
Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages pinentry-qt depends on:
ii  libassuan0      2.5.5-3
ii  libc6           2.33-7
ii  libgcc-s1       12.1.0-2
ii  libgpg-error0   1.45-2
ii  libncursesw6    6.3+20220423-2
ii  libqt5core5a    5.15.2+dfsg-16+b2
ii  libqt5gui5      5.15.2+dfsg-16+b2
ii  libqt5widgets5  5.15.2+dfsg-16+b2
ii  libstdc++6      12.1.0-2
ii  libtinfo6       6.3+20220423-2

pinentry-qt recommends no packages.

Versions of packages pinentry-qt suggests:
pn  pinentry-doc  <none>

-- no debconf information
From: Gard Spreemann <g...@nonempty.org>
Date: Tue, 21 Jun 2022 16:37:46 +0200
Subject: Fix floating behavior

At some point, pinentry-qt stopped producing a floating dialog box
under Sway (and perhaps other tiling Wayland WMs). Instead, it
produced a full-blown window.

The problem is fixed upstream as of dd9f765. We here cherry-pick
changes from upstream's

 8f239a2b133cae8ca9c1876c732d4e00d06c7d26
 7d5c123f802abce11c711d57e8796d58d6ff1a16
 dd9f765258230cad6704afb4fab6c3deb4a8de56

in order to fix the behavior.
---
 qt/pinentrydialog.cpp | 199 +++++++++++++++++++++++++++-----------------------
 1 file changed, 106 insertions(+), 93 deletions(-)

diff --git a/qt/pinentrydialog.cpp b/qt/pinentrydialog.cpp
index 53e394f..73caca6 100644
--- a/qt/pinentrydialog.cpp
+++ b/qt/pinentrydialog.cpp
@@ -106,6 +106,7 @@ PinEntryDialog::PinEntryDialog(QWidget *parent, const char *name,
       mRepeat(NULL),
       mRepeatError{nullptr},
       _grabbed(false),
+      _have_quality_bar{enable_quality_bar},
       _disable_echo_allowed(true),
       mEnforceConstraints(false),
       mFormatPassphrase{false},
@@ -125,58 +126,125 @@ PinEntryDialog::PinEntryDialog(QWidget *parent, const char *name,
         setWindowModality(Qt::ApplicationModal);
     }
 
+    QPalette redTextPalette;
+    redTextPalette.setColor(QPalette::WindowText, Qt::red);
+
+    auto *const mainLayout = new QVBoxLayout{this};
+
+    auto *const hbox = new QHBoxLayout;
+
     _icon = new QLabel(this);
     _icon->setPixmap(icon());
+    hbox->addWidget(_icon, 0, Qt::AlignVCenter | Qt::AlignLeft);
 
-    QPalette redTextPalette;
-    redTextPalette.setColor(QPalette::WindowText, Qt::red);
+    auto *const grid = new QGridLayout;
+    int row = 1;
 
     _error = new QLabel(this);
     _error->setPalette(redTextPalette);
     _error->hide();
+    grid->addWidget(_error, row, 1, 1, 2);
+
+    row++;
+    _desc = new QLabel(this);
+    _desc->hide();
+    grid->addWidget(_desc,  row, 1, 1, 2);
 
+    row++;
     mCapsLockHint = new QLabel(this);
     mCapsLockHint->setPalette(redTextPalette);
     mCapsLockHint->setAlignment(Qt::AlignCenter);
     mCapsLockHint->setVisible(false);
+    grid->addWidget(mCapsLockHint, row, 1, 1, 2);
 
-    _desc = new QLabel(this);
-    _desc->hide();
-
-    _prompt = new QLabel(this);
-    _prompt->hide();
+    row++;
+    {
+        _prompt = new QLabel(this);
+        _prompt->hide();
+        grid->addWidget(_prompt, row, 1);
 
-    _edit = new PinLineEdit(this);
-    _edit->setMaxLength(256);
-    _edit->setMinimumWidth(_edit->fontMetrics().averageCharWidth()*20 + 48);
-    _edit->setEchoMode(QLineEdit::Password);
+        const auto l = new QHBoxLayout;
+        _edit = new PinLineEdit(this);
+        _edit->setMaxLength(256);
+        _edit->setMinimumWidth(_edit->fontMetrics().averageCharWidth()*20 + 48);
+        _edit->setEchoMode(QLineEdit::Password);
+        _prompt->setBuddy(_edit);
+        l->addWidget(_edit, 1);
 
-    _prompt->setBuddy(_edit);
+        if (!repeatString.isNull()) {
+            mGenerateButton = new QPushButton{this};
+            mGenerateButton->setIcon(QIcon(QLatin1String(":/icons/password-generate")));
+            mGenerateButton->setVisible(false);
+            l->addWidget(mGenerateButton);
+        }
+        grid->addLayout(l, row, 2);
+    }
 
-    if (!repeatString.isNull()) {
-        mGenerateButton = new QPushButton{this};
-        mGenerateButton->setIcon(QIcon::fromTheme(QLatin1String("password-generate")));
-        mGenerateButton->setVisible(false);
-        connect(mGenerateButton, &QPushButton::clicked, this, &PinEntryDialog::generatePin);
+    /* Set up the show password action */
+    const QIcon visibilityIcon = QIcon(QLatin1String(":/icons/visibility.svg"));
+    const QIcon hideIcon = QIcon(QLatin1String(":/icons/hint.svg"));
+#if QT_VERSION >= 0x050200
+    if (!visibilityIcon.isNull() && !hideIcon.isNull()) {
+        mVisiActionEdit = _edit->addAction(visibilityIcon, QLineEdit::TrailingPosition);
+        mVisiActionEdit->setVisible(false);
+        mVisiActionEdit->setToolTip(mVisibilityTT);
+    } else
+#endif
+    {
+        if (!mVisibilityTT.isNull()) {
+            row++;
+            mVisiCB = new QCheckBox{mVisibilityTT, this};
+            grid->addWidget(mVisiCB, row, 1, 1, 2, Qt::AlignLeft);
+        }
     }
 
+    row++;
+    mConstraintsHint = new QLabel{this};
+    mConstraintsHint->setVisible(false);
+    grid->addWidget(mConstraintsHint, row, 2);
+
+    row++;
+    mFormattedPassphraseHintSpacer = new QLabel{this};
+    mFormattedPassphraseHintSpacer->setVisible(false);
+    mFormattedPassphraseHint = new QLabel{this};
+    mFormattedPassphraseHint->setVisible(false);
+    grid->addWidget(mFormattedPassphraseHintSpacer, row, 1);
+    grid->addWidget(mFormattedPassphraseHint, row, 2);
+
     if (!repeatString.isNull()) {
+        row++;
+        auto repeatLabel = new QLabel{this};
+        repeatLabel->setText(repeatString);
+        grid->addWidget(repeatLabel, row, 1);
+
         mRepeat = new PinLineEdit(this);
+        mRepeat->setMaxLength(256);
+        mRepeat->setEchoMode(QLineEdit::Password);
+        repeatLabel->setBuddy(mRepeat);
+        grid->addWidget(mRepeat, row, 2);
+
+        row++;
         mRepeatError = new QLabel{this};
         mRepeatError->setPalette(redTextPalette);
         mRepeatError->hide();
+        grid->addWidget(mRepeatError, row, 2);
     }
 
     if (enable_quality_bar) {
+        row++;
         _quality_bar_label = new QLabel(this);
         _quality_bar_label->setAlignment(Qt::AlignVCenter);
+        grid->addWidget(_quality_bar_label, row, 1);
+
         _quality_bar = new QProgressBar(this);
         _quality_bar->setAlignment(Qt::AlignCenter);
-        _have_quality_bar = true;
-    } else {
-        _have_quality_bar = false;
+        _quality_bar_label->setBuddy(_quality_bar);
+        grid->addWidget(_quality_bar, row, 2);
     }
 
+    hbox->addLayout(grid, 1);
+    mainLayout->addLayout(hbox);
+
     QDialogButtonBox *const buttons = new QDialogButtonBox(this);
     buttons->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
     _ok = buttons->button(QDialogButtonBox::Ok);
@@ -187,6 +255,10 @@ PinEntryDialog::PinEntryDialog(QWidget *parent, const char *name,
         _cancel->setIcon(style()->standardIcon(QStyle::SP_DialogCancelButton));
     }
 
+    mainLayout->addStretch(1);
+    mainLayout->addWidget(buttons);
+    mainLayout->setSizeConstraint(QLayout::SetFixedSize);
+
     if (timeout > 0) {
         _timer = new QTimer(this);
         connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
@@ -203,84 +275,25 @@ PinEntryDialog::PinEntryDialog(QWidget *parent, const char *name,
             this, SLOT(textChanged(QString)));
     connect(_edit, SIGNAL(backspacePressed()),
             this, SLOT(onBackspace()));
-    if (mRepeat) {
-        connect(_edit, &QLineEdit::returnPressed,
-                this, [this] { mRepeat->setFocus(); });
+    if (mGenerateButton) {
+        connect(mGenerateButton, &QPushButton::clicked,
+                this, &PinEntryDialog::generatePin);
     }
-
-    auto *const mainLayout = new QVBoxLayout{this};
-
-    auto *const hbox = new QHBoxLayout;
-
-    hbox->addWidget(_icon, 0, Qt::AlignVCenter | Qt::AlignLeft);
-
-    auto *const grid = new QGridLayout;
-    int row = 1;
-    grid->addWidget(_error, row++, 1, 1, 2);
-    grid->addWidget(_desc,  row++, 1, 1, 2);
-    grid->addWidget(mCapsLockHint, row++, 1, 1, 2);
-
-    grid->addWidget(_prompt, row, 1);
-    {
-        const auto l = new QHBoxLayout;
-        l->addWidget(_edit, 1);
-        if (mGenerateButton) {
-            l->addWidget(mGenerateButton);
-        }
-        grid->addLayout(l, row++, 2);
+    if (mVisiActionEdit) {
+        connect(mVisiActionEdit, SIGNAL(triggered()),
+                this, SLOT(toggleVisibility()));
+    }
+    if (mVisiCB) {
+        connect(mVisiCB, SIGNAL(toggled(bool)),
+                this, SLOT(toggleVisibility()));
     }
-
-    mConstraintsHint = new QLabel;
-    mConstraintsHint->setVisible(false);
-    grid->addWidget(mConstraintsHint, row++, 2);
-
-    mFormattedPassphraseHintSpacer = new QLabel;
-    mFormattedPassphraseHintSpacer->setVisible(false);
-    mFormattedPassphraseHint = new QLabel;
-    mFormattedPassphraseHint->setVisible(false);
-    grid->addWidget(mFormattedPassphraseHintSpacer, row, 1);
-    grid->addWidget(mFormattedPassphraseHint, row++, 2);
-
     if (mRepeat) {
-        mRepeat->setMaxLength(256);
-        mRepeat->setEchoMode(QLineEdit::Password);
         connect(mRepeat, SIGNAL(textChanged(QString)),
                 this, SLOT(textChanged(QString)));
-        QLabel *repeatLabel = new QLabel(repeatString);
-        repeatLabel->setBuddy(mRepeat);
-        grid->addWidget(repeatLabel, row, 1);
-        grid->addWidget(mRepeat, row++, 2);
-        grid->addWidget(mRepeatError, row++, 2);
-    }
-    if (enable_quality_bar) {
-        grid->addWidget(_quality_bar_label, row, 1);
-        grid->addWidget(_quality_bar, row++, 2);
-    }
-    /* Set up the show password action */
-    const QIcon visibilityIcon = QIcon::fromTheme(QLatin1String("visibility"));
-    const QIcon hideIcon = QIcon::fromTheme(QLatin1String("hint"));
-#if QT_VERSION >= 0x050200
-    if (!visibilityIcon.isNull() && !hideIcon.isNull()) {
-        mVisiActionEdit = _edit->addAction(visibilityIcon, QLineEdit::TrailingPosition);
-        mVisiActionEdit->setVisible(false);
-        mVisiActionEdit->setToolTip(mVisibilityTT);
-        connect(mVisiActionEdit, SIGNAL(triggered()), this, SLOT(toggleVisibility()));
-    } else
-#endif
-    {
-        if (!mVisibilityTT.isNull()) {
-            mVisiCB = new QCheckBox(mVisibilityTT);
-            connect(mVisiCB, SIGNAL(toggled(bool)), this, SLOT(toggleVisibility()));
-            grid->addWidget(mVisiCB, row++, 1, 1, 2, Qt::AlignLeft);
-        }
+        connect(_edit, &QLineEdit::returnPressed,
+                this, [this] { mRepeat->setFocus(); });
     }
 
-    hbox->addLayout(grid, 1);
-
-    mainLayout->addLayout(hbox);
-    mainLayout->addStretch(1);
-    mainLayout->addWidget(buttons);
-
     auto capsLockWatcher = new CapsLockWatcher{this};
     connect(capsLockWatcher, &CapsLockWatcher::stateChanged,
             this, [this] (bool locked) {
@@ -583,7 +596,7 @@ void PinEntryDialog::toggleVisibility()
     if (sender() != mVisiCB) {
         if (_edit->echoMode() == QLineEdit::Password) {
             if (mVisiActionEdit) {
-                mVisiActionEdit->setIcon(QIcon::fromTheme(QLatin1String("hint")));
+                mVisiActionEdit->setIcon(QIcon(QLatin1String(":/icons/hint.svg")));
                 mVisiActionEdit->setToolTip(mHideTT);
             }
             _edit->setEchoMode(QLineEdit::Normal);
@@ -592,7 +605,7 @@ void PinEntryDialog::toggleVisibility()
             }
         } else {
             if (mVisiActionEdit) {
-                mVisiActionEdit->setIcon(QIcon::fromTheme(QLatin1String("visibility")));
+                mVisiActionEdit->setIcon(QIcon(QLatin1String(":/icons/visibility.svg")));
                 mVisiActionEdit->setToolTip(mVisibilityTT);
             }
             _edit->setEchoMode(QLineEdit::Password);

Attachment: signature.asc
Description: PGP signature

Reply via email to