Update for 0.52.0. This is a test version, which brings the Appearance
[wmaker-crm.git] / WPrefs.app / WPrefs.c
blob18664cb5d89e6ddb68287858058719ab74ab5572
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);
522 InitAppearance(scr, WPrefs.win);
523 #ifdef not_yet_fully_implemented
525 InitText(scr, WPrefs.win);
526 InitThemes(scr, WPrefs.win);
527 #endif
528 InitExpert(scr, WPrefs.win);
530 WMRealizeWidget(WPrefs.scrollV);
532 WMSetLabelText(WPrefs.statusL,
533 _("WPrefs is free software and is distributed WITHOUT ANY\n"
534 "WARRANTY under the terms of the GNU General Public License.\n"
535 "The icons in this program are licensed through the\n"
536 "OpenContent License."));
540 WMWindow*
541 GetWindow(Panel *panel)
543 return WPrefs.win;
547 static void
548 loadConfigurations(WMScreen *scr, WMWindow *mainw)
550 proplist_t db, gdb;
551 char *path;
552 FILE *file;
553 char buffer[1024];
554 char mbuf[1024];
555 int v1, v2, v3;
557 path = wdefaultspathfordomain("WindowMaker");
559 db = PLGetProplistWithPath(path);
560 if (db) {
561 if (!PLIsDictionary(db)) {
562 PLRelease(db);
563 db = NULL;
564 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), path);
565 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
567 } else {
568 sprintf(mbuf, _("Could not load Window Maker domain (%s) from defaults database."),
569 path);
570 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
572 free(path);
574 file = popen("wmaker --version", "r");
575 if (!file || !fgets(buffer, 1023, file)) {
576 wsyserror(_("could not extract version information from Window Maker"));
577 wfatal(_("Make sure wmaker is in your search path."));
579 WMRunAlertPanel(scr, mainw, _("Error"),
580 _("Could not extract version from Window Maker. Make sure it is correctly installed and is in your PATH environment variable."),
581 _("OK"), NULL, NULL);
582 exit(1);
584 if (file)
585 pclose(file);
587 if (sscanf(buffer, "Window Maker %i.%i.%i",&v1,&v2,&v3)!=3
588 && sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) {
589 WMRunAlertPanel(scr, mainw, _("Error"),
590 _("Could not extract version from Window Maker. "
591 "Make sure it is correctly installed and the path "
592 "where it installed is in the PATH environment "
593 "variable."), _("OK"), NULL, NULL);
594 exit(1);
596 if (v1 == 0 && (v2 < 18 || v3 < 0)) {
597 sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
598 "The version installed is %i.%i.%i\n"), v1, v2, v3);
599 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
600 exit(1);
603 if (v1 > 1 || (v1 == 1 && (v2 > 0))) {
604 sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
605 v1, v2, v3);
606 WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL);
609 file = popen("wmaker --global_defaults_path", "r");
610 if (!file || !fgets(buffer, 1023, file)) {
611 wsyserror(_("could not run \"wmaker --global_defaults_path\"."));
612 exit(1);
613 } else {
614 char *ptr;
615 ptr = strchr(buffer, '\n');
616 if (ptr)
617 *ptr = 0;
618 strcat(buffer, "/WindowMaker");
621 if (file)
622 pclose(file);
624 gdb = PLGetProplistWithPath(buffer);
625 if (gdb) {
626 if (!PLIsDictionary(gdb)) {
627 PLRelease(gdb);
628 gdb = NULL;
629 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer);
630 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
632 } else {
633 sprintf(mbuf, _("Could not load global Window Maker domain (%s)."),
634 buffer);
635 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
638 if (!db) {
639 db = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
641 if (!gdb) {
642 gdb = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
645 GlobalDB = gdb;
647 WindowMakerDB = db;
651 proplist_t
652 GetObjectForKey(char *defaultName)
654 proplist_t object = NULL;
655 proplist_t key = PLMakeString(defaultName);
657 object = PLGetDictionaryEntry(WindowMakerDB, key);
658 if (!object)
659 object = PLGetDictionaryEntry(GlobalDB, key);
661 PLRelease(key);
663 return object;
667 void
668 SetObjectForKey(proplist_t object, char *defaultName)
670 proplist_t key = PLMakeString(defaultName);
672 PLInsertDictionaryEntry(WindowMakerDB, key, object);
673 PLRelease(key);
677 void
678 RemoveObjectForKey(char *defaultName)
680 proplist_t key = PLMakeString(defaultName);
682 PLRemoveDictionaryEntry(WindowMakerDB, key);
684 PLRelease(key);
688 char*
689 GetStringForKey(char *defaultName)
691 proplist_t val;
693 val = GetObjectForKey(defaultName);
695 if (!val)
696 return NULL;
698 if (!PLIsString(val))
699 return NULL;
701 return PLGetString(val);
706 proplist_t
707 GetArrayForKey(char *defaultName)
709 proplist_t val;
711 val = GetObjectForKey(defaultName);
713 if (!val)
714 return NULL;
716 if (!PLIsArray(val))
717 return NULL;
719 return val;
723 proplist_t
724 GetDictionaryForKey(char *defaultName)
726 proplist_t val;
728 val = GetObjectForKey(defaultName);
730 if (!val)
731 return NULL;
733 if (!PLIsDictionary(val))
734 return NULL;
736 return val;
741 GetIntegerForKey(char *defaultName)
743 proplist_t val;
744 char *str;
745 int value;
747 val = GetObjectForKey(defaultName);
749 if (!val)
750 return 0;
752 if (!PLIsString(val))
753 return 0;
755 str = PLGetString(val);
756 if (!str)
757 return 0;
759 if (sscanf(str, "%i", &value)!=1)
760 return 0;
762 return value;
766 Bool
767 GetBoolForKey(char *defaultName)
769 int value;
770 char *str;
772 str = GetStringForKey(defaultName);
774 if (!str)
775 return False;
777 if (sscanf(str, "%i", &value)==1 && value!=0)
778 return True;
780 if (strcasecmp(str, "YES")==0)
781 return True;
783 if (strcasecmp(str, "Y")==0)
784 return True;
786 return False;
790 void
791 SetIntegerForKey(int value, char *defaultName)
793 proplist_t object;
794 char buffer[128];
796 sprintf(buffer, "%i", value);
797 object = PLMakeString(buffer);
799 SetObjectForKey(object, defaultName);
800 PLRelease(object);
805 void
806 SetStringForKey(char *value, char *defaultName)
808 proplist_t object;
810 object = PLMakeString(value);
812 SetObjectForKey(object, defaultName);
813 PLRelease(object);
817 void
818 SetBoolForKey(Bool value, char *defaultName)
820 static proplist_t yes = NULL, no = NULL;
822 if (!yes) {
823 yes = PLMakeString("YES");
824 no = PLMakeString("NO");
827 SetObjectForKey(value ? yes : no, defaultName);
831 void
832 SetSpeedForKey(int speed, char *defaultName)
834 char *str;
836 switch (speed) {
837 case 0:
838 str = "ultraslow";
839 break;
840 case 1:
841 str = "slow";
842 break;
843 case 2:
844 str = "medium";
845 break;
846 case 3:
847 str = "fast";
848 break;
849 case 4:
850 str = "ultrafast";
851 break;
852 default:
853 str = NULL;
856 if (str)
857 SetStringForKey(str, defaultName);
862 GetSpeedForKey(char *defaultName)
864 char *str;
865 int i;
867 str = GetStringForKey(defaultName);
868 if (!str)
869 return 2;
871 if (strcasecmp(str, "ultraslow")==0)
872 i = 0;
873 else if (strcasecmp(str, "slow")==0)
874 i = 1;
875 else if (strcasecmp(str, "medium")==0)
876 i = 2;
877 else if (strcasecmp(str, "fast")==0)
878 i = 3;
879 else if (strcasecmp(str, "ultrafast")==0)
880 i = 4;
881 else {
882 wwarning(_("bad speed value for option %s\n. Using default Medium"),
883 defaultName);
884 i = 2;
886 return i;