[Xfce4-commits] <xfce4-dict:master> Add a 'Copy Link' menu item to the text view popup menu

Enrico Tröger noreply at xfce.org
Fri Sep 16 13:42:01 CEST 2011


Updating branch refs/heads/master
         to 1639ea66b46164409902354c6ba9458bd9798789 (commit)
       from e54dc7685d61a2149202a930db0cb25532d076f8 (commit)

commit 1639ea66b46164409902354c6ba9458bd9798789
Author: Enrico Tröger <enrico.troeger at uvena.de>
Date:   Fri Sep 16 13:25:22 2011 +0200

    Add a 'Copy Link' menu item to the text view popup menu

 lib/gui.c |   82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 79 insertions(+), 3 deletions(-)

diff --git a/lib/gui.c b/lib/gui.c
index 70ee1a1..efed441 100644
--- a/lib/gui.c
+++ b/lib/gui.c
@@ -48,6 +48,41 @@ static gboolean entry_is_dirty = FALSE;
 
 
 /* all textview_* functions are from the gtk-demo app to get links in the textview working */
+static gchar *textview_get_hyperlink_at_iter(GtkWidget *text_view, GtkTextIter *iter, DictData *dd)
+{
+	GSList *tags = NULL, *tagp = NULL;
+	gchar *found_link = NULL;
+	gchar *result = NULL;
+
+	tags = gtk_text_iter_get_tags(iter);
+	for (tagp = tags;  tagp != NULL;  tagp = tagp->next)
+	{
+		GtkTextTag *tag = tagp->data;
+
+		found_link = g_object_get_data(G_OBJECT(tag), "link");
+		if (found_link != NULL)
+		{
+			result = g_strdup(found_link);
+			break;
+		}
+		g_object_get(G_OBJECT(tag), "name", &found_link, NULL);
+		if (found_link != NULL)
+		{
+			if (strcmp("link", found_link) == 0)
+			{
+				result = dict_get_web_query_uri(dd, dd->searched_word);
+				break;
+			}
+			g_free(found_link);
+		}
+	}
+	if (tags)
+		g_slist_free(tags);
+
+	return result;
+}
+
+
 static void textview_follow_if_link(GtkWidget *text_view, GtkTextIter *iter, DictData *dd)
 {
 	GSList *tags = NULL, *tagp = NULL;
@@ -207,7 +242,7 @@ static gboolean textview_visibility_notify_event(GtkWidget *text_view, GdkEventV
 }
 
 
-static void textview_popup_item_cb(GtkWidget *widget, DictData *dd)
+static void textview_popup_search_item_cb(GtkWidget *widget, DictData *dd)
 {
 	gchar *word;
 	GtkTextIter start, end;
@@ -241,18 +276,59 @@ static void textview_popup_item_cb(GtkWidget *widget, DictData *dd)
 }
 
 
+static void textview_popup_copylink_item_cb(GtkWidget *widget, DictData *dd)
+{
+	GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+	GtkTextIter iter;
+	gchar *hyperlink;
+
+	gtk_text_buffer_get_iter_at_mark(dd->main_textbuffer, &iter, dd->mark_click);
+	hyperlink = textview_get_hyperlink_at_iter(dd->main_textview, &iter, dd);
+	if (hyperlink != NULL)
+	{
+		gtk_clipboard_set_text(clipboard, hyperlink, -1);
+		g_free(hyperlink);
+	}
+}
+
+
+static gboolean textview_is_hyperlink_at_cursor(DictData *dd)
+{
+	GtkTextIter iter;
+	gchar *hyperlink;
+
+	gtk_text_buffer_get_iter_at_mark(dd->main_textbuffer, &iter, dd->mark_click);
+	hyperlink = textview_get_hyperlink_at_iter(dd->main_textview, &iter, dd);
+	if (hyperlink != NULL)
+	{
+		g_free(hyperlink);
+		return TRUE;
+	}
+	else
+		return FALSE;
+}
+
+
 static void textview_populate_popup_cb(GtkTextView *textview, GtkMenu *menu, DictData *dd)
 {
 	GtkWidget *search = gtk_image_menu_item_new_from_stock(GTK_STOCK_FIND, NULL);
+	GtkWidget *copy_link = gtk_image_menu_item_new_with_label(_("Copy Link"));
 	GtkWidget *sep = gtk_separator_menu_item_new();
+	GtkWidget *copy_link_image = gtk_image_new_from_stock(GTK_STOCK_COPY, GTK_ICON_SIZE_MENU);
 
 	gtk_widget_show(sep);
 	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), sep);
 
+	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(copy_link), copy_link_image);
+	gtk_widget_show(copy_link);
+	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), copy_link);
+	gtk_widget_set_sensitive(GTK_WIDGET(copy_link), textview_is_hyperlink_at_cursor(dd));
+
 	gtk_widget_show(search);
 	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), search);
 
-	g_signal_connect(search, "activate", G_CALLBACK(textview_popup_item_cb), dd);
+	g_signal_connect(search, "activate", G_CALLBACK(textview_popup_search_item_cb), dd);
+	g_signal_connect(copy_link, "activate", G_CALLBACK(textview_popup_copylink_item_cb), dd);
 }
 
 
@@ -776,7 +852,7 @@ void dict_gui_create_main_window(DictData *dd)
 		g_signal_connect(dd->main_textview, "visibility-notify-event",
 			G_CALLBACK(textview_visibility_notify_event), NULL);
 	}
-	/* support for 'Search' menu item in the textview popup menu */
+	/* support for 'Search' and 'Copy Link' menu items in the textview popup menu */
 	{
 		GtkTextIter start;
 		gtk_text_buffer_get_bounds(dd->main_textbuffer, &start, &start);


More information about the Xfce4-commits mailing list