diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-02-18 11:05:43 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-02-18 11:05:43 +0000 |
commit | c219ebe8f1e9794c57c546212bdebe26af71815a (patch) | |
tree | c0def1edc99939be793c85ed91dbacb2f91ab79c /src/textview.c | |
parent | c7c54a272476bb96923da48d00328229b44fdbd0 (diff) |
added 'Copy this link' to the context menu of textview.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@116 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src/textview.c')
-rw-r--r-- | src/textview.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/textview.c b/src/textview.c index c078a0d5..c0115fa0 100644 --- a/src/textview.c +++ b/src/textview.c @@ -178,6 +178,12 @@ static gboolean textview_visibility_notify (GtkWidget *widget, GdkEventVisibility *event, TextView *textview); +static void textview_populate_popup (GtkWidget *widget, + GtkMenu *menu, + TextView *textview); +static void textview_popup_menu_activate_copy_cb(GtkMenuItem *menuitem, + gpointer data); + static void textview_smooth_scroll_do (TextView *textview, gfloat old_value, gfloat last_value, @@ -254,6 +260,8 @@ TextView *textview_create(void) G_CALLBACK(textview_leave_notify), textview); g_signal_connect(G_OBJECT(text), "visibility-notify-event", G_CALLBACK(textview_visibility_notify), textview); + g_signal_connect(G_OBJECT(text), "populate-popup", + G_CALLBACK(textview_populate_popup), textview); gtk_widget_show(scrolledwin); @@ -1831,6 +1839,65 @@ static gboolean textview_visibility_notify(GtkWidget *widget, return FALSE; } +static void textview_populate_popup(GtkWidget *widget, GtkMenu *menu, + TextView *textview) +{ + gint px, py, x, y; + GtkWidget *separator, *menuitem; + GtkTextBuffer *buffer; + GtkTextIter iter, start, end; + gboolean on_link; + RemoteURI *uri; + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); + + gdk_window_get_pointer(widget->window, &px, &py, NULL); + gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(widget), + GTK_TEXT_WINDOW_WIDGET, + px, py, &x, &y); + gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &iter, x, y); + on_link = textview_get_link_tag_bounds(textview, &iter, &start, &end); + if (!on_link) + return; + + uri = textview_get_uri(textview, &start, &end); + if (!uri) + return; + + separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), separator); + gtk_widget_show(separator); + + menuitem = gtk_menu_item_new_with_mnemonic(_("Copy this _link")); + g_signal_connect(menuitem, "activate", + G_CALLBACK(textview_popup_menu_activate_copy_cb), uri); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show(menuitem); +} + +static void textview_popup_menu_activate_copy_cb(GtkMenuItem *menuitem, + gpointer data) +{ + RemoteURI *uri = (RemoteURI *)data; + const gchar *uri_string; + GtkClipboard *clipboard; + + g_return_if_fail(uri != NULL); + + if (!uri->uri) + return; + + if (!g_strncasecmp(uri->uri, "mailto:", 7)) + uri_string = uri->uri + 7; + else + uri_string = uri->uri; + + clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY); + gtk_clipboard_set_text(clipboard, uri_string, -1); + clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); + gtk_clipboard_set_text(clipboard, uri_string, -1); +} + static gboolean textview_uri_security_check(TextView *textview, RemoteURI *uri) { GtkTextBuffer *buffer; |