Applied patches to the qt4 versions.
authorWerner Koch <wk@gnupg.org>
Tue, 16 Feb 2010 18:58:19 +0000 (18:58 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 16 Feb 2010 18:58:19 +0000 (18:58 +0000)
Note: It does not build.

ChangeLog
qt4/document-encrypt.png [new file with mode: 0644]
qt4/gtk-cancel.png [new file with mode: 0644]
qt4/gtk-ok.png [new file with mode: 0644]
qt4/main.cpp
qt4/pinentrydialog.cpp
qt4/pinentrydialog.h
qt4/pinentrydialog.moc

index 1f649c9..ec2258c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,77 @@
+2010-02-16  Werner Koch  <wk@g10code.com>
+
+       * qt4/document-encrypt.png, qt4/gtk-cancel.png, qt4/gtk-ok.png: New.
+       * qt4/Makefile.am (EXTRA_DIST): Add them.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>  (wk)
+
+       Also attributed to Marc Mutz <marc@kdab.com>.
+
+       * qt4/main.cpp, qt/pinentrydialog.cpp: If the style says so,
+       set (GTK) icons on OK and Cancel buttons.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>  (wk)
+
+       * qt4/main.cpp: Use an explicit QMessageBox instead of the
+       'information' convenience method.  We do this for two reasons:
+       1. So we can set our own icon (icon()).  2. So we can call our
+       raiseWindow() function on it.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>
+
+       * qt4/main.cpp: Use title. Use Qt translation of "OK" and "Cancel"
+
+       * qt4/pinentrydialog.cpp: Don't show the question-mark icon in the
+       window title.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>  (wk)
+
+       * qt4/pinentrydialog.h, qt4/pinentrydialog.cpp: Use the
+       document-encrypt icon instead of the
+       QMessageBox::{Information,Critical} ones.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>  (wk)
+
+       Also attributed to Marc Mutz <marc@kdab.com>.
+
+       * qt4/pinentrydialog.cpp: Properly show/hide optional widgets.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>
+
+       * qt4/pinentrydialog.cpp: Set text color or error label to red.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>  (wk)
+
+       Also attributed to Marc Mutz <marc@kdab.com>.
+
+       * qt4/pinentrydialog.cpp: Gather scattered layouting code, use a
+       single gridlayout for all, and use QDialogButtonBox.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>  (wk)
+
+       * qt4/pinentrydialog.cpp: Call SetForegroundWindow on showEvent()
+       and set a fixed size on the dialog.
+
+       * qt4/main.cpp: Set document-encrypt as the window icon.
+
+2010-02-15  Marc Mutz <marc@kdab.com>  (wk)
+
+       * qt4/main.cpp: Load the correct Qt translation file based on
+       either lc_messages or the current locale.
+
+       * qt4/main.cpp: Use pinentry_t->parent_wid also for message-box
+       case.
+
+       * qt4/main.cpp: Properly delete the QApplication.
+
+2010-02-15  Christoph Schleifenbaum <christoph@kdab.com>  (wk)
+
+       * qt4/main.cpp: Remove guard clause with impossible condition.
+
+       * qt4/main.cpp: Respect pinentry_t->title.
+
+       * qt4/main.cpp: Include config.h.
+
 2009-12-16  Marcus Brinkmann  <marcus@g10code.de>
 
        * gtk+-2/gtksecentry.c: Don't translate properties.
diff --git a/qt4/document-encrypt.png b/qt4/document-encrypt.png
new file mode 100644 (file)
index 0000000..b80c2a6
Binary files /dev/null and b/qt4/document-encrypt.png differ
diff --git a/qt4/gtk-cancel.png b/qt4/gtk-cancel.png
new file mode 100644 (file)
index 0000000..0a395c0
Binary files /dev/null and b/qt4/gtk-cancel.png differ
diff --git a/qt4/gtk-ok.png b/qt4/gtk-ok.png
new file mode 100644 (file)
index 0000000..c08115f
Binary files /dev/null and b/qt4/gtk-ok.png differ
index bfca020..5f49817 100644 (file)
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 
 #include "pinentrydialog.h"
 #include "pinentry.h"
 
 #include <qapplication.h>
+#include <QIcon>
 #include <QString>
 #include <qwidget.h>
 #include <qmessagebox.h>
+#include <QLocale>
+#include <QTranslator>
+#include <QDialogButtonBox>
+#include <QPushButton>
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
 
+#include <memory>
+
 #ifdef FALLBACK_CURSES
 #include <pinentry-curses.h>
 #endif
@@ -62,19 +72,27 @@ qt_cmd_handler (pinentry_t pe)
 {
   QWidget *parent = 0;
 
+  QTranslator trans;
+  const QString lang = pe->lc_messages ? QString::fromLatin1 (pe->lc_messages) : QLocale ().name () ;
+  if( trans.load (QString::fromLatin1(":/qt_%1").arg(lang)) )
+    qApp->installTranslator (&trans);
+
+  /* FIXME: Add parent window ID to pinentry and GTK.  */
+  if (pe->parent_wid)
+    parent = new ForeignWidget ((WId) pe->parent_wid);
+
   int want_pass = !!pe->pin;
 
   if (want_pass)
     {
-      /* FIXME: Add parent window ID to pinentry and GTK.  */
-      if (pe->parent_wid)
-       parent = new ForeignWidget ((WId) pe->parent_wid);
-
       PinEntryDialog pinentry (parent, 0, true, !!pe->quality_bar);
 
       pinentry.setPinentryInfo (pe);
       pinentry.setPrompt (QString::fromUtf8 (pe->prompt));
       pinentry.setDescription (QString::fromUtf8 (pe->description));
+      if ( pe->title )
+          pinentry.setWindowTitle( QString::fromUtf8( pe->title ) );
+
       /* If we reuse the same dialog window.  */
       pinentry.setPin (secqstring());
 
@@ -95,8 +113,6 @@ qt_cmd_handler (pinentry_t pe)
 
       const secstring pinUtf8 = toUtf8( pinentry.pin() );
       const char *pin = pinUtf8.data();
-      if (!pin)
-       return -1;
 
       int len = strlen (pin);
       if (len >= 0)
@@ -112,14 +128,48 @@ qt_cmd_handler (pinentry_t pe)
     }
   else
     {
-      QString desc = QString::fromUtf8 (pe->description? pe->description :"");
-      QString ok   = QString::fromUtf8 (pe->ok ? pe->ok : "OK");
-      QString can  = QString::fromUtf8 (pe->cancel ? pe->cancel : "Cancel");
-      bool ret;
+      const QString title = pe->title       ? QString::fromUtf8 ( pe->title )       : QString();
+      const QString desc  = pe->description ? QString::fromUtf8 ( pe->description ) : QString();
+      const QString ok    = pe->ok          ? QString::fromUtf8 ( pe->ok )          : QDialogButtonBox::tr( "&OK" );
+      const QString can   = pe->cancel      ? QString::fromUtf8 ( pe->cancel )      : QDialogButtonBox::tr( "Cancel" );
+
+      QMessageBox box( parent );
+
+      if ( !title.isEmpty() )
+        box.setWindowTitle( title );
+
+      if ( !ok.isEmpty() )
+          if ( !can.isEmpty() )
+              box.setStandardButtons( QMessageBox::Ok|QMessageBox::Cancel );
+          else
+              box.setStandardButtons( QMessageBox::Ok );
+      else
+          if ( !can.isEmpty() )
+              box.setStandardButtons( QMessageBox::Cancel );
+          else
+              box.setStandardButtons( QMessageBox::NoButton );
+
+      if ( !ok.isEmpty() )
+        {
+          box.button( QMessageBox::Ok )->setText( ok );
+          if ( box.style()->styleHint( QStyle::SH_DialogButtonBox_ButtonsHaveIcons ) )
+            box.button( QMessageBox::Ok )->setIcon( QIcon( QLatin1String( ":/gtk-ok.png" ) ) );
+        }
 
-      ret = QMessageBox::information (parent, "", desc, ok, can );
+      if ( !can.isEmpty() )
+        {
+          box.button( QMessageBox::Cancel )->setText( can );
+          if ( box.style()->styleHint( QStyle::SH_DialogButtonBox_ButtonsHaveIcons ) )
+            box.button( QMessageBox::Cancel )->setIcon( QIcon( QLatin1String( ":/gtk-cancel.png" ) ) );
+        }
+
+      box.setText( desc );
+      box.setIconPixmap( icon() );
 
-      return !ret;
+      box.show();
+      raiseWindow( &box );
+
+      return box.exec() == QMessageBox::Ok ;
     }
 }
 
@@ -130,6 +180,8 @@ main (int argc, char *argv[])
 {
   pinentry_init ("pinentry-qt4");
 
+  std::auto_ptr<QApplication> app;
+
 #ifdef FALLBACK_CURSES
   if (!pinentry_have_display (argc, argv))
     pinentry_cmd_handler = curses_cmd_handler;
@@ -171,7 +223,9 @@ main (int argc, char *argv[])
       /* We use a modal dialog window, so we don't need the application
          window anymore.  */
       i = argc;
-      new QApplication (i, new_argv);
+      app.reset (new QApplication (i, new_argv));
+      const QIcon icon( QLatin1String( ":/document-encrypt.png" ) );
+      app->setWindowIcon( icon );
     }
 
 
@@ -179,11 +233,11 @@ main (int argc, char *argv[])
   if (pinentry_parse_opts (argc, argv))
     {
       printf ("pinentry-qt4 (pinentry) " /* VERSION */ "\n");
-      exit (EXIT_SUCCESS);
+      return EXIT_SUCCESS;
+    }
+  else
+    {
+      return pinentry_loop () ? EXIT_FAILURE : EXIT_SUCCESS ;
     }
 
-  if (pinentry_loop ())
-    return 1;
-
-  return 0;
 }
