evince r3017 - in trunk: . shell



Author: carlosgc
Date: Sun Apr 20 11:00:14 2008
New Revision: 3017
URL: http://svn.gnome.org/viewvc/evince?rev=3017&view=rev

Log:
2008-04-20  Carlos Garcia Campos  <carlosgc gnome org>

	* 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.


Modified:
   trunk/ChangeLog
   trunk/shell/ev-view-private.h
   trunk/shell/ev-view.c
   trunk/shell/ev-view.h
   trunk/shell/ev-window.c

Modified: trunk/shell/ev-view-private.h
==============================================================================
--- trunk/shell/ev-view-private.h	(original)
+++ trunk/shell/ev-view-private.h	Sun Apr 20 11:00:14 2008
@@ -161,6 +161,9 @@
 	EvViewSelectionMode selection_mode;
 	SelectionInfo selection_info;
 
+	/* Copy link address selection */
+	EvLinkAction *link_selected;
+
 	/* Image DND */
 	ImageDNDInfo image_dnd_info;
 

Modified: trunk/shell/ev-view.c
==============================================================================
--- trunk/shell/ev-view.c	(original)
+++ trunk/shell/ev-view.c	Sun Apr 20 11:00:14 2008
@@ -320,6 +320,7 @@
 							      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 @@
 	}
 
 	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 @@
 	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 @@
 	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 @@
 			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 @@
 	EvView *view = EV_VIEW (data);
 
 	clear_selection (view);
+	clear_link_selected (view);
 }
 
 static void
@@ -5798,7 +5815,7 @@
 	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 @@
 	}
 }
 
+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 *

Modified: trunk/shell/ev-view.h
==============================================================================
--- trunk/shell/ev-view.h	(original)
+++ trunk/shell/ev-view.h	Sun Apr 20 11:00:14 2008
@@ -75,6 +75,8 @@
 				           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);
 

Modified: trunk/shell/ev-window.c
==============================================================================
--- trunk/shell/ev-window.c	(original)
+++ trunk/shell/ev-window.c	Sun Apr 20 11:00:14 2008
@@ -4797,19 +4797,14 @@
 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);
 }
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]