Andreas Rönnquist wrote: > Hi! > > I have managed to make a gtk_text_buffer and colorize what appears to be > links using gtk_text_buffer_apply_tag and some simple search algorithm. > > Does someone have any resources explaining how to make those clickable - and > (later problem) to open them in "default webbrowser" or such, and also make > them underlined when mouse is hovering above them? > > I have found an example, but that involves inserting actual buttons into the > textview, and that isn't really what I am after. (There must be a simpler way > to do what I want..) > > Help and pointers to good documentation/tutorials/examples would be much > appreciated. > I have looked at source that includes the requested behaviour, but it > contains a _lot_ of other stuff too, so it is quite hard to make out what is > important. > > I would like to keep it as simple as possible (Editable textbuffer isn't at > all required, also I am not interested in full syntax highligthing or > similar. - as simple as possible.) > > /Andreas >
I needed to do this quite a while back, and at the time I took a look at the GAIM code to see how they did it. It was a matter of connecting an event to the tag used to mark the text, and when activated, you'd open the URL. You can check the code I wrote by downloading the source @ http://aoeex.com/projects/easydict/ The relevant functions are textview_add_url(), textview_url_activate(), and textview_motion_notify_cb(). Here's snippets of the functions relevant parts: void textview_add_url(const gchar *txtURL){ ... if (!url){ url=gtk_text_tag_new("url_tag"); g_object_set(url, "underline", PANGO_UNDERLINE_SINGLE, "underline-set", true, NULL); g_object_set(url, "foreground-gdk", &blue, NULL); g_signal_connect(G_OBJECT(url), "event", G_CALLBACK(textview_url_activate), NULL); gtk_text_tag_table_add(tagTbl, url); } ... } gboolean textview_url_activate(GtkTextTag *tag, __attribute__((unused))GObject *arg1, GdkEvent *event, GtkTextIter *arg2, __attribute__((unused))gpointer d){ GdkEventButton *event_btn=(GdkEventButton*)event; if (event->type == GDK_BUTTON_RELEASE && event_btn->button == 1){ ... link=gtk_text_iter_get_text(&start, &end); if (link){ gint memNeeded=strlen(BROWSER_CMDLINE)+strlen(link)+1; gchar *cmd_line=KLIB_malloc(memNeeded); snprintf(cmd_line, memNeeded, BROWSER_CMDLINE, link); system(cmd_line); } } return false; } gboolean textview_motion_notify_cb(GtkWidget *textview, GdkEventMotion *event, __attribute__((unused))gpointer d){ ... if (gtk_text_iter_has_tag(&iter, tag)){ GdkCursor *cur=gdk_cursor_new(GDK_HAND2); gdk_window_set_cursor(event->window, cur); } else { GdkCursor *cur=gdk_cursor_new(GDK_XTERM); gdk_window_set_cursor(event->window, cur); } return false; } -- Keith Maika http://aoeex.com/ - Personal site http://www.gnu.org/philosophy/can-you-trust.html - Can you trust your computer? http://www.gnu.org/philosophy/no-word-attachments.html - Support Open Communication. _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list