From c2f1fb8f6d068c53e73e5bcdb7583569dd6c638a Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Sun, 20 Apr 2008 11:00:14 +0000 Subject: [PATCH] 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 --- ChangeLog | 13 +++++++++ shell/ev-view-private.h | 3 ++ shell/ev-view.c | 64 ++++++++++++++++++++++++++++++++--------- shell/ev-view.h | 2 ++ shell/ev-window.c | 9 ++---- 5 files changed, 71 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6e6c2cb9..4ecf581d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +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. + 2008-04-19 Carlos Garcia Campos * libdocument/ev-document-factory.c: (get_document_from_uri): diff --git a/shell/ev-view-private.h b/shell/ev-view-private.h index c36cd57b..3e72e82a 100644 --- a/shell/ev-view-private.h +++ b/shell/ev-view-private.h @@ -161,6 +161,9 @@ struct _EvView { EvViewSelectionMode selection_mode; SelectionInfo selection_info; + /* Copy link address selection */ + EvLinkAction *link_selected; + /* Image DND */ ImageDNDInfo image_dnd_info; diff --git a/shell/ev-view.c b/shell/ev-view.c index f984396c..d107df96 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 * diff --git a/shell/ev-view.h b/shell/ev-view.h index dd8d1df1..0c6d608c 100644 --- a/shell/ev-view.h +++ b/shell/ev-view.h @@ -75,6 +75,8 @@ void ev_view_set_loading (EvView *view, gboolean loading); /* Clipboard */ void ev_view_copy (EvView *view); +void ev_view_copy_link_address (EvView *view, + EvLinkAction *action); void ev_view_select_all (EvView *view); gboolean ev_view_get_has_selection (EvView *view); diff --git a/shell/ev-window.c b/shell/ev-window.c index 1f78e875..dd05d662 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -4797,19 +4797,14 @@ ev_view_popup_cmd_open_link_new_window (GtkAction *action, EvWindow *window) static void ev_view_popup_cmd_copy_link_address (GtkAction *action, EvWindow *window) { - GtkClipboard *clipboard; EvLinkAction *ev_action; - const gchar *uri; ev_action = ev_link_get_action (window->priv->link); if (!ev_action) return; - uri = ev_link_action_get_uri (ev_action); - - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), - GDK_SELECTION_CLIPBOARD); - gtk_clipboard_set_text (clipboard, uri, -1); + ev_view_copy_link_address (EV_VIEW (window->priv->view), + ev_action); } -- 2.43.5