1 /*
2 **
3 ** options_setup.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 ** Changes submitted by Maurizio Loreti distributed on the public
32 ** domain:
33 **
34 ** - Code for handle bzip2 compressed files.
35 */
36 #include "ac_config.h"
37
38 /*
39 #define MESSAGES
40 */
41 #include "message.h"
42
43 #include "config.h"
44
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <ctype.h>
48
49 #include "paths.h"
50 #include INC_X11(Intrinsic.h)
51 #include INC_X11(StringDefs.h)
52 #include INC_X11(Shell.h)
53 #include INC_XAW(SmeBSB.h)
54 #include "Aaa.h"
55 #include "Button.h"
56 #include "FileSel.h"
57 #include "Ghostview.h"
58 #include "Frame.h"
59 #include "MButton.h"
60 #include "Switch.h"
61
62 #include "types.h"
63 #include "callbacks.h"
64 #include "widgets_misc.h"
65 #include "magmenu.h"
66 #include "main_resources.h"
67 #include "main_globals.h"
68 #include "media.h"
69 #include "misc.h"
70 #include "miscmenu.h"
71 #include "note.h"
72 #include "options.h"
73 #include "options_gv.h"
74 #include "options_setup.h"
75 #include "scale.h"
76 #include "ps.h"
77 #include "doc_misc.h"
78 #include "version.h"
79
80 static Widget popup=NULL,optionControl;
81 static Widget eyeGuideToggle,reverseScrollingToggle,confirmPrintToggle,autoCenterToggle;
82 static Widget pixmapToggle,miscLabel;
83 static Widget confirmLabel,confirmButton,confirmMenu;
84 static Widget titleLabel,titleButton,titleMenu;
85 static Widget print_command,scales,screenSize,medias,magmenu,miscmenu;
86
87 String confirm_quit_styles[4] = { 0 };
88 String title_styles[4] = { 0 };
89
90 static void options_setup_setOptionsAtEntry(void);
91 static void options_setup_create(void);
92 extern void main_setResolutions(int);
93 extern void main_createScaleMenu(void);
94
95 /*------------------------------------------------------
96 OptionPopupStruct
97 ------------------------------------------------------*/
98
99 OptionPopupStruct gv_options_setup_struct = {
100 NULL,
101 options_setup_create,
102 options_setup_setOptionsAtEntry,
103 False
104 };
105
106 OptionPopup gv_options_setup = (OptionPopup) &gv_options_setup_struct;
107
108 /*------------------------------------------------------
109 options_setup_setOptionsAtEntry
110 ------------------------------------------------------*/
111
options_setup_setOptionsAtEntry(void)112 static void options_setup_setOptionsAtEntry(void)
113 {
114 String s;
115 Arg args[2];
116 Cardinal n;
117 char tmp[50];
118
119 BEGINMESSAGE(options_setup_setOptionsAtEntry)
120
121 widgets_setToggle(confirmPrintToggle, (app_res.confirm_print ? 1 : 0));
122 widgets_setToggle(reverseScrollingToggle, (app_res.reverse_scrolling ? 1 : 0));
123 widgets_setToggle(eyeGuideToggle, (app_res.scrolling_eye_guide ? 1 : 0));
124 widgets_setToggle(pixmapToggle, (app_res.use_bpixmap ? 1 : 0));
125 widgets_setToggle(autoCenterToggle, (app_res.auto_center ? 1 : 0));
126
127 SMESSAGE(gv_print_command)
128 widgets_setText(print_command, gv_print_command);
129 SMESSAGE(gv_scales_res)
130 s = options_squeezeMultiline(gv_scales_res);
131 widgets_setText(scales,s);
132 XtFree(s);
133 SMESSAGE(gv_medias_res)
134 s = options_squeezeMultiline(gv_medias_res);
135 widgets_setText(medias,s);
136 XtFree(s);
137 SMESSAGE(gv_magmenu_entries_res)
138 s = options_squeezeMultiline(gv_magmenu_entries_res);
139 widgets_setText(magmenu,s);
140 XtFree(s);
141 SMESSAGE(gv_miscmenu_entries_res)
142 s = options_squeezeMultiline(gv_miscmenu_entries_res);
143 widgets_setText(miscmenu,s);
144 XtFree(s);
145 sprintf(tmp,"%d x %d",gv_screen_width,gv_screen_height);
146 widgets_setText(screenSize,tmp);
147
148 s=confirm_quit_styles[app_res.confirm_quit];
149 n=0;
150 XtSetArg(args[n], XtNlabel, s); n++;
151 XtSetValues(confirmButton, args, n);
152
153 s=title_styles[app_res.title_style];
154 n=0;
155 XtSetArg(args[n], XtNlabel, s); n++;
156 XtSetValues(titleButton, args, n);
157
158 ENDMESSAGE(options_setup_setOptionsAtEntry)
159 }
160
161 /*------------------------------------------------------
162 options_setup_cb_apply
163 ------------------------------------------------------*/
164
options_setup_cb_apply(Widget w _GL_UNUSED,XtPointer client_data _GL_UNUSED,XtPointer call_data _GL_UNUSED)165 static void options_setup_cb_apply(Widget w _GL_UNUSED, XtPointer client_data _GL_UNUSED, XtPointer call_data _GL_UNUSED)
166 {
167 Arg args[5];
168 Cardinal n;
169 Boolean b;
170 int i,j;
171 Boolean redisplay=False;
172 Boolean reopen=False;
173 char *l;
174
175 BEGINMESSAGE(options_setup_cb_apply)
176
177 app_res.confirm_print = SwitchIsSet(confirmPrintToggle) ? True : False ;
178 app_res.reverse_scrolling = SwitchIsSet(reverseScrollingToggle) ? True : False ;
179 app_res.scrolling_eye_guide = SwitchIsSet(eyeGuideToggle) ? True : False ;
180 app_res.auto_center = SwitchIsSet(autoCenterToggle) ? True : False ;
181
182 b = app_res.use_bpixmap;
183 app_res.use_bpixmap = SwitchIsSet(pixmapToggle) ? True : False;
184 cb_useBackingPixmap(NULL,(XtPointer)2,NULL);
185 if (b != app_res.use_bpixmap) reopen=True;
186
187 n=0;
188 XtSetArg(args[n], XtNlabel, &l); n++;
189 XtGetValues(titleButton, args, n);
190 i=0;j=0;
191 while (i<3) {
192 if (!strcmp(title_styles[i],l)) j = i;
193 ++i;
194 }
195 if (j != app_res.title_style) {
196 app_res.title_style = j;
197 cb_showTitle(NULL,NULL,NULL);
198 }
199
200 options_textApply(print_command,NULL,&gv_print_command);
201 options_textApply(magmenu,NULL,&gv_magmenu_entries_res);
202 magmenu_freeMagMenuEntries(gv_magmenu_entries);
203 gv_magmenu_entries = magmenu_parseMagMenuEntries(gv_magmenu_entries_res);
204 options_textApply(miscmenu,NULL,&gv_miscmenu_entries_res);
205 miscmenu_freeMiscMenuEntries(gv_miscmenu_entries);
206 gv_miscmenu_entries = miscmenu_parseMiscMenuEntries(gv_miscmenu_entries_res);
207 l = widgets_getText(screenSize);
208 i=j=0;
209 sscanf(l," %d x %d ",&i,&j);
210 if (i>0 && j>0 && (i != gv_screen_width || j != gv_screen_height)) {
211 gv_screen_width = i;
212 gv_screen_height = j;
213 main_setResolutions(0);
214 default_xdpi=default_ydpi=0.0;
215 redisplay=True;
216 }
217 n=0;
218 XtSetArg(args[n], XtNlabel, &l); n++;
219 XtGetValues(confirmButton, args, n);
220 i=0;
221 while (i<3) {
222 if (!strcmp(confirm_quit_styles[i],l)) app_res.confirm_quit = i;
223 ++i;
224 }
225
226 {
227 char *s,*sr;
228 l = widgets_getText(scales);
229 sr = options_squeezeMultiline(gv_scales_res);
230 s = options_squeezeMultiline(l);
231 if (strcmp(s,sr)) {
232 XtFree(sr);
233 XtFree(gv_scales_res);
234 gv_scales_res=s;
235 scale_freeScales(gv_scales);
236 gv_scales = scale_parseScales(gv_scales_res);
237 XtDestroyWidget(scaleMenu);
238 XtFree((XtPointer)scaleEntry);
239 main_createScaleMenu();
240 gv_scale = scale_checkScaleNum(gv_scales,app_res.scale|SCALE_REL);
241 if (gv_scale < 0) gv_scale = scale_checkScaleNum(gv_scales,0|SCALE_REL);
242 gv_scale &= SCALE_VAL;
243 gv_scale_base = scale_checkScaleNum(gv_scales,(app_res.scale_base-1)|SCALE_BAS);
244 if (gv_scale_base < 0) gv_scale_base = 0;
245 gv_scale_base &= SCALE_VAL;
246 gv_scale_base_current = gv_scale_base;
247 gv_scale_current = gv_scale;
248 options_gv_createScaleMenus();
249 gv_scale_current = gv_scale_base_current = -1;
250 redisplay=True;
251 } else {
252 XtFree(s);
253 XtFree(sr);
254 }
255 }
256
257 {
258 char *s,*sr;
259 l = widgets_getText(medias);
260 sr = options_squeezeMultiline(gv_medias_res);
261 s = options_squeezeMultiline(l);
262 if (strcmp(s,sr)) {
263 XtFree(sr);
264 XtFree(gv_medias_res);
265 gv_medias_res=s;
266 media_freeMedias(gv_medias);
267 gv_medias = media_parseMedias(gv_medias_res);
268 gv_num_std_pagemedia = media_numMedias(gv_medias);
269 if (pagemediaMenu) {
270 XtDestroyWidget(pagemediaMenu);
271 pagemediaMenu=NULL;
272 }
273 gv_fallback_pagemedia = doc_convStringToPageMedia(NULL,app_res.fallback_pagemedia);
274 if (gv_fallback_pagemedia == MEDIA_ID_INVALID) gv_fallback_pagemedia = doc_convStringToPageMedia(NULL,"A4");
275 if (gv_fallback_pagemedia == MEDIA_ID_INVALID) {
276 gv_fallback_pagemedia=1;
277 while (!gv_medias[gv_fallback_pagemedia]->used) gv_fallback_pagemedia++;
278 }
279 gv_pagemedia = gv_pagemedia_old = MEDIA_ID_INVALID;
280 gv_pagemedia_auto_old = -1;
281 misc_buildPagemediaMenu();
282 options_gv_createMediaMenus();
283 redisplay=True;
284 } else {
285 XtFree(s);
286 XtFree(sr);
287 }
288 }
289
290 n=0;
291 XtSetArg(args[n], XtNreverseScrolling,app_res.reverse_scrolling);n++;
292 XtSetValues(FileSel, args, n);
293
294 if (reopen && gv_filename) {
295 cb_stopInterpreter(page,NULL,NULL);
296 show_page(REQUEST_REOPEN,NULL);
297 } else if (redisplay) show_page(REQUEST_OPTION_CHANGE,NULL);
298
299 ENDMESSAGE(options_setup_cb_apply)
300 }
301
302 /*------------------------------------------------------
303 options_setup_cb_save
304 ------------------------------------------------------*/
305
306 static
options_setup_cb_save(Widget w _GL_UNUSED,XtPointer client_data _GL_UNUSED,XtPointer call_data _GL_UNUSED)307 void options_setup_cb_save(Widget w _GL_UNUSED, XtPointer client_data _GL_UNUSED, XtPointer call_data _GL_UNUSED)
308 {
309 int argn = 0;
310 String argi[30];
311 String argv[30];
312 char tmp[20];
313 Arg args[1];
314 Cardinal n;
315 int i;
316 String l,t = "True",f = "False";
317
318 BEGINMESSAGE(options_setup_cb_save)
319
320 options_setArg(&(argi[argn]),&(argv[argn]),s_version ,gv_class ,versionResource);
321 ++argn;
322 options_setArg(&(argi[argn]),&(argv[argn]),s_miscMenuEntries ,gv_class ,widgets_getText(miscmenu));
323 ++argn;
324 options_setArg(&(argi[argn]),&(argv[argn]),s_magMenu ,gv_class ,widgets_getText(magmenu));
325 ++argn;
326 options_setArg(&(argi[argn]),&(argv[argn]),s_medias ,gv_class ,widgets_getText(medias));
327 ++argn;
328 options_setArg(&(argi[argn]),&(argv[argn]),s_scales ,gv_class ,widgets_getText(scales));
329 ++argn;
330 options_setArg(&(argi[argn]),&(argv[argn]),s_printCommand ,gv_class,widgets_getText(print_command));
331 ++argn;
332 options_setArg(&(argi[argn]),&(argv[argn]),s_confirmPrint ,gv_class ,SwitchIsSet(confirmPrintToggle) ? t : f);
333 ++argn;
334 options_setArg(&(argi[argn]),&(argv[argn]),s_reverseScrolling ,gv_class ,SwitchIsSet(reverseScrollingToggle) ? t : f);
335 ++argn;
336 options_setArg(&(argi[argn]),&(argv[argn]),s_scrollingEyeGuide ,gv_class ,SwitchIsSet(eyeGuideToggle) ? t : f);
337 ++argn;
338 options_setArg(&(argi[argn]),&(argv[argn]),s_autoCenter ,gv_class ,SwitchIsSet(autoCenterToggle) ? t : f);
339 ++argn;
340 options_setArg(&(argi[argn]),&(argv[argn]),s_useBackingPixmap ,gv_class ,SwitchIsSet(pixmapToggle) ? t : f);
341 ++argn;
342 n=0;
343 XtSetArg(args[n], XtNlabel, &l); n++;
344 XtGetValues(titleButton, args, n);
345 i=0; while (i<3) {
346 if (!strcmp(title_styles[i],l)) sprintf(tmp,"%d",i);
347 ++i;
348 }
349 options_setArg(&(argi[argn]),&(argv[argn]),s_titleStyle ,gv_class ,tmp);
350 ++argn;
351 n=0;
352 XtSetArg(args[n], XtNlabel, &l); n++;
353 XtGetValues(confirmButton, args, n);
354 i=0; while (i<3) {
355 if (!strcmp(confirm_quit_styles[i],l)) sprintf(tmp,"%d",i);
356 ++i;
357 }
358 options_setArg(&(argi[argn]),&(argv[argn]),s_confirmQuit ,gv_class ,tmp);
359 ++argn;
360 {
361 char name[255];
362 char val[255];
363 scale_getScreenResourceName(gv_display,val);
364 sprintf(name,"%s",val);
365 options_setArg(&(argi[argn]),&(argv[argn]),name ,gv_class ,widgets_getText(screenSize));
366 ++argn;
367 }
368
369 options_save(argn,argi,argv);
370 while (--argn >=0) {
371 XtFree(argi[argn]);
372 XtFree(argv[argn]);
373 }
374
375 ENDMESSAGE(options_setup_cb_save)
376 }
377
378 /*------------------------------------------------------
379 options_setup_create
380 ------------------------------------------------------*/
381
options_setup_create(void)382 void options_setup_create(void)
383 {
384 Arg args[10];
385 Cardinal n;
386 Widget w;
387 int i;
388
389 BEGINMESSAGE(options_setup_create)
390
391 if (popup) {
392 INFMESSAGE(popup exists)
393 ENDMESSAGE(options_setup_create)
394 return;
395 }
396
397 n=0;
398 XtSetArg(args[n], XtNallowShellResize, True); n++;
399 popup = XtCreatePopupShell("optionsetupPopup",transientShellWidgetClass,toplevel, args, n);
400 gv_options_setup->popup=popup;
401 n=0;
402 optionControl = XtCreateManagedWidget("optionControl",aaaWidgetClass,popup,args,n);
403
404 miscLabel = XtCreateManagedWidget("misc",labelWidgetClass,optionControl,NULL,(Cardinal)0);
405 confirmPrintToggle = XtCreateManagedWidget("confirmPrint",switchWidgetClass,optionControl,NULL,(Cardinal)0);
406 reverseScrollingToggle = XtCreateManagedWidget("scrolling",switchWidgetClass,optionControl,NULL,(Cardinal)0);
407 eyeGuideToggle = XtCreateManagedWidget("eyeGuide",switchWidgetClass,optionControl,NULL,(Cardinal)0);
408 autoCenterToggle = XtCreateManagedWidget("autoCenter",switchWidgetClass,optionControl,NULL,(Cardinal)0);
409 pixmapToggle = XtCreateManagedWidget("pixmap",switchWidgetClass,optionControl,NULL,(Cardinal)0);
410
411 options_createLabeledMenu("title",optionControl,&titleLabel,&titleButton,&titleMenu);
412 for (i = 0; title_styles[i]; i++) {
413 w = XtCreateManagedWidget(title_styles[i],smeBSBObjectClass, titleMenu,NULL,(Cardinal)0);
414 XtAddCallback(w, XtNcallback,options_cb_changeMenuLabel,NULL);
415 }
416 options_createLabeledMenu("confirm",optionControl,&confirmLabel,&confirmButton,&confirmMenu);
417 for (i = 0; confirm_quit_styles[i]; i++) {
418 w = XtCreateManagedWidget(confirm_quit_styles[i],smeBSBObjectClass, confirmMenu,NULL,(Cardinal)0);
419 XtAddCallback(w, XtNcallback,options_cb_changeMenuLabel,NULL);
420 }
421
422 n=0;
423 w = XtCreateManagedWidget("apply", buttonWidgetClass,optionControl, args, n);
424 XtAddCallback(w, XtNcallback, options_setup_cb_apply,NULL);
425 XtInstallAccelerators(optionControl, w);
426 w = XtCreateManagedWidget("save", buttonWidgetClass,optionControl, args, n);
427 XtAddCallback(w, XtNcallback, options_setup_cb_save,NULL);
428 XtInstallAccelerators(optionControl, w);
429 w = XtCreateManagedWidget("dismiss", buttonWidgetClass,optionControl, args, n);
430 XtAddCallback(w, XtNcallback, options_cb_popdown,(XtPointer)gv_options_setup);
431 XtInstallAccelerators(optionControl, w);
432
433 miscmenu = widgets_createLabeledTextField("miscmenu", optionControl);
434 magmenu = widgets_createLabeledTextField("magmenu", optionControl);
435 medias = widgets_createLabeledTextField("medias", optionControl);
436 print_command = widgets_createLabeledLineTextField("printCommand", optionControl);
437 scales = widgets_createLabeledTextField("scales", optionControl);
438 screenSize = widgets_createLabeledLineTextField("screenSize", optionControl);
439
440 options_setup_setOptionsAtEntry();
441 options_realize(popup,optionControl);
442
443 ENDMESSAGE(options_setup_create)
444 }
445
446
447