In various Edit context menus, only display editors that match the file types in...
authorLaurent Monin <geeqie@norz.org>
Sun, 8 Mar 2009 13:23:25 +0000 (13:23 +0000)
committerLaurent Monin <geeqie@norz.org>
Sun, 8 Mar 2009 13:23:25 +0000 (13:23 +0000)
14 files changed:
src/collect-table.c
src/dupe.c
src/dupe.h
src/editors.c
src/editors.h
src/img-view.c
src/layout_image.c
src/menu.c
src/menu.h
src/pan-types.h
src/pan-view.c
src/search.c
src/typedefs.h
src/view_file.c

index c764911..ecca8f9 100644 (file)
@@ -839,6 +839,9 @@ static void collection_table_popup_destroy_cb(GtkWidget *widget, gpointer data)
        filelist_free(ct->drop_list);
        ct->drop_list = NULL;
        ct->drop_info = NULL;
+
+       filelist_free(ct->editmenu_fd_list);
+       ct->editmenu_fd_list = NULL;
 }
 
 static GtkWidget *collection_table_popup_menu(CollectTable *ct, gint over_icon)
@@ -877,8 +880,10 @@ static GtkWidget *collection_table_popup_menu(CollectTable *ct, gint over_icon)
        gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
        menu_item_add_divider(menu);
 
+       
+       ct->editmenu_fd_list = collection_table_selection_get_list(ct);
        submenu_add_edit(menu, &item,
-                       G_CALLBACK(collection_table_popup_edit_cb), ct);
+                       G_CALLBACK(collection_table_popup_edit_cb), ct, ct->editmenu_fd_list);
        gtk_widget_set_sensitive(item, over_icon);
 
        menu_item_add_divider(menu);
index eee5e11..6b59aa9 100644 (file)
@@ -2211,6 +2211,30 @@ static void dupe_menu_close_cb(GtkWidget *widget, gpointer data)
        dupe_window_close(dw);
 }
 
+static void dupe_menu_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       filelist_free(dw->editmenu_fd_list);
+       dw->editmenu_fd_list = NULL;
+}      
+
+static GList *dupe_window_get_fd_list(DupeWindow *dw)
+{
+       GList *list;
+
+       if (GTK_WIDGET_HAS_FOCUS(dw->second_listview))
+               {
+               list = dupe_listview_get_selection(dw, dw->second_listview);
+               }
+       else
+               {
+               list = dupe_listview_get_selection(dw, dw->listview);
+               }
+
+       return list;
+}
+
 static GtkWidget *dupe_menu_popup_main(DupeWindow *dw, DupeItem *di)
 {
        GtkWidget *menu;
@@ -2220,6 +2244,9 @@ static GtkWidget *dupe_menu_popup_main(DupeWindow *dw, DupeItem *di)
        on_row = (di != NULL);
 
        menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(dupe_menu_popup_destroy_cb), dw);
+
        menu_item_add_sensitive(menu, _("_View"), on_row,
                                G_CALLBACK(dupe_menu_view_cb), dw);
        menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row,
@@ -2234,7 +2261,9 @@ static GtkWidget *dupe_menu_popup_main(DupeWindow *dw, DupeItem *di)
        menu_item_add_sensitive(menu, _("Select group _2 duplicates"), (dw->dupes != NULL),
                                G_CALLBACK(dupe_menu_select_dupes_set2_cb), dw);
        menu_item_add_divider(menu);
-       submenu_add_edit(menu, &item, G_CALLBACK(dupe_menu_edit_cb), dw);
+       
+       dw->editmenu_fd_list = dupe_window_get_fd_list(dw);
+       submenu_add_edit(menu, &item, G_CALLBACK(dupe_menu_edit_cb), dw, dw->editmenu_fd_list);
        if (!on_row) gtk_widget_set_sensitive(item, FALSE);
        menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row,
                                G_CALLBACK(dupe_menu_collection_cb), dw);
index edf9b39..f27e4ed 100644 (file)
@@ -109,6 +109,10 @@ struct _DupeWindow
        GtkWidget *second_status_label;
 
        gint color_frozen;
+       
+       /* file list for edit menu */
+       GList *editmenu_fd_list;
+
 };
 
 
index c3cb036..505d7ad 100644 (file)
@@ -59,7 +59,6 @@ static void editor_verbose_window_progress(EditorData *ed, const gchar *text);
 static gint editor_command_next_start(EditorData *ed);
 static gint editor_command_next_finish(EditorData *ed, gint status);
 static gint editor_command_done(EditorData *ed);
