0.51.1 pre snapshot. Be careful, it may be buggy. It fixes some bugs though.
[wmaker-crm.git] / WPrefs.app / WPrefs.c
blob9f90077527bcac7c1eea1081f6001559df422061
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 *InitTextureAndColor(WMScreen *scr, WMWindow *win);
60 extern Panel *InitAppearance(WMScreen *scr, WMWindow *win);
64 #define MAX_SECTIONS 16
67 typedef struct _WPrefs {
68 WMWindow *win;
70 WMScrollView *scrollV;
71 WMFrame *buttonF;
72 WMButton *sectionB[MAX_SECTIONS];
74 int sectionCount;
76 WMButton *saveBtn;
77 WMButton *closeBtn;
78 WMButton *undoBtn;
79 WMButton *undosBtn;
81 WMFrame *banner;
82 WMLabel *nameL;
83 WMLabel *versionL;
84 WMLabel *creditsL;
85 WMLabel *statusL;
87 Panel *currentPanel;
88 } _WPrefs;
91 static _WPrefs WPrefs;
93 /* system wide defaults dictionary. Read-only */
94 static proplist_t GlobalDB = NULL;
95 /* user defaults dictionary */
96 static proplist_t WindowMakerDB = NULL;
99 static Bool TIFFOK = False;
102 #define INITIALIZED_PANEL (1<<0)
107 static void loadConfigurations(WMScreen *scr, WMWindow *mainw);
109 static void savePanelData(Panel *panel);
112 void
113 quit(WMWidget *w, void *data)
115 exit(0);
119 static void
120 save(WMWidget *w, void *data)
122 int i;
123 proplist_t p1, p2;
124 proplist_t keyList;
125 proplist_t key;
128 /* puts("gathering data");*/
129 for (i=0; i<WPrefs.sectionCount; i++) {
130 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
131 if ((rec->callbacks.flags & INITIALIZED_PANEL))
132 savePanelData((Panel*)rec);
134 /* puts("compressing data");*/
135 /* compare the user dictionary with the global and remove redundant data */
136 keyList = PLGetAllDictionaryKeys(GlobalDB);
137 /* puts(PLGetDescription(WindowMakerDB));*/
138 for (i=0; i<PLGetNumberOfElements(keyList); i++) {
139 key = PLGetArrayElement(keyList, i);
141 /* We don't have this value anyway, so no problem.
142 * Probably a new option */
143 p1 = PLGetDictionaryEntry(WindowMakerDB, key);
144 if (!p1)
145 continue;
146 /* The global doesn't have it, so no problem either. */
147 p2 = PLGetDictionaryEntry(GlobalDB, key);
148 if (!p2)
149 continue;
150 /* If both values are the same, don't save. */
151 if (PLIsEqual(p1, p2))
152 PLRemoveDictionaryEntry(WindowMakerDB, key);
154 /* puts(PLGetDescription(WindowMakerDB));*/
155 PLRelease(keyList);
156 /* puts("storing data");*/
158 PLSave(WindowMakerDB, YES);
162 static void
163 undo(WMWidget *w, void *data)
165 PanelRec *rec = (PanelRec*)WPrefs.currentPanel;
167 if (!rec)
168 return;
170 if (rec->callbacks.undoChanges
171 && (rec->callbacks.flags & INITIALIZED_PANEL)) {
172 (*rec->callbacks.undoChanges)(WPrefs.currentPanel);
177 static void
178 undoAll(WMWidget *w, void *data)
180 int i;
182 for (i=0; i<WPrefs.sectionCount; i++) {
183 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
185 if (rec->callbacks.undoChanges
186 && (rec->callbacks.flags & INITIALIZED_PANEL))
187 (*rec->callbacks.undoChanges)((Panel*)rec);
192 static void
193 createMainWindow(WMScreen *scr)
195 WMScroller *scroller;
196 WMFont *font;
197 char buffer[128];
199 WPrefs.win = WMCreateWindow(scr, "wprefs");
200 WMResizeWidget(WPrefs.win, 520, 390);
201 WMSetWindowTitle(WPrefs.win, _("Window Maker Preferences"));
202 WMSetWindowCloseAction(WPrefs.win, quit, NULL);
203 WMSetWindowMaxSize(WPrefs.win, 520, 390);
204 WMSetWindowMinSize(WPrefs.win, 520, 390);
205 WMSetWindowMiniwindowTitle(WPrefs.win, "Preferences");
206 WMSetWindowMiniwindowImage(WPrefs.win, WMGetApplicationIconImage(scr));
208 WPrefs.scrollV = WMCreateScrollView(WPrefs.win);
209 WMResizeWidget(WPrefs.scrollV, 500, 87);
210 WMMoveWidget(WPrefs.scrollV, 10, 10);
211 WMSetScrollViewRelief(WPrefs.scrollV, WRSunken);
212 WMSetScrollViewHasHorizontalScroller(WPrefs.scrollV, True);
213 WMSetScrollViewHasVerticalScroller(WPrefs.scrollV, False);
214 scroller = WMGetScrollViewHorizontalScroller(WPrefs.scrollV);
215 WMSetScrollerArrowsPosition(scroller, WSANone);
217 WPrefs.buttonF = WMCreateFrame(WPrefs.win);
218 WMSetFrameRelief(WPrefs.buttonF, WRFlat);
220 WMSetScrollViewContentView(WPrefs.scrollV, WMWidgetView(WPrefs.buttonF));
222 WPrefs.undosBtn = WMCreateCommandButton(WPrefs.win);
223 WMResizeWidget(WPrefs.undosBtn, 90, 28);
224 WMMoveWidget(WPrefs.undosBtn, 135, 350);
225 WMSetButtonText(WPrefs.undosBtn, _("Revert Page"));
226 WMSetButtonAction(WPrefs.undosBtn, undo, NULL);
228 WPrefs.undoBtn = WMCreateCommandButton(WPrefs.win);
229 WMResizeWidget(WPrefs.undoBtn, 90, 28);
230 WMMoveWidget(WPrefs.undoBtn, 235, 350);
231 WMSetButtonText(WPrefs.undoBtn, _("Revert All"));
232 WMSetButtonAction(WPrefs.undoBtn, undoAll, NULL);
234 WPrefs.saveBtn = WMCreateCommandButton(WPrefs.win);
235 WMResizeWidget(WPrefs.saveBtn, 80, 28);
236 WMMoveWidget(WPrefs.saveBtn, 335, 350);
237 WMSetButtonText(WPrefs.saveBtn, _("Save"));
238 WMSetButtonAction(WPrefs.saveBtn, save, NULL);
240 WPrefs.closeBtn = WMCreateCommandButton(WPrefs.win);
241 WMResizeWidget(WPrefs.closeBtn, 80, 28);
242 WMMoveWidget(WPrefs.closeBtn, 425, 350);
243 WMSetButtonText(WPrefs.closeBtn, _("Close"));
244 WMSetButtonAction(WPrefs.closeBtn, quit, NULL);
246 /* banner */
247 WPrefs.banner = WMCreateFrame(WPrefs.win);
248 WMResizeWidget(WPrefs.banner, FRAME_WIDTH, FRAME_HEIGHT);
249 WMMoveWidget(WPrefs.banner, FRAME_LEFT, FRAME_TOP);
250 WMSetFrameRelief(WPrefs.banner, WRFlat);
252 font = WMCreateFont(scr, "-*-times-bold-r-*-*-24-*-*-*-*-*-*-*");
253 if (!font)
254 font = WMBoldSystemFontOfSize(scr, 24);
255 WPrefs.nameL = WMCreateLabel(WPrefs.banner);
256 WMSetLabelTextAlignment(WPrefs.nameL, WACenter);
257 WMResizeWidget(WPrefs.nameL, FRAME_WIDTH-20, 30);
258 WMMoveWidget(WPrefs.nameL, 10, 25);
259 WMSetLabelFont(WPrefs.nameL, font);
260 WMSetLabelText(WPrefs.nameL, _("Window Maker Preferences Utility"));
261 WMReleaseFont(font);
263 WPrefs.versionL = WMCreateLabel(WPrefs.banner);
264 WMResizeWidget(WPrefs.versionL, FRAME_WIDTH-20, 20);
265 WMMoveWidget(WPrefs.versionL, 10, 65);
266 WMSetLabelTextAlignment(WPrefs.versionL, WACenter);
267 sprintf(buffer, _("Version %s for Window Maker %s"), WVERSION, WMVERSION);
268 WMSetLabelText(WPrefs.versionL, buffer);
270 WPrefs.statusL = WMCreateLabel(WPrefs.banner);
271 WMResizeWidget(WPrefs.statusL, FRAME_WIDTH-20, 60);
272 WMMoveWidget(WPrefs.statusL, 10, 100);
273 WMSetLabelTextAlignment(WPrefs.statusL, WACenter);
274 WMSetLabelText(WPrefs.statusL, _("Starting..."));
276 WPrefs.creditsL = WMCreateLabel(WPrefs.banner);
277 WMResizeWidget(WPrefs.creditsL, FRAME_WIDTH-20, 60);
278 WMMoveWidget(WPrefs.creditsL, 10, FRAME_HEIGHT-60);
279 WMSetLabelTextAlignment(WPrefs.creditsL, WACenter);
280 WMSetLabelText(WPrefs.creditsL, _("Programming/Design: Alfredo K. Kojima\n"
281 "Artwork: Marco van Hylckama Vlieg\n"
282 "More Programming: James Thompson"));
285 WMMapSubwidgets(WPrefs.win);
287 WMUnmapWidget(WPrefs.undosBtn);
288 WMUnmapWidget(WPrefs.undoBtn);
289 WMUnmapWidget(WPrefs.saveBtn);
293 static void
294 showPanel(Panel *panel)
296 PanelRec *rec = (PanelRec*)panel;
298 if (!(rec->callbacks.flags & INITIALIZED_PANEL)) {
299 (*rec->callbacks.createWidgets)(panel);
300 rec->callbacks.flags |= INITIALIZED_PANEL;
303 WMSetWindowTitle(WPrefs.win, rec->sectionName);
305 WMMapWidget(rec->frame);
310 static void
311 hidePanel(Panel *panel)
313 PanelRec *rec = (PanelRec*)panel;
315 WMUnmapWidget(rec->frame);
319 static void
320 savePanelData(Panel *panel)
322 PanelRec *rec = (PanelRec*)panel;
324 if (rec->callbacks.updateDomain) {
325 (*rec->callbacks.updateDomain)(panel);
330 static void
331 changeSection(WMWidget *self, void *data)
333 if (WPrefs.banner) {
334 WMDestroyWidget(WPrefs.banner);
335 WPrefs.banner = NULL;
336 /* WMMapWidget(WPrefs.undosBtn);
337 WMMapWidget(WPrefs.undoBtn);
339 WMMapWidget(WPrefs.saveBtn);
342 showPanel(data);
344 if (WPrefs.currentPanel)
345 hidePanel(WPrefs.currentPanel);
346 WPrefs.currentPanel = data;
353 char*
354 LocateImage(char *name)
356 char *path;
357 char *tmp = wmalloc(strlen(name)+8);
359 if (TIFFOK) {
360 sprintf(tmp, "%s.tiff", name);
361 path = WMPathForResourceOfType(tmp, "tiff");
362 } else {
363 sprintf(tmp, "%s.xpm", name);
364 path = WMPathForResourceOfType(tmp, "xpm");
366 free(tmp);
367 if (!path) {
368 wwarning(_("could not locate image file %s\n"), name);
371 return path;
375 void
376 AddSection(Panel *panel, char *iconFile)
378 WMButton *bPtr;
379 WMPixmap *icon;
380 RColor color;
381 char *iconPath;
383 assert(WPrefs.sectionCount < MAX_SECTIONS);
385 iconPath = LocateImage(iconFile);
387 bPtr = WMCreateCustomButton(WPrefs.buttonF, WBBStateLightMask
388 |WBBStateChangeMask);
389 WMResizeWidget(bPtr, 64, 64);
390 WMMoveWidget(bPtr, WPrefs.sectionCount*64, 0);
391 WMSetButtonImagePosition(bPtr, WIPImageOnly);
392 WMSetButtonAction(bPtr, changeSection, panel);
393 WMHangData(bPtr, panel);
395 color.red = 0xae;
396 color.green = 0xaa;
397 color.blue = 0xae;
398 color.alpha = 0;
399 if (iconPath) {
400 icon = WMCreateBlendedPixmapFromFile(WMWidgetScreen(WPrefs.win),
401 iconPath, &color);
402 if (!icon)
403 wwarning(_("could not load icon file %s"), iconPath);
404 } else {
405 icon = NULL;
408 WMSetButtonImage(bPtr, icon);
410 if (icon)
411 WMReleasePixmap(icon);
413 color.red = 0xff;
414 color.green = 0xff;
415 color.blue = 0xff;
416 color.alpha = 0;
417 if (iconPath) {
418 icon = WMCreateBlendedPixmapFromFile(WMWidgetScreen(WPrefs.win),
419 iconPath, &color);
420 if (!icon)
421 wwarning(_("could not load icon file %s"), iconPath);
422 } else {
423 icon = NULL;
426 WMSetButtonAltImage(bPtr, icon);
428 if (icon)
429 WMReleasePixmap(icon);
431 WMMapWidget(bPtr);
433 WPrefs.sectionB[WPrefs.sectionCount] = bPtr;
435 if (WPrefs.sectionCount > 0) {
436 WMGroupButtons(WPrefs.sectionB[0], bPtr);
439 WPrefs.sectionCount++;
441 WMResizeWidget(WPrefs.buttonF, WPrefs.sectionCount*64, 64);
443 free(iconPath);
447 void
448 Initialize(WMScreen *scr)
450 char **list;
451 int i;
452 char *path;
453 WMPixmap *icon;
456 list = RSupportedFileFormats();
457 for (i=0; list[i]!=NULL; i++) {
458 if (strcmp(list[i], "TIFF")==0) {
459 TIFFOK = True;
460 break;
464 if (TIFFOK)
465 path = WMPathForResourceOfType("WPrefs.tiff", NULL);
466 else
467 path = WMPathForResourceOfType("WPrefs.xpm", NULL);
468 if (path) {
469 RImage *tmp;
471 tmp = RLoadImage(WMScreenRContext(scr), path, 0);
472 if (!tmp) {
473 wwarning(_("could not load image file %s:%s"), path,
474 RMessageForError(RErrorCode));
475 } else {
476 icon = WMCreatePixmapFromRImage(scr, tmp, 0);
477 RDestroyImage(tmp);
478 if (icon) {
479 WMSetApplicationIconImage(scr, icon);
480 WMReleasePixmap(icon);
483 free(path);
486 memset(&WPrefs, 0, sizeof(_WPrefs));
487 createMainWindow(scr);
489 WMRealizeWidget(WPrefs.win);
490 WMMapWidget(WPrefs.win);
491 XFlush(WMScreenDisplay(scr));
492 WMSetLabelText(WPrefs.statusL, _("Loading Window Maker configuration files..."));
493 XFlush(WMScreenDisplay(scr));
494 loadConfigurations(scr, WPrefs.win);
496 WMSetLabelText(WPrefs.statusL, _("Initializing configuration panels..."));
497 #if 1
498 InitWindowHandling(scr, WPrefs.win);
499 InitFocus(scr, WPrefs.win);
500 InitMenuPreferences(scr, WPrefs.win);
501 InitIcons(scr, WPrefs.win);
502 InitPreferences(scr, WPrefs.win);
504 InitPaths(scr, WPrefs.win);
505 InitWorkspace(scr, WPrefs.win);
506 InitConfigurations(scr, WPrefs.win);
507 #endif
508 InitMenu(scr, WPrefs.win);
509 #if 1
510 #ifdef not_yet_fully_implemented
511 InitKeyboardSettings(scr, WPrefs.win);
512 #endif
513 InitKeyboardShortcuts(scr, WPrefs.win);
514 InitMouseSettings(scr, WPrefs.win);
516 #ifdef not_yet_fully_implemented
517 InitAppearance(scr, WPrefs.win);
518 InitText(scr, WPrefs.win);
519 InitThemes(scr, WPrefs.win);
520 #endif
521 InitExpert(scr, WPrefs.win);
522 #endif
523 WMRealizeWidget(WPrefs.scrollV);
525 WMSetLabelText(WPrefs.statusL,
526 _("WPrefs is free software and is distributed WITHOUT ANY\n"
527 "WARRANTY under the terms of the GNU General Public License.\n"
528 "The icons in this program are licensed through the\n"
529 "OpenContent License."));
533 WMWindow*
534 GetWindow(Panel *panel)
536 return WPrefs.win;
540 static void
541 loadConfigurations(WMScreen *scr, WMWindow *mainw)
543 proplist_t db, gdb;
544 char *path;
545 FILE *file;
546 char buffer[1024];
547 char mbuf[1024];
548 int v1, v2, v3;
550 path = wdefaultspathfordomain("WindowMaker");
552 db = PLGetProplistWithPath(path);
553 if (db) {
554 if (!PLIsDictionary(db)) {
555 PLRelease(db);
556 db = NULL;
557 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), path);
558 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
560 } else {
561 sprintf(mbuf, _("Could not load Window Maker domain (%s) from defaults database."),
562 path);
563 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
565 free(path);
567 file = popen("wmaker --version", "r");
568 if (!file || !fgets(buffer, 1023, file)) {
569 wsyserror(_("could not extract version information from Window Maker"));
570 wfatal(_("Make sure wmaker is in your search path."));
572 WMRunAlertPanel(scr, mainw, _("Error"),
573 _("Could not extract version from Window Maker. Make sure it is correctly installed and is in your PATH environment variable."),
574 _("OK"), NULL, NULL);
575 exit(1);
577 if (file)
578 pclose(file);
580 if (sscanf(buffer, "Window Maker %i.%i.%i",&v1,&v2,&v3)!=3
581 && sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) {
582 WMRunAlertPanel(scr, mainw, _("Error"),
583 _("Could not extract version from Window Maker. "
584 "Make sure it is correctly installed and the path "
585 "where it installed is in the PATH environment "
586 "variable."), _("OK"), NULL, NULL);
587 exit(1);
589 if (v1 == 0 && (v2 < 18 || v3 < 0)) {
590 sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
591 "The version installed is %i.%i.%i\n"), v1, v2, v3);
592 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
593 exit(1);
596 if (v1 > 1 || (v1 == 1 && (v2 > 0))) {
597 sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
598 v1, v2, v3);
599 WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL);
602 file = popen("wmaker --global_defaults_path", "r");
603 if (!file || !fgets(buffer, 1023, file)) {
604 wsyserror(_("could not run \"wmaker --global_defaults_path\"."));
605 exit(1);
606 } else {
607 char *ptr;
608 ptr = strchr(buffer, '\n');
609 if (ptr)
610 *ptr = 0;
611 strcat(buffer, "/WindowMaker");
614 if (file)
615 pclose(file);
617 gdb = PLGetProplistWithPath(buffer);
618 if (gdb) {
619 if (!PLIsDictionary(gdb)) {
620 PLRelease(gdb);
621 gdb = NULL;
622 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer);
623 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
625 } else {
626 sprintf(mbuf, _("Could not load global Window Maker domain (%s)."),
627 buffer);
628 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
631 if (!db) {
632 db = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
634 if (!gdb) {
635 gdb = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
638 GlobalDB = gdb;
640 WindowMakerDB = db;
644 proplist_t
645 GetObjectForKey(char *defaultName)
647 proplist_t object = NULL;
648 proplist_t key = PLMakeString(defaultName);
650 object = PLGetDictionaryEntry(WindowMakerDB, key);
651 if (!object)
652 object = PLGetDictionaryEntry(GlobalDB, key);
654 PLRelease(key);
656 return object;
660 void
661 SetObjectForKey(proplist_t object, char *defaultName)
663 proplist_t key = PLMakeString(defaultName);
665 PLInsertDictionaryEntry(WindowMakerDB, key, object);
666 PLRelease(key);
670 void
671 RemoveObjectForKey(char *defaultName)
673 proplist_t key = PLMakeString(defaultName);
675 PLRemoveDictionaryEntry(WindowMakerDB, key);
677 PLRelease(key);
681 char*
682 GetStringForKey(char *defaultName)
684 proplist_t val;
686 val = GetObjectForKey(defaultName);
688 if (!val)
689 return NULL;
691 if (!PLIsString(val))
692 return NULL;
694 return PLGetString(val);
699 proplist_t
700 GetArrayForKey(char *defaultName)
702 proplist_t val;
704 val = GetObjectForKey(defaultName);
706 if (!val)
707 return NULL;
709 if (!PLIsArray(val))
710 return NULL;
712 return val;
716 proplist_t
717 GetDictionaryForKey(char *defaultName)
719 proplist_t val;
721 val = GetObjectForKey(defaultName);
723 if (!val)
724 return NULL;
726 if (!PLIsDictionary(val))
727 return NULL;
729 return val;
734 GetIntegerForKey(char *defaultName)
736 proplist_t val;
737 char *str;
738 int value;
740 val = GetObjectForKey(defaultName);
742 if (!val)
743 return 0;
745 if (!PLIsString(val))
746 return 0;
748 str = PLGetString(val);
749 if (!str)
750 return 0;
752 if (sscanf(str, "%i", &value)!=1)
753 return 0;
755 return value;
759 Bool
760 GetBoolForKey(char *defaultName)
762 int value;
763 char *str;
765 str = GetStringForKey(defaultName);
767 if (!str)
768 return False;
770 if (sscanf(str, "%i", &value)==1 && value!=0)
771 return True;
773 if (strcasecmp(str, "YES")==0)
774 return True;
776 if (strcasecmp(str, "Y")==0)
777 return True;
779 return False;
783 void
784 SetIntegerForKey(int value, char *defaultName)
786 proplist_t object;
787 char buffer[128];
789 sprintf(buffer, "%i", value);
790 object = PLMakeString(buffer);
792 SetObjectForKey(object, defaultName);
793 PLRelease(object);
798 void
799 SetStringForKey(char *value, char *defaultName)
801 proplist_t object;
803 object = PLMakeString(value);
805 SetObjectForKey(object, defaultName);
806 PLRelease(object);
810 void
811 SetBoolForKey(Bool value, char *defaultName)
813 static proplist_t yes = NULL, no = NULL;
815 if (!yes) {
816 yes = PLMakeString("YES");
817 no = PLMakeString("NO");
820 SetObjectForKey(value ? yes : no, defaultName);
824 void
825 SetSpeedForKey(int speed, char *defaultName)
827 char *str;
829 switch (speed) {
830 case 0:
831 str = "ultraslow";
832 break;
833 case 1:
834 str = "slow";
835 break;
836 case 2:
837 str = "medium";
838 break;
839 case 3:
840 str = "fast";
841 break;
842 case 4:
843 str = "ultrafast";
844 break;
845 default:
846 str = NULL;
849 if (str)
850 SetStringForKey(str, defaultName);
855 GetSpeedForKey(char *defaultName)
857 char *str;
858 int i;
860 str = GetStringForKey(defaultName);
861 if (!str)
862 return 2;
864 if (strcasecmp(str, "ultraslow")==0)
865 i = 0;
866 else if (strcasecmp(str, "slow")==0)
867 i = 1;
868 else if (strcasecmp(str, "medium")==0)
869 i = 2;
870 else if (strcasecmp(str, "fast")==0)
871 i = 3;
872 else if (strcasecmp(str, "ultrafast")==0)
873 i = 4;
874 else {
875 wwarning(_("bad speed value for option %s\n. Using default Medium"),
876 defaultName);
877 i = 2;
879 return i;