annotate src/editors.c @ 737:8a8873e7a552

Make shell command and its option rc file options instead of hardcoded strings. This allows users to modify the shell command that execute "editors". Two new options appear in rc file: - shell.path (default to "/bin/sh") - shell.options (default to "-c") These options can only be changed from the rc file, not at runtime. Tests are made to check that shell.path is not empty and lead to an executable file.
author zas_
date Thu, 22 May 2008 20:22:13 +0000
parents fa8f7d7396cf
children 477f48ba28d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1 /*
196
f6e307c7bad6 rename GQview -> Geeqie over the code
nadvornik
parents: 190
diff changeset
2 * Geeqie
123
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
3 * (C) 2006 John Ellis
475
48c8e49b571c updated copyright in source files
nadvornik
parents: 444
diff changeset
4 * Copyright (C) 2008 The Geeqie Team
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
5 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
6 * Author: John Ellis
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
7 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
8 * This software is released under the GNU General Public License (GNU GPL).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
9 * Please read the included file COPYING for more information.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
10 * This software comes with no warranty of any kind, use at your own risk!
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
11 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
12
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
13
281
9995c5fb202a gqview.h -> main.h
zas_
parents: 261
diff changeset
14 #include "main.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
15 #include "editors.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
16
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
17 #include "filedata.h"
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
18 #include "filefilter.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
19 #include "utilops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
20 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
21 #include "ui_spinner.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
22 #include "ui_utildlg.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
23
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
24 #include <errno.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
25
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
26
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
27 #define EDITOR_WINDOW_WIDTH 500
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
28 #define EDITOR_WINDOW_HEIGHT 300
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
29
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
30
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
31
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
32 typedef struct _EditorVerboseData EditorVerboseData;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
33 struct _EditorVerboseData {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
34 GenericDialog *gd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
35 GtkWidget *button_close;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
36 GtkWidget *button_stop;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
37 GtkWidget *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
38 GtkWidget *progress;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
39 GtkWidget *spinner;
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
40 };
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
41
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
42 typedef struct _EditorData EditorData;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
43 struct _EditorData {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
44 gint flags;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
45 GPid pid;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
46 gchar *command_template;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
47 GList *list;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
48 gint count;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
49 gint total;
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
50 gboolean stopping;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
51 EditorVerboseData *vd;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
52 EditorCallback callback;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
53 gpointer data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
54 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
55
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
56
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
57 static Editor editor_slot_defaults[GQ_EDITOR_SLOTS] = {
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
58 { N_("The Gimp"), "gimp-remote %{.cr2;.crw;.nef;.raw;*}f" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
59 { N_("XV"), "xv %f" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
60 { N_("Xpaint"), "xpaint %f" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
61 { N_("UFraw"), "ufraw %{.cr2;.crw;.nef;.raw}p" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
62 { N_("Add XMP sidecar"), "%vFILE=%{.cr2;.crw;.nef;.raw}p;XMP=`echo \"$FILE\"|sed -e 's|\\.[^.]*$|.xmp|'`; exiftool -tagsfromfile \"$FILE\" \"$XMP\"" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
63 { NULL, NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
64 { NULL, NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
65 { NULL, NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
66 { N_("Rotate jpeg clockwise"), "%vif jpegtran -rotate 90 -copy all -outfile %{.jpg;.jpeg}p_tmp %{.jpg;.jpeg}p; then mv %{.jpg;.jpeg}p_tmp %{.jpg;.jpeg}p;else rm %{.jpg;.jpeg}p_tmp;fi" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
67 { N_("Rotate jpeg counterclockwise"), "%vif jpegtran -rotate 270 -copy all -outfile %{.jpg;.jpeg}p_tmp %{.jpg;.jpeg}p; then mv %{.jpg;.jpeg}p_tmp %{.jpg;.jpeg}p;else rm %{.jpg;.jpeg}p_tmp;fi" },
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
68 /* special slots */
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
69 #if 1
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
70 /* for testing */
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
71 { N_("External Copy command"), "%vset -x;cp %p %d" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
72 { N_("External Move command"), "%vset -x;mv %p %d" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
73 { N_("External Rename command"), "%vset -x;mv %p %d" },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
74 { N_("External Delete command"), NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
75 { N_("External New Folder command"), NULL },
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
76 #else
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
77 { N_("External Copy command"), NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
78 { N_("External Move command"), NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
79 { N_("External Rename command"), NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
80 { N_("External Delete command"), NULL },
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
81 { N_("External New Folder command"), NULL },
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
82 #endif
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
83 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
84
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
85 static void editor_verbose_window_progress(EditorData *ed, const gchar *text);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
86 static gint editor_command_next_start(EditorData *ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
87 static gint editor_command_next_finish(EditorData *ed, gint status);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
88 static gint editor_command_done(EditorData *ed);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
90 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
91 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92 * external editor routines
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
93 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
94 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
95
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96 void editor_reset_defaults(void)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
97 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
98 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
99
283
e213fb025621 GQVIEW_* -> GQ_*
zas_
parents: 281
diff changeset
100 for (i = 0; i < GQ_EDITOR_SLOTS; i++)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101 {
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
102 g_free(options->editor[i].name);
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
103 options->editor[i].name = g_strdup(_(editor_slot_defaults[i].name));
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
104 g_free(options->editor[i].command);
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
105 options->editor[i].command = g_strdup(editor_slot_defaults[i].command);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
106 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
107 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
108
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
109 static void editor_verbose_data_free(EditorData *ed)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
110 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
111 if (!ed->vd) return;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
112 g_free(ed->vd);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
113 ed->vd = NULL;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
114 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
115
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
116 static void editor_data_free(EditorData *ed)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
117 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
118 editor_verbose_data_free(ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
119 g_free(ed->command_template);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
120 g_free(ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
121 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
122
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
123 static void editor_verbose_window_close(GenericDialog *gd, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
124 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
125 EditorData *ed = data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
126
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
127 generic_dialog_close(gd);
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
128 editor_verbose_data_free(ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
129 if (ed->pid == -1) editor_data_free(ed); /* the process has already terminated */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
130 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
131
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
132 static void editor_verbose_window_stop(GenericDialog *gd, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
133 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
134 EditorData *ed = data;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
135 ed->stopping = TRUE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
136 ed->count = 0;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
137 editor_verbose_window_progress(ed, _("stopping..."));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
138 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
139
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
140 static void editor_verbose_window_enable_close(EditorVerboseData *vd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
141 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
142 vd->gd->cancel_cb = editor_verbose_window_close;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
143
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
144 spinner_set_interval(vd->spinner, -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
145 gtk_widget_set_sensitive(vd->button_stop, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146 gtk_widget_set_sensitive(vd->button_close, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
148
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
149 static EditorVerboseData *editor_verbose_window(EditorData *ed, const gchar *text)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
150 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
151 EditorVerboseData *vd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
152 GtkWidget *scrolled;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
153 GtkWidget *hbox;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
154 gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
155
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
156 vd = g_new0(EditorVerboseData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157
254
9faf34f047b1 Make the wmclass value unique among the code by defining
zas_
parents: 238
diff changeset
158 vd->gd = file_util_gen_dlg(_("Edit command results"), GQ_WMCLASS, "editor_results",
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
159 NULL, FALSE,
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
160 NULL, ed);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
161 buf = g_strdup_printf(_("Output of %s"), text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
162 generic_dialog_add_message(vd->gd, NULL, buf, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
163 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
164 vd->button_stop = generic_dialog_add_button(vd->gd, GTK_STOCK_STOP, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
165 editor_verbose_window_stop, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 gtk_widget_set_sensitive(vd->button_stop, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
167 vd->button_close = generic_dialog_add_button(vd->gd, GTK_STOCK_CLOSE, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168 editor_verbose_window_close, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169 gtk_widget_set_sensitive(vd->button_close, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
170
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
171 scrolled = gtk_scrolled_window_new(NULL, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
172 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
174 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 gtk_box_pack_start(GTK_BOX(vd->gd->vbox), scrolled, TRUE, TRUE, 5);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 gtk_widget_show(scrolled);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
178 vd->text = gtk_text_view_new();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
179 gtk_text_view_set_editable(GTK_TEXT_VIEW(vd->text), FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
180 gtk_widget_set_size_request(vd->text, EDITOR_WINDOW_WIDTH, EDITOR_WINDOW_HEIGHT);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
181 gtk_container_add(GTK_CONTAINER(scrolled), vd->text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
182 gtk_widget_show(vd->text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
183
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
184 hbox = gtk_hbox_new(FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
185 gtk_box_pack_start(GTK_BOX(vd->gd->vbox), hbox, FALSE, FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
186 gtk_widget_show(hbox);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
187
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
188 vd->progress = gtk_progress_bar_new();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
189 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(vd->progress), 0.0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
190 gtk_box_pack_start(GTK_BOX(hbox), vd->progress, TRUE, TRUE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
191 gtk_widget_show(vd->progress);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
192
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
193 vd->spinner = spinner_new(NULL, SPINNER_SPEED);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
194 gtk_box_pack_start(GTK_BOX(hbox), vd->spinner, FALSE, FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
195 gtk_widget_show(vd->spinner);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
196
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
197 gtk_widget_show(vd->gd->dialog);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
198
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
199 ed->vd = vd;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200 return vd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
201 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
202
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
203 static void editor_verbose_window_fill(EditorVerboseData *vd, gchar *text, gint len)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
204 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
205 GtkTextBuffer *buffer;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
206 GtkTextIter iter;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
207
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
208 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(vd->text));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
209 gtk_text_buffer_get_iter_at_offset(buffer, &iter, -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
210 gtk_text_buffer_insert(buffer, &iter, text, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
211 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
212
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
213 static void editor_verbose_window_progress(EditorData *ed, const gchar *text)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
214 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
215 if (!ed->vd) return;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
216
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
217 if (ed->total)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
218 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
219 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ed->vd->progress), (double)ed->count / ed->total);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
220 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
221
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
222 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ed->vd->progress), (text) ? text : "");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
223 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
224
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
225 static gboolean editor_verbose_io_cb(GIOChannel *source, GIOCondition condition, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
226 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
227 EditorData *ed = data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
228 gchar buf[512];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
229 gsize count;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
230
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
231 if (condition & G_IO_IN)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
233 while (g_io_channel_read_chars(source, buf, sizeof(buf), &count, NULL) == G_IO_STATUS_NORMAL)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
234 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
235 if (!g_utf8_validate(buf, count, NULL))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
236 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
237 gchar *utf8;
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
238
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
239 utf8 = g_locale_to_utf8(buf, count, NULL, NULL, NULL);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
240 if (utf8)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
241 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
242 editor_verbose_window_fill(ed->vd, utf8, -1);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
243 g_free(utf8);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 {
288
d1f74154463e Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents: 283
diff changeset
247 editor_verbose_window_fill(ed->vd, "Error converting text to valid utf8\n", -1);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
248 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
249 }
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
250 else
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
251 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
252 editor_verbose_window_fill(ed->vd, buf, count);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
253 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
254 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
255 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
256
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
257 if (condition & (G_IO_ERR | G_IO_HUP))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
258 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
259 g_io_channel_shutdown(source, TRUE, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
260 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
261 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
263 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
265
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
266 typedef enum {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
267 PATH_FILE,
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
268 PATH_DEST
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
269 } PathType;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
270
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
271
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
272 static gchar *editor_command_path_parse(const FileData *fd, PathType type, const gchar *extensions)
123
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
273 {
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
274 GString *string;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
275 gchar *pathl;
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
276 const gchar *p = NULL;
123
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
277
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
278 string = g_string_new("");
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
279
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
280 if (type == PATH_FILE)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
281 {
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
282 GList *ext_list = filter_to_list(extensions);
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
283 GList *work = ext_list;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
284
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
285 if (!work)
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
286 p = fd->path;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
287 else
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
288 {
516
b7e99bfeadc9 Convert the minority of while() to while ().
zas_
parents: 475
diff changeset
289 while (work)
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
290 {
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
291 GList *work2;
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
292 gchar *ext = work->data;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
293 work = work->next;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
294
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
295 if (strcmp(ext, "*") == 0 ||
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
296 strcasecmp(ext, fd->extension) == 0)
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
297 {
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
298 p = fd->path;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
299 break;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
300 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
301
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
302 work2 = fd->sidecar_files;
516
b7e99bfeadc9 Convert the minority of while() to while ().
zas_
parents: 475
diff changeset
303 while (work2)
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
304 {
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
305 FileData *sfd = work2->data;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
306 work2 = work2->next;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
307
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
308 if (strcasecmp(ext, sfd->extension) == 0)
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
309 {
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
310 p = sfd->path;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
311 break;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
312 }
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
313 }
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
314 if (p) break;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
315 }
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
316 string_list_free(ext_list);
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
317 if (!p) return NULL;
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
318 }
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
319 }
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
320 else if (type == PATH_DEST)
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
321 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
322 if (fd->change && fd->change->dest)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
323 p = fd->change->dest;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
324 else
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
325 p = "";
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
326 }
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
327
123
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
328 while (*p != '\0')
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
329 {
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
330 /* must escape \, ", `, and $ to avoid problems,
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
331 * we assume system shell supports bash-like escaping
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
332 */
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
333 if (strchr("\\\"`$", *p) != NULL)
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
334 {
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
335 string = g_string_append_c(string, '\\');
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
336 }
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
337 string = g_string_append_c(string, *p);
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
338 p++;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
339 }
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
340
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
341 pathl = path_from_utf8(string->str);
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
342 g_string_free(string, TRUE);
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
343
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
344 return pathl;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
345 }
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
346
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
347
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
348 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
349 * The supported macros for editor commands:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
350 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
351 * %f first occurence replaced by quoted sequence of filenames, command is run once.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
352 * only one occurence of this macro is supported.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
353 * ([ls %f] results in [ls "file1" "file2" ... "lastfile"])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
354 * %p command is run for each filename in turn, each instance replaced with single filename.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
355 * multiple occurences of this macro is supported for complex shell commands.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
356 * This macro will BLOCK THE APPLICATION until it completes, since command is run once
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
357 * for every file in syncronous order. To avoid blocking add the %v macro, below.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
358 * ([ls %p] results in [ls "file1"], [ls "file2"] ... [ls "lastfile"])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
359 * none if no macro is supplied, the result is equivalent to "command %f"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
360 * ([ls] results in [ls "file1" "file2" ... "lastfile"])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
361 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
362 * Only one of the macros %f or %p may be used in a given commmand.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
363 *
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
364 * %v must be the first two characters[1] in a command, causes a window to display
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
365 * showing the output of the command(s).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
366 * %V same as %v except in the case of %p only displays a window for multiple files,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
367 * operating on a single file is suppresses the output dialog.
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
368 *
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
369 * %w must be first two characters in a command, presence will disable full screen
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
370 * from exiting upon invocation.
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
371 *
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
372 *
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
373 * [1] Note: %v,%V may also be preceded by "%w".
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
374 */
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
375
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
376
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
377 gint editor_command_parse(const gchar *template, GList *list, gchar **output)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
378 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
379 gint flags = 0;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
380 const gchar *p = template;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
381 GString *result = NULL;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
382 gchar *extensions = NULL;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
383
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
384 if (output)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
385 result = g_string_new("");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
386
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
387 if (!template || template[0] == '\0')
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
388 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
389 flags |= EDITOR_ERROR_EMPTY;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
390 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
391 }
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
392
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
393 /* skip leading whitespaces if any */
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
394 while (g_ascii_isspace(*p)) p++;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
395
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
396 /* global flags */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
397 while (*p == '%')
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
398 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
399 switch (*++p)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
400 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
401 case 'w':
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
402 flags |= EDITOR_KEEP_FS;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
403 p++;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
404 break;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
405 case 'v':
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
406 flags |= EDITOR_VERBOSE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
407 p++;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
408 break;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
409 case 'V':
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
410 flags |= EDITOR_VERBOSE_MULTI;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
411 p++;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
412 break;
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
413 default:
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
414 flags |= EDITOR_ERROR_SYNTAX;
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
415 goto err;
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
416 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
417 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
418
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
419 /* skip whitespaces if any */
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
420 while (g_ascii_isspace(*p)) p++;
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
421
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
422 /* command */
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
423
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
424 while (*p)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
425 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
426 if (*p != '%')
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
427 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
428 if (output) result = g_string_append_c(result, *p);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
429 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
430 else /* *p == '%' */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
431 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
432 extensions = NULL;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
433 gchar *pathl = NULL;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
434
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
435 p++;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
436
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
437 /* for example "%f" or "%{.crw;.raw;.cr2}f" */
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
438 if (*p == '{')
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
439 {
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
440 gchar *end;
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
441
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
442 p++;
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
443 end = strchr(p, '}');
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
444 if (!end)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
445 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
446 flags |= EDITOR_ERROR_SYNTAX;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
447 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
448 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
449
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
450 extensions = g_strndup(p, end - p);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
451 p = end + 1;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
452 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
453
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
454 switch (*p)
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
455 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
456 case 'd':
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
457 flags |= EDITOR_DEST;
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
458 /* fall through */
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
459 case 'p':
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
460 flags |= EDITOR_FOR_EACH;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
461 if (flags & EDITOR_SINGLE_COMMAND)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
462 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
463 flags |= EDITOR_ERROR_INCOMPATIBLE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
464 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
465 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
466 if (output)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
467 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
468 /* use the first file from the list */
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
469 if (!list || !list->data)
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
470 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
471 flags |= EDITOR_ERROR_NO_FILE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
472 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
473 }
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
474 pathl = editor_command_path_parse((FileData *)list->data,
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
475 (flags & EDITOR_DEST) ? PATH_DEST : PATH_FILE,
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
476 extensions);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
477 if (!pathl)
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
478 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
479 flags |= EDITOR_ERROR_NO_FILE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
480 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
481 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
482 result = g_string_append_c(result, '"');
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
483 result = g_string_append(result, pathl);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
484 g_free(pathl);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
485 result = g_string_append_c(result, '"');
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
486 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
487 break;
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
488
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
489 case 'f':
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
490 flags |= EDITOR_SINGLE_COMMAND;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
491 if (flags & (EDITOR_FOR_EACH | EDITOR_DEST))
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
492 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
493 flags |= EDITOR_ERROR_INCOMPATIBLE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
494 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
495 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
496
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
497 if (output)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
498 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
499 /* use whole list */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
500 GList *work = list;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
501 gboolean ok = FALSE;
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
502
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
503 while (work)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
504 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
505 FileData *fd = work->data;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
506 pathl = editor_command_path_parse(fd, PATH_FILE, extensions);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
507
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
508 if (pathl)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
509 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
510 ok = TRUE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
511 if (work != list) g_string_append_c(result, ' ');
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
512 result = g_string_append_c(result, '"');
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
513 result = g_string_append(result, pathl);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
514 g_free(pathl);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
515 result = g_string_append_c(result, '"');
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
516 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
517 work = work->next;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
518 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
519 if (!ok)
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
520 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
521 flags |= EDITOR_ERROR_NO_FILE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
522 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
523 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
524 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
525 break;
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
526 case '%':
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
527 /* %% = % escaping */
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
528 if (output) result = g_string_append_c(result, *p);
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
529 break;
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
530 default:
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
531 flags |= EDITOR_ERROR_SYNTAX;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
532 goto err;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
533 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
534 if (extensions) g_free(extensions);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
535 extensions = NULL;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
536 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
537 p++;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
538 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
539
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
540 if (output) *output = g_string_free(result, FALSE);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
541 return flags;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
542
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
543
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
544 err:
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
545 if (output)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
546 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
547 g_string_free(result, TRUE);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
548 *output = NULL;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
549 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
550 if (extensions) g_free(extensions);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
551 return flags;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
552 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
553
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
554 static void editor_child_exit_cb (GPid pid, gint status, gpointer data)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
555 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
556 EditorData *ed = data;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
557 g_spawn_close_pid(pid);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
558 ed->pid = -1;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
559
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
560 editor_command_next_finish(ed, status);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
561 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
562
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
563
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
564 static gint editor_command_one(const gchar *template, GList *list, EditorData *ed)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
565 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
566 gchar *command;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
567 FileData *fd = list->data;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
568 GPid pid;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
569 gint standard_output;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
570 gint standard_error;
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
571 gboolean ok;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
572
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
573 ed->pid = -1;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
574 ed->flags = editor_command_parse(template, list, &command);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
575
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
576 ok = !(ed->flags & EDITOR_ERROR_MASK);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
577
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
578 if (ok)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
579 {
737
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
580 ok = (options->shell.path && *options->shell.path);
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
581 if (!ok) log_printf("ERROR: empty shell command\n");
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
582
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
583 if (ok)
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
584 {
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
585 ok = (access(options->shell.path, X_OK) == 0);
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
586 if (!ok) log_printf("ERROR: cannot execute shell command '%s'\n", options->shell.path);
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
587 }
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
588
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
589 if (!ok) ed->flags |= EDITOR_ERROR_CANT_EXEC;
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
590 }
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
591
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
592 if (ok)
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
593 {
443
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
594 gchar *working_directory;
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
595 gchar *args[4];
737
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
596 guint n = 0;
443
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
597
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
598 working_directory = remove_level_from_path(fd->path);
737
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
599 args[n++] = options->shell.path;
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
600 if (options->shell.options && *options->shell.options)
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
601 args[n++] = options->shell.options;
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
602 args[n++] = command;
8a8873e7a552 Make shell command and its option rc file options instead of hardcoded strings.
zas_
parents: 731
diff changeset
603 args[n] = NULL;
443
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
604
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
605 ok = g_spawn_async_with_pipes(working_directory, args, NULL,
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
606 G_SPAWN_DO_NOT_REAP_CHILD, /* GSpawnFlags */
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
607 NULL, NULL,
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
608 &pid,
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
609 NULL,
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
610 ed->vd ? &standard_output : NULL,
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
611 ed->vd ? &standard_error : NULL,
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
612 NULL);
443
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
613
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
614 g_free(working_directory);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
615
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
616 if (!ok) ed->flags |= EDITOR_ERROR_CANT_EXEC;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
617 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
618
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
619 if (ok)
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
620 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
621 g_child_watch_add(pid, editor_child_exit_cb, ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
622 ed->pid = pid;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
623 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
624
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
625 if (ed->vd)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
626 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
627 if (!ok)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
628 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
629 gchar *buf;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
630
147
b2266996fa83 added possibility to specify prefered file type for external commands
nadvornik
parents: 140
diff changeset
631 buf = g_strdup_printf(_("Failed to run command:\n%s\n"), template);
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
632 editor_verbose_window_fill(ed->vd, buf, strlen(buf));
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
633 g_free(buf);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
634
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
635 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
636 else
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
637 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
638 GIOChannel *channel_output;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
639 GIOChannel *channel_error;
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
640
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
641 channel_output = g_io_channel_unix_new(standard_output);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
642 g_io_channel_set_flags(channel_output, G_IO_FLAG_NONBLOCK, NULL);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
643
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
644 g_io_add_watch_full(channel_output, G_PRIORITY_HIGH, G_IO_IN | G_IO_ERR | G_IO_HUP,
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
645 editor_verbose_io_cb, ed, NULL);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
646 g_io_channel_unref(channel_output);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
647
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
648 channel_error = g_io_channel_unix_new(standard_error);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
649 g_io_channel_set_flags(channel_error, G_IO_FLAG_NONBLOCK, NULL);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
650
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
651 g_io_add_watch_full(channel_error, G_PRIORITY_HIGH, G_IO_IN | G_IO_ERR | G_IO_HUP,
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
652 editor_verbose_io_cb, ed, NULL);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
653 g_io_channel_unref(channel_error);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
654 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
655 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
656
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
657 g_free(command);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
658
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
659 return ed->flags & EDITOR_ERROR_MASK;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
660 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
661
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
662 static gint editor_command_next_start(EditorData *ed)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
663 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
664 if (ed->vd) editor_verbose_window_fill(ed->vd, "\n", 1);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
665
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
666 if (ed->list && ed->count < ed->total)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
667 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
668 FileData *fd;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
669 gint error;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
670
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
671 fd = ed->list->data;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
672
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
673 if (ed->vd)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
674 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
675 editor_verbose_window_progress(ed, (ed->flags & EDITOR_FOR_EACH) ? fd->path : _("running..."));
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
676 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
677 ed->count++;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
678
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
679 error = editor_command_one(ed->command_template, ed->list, ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
680 if (!error && ed->vd)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
681 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
682 gtk_widget_set_sensitive(ed->vd->button_stop, (ed->list != NULL) );
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
683 if (ed->flags & EDITOR_FOR_EACH)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
684 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
685 editor_verbose_window_fill(ed->vd, fd->path, strlen(fd->path));
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
686 editor_verbose_window_fill(ed->vd, "\n", 1);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
687 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
688 }
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
689
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
690 if (!error)
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
691 return 0;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
692 else
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
693 /* command was not started, call the finish immediately */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
694 return editor_command_next_finish(ed, 0);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
695 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
696
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
697 /* everything is done */
237
404629011caa Add missing return at the end of editor_command_next_start().
zas_
parents: 196
diff changeset
698 return editor_command_done(ed);
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
699 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
700
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
701 static gint editor_command_next_finish(EditorData *ed, gint status)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
702 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
703 gint cont = ed->stopping ? EDITOR_CB_SKIP : EDITOR_CB_CONTINUE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
704
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
705 if (status)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
706 ed->flags |= EDITOR_ERROR_STATUS;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
707
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
708 if (ed->flags & EDITOR_FOR_EACH)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
709 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
710 /* handle the first element from the list */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
711 GList *fd_element = ed->list;
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
712
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
713 ed->list = g_list_remove_link(ed->list, fd_element);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
714 if (ed->callback)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
715 cont = ed->callback(ed->list ? ed : NULL, ed->flags, fd_element, ed->data);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
716 filelist_free(fd_element);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
717 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
718 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
719 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
720 /* handle whole list */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
721 if (ed->callback)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
722 cont = ed->callback(NULL, ed->flags, ed->list, ed->data);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
723 filelist_free(ed->list);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
724 ed->list = NULL;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
725 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
726
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
727 if (cont == EDITOR_CB_SUSPEND)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
728 return ed->flags & EDITOR_ERROR_MASK;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
729 else if (cont == EDITOR_CB_SKIP)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
730 return editor_command_done(ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
731 else
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
732 return editor_command_next_start(ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
733 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
734
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
735 static gint editor_command_done(EditorData *ed)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
736 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
737 gint flags;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
738
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
739 if (ed->vd)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
740 {
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
741 const gchar *text;
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
742
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
743 if (ed->count == ed->total)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
744 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
745 text = _("done");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
746 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
747 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
748 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
749 text = _("stopped by user");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
750 }
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
751 editor_verbose_window_progress(ed, text);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
752 editor_verbose_window_enable_close(ed->vd);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
753 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
754
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
755 /* free the not-handled items */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
756 if (ed->list)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
757 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
758 ed->flags |= EDITOR_ERROR_SKIPPED;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
759 if (ed->callback) ed->callback(NULL, ed->flags, ed->list, ed->data);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
760 filelist_free(ed->list);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
761 ed->list = NULL;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
762 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
763
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
764 ed->count = 0;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
765
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
766 flags = ed->flags & EDITOR_ERROR_MASK;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
767
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
768 if (!ed->vd) editor_data_free(ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
769
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
770 return flags;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
771 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
772
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
773 void editor_resume(gpointer ed)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
774 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
775 editor_command_next_start(ed);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
776 }
443
e7361d06d83a editor_command_one(): tidy up.
zas_
parents: 442
diff changeset
777
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
778 void editor_skip(gpointer ed)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
779 {
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
780 editor_command_done(ed);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
781 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
782
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
783 static gint editor_command_start(const gchar *template, const gchar *text, GList *list, EditorCallback cb, gpointer data)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
784 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
785 EditorData *ed;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
786 gint flags = editor_command_parse(template, NULL, NULL);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
787
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
788 if (flags & EDITOR_ERROR_MASK) return flags & EDITOR_ERROR_MASK;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
789
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
790 ed = g_new0(EditorData, 1);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
791 ed->list = filelist_copy(list);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
792 ed->flags = flags;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
793 ed->command_template = g_strdup(template);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
794 ed->total = (flags & EDITOR_SINGLE_COMMAND) ? 1 : g_list_length(list);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
795 ed->count = 0;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
796 ed->stopping = FALSE;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
797 ed->callback = cb;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
798 ed->data = data;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
799
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
800 if ((flags & EDITOR_VERBOSE_MULTI) && list && list->next)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
801 flags |= EDITOR_VERBOSE;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
802
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
803 if (flags & EDITOR_VERBOSE)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
804 editor_verbose_window(ed, text);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
805
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 440
diff changeset
806 editor_command_next_start(ed);
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
807 /* errors from editor_command_next_start will be handled via callback */
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
808 return flags & EDITOR_ERROR_MASK;
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
809 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
810
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
811 static gint is_valid_editor_command(gint n)
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
812 {
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
813 return (n >= 0 && n < GQ_EDITOR_SLOTS
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
814 && options->editor[n].command
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
815 && strlen(options->editor[n].command) > 0);
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
816 }
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
817
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
818 gint start_editor_from_filelist_full(gint n, GList *list, EditorCallback cb, gpointer data)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
819 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
820 gchar *command;
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
821 gint error;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
822
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
823 if (!list) return FALSE;
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
824 if (!is_valid_editor_command(n)) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
825
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
826 command = g_locale_from_utf8(options->editor[n].command, -1, NULL, NULL, NULL);
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
827 error = editor_command_start(command, options->editor[n].name, list, cb, data);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
828 g_free(command);
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
829
670
a484500de88d Improve editor commands error display:
zas_
parents: 669
diff changeset
830 if (n < GQ_EDITOR_GENERIC_SLOTS && (error & EDITOR_ERROR_MASK))
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
831 {
670
a484500de88d Improve editor commands error display:
zas_
parents: 669
diff changeset
832 gchar *text = g_strdup_printf(_("%s\n#%d \"%s\":\n%s"), editor_get_error_str(error), n+1,
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
833 options->editor[n].name, options->editor[n].command);
669
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
834
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
835 file_util_warning_dialog(_("Invalid editor command"), text, GTK_STOCK_DIALOG_ERROR, NULL);
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
836 g_free(text);
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
837 }
dd5d7fe9458f Improve editors a bit:
zas_
parents: 586
diff changeset
838
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
839 return error;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
840 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
841
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
842 gint start_editor_from_filelist(gint n, GList *list)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
843 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
844 return start_editor_from_filelist_full(n, list, NULL, NULL);
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
845 }
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
846
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
847 gint start_editor_from_file_full(gint n, FileData *fd, EditorCallback cb, gpointer data)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
848 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
849 GList *list;
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
850 gint error;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
851
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
852 if (!fd) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
853
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
854 list = g_list_append(NULL, fd);
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
855 error = start_editor_from_filelist_full(n, list, cb, data);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
856 g_list_free(list);
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
857 return error;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
858 }
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
859
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
860 gint start_editor_from_file(gint n, FileData *fd)
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
861 {
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
862 return start_editor_from_file_full(n, fd, NULL, NULL);
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
863 }
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
864
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
865 gint editor_window_flag_set(gint n)
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
866 {
444
452b7ffeb7ad Minor cleanup and code redundancy reduction.
zas_
parents: 443
diff changeset
867 if (!is_valid_editor_command(n)) return TRUE;
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
868
730
2d8a8e892b5e Use a struct to handle editor's properties.
zas_
parents: 671
diff changeset
869 return (editor_command_parse(options->editor[n].command, NULL, NULL) & EDITOR_KEEP_FS);
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
870 }
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
871
140
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
872 const gchar *editor_get_error_str(gint flags)
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
873 {
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
874 if (flags & EDITOR_ERROR_EMPTY) return _("Editor template is empty.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
875 if (flags & EDITOR_ERROR_SYNTAX) return _("Editor template has incorrect syntax.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
876 if (flags & EDITOR_ERROR_INCOMPATIBLE) return _("Editor template uses incompatible macros.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
877 if (flags & EDITOR_ERROR_NO_FILE) return _("Can't find matching file type.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
878 if (flags & EDITOR_ERROR_CANT_EXEC) return _("Can't execute external editor.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
879 if (flags & EDITOR_ERROR_STATUS) return _("External editor returned error status.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
880 if (flags & EDITOR_ERROR_SKIPPED) return _("File was skipped.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
881 return _("Unknown error.");
e57b0207e180 editors.c was almost completely rewritten:
nadvornik
parents: 138
diff changeset
882 }
731
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
883
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
884 const gchar *editor_get_name(gint n)
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
885 {
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
886 if (!is_valid_editor_command(n)) return NULL;
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
887
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
888 if (options->editor[n].name && strlen(options->editor[n].name) > 0)
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
889 return options->editor[n].name;
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
890
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
891 return _("(unknown)");
fa8f7d7396cf Introduce an helper function that returns the name of an editor.
zas_
parents: 730
diff changeset
892 }