Applied batch from Bernhard Herzog.
authorWerner Koch <wk@gnupg.org>
Mon, 19 Nov 2007 12:36:53 +0000 (12:36 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 19 Nov 2007 12:36:53 +0000 (12:36 +0000)
Allow caller to set the toolip.

The QT versions still crashes - someone else might want to look into it. TIA.

ChangeLog
assuan/assuan-util.c
doc/pinentry.texi
gtk+-2/gtksecentry.c
gtk+-2/pinentry-gtk-2.c
pinentry/pinentry.c
pinentry/pinentry.h
qt/main.cpp
qt/pinentrydialog.cpp
qt/pinentrydialog.h

index a6d274a..fae7afb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2007-11-19  Werner Koch  <wk@g10code.com>
+
+       * gtk+-2/pinentry-gtk-2.c (create_window): Use again map-event and
+       unmap-event as this works on my setup far more reliable than
+       expose-event/no-expose-event.
+
+       * gtk+-2/gtksecentry.c (get_cursor_time): s/time/blinktime/ t
+       avoid shadowing warning.
+
+       * pinentry/pinentry.h (struct pinentry): Change QUALITY_BAR to a
+       char ptr.
+       (struct pinentry): Add QUALITY_BAR_TT.
+       * pinentry/pinentry.c (cmd_setqualitybar): Allow to set a label text.
+       (cmd_setqualitybar_tt): New.
+       * gtk+-2/pinentry-gtk-2.c (create_window): Take label and tooltip
+       from global.
+       * qt/pinentrydialog.h (setQualityBar, setQualityBarTT)
+       (_quality_bar_label): New.
+       * qt/pinentrydialog.cpp (setQualityBar, setQualityBarTT): New.
+       (PinEntryDialog): Remove setting of tooltip.
+       * qt/main.cpp (qt_cmd_handler): Propagate quality bar label and tootip.
+
+2007-11-19  Bernhard Herzog  <bernhard.herzog@intevation.de>  (wk)
+
+       * qt/pinentrydialog.cpp (PinEntryDialog): Move the quality bar
+       below the text entry and align them properly.  Show a tooltip.
+       * gtk+-2/pinentry-gtk-2.c (create_window): Ditto.  Don't let it
+       change its height.
+       (QUALITYBAR_EMPTY_TEXT): New.
+
 2007-09-18  Werner Koch  <wk@g10code.com>
 
        * qt/secqlineedit.h (SecQLineEdit): New signal textModified.
index 4153ef8..c2c899f 100644 (file)
@@ -161,7 +161,7 @@ _assuan_log_print_buffer (FILE *fp, const void *buffer, size_t length)
 void
 _assuan_log_sanitized_string (const char *string)
 {
-  const unsigned char *s = string;
+  const unsigned char *s = (const unsigned char*)string;
 #ifdef HAVE_JNLIB_LOGGING
   FILE *fp = log_get_stream ();
 #else
index afa05be..1db2d4d 100644 (file)
@@ -288,6 +288,11 @@ displayed in red.
   S: OK
 @end example
 
+If a custom laber for the auality bar is required, just add that label
+as an argument as precent escaped string.  You will need this feature to
+translate the label because pinentry has no internal gettext except for
+stock strings from the toolkit library.
+
 @item Ask for a PIN
 The meat of this tool is to ask for a passphrase of PIN, it is done with
 this command:
index 688eb22..c2e433d 100644 (file)
@@ -3210,11 +3210,11 @@ static gint
 get_cursor_time(GtkSecureEntry * entry)
 {
     GtkSettings *settings = gtk_widget_get_settings(GTK_WIDGET(entry));
-    gint time;
+    gint blinktime;
 
-    g_object_get(settings, "gtk-cursor-blink-time", &time, NULL);
+    g_object_get(settings, "gtk-cursor-blink-time", &blinktime, NULL);
 
-    return time;
+    return blinktime;
 }
 
 static void
index aab61dc..212c473 100644 (file)
@@ -59,11 +59,19 @@ static GtkWidget *entry;
 static GtkWidget *qualitybar;
 static GtkWidget *insure;
 static GtkWidget *time_out;
+static GtkTooltips *tooltips;
 
 /* Gnome hig small and large space in pixels.  */
 #define HIG_SMALL      6
 #define HIG_LARGE     12
 
+/* The text shown in the quality bar when no text is shown.  This is not
+ * the empty string, becase because with an empty string the height of
+ * the quality bar is less than with a non-empty string.  This results
+ * in ugly layout changes when the text changes from non-empty to empty
+ * and vice versa */
+#define QUALITYBAR_EMPTY_TEXT " "
+
 \f
 /* Constrain size of the window the window should not shrink beyond
    the requisition, and should not grow vertically.  */
@@ -203,7 +211,7 @@ changed_text_handler (GtkWidget *widget)
   percent = length? pinentry_inq_quality (pinentry, s, length) : 0;
   if (!length)
     {
-      *textbuf = 0;
+      strcpy(textbuf, QUALITYBAR_EMPTY_TEXT);
       color.red = 0xffff;
     }
   else if (percent < 0)
@@ -229,11 +237,13 @@ static GtkWidget *
 create_window (int confirm_mode)
 {
   GtkWidget *w;
-  GtkWidget *win, *box, *ebox;
+  GtkWidget *win, *box;
   GtkWidget *wvbox, *chbox, *bbox;
   GtkAccelGroup *acc;
   gchar *msg;
 
+  tooltips = gtk_tooltips_new ();
+
   /* FIXME: check the grabbing code against the one we used with the
      old gpg-agent */
   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -251,10 +261,10 @@ create_window (int confirm_mode)
   if (!confirm_mode)
     {
       g_signal_connect (G_OBJECT (win),
-                       pinentry->grab ? "expose-event" : "focus-in-event",
+                       pinentry->grab ? "map-event" : "focus-in-event",
                        G_CALLBACK (grab_keyboard), NULL);
       g_signal_connect (G_OBJECT (win),
-                       pinentry->grab ? "no-expose-event" : "focus-out-event",
+                       pinentry->grab ? "unmap-event" : "focus-out-event",
                        G_CALLBACK (ungrab_keyboard), NULL);
     }
   gtk_window_add_accel_group (GTK_WINDOW (win), acc);
@@ -295,28 +305,23 @@ create_window (int confirm_mode)
       gtk_box_pack_start (GTK_BOX (box), w, TRUE, FALSE, 0);
       gtk_widget_modify_fg (w, GTK_STATE_NORMAL, &color);
     }
-  
-  if (pinentry->quality_bar)
-    {
-      qualitybar = gtk_progress_bar_new();
-      gtk_progress_bar_set_text (GTK_PROGRESS_BAR (qualitybar), "");
-      gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (qualitybar), 0.0);
-      gtk_box_pack_start (GTK_BOX (box), qualitybar, TRUE, FALSE, 0);
-    }
-  else
-    qualitybar = NULL;
-  
-  ebox = gtk_hbox_new (FALSE, HIG_SMALL);
-  gtk_box_pack_start (GTK_BOX(box), ebox, FALSE, FALSE, 0);
+
+  qualitybar = NULL;
 
   if (!confirm_mode)
     {
+      GtkWidget* table = gtk_table_new (pinentry->quality_bar ? 2 : 1, 2,
+                                       FALSE);
+      gtk_box_pack_start (GTK_BOX (box), table, FALSE, FALSE, 0);
+
       if (pinentry->prompt)
        {
          msg = pinentry_utf8_validate (pinentry->prompt);
          w = gtk_label_new (msg);
          g_free (msg);
-         gtk_box_pack_start (GTK_BOX (ebox), w, FALSE, FALSE, 0);
+         gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
+                           GTK_FILL, GTK_FILL, 4, 0);
        }
 
       entry = gtk_secure_entry_new ();
@@ -325,10 +330,32 @@ create_window (int confirm_mode)
                        G_CALLBACK (enter_callback), entry);
       g_signal_connect (G_OBJECT (entry), "changed",
                         G_CALLBACK (changed_text_handler), entry);