index 2994294..da0ebda 100644 (file)
 
 #include "qsecurelineedit.h"
 
+#include <QApplication>
+#include <QStyle>
+#include <QPainter>
 #include <QVBoxLayout>
 #include <QHBoxLayout>
 #include <QPushButton>
+#include <QDialogButtonBox>
 #include <QKeyEvent>
 #include <QLabel>
 #include <QMessageBox>
+#include <QTextDocument>
+#include <QPalette>
+
+#ifdef Q_WS_WIN
+#include <windows.h>
+#endif
+
+#ifdef Q_WS_WIN
+void SetForegroundWindowEx( HWND hWnd )
+{
+   //Attach foreground window thread to our thread
+   const DWORD ForeGroundID = GetWindowThreadProcessId(::GetForegroundWindow(),NULL);
+   const DWORD CurrentID   = GetCurrentThreadId();
+   AttachThreadInput ( ForeGroundID, CurrentID, TRUE );
+   //Do our stuff here
+   HWND hLastActivePopupWnd = GetLastActivePopup( hWnd );
+   SetForegroundWindow( hLastActivePopupWnd );
+   //Detach the attached thread
+   AttachThreadInput ( ForeGroundID, CurrentID, FALSE );
+}// End SetForegroundWindowEx
+#endif
+
+void raiseWindow( QWidget* w )
+{
+#ifdef Q_WS_WIN
+    SetForegroundWindowEx( w->winId() );
+#endif
+    w->raise();
+    w->activateWindow();
+}
+
+QPixmap icon( QStyle::StandardPixmap which )
+{
+    QPixmap pm = qApp->windowIcon().pixmap( 48, 48 );
+   
+    if ( which != QStyle::SP_CustomBase ) {
+        const QIcon ic = qApp->style()->standardIcon( which );
+        QPainter painter( &pm );
+        const int emblemSize = 22;
+        painter.drawPixmap( pm.width()-emblemSize, 0,
+                            ic.pixmap( emblemSize, emblemSize ) );
+    }
+
+    return pm;
+}
 
 PinEntryDialog::PinEntryDialog( QWidget* parent, const char* name, bool modal,
                                 bool enable_quality_bar )
   : QDialog( parent ), _grabbed( false )
 {
+  setWindowFlags( windowFlags() & ~Qt::WindowContextHelpButtonHint );
+
   if ( modal ) {
     setWindowModality( Qt::ApplicationModal );
   }
 
-  QBoxLayout* top = new QVBoxLayout( this );
-  top->setMargin( 6 );
-  QBoxLayout* upperLayout = new QHBoxLayout();
-  top->addLayout( upperLayout, 1 );
-
   _icon = new QLabel( this );
-  _icon->setPixmap( QMessageBox::standardIcon( QMessageBox::Information ) );
-  upperLayout->addWidget( _icon );
-
-  QBoxLayout* labelLayout = new QVBoxLayout();
-  upperLayout->addLayout( labelLayout, 5 );
+  _icon->setPixmap( icon() );
 
   _error = new QLabel( this );
   _error->setWordWrap(true);
-  labelLayout->addWidget( _error, 1 );
+  QPalette pal;
+  pal.setColor( QPalette::WindowText, Qt::red );
+  _error->setPalette( pal );
+  _error->hide();
 
   _desc = new QLabel( this );
   _desc->setWordWrap(true);
-  labelLayout->addWidget( _desc, 5 );
-
-  QGridLayout* grid = new QGridLayout;
-  top->addLayout( grid );
+  _desc->hide();
 
   _prompt = new QLabel( this );
-  grid->addWidget( _prompt, 0, 0 );
+  _prompt->hide();
+
   _edit = new QSecureLineEdit( this );
   _edit->setMaxLength( 256 );
-  grid->addWidget( _edit, 0, 1 );
 
   if (enable_quality_bar)
   {
     _quality_bar_label = new QLabel( this );
     _quality_bar_label->setAlignment( Qt::AlignRight | Qt::AlignVCenter );
-    grid->addWidget ( _quality_bar_label, 1, 0 );
     _quality_bar = new QProgressBar( this );
     _quality_bar->setAlignment( Qt::AlignCenter );
-    grid->addWidget( _quality_bar, 1, 1 );
     _have_quality_bar = true;
   }
   else
     _have_quality_bar = false;
 
-  QBoxLayout* l = new QHBoxLayout();
-  top->addLayout( l );
-
-  _ok = new QPushButton( tr("OK"), this );
-  _cancel = new QPushButton( tr("Cancel"), this );
-
-  l->addWidget( _ok );
-  l->addStretch();
-  l->addWidget( _cancel );
+  QDialogButtonBox* const buttons = new QDialogButtonBox( this );
+  buttons->setStandardButtons( QDialogButtonBox::Ok | QDialogButtonBox::Cancel );
+  _ok = buttons->button( QDialogButtonBox::Ok );
+  _cancel = buttons->button( QDialogButtonBox::Cancel );
 
   _ok->setDefault(true);
 
+  if ( style()->styleHint( QStyle::SH_DialogButtonBox_ButtonsHaveIcons ) )
+    {
+      _ok->setIcon( QIcon( QLatin1String( ":/gtk-ok.png" ) ) );
+      _cancel->setIcon( QIcon( QLatin1String( ":/gtk-cancel.png" ) ) );
+    }
   connect( _ok, SIGNAL( clicked() ),
           this, SIGNAL( accepted() ) );
   connect( _cancel, SIGNAL( clicked() ),
@@ -107,6 +150,25 @@ PinEntryDialog::PinEntryDialog( QWidget* parent, const char* name, bool modal,
           this, SLOT (reject ()));
 
   _edit->setFocus();
+
+  QBoxLayout* const labels = new QVBoxLayout;
+  labels->addWidget( _error );
+  labels->addWidget( _desc );
+  labels->addItem( new QSpacerItem( 0, 1, QSizePolicy::Minimum, QSizePolicy::Expanding ) );
+
+  QGridLayout* const grid = new QGridLayout( this );
+  grid->addWidget( _icon, 0, 0, 4, 1, Qt::AlignTop|Qt::AlignLeft );
+  grid->addLayout( labels, 0, 1, 1, 2 );
+  grid->addItem( new QSpacerItem( 0, _edit->height() / 10, QSizePolicy::Minimum, QSizePolicy::Fixed ), 1, 1 );
+  grid->addWidget( _prompt, 2, 1 );
+  grid->addWidget( _edit, 2, 2 );
+  if( enable_quality_bar )
+  {
+    grid->addWidget( _quality_bar_label, 3, 1 );
+    grid->addWidget( _quality_bar, 3, 2 );
+  }
+  grid->addWidget( buttons, 4, 0, 1, 3 );
+
   setMinimumWidth( 450 );
   resize( minimumSizeHint() );
 }
@@ -119,6 +181,27 @@ void PinEntryDialog::hideEvent( QHideEvent* ev )
   QDialog::hideEvent( ev );
 }
 