-static gint editor_command_parse(const EditorDescription *editor, GList *list, gchar **output);
 
 /*
  *-----------------------------------------------------------------------------
@@ -646,7 +645,7 @@ static gchar *editor_command_path_parse(const FileData *fd, PathType type, const
 }
 
 
-static gint editor_command_parse(const EditorDescription *editor, GList *list, gchar **output)
+gint editor_command_parse(const EditorDescription *editor, GList *list, gchar **output)
 {
        gint flags = 0;
        const gchar *p;
@@ -689,27 +688,28 @@ static gint editor_command_parse(const EditorDescription *editor, GList *list, g
                                                flags |= EDITOR_ERROR_INCOMPATIBLE;
                                                goto err;
                                                }
+                                       /* use the first file from the list */
+                                       if (!list || !list->data)
+                                               {
+                                               flags |= EDITOR_ERROR_NO_FILE;
+                                               goto err;
+                                               }
+                                       pathl = editor_command_path_parse((FileData *)list->data,
+                                                                         (*p == 'f') ? PATH_FILE : PATH_FILE_URL,
+                                                                         editor);
+                                       if (!pathl)
+                                               {
+                                               flags |= EDITOR_ERROR_NO_FILE;
+                                               goto err;
+                                               }
                                        if (output)
                                                {
-                                               /* use the first file from the list */
-                                               if (!list || !list->data)
-                                                       {
-                                                       flags |= EDITOR_ERROR_NO_FILE;
-                                                       goto err;
-                                                       }
-                                               pathl = editor_command_path_parse((FileData *)list->data,
-                                                                                 (*p == 'f') ? PATH_FILE : PATH_FILE_URL,
-                                                                                 editor);
-                                               if (!pathl)
-                                                       {
-                                                       flags |= EDITOR_ERROR_NO_FILE;
-                                                       goto err;
-                                                       }
                                                result = g_string_append_c(result, '"');
                                                result = g_string_append(result, pathl);
-                                               g_free(pathl);
                                                result = g_string_append_c(result, '"');
                                                }
+                                       g_free(pathl);
+
                                        break;
 
                                case 'F':
@@ -721,7 +721,6 @@ static gint editor_command_parse(const EditorDescription *editor, GList *list, g
                                                goto err;
                                                }
 
-                                       if (output)
                                                {
                                                /* use whole list */
                                                GList *work = list;
@@ -731,15 +730,19 @@ static gint editor_command_parse(const EditorDescription *editor, GList *list, g
                                                        {
                                                        FileData *fd = work->data;
                                                        pathl = editor_command_path_parse(fd, (*p == 'F') ? PATH_FILE : PATH_FILE_URL, editor);
-
                                                        if (pathl)
                                                                {
                                                                ok = TRUE;
-                                                               if (work != list) g_string_append_c(result, ' ');
-                                                               result = g_string_append_c(result, '"');
-                                                               result = g_string_append(result, pathl);
+
+                                                               if (output)
+                                                                       {
+                                                                       ok = TRUE;
+                                                                       if (work != list) g_string_append_c(result, ' ');
+                                                                       result = g_string_append_c(result, '"');
+                                                                       result = g_string_append(result, pathl);
+                                                                       result = g_string_append_c(result, '"');
+                                                                       }
                                                                g_free(pathl);
-                                                               result = g_string_append_c(result, '"');
                                                                }
                                                        work = work->next;
                                                        }
@@ -802,7 +805,7 @@ err:
 }
 
 
-static void editor_child_exit_cb (GPid pid, gint status, gpointer data)
+static void editor_child_exit_cb(GPid pid, gint status, gpointer data)
 {
        EditorData *ed = data;
        g_spawn_close_pid(pid);
index 967f20b..c474727 100644 (file)
@@ -77,6 +77,7 @@ const gchar *editor_get_error_str(gint flags);
 const gchar *editor_get_name(const gchar *key);
 
 gboolean is_valid_editor_command(const gchar *key);
+gint editor_command_parse(const EditorDescription *editor, GList *list, gchar **output);
 
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 9bc862f..2842e61 100644 (file)
@@ -49,6 +49,9 @@ struct _ViewWindow
 
        GList *list;
        GList *list_pointer;
+
+       /* file list for edit menu */
+       GList *editmenu_fd_list;
 };
 
 
@@ -1240,6 +1243,28 @@ static void view_set_layout_path_cb(GtkWidget *widget, gpointer data)
        view_window_close(vw);
 }
 
+static void view_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewWindow *vw = data;
+
+       filelist_free(vw->editmenu_fd_list);
+       vw->editmenu_fd_list = NULL;
+}              
+
+static GList *view_window_get_fd_list(ViewWindow *vw)
+{
+       GList *list = NULL;
+       ImageWindow *imd = view_window_active_image(vw);
+
+       if (imd)
+               {
+               FileData *fd = image_get_fd(imd);
+               if (fd) list = g_list_append(NULL, file_data_ref(fd));
+               }
+       
+       return list;
+}
+
 static GtkWidget *view_popup_menu(ViewWindow *vw)
 {
        GtkWidget *menu;
@@ -1247,13 +1272,17 @@ static GtkWidget *view_popup_menu(ViewWindow *vw)
 
        menu = popup_menu_short_lived();
 
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(view_popup_menu_destroy_cb), vw);
+
        menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw);
        menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw);
        menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw);
        menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);
        menu_item_add_divider(menu);
 