-      gtk_box_pack_start (GTK_BOX (ebox), entry, TRUE, TRUE, 0);
+      gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
+                        GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL, 0, 0);
       gtk_widget_grab_focus (entry);
       gtk_widget_show (entry);
 
+      if (pinentry->quality_bar)
+       {
+          msg = pinentry_utf8_validate (pinentry->quality_bar);
+         w = gtk_label_new (msg);
+          g_free (msg);
+         gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
+                           GTK_FILL, GTK_FILL, 4, 0);
+         qualitybar = gtk_progress_bar_new();
+         gtk_widget_add_events (qualitybar,
+                                GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
+         gtk_progress_bar_set_text (GTK_PROGRESS_BAR (qualitybar),
+                                    QUALITYBAR_EMPTY_TEXT);
+         gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (qualitybar), 0.0);
+          if (pinentry->quality_bar_tt)
+            gtk_tooltips_set_tip (GTK_TOOLTIPS (tooltips), qualitybar,
+                                  pinentry->quality_bar_tt, "");
+         gtk_table_attach (GTK_TABLE (table), qualitybar, 1, 2, 1, 2,
+                           GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL, 0, 0);
+       }
+
       if (pinentry->enhanced)
        {
          GtkWidget *sbox = gtk_hbox_new (FALSE, HIG_SMALL);
index 0def6ff..e906b8d 100644 (file)
@@ -69,7 +69,8 @@ struct pinentry pinentry =
     0,         /* Result.  */
     0,          /* Locale error flag. */
     0,          /* One-button flag.  */
-    0,          /* Quality-Bar flag.  */
+    NULL,       /* Quality-Bar flag and description.  */
+    NULL,       /* Quality-Bar tooltip.  */
     PINENTRY_COLOR_DEFAULT,
     0,
     PINENTRY_COLOR_DEFAULT,
@@ -640,7 +641,7 @@ option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value)
 }
 
 
