]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkaboutdialog.c
Use gtk_box_new() instead gtk_[v|h]box_new()
[~andy/gtk] / gtk / gtkaboutdialog.c
index 6a5925f5518294301db717eae9517462b6bc847e..ac09e5cf2000d423ddfab8c1a4984e897233560a 100644 (file)
  * SECTION:gtkaboutdialog
  * @Short_description: Display information about an application
  * @Title: GtkAboutDialog
- * @See_also:#GTK_STOCK_ABOUT
+ * @See_also: #GTK_STOCK_ABOUT
  *
- * The #GtkAboutDialog offers a simple way to display information about
+ * The GtkAboutDialog offers a simple way to display information about
  * a program like its logo, name, copyright, website and license. It is
  * also possible to give credits to the authors, documenters, translators
  * and artists who have worked on the program. An about dialog is typically
  * opened when the user selects the <literal>About</literal> option from
  * the <literal>Help</literal> menu. All parts of the dialog are optional.
  *
- * About dialog often contain links and email addresses. #GtkAboutDialog
- * supports this by offering global hooks, which are called when the user
- * clicks on a link or email address, see gtk_about_dialog_set_email_hook()
- * and gtk_about_dialog_set_url_hook(). Email addresses in the
- * authors, documenters and artists properties are recognized by looking for
- * <literal>&lt;user@<!-- -->host&gt;</literal>, URLs are
- * recognized by looking for <literal>http://url</literal>, with
- * <literal>url</literal> extending to the next space, tab or line break.
- *
- * <para id="gtk-about-dialog-hook-setup">
- * Since 2.18 #GtkAboutDialog provides default website and email hooks that
- * use gtk_show_uri().
- * </para>
- *
- * If you want provide your own hooks overriding the default ones, it is
- * important to do so before setting the website and email URL properties,
- * like this:
- * <informalexample><programlisting>
- * gtk_about_dialog_set_url_hook (GTK_ABOUT_DIALOG (dialog), launch_url, NULL, NULL);
- * gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (dialog), app_url);
- * </programlisting></informalexample>
- * To disable the default hooks, you can pass %NULL as the hook func. Then,
- * the #GtkAboutDialog widget will not display the website or the
- * email addresses as clickable.
+ * About dialog often contain links and email addresses. GtkAboutDialog
+ * displays these as clickable links. By default, it calls gtk_show_uri()
+ * when a user clicks one. The behaviour can be overridden with the
+ * #GtkAboutDialog::activate-link signal.
  *
- * To make constructing a #GtkAboutDialog as convenient as possible, you can
+ * To make constructing a GtkAboutDialog as convenient as possible, you can
  * use the function gtk_show_about_dialog() which constructs and shows a dialog
  * and keeps it around so that it can be shown again.
  *
  * on the dialog window (where &percnt;s is replaced by the name of the
  * application, but in order to ensure proper translation of the title,
  * applications should set the title property explicitly when constructing
- * a #GtkAboutDialog, as shown in the following example:
+ * a GtkAboutDialog, as shown in the following example:
  * <informalexample><programlisting>
  * gtk_show_about_dialog (NULL,
  *                        "program-name", "ExampleCode",
  *                        "title" _("About ExampleCode"),
  *                        NULL);
  * </programlisting></informalexample>
- * Note that prior to GTK+ 2.12, the #GtkAboutDialog:program-name property
- * was called "name". This was changed to avoid the conflict with the
- * #GtkWidget:name property.
  */
 
 static GdkColor default_link_color = { 0, 0, 0, 0xeeee };
@@ -216,80 +193,28 @@ static void                 follow_if_link                  (GtkAboutDialog
                                                              GtkTextView        *text_view,
                                                              GtkTextIter        *iter);
 static void                 set_cursor_if_appropriate       (GtkAboutDialog     *about,
-                                                            GtkTextView        *text_view,
+                                                             GtkTextView        *text_view,
                                                              GdkDevice          *device,
-                                                            gint                x,
-                                                            gint                y);
+                                                             gint                x,
+                                                             gint                y);
 static void                 display_credits_dialog          (GtkWidget          *button,
                                                              gpointer            data);
 static void                 display_license_dialog          (GtkWidget          *button,
                                                              gpointer            data);
 static void                 close_cb                        (GtkAboutDialog     *about);
