run external commands from current directory even with no files
authorVladimir Nadvornik <nadvornik@suse.cz>
Fri, 19 Jun 2009 22:34:52 +0000 (22:34 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Fri, 19 Jun 2009 22:34:52 +0000 (22:34 +0000)
src/collect-table.c
src/dupe.c
src/editors.c
src/editors.h
src/layout_util.c
src/search.c
src/utilops.c
src/utilops.h
src/view_file.c

index ed47dc8..f7ef691 100644 (file)
@@ -666,7 +666,7 @@ static void collection_table_popup_edit_cb(GtkWidget *widget, gpointer data)
        list = collection_table_popup_file_list(ct);
        if (list)
                {
-               file_util_start_editor_from_filelist(key, list, ct->listview);
+               file_util_start_editor_from_filelist(key, list, NULL, ct->listview);
                filelist_free(list);
                }
 }
index 586e9c5..9f671e6 100644 (file)
@@ -2046,7 +2046,7 @@ static void dupe_window_edit_selected(DupeWindow *dw, const gchar *key)
 
        list = dupe_listview_get_selection(dw, dw->listview);
 
-       file_util_start_editor_from_filelist(key, list, dw->window);
+       file_util_start_editor_from_filelist(key, list, NULL, dw->window);
 
        filelist_free(list);
 }
index ca5ccad..31fd05e 100644 (file)
@@ -52,6 +52,7 @@ struct _EditorData {
        EditorCallback callback;
        gpointer data;
        const EditorDescription *editor;
+       gchar *working_directory; /* fallback if no files are given (editor_no_param) */
 };
 
 
@@ -464,6 +465,7 @@ static void editor_verbose_data_free(EditorData *ed)
 static void editor_data_free(EditorData *ed)
 {
        editor_verbose_data_free(ed);
+       g_free(ed->working_directory);
        g_free(ed);
 }
 
@@ -963,7 +965,7 @@ static EditorFlags editor_command_one(const EditorDescription *editor, GList *li
                gchar *args[4];
                guint n = 0;
 
-               working_directory = fd ? remove_level_from_path(fd->path) : NULL;
+               working_directory = fd ? remove_level_from_path(fd->path) : g_strdup(ed->working_directory);
                args[n++] = options->shell.path;
                if (options->shell.options && *options->shell.options)
                        args[n++] = options->shell.options;
@@ -1165,7 +1167,7 @@ void editor_skip(gpointer ed)
        editor_command_done(ed);
 }
 
