From c2f1fb8f6d068c53e73e5bcdb7583569dd6c638a Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Sun, 20 Apr 2008 11:00:14 +0000 Subject: Update also the primary selection when copying a link address. Fixes bug 2008-04-20 Carlos Garcia Campos * shell/ev-view-private.h: * shell/ev-view.[ch]: (ev_view_button_release_event), (ev_view_finalize), (ev_view_clipboard_copy), (ev_view_copy), (ev_view_primary_get_cb), (ev_view_primary_clear_cb), (ev_view_update_primary_selection), (clear_link_selected), (ev_view_copy_link_address): * shell/ev-window.c: (ev_view_popup_cmd_copy_link_address): Update also the primary selection when copying a link address. Fixes bug #520855. svn path=/trunk/; revision=3017 --- (limited to 'shell/ev-view.c') diff --git a/shell/ev-view.c b/shell/ev-view.c index f984396..d107df9 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -320,6 +320,7 @@ static void compute_selections (EvView GdkPoint *start, GdkPoint *stop); static void clear_selection (EvView *view); +static void clear_link_selected (EvView *view); static void selection_free (EvViewSelection *selection); static char* get_selected_text (EvView *ev_view); static void ev_view_primary_get_cb (GtkClipboard *clipboard, @@ -3178,6 +3179,7 @@ ev_view_button_release_event (GtkWidget *widget, } if (view->selection_info.selections) { + clear_link_selected (view); ev_view_update_primary_selection (view); if (view->selection_info.in_drag) { @@ -3823,6 +3825,7 @@ ev_view_finalize (GObject *object) g_free (view->find_status); clear_selection (view); + clear_link_selected (view); if (view->image_dnd_info.image) g_object_unref (view->image_dnd_info.image); @@ -5746,19 +5749,27 @@ get_selected_text (EvView *view) return normalized_text; } +static void +ev_view_clipboard_copy (EvView *view, + const gchar *text) +{ + GtkClipboard *clipboard; + + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), + GDK_SELECTION_CLIPBOARD); + gtk_clipboard_set_text (clipboard, text, -1); +} + void ev_view_copy (EvView *ev_view) { - GtkClipboard *clipboard; char *text; if (!EV_IS_SELECTION (ev_view->document)) return; text = get_selected_text (ev_view); - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ev_view), - GDK_SELECTION_CLIPBOARD); - gtk_clipboard_set_text (clipboard, text, -1); + ev_view_clipboard_copy (ev_view, text); g_free (text); } @@ -5769,15 +5780,20 @@ ev_view_primary_get_cb (GtkClipboard *clipboard, gpointer data) { EvView *ev_view = EV_VIEW (data); - char *text; - if (!EV_IS_SELECTION (ev_view->document)) - return; - - text = get_selected_text (ev_view); - if (text) { - gtk_selection_data_set_text (selection_data, text, -1); - g_free (text); + if (ev_view->link_selected) { + gtk_selection_data_set_text (selection_data, + ev_link_action_get_uri (ev_view->link_selected), + -1); + } else if (EV_IS_SELECTION (ev_view->document) && + ev_view->selection_info.selections) { + gchar *text; + + text = get_selected_text (ev_view); + if (text) { + gtk_selection_data_set_text (selection_data, text, -1); + g_free (text); + } } } @@ -5788,6 +5804,7 @@ ev_view_primary_clear_cb (GtkClipboard *clipboard, EvView *view = EV_VIEW (data); clear_selection (view); + clear_link_selected (view); } static void @@ -5798,7 +5815,7 @@ ev_view_update_primary_selection (EvView *ev_view) clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ev_view), GDK_SELECTION_PRIMARY); - if (ev_view->selection_info.selections) { + if (ev_view->selection_info.selections || ev_view->link_selected) { if (!gtk_clipboard_set_with_owner (clipboard, clipboard_targets, G_N_ELEMENTS (clipboard_targets), @@ -5812,6 +5829,27 @@ ev_view_update_primary_selection (EvView *ev_view) } } +static void +clear_link_selected (EvView *view) +{ + if (view->link_selected) { + g_object_unref (view->link_selected); + view->link_selected = NULL; + } +} + +void +ev_view_copy_link_address (EvView *view, + EvLinkAction *action) +{ + clear_link_selected (view); + + ev_view_clipboard_copy (view, ev_link_action_get_uri (action)); + + view->link_selected = g_object_ref (action); + ev_view_update_primary_selection (view); +} + /*** Cursor operations ***/ static GdkCursor * -- cgit v0.9.1