## Migrating from GnomeHRef to GtkLinkButton

Since version 2.10, GTK+ provides the GtkLinkButton widget as a replacement for the GnomeHRef widget in the libgnomeui library.

Porting an application from GnomeHRef to GtkLinkButton is very simple. GtkLinkButton does not have a default action for "clicked" signal. So instead of simply creating the widget

    1
    2
    3

    GtkWidget *button;

          button = gnome_href_new (url, "");

you will have to handle the activation of the GtkLinkButton, using the ::clicked signal for instance

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    static void
          link_button_clicked_cb (GtkWidget *widget,
                                  gpointer   data)
          {
            const gchar *link;

            link = gtk_link_button_get_uri (GTK_LINK_BUTTON (widget));
            open_browser_at_url (link);
          }

          /* ... */

            GtkWidget *button;

            button = gtk_link_button_new (url);
            g_signal_connect (button, "clicked",
                              G_CALLBACK (link_button_clicked_cb), NULL);

If you have more than one GtkLinkButton instead of connecting a signal to each one, you can use a "hook function" which will be called whenever a user activates a link button

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    static void
          link_button_hook (GtkLinkButton *button,
                            const gchar   *link,
                            gpointer       user_data)

          {
            open_browser_at_url (link);
          }

          /* ... */

            GtkWidget *button1 = gtk_link_button_new (uri1);
            GtkWidget *button2 = gtk_link_button_new (uri2);

            gtk_link_button_set_uri_hook (link_button_hook, NULL, NULL);

Starting with GTK+ 2.16, it is no longer necessary to set up a uri hook manually, since GTK+ now defaults to calling `gtk_show_uri()` if no uri hook has been set.