-static EditorFlags editor_command_start(const EditorDescription *editor, const gchar *text, GList *list, EditorCallback cb, gpointer data)
+static EditorFlags editor_command_start(const EditorDescription *editor, const gchar *text, GList *list, const gchar *working_directory, EditorCallback cb, gpointer data)
 {
        EditorData *ed;
        EditorFlags flags = editor->flags;
@@ -1178,7 +1180,8 @@ static EditorFlags editor_command_start(const EditorDescription *editor, const g
        ed->editor = editor;
        ed->total = (flags & (EDITOR_SINGLE_COMMAND | EDITOR_NO_PARAM)) ? 1 : g_list_length(list);
        ed->callback = cb;
-       ed->data =  data;
+       ed->data = data;
+       ed->working_directory = g_strdup(working_directory);
 
        if ((flags & EDITOR_VERBOSE_MULTI) && list && list->next)
                flags |= EDITOR_VERBOSE;
@@ -1197,7 +1200,7 @@ gboolean is_valid_editor_command(const gchar *key)
        return g_hash_table_lookup(editors, key) != NULL;
 }
 
-EditorFlags start_editor_from_filelist_full(const gchar *key, GList *list, EditorCallback cb, gpointer data)
+EditorFlags start_editor_from_filelist_full(const gchar *key, GList *list, const gchar *working_directory, EditorCallback cb, gpointer data)
 {
        EditorFlags error;
        EditorDescription *editor;
@@ -1208,7 +1211,7 @@ EditorFlags start_editor_from_filelist_full(const gchar *key, GList *list, Edito
        if (!editor) return FALSE;
        if (!list && !(editor->flags & EDITOR_NO_PARAM)) return FALSE;
 
-       error = editor_command_start(editor, editor->name, list, cb, data);
+       error = editor_command_start(editor, editor->name, list, working_directory, cb, data);
 
        if (EDITOR_ERRORS(error))
                {
@@ -1223,7 +1226,7 @@ EditorFlags start_editor_from_filelist_full(const gchar *key, GList *list, Edito
 
 EditorFlags start_editor_from_filelist(const gchar *key, GList *list)
 {
-       return start_editor_from_filelist_full(key, list,  NULL, NULL);
+       return start_editor_from_filelist_full(key, list, NULL, NULL, NULL);
 }
 
 EditorFlags start_editor_from_file_full(const gchar *key, FileData *fd, EditorCallback cb, gpointer data)
@@ -1234,7 +1237,7 @@ EditorFlags start_editor_from_file_full(const gchar *key, FileData *fd, EditorCa
        if (!fd) return FALSE;
 
        list = g_list_append(NULL, fd);
-       error = start_editor_from_filelist_full(key, list, cb, data);
+       error = start_editor_from_filelist_full(key, list, NULL, cb, data);
        g_list_free(list);
        return error;
 }
@@ -1244,9 +1247,9 @@ EditorFlags start_editor_from_file(const gchar *key, FileData *fd)
        return start_editor_from_file_full(key, fd, NULL, NULL);
 }
 
-EditorFlags start_editor(const gchar *key)
+EditorFlags start_editor(const gchar *key, const gchar *working_directory)
 {
-       return start_editor_from_filelist_full(key, NULL, NULL, NULL);
+       return start_editor_from_filelist_full(key, NULL, working_directory, NULL, NULL);
 }
 
 gboolean editor_window_flag_set(const gchar *key)
index acc2e6c..1201fc9 100644 (file)
@@ -99,11 +99,11 @@ void editor_skip(gpointer ed);
 
 
 
-EditorFlags start_editor(const gchar *key);
+EditorFlags start_editor(const gchar *key, const gchar *working_directory);
 EditorFlags start_editor_from_file(const gchar *key, FileData *fd);
 EditorFlags start_editor_from_filelist(const gchar *key, GList *list);
 EditorFlags start_editor_from_file_full(const gchar *key, FileData *fd, EditorCallback cb, gpointer data);
-EditorFlags start_editor_from_filelist_full(const gchar *key, GList *list, EditorCallback cb, gpointer data);
+EditorFlags start_editor_from_filelist_full(const gchar *key, GList *list, const gchar *working_directory, EditorCallback cb, gpointer data);
 gboolean editor_window_flag_set(const gchar *key);
 gboolean editor_is_filter(const gchar *key);
 gboolean editor_no_param(const gchar *key);
index 6958221..28ef5e2 100644 (file)
@@ -998,7 +998,7 @@ static void layout_menu_edit_cb(GtkAction *action, gpointer data)
                layout_exit_fullscreen(lw);
 
        list = layout_selection_list(lw);
-       file_util_start_editor_from_filelist(key, list, lw->window);
+       file_util_start_editor_from_filelist(key, list, layout_get_path(lw), lw->window);
        filelist_free(list);
 }
 
index c5673ad..fe472f4 100644 (file)
@@ -665,7 +665,7 @@ static void search_result_edit_selected(SearchData *sd, const gchar *key)
        GList *list;
 
        list = search_result_selection_list(sd);
-       file_util_start_editor_from_filelist(key, list, sd->window);
+       file_util_start_editor_from_filelist(key, list, NULL, sd->window);
        filelist_free(list);
 }
 
index 5114fb5..123b4ab 100644 (file)
@@ -848,7 +848,7 @@ void file_util_perform_ci(UtilityData *ud)
                        if (editor_blocks_file(ud->external_command))
                                {
                                DEBUG_1("Starting %s and waiting for results", ud->external_command);
-                               flags = start_editor_from_filelist_full(ud->external_command, ud->flist, file_util_perform_ci_cb, ud);
+                               flags = start_editor_from_filelist_full(ud->external_command, ud->flist, NULL, file_util_perform_ci_cb, ud);
                                }
                        else
                                {
@@ -2164,7 +2164,7 @@ static void file_util_rename_full(FileData *source_fd, GList *source_list, const
        file_util_dialog_run(ud);
 }
 
-static void file_util_start_editor_full(const gchar *key, FileData *source_fd, GList *source_list, const gchar *dest_path, GtkWidget *parent, UtilityPhase phase)
+static void file_util_start_editor_full(const gchar *key, FileData *source_fd, GList *source_list, const gchar *dest_path, const gchar *working_directory, GtkWidget *parent, UtilityPhase phase)
 {
        UtilityData *ud;
        GList *flist;
@@ -2172,8 +2172,21 @@ static void file_util_start_editor_full(const gchar *key, FileData *source_fd, G
        
        if (editor_no_param(key))
                {
+               gchar *file_directory = NULL;
+               if (!working_directory)
+                       {
+                       /* working directory was not specified, try to extract it from the files */
+                       if (source_fd)
+                               file_directory = remove_level_from_path(source_fd->path);
+
+                       if (!file_directory && source_list)
+                               file_directory = remove_level_from_path(((FileData *)source_list->data)->path);
+                       working_directory = file_directory;
+                       }
+               
                /* just start the editor, don't care about files */
-               start_editor(key);
+               start_editor(key, working_directory);
+               g_free(file_directory);
                return;
                }
        
@@ -2715,22 +2728,22 @@ void file_util_rename_simple(FileData *fd, const gchar *dest_path, GtkWidget *pa
 
 void file_util_start_editor_from_file(const gchar *key, FileData *fd, GtkWidget *parent)
 {
-       file_util_start_editor_full(key, fd, NULL, NULL, parent, UTILITY_PHASE_ENTERING);
+       file_util_start_editor_full(key, fd, NULL, NULL, NULL, parent, UTILITY_PHASE_ENTERING);
 }
 
-void file_util_start_editor_from_filelist(const gchar *key, GList *list, GtkWidget *parent)
+void file_util_start_editor_from_filelist(const gchar *key, GList *list, const gchar *working_directory, GtkWidget *parent)
 {
-       file_util_start_editor_full(key, NULL, list, NULL, parent, UTILITY_PHASE_ENTERING);
+       file_util_start_editor_full(key, NULL, list, NULL, working_directory, parent, UTILITY_PHASE_ENTERING);
 }
 
 void file_util_start_filter_from_file(const gchar *key, FileData *fd, const gchar *dest_path, GtkWidget *parent)
 {
-       file_util_start_editor_full(key, fd, NULL, dest_path, parent, UTILITY_PHASE_ENTERING);
+       file_util_start_editor_full(key, fd, NULL, dest_path, NULL, parent, UTILITY_PHASE_ENTERING);
 }
 
 void file_util_start_filter_from_filelist(const gchar *key, GList *list, const gchar *dest_path, GtkWidget *parent)
 {
-       file_util_start_editor_full(key, NULL, list, dest_path, parent, UTILITY_PHASE_ENTERING);
+       file_util_start_editor_full(key, NULL, list, dest_path, NULL, parent, UTILITY_PHASE_ENTERING);
 }
 
 void file_util_delete_dir(FileData *fd, GtkWidget *parent)
index 50be65b..612740c 100644 (file)
@@ -51,7 +51,9 @@ void file_util_copy_simple(GList *list, const gchar *dest_path, GtkWidget *paren
 void file_util_rename_simple(FileData *fd, const gchar *dest_path, GtkWidget *parent);
 
 void file_util_start_editor_from_file(const gchar *key, FileData *fd, GtkWidget *parent);
-void file_util_start_editor_from_filelist(const gchar *key, GList *list, GtkWidget *parent);
+
+/* working directory is used only as a fallback when the filelist is empty */
+void file_util_start_editor_from_filelist(const gchar *key, GList *list, const gchar *working_directory, GtkWidget *parent);
 void file_util_start_filter_from_file(const gchar *key, FileData *fd, const gchar *dest_path, GtkWidget *parent);
 void file_util_start_filter_from_filelist(const gchar *key, GList *list, const gchar *dest_path, GtkWidget *parent);
 
index 7f1f3c3..85e6144 100644 (file)
@@ -321,7 +321,7 @@ static void vf_pop_menu_edit_cb(GtkWidget *widget, gpointer data)
        if (!vf) return;
 
        list = vf_pop_menu_file_list(vf);
-       file_util_start_editor_from_filelist(key, list, vf->listview);
+       file_util_start_editor_from_filelist(key, list, vf->dir_fd->path, vf->listview);
        filelist_free(list);
 }