Update for 0.51.2-pre2
[wmaker-crm.git] / WPrefs.app / WPrefs.c
blobfec14e1142498a6a11b8c80f2ceb265b4be82c32
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 *InitText(WMScreen *scr, WMWindow *win);
44 extern Panel *InitConfigurations(WMScreen *scr, WMWindow *win);
46 extern Panel *InitPaths(WMScreen *scr, WMWindow *win);
48 extern Panel *InitMenu(WMScreen *scr, WMWindow *win);
50 extern Panel *InitExpert(WMScreen *scr, WMWindow *win);
52 extern Panel *InitMenuPreferences(WMScreen *scr, WMWindow *win);
54 extern Panel *InitIcons(WMScreen *scr, WMWindow *win);
56 extern Panel *InitThemes(WMScreen *scr, WMWindow *win);
58 extern Panel *InitAppearance(WMScreen *scr, WMWindow *win);
62 #define MAX_SECTIONS 16
65 typedef struct _WPrefs {
66 WMWindow *win;
68 WMScrollView *scrollV;
69 WMFrame *buttonF;
70 WMButton *sectionB[MAX_SECTIONS];
72 int sectionCount;
74 WMButton *saveBtn;
75 WMButton *closeBtn;
76 WMButton *undoBtn;
77 WMButton *undosBtn;
79 WMFrame *banner;
80 WMLabel *nameL;
81 WMLabel *versionL;
82 WMLabel *creditsL;
83 WMLabel *statusL;
85 Panel *currentPanel;
86 } _WPrefs;
89 static _WPrefs WPrefs;
91 /* system wide defaults dictionary. Read-only */
92 static proplist_t GlobalDB = NULL;
93 /* user defaults dictionary */
94 static proplist_t WindowMakerDB = NULL;
97 static Bool TIFFOK = False;
100 #define INITIALIZED_PANEL (1<<0)
105 static void loadConfigurations(WMScreen *scr, WMWindow *mainw);
107 static void savePanelData(Panel *panel);
110 void
111 quit(WMWidget *w, void *data)
113 exit(0);
117 static void
118 save(WMWidget *w, void *data)
120 int i;
121 proplist_t p1, p2;
122 proplist_t keyList;
123 proplist_t key;
126 /* puts("gathering data");*/
127 for (i=0; i<WPrefs.sectionCount; i++) {
128 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
129 if ((rec->callbacks.flags & INITIALIZED_PANEL))
130 savePanelData((Panel*)rec);
132 /* puts("compressing data");*/
133 /* compare the user dictionary with the global and remove redundant data */
134 keyList = PLGetAllDictionaryKeys(GlobalDB);
135 /* puts(PLGetDescription(WindowMakerDB));*/
136 for (i=0; i<PLGetNumberOfElements(keyList); i++) {
137 key = PLGetArrayElement(keyList, i);
139 /* We don't have this value anyway, so no problem.
140 * Probably a new option */
141 p1 = PLGetDictionaryEntry(WindowMakerDB, key);
142 if (!p1)
143 continue;
144 /* The global doesn't have it, so no problem either. */
145 p2 = PLGetDictionaryEntry(GlobalDB, key);
146 if (!p2)
147 continue;
148 /* If both values are the same, don't save. */
149 if (PLIsEqual(p1, p2))
150 PLRemoveDictionaryEntry(WindowMakerDB, key);
152 /* puts(PLGetDescription(WindowMakerDB));*/
153 PLRelease(keyList);
154 /* puts("storing data");*/
156 PLSave(WindowMakerDB, YES);
160 static void
161 undo(WMWidget *w, void *data)
163 PanelRec *rec = (PanelRec*)WPrefs.currentPanel;
165 if (!rec)
166 return;
168 if (rec->callbacks.undoChanges
169 && (rec->callbacks.flags & INITIALIZED_PANEL)) {
170 (*rec->callbacks.undoChanges)(WPrefs.currentPanel);
175 static void
176 undoAll(WMWidget *w, void *data)
178 int i;
180 for (i=0; i<WPrefs.sectionCount; i++) {
181 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
183 if (rec->callbacks.undoChanges
184 && (rec->callbacks.flags & INITIALIZED_PANEL))
185 (*rec->callbacks.undoChanges)((Panel*)rec);
190 static void
191 createMainWindow(WMScreen *scr)
193 WMScroller *scroller;
194 WMFont *font;
195 char buffer[128];
197 WPrefs.win = WMCreateWindow(scr, "wprefs");
198 WMResizeWidget(WPrefs.win, 520, 390);
199 WMSetWindowTitle(WPrefs.win, _("Window Maker Preferences"));
200 WMSetWindowCloseAction(WPrefs.win, quit, NULL);
201 WMSetWindowMaxSize(WPrefs.win, 520, 390);
202 WMSetWindowMinSize(WPrefs.win, 520, 390);
203 WMSetWindowMiniwindowTitle(WPrefs.win, "Preferences");
204 WMSetWindowMiniwindowImage(WPrefs.win, WMGetApplicationIconImage(scr));
206 WPrefs.scrollV = WMCreateScrollView(WPrefs.win);
207 WMResizeWidget(WPrefs.scrollV, 500, 87);
208 WMMoveWidget(WPrefs.scrollV, 10, 10);
209 WMSetScrollViewRelief(WPrefs.scrollV, WRSunken);
210 WMSetScrollViewHasHorizontalScroller(WPrefs.scrollV, True);
211 WMSetScrollViewHasVerticalScroller(WPrefs.scrollV, False);
212 scroller = WMGetScrollViewHorizontalScroller(WPrefs.scrollV);
213 WMSetScrollerArrowsPosition(scroller, WSANone);
215 WPrefs.buttonF = WMCreateFrame(WPrefs.win);
216 WMSetFrameRelief(WPrefs.buttonF, WRFlat);
218 WMSetScrollViewContentView(WPrefs.scrollV, WMWidgetView(WPrefs.buttonF));
220 WPrefs.undosBtn = WMCreateCommandButton(WPrefs.win);
221 WMResizeWidget(WPrefs.undosBtn, 90, 28);
222 WMMoveWidget(WPrefs.undosBtn, 135, 350);
223 WMSetButtonText(WPrefs.undosBtn, _("Revert Page"));
224 WMSetButtonAction(WPrefs.undosBtn, undo, NULL);
226 WPrefs.undoBtn = WMCreateCommandButton(WPrefs.win);
227 WMResizeWidget(WPrefs.undoBtn, 90, 28);
228 WMMoveWidget(WPrefs.undoBtn, 235, 350);
229 WMSetButtonText(WPrefs.undoBtn, _("Revert All"));
230 WMSetButtonAction(WPrefs.undoBtn, undoAll, NULL);
232 WPrefs.saveBtn = WMCreateCommandButton(WPrefs.win);
233 WMResizeWidget(WPrefs.saveBtn, 80, 28);
234 WMMoveWidget(WPrefs.saveBtn, 335, 350);
235 WMSetButtonText(WPrefs.saveBtn, _("Save"));
236 WMSetButtonAction(WPrefs.saveBtn, save, NULL);
238 WPrefs.closeBtn = WMCreateCommandButton(WPrefs.win);
239 WMResizeWidget(WPrefs.closeBtn, 80, 28);
240 WMMoveWidget(WPrefs.closeBtn, 425, 350);
241 WMSetButtonText(WPrefs.closeBtn, _("Close"));
242 WMSetButtonAction(WPrefs.closeBtn, quit, NULL);
244 /* banner */
245 WPrefs.banner = WMCreateFrame(WPrefs.win);
246 WMResizeWidget(WPrefs.banner, FRAME_WIDTH, FRAME_HEIGHT);
247 WMMoveWidget(WPrefs.banner, FRAME_LEFT, FRAME_TOP);
248 WMSetFrameRelief(WPrefs.banner, WRFlat);
250 font = WMCreateFont(scr, "-*-times-bold-r-*-*-24-*-*-*-*-*-*-*");
251 if (!font)
252 font = WMBoldSystemFontOfSize(scr, 24);
253 WPrefs.nameL = WMCreateLabel(WPrefs.banner);
254 WMSetLabelTextAlignment(WPrefs.nameL, WACenter);
255 WMResizeWidget(WPrefs.nameL, FRAME_WIDTH-20, 30);
256 WMMoveWidget(WPrefs.nameL, 10, 25);
257 WMSetLabelFont(WPrefs.nameL, font);
258 WMSetLabelText(WPrefs.nameL, _("Window Maker Preferences Utility"));
259 WMReleaseFont(font);
261 WPrefs.versionL = WMCreateLabel(WPrefs.banner);
262 WMResizeWidget(WPrefs.versionL, FRAME_WIDTH-20, 20);
263 WMMoveWidget(WPrefs.versionL, 10, 65);
264 WMSetLabelTextAlignment(WPrefs.versionL, WACenter);
265 sprintf(buffer, _("Version %s for Window Maker %s"), WVERSION, WMVERSION);
266 WMSetLabelText(WPrefs.versionL, buffer);
268 WPrefs.statusL = WMCreateLabel(WPrefs.banner);
269 WMResizeWidget(WPrefs.statusL, FRAME_WIDTH-20, 60);
270 WMMoveWidget(WPrefs.statusL, 10, 100);
271 WMSetLabelTextAlignment(WPrefs.statusL, WACenter);
272 WMSetLabelText(WPrefs.statusL, _("Starting..."));
274 WPrefs.creditsL = WMCreateLabel(WPrefs.banner);
275 WMResizeWidget(WPrefs.creditsL, FRAME_WIDTH-20, 60);
276 WMMoveWidget(WPrefs.creditsL, 10, FRAME_HEIGHT-60);
277 WMSetLabelTextAlignment(WPrefs.creditsL, WACenter);
278 WMSetLabelText(WPrefs.creditsL, _("Programming/Design: Alfredo K. Kojima\n"
279 "Artwork: Marco van Hylckama Vlieg\n"
280 "More Programming: James Thompson"));
283 WMMapSubwidgets(WPrefs.win);
285 WMUnmapWidget(WPrefs.undosBtn);
286 WMUnmapWidget(WPrefs.undoBtn);
287 WMUnmapWidget(WPrefs.saveBtn);
291 static void
292 showPanel(Panel *panel)
294 PanelRec *rec = (PanelRec*)panel;
296 if (!(rec->callbacks.flags & INITIALIZED_PANEL)) {
297 (*rec->callbacks.createWidgets)(panel);
298 rec->callbacks.flags |= INITIALIZED_PANEL;
301 WMSetWindowTitle(WPrefs.win, rec->sectionName);
303 WMMapWidget(rec->frame);
308 static void
309 hidePanel(Panel *panel)
311 PanelRec *rec = (PanelRec*)panel;
313 WMUnmapWidget(rec->frame);
317 static void
318 savePanelData(Panel *panel)
320 PanelRec *rec = (PanelRec*)panel;
322 if (rec->callbacks.updateDomain) {
323 (*rec->callbacks.updateDomain)(panel);
328 static void
329 changeSection(WMWidget *self, void *data)
331 if (WPrefs.banner) {
332 WMDestroyWidget(WPrefs.banner);
333 WPrefs.banner = NULL;
334 /* WMMapWidget(WPrefs.undosBtn);
335 WMMapWidget(WPrefs.undoBtn);
337 WMMapWidget(WPrefs.saveBtn);
340 showPanel(data);
342 if (WPrefs.currentPanel)
343 hidePanel(WPrefs.currentPanel);
344 WPrefs.currentPanel = data;
351 char*
352 LocateImage(char *name)
354 char *path;
355 char *tmp = wmalloc(strlen(name)+8);
357 if (TIFFOK) {
358 sprintf(tmp, "%s.tiff", name);
359 path = WMPathForResourceOfType(tmp, "tiff");
360 } else {
361 sprintf(tmp, "%s.xpm", name);
362 path = WMPathForResourceOfType(tmp, "xpm");
364 free(tmp);
365 if (!path) {
366 wwarning(_("could not locate image file %s\n"), name);
369 return path;
373 void
374 SetButtonAlphaImage(WMScreen *scr, WMButton *bPtr, char *file)
376 WMPixmap *icon;
377 RColor color;
378 char *iconPath;
380 iconPath = LocateImage(file);
382 color.red = 0xae;
383 color.green = 0xaa;
384 color.blue = 0xae;
385 color.alpha = 0;
386 if (iconPath) {
387 icon = WMCreateBlendedPixmapFromFile(scr, iconPath, &color);
388 if (!icon)
389 wwarning(_("could not load icon file %s"), iconPath);
390 } else {
391 icon = NULL;
394 WMSetButtonImage(bPtr, icon);
396 if (icon)
397 WMReleasePixmap(icon);
399 color.red = 0xff;
400 color.green = 0xff;
401 color.blue = 0xff;
402 color.alpha = 0;
403 if (iconPath) {
404 icon = WMCreateBlendedPixmapFromFile(scr, iconPath, &color);
405 if (!icon)
406 wwarning(_("could not load icon file %s"), iconPath);
407 } else {
408 icon = NULL;
411 WMSetButtonAltImage(bPtr, icon);
413 if (icon)
414 WMReleasePixmap(icon);
416 if (iconPath)
417 free(iconPath);
421 void
422 AddSection(Panel *panel, char *iconFile)
424 WMButton *bPtr;
426 assert(WPrefs.sectionCount < MAX_SECTIONS);
429 bPtr = WMCreateCustomButton(WPrefs.buttonF, WBBStateLightMask
430 |WBBStateChangeMask);
431 WMResizeWidget(bPtr, 64, 64);
432 WMMoveWidget(bPtr, WPrefs.sectionCount*64, 0);
433 WMSetButtonImagePosition(bPtr, WIPImageOnly);
434 WMSetButtonAction(bPtr, changeSection, panel);
435 WMHangData(bPtr, panel);
437 SetButtonAlphaImage(WMWidgetScreen(bPtr), bPtr, iconFile);
439 WMMapWidget(bPtr);
441 WPrefs.sectionB[WPrefs.sectionCount] = bPtr;
443 if (WPrefs.sectionCount > 0) {
444 WMGroupButtons(WPrefs.sectionB[0], bPtr);
447 WPrefs.sectionCount++;
449 WMResizeWidget(WPrefs.buttonF, WPrefs.sectionCount*64, 64);
453 void
454 Initialize(WMScreen *scr)
456 char **list;
457 int i;
458 char *path;
459 WMPixmap *icon;
462 list = RSupportedFileFormats();
463 for (i=0; list[i]!=NULL; i++) {
464 if (strcmp(list[i], "TIFF")==0) {
465 TIFFOK = True;
466 break;
470 if (TIFFOK)
471 path = WMPathForResourceOfType("WPrefs.tiff", NULL);
472 else
473 path = WMPathForResourceOfType("WPrefs.xpm", NULL);
474 if (path) {
475 RImage *tmp;
477 tmp = RLoadImage(WMScreenRContext(scr), path, 0);
478 if (!tmp) {
479 wwarning(_("could not load image file %s:%s"), path,
480 RMessageForError(RErrorCode));
481 } else {
482 icon = WMCreatePixmapFromRImage(scr, tmp, 0);
483 RDestroyImage(tmp);
484 if (icon) {
485 WMSetApplicationIconImage(scr, icon);
486 WMReleasePixmap(icon);
489 free(path);
492 memset(&WPrefs, 0, sizeof(_WPrefs));
493 createMainWindow(scr);
495 WMRealizeWidget(WPrefs.win);
496 WMMapWidget(WPrefs.win);
497 XFlush(WMScreenDisplay(scr));
498 WMSetLabelText(WPrefs.statusL, _("Loading Window Maker configuration files..."));
499 XFlush(WMScreenDisplay(scr));
500 loadConfigurations(scr, WPrefs.win);
502 WMSetLabelText(WPrefs.statusL, _("Initializing configuration panels..."));
504 InitWindowHandling(scr, WPrefs.win);
505 InitFocus(scr, WPrefs.win);
506 InitMenuPreferences(scr, WPrefs.win);
507 InitIcons(scr, WPrefs.win);
508 InitPreferences(scr, WPrefs.win);
510 InitPaths(scr, WPrefs.win);
511 InitWorkspace(scr, WPrefs.win);
512 InitConfigurations(scr, WPrefs.win);
514 InitMenu(scr, WPrefs.win);
516 #ifdef not_yet_fully_implemented
517 InitKeyboardSettings(scr, WPrefs.win);
518 #endif
519 InitKeyboardShortcuts(scr, WPrefs.win);
520 InitMouseSettings(scr, WPrefs.win);
521 #ifdef not_yet_fully_implemented
522 InitAppearance(scr, WPrefs.win);
524 InitText(scr, WPrefs.win);
525 InitThemes(scr, WPrefs.win);
526 #endif
527 InitExpert(scr, WPrefs.win);
529 WMRealizeWidget(WPrefs.scrollV);
531 WMSetLabelText(WPrefs.statusL,
532 _("WPrefs is free software and is distributed WITHOUT ANY\n"
533 "WARRANTY under the terms of the GNU General Public License.\n"
534 "The icons in this program are licensed through the\n"
535 "OpenContent License."));
539 WMWindow*
540 GetWindow(Panel *panel)
542 return WPrefs.win;
546 static void
547 loadConfigurations(WMScreen *scr, WMWindow *mainw)
549 proplist_t db, gdb;
550 char *path;
551 FILE *file;
552 char buffer[1024];
553 char mbuf[1024];
554 int v1, v2, v3;
556 path = wdefaultspathfordomain("WindowMaker");
558 db = PLGetProplistWithPath(path);
559 if (db) {
560 if (!PLIsDictionary(db)) {
561 PLRelease(db);
562 db = NULL;
563 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), path);
564 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
566 } else {
567 sprintf(mbuf, _("Could not load Window Maker domain (%s) from defaults database."),
568 path);
569 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
571 free(path);
573 file = popen("wmaker --version", "r");
574 if (!file || !fgets(buffer, 1023, file)) {
575 wsyserror(_("could not extract version information from Window Maker"));
576 wfatal(_("Make sure wmaker is in your search path."));
578 WMRunAlertPanel(scr, mainw, _("Error"),
579 _("Could not extract version from Window Maker. Make sure it is correctly installed and is in your PATH environment variable."),
580 _("OK"), NULL, NULL);
581 exit(1);
583 if (file)
584 pclose(file);
586 if (sscanf(buffer, "Window Maker %i.%i.%i",&v1,&v2,&v3)!=3
587 && sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) {
588 WMRunAlertPanel(scr, mainw, _("Error"),
589 _("Could not extract version from Window Maker. "
590 "Make sure it is correctly installed and the path "
591 "where it installed is in the PATH environment "
592 "variable."), _("OK"), NULL, NULL);
593 exit(1);
595 if (v1 == 0 && (v2 < 18 || v3 < 0)) {
596 sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
597 "The version installed is %i.%i.%i\n"), v1, v2, v3);
598 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
599 exit(1);
602 if (v1 > 1 || (v1 == 1 && (v2 > 0))) {
603 sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
604 v1, v2, v3);
605 WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL);
608 file = popen("wmaker --global_defaults_path", "r");
609 if (!file || !fgets(buffer, 1023, file)) {
610 wsyserror(_("could not run \"wmaker --global_defaults_path\"."));
611 exit(1);
612 } else {
613 char *ptr;
614 ptr = strchr(buffer, '\n');
615 if (ptr)
616 *ptr = 0;
617 strcat(buffer, "/WindowMaker");
620 if (file)
621 pclose(file);
623 gdb = PLGetProplistWithPath(buffer);
624 if (gdb) {
625 if (!PLIsDictionary(gdb)) {
626 PLRelease(gdb);
627 gdb = NULL;
628 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer);
629 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
631 } else {
632 sprintf(mbuf, _("Could not load global Window Maker domain (%s)."),
633 buffer);
634 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
637 if (!db) {
638 db = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
640 if (!gdb) {
641 gdb = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
644 GlobalDB = gdb;
646 WindowMakerDB = db;
650 proplist_t
651 GetObjectForKey(char *defaultName)
653 proplist_t object = NULL;
654 proplist_t key = PLMakeString(defaultName);
656 object = PLGetDictionaryEntry(WindowMakerDB, key);
657 if (!object)
658 object = PLGetDictionaryEntry(GlobalDB, key);
660 PLRelease(key);
662 return object;
666 void
667 SetObjectForKey(proplist_t object, char *defaultName)
669 proplist_t key = PLMakeString(defaultName);
671 PLInsertDictionaryEntry(WindowMakerDB, key, object);
672 PLRelease(key);
676 void
677 RemoveObjectForKey(char *defaultName)
679 proplist_t key = PLMakeString(defaultName);
681 PLRemoveDictionaryEntry(WindowMakerDB, key);
683 PLRelease(key);
687 char*
688 GetStringForKey(char *defaultName)
690 proplist_t val;
692 val = GetObjectForKey(defaultName);
694 if (!val)
695 return NULL;
697 if (!PLIsString(val))
698 return NULL;
700 return PLGetString(val);
705 proplist_t
706 GetArrayForKey(char *defaultName)
708 proplist_t val;
710 val = GetObjectForKey(defaultName);
712 if (!val)
713 return NULL;
715 if (!PLIsArray(val))
716 return NULL;
718 return val;
722 proplist_t
723 GetDictionaryForKey(char *defaultName)
725 proplist_t val;
727 val = GetObjectForKey(defaultName);
729 if (!val)
730 return NULL;
732 if (!PLIsDictionary(val))
733 return NULL;
735 return val;
740 GetIntegerForKey(char *defaultName)
742 proplist_t val;
743 char *str;
744 int value;
746 val = GetObjectForKey(defaultName);
748 if (!val)
749 return 0;
751 if (!PLIsString(val))
752 return 0;
754 str = PLGetString(val);
755 if (!str)
756 return 0;
758 if (sscanf(str, "%i", &value)!=1)
759 return 0;
761 return value;
765 Bool
766 GetBoolForKey(char *defaultName)
768 int value;
769 char *str;
771 str = GetStringForKey(defaultName);
773 if (!str)
774 return False;
776 if (sscanf(str, "%i", &value)==1 && value!=0)
777 return True;
779 if (strcasecmp(str, "YES")==0)
780 return True;
782 if (strcasecmp(str, "Y")==0)
783 return True;
785 return False;
789 void
790 SetIntegerForKey(int value, char *defaultName)
792 proplist_t object;
793 char buffer[128];
795 sprintf(buffer, "%i", value);
796 object = PLMakeString(buffer);
798 SetObjectForKey(object, defaultName);
799 PLRelease(object);
804 void
805 SetStringForKey(char *value, char *defaultName)
807 proplist_t object;
809 object = PLMakeString(value);
811 SetObjectForKey(object, defaultName);
812 PLRelease(object);
816 void
817 SetBoolForKey(Bool value, char *defaultName)
819 static proplist_t yes = NULL, no = NULL;
821 if (!yes) {
822 yes = PLMakeString("YES");
823 no = PLMakeString("NO");
826 SetObjectForKey(value ? yes : no, defaultName);
830 void
831 SetSpeedForKey(int speed, char *defaultName)
833 char *str;
835 switch (speed) {
836 case 0:
837 str = "ultraslow";
838 break;
839 case 1:
840 str = "slow";
841 break;
842 case 2:
843 str = "medium";
844 break;
845 case 3:
846 str = "fast";
847 break;
848 case 4:
849 str = "ultrafast";
850 break;
851 default:
852 str = NULL;
855 if (str)
856 SetStringForKey(str, defaultName);
861 GetSpeedForKey(char *defaultName)
863 char *str;
864 int i;
866 str = GetStringForKey(defaultName);
867 if (!str)
868 return 2;
870 if (strcasecmp(str, "ultraslow")==0)
871 i = 0;
872 else if (strcasecmp(str, "slow")==0)
873 i = 1;
874 else if (strcasecmp(str, "medium")==0)
875 i = 2;
876 else if (strcasecmp(str, "fast")==0)
877 i = 3;
878 else if (strcasecmp(str, "ultrafast")==0)
879 i = 4;
880 else {
881 wwarning(_("bad speed value for option %s\n. Using default Medium"),
882 defaultName);
883 i = 2;
885 return i;