+void PinEntryDialog::showEvent( QShowEvent* event )
+{
+    QDialog::showEvent( event );
+    QMetaObject::invokeMethod( this, "setFixedSize", Qt::QueuedConnection );
+}
+
+void PinEntryDialog::setFixedSize()
+{
+    QTextDocument doc;
+    doc.setDefaultFont( _desc->font() );
+    doc.setHtml( _desc->text() );
+    doc.setTextWidth( _desc->width() );
+    _desc->setFixedSize( doc.size().toSize() );
+   
+    layout()->activate();
+    setFixedHeight( minimumSizeHint().height() + 5 );
+    QDialog::setFixedSize( size() );
+    
+    raiseWindow( this );
+}
+
 void PinEntryDialog::keyPressEvent( QKeyEvent* e )
 {
   if ( e->modifiers() == Qt::NoModifier && e->key() == Qt::Key_Escape ) {
@@ -130,8 +213,9 @@ void PinEntryDialog::keyPressEvent( QKeyEvent* e )
 
 void PinEntryDialog::setDescription( const QString& txt )
 {
+  _desc->setVisible( !txt.isEmpty() );
   _desc->setText( txt );
-  _icon->setPixmap( QMessageBox::standardIcon( QMessageBox::Information ) );
+  _icon->setPixmap( icon() );
   setError( QString::null );
 }
 
@@ -142,8 +226,9 @@ QString PinEntryDialog::description() const
 
 void PinEntryDialog::setError( const QString& txt )
 {
-  if( !txt.isNull() )_icon->setPixmap( QMessageBox::standardIcon( QMessageBox::Critical ) );
+  if( !txt.isNull() )_icon->setPixmap( icon( QStyle::SP_MessageBoxCritical ) );
   _error->setText( txt );
+  _error->setVisible( !txt.isEmpty() );
 }
 
 QString PinEntryDialog::error() const
@@ -164,6 +249,7 @@ secqstring PinEntryDialog::pin() const
 void PinEntryDialog::setPrompt( const QString& txt )
 {
   _prompt->setText( txt );
+  _prompt->setVisible( !txt.isEmpty() );
 }
 
 QString PinEntryDialog::prompt() const
@@ -174,11 +260,13 @@ QString PinEntryDialog::prompt() const
 void PinEntryDialog::setOkText( const QString& txt )
 {
   _ok->setText( txt );
+  _ok->setVisible( !txt.isEmpty() );
 }
 
 void PinEntryDialog::setCancelText( const QString& txt )
 {
   _cancel->setText( txt );
+  _cancel->setVisible( !txt.isEmpty() );
 }
 
 void PinEntryDialog::setQualityBar( const QString& txt )
index cace63a..1d925ef 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <QProgressBar>
 #include <QDialog>
+#include <QStyle>
 
 #include "secstring.h"
 #include "pinentry.h"
@@ -35,7 +36,9 @@ class QPushButton;
 class QSecureLineEdit;
 class QString;
 
+QPixmap icon( QStyle::StandardPixmap which = QStyle::SP_CustomBase );
 
+void raiseWindow( QWidget* w );
 
 class PinEntryDialog : public QDialog {
   Q_OBJECT
@@ -76,10 +79,14 @@ signals:
   void rejected();
 
 protected:
+  /* reimp */ void showEvent( QShowEvent* event );
   /* reimp */ void keyPressEvent( QKeyEvent *e );
   /* reimp */ void hideEvent( QHideEvent* );
   /* reimp */ void paintEvent( QPaintEvent* event );
 
+private Q_SLOTS:
+  void setFixedSize();
+
 private:
   QLabel*    _icon;
   QLabel*    _desc;
index 82b7906..e0972e4 100644 (file)
@@ -23,8 +23,8 @@ static const uint qt_meta_data_PinEntryDialog[] = {
        1,       // revision
        0,       // classname
        0,    0, // classinfo
-       3,   10, // methods
-       4,   25, // properties
+       4,   10, // methods
+       4,   30, // properties
        0,    0, // enums/sets
 
  // signals: signature, parameters, type, tag, flags
@@ -33,21 +33,22 @@ static const uint qt_meta_data_PinEntryDialog[] = {
 
  // slots: signature, parameters, type, tag, flags
       38,   15,   15,   15, 0x0a,
+      64,   15,   15,   15, 0x08,
 
  // properties: name, type, flags
-      72,   64, 0x0a095103,
-      84,   64, 0x0a095103,
-     101,   90, 0x0009510b,
-     105,   64, 0x0a095103,
+      87,   79, 0x0a095103,
+      99,   79, 0x0a095103,
+     116,  105, 0x0009510b,
+     120,   79, 0x0a095103,
 
        0        // eod
 };
 
 static const char qt_meta_stringdata_PinEntryDialog[] = {
     "PinEntryDialog\0\0accepted()\0rejected()\0"
-    "updateQuality(secqstring)\0QString\0"
-    "description\0error\0secqstring\0pin\0"
-    "prompt\0"
+    "updateQuality(secqstring)\0setFixedSize()\0"
+    "QString\0description\0error\0secqstring\0"
+    "pin\0prompt\0"
 };
 
 const QMetaObject PinEntryDialog::staticMetaObject = {
@@ -78,8 +79,9 @@ int PinEntryDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
         case 0: accepted(); break;
         case 1: rejected(); break;
         case 2: updateQuality((*reinterpret_cast< const secqstring(*)>(_a[1]))); break;
+        case 3: setFixedSize(); break;
         }
-        _id -= 3;
+        _id -= 4;
     }
 #ifndef QT_NO_PROPERTIES
       else if (_c == QMetaObject::ReadProperty) {