Updating to version 0.20.2
[wmaker-crm.git] / WPrefs.app / WPrefs.c
blob574c133b62908b0d3101b01adfc046d4fef1b47f
1 /* WPrefs.c- main window and other basic stuff
2 *
3 * WPrefs - Window Maker Preferences Program
4 *
5 * Copyright (c) 1998 Alfredo K. Kojima
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 * USA.
24 #include "WPrefs.h"
25 #include <assert.h>
28 extern Panel *InitWindowHandling(WMScreen *scr, WMWindow *win);
30 extern Panel *InitKeyboardSettings(WMScreen *scr, WMWindow *win);
32 extern Panel *InitMouseSettings(WMScreen *scr, WMWindow *win);
34 extern Panel *InitKeyboardShortcuts(WMScreen *scr, WMWindow *win);
36 extern Panel *InitWorkspace(WMScreen *scr, WMWindow *win);
38 extern Panel *InitFocus(WMScreen *scr, WMWindow *win);
40 extern Panel *InitPreferences(WMScreen *scr, WMWindow *win);
42 extern Panel *InitTextureAndColor(WMScreen *scr, WMWindow *win);
44 extern Panel *InitText(WMScreen *scr, WMWindow *win);
46 extern Panel *InitConfigurations(WMScreen *scr, WMWindow *win);
48 extern Panel *InitPaths(WMScreen *scr, WMWindow *win);
50 extern Panel *InitMenu(WMScreen *scr, WMWindow *win);
52 extern Panel *InitExpert(WMScreen *scr, WMWindow *win);
54 extern Panel *InitMenuPreferences(WMScreen *scr, WMWindow *win);
56 extern Panel *InitIcons(WMScreen *scr, WMWindow *win);
59 #define MAX_SECTIONS 16
62 typedef struct _WPrefs {
63 WMWindow *win;
65 WMScrollView *scrollV;
66 WMFrame *buttonF;
67 WMButton *sectionB[MAX_SECTIONS];
69 int sectionCount;
71 WMButton *saveBtn;
72 WMButton *closeBtn;
73 WMButton *undoBtn;
74 WMButton *undosBtn;
76 WMFrame *banner;
77 WMLabel *nameL;
78 WMLabel *versionL;
79 WMLabel *creditsL;
80 WMLabel *statusL;
82 Panel *currentPanel;
83 } _WPrefs;
86 static _WPrefs WPrefs;
88 /* system wide defaults dictionary. Read-only */
89 static proplist_t GlobalDB = NULL;
90 /* user defaults dictionary */
91 static proplist_t WindowMakerDB = NULL;
94 static Bool TIFFOK = False;
97 #define INITIALIZED_PANEL (1<<0)
102 static void loadConfigurations(WMScreen *scr, WMWindow *mainw);
104 static void savePanelData(Panel *panel);
107 void
108 quit(WMWidget *w, void *data)
110 exit(0);
114 static void
115 save(WMWidget *w, void *data)
117 int i;
118 proplist_t p1, p2;
119 proplist_t keyList;
120 proplist_t key;
123 /* puts("gathering data");*/
124 for (i=0; i<WPrefs.sectionCount; i++) {
125 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
126 if ((rec->callbacks.flags & INITIALIZED_PANEL))
127 savePanelData((Panel*)rec);
129 /* puts("compressing data");*/
130 /* compare the user dictionary with the global and remove redundant data */
131 keyList = PLGetAllDictionaryKeys(GlobalDB);
132 /* puts(PLGetDescription(WindowMakerDB));*/
133 for (i=0; i<PLGetNumberOfElements(keyList); i++) {
134 key = PLGetArrayElement(keyList, i);
136 /* We don't have this value anyway, so no problem.
137 * Probably a new option */
138 p1 = PLGetDictionaryEntry(WindowMakerDB, key);
139 if (!p1)
140 continue;
141 /* The global doesn't have it, so no problem either. */
142 p2 = PLGetDictionaryEntry(GlobalDB, key);
143 if (!p2)
144 continue;
145 /* If both values are the same, don't save. */
146 if (PLIsEqual(p1, p2))
147 PLRemoveDictionaryEntry(WindowMakerDB, key);
149 /* puts(PLGetDescription(WindowMakerDB));*/
150 PLRelease(keyList);
151 /* puts("storing data");*/
153 PLSave(WindowMakerDB, YES);
157 static void
158 undo(WMWidget *w, void *data)
160 PanelRec *rec = (PanelRec*)WPrefs.currentPanel;
162 if (!rec)
163 return;
165 if (rec->callbacks.undoChanges
166 && (rec->callbacks.flags & INITIALIZED_PANEL)) {
167 (*rec->callbacks.undoChanges)(WPrefs.currentPanel);
172 static void
173 undoAll(WMWidget *w, void *data)
175 int i;
177 for (i=0; i<WPrefs.sectionCount; i++) {
178 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
180 if (rec->callbacks.undoChanges
181 && (rec->callbacks.flags & INITIALIZED_PANEL))
182 (*rec->callbacks.undoChanges)((Panel*)rec);
187 static void
188 createMainWindow(WMScreen *scr)
190 WMScroller *scroller;
191 WMFont *font;
192 char buffer[128];
194 WPrefs.win = WMCreateWindow(scr, "wprefs");
195 WMResizeWidget(WPrefs.win, 520, 390);
196 WMSetWindowTitle(WPrefs.win, _("Window Maker Preferences"));
197 WMSetWindowCloseAction(WPrefs.win, quit, NULL);
198 WMSetWindowMaxSize(WPrefs.win, 520, 390);
199 WMSetWindowMinSize(WPrefs.win, 520, 390);
200 WMSetWindowMiniwindowTitle(WPrefs.win, "Preferences");
201 WMSetWindowMiniwindowImage(WPrefs.win, WMGetApplicationIconImage(scr));
203 WPrefs.scrollV = WMCreateScrollView(WPrefs.win);
204 WMResizeWidget(WPrefs.scrollV, 500, 87);
205 WMMoveWidget(WPrefs.scrollV, 10, 10);
206 WMSetScrollViewRelief(WPrefs.scrollV, WRSunken);
207 WMSetScrollViewHasHorizontalScroller(WPrefs.scrollV, True);
208 WMSetScrollViewHasVerticalScroller(WPrefs.scrollV, False);
209 scroller = WMGetScrollViewHorizontalScroller(WPrefs.scrollV);
210 WMSetScrollerArrowsPosition(scroller, WSANone);
212 WPrefs.buttonF = WMCreateFrame(WPrefs.win);
213 WMSetFrameRelief(WPrefs.buttonF, WRFlat);
215 WMSetScrollViewContentView(WPrefs.scrollV, WMWidgetView(WPrefs.buttonF));
217 WPrefs.undosBtn = WMCreateCommandButton(WPrefs.win);
218 WMResizeWidget(WPrefs.undosBtn, 90, 28);
219 WMMoveWidget(WPrefs.undosBtn, 135, 350);
220 WMSetButtonText(WPrefs.undosBtn, _("Revert Page"));
221 WMSetButtonAction(WPrefs.undosBtn, undo, NULL);
223 WPrefs.undoBtn = WMCreateCommandButton(WPrefs.win);
224 WMResizeWidget(WPrefs.undoBtn, 90, 28);
225 WMMoveWidget(WPrefs.undoBtn, 235, 350);
226 WMSetButtonText(WPrefs.undoBtn, _("Revert All"));
227 WMSetButtonAction(WPrefs.undoBtn, undoAll, NULL);
229 WPrefs.saveBtn = WMCreateCommandButton(WPrefs.win);
230 WMResizeWidget(WPrefs.saveBtn, 80, 28);
231 WMMoveWidget(WPrefs.saveBtn, 335, 350);
232 WMSetButtonText(WPrefs.saveBtn, _("Save"));
233 WMSetButtonAction(WPrefs.saveBtn, save, NULL);
235 WPrefs.closeBtn = WMCreateCommandButton(WPrefs.win);
236 WMResizeWidget(WPrefs.closeBtn, 80, 28);
237 WMMoveWidget(WPrefs.closeBtn, 425, 350);
238 WMSetButtonText(WPrefs.closeBtn, _("Close"));
239 WMSetButtonAction(WPrefs.closeBtn, quit, NULL);
241 /* banner */
242 WPrefs.banner = WMCreateFrame(WPrefs.win);
243 WMResizeWidget(WPrefs.banner, FRAME_WIDTH, FRAME_HEIGHT);
244 WMMoveWidget(WPrefs.banner, FRAME_LEFT, FRAME_TOP);
245 WMSetFrameRelief(WPrefs.banner, WRFlat);
247 font = WMCreateFont(scr, "-*-times-bold-r-*-*-24-*-*-*-*-*-*-*");
248 if (!font)
249 font = WMBoldSystemFontOfSize(scr, 24);
250 WPrefs.nameL = WMCreateLabel(WPrefs.banner);
251 WMSetLabelTextAlignment(WPrefs.nameL, WACenter);
252 WMResizeWidget(WPrefs.nameL, FRAME_WIDTH-20, 30);
253 WMMoveWidget(WPrefs.nameL, 10, 25);
254 WMSetLabelFont(WPrefs.nameL, font);
255 WMSetLabelText(WPrefs.nameL, "Window Maker Preferences Utility");
256 WMReleaseFont(font);
258 WPrefs.versionL = WMCreateLabel(WPrefs.banner);
259 WMResizeWidget(WPrefs.versionL, FRAME_WIDTH-20, 20);
260 WMMoveWidget(WPrefs.versionL, 10, 65);
261 WMSetLabelTextAlignment(WPrefs.versionL, WACenter);
262 sprintf(buffer, _("Version %s for Window Maker %s"), WVERSION, WMVERSION);
263 WMSetLabelText(WPrefs.versionL, buffer);
265 WPrefs.statusL = WMCreateLabel(WPrefs.banner);
266 WMResizeWidget(WPrefs.statusL, FRAME_WIDTH-20, 60);
267 WMMoveWidget(WPrefs.statusL, 10, 100);
268 WMSetLabelTextAlignment(WPrefs.statusL, WACenter);
269 WMSetLabelText(WPrefs.statusL, _("Starting..."));
271 WPrefs.creditsL = WMCreateLabel(WPrefs.banner);
272 WMResizeWidget(WPrefs.creditsL, FRAME_WIDTH-20, 60);
273 WMMoveWidget(WPrefs.creditsL, 10, FRAME_HEIGHT-60);
274 WMSetLabelTextAlignment(WPrefs.creditsL, WACenter);
275 WMSetLabelText(WPrefs.creditsL, _("Programming/Design: Alfredo K. Kojima\n"
276 "Artwork: Marco van Hylckama Vlieg\n"
277 "More Programming: James Thompson"));
280 WMMapSubwidgets(WPrefs.win);
282 WMUnmapWidget(WPrefs.undosBtn);
283 WMUnmapWidget(WPrefs.undoBtn);
284 WMUnmapWidget(WPrefs.saveBtn);
288 static void
289 showPanel(Panel *panel)
291 PanelRec *rec = (PanelRec*)panel;
293 if (!(rec->callbacks.flags & INITIALIZED_PANEL)) {
294 (*rec->callbacks.createWidgets)(panel);
295 rec->callbacks.flags |= INITIALIZED_PANEL;
298 WMSetWindowTitle(WPrefs.win, rec->sectionName);
300 WMMapWidget(rec->frame);
305 static void
306 hidePanel(Panel *panel)
308 PanelRec *rec = (PanelRec*)panel;
310 WMUnmapWidget(rec->frame);
314 static void
315 savePanelData(Panel *panel)
317 PanelRec *rec = (PanelRec*)panel;
319 if (rec->callbacks.updateDomain) {
320 (*rec->callbacks.updateDomain)(panel);
325 static void
326 changeSection(WMWidget *self, void *data)
328 if (WPrefs.banner) {
329 WMDestroyWidget(WPrefs.banner);
330 WPrefs.banner = NULL;
331 /* WMMapWidget(WPrefs.undosBtn);
332 WMMapWidget(WPrefs.undoBtn);
334 WMMapWidget(WPrefs.saveBtn);
337 showPanel(data);
339 if (WPrefs.currentPanel)
340 hidePanel(WPrefs.currentPanel);
341 WPrefs.currentPanel = data;
348 char*
349 LocateImage(char *name)
351 char *path;
352 char *tmp = wmalloc(strlen(name)+8);
354 if (TIFFOK) {
355 sprintf(tmp, "%s.tiff", name);
356 path = WMPathForResourceOfType(tmp, "tiff");
357 } else {
358 sprintf(tmp, "%s.xpm", name);
359 path = WMPathForResourceOfType(tmp, "xpm");
361 free(tmp);
362 if (!path) {
363 wwarning(_("could not locate image file %s\n"), name);
366 return path;
370 void
371 AddSection(Panel *panel, char *iconFile)
373 WMButton *bPtr;
374 WMPixmap *icon;
375 RColor color;
376 char *iconPath;
378 assert(WPrefs.sectionCount < MAX_SECTIONS);
380 iconPath = LocateImage(iconFile);
382 bPtr = WMCreateCustomButton(WPrefs.buttonF, WBBStateLightMask
383 |WBBStateChangeMask);
384 WMResizeWidget(bPtr, 64, 64);
385 WMMoveWidget(bPtr, WPrefs.sectionCount*64, 0);
386 WMSetButtonImagePosition(bPtr, WIPImageOnly);
387 WMSetButtonAction(bPtr, changeSection, panel);
388 WMHangData(bPtr, panel);
390 color.red = 0xae;
391 color.green = 0xaa;
392 color.blue = 0xae;
393 color.alpha = 0;
394 if (iconPath) {
395 icon = WMCreateBlendedPixmapFromFile(WMWidgetScreen(WPrefs.win),
396 iconPath, &color);
397 if (!icon)
398 wwarning(_("could not load icon file %s"), iconPath);
399 } else {
400 icon = NULL;
403 WMSetButtonImage(bPtr, icon);
405 if (icon)
406 WMReleasePixmap(icon);
408 color.red = 0xff;
409 color.green = 0xff;
410 color.blue = 0xff;
411 color.alpha = 0;
412 if (iconPath) {
413 icon = WMCreateBlendedPixmapFromFile(WMWidgetScreen(WPrefs.win),
414 iconPath, &color);
415 if (!icon)
416 wwarning(_("could not load icon file %s"), iconPath);
417 } else {
418 icon = NULL;
421 WMSetButtonAltImage(bPtr, icon);
423 if (icon)
424 WMReleasePixmap(icon);
426 WMMapWidget(bPtr);
428 WPrefs.sectionB[WPrefs.sectionCount] = bPtr;
430 if (WPrefs.sectionCount > 0) {
431 WMGroupButtons(WPrefs.sectionB[0], bPtr);
434 WPrefs.sectionCount++;
436 WMResizeWidget(WPrefs.buttonF, WPrefs.sectionCount*64, 64);
438 free(iconPath);
442 void
443 Initialize(WMScreen *scr)
445 char **list;
446 int i;
447 char *path;
448 WMPixmap *icon;
451 list = RSupportedFileFormats();
452 for (i=0; list[i]!=NULL; i++) {
453 if (strcmp(list[i], "TIFF")==0) {
454 TIFFOK = True;
455 break;
458 RFreeStringList(list);
460 if (TIFFOK)
461 path = WMPathForResourceOfType("WPrefs.tiff", NULL);
462 else
463 path = WMPathForResourceOfType("WPrefs.xpm", NULL);
464 if (path) {
465 RImage *tmp;
467 tmp = RLoadImage(WMScreenRContext(scr), path, 0);
468 if (!tmp) {
469 wwarning("could not load image file %s:%s", path,
470 RMessageForError(RErrorCode));
471 } else {
472 icon = WMCreatePixmapFromRImage(scr, tmp, 0);
473 RDestroyImage(tmp);
474 if (icon) {
475 WMSetApplicationIconImage(scr, icon);
476 WMReleasePixmap(icon);
479 free(path);
482 memset(&WPrefs, 0, sizeof(_WPrefs));
483 createMainWindow(scr);
485 WMRealizeWidget(WPrefs.win);
486 WMMapWidget(WPrefs.win);
487 XFlush(WMScreenDisplay(scr));
488 WMSetLabelText(WPrefs.statusL, _("Loading Window Maker configuration files..."));
489 XFlush(WMScreenDisplay(scr));
490 loadConfigurations(scr, WPrefs.win);
492 WMSetLabelText(WPrefs.statusL, _("Initializing configuration panels..."));
494 InitWindowHandling(scr, WPrefs.win);
495 InitFocus(scr, WPrefs.win);
496 InitMenuPreferences(scr, WPrefs.win);
497 InitIcons(scr, WPrefs.win);
498 InitPreferences(scr, WPrefs.win);
500 InitPaths(scr, WPrefs.win);
501 InitWorkspace(scr, WPrefs.win);
502 InitConfigurations(scr, WPrefs.win);
503 InitMenu(scr, WPrefs.win);
504 #ifdef not_yet_fully_implemented
505 InitKeyboardSettings(scr, WPrefs.win);
506 #endif
507 InitKeyboardShortcuts(scr, WPrefs.win);
508 InitMouseSettings(scr, WPrefs.win);
509 #ifdef not_yet_fully_implemented
510 InitTextureAndColor(scr, WPrefs.win);
511 InitText(scr, WPrefs.win);
512 #endif
513 InitExpert(scr, WPrefs.win);
515 WMRealizeWidget(WPrefs.scrollV);
517 WMSetLabelText(WPrefs.statusL, "This program is still under development. Backup your ~/GNUstep/Defaults directory, before using it.");
521 WMWindow*
522 GetWindow(Panel *panel)
524 return WPrefs.win;
528 static void
529 loadConfigurations(WMScreen *scr, WMWindow *mainw)
531 proplist_t db, gdb;
532 char *path;
533 FILE *file;
534 char buffer[1024];
535 char mbuf[1024];
536 int v1, v2, v3;
538 path = wdefaultspathfordomain("WindowMaker");
540 db = PLGetProplistWithPath(path);
541 if (db) {
542 if (!PLIsDictionary(db)) {
543 PLRelease(db);
544 db = NULL;
545 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), path);
546 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
548 } else {
549 sprintf(mbuf, _("Could not load Window Maker domain (%s) from defaults database."),
550 path);
551 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
553 free(path);
555 file = popen("wmaker -version", "r");
556 if (!file || !fgets(buffer, 1023, file)) {
557 wsyserror(_("could not extract version information from Window Maker"));
558 wfatal(_("Make sure Window Maker is in your search path."));
560 WMRunAlertPanel(scr, mainw, _("Error"),
561 _("Could not extract version from Window Maker. Make sure it is correctly installed."),
562 _("OK"), NULL, NULL);
563 exit(1);
565 if (file)
566 pclose(file);
568 if (sscanf(buffer, "Window Maker %i.%i.%i",&v1,&v2,&v3)!=3
569 && sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) {
570 WMRunAlertPanel(scr, mainw, _("Error"),
571 _("Could not extract version from Window Maker. Make sure it is correctly installed."),
572 _("OK"), NULL, NULL);
573 exit(1);
575 if (v1 == 0 && (v2 < 18 || v3 < 0)) {
576 sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
577 "The version installed is %i.%i.%i\n"), v1, v2, v3);
578 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
579 exit(1);
582 if (v1 > 1 || (v1 == 1 && (v2 > 0))) {
583 sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
584 v1, v2, v3);
585 WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL);
588 file = popen("wmaker -global_defaults_path", "r");
589 if (!file || !fgets(buffer, 1023, file)) {
590 wsyserror(_("could not run \"wmaker -global_defaults_path\"."));
591 exit(1);
593 if (file)
594 pclose(file);
596 gdb = PLGetProplistWithPath(buffer);
597 if (gdb) {
598 if (!PLIsDictionary(gdb)) {
599 PLRelease(gdb);
600 gdb = NULL;
601 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer);
602 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
604 } else {
605 sprintf(mbuf, _("Could not load global Window Maker domain (%s)."),
606 buffer);
607 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
610 if (!db) {
611 db = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
613 if (!gdb) {
614 gdb = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
617 GlobalDB = gdb;
619 WindowMakerDB = db;
623 proplist_t
624 GetObjectForKey(char *defaultName)
626 proplist_t object = NULL;
627 proplist_t key = PLMakeString(defaultName);
629 object = PLGetDictionaryEntry(WindowMakerDB, key);
630 if (!object)
631 object = PLGetDictionaryEntry(GlobalDB, key);
633 PLRelease(key);
635 return object;
639 void
640 SetObjectForKey(proplist_t object, char *defaultName)
642 proplist_t key = PLMakeString(defaultName);
644 PLInsertDictionaryEntry(WindowMakerDB, key, object);
645 PLRelease(key);
649 void
650 RemoveObjectForKey(char *defaultName)
652 proplist_t key = PLMakeString(defaultName);
654 PLRemoveDictionaryEntry(WindowMakerDB, key);
656 PLRelease(key);
660 char*
661 GetStringForKey(char *defaultName)
663 proplist_t val;
665 val = GetObjectForKey(defaultName);
667 if (!val)
668 return NULL;
670 if (!PLIsString(val))
671 return NULL;
673 return PLGetString(val);
678 proplist_t
679 GetArrayForKey(char *defaultName)
681 proplist_t val;
683 val = GetObjectForKey(defaultName);
685 if (!val)
686 return NULL;
688 if (!PLIsArray(val))
689 return NULL;
691 return val;
695 proplist_t
696 GetDictionaryForKey(char *defaultName)
698 proplist_t val;
700 val = GetObjectForKey(defaultName);
702 if (!val)
703 return NULL;
705 if (!PLIsDictionary(val))
706 return NULL;
708 return val;
713 GetIntegerForKey(char *defaultName)
715 proplist_t val;
716 char *str;
717 int value;
719 val = GetObjectForKey(defaultName);
721 if (!val)
722 return 0;
724 if (!PLIsString(val))
725 return 0;
727 str = PLGetString(val);
728 if (!str)
729 return 0;
731 if (sscanf(str, "%i", &value)!=1)
732 return 0;
734 return value;
738 Bool
739 GetBoolForKey(char *defaultName)
741 int value;
742 char *str;
744 str = GetStringForKey(defaultName);
746 if (!str)
747 return False;
749 if (sscanf(str, "%i", &value)==1 && value!=0)
750 return True;
752 if (strcasecmp(str, "YES")==0)
753 return True;
755 if (strcasecmp(str, "Y")==0)
756 return True;
758 return False;
762 void
763 SetIntegerForKey(int value, char *defaultName)
765 proplist_t object;
766 char buffer[128];
768 sprintf(buffer, "%i", value);
769 object = PLMakeString(buffer);
771 SetObjectForKey(object, defaultName);
772 PLRelease(object);
777 void
778 SetStringForKey(char *value, char *defaultName)
780 proplist_t object;
782 object = PLMakeString(value);
784 SetObjectForKey(object, defaultName);
785 PLRelease(object);
789 void
790 SetBoolForKey(Bool value, char *defaultName)
792 static proplist_t yes = NULL, no = NULL;
794 if (!yes) {
795 yes = PLMakeString("YES");
796 no = PLMakeString("NO");
799 SetObjectForKey(value ? yes : no, defaultName);
803 void
804 SetSpeedForKey(int speed, char *defaultName)
806 char *str;
808 switch (speed) {
809 case 0:
810 str = "ultraslow";
811 break;
812 case 1:
813 str = "slow";
814 break;
815 case 2:
816 str = "medium";
817 break;
818 case 3:
819 str = "fast";
820 break;
821 case 4:
822 str = "ultrafast";
823 break;
824 default:
825 str = NULL;
828 if (str)
829 SetStringForKey(str, defaultName);
834 GetSpeedForKey(char *defaultName)
836 char *str;
837 int i;
839 str = GetStringForKey(defaultName);
840 if (strcasecmp(str, "ultraslow")==0)
841 i = 0;
842 else if (strcasecmp(str, "slow")==0)
843 i = 1;
844 else if (strcasecmp(str, "medium")==0)
845 i = 2;
846 else if (strcasecmp(str, "fast")==0)
847 i = 3;
848 else if (strcasecmp(str, "ultrafast")==0)
849 i = 4;
850 else {
851 wwarning(_("bad speed value for option %s\n. Using default Medium"),
852 defaultName);
853 i = 2;
855 return i;