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)
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);
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;
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,
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);
GtkWidget *second_status_label;
gint color_frozen;
+
+ /* file list for edit menu */
+ GList *editmenu_fd_list;
+
};
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);
/*
*-----------------------------------------------------------------------------
}
-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;
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':
goto err;
}
- if (output)
{
/* use whole list */
GList *work = list;
{
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;
}
}
-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);
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: */
GList *list;
GList *list_pointer;
+
+ /* file list for edit menu */
+ GList *editmenu_fd_list;
};
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;
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);
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;
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);
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);
*-----------------------------------------------------------------------------
*/
-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;
{
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;
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);
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,
PanItem *search_pi;
gint idle_id;
+
+ /* file list for edit menu */
+ GList *editmenu_fd_list;
};
typedef struct _PanGrid PanGrid;
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;
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);
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);
ThumbLoader *thumb_loader;
gint thumb_enable;
FileData *thumb_fd;
+
+ /* file list for edit menu */
+ GList *editmenu_fd_list;
+
};
typedef struct _MatchFileData MatchFileData;
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,
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);
gint drop_idle_id;
gint show_text;
+
+ /* file list for edit menu */
+ GList *editmenu_fd_list;
};
struct _CollectWindow
// gint bar_width;
GtkWidget *exif_window;
+
+ /* file list for edit menu */
+ GList *editmenu_fd_list;
};
struct _ViewDir
/* refresh */
gint refresh_idle_id;
+
+ /* file list for edit menu */
+ GList *editmenu_fd_list;
};
struct _ViewFileInfoList
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)
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,