-/* note, that it is sufficient to allocate the target string D as
+/* Note, that it is sufficient to allocate the target string D as
    long as the source string S, i.e.: strlen(s)+1; */
 static void
 strcpy_escaped (char *d, const unsigned char *s)
@@ -749,7 +750,41 @@ cmd_setcancel (ASSUAN_CONTEXT ctx, char *line)
 static int
 cmd_setqualitybar (ASSUAN_CONTEXT ctx, char *line)
 {
-  pinentry.quality_bar = 1;
+  char *newval;
+
+  if (!*line)
+    line = "Quality:";
+
+  newval = malloc (strlen (line) + 1);
+  if (!newval)
+    return ASSUAN_Out_Of_Core;
+
+  strcpy_escaped (newval, line);
+  if (pinentry.quality_bar)
+    free (pinentry.quality_bar);
+  pinentry.quality_bar = newval;
+  return 0;
+}
+
+/* Set the tooltip to be used for a quality bar.  */
+static int
+cmd_setqualitybar_tt (ASSUAN_CONTEXT ctx, char *line)
+{
+  char *newval;
+
+  if (*line)
+    {
+      newval = malloc (strlen (line) + 1);
+      if (!newval)
+        return ASSUAN_Out_Of_Core;
+      
+      strcpy_escaped (newval, line);
+    }
+  else
+    newval = NULL;
+  if (pinentry.quality_bar_tt)
+    free (pinentry.quality_bar_tt);
+  pinentry.quality_bar_tt = newval;
   return 0;
 }
 
@@ -881,6 +916,7 @@ register_commands (ASSUAN_CONTEXT ctx)
       { "CONFIRM",    0,  cmd_confirm },
       { "MESSAGE",    0,  cmd_message },
       { "SETQUALITYBAR", 0,  cmd_setqualitybar },
+      { "SETQUALITYBAR_TT", 0,  cmd_setqualitybar_tt },
       { NULL }
     };
   int i, j, rc;
index 81e8872..55a5894 100644 (file)
@@ -91,10 +91,14 @@ struct pinentry
      dismiss button is required. */
   int one_button;
 
-  /* If this is set, a passphrase quality indicator is shown.  There
-     will also be an inquiry back to the caller to get an indication
-     of the quality for the passphrase entered so far.  */
-  int quality_bar;
+  /* If this is not NULL, a passphrase quality indicator is shown.
+     There will also be an inquiry back to the caller to get an
+     indication of the quality for the passphrase entered so far.  The
+     string is used as a labe for the auality bar.  */
+  char *quality_bar;
+
+  /* The tooltip to be show for the qualitybar.  Malloced or NULL.  */
+  char *quality_bar_tt;
 
   /* For the curses pinentry, the color of error messages.  */
   pinentry_color_t color_fg;