-static void                 default_url_hook                (GtkAboutDialog     *about,
-                                                             const gchar        *uri,
-                                                             gpointer            user_data);
-static void                 default_email_hook              (GtkAboutDialog     *about,
-                                                             const gchar        *email_address,
-                                                             gpointer            user_data);
-
-static gboolean activate_email_hook_set = FALSE;
-static GtkAboutDialogActivateLinkFunc activate_email_hook = NULL;
-static gpointer activate_email_hook_data = NULL;
-static GDestroyNotify activate_email_hook_destroy = NULL;
-
-static gboolean activate_url_hook_set = FALSE;
-static GtkAboutDialogActivateLinkFunc activate_url_hook = NULL;
-static gpointer activate_url_hook_data = NULL;
-static GDestroyNotify activate_url_hook_destroy = NULL;
-
-static void
-default_url_hook (GtkAboutDialog *about,
-                  const gchar    *uri,
-                  gpointer        user_data)
-{
-  GdkScreen *screen;
-  GError *error = NULL;
-
-  screen = gtk_widget_get_screen (GTK_WIDGET (about));
-
-  if (!gtk_show_uri (screen, uri, gtk_get_current_event_time (), &error))
-    {
-      GtkWidget *dialog;
+static gboolean             gtk_about_dialog_activate_link  (GtkAboutDialog     *about,
+                                                             const gchar        *uri);
 
-      dialog = gtk_message_dialog_new (GTK_WINDOW (about),
-                                       GTK_DIALOG_DESTROY_WITH_PARENT |
-                                       GTK_DIALOG_MODAL,
-                                       GTK_MESSAGE_ERROR,
-                                       GTK_BUTTONS_CLOSE,
-                                       "%s", _("Could not show link"));
-      gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-                                                "%s", error->message);
-      g_error_free (error);
-
-      g_signal_connect (dialog, "response",
-                        G_CALLBACK (gtk_widget_destroy), NULL);
-
-      gtk_window_present (GTK_WINDOW (dialog));
-    }
-}
-
-static void
-default_email_hook (GtkAboutDialog *about,
-                    const gchar    *email_address,
-                    gpointer        user_data)
-{
-  char *escaped, *uri;
+enum {
+  ACTIVATE_LINK,
+  LAST_SIGNAL
+};
 
-  escaped = g_uri_escape_string (email_address, NULL, FALSE);
-  uri = g_strdup_printf ("mailto:%s", escaped);
-  g_free (escaped);
-
-  default_url_hook (about, uri, user_data);
-  g_free (uri);
-}
+static guint signals[LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE (GtkAboutDialog, gtk_about_dialog, GTK_TYPE_DIALOG)
 
+
 static void
 gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
 {
@@ -306,6 +231,30 @@ gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
 
   widget_class->show = gtk_about_dialog_show;
 
+  klass->activate_link = gtk_about_dialog_activate_link;
+
+  /**
+   * GtkAboutDialog::activate-link:
+   * @label: The object on which the signal was emitted
+   * @uri: the URI that is activated
+   *
+   * The signal which gets emitted to activate a URI.
+   * Applications may connect to it to override the default behaviour,
+   * which is to call gtk_show_uri().
+   *
+   * Returns: %TRUE if the link has been activated
+   *
+   * Since: 2.24
+   */
+  signals[ACTIVATE_LINK] =
+    g_signal_new ("activate-link",
+                  G_TYPE_FROM_CLASS (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (GtkAboutDialogClass, activate_link),
+                  _gtk_boolean_handled_accumulator, NULL,
+                  _gtk_marshal_BOOLEAN__STRING,
+                  G_TYPE_BOOLEAN, 1, G_TYPE_STRING);
+
   /**
    * GtkAboutDialog:program-name:
    *
@@ -574,25 +523,12 @@ gtk_about_dialog_class_init (GtkAboutDialogClass *klass)
 }
 
 static gboolean
-website_clicked (GtkLabel       *label,
-                 const gchar    *uri,
-                 GtkAboutDialog *about)
+emit_activate_link (GtkAboutDialog *about,
+                    const gchar    *uri)
 {
-  GtkAboutDialogActivateLinkFunc url_hook;
-  gpointer url_hook_data;
+  gboolean handled = FALSE;
 
-  if (activate_url_hook_set)
-    {
-      url_hook = activate_url_hook;
-      url_hook_data = activate_url_hook_data;
-    }
-  else
-    {
-      url_hook = default_url_hook;
-      url_hook_data = NULL;
-    }
-
-  url_hook (about, uri, url_hook_data);
+  g_signal_emit (about, signals[ACTIVATE_LINK], 0, uri, &handled);
 
   return TRUE;
 }
@@ -638,7 +574,7 @@ gtk_about_dialog_init (GtkAboutDialog *about)
   /* Widgets */
   gtk_widget_push_composite_child ();
 
-  vbox = gtk_vbox_new (FALSE, 8);
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 8);
   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
   gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
 
@@ -661,15 +597,15 @@ gtk_about_dialog_init (GtkAboutDialog *about)
   gtk_label_set_justify (GTK_LABEL (priv->copyright_label), GTK_JUSTIFY_CENTER);
   gtk_box_pack_start (GTK_BOX (vbox), priv->copyright_label, FALSE, FALSE, 0);
 
-  hbox = gtk_hbox_new (TRUE, 0);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, TRUE, 0);
   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 0);
 
   priv->website_label = button = gtk_label_new ("");
   gtk_widget_set_no_show_all (button, TRUE);
   gtk_label_set_selectable (GTK_LABEL (button), TRUE);
   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
