]> www.fi.muni.cz Git - evince.git/commitdiff
Allow adding actions for more than one item in view popup menu
authorCarlos Garcia Campos <carlosgc@gnome.org>
Sun, 21 Feb 2010 10:27:44 +0000 (11:27 +0100)
committerCarlos Garcia Campos <carlosgc@gnome.org>
Sun, 21 Feb 2010 10:27:44 +0000 (11:27 +0100)
Fixes bug #609497.

libview/ev-view-private.h
libview/ev-view.c
shell/ev-window.c

index 09f6163fbcee2493c4a90d671e4a8a32103f1331..0e5f44966201f93f6dbd249205cde05ec760f93c 100644 (file)
@@ -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);
 };
 
index 760cf04ffdcf67ca6f431d3b7c13872755db72eb..9c125d3135102f8a5c6669fcde7b9b9e1344dfa9 100644 (file)
@@ -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,
index e9aee88912ca71f9aa47c7496f646089e6a05b26..2725739c83d6704c5a6113716f6cf25cc2fcde42 100644 (file)
@@ -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 ());