# HG changeset patch # User zas_ # Date 1236518605 0 # Node ID a0bd58a6535fc1ab4176388b56a3fe76d39bde95 # Parent 58f0b4586c8c161acae7e91c942018e5d2eea267 In various Edit context menus, only display editors that match the file types in the selection. diff -r 58f0b4586c8c -r a0bd58a6535f src/collect-table.c --- a/src/collect-table.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/collect-table.c Sun Mar 08 13:23:25 2009 +0000 @@ -839,6 +839,9 @@ 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 @@ 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); diff -r 58f0b4586c8c -r a0bd58a6535f src/dupe.c --- a/src/dupe.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/dupe.c Sun Mar 08 13:23:25 2009 +0000 @@ -2211,6 +2211,30 @@ 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 @@ 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 @@ 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); diff -r 58f0b4586c8c -r a0bd58a6535f src/dupe.h --- a/src/dupe.h Sun Mar 08 12:42:23 2009 +0000 +++ b/src/dupe.h Sun Mar 08 13:23:25 2009 +0000 @@ -109,6 +109,10 @@ GtkWidget *second_status_label; gint color_frozen; + + /* file list for edit menu */ + GList *editmenu_fd_list; + }; diff -r 58f0b4586c8c -r a0bd58a6535f src/editors.c --- a/src/editors.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/editors.c Sun Mar 08 13:23:25 2009 +0000 @@ -59,7 +59,6 @@ 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 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 @@ 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 @@ goto err; } - if (output) { /* use whole list */ GList *work = list; @@ -731,15 +730,19 @@ { 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 @@ } -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); diff -r 58f0b4586c8c -r a0bd58a6535f src/editors.h --- a/src/editors.h Sun Mar 08 12:42:23 2009 +0000 +++ b/src/editors.h Sun Mar 08 13:23:25 2009 +0000 @@ -77,6 +77,7 @@ 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: */ diff -r 58f0b4586c8c -r a0bd58a6535f src/img-view.c --- a/src/img-view.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/img-view.c Sun Mar 08 13:23:25 2009 +0000 @@ -49,6 +49,9 @@ GList *list; GList *list_pointer; + + /* file list for edit menu */ + GList *editmenu_fd_list; }; @@ -1240,6 +1243,28 @@ 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 @@ 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); diff -r 58f0b4586c8c -r a0bd58a6535f src/layout_image.c --- a/src/layout_image.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/layout_image.c Sun Mar 08 13:23:25 2009 +0000 @@ -456,6 +456,25 @@ 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 @@ 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 @@ 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); diff -r 58f0b4586c8c -r a0bd58a6535f src/menu.c --- a/src/menu.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/menu.c Sun Mar 08 13:23:25 2009 +0000 @@ -64,7 +64,7 @@ *----------------------------------------------------------------------------- */ -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 @@ { 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 @@ 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); diff -r 58f0b4586c8c -r a0bd58a6535f src/menu.h --- a/src/menu.h Sun Mar 08 12:42:23 2009 +0000 +++ b/src/menu.h Sun Mar 08 13:23:25 2009 +0000 @@ -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, diff -r 58f0b4586c8c -r a0bd58a6535f src/pan-types.h --- a/src/pan-types.h Sun Mar 08 12:42:23 2009 +0000 +++ b/src/pan-types.h Sun Mar 08 13:23:25 2009 +0000 @@ -227,6 +227,9 @@ PanItem *search_pi; gint idle_id; + + /* file list for edit menu */ + GList *editmenu_fd_list; }; typedef struct _PanGrid PanGrid; diff -r 58f0b4586c8c -r a0bd58a6535f src/pan-view.c --- a/src/pan-view.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/pan-view.c Sun Mar 08 13:23:25 2009 +0000 @@ -2773,6 +2773,24 @@ 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 @@ 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 @@ 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); diff -r 58f0b4586c8c -r a0bd58a6535f src/search.c --- a/src/search.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/search.c Sun Mar 08 13:23:25 2009 +0000 @@ -190,6 +190,10 @@ 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 @@ 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 @@ 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); diff -r 58f0b4586c8c -r a0bd58a6535f src/typedefs.h --- a/src/typedefs.h Sun Mar 08 12:42:23 2009 +0000 +++ b/src/typedefs.h Sun Mar 08 13:23:25 2009 +0000 @@ -340,6 +340,9 @@ gint drop_idle_id; gint show_text; + + /* file list for edit menu */ + GList *editmenu_fd_list; }; struct _CollectWindow @@ -655,6 +658,9 @@ // gint bar_width; GtkWidget *exif_window; + + /* file list for edit menu */ + GList *editmenu_fd_list; }; struct _ViewDir @@ -739,6 +745,9 @@ /* refresh */ gint refresh_idle_id; + + /* file list for edit menu */ + GList *editmenu_fd_list; }; struct _ViewFileInfoList diff -r 58f0b4586c8c -r a0bd58a6535f src/view_file.c --- a/src/view_file.c Sun Mar 08 12:42:23 2009 +0000 +++ b/src/view_file.c Sun Mar 08 13:23:25 2009 +0000 @@ -475,6 +475,9 @@ 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 @@ 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,