annotate src/editors.c @ 138:71e1ebee420e

replaced gchar* path with FileData *fd
author nadvornik
date Tue, 11 Sep 2007 20:06:29 +0000
parents 18c2a29e681c
children e57b0207e180
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 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
2 * GQview
123
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
3 * (C) 2006 John Ellis
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
4 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
5 * Author: John Ellis
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
6 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
7 * This software is released under the GNU General Public License (GNU GPL).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
8 * Please read the included file COPYING for more information.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
9 * 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
10 */
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 #include "gqview.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
14 #include "editors.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
15
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
16 #include "utilops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
17 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
18 #include "ui_spinner.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
19 #include "ui_utildlg.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
20
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
21 #include <errno.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
22
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 #define EDITOR_WINDOW_WIDTH 500
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
25 #define EDITOR_WINDOW_HEIGHT 300
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 COMMAND_SHELL "sh"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
28 #define COMMAND_OPT "-c"
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 typedef struct _EditorVerboseData EditorVerboseData;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
32 struct _EditorVerboseData {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
33 int fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
34
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
35 GenericDialog *gd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
36 GtkWidget *button_close;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
37 GtkWidget *button_stop;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
38 GtkWidget *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
39 GtkWidget *progress;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
40 GtkWidget *spinner;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
41 gint count;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
42 gint total;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
43
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
44 gchar *command_template;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
45 GList *list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
46 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
47
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
48
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
49 static gchar *editor_slot_defaults[GQVIEW_EDITOR_SLOTS * 2] = {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
50 N_("The Gimp"), "gimp-remote -n %f",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
51 N_("XV"), "xv %f",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
52 N_("Xpaint"), "xpaint %f",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
53 NULL, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
54 NULL, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
55 NULL, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
56 NULL, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
57 NULL, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
58 N_("Rotate jpeg clockwise"), "%vif jpegtran -rotate 90 -copy all -outfile %p_tmp %p; then mv %p_tmp %p;else rm %p_tmp;fi",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
59 N_("Rotate jpeg counterclockwise"), "%vif jpegtran -rotate 270 -copy all -outfile %p_tmp %p; then mv %p_tmp %p;else rm %p_tmp;fi",
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
60 /* special slots */
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
61 #if 1
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
62 /* for testing */
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
63 "External Copy command", "%vset -x;cp %p %t",
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
64 "External Move command", "%vset -x;mv %p %t",
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
65 "External Rename command", "%vset -x;mv %p %t",
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
66 "External Delete command", "%vset -x;rm %f",
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
67 "External New Folder command", NULL
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
68 #else
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
69 "External Copy command", NULL,
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
70 "External Move command", NULL,
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
71 "External Rename command", NULL,
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
72 "External Delete command", NULL,
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
73 "External New Folder command", NULL
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
74 #endif
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
75 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
76
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
77 static void editor_verbose_window_progress(EditorVerboseData *vd, const gchar *text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
78 static gint editor_command_next(EditorVerboseData *vd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
79
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
80
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
81 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
82 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
83 * external editor routines
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
84 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
85 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
86
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
87 void editor_reset_defaults(void)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
88 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89 gint i;
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 for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
93 g_free(editor_name[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
94 editor_name[i] = g_strdup(_(editor_slot_defaults[i * 2]));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
95 g_free(editor_command[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96 editor_command[i] = g_strdup(editor_slot_defaults[i * 2 + 1]);
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 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
99
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
100 static void editor_verbose_window_close(GenericDialog *gd, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
102 EditorVerboseData *vd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
103
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
104 generic_dialog_close(gd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
105 g_free(vd->command_template);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
106 g_free(vd);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
109 static void editor_verbose_window_stop(GenericDialog *gd, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
110 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
111 EditorVerboseData *vd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
112
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
113 filelist_free(vd->list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
114 vd->list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
115
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
116 vd->count = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
117 editor_verbose_window_progress(vd, _("stopping..."));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
118 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
119
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
120 static void editor_verbose_window_enable_close(EditorVerboseData *vd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
121 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
122 vd->gd->cancel_cb = editor_verbose_window_close;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
123
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
124 spinner_set_interval(vd->spinner, -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
125 gtk_widget_set_sensitive(vd->button_stop, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
126 gtk_widget_set_sensitive(vd->button_close, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
127 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
128
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
129 static EditorVerboseData *editor_verbose_window(const gchar *template, const gchar *text)
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 EditorVerboseData *vd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
132 GtkWidget *scrolled;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
133 GtkWidget *hbox;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
134 gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
135
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
136 vd = g_new0(EditorVerboseData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
137
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
138 vd->list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
139 vd->command_template = g_strdup(template);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
140 vd->total = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
141 vd->count = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
142 vd->fd = -1;
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 vd->gd = file_util_gen_dlg(_("Edit command results"), "GQview", "editor_results",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
145 NULL, FALSE,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146 NULL, vd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147 buf = g_strdup_printf(_("Output of %s"), text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
148 generic_dialog_add_message(vd->gd, NULL, buf, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
149 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
150 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
151 editor_verbose_window_stop, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
152 gtk_widget_set_sensitive(vd->button_stop, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
153 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
154 editor_verbose_window_close, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
155 gtk_widget_set_sensitive(vd->button_close, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
156
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157 scrolled = gtk_scrolled_window_new(NULL, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
158 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
159 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
160 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
161 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
162 gtk_widget_show(scrolled);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
163
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
164 vd->text = gtk_text_view_new();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
165 gtk_text_view_set_editable(GTK_TEXT_VIEW(vd->text), FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 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
167 gtk_container_add(GTK_CONTAINER(scrolled), vd->text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168 gtk_widget_show(vd->text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
170 hbox = gtk_hbox_new(FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
171 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
172 gtk_widget_show(hbox);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
174 vd->progress = gtk_progress_bar_new();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(vd->progress), 0.0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 gtk_box_pack_start(GTK_BOX(hbox), vd->progress, TRUE, TRUE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177 gtk_widget_show(vd->progress);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
178
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
179 vd->spinner = spinner_new(NULL, SPINNER_SPEED);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
180 gtk_box_pack_start(GTK_BOX(hbox), vd->spinner, FALSE, FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
181 gtk_widget_show(vd->spinner);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
182
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
183 gtk_widget_show(vd->gd->dialog);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
184
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
185 return vd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
186 }
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 static void editor_verbose_window_fill(EditorVerboseData *vd, gchar *text, gint len)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
189 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
190 GtkTextBuffer *buffer;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
191 GtkTextIter iter;
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 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(vd->text));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
194 gtk_text_buffer_get_iter_at_offset(buffer, &iter, -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
195 gtk_text_buffer_insert(buffer, &iter, text, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
196 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
197
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
198 static void editor_verbose_window_progress(EditorVerboseData *vd, const gchar *text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
199 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200 if (vd->total)
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 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(vd->progress), (double)vd->count / vd->total);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
203 }
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 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(vd->progress), (text) ? text : "");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
206 }
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 static gboolean editor_verbose_io_cb(GIOChannel *source, GIOCondition condition, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
209 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
210 EditorVerboseData *vd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
211 gchar buf[512];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
212 gsize count;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
213
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
214 switch (condition)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
215 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
216 case G_IO_IN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
217 while (g_io_channel_read_chars(source, buf, sizeof(buf), &count, NULL) == G_IO_STATUS_NORMAL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
218 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
219 if (!g_utf8_validate(buf, count, NULL))
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 gchar *utf8;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
222 utf8 = g_locale_to_utf8(buf, count, NULL, NULL, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
223 if (utf8)
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 editor_verbose_window_fill(vd, utf8, -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
226 g_free(utf8);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
227 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
228 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
229 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
230 editor_verbose_window_fill(vd, "GQview: Error converting text to valid utf8\n", -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
231 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
233 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
234 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
235 editor_verbose_window_fill(vd, buf, count);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
236 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
237 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
238 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
239 case G_IO_ERR:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
240 printf("Error reading from command\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
241 case G_IO_HUP:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
242 if (debug) printf("Editor command HUP\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
243 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244 while (g_source_remove_by_user_data(vd));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 close(vd->fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 vd->fd = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
247 editor_command_next(vd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
248 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
249 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
250 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
251
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
252 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
253 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
254
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
255 static int command_pipe(char *command)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
256 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
257 char *args[4];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
258 int fpipe[2];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
259 pid_t fpid;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
260
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
261 args[0] = COMMAND_SHELL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262 args[1] = COMMAND_OPT;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
263 args[2] = command;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264 args[3] = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
265
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
266 if (pipe(fpipe) < 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
267 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
268 printf("pipe setup failed: %s\n", strerror(errno));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
269 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
270 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
271
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
272 fpid = fork();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
273 if (fpid < 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
274 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
275 /* fork failed */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
276 printf("fork failed: %s\n", strerror(errno));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
277 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
278 else if (fpid == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
279 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
280 /* child */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
281 gchar *msg;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
282
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
283 dup2(fpipe[1], 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
284 dup2(fpipe[1], 2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
285 close(fpipe[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
286
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
287 execvp(args[0], args);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
288
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
289 msg = g_strdup_printf("Unable to exec command:\n%s\n\n%s\n", command, strerror(errno));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
290 write(1, msg, strlen(msg));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
291
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
292 _exit(1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
293 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
294 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
295 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
296 /* parent */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
297 fcntl(fpipe[0], F_SETFL, O_NONBLOCK);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
298 close(fpipe[1]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
299
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
300 return fpipe[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
301 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
302
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
303 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
304 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
305
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
306 static gint editor_verbose_start(EditorVerboseData *vd, gchar *command)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
307 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
308 GIOChannel *channel;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
309 int fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
310
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
311 fd = command_pipe(command);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
312 if (fd < 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
313 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
314 gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
315
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
316 buf = g_strdup_printf(_("Failed to run command:\n%s\n"), command);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
317 editor_verbose_window_fill(vd, buf, strlen(buf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
318 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
319
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
320 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
321 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
322
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
323 vd->fd = fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
324 channel = g_io_channel_unix_new(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
325
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
326 g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_IN,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
327 editor_verbose_io_cb, vd, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
328 g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_ERR,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
329 editor_verbose_io_cb, vd, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
330 g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_HUP,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
331 editor_verbose_io_cb, vd, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
332 g_io_channel_unref(channel);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
333
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
334 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
335 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
336
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
337 typedef enum {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
338 PATH_FILE,
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
339 PATH_TARGET
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
340 } PathType;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
341
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
342
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
343 static gchar *editor_command_path_parse(const FileData *fd, PathType type)
123
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
344 {
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
345 GString *string;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
346 gchar *pathl;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
347 const gchar *p;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
348
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
349 string = g_string_new("");
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
350
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
351 if (type == PATH_FILE)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
352 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
353 p = fd->path;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
354 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
355 else if (type == PATH_TARGET)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
356 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
357 if (fd->change && fd->change->dest)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
358 p = fd->change->dest;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
359 else
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
360 p = "";
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
361 }
123
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
362 while (*p != '\0')
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
363 {
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
364 /* must escape \, ", `, and $ to avoid problems,
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
365 * 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
366 */
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
367 if (strchr("\\\"`$", *p) != NULL)
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
368 {
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
369 string = g_string_append_c(string, '\\');
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
370 }
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
371 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
372 p++;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
373 }
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
374
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
375 pathl = path_from_utf8(string->str);
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
376 g_string_free(string, TRUE);
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
377
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
378 return pathl;
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
379 }
3602a4aa7c71 Sat Dec 2 20:15:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 60
diff changeset
380
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
381 static gint editor_command_one(const gchar *template, const FileData *fd, EditorVerboseData *vd)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
382 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
383 GString *result = NULL;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
384 gchar *pathl, *targetl;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
385 gchar *found;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
386 const gchar *ptr;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
387 gchar path_buffer[512];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
388 gchar *current_path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
389 gint path_change = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
390 gint ret;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
391
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
392 current_path = getcwd(path_buffer, sizeof(path_buffer));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
393
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
394 result = g_string_new("");
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
395 pathl = editor_command_path_parse(fd, PATH_FILE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
396 targetl = editor_command_path_parse(fd, PATH_TARGET);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
397
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
398 ptr = template;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
399 while ( (found = strstr(ptr, "%")) )
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
400 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
401 result = g_string_append_len(result, ptr, found - ptr);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
402 ptr = found + 2;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
403 switch (found[1])
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
404 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
405 case 'p':
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
406 result = g_string_append_c(result, '"');
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
407 result = g_string_append(result, pathl);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
408 result = g_string_append_c(result, '"');
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
409 break;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
410 case 't':
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
411 result = g_string_append_c(result, '"');
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
412 result = g_string_append(result, targetl);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
413 result = g_string_append_c(result, '"');
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
414 break;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
415 case '%':
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
416 result = g_string_append_c(result, '%');
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
417 break;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
418 default:
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
419 break;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
420 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
421 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
422 result = g_string_append(result, ptr);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
423
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
424 if (debug) printf("system command: %s\n", result->str);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
425
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
426 if (current_path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
427 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
428 gchar *base;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
429 base = remove_level_from_path(fd->path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
430 if (chdir(base) == 0) path_change = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
431 g_free(base);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
432 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
433
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
434 if (vd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
435 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
436 result = g_string_append(result, " 2>&1");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
437 ret = editor_verbose_start(vd, result->str);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
438 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
439 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
440 {
135
15c1925b3bfb improved external delete command
nadvornik
parents: 134
diff changeset
441 ret = !system(result->str);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
442 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
443
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
444 if (path_change) chdir(current_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
445
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
446 g_string_free(result, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
447 g_free(pathl);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
448 g_free(targetl);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
449
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
450 return ret;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
451 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
452
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
453 static gint editor_command_next(EditorVerboseData *vd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
454 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
455 const gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
456
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
457 editor_verbose_window_fill(vd, "\n", 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
458
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
459 while (vd->list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
460 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
461 FileData *fd;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
462 gint success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
463
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
464 fd = vd->list->data;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
465 vd->list = g_list_remove(vd->list, fd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
466
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
467 editor_verbose_window_progress(vd, fd->path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
468
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
469 vd->count++;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
470 success = editor_command_one(vd->command_template, fd, vd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
471 if (success)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
472 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
473 gtk_widget_set_sensitive(vd->button_stop, (vd->list != NULL) );
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
474 editor_verbose_window_fill(vd, fd->path, strlen(fd->path));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
475 editor_verbose_window_fill(vd, "\n", 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
476 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
477
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
478 file_data_unref(fd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
479 if (success) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
480 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
481
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
482 if (vd->count == vd->total)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
483 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
484 text = _("done");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
485 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
486 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
487 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
488 text = _("stopped by user");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
489 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
490 vd->count = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
491 editor_verbose_window_progress(vd, text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
492 editor_verbose_window_enable_close(vd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
493 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
494 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
495
135
15c1925b3bfb improved external delete command
nadvornik
parents: 134
diff changeset
496 static gint editor_command_start(const gchar *template, const gchar *text, GList *list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
497 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
498 EditorVerboseData *vd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
499
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
500 vd = editor_verbose_window(template, text);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
501 vd->list = filelist_copy(list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
502 vd->total = g_list_length(list);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
503
135
15c1925b3bfb improved external delete command
nadvornik
parents: 134
diff changeset
504 return editor_command_next(vd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
505 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
506
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
507 static gint editor_line_break(const gchar *template, gchar **front, const gchar **end)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
508 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
509 gchar *found;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
510
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
511 *front = g_strdup(template);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
512 found = strstr(*front, "%f");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
513
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
514 if (found)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
515 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
516 *found = '\0';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
517 *end = found + 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
518 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
519 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
520
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
521 *end = "";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
522 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
523 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
524
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
525 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
526 * The supported macros for editor commands:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
527 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
528 * %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
529 * only one occurence of this macro is supported.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
530 * ([ls %f] results in [ls "file1" "file2" ... "lastfile"])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
531 * %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
532 * multiple occurences of this macro is supported for complex shell commands.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
533 * 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
534 * 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
535 * ([ls %p] results in [ls "file1"], [ls "file2"] ... [ls "lastfile"])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
536 * 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
537 * ([ls] results in [ls "file1" "file2" ... "lastfile"])
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 * 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
540 *
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
541 * %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
542 * showing the output of the command(s).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
543 * %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
544 * 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
545 *
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
546 * %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
547 * from exiting upon invocation.
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
548 *
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
549 *
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
550 * [1] Note: %v,%V may also be preceded by "%w".
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
551 */
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
552 static gint editor_command_run(const gchar *template, const gchar *text, GList *list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
553 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
554 gint verbose = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
555 gint for_each = FALSE;
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
556 gint ret = TRUE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
557
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
558 if (!template || template[0] == '\0') return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
559
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
560 for_each = (strstr(template, "%p") != NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
561
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
562 /* no window state change flag, skip */
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
563 if (strncmp(template, "%w", 2) == 0) template += 2;
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
564
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
565 if (strncmp(template, "%v", 2) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
566 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
567 template += 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
568 verbose = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
569 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
570 else if (strncmp(template, "%V", 2) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
571 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
572 template += 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
573 if (!for_each || list->next) verbose = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
574 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
575
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
576 if (for_each)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
577 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
578 if (verbose)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
579 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
580 editor_command_start(template, text, list);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
581 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
582 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
583 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
584 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
585
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
586 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
587 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
588 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
589 FileData *fd = work->data;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
590 ret = editor_command_one(template, fd, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
591 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
592 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
593 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
594 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
595 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
596 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
597 gchar *front;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
598 const gchar *end;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
599 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
600 GString *result = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
601 gint parser_match;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
602
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
603 parser_match = editor_line_break(template, &front, &end);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
604 result = g_string_new((parser_match) ? "" : " ");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
605
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
606 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
607 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
608 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
609 FileData *fd = work->data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
610 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
611
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
612 if (work != list) g_string_append_c(result, ' ');
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
613 result = g_string_append_c(result, '"');
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
614 pathl = editor_command_path_parse(fd, PATH_FILE);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
615 result = g_string_append(result, pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
616 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
617 result = g_string_append_c(result, '"');
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
618 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
619 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
620
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
621 result = g_string_prepend(result, front);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
622 result = g_string_append(result, end);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
623 if (verbose) result = g_string_append(result, " 2>&1 ");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
624 result = g_string_append(result, "&");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
625
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
626 if (debug) printf("system command: %s\n", result->str);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
627
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
628 if (verbose)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
629 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
630 EditorVerboseData *vd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
631
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
632 vd = editor_verbose_window(template, text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
633 editor_verbose_window_progress(vd, _("running..."));
135
15c1925b3bfb improved external delete command
nadvornik
parents: 134
diff changeset
634 ret = editor_verbose_start(vd, result->str);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
635 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
636 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
637 {
135
15c1925b3bfb improved external delete command
nadvornik
parents: 134
diff changeset
638 ret = !system(result->str);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
639 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
640
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
641 g_free(front);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
642 g_string_free(result, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
643 }
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
644 return ret;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
645 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
646
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
647 gint start_editor_from_filelist(gint n, GList *list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
648 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
649 gchar *command;
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
650 gint ret;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
651
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
652 if (n < 0 || n >= GQVIEW_EDITOR_SLOTS || !list ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
653 !editor_command[n] ||
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
654 strlen(editor_command[n]) == 0) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
655
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
656 command = g_locale_from_utf8(editor_command[n], -1, NULL, NULL, NULL);
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
657 ret = editor_command_run(command, editor_name[n], list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
658 g_free(command);
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
659 return ret;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
660 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
661
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
662 gint start_editor_from_file(gint n, FileData *fd)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
663 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
664 GList *list;
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
665 gint ret;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
666
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
667 if (!fd) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
668
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
669 list = g_list_append(NULL, fd);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
670 ret = start_editor_from_filelist(n, list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
671 g_list_free(list);
134
9009856628f7 started implementation of external commands; external Delete should work
nadvornik
parents: 123
diff changeset
672 return ret;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
673 }
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
674
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
675 gint start_editor_from_pair(gint n, const gchar *source, const gchar *target)
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
676 {
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
677 GList *list;
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
678 gint ret;
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
679
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
680 if (!source) return FALSE;
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
681 if (!target) return FALSE;
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
682
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
683 list = g_list_append(NULL, (gchar *)source);
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
684 list = g_list_append(list, (gchar *)target);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 136
diff changeset
685 ret = start_editor_from_filelist(n, list);
136
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
686 g_list_free(list);
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
687 return ret;
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
688 }
18c2a29e681c more external commands
nadvornik
parents: 135
diff changeset
689
60
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
690 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
691 {
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
692 if (n < 0 || n >= GQVIEW_EDITOR_SLOTS ||
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
693 !editor_command[n] ||
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
694 strlen(editor_command[n]) == 0) return TRUE;
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
695
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
696 return (strncmp(editor_command[n], "%w", 2) == 0);
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
697 }
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
698
9c0c402b0ef3 Mon Jun 13 17:31:46 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
699