index e284c2f..2715270 100644 (file)
@@ -84,6 +84,10 @@ qt_cmd_handler (pinentry_t pe)
        pinentry.setCancelText (QString::fromUtf8 (pe->cancel));
       if (pe->error)
        pinentry.setError (QString::fromUtf8 (pe->error));
+      if (pe->quality_bar)
+       pinentry.setQualityBar (QString::fromUtf8 (pe->quality_bar));
+      if (pe->quality_bar_tt)
+       pinentry.setQualityBarTT (QString::fromUtf8 (pe->quality_bar_tt));
 
       bool ret = pinentry.exec ();
       if (!ret)
index 7009523..c616263 100644 (file)
@@ -24,6 +24,7 @@
 #include <qlabel.h>
 #include <qmessagebox.h>
 #include <qprogressbar.h>
+#include <qtooltip.h>
 
 #include "secqlineedit.h"
 
@@ -46,29 +47,34 @@ PinEntryDialog::PinEntryDialog( QWidget* parent, const char* name,
   _error = new QLabel( this );
   labelLayout->addWidget( _error );
 
+  _desc = new QLabel( this );
+  labelLayout->addWidget( _desc );
+
+  QGridLayout* grid = new QGridLayout( labelLayout );
+
+  _prompt = new QLabel( this );
+  _prompt->setAlignment( Qt::AlignRight | Qt::AlignVCenter );
+  grid->addWidget( _prompt, 0, 0 );
+  _edit = new SecQLineEdit( this );
+  _edit->setMaxLength( 256 );
+  _edit->setEchoMode( SecQLineEdit::Password );
+  grid->addWidget( _edit, 0, 1 );
+
   if (enable_quality_bar)
     {
-      _quality_bar = new QProgressBar (this);
-      _quality_bar->setCenterIndicator (true);
-      labelLayout->addWidget ( _quality_bar );
+      QLabel* _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->setCenterIndicator( true );
+      grid->addWidget( _quality_bar, 1, 1 );
       _have_quality_bar = true;
     }
   else
     _have_quality_bar = false;
-  
-  _desc = new QLabel( this );
-  labelLayout->addWidget( _desc );
 
   QBoxLayout* l = new QHBoxLayout( top );
-  _prompt = new QLabel( this );
-  l->addWidget( _prompt );
-  _edit = new SecQLineEdit( this );
-  _edit->setMaxLength( 256 );
-  _edit->setEchoMode( SecQLineEdit::Password );
-  l->addWidget( _edit );
 
-  l = new QHBoxLayout( top );
-  
   _ok = new QPushButton( tr("OK"), this );
   _cancel = new QPushButton( tr("Cancel"), this );
 
@@ -208,6 +214,17 @@ void PinEntryDialog::setCancelText( const QString& txt )
   _cancel->setText( txt );
 }
 
+void PinEntryDialog::setQualityBar( const QString& txt )
+{
+  if (_have_quality_bar)
+    _quality_bar_label->setText( txt );
+}
+
+void PinEntryDialog::setQualityBarTT( const QString& txt )
+{
+  if (_have_quality_bar)
+    QToolTip::add ( _quality_bar, txt );
+}
 
 void PinEntryDialog::setPinentryInfo (pinentry_t peinfo )
 {
index ce6f63e..fe5455e 100644 (file)
@@ -56,6 +56,9 @@ public:
   void setOkText( const QString& );
   void setCancelText( const QString& );
 
+  void setQualityBar( const QString& );
+  void setQualityBarTT( const QString& );
+
   void setPinentryInfo (pinentry_t);
 
 public slots:
@@ -75,6 +78,7 @@ private:
   QLabel*    _desc;
   QLabel*    _error;
   QLabel*    _prompt;
+  QLabel*    _quality_bar_label;
   QProgressBar* _quality_bar;
   SecQLineEdit* _edit;
   QPushButton* _ok;