diff options
author | Matthias Clasen <mclasen@redhat.com> | 2009-05-11 01:23:13 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2009-05-11 01:23:13 -0400 |
commit | 9dbb30482b11075045e7624df7c771cb3fc1503f (patch) | |
tree | d2d9486482ba7eeaa77a20166eefca360eb526fe /demos | |
parent | 141ddd99f375b8f687f5f83164c440c8a79b1364 (diff) | |
download | gdk-pixbuf-9dbb30482b11075045e7624df7c771cb3fc1503f.tar.gz |
Add link support to GtkLabel
This patch is based on SexyUrlLabel, but with significantly enhanced
functionality: keynav, tooltips, context menu, theming.
Diffstat (limited to 'demos')
-rw-r--r-- | demos/gtk-demo/Makefile.am | 3 | ||||
-rw-r--r-- | demos/gtk-demo/links.c | 88 |
2 files changed, 90 insertions, 1 deletions
diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am index e9c51d0b9..aced886a3 100644 --- a/demos/gtk-demo/Makefile.am +++ b/demos/gtk-demo/Makefile.am @@ -3,7 +3,7 @@ include $(top_srcdir)/Makefile.decl democodedir=$(datadir)/gtk-2.0/demo -## These should be in the order you want them to appear in the +## These should be in the order you want them to appear in the ## demo app, which means alphabetized by demo title, not filename demos = \ appwindow.c \ @@ -23,6 +23,7 @@ demos = \ iconview.c \ iconview_edit.c \ images.c \ + links.c \ list_store.c \ menus.c \ panes.c \ diff --git a/demos/gtk-demo/links.c b/demos/gtk-demo/links.c new file mode 100644 index 000000000..68a5cd0a9 --- /dev/null +++ b/demos/gtk-demo/links.c @@ -0,0 +1,88 @@ +/* Links + * + * GtkLabel can show hyperlinks. The default action is to call + * gtk_show_uri() on their URI, but it is possible to override + * this with a custom handler. + */ + +#include <gtk/gtk.h> + +static void +response_cb (GtkWidget *dialog, + gint response_id, + gpointer data) +{ + gtk_widget_destroy (dialog); +} + +static gboolean +activate_link (GtkWidget *label, + gpointer data) +{ + const gchar *uri; + + uri = gtk_label_get_current_uri (GTK_LABEL (label)); + + if (g_strcmp0 (uri, "keynav") == 0) + { + GtkWidget *dialog; + GtkWidget *parent; + + parent = gtk_widget_get_toplevel (label); + dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (parent), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_OK, + "The term <i>keynav</i> is a shorthand for " + "keyboard navigation and refers to the process of using " + "a program (exclusively) via keyboard input."); + + gtk_window_present (GTK_WINDOW (dialog)); + g_signal_connect (dialog, "response", G_CALLBACK (response_cb), NULL); + + return TRUE; + } + + return FALSE; +} + +GtkWidget * +do_links (GtkWidget *do_widget) +{ + static GtkWidget *window = NULL; + GtkWidget *box; + GtkWidget *label; + + if (!window) + { + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (do_widget)); + gtk_container_set_border_width (GTK_CONTAINER (window), 12); + g_signal_connect (window, "destroy", + G_CALLBACK(gtk_widget_destroyed), &window); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_true), NULL); + + label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\"" + "title=\"plain text\">text</a> may be marked up\n" + "as hyperlinks, which can be clicked\n" + "or activated via <a href=\"keynav\">keynav</a>"); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL); + gtk_container_add (GTK_CONTAINER (window), label); + gtk_widget_show (label); + } + + if (!GTK_WIDGET_VISIBLE (window)) + { + gtk_widget_show (window); + } + else + { + gtk_widget_destroy (window); + window = NULL; + } + + return window; +} |