-       item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw);
+       vw->editmenu_fd_list = view_window_get_fd_list(vw);
+       item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, vw->editmenu_fd_list);
        menu_item_add_divider(item);
        menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw);
 
index bf8335c..7dedd44 100644 (file)
@@ -456,6 +456,25 @@ static gint li_check_if_current_path(LayoutWindow *lw, const gchar *path)
        return ret;
 }
 
+static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       filelist_free(lw->editmenu_fd_list);
+       lw->editmenu_fd_list = NULL;
+}      
+
+static GList *layout_image_get_fd_list(LayoutWindow *lw)
+{
+       GList *list = NULL;
+       FileData *fd = layout_image_get_fd(lw);
+
+       if (fd)
+               list = g_list_append(NULL, file_data_ref(fd));
+       
+       return list;
+}
+
 static GtkWidget *layout_image_pop_menu(LayoutWindow *lw)
 {
        GtkWidget *menu;
@@ -468,6 +487,8 @@ static GtkWidget *layout_image_pop_menu(LayoutWindow *lw)
        fullscreen = layout_image_full_screen_active(lw);
 
        menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(layout_image_popup_menu_destroy_cb), lw);
 
        menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw);
        menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw);
@@ -475,7 +496,8 @@ static GtkWidget *layout_image_pop_menu(LayoutWindow *lw)
        menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw);
        menu_item_add_divider(menu);
 
-       submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw);
+       lw->editmenu_fd_list = layout_image_get_fd_list(lw);
+       submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, lw->editmenu_fd_list);
        if (!path) gtk_widget_set_sensitive(item, FALSE);
        menu_item_add_divider(submenu);
        menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw);
index 3838697..b228126 100644 (file)
@@ -64,7 +64,7 @@ gpointer submenu_item_get_data(GtkWidget *menu)
  *-----------------------------------------------------------------------------
  */
 
-static void add_edit_items(GtkWidget *menu, GCallback func)
+static void add_edit_items(GtkWidget *menu, GCallback func, GList *fd_list)
 {
        GList *editors_list = editor_list_get();
        GList *work = editors_list;
@@ -73,15 +73,24 @@ static void add_edit_items(GtkWidget *menu, GCallback func)
                {
                const EditorDescription *editor = work->data;
                work = work->next;
-               
-               menu_item_add(menu, editor->name, func, editor->key);
+               gboolean active = TRUE;
+
+               if (fd_list)
+                       {
+                       gint flags = editor_command_parse(editor, fd_list, NULL);
+                       if ((flags & EDITOR_ERROR_MASK) != 0)
+                               active = FALSE;
+                       }
+
+               if (active)
+                       menu_item_add(menu, editor->name, func, editor->key);
                }
        
        g_list_free(editors_list);
 }
 
 
-GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GCallback func, gpointer data)
+GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GCallback func, gpointer data, GList *fd_list)
 {
        GtkWidget *item;
        GtkWidget *submenu;
@@ -90,7 +99,7 @@ GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GCallback fu
 
        submenu = gtk_menu_new();
        g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
-       add_edit_items(submenu, func);
+       add_edit_items(submenu, func, fd_list);
 
        gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
 
index d0a986e..fa8be6b 100644 (file)
@@ -17,7 +17,7 @@
 
 gpointer submenu_item_get_data(GtkWidget *menu);
 
-GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GCallback func, gpointer data);
+GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GCallback func, gpointer data, GList *fd_list);
 
 gchar *sort_type_get_text(SortType method);
 GtkWidget *submenu_add_sort(GtkWidget *menu, GCallback func, gpointer data,
index 0965f66..ba43f94 100644 (file)
@@ -227,6 +227,9 @@ struct _PanWindow
        PanItem *search_pi;
 
        gint idle_id;
+       
+       /* file list for edit menu */
+       GList *editmenu_fd_list;
 };
 
 typedef struct _PanGrid PanGrid;
index 6c15dfb..a6ac5d4 100644 (file)
@@ -2773,6 +2773,24 @@ static void pan_close_cb(GtkWidget *widget, gpointer data)
        pan_window_close(pw);
 }
 
