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