-  g_signal_connect (button, "activate-link",
-                    G_CALLBACK (website_clicked), about);
+  g_signal_connect_swapped (button, "activate-link",
+                            G_CALLBACK (emit_activate_link), about);
 
   gtk_widget_show (vbox);
   gtk_widget_show (priv->logo_image);
@@ -688,7 +624,7 @@ gtk_about_dialog_init (GtkAboutDialog *about)
   gtk_button_set_image (GTK_BUTTON (button), image);
   gtk_widget_set_no_show_all (button, TRUE);
   gtk_box_pack_end (GTK_BOX (action_area), 
-                   button, FALSE, TRUE, 0); 
+                    button, FALSE, TRUE, 0); 
   gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (action_area), button, TRUE);
   g_signal_connect (button, "clicked",
                     G_CALLBACK (display_credits_dialog), about);
@@ -700,7 +636,7 @@ gtk_about_dialog_init (GtkAboutDialog *about)
   gtk_widget_set_can_default (button, TRUE);
   gtk_widget_set_no_show_all (button, TRUE);
   gtk_box_pack_end (GTK_BOX (action_area), 
-                   button, FALSE, TRUE, 0); 
+                    button, FALSE, TRUE, 0); 
   gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (action_area), button, TRUE);
   g_signal_connect (button, "clicked",
                     G_CALLBACK (display_license_dialog), about);
