do not block the files sent to external editors like gimp
authorVladimir Nadvornik <nadvornik@suse.cz>
Sun, 31 May 2009 11:08:00 +0000 (11:08 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Sun, 31 May 2009 11:08:00 +0000 (11:08 +0000)
src/editors.c
src/editors.h
src/utilops.c

index 0d9bc18..ca5ccad 100644 (file)
@@ -1282,6 +1282,23 @@ gboolean editor_no_param(const gchar *key)
        return !!(editor->flags & EDITOR_NO_PARAM);
 }
 
+gboolean editor_blocks_file(const gchar *key)
+{
+       EditorDescription *editor;
+       if (!key) return FALSE;
+       
+       editor = g_hash_table_lookup(editors, key);
+       if (!editor) return FALSE;
+
+       /* Decide if the image file should be blocked during editor execution
+          Editors like gimp can be used long time after the original file was
+          saved, for editing unrelated files.
+          %f vs. %F seems to be a good heuristic to detect this kind of editors.
+       */
+          
+       return !(editor->flags & EDITOR_SINGLE_COMMAND);
+}
+
 const gchar *editor_get_error_str(EditorFlags flags)
 {
        if (flags & EDITOR_ERROR_EMPTY) return _("Editor template is empty.");
index 352d71b..acc2e6c 100644 (file)
@@ -112,6 +112,8 @@ const gchar *editor_get_error_str(EditorFlags flags);
 const gchar *editor_get_name(const gchar *key);
 
 gboolean is_valid_editor_command(const gchar *key);
+gboolean editor_blocks_file(const gchar *key);
+
 EditorFlags editor_command_parse(const EditorDescription *editor, GList *list, gchar **output);
 
 #endif
index 15136ac..39b4e25 100644 (file)
@@ -845,7 +845,18 @@ void file_util_perform_ci(UtilityData *ud)
                        }
                else
                        {
-                       flags = start_editor_from_filelist_full(ud->external_command, ud->flist, file_util_perform_ci_cb, 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);
+                               }
+                       else
+                               {
+                               /* start the editor without callback and finish the operation internally */
+                               DEBUG_1("Starting %s and finishing the operation", ud->external_command);
+                               flags = start_editor_from_filelist(ud->external_command, ud->flist);
+                               file_util_perform_ci_internal(ud);
+                               }
                        }
 
                if (flags)