+static void pan_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       PanWindow *pw = data;
+
+       filelist_free(pw->editmenu_fd_list);
+       pw->editmenu_fd_list = NULL;
+}
+
+static GList *pan_view_get_fd_list(PanWindow *pw)
+{
+       GList *list = NULL;
+       FileData *fd = pan_menu_click_fd(pw);
+       
+       if (fd) list = g_list_append(NULL, file_data_ref(fd));
+       
+       return list;
+}
+
 static GtkWidget *pan_popup_menu(PanWindow *pw)
 {
        GtkWidget *menu;
@@ -2783,6 +2801,8 @@ static GtkWidget *pan_popup_menu(PanWindow *pw)
        active = (pw->click_pi != NULL);
 
        menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(pan_popup_menu_destroy_cb), pw);
 
        menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN,
                            G_CALLBACK(pan_zoom_in_cb), pw);
@@ -2792,9 +2812,10 @@ static GtkWidget *pan_popup_menu(PanWindow *pw)
                            G_CALLBACK(pan_zoom_1_1_cb), pw);
        menu_item_add_divider(menu);
 
-       submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw);
+       pw->editmenu_fd_list = pan_view_get_fd_list(pw);
+       submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw, pw->editmenu_fd_list);
        gtk_widget_set_sensitive(item, active);
-
+       
        menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active,
                                      G_CALLBACK(pan_new_window_cb), pw);
 
index 864144e..b8ac9b0 100644 (file)
@@ -190,6 +190,10 @@ struct _SearchData
        ThumbLoader *thumb_loader;
        gint thumb_enable;
        FileData *thumb_fd;
+
+       /* file list for edit menu */
+       GList *editmenu_fd_list;
+
 };
 
 typedef struct _MatchFileData MatchFileData;
@@ -979,12 +983,23 @@ static void sr_menu_clear_cb(GtkWidget *widget, gpointer data)
        search_result_clear(sd);
 }
 
+static void search_result_menu_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       filelist_free(sd->editmenu_fd_list);
+       sd->editmenu_fd_list = NULL;
+}
+
 static GtkWidget *search_result_menu(SearchData *sd, gint on_row, gint empty)
 {
        GtkWidget *menu;
        GtkWidget *item;
 
        menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(search_result_menu_destroy_cb), sd);
+
        menu_item_add_sensitive(menu, _("_View"), on_row,
                                G_CALLBACK(sr_menu_view_cb), sd);
        menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row,
@@ -995,7 +1010,9 @@ static GtkWidget *search_result_menu(SearchData *sd, gint on_row, gint empty)
        menu_item_add_sensitive(menu, _("Select none"), !empty,
                                G_CALLBACK(sr_menu_select_none_cb), sd);
        menu_item_add_divider(menu);
-       submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd);
+
+       sd->editmenu_fd_list = search_result_selection_list(sd);
+       submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd, sd->editmenu_fd_list);
        if (!on_row) gtk_widget_set_sensitive(item, FALSE);
        menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row,
                                      G_CALLBACK(sr_menu_collection_cb), sd);
index a4410a3..8dbe3b7 100644 (file)
@@ -340,6 +340,9 @@ struct _CollectTable
        gint drop_idle_id;
 
        gint show_text;
+
+       /* file list for edit menu */
+       GList *editmenu_fd_list;
 };
 
 struct _CollectWindow
@@ -655,6 +658,9 @@ struct _LayoutWindow
 //     gint bar_width;
 
        GtkWidget *exif_window;
+
+       /* file list for edit menu */
+       GList *editmenu_fd_list;
 };
 
 struct _ViewDir
@@ -739,6 +745,9 @@ struct _ViewFile
        
        /* refresh */
        gint refresh_idle_id;
+
+       /* file list for edit menu */
+       GList *editmenu_fd_list;
 };
 
 struct _ViewFileInfoList
index 22e951f..5024a12 100644 (file)
@@ -475,6 +475,9 @@ static void vf_popup_destroy_cb(GtkWidget *widget, gpointer data)
        case FILEVIEW_LIST: vflist_popup_destroy_cb(widget, data); break;
        case FILEVIEW_ICON: vficon_popup_destroy_cb(widget, data); break;
        }
+
+       filelist_free(vf->editmenu_fd_list);
+       vf->editmenu_fd_list = NULL;
 }
 
 GtkWidget *vf_pop_menu(ViewFile *vf)
@@ -547,7 +550,8 @@ GtkWidget *vf_pop_menu(ViewFile *vf)
                g_free(str_sel_mark_minus);
                }
 
-       submenu_add_edit(menu, &item, G_CALLBACK(vf_pop_menu_edit_cb), vf);
+       vf->editmenu_fd_list = vf_selection_get_list(vf);
+       submenu_add_edit(menu, &item, G_CALLBACK(vf_pop_menu_edit_cb), vf, vf->editmenu_fd_list);
        gtk_widget_set_sensitive(item, active);
 
        menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active,