@@ -817,7 +753,7 @@ gtk_about_dialog_get_property (GObject    *object,
 {
   GtkAboutDialog *about = GTK_ABOUT_DIALOG (object);
   GtkAboutDialogPrivate *priv = about->priv;
-       
+        
   switch (prop_id) 
     {
     case PROP_NAME:
@@ -882,6 +818,38 @@ gtk_about_dialog_get_property (GObject    *object,
     }
 }
 
+static gboolean
+gtk_about_dialog_activate_link (GtkAboutDialog *about,
+                                const gchar    *uri)
+{
+  GdkScreen *screen;
+  GError *error = NULL;
+
+  screen = gtk_widget_get_screen (GTK_WIDGET (about));
+
+  if (!gtk_show_uri (screen, uri, gtk_get_current_event_time (), &error))
+    {
+      GtkWidget *dialog;
+
+      dialog = gtk_message_dialog_new (GTK_WINDOW (about),
+                                       GTK_DIALOG_DESTROY_WITH_PARENT |
+                                       GTK_DIALOG_MODAL,
+                                       GTK_MESSAGE_ERROR,
+                                       GTK_BUTTONS_CLOSE,
+                                       "%s", _("Could not show link"));
+      gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                "%s", error->message);
+      g_error_free (error);
+
+      g_signal_connect (dialog, "response",
+                        G_CALLBACK (gtk_widget_destroy), NULL);
+
+      gtk_window_present (GTK_WINDOW (dialog));
+    }
+
+  return TRUE;
+}
+
 static void
 update_website (GtkAboutDialog *about)
 {
@@ -889,7 +857,7 @@ update_website (GtkAboutDialog *about)
 
   gtk_widget_show (priv->website_label);
 
-  if (priv->website_url && (!activate_url_hook_set || activate_url_hook != NULL))
+  if (priv->website_url)
     {
       gchar *markup;
 
@@ -1311,9 +1279,6 @@ gtk_about_dialog_get_website (GtkAboutDialog *about)
  *
  * Sets the URL to use for the website link.
  *
- * Note that that the hook functions need to be set up
- * before calling this function.
- *
  * Since: 2.6
  */
 void
@@ -1796,52 +1761,18 @@ follow_if_link (GtkAboutDialog *about,
 {
   GSList *tags = NULL, *tagp = NULL;
   GtkAboutDialogPrivate *priv = about->priv;
-  gchar *url = NULL;
-  GtkAboutDialogActivateLinkFunc email_hook, url_hook;
-  gpointer email_hook_data, url_hook_data;
-
-  if (activate_email_hook_set)
-    {
-      email_hook = activate_email_hook;
-      email_hook_data = activate_email_hook_data;
-    }
-  else
-    {
-      email_hook = default_email_hook;
-      email_hook_data = NULL;
-    }
-
-  if (activate_url_hook_set)
-    {
-      url_hook = activate_url_hook;
-      url_hook_data = activate_url_hook_data;
-    }
-  else
-    {
-      url_hook = default_url_hook;
-      url_hook_data = NULL;
-    }
+  gchar *uri = NULL;
 
   tags = gtk_text_iter_get_tags (iter);
-  for (tagp = tags; tagp != NULL && !url; tagp = tagp->next)
+  for (tagp = tags; tagp != NULL && !uri; tagp = tagp->next)
     {
       GtkTextTag *tag = tagp->data;
 
-      if (email_hook != NULL)
-        {
-          url = g_object_get_data (G_OBJECT (tag), "email");
-          if (url)
-            email_hook (about, url, email_hook_data);
-        }
+      uri = g_object_get_data (G_OBJECT (tag), "uri");
+      if (uri)
+        emit_activate_link (about, uri);
 
-      if (!url && url_hook != NULL)
-        {
-          url = g_object_get_data (G_OBJECT (tag), "url");
-          if (url)
-            url_hook (about, url, url_hook_data);
-        }
-
-      if (url && !g_slist_find_custom (priv->visited_links, url, (GCompareFunc)strcmp))
+      if (uri && !g_slist_find_custom (priv->visited_links, uri, (GCompareFunc)strcmp))
         {
           GdkColor *style_visited_link_color;
           GdkColor color;
@@ -1860,7 +1791,7 @@ follow_if_link (GtkAboutDialog *about,
 
           g_object_set (G_OBJECT (tag), "foreground-gdk", &color, NULL);
 
-          priv->visited_links = g_slist_prepend (priv->visited_links, g_strdup (url));
+          priv->visited_links = g_slist_prepend (priv->visited_links, g_strdup (uri));
         }
     }
 
@@ -1878,9 +1809,9 @@ text_view_key_press_event (GtkWidget      *text_view,
 
   switch (event->keyval)
     {
-      case GDK_Return:
-      case GDK_ISO_Enter:
-      case GDK_KP_Enter:
+      case GDK_KEY_Return:
+      case GDK_KEY_ISO_Enter:
+      case GDK_KEY_KP_Enter:
         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
         gtk_text_buffer_get_iter_at_mark (buffer, &iter,
                                           gtk_text_buffer_get_insert (buffer));
@@ -1932,10 +1863,10 @@ text_view_event_after (GtkWidget      *text_view,
 
 static void
 set_cursor_if_appropriate (GtkAboutDialog *about,
-                          GtkTextView    *text_view,
+                           GtkTextView    *text_view,
                            GdkDevice      *device,
-                          gint            x,
-                          gint            y)
+                           gint            x,
+                           gint            y)
 {
   GtkAboutDialogPrivate *priv = about->priv;
   GSList *tags = NULL, *tagp = NULL;
@@ -1948,10 +1879,9 @@ set_cursor_if_appropriate (GtkAboutDialog *about,
   for (tagp = tags;  tagp != NULL;  tagp = tagp->next)
     {
       GtkTextTag *tag = tagp->data;
-      gchar *email = g_object_get_data (G_OBJECT (tag), "email");
-      gchar *url = g_object_get_data (G_OBJECT (tag), "url");
+      gchar *uri = g_object_get_data (G_OBJECT (tag), "uri");
 
-      if (email != NULL || url != NULL)
+      if (uri != NULL)
         {
           hovering_over_link = TRUE;
           break;
@@ -2001,7 +1931,7 @@ text_view_visibility_notify_event (GtkWidget          *text_view,
   GList *devices, *d;
   gint wx, wy, bx, by;
 
-  display = gdk_drawable_get_display (event->window);
+  display = gdk_window_get_display (event->window);
   device_manager = gdk_display_get_device_manager (display);
   devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
 
@@ -2033,7 +1963,6 @@ text_view_new (GtkAboutDialog  *about,
   GtkWidget *view;
   GtkTextView *text_view;
   GtkTextBuffer *buffer;
-  gboolean linkify_email, linkify_urls;
   GdkColor *style_link_color;
   GdkColor *style_visited_link_color;
   GdkColor color;
@@ -2042,9 +1971,6 @@ text_view_new (GtkAboutDialog  *about,
 
   GtkAboutDialogPrivate *priv = about->priv;
 
-  linkify_email = (!activate_email_hook_set || activate_email_hook != NULL);
-  linkify_urls = (!activate_url_hook_set || activate_url_hook != NULL);
-
   gtk_widget_ensure_style (GTK_WIDGET (about));
   gtk_widget_style_get (GTK_WIDGET (about),
                         "link-color", &style_link_color,
@@ -2096,9 +2022,9 @@ text_view_new (GtkAboutDialog  *about,
       q0  = *p;
       while (*q0)
         {
-          q1 = linkify_email ? strchr (q0, '<') : NULL;
+          q1 = strchr (q0, '<');
           q2 = q1 ? strchr (q1, '>') : NULL;
-          r1 = linkify_urls ? strstr (q0, "http://") : NULL;
+          r1 = strstr (q0, "http://");
           if (r1)
             {
               r2 = strpbrk (r1, " \n\t");
@@ -2118,6 +2044,7 @@ text_view_new (GtkAboutDialog  *about,
             {
               GtkTextIter end;
               gchar *link;
+              gchar *uri;
               const gchar *link_type;
               GtkTextTag *tag;
 
@@ -2126,13 +2053,13 @@ text_view_new (GtkAboutDialog  *about,
                   gtk_text_buffer_insert_at_cursor (buffer, q0, (q1 - q0) + 1);
                   gtk_text_buffer_get_end_iter (buffer, &end);
                   q1++;
-                  link_type = I_("email");
+                  link_type = "email";
                 }
               else
                 {
                   gtk_text_buffer_insert_at_cursor (buffer, q0, q1 - q0);
                   gtk_text_buffer_get_end_iter (buffer, &end);
-                  link_type = I_("url");
+                  link_type = "uri";
                 }
 
               q0 = q2;
@@ -2148,7 +2075,19 @@ text_view_new (GtkAboutDialog  *about,
                                                 "foreground-gdk", &color,
                                                 "underline", PANGO_UNDERLINE_SINGLE,
                                                 NULL);
-              g_object_set_data_full (G_OBJECT (tag), link_type, g_strdup (link), g_free);
+              if (strcmp (link_type, "email") == 0)
+                {
+                  gchar *escaped;
+
+                  escaped = g_uri_escape_string (link, NULL, FALSE);
+                  uri = g_strconcat ("mailto:", escaped, NULL);
+                  g_free (escaped);
+                }
+              else
+                {
+                  uri = g_strdup (link);
+                }
+              g_object_set_data_full (G_OBJECT (tag), I_("uri"), uri, g_free);
               gtk_text_buffer_insert_with_tags (buffer, &end, link, -1, tag, NULL);
 
               g_free (link);
@@ -2291,10 +2230,10 @@ display_license_dialog (GtkWidget *button,
     }
 
   dialog = gtk_dialog_new_with_buttons (_("License"),
-                                       GTK_WINDOW (about),
-                                       GTK_DIALOG_DESTROY_WITH_PARENT,
-                                       GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL,
-                                       NULL);
+                                        GTK_WINDOW (about),
+                                        GTK_DIALOG_DESTROY_WITH_PARENT,
+                                        GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL,
+                                        NULL);
   license_dialog = GTK_DIALOG (dialog);
 
   content_area = gtk_dialog_get_content_area (license_dialog);
@@ -2354,78 +2293,6 @@ gtk_about_dialog_new (void)
   return GTK_WIDGET (dialog);
 }
 
-/**
- * gtk_about_dialog_set_email_hook:
- * @func: a function to call when an email link is activated.
- * @data: data to pass to @func
- * @destroy: #GDestroyNotify for @data
- *
- * Installs a global function to be called whenever the user activates an
- * email link in an about dialog.
- *
- * Since 2.18 there exists a default function which uses gtk_show_uri(). To
- * deactivate it, you can pass %NULL for @func.
- *
- * Return value: the previous email hook.
- *
- * Since: 2.6
- */
-GtkAboutDialogActivateLinkFunc
-gtk_about_dialog_set_email_hook (GtkAboutDialogActivateLinkFunc func,
-                                 gpointer                       data,
-                                 GDestroyNotify                 destroy)
-{
-  GtkAboutDialogActivateLinkFunc old;
-
-  if (activate_email_hook_destroy != NULL)
-    (* activate_email_hook_destroy) (activate_email_hook_data);
-
-  old = activate_email_hook;
-
-  activate_email_hook_set = TRUE;
-  activate_email_hook = func;
-  activate_email_hook_data = data;
-  activate_email_hook_destroy = destroy;
-
-  return old;
-}
-
-/**
- * gtk_about_dialog_set_url_hook:
- * @func: a function to call when a URL link is activated.
- * @data: data to pass to @func
- * @destroy: #GDestroyNotify for @data
- *
- * Installs a global function to be called whenever the user activates a
- * URL link in an about dialog.
- *
- * Since 2.18 there exists a default function which uses gtk_show_uri(). To
- * deactivate it, you can pass %NULL for @func.
- *
- * Return value: the previous URL hook.
- *
- * Since: 2.6
- */
-GtkAboutDialogActivateLinkFunc
-gtk_about_dialog_set_url_hook (GtkAboutDialogActivateLinkFunc func,
-                               gpointer                       data,
-                               GDestroyNotify                 destroy)
-{
-  GtkAboutDialogActivateLinkFunc old;
-
-  if (activate_url_hook_destroy != NULL)
-    (* activate_url_hook_destroy) (activate_url_hook_data);
-
-  old = activate_url_hook;
-
-  activate_url_hook_set = TRUE;
-  activate_url_hook = func;
-  activate_url_hook_data = data;
-  activate_url_hook_destroy = destroy;
-
-  return old;
-}
-
 static void
 close_cb (GtkAboutDialog *about)
 {