1 /*
2 **
3 ** options_gs.c
4 **
5 ** Copyright (C) 1995, 1996, 1997 Johannes Plass
6 ** Copyright (C) 2004 Jose E. Marchesi
7 **
8 ** This program is free software; you can redistribute it and/or modify
9 ** it under the terms of the GNU General Public License as published by
10 ** the Free Software Foundation; either version 3 of the License, or
11 ** (at your option) any later version.
12 **
13 ** This program is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ** GNU General Public License for more details.
17 **
18 ** You should have received a copy of the GNU General Public License
19 ** along with GNU gv; see the file COPYING. If not, write to
20 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 ** Boston, MA 02111-1307, USA.
22 **
23 ** Author: Johannes Plass (plass@thep.physik.uni-mainz.de)
24 ** Department of Physics
25 ** Johannes Gutenberg-University
26 ** Mainz, Germany
27 **
28 ** Jose E. Marchesi (jemarch@gnu.org)
29 ** GNU Project
30 **
31 */
32 #include "ac_config.h"
33
34 /*
35 #define MESSAGES
36 */
37 #include "message.h"
38
39 #include "config.h"
40
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include <ctype.h>
44
45 #include "paths.h"
46 #include INC_X11(Intrinsic.h)
47 #include INC_X11(StringDefs.h)
48 #include INC_X11(Shell.h)
49 #include INC_XAW(SimpleMenu.h)
50 #include INC_XAW(SmeBSB.h)
51 #include INC_XAW(AsciiText.h)
52 #include "Aaa.h"
53 #include "Button.h"
54 #include "FileSel.h"
55 #include "Ghostview.h"
56 #include "Frame.h"
57 #include "MButton.h"
58 #include "Switch.h"
59
60 #include "types.h"
61 #include "callbacks.h"
62 #include "file.h"
63 #include "widgets_misc.h"
64 #include "main_resources.h"
65 #include "main_globals.h"
66 #include "misc.h"
67 #include "note.h"
68 #include "options.h"
69 #include "options_gv.h"
70 #include "resource.h"
71 #include "ps.h"
72 #include "doc_misc.h"
73 #include "version.h"
74
75 static Widget popup=NULL,optionControl;
76 static Widget quietToggle,saferToggle,safeDirToggle;
77 static Widget scan,conv,gs,x11dev,x11alphadev,arguments;
78
79 static void options_gs_setOptionsAtEntry(void);
80 static void options_gs_create(void);
81 extern void main_setGhostscriptResources(XrmDatabase);
82 extern String intern_resources[]; /* defined in resource.c */
83
84 /*------------------------------------------------------
85 OptionPopupStruct
86 ------------------------------------------------------*/
87
88 OptionPopupStruct gv_options_gs_struct = {
89 NULL,
90 options_gs_create,
91 options_gs_setOptionsAtEntry,
92 False
93 };
94
95 OptionPopup gv_options_gs = (OptionPopup) &gv_options_gs_struct;
96
97 /*------------------------------------------------------
98 options_gs_setOptionsAtEntry
99 ------------------------------------------------------*/
100
options_gs_setOptionsAtEntry(void)101 static void options_gs_setOptionsAtEntry(void)
102 {
103 BEGINMESSAGE(options_gs_setOptionsAtEntry)
104
105 widgets_setToggle(safeDirToggle, gv_gs_safeDir);
106 widgets_setToggle(saferToggle, gv_gs_safer);
107 widgets_setToggle(quietToggle, gv_gs_quiet);
108
109 SMESSAGE(gv_gs_interpreter)
110 widgets_setText(gs, gv_gs_interpreter);
111 SMESSAGE(gv_gs_cmd_scan_pdf)
112 widgets_setText(scan, gv_gs_cmd_scan_pdf);
113 SMESSAGE(gv_gs_cmd_conv_pdf)
114 widgets_setText(conv, gv_gs_cmd_conv_pdf);
115 SMESSAGE(gv_gs_x11_device)
116 widgets_setText(x11dev, gv_gs_x11_device);
117 SMESSAGE(gv_gs_x11_alpha_device)
118 widgets_setText(x11alphadev, gv_gs_x11_alpha_device);
119 SMESSAGE(gv_gs_arguments)
120 widgets_setText(arguments, gv_gs_arguments);
121
122 ENDMESSAGE(options_gs_setOptionsAtEntry)
123 }
124
125 /*------------------------------------------------------
126 options_gs_apply
127 ------------------------------------------------------*/
128
options_gs_change(Widget w,String * sP,String * fP)129 static Boolean options_gs_change (Widget w, String *sP, String *fP)
130 {
131 String v;
132 Boolean r=False;
133 BEGINMESSAGE(options_gs_change)
134 v = widgets_getText(w);
135 v = options_squeeze(v);
136 if (strcmp(v,*sP)) {
137 *fP = *sP;
138 *sP = v;
139 r = True;
140 } else XtFree(v);
141 ENDMESSAGE(options_gs_change)
142 return(r);
143 }
144
options_gs_cb_apply(Widget w _GL_UNUSED,XtPointer client_data _GL_UNUSED,XtPointer call_data _GL_UNUSED)145 static void options_gs_cb_apply(Widget w _GL_UNUSED, XtPointer client_data _GL_UNUSED, XtPointer call_data _GL_UNUSED)
146 {
147 Arg args[10];
148 Cardinal n;
149 int i;
150 Boolean reopen=False;
151 String f[6] = {NULL,NULL,NULL,NULL,NULL,NULL};
152
153 BEGINMESSAGE(options_gs_cb_apply)
154
155 i = gv_gs_quiet;
156 gv_gs_quiet = SwitchIsSet(quietToggle) ? 1 : 0;
157 if (i != gv_gs_quiet) reopen=True;
158
159 i = gv_gs_safer;
160 gv_gs_safer = SwitchIsSet(saferToggle) ? 1 : 0;
161 if (i != gv_gs_safer) reopen=True;
162
163 i = gv_gs_safeDir;
164 gv_gs_safeDir = SwitchIsSet(safeDirToggle) ? 1 : 0;
165 if (i != gv_gs_safeDir) reopen=True;
166
167 reopen |= options_gs_change(gs,&gv_gs_interpreter,&(f[0]));
168 reopen |= options_gs_change(scan,&gv_gs_cmd_scan_pdf,&(f[1]));
169 options_gs_change(conv,&gv_gs_cmd_conv_pdf,&(f[2]));
170 reopen |= options_gs_change(x11dev,&gv_gs_x11_device,&(f[3]));
171 reopen |= options_gs_change(x11alphadev,&gv_gs_x11_alpha_device,&(f[4]));
172 reopen |= options_gs_change(arguments,&gv_gs_arguments,&(f[5]));
173
174 if (reopen) {
175 cb_stopInterpreter(page,NULL,NULL);
176 n=0;
177 XtSetArg(args[n], XtNinterpreter,gv_gs_interpreter); n++;
178 if (gv_gs_safeDir) XtSetArg(args[n], XtNsafeDir,True);
179 else XtSetArg(args[n], XtNsafeDir,False);
180 n++;
181 if (gv_gs_safer) XtSetArg(args[n], XtNsafer,True);
182 else XtSetArg(args[n], XtNsafer,False);
183 n++;
184 if (gv_gs_quiet) XtSetArg(args[n], XtNquiet,True);
185 else XtSetArg(args[n], XtNquiet,False);
186 n++;
187 XtSetArg(args[n], XtNarguments,gv_gs_arguments); n++;
188 XtSetValues(page, args, n);
189 if (gv_filename) show_page(REQUEST_REOPEN,NULL);
190 }
191 for (i=0; i<6 ; i++) XtFree(f[i]);
192
193 ENDMESSAGE(options_gs_cb_apply)
194 }
195
196 /*------------------------------------------------------
197 options_gs_cb_save
198 ------------------------------------------------------*/
199
options_gs_setArg(Widget w,String * argiP,String * argvP,int * argnP,String format,String name)200 static void options_gs_setArg(Widget w, String *argiP, String *argvP, int *argnP, String format, String name)
201 {
202 String s;
203 s = widgets_getText(w);
204 s = options_squeeze(s);
205 options_setArg(argiP,argvP,format,name,s);
206 ++(*argnP);
207 XtFree(s);
208 }
209
210 static
options_gs_cb_save(Widget w _GL_UNUSED,XtPointer client_data _GL_UNUSED,XtPointer call_data _GL_UNUSED)211 void options_gs_cb_save(Widget w _GL_UNUSED, XtPointer client_data _GL_UNUSED, XtPointer call_data _GL_UNUSED)
212 {
213 int argn = 0;
214 String argi[20];
215 String argv[20];
216 String t = "True";
217 String f = "False";
218
219 BEGINMESSAGE(options_gv_cb_save)
220
221 options_setArg(&(argi[argn]),&(argv[argn]),s_version ,gv_class ,versionResource);
222 ++argn;
223 options_gs_setArg(gs ,&(argi[argn]),&(argv[argn]),&argn,s_gsInterpreter ,gv_class);
224 options_gs_setArg(scan ,&(argi[argn]),&(argv[argn]),&argn,s_gsCmdScanPDF ,gv_class);
225 options_gs_setArg(conv ,&(argi[argn]),&(argv[argn]),&argn,s_gsCmdConvPDF ,gv_class);
226 options_gs_setArg(x11dev ,&(argi[argn]),&(argv[argn]),&argn,s_gsX11Device ,gv_class);
227 options_gs_setArg(x11alphadev,&(argi[argn]),&(argv[argn]),&argn,s_gsX11AlphaDevice ,gv_class);
228 options_gs_setArg(arguments ,&(argi[argn]),&(argv[argn]),&argn,s_gsArguments ,gv_class);
229
230 options_setArg(&(argi[argn]),&(argv[argn]),s_gsSafeDir ,gv_class ,SwitchIsSet(safeDirToggle) ? t : f);
231 ++argn;
232 options_setArg(&(argi[argn]),&(argv[argn]),s_gsSafer ,gv_class ,SwitchIsSet(saferToggle) ? t : f);
233 ++argn;
234 options_setArg(&(argi[argn]),&(argv[argn]),s_gsQuiet ,gv_class ,SwitchIsSet(quietToggle) ? t : f);
235 ++argn;
236
237 options_save(argn,argi,argv);
238 while (--argn >=0) {
239 XtFree(argi[argn]);
240 XtFree(argv[argn]);
241 }
242
243 ENDMESSAGE(options_gv_cb_save)
244 }
245
246 /*------------------------------------------------------
247 options_gs_cb_defaults
248 ------------------------------------------------------*/
249
options_gs_cb_defaults(Widget w _GL_UNUSED,XtPointer client_data _GL_UNUSED,XtPointer call_data _GL_UNUSED)250 static void options_gs_cb_defaults(Widget w _GL_UNUSED, XtPointer client_data _GL_UNUSED, XtPointer call_data _GL_UNUSED)
251 {
252 XrmDatabase db = NULL;
253 String *sP = intern_resources;
254
255 BEGINMESSAGE(options_gs_cb_defaults)
256 while (*sP) XrmPutLineResource(&db,*sP++);
257 main_setGhostscriptResources(db);
258 XrmDestroyDatabase(db);
259 options_gs_setOptionsAtEntry();
260 ENDMESSAGE(options_gs_cb_defaults)
261 }
262
263 /*------------------------------------------------------
264 options_gs_create
265 ------------------------------------------------------*/
266
options_gs_create(void)267 void options_gs_create(void)
268 {
269 Arg args[5];
270 Cardinal n;
271 Widget w;
272
273 BEGINMESSAGE(options_gs_create)
274
275 if (popup) {
276 INFMESSAGE(popup exists)
277 ENDMESSAGE(options_gs_create)
278 return;
279 }
280
281 n=0;
282 XtSetArg(args[n], XtNallowShellResize, True); n++;
283 popup = XtCreatePopupShell("optiongsPopup",transientShellWidgetClass,toplevel, args, n);
284 gv_options_gs->popup = popup;
285 n=0;
286 optionControl = XtCreateManagedWidget("optionControl",aaaWidgetClass,popup,args,n);
287
288 safeDirToggle = XtCreateManagedWidget("safeDir",switchWidgetClass,optionControl,NULL,(Cardinal)0);
289 saferToggle = XtCreateManagedWidget("safer",switchWidgetClass,optionControl,NULL,(Cardinal)0);
290 quietToggle = XtCreateManagedWidget("quiet",switchWidgetClass,optionControl,NULL,(Cardinal)0);
291
292 gs = widgets_createLabeledLineTextField("gs", optionControl);
293 x11dev = widgets_createLabeledLineTextField("x11dev", optionControl);
294 x11alphadev = widgets_createLabeledLineTextField("x11alphadev", optionControl);
295 arguments = widgets_createLabeledLineTextField("arguments", optionControl);
296 scan = widgets_createLabeledTextField("scan", optionControl);
297 conv = widgets_createLabeledTextField("conv", optionControl);
298
299 n=0;
300 XtSetArg(args[n], XtNwrap, XawtextWrapWord); ++n;
301 XtSetArg(args[n], XtNresize, XawtextResizeHeight); ++n;
302 XtSetArg(args[n], XtNscrollVertical, XawtextScrollNever); ++n;
303 XtSetValues(scan, args, n);
304 XtSetValues(conv, args, n);
305
306 n=0;
307 w = XtCreateManagedWidget("apply", buttonWidgetClass,optionControl, args, n);
308 XtAddCallback(w, XtNcallback, options_gs_cb_apply,NULL);
309 XtInstallAccelerators(optionControl, w);
310 w = XtCreateManagedWidget("save", buttonWidgetClass,optionControl, args, n);
311 XtAddCallback(w, XtNcallback, options_gs_cb_save,NULL);
312 XtInstallAccelerators(optionControl, w);
313 w = XtCreateManagedWidget("dismiss", buttonWidgetClass,optionControl, args, n);
314 XtAddCallback(w, XtNcallback, options_cb_popdown, (XtPointer)gv_options_gs);
315 XtInstallAccelerators(optionControl, w);
316 w = XtCreateManagedWidget("defaults", buttonWidgetClass,optionControl, args, n);
317 XtAddCallback(w, XtNcallback, options_gs_cb_defaults, NULL);
318 XtInstallAccelerators(optionControl, w);
319
320 options_gs_setOptionsAtEntry();
321 options_realize(popup,optionControl);
322
323 ENDMESSAGE(options_gv_cb_create)
324 }
325