From 5ef0d418d651705e098d2a1a8495e86bf7c0f538 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Sun, 21 Feb 2010 11:27:44 +0100 Subject: [PATCH] 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 09f6163f..0e5f4496 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 760cf04f..9c125d31 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 e9aee889..2725739c 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 ()); -- 2.43.0