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);
signature.asc
Description: PGP signature