[evince] Allow adding actions for more than one item in view popup menu



commit 5ef0d418d651705e098d2a1a8495e86bf7c0f538
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sun Feb 21 11:27:44 2010 +0100

    Allow adding actions for more than one item in view popup menu
    
    Fixes bug #609497.

 libview/ev-view-private.h |    2 +-
 libview/ev-view.c         |   27 ++++++++++++---------------
 shell/ev-window.c         |   34 ++++++++++++++++++++++++++--------
 3 files changed, 39 insertions(+), 24 deletions(-)
---
diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h
index 09f6163..0e5f449 100644
--- a/libview/ev-view-private.h
+++ b/libview/ev-view-private.h
@@ -192,7 +192,7 @@ struct _EvViewClass {
 	void    (*external_link)	  (EvView         *view,
 					   EvLinkAction   *action);
 	void    (*popup_menu)		  (EvView         *view,
-					   EvLink         *link);
+					   GList          *items);
 	void    (*selection_changed)      (EvView         *view);
 };
 
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 760cf04..9c125d3 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -3096,29 +3096,26 @@ ev_view_do_popup_menu (EvView *view,
 		       gdouble x,
 		       gdouble y)
 {
+	GList        *items = NULL;
 	EvLink       *link;
 	EvImage      *image;
 	EvAnnotation *annot;
 
 	image = ev_view_get_image_at_location (view, x, y);
-	if (image) {
-		g_signal_emit (view, signals[SIGNAL_POPUP_MENU], 0, image);
-		return TRUE;
-	}
+	if (image)
+		items = g_list_prepend (items, image);
 
 	link = ev_view_get_link_at_location (view, x, y);
-	if (link) {
-		g_signal_emit (view, signals[SIGNAL_POPUP_MENU], 0, link);
-		return TRUE;
-	}
+	if (link)
+		items = g_list_prepend (items, link);
 
 	annot = ev_view_get_annotation_at_location (view, x, y);
-	if (annot) {
-		g_signal_emit (view, signals[SIGNAL_POPUP_MENU], 0, annot);
-		return TRUE;
-	}
+	if (annot)
+		items = g_list_prepend (items, annot);
+
+	g_signal_emit (view, signals[SIGNAL_POPUP_MENU], 0, items);
 
-	g_signal_emit (view, signals[SIGNAL_POPUP_MENU], 0, NULL);
+	g_list_free (items);
 
 	return TRUE;
 }
@@ -4265,9 +4262,9 @@ ev_view_class_init (EvViewClass *class)
 		         G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
 		         G_STRUCT_OFFSET (EvViewClass, popup_menu),
 		         NULL, NULL,
-		         g_cclosure_marshal_VOID__OBJECT,
+		         g_cclosure_marshal_VOID__POINTER,
 		         G_TYPE_NONE, 1,
-			 G_TYPE_OBJECT);
+			 G_TYPE_POINTER);
 	signals[SIGNAL_SELECTION_CHANGED] = g_signal_new ("selection-changed",
                          G_TYPE_FROM_CLASS (object_class),
                          G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
diff --git a/shell/ev-window.c b/shell/ev-window.c
index e9aee88..2725739 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -4442,16 +4442,34 @@ view_menu_annot_popup (EvWindow     *ev_window,
 
 static gboolean
 view_menu_popup_cb (EvView   *view,
-		    GObject  *object,
+		    GList    *items,
 		    EvWindow *ev_window)
 {
-	view_menu_link_popup (ev_window,
-			      EV_IS_LINK (object) ? EV_LINK (object) : NULL);
-	view_menu_image_popup (ev_window,
-			       EV_IS_IMAGE (object) ? EV_IMAGE (object) : NULL);
-	view_menu_annot_popup (ev_window,
-			       EV_IS_ANNOTATION (object) ? EV_ANNOTATION (object) : NULL);
-	
+	GList   *l;
+	gboolean has_link = FALSE;
+	gboolean has_image = FALSE;
+	gboolean has_annot = FALSE;
+
+	for (l = items; l; l = g_list_next (l)) {
+		if (EV_IS_LINK (l->data)) {
+			view_menu_link_popup (ev_window, EV_LINK (l->data));
+			has_link = TRUE;
+		} else if (EV_IS_IMAGE (l->data)) {
+			view_menu_image_popup (ev_window, EV_IMAGE (l->data));
+			has_image = TRUE;
+		} else if (EV_IS_ANNOTATION (l->data)) {
+			view_menu_annot_popup (ev_window, EV_ANNOTATION (l->data));
+			has_annot = TRUE;
+		}
+	}
+
+	if (!has_link)
+		view_menu_link_popup (ev_window, NULL);
+	if (!has_image)
+		view_menu_image_popup (ev_window, NULL);
+	if (!has_annot)
+		view_menu_annot_popup (ev_window, NULL);
+
 	gtk_menu_popup (GTK_MENU (ev_window->priv->view_popup),
 			NULL, NULL, NULL, NULL,
 			3, gtk_get_current_event_time ());



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