Update to Window Maker 0.50.2
[wmaker-crm.git] / WPrefs.app / WPrefs.c
blobc68a5efe46020ba87c8076a5e0d7426a1d22a898
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;
463 RFreeStringList(list);
465 if (TIFFOK)
466 path = WMPathForResourceOfType("WPrefs.tiff", NULL);
467 else
468 path = WMPathForResourceOfType("WPrefs.xpm", NULL);
469 if (path) {
470 RImage *tmp;
472 tmp = RLoadImage(WMScreenRContext(scr), path, 0);
473 if (!tmp) {
474 wwarning(_("could not load image file %s:%s"), path,
475 RMessageForError(RErrorCode));
476 } else {
477 icon = WMCreatePixmapFromRImage(scr, tmp, 0);
478 RDestroyImage(tmp);
479 if (icon) {
480 WMSetApplicationIconImage(scr, icon);
481 WMReleasePixmap(icon);
484 free(path);
487 memset(&WPrefs, 0, sizeof(_WPrefs));
488 createMainWindow(scr);
490 WMRealizeWidget(WPrefs.win);
491 WMMapWidget(WPrefs.win);
492 XFlush(WMScreenDisplay(scr));
493 WMSetLabelText(WPrefs.statusL, _("Loading Window Maker configuration files..."));
494 XFlush(WMScreenDisplay(scr));
495 loadConfigurations(scr, WPrefs.win);
497 WMSetLabelText(WPrefs.statusL, _("Initializing configuration panels..."));
499 InitWindowHandling(scr, WPrefs.win);
500 InitFocus(scr, WPrefs.win);
501 InitMenuPreferences(scr, WPrefs.win);
502 InitIcons(scr, WPrefs.win);
503 InitPreferences(scr, WPrefs.win);
505 InitPaths(scr, WPrefs.win);
506 InitWorkspace(scr, WPrefs.win);
507 InitConfigurations(scr, WPrefs.win);
508 InitMenu(scr, WPrefs.win);
509 #ifdef not_yet_fully_implemented
510 InitKeyboardSettings(scr, WPrefs.win);
511 #endif
512 InitKeyboardShortcuts(scr, WPrefs.win);
513 InitMouseSettings(scr, WPrefs.win);
515 #ifdef not_yet_fully_implemented
516 InitAppearance(scr, WPrefs.win);
517 InitText(scr, WPrefs.win);
518 InitThemes(scr, WPrefs.win);
519 #endif
520 InitExpert(scr, WPrefs.win);
522 WMRealizeWidget(WPrefs.scrollV);
524 WMSetLabelText(WPrefs.statusL,
525 _("WPrefs is free software and is distributed WITHOUT ANY "
526 "WARRANTY under the terms of the GNU General Public License. "
527 "Redistribution of the icons in this program separately "
528 "from the program is prohibited."));
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. Make sure it is correctly installed."),
584 _("OK"), NULL, NULL);
585 exit(1);
587 if (v1 == 0 && (v2 < 18 || v3 < 0)) {
588 sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
589 "The version installed is %i.%i.%i\n"), v1, v2, v3);
590 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
591 exit(1);
594 if (v1 > 1 || (v1 == 1 && (v2 > 0))) {
595 sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
596 v1, v2, v3);
597 WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL);
600 file = popen("wmaker -global_defaults_path", "r");
601 if (!file || !fgets(buffer, 1023, file)) {
602 wsyserror(_("could not run \"wmaker -global_defaults_path\"."));
603 exit(1);
605 if (file)
606 pclose(file);
608 gdb = PLGetProplistWithPath(buffer);
609 if (gdb) {
610 if (!PLIsDictionary(gdb)) {
611 PLRelease(gdb);
612 gdb = NULL;
613 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer);
614 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
616 } else {
617 sprintf(mbuf, _("Could not load global Window Maker domain (%s)."),
618 buffer);
619 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
622 if (!db) {
623 db = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
625 if (!gdb) {
626 gdb = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
629 GlobalDB = gdb;
631 WindowMakerDB = db;
635 proplist_t
636 GetObjectForKey(char *defaultName)
638 proplist_t object = NULL;
639 proplist_t key = PLMakeString(defaultName);
641 object = PLGetDictionaryEntry(WindowMakerDB, key);
642 if (!object)
643 object = PLGetDictionaryEntry(GlobalDB, key);
645 PLRelease(key);
647 return object;
651 void
652 SetObjectForKey(proplist_t object, char *defaultName)
654 proplist_t key = PLMakeString(defaultName);
656 PLInsertDictionaryEntry(WindowMakerDB, key, object);
657 PLRelease(key);
661 void
662 RemoveObjectForKey(char *defaultName)
664 proplist_t key = PLMakeString(defaultName);
666 PLRemoveDictionaryEntry(WindowMakerDB, key);
668 PLRelease(key);
672 char*
673 GetStringForKey(char *defaultName)
675 proplist_t val;
677 val = GetObjectForKey(defaultName);
679 if (!val)
680 return NULL;
682 if (!PLIsString(val))
683 return NULL;
685 return PLGetString(val);
690 proplist_t
691 GetArrayForKey(char *defaultName)
693 proplist_t val;
695 val = GetObjectForKey(defaultName);
697 if (!val)
698 return NULL;
700 if (!PLIsArray(val))
701 return NULL;
703 return val;
707 proplist_t
708 GetDictionaryForKey(char *defaultName)
710 proplist_t val;
712 val = GetObjectForKey(defaultName);
714 if (!val)
715 return NULL;
717 if (!PLIsDictionary(val))
718 return NULL;
720 return val;
725 GetIntegerForKey(char *defaultName)
727 proplist_t val;
728 char *str;
729 int value;
731 val = GetObjectForKey(defaultName);
733 if (!val)
734 return 0;
736 if (!PLIsString(val))
737 return 0;
739 str = PLGetString(val);
740 if (!str)
741 return 0;
743 if (sscanf(str, "%i", &value)!=1)
744 return 0;
746 return value;
750 Bool
751 GetBoolForKey(char *defaultName)
753 int value;
754 char *str;
756 str = GetStringForKey(defaultName);
758 if (!str)
759 return False;
761 if (sscanf(str, "%i", &value)==1 && value!=0)
762 return True;
764 if (strcasecmp(str, "YES")==0)
765 return True;
767 if (strcasecmp(str, "Y")==0)
768 return True;
770 return False;
774 void
775 SetIntegerForKey(int value, char *defaultName)
777 proplist_t object;
778 char buffer[128];
780 sprintf(buffer, "%i", value);
781 object = PLMakeString(buffer);
783 SetObjectForKey(object, defaultName);
784 PLRelease(object);
789 void
790 SetStringForKey(char *value, char *defaultName)
792 proplist_t object;
794 object = PLMakeString(value);
796 SetObjectForKey(object, defaultName);
797 PLRelease(object);
801 void
802 SetBoolForKey(Bool value, char *defaultName)
804 static proplist_t yes = NULL, no = NULL;
806 if (!yes) {
807 yes = PLMakeString("YES");
808 no = PLMakeString("NO");
811 SetObjectForKey(value ? yes : no, defaultName);
815 void
816 SetSpeedForKey(int speed, char *defaultName)
818 char *str;
820 switch (speed) {
821 case 0:
822 str = "ultraslow";
823 break;
824 case 1:
825 str = "slow";
826 break;
827 case 2:
828 str = "medium";
829 break;
830 case 3:
831 str = "fast";
832 break;
833 case 4:
834 str = "ultrafast";
835 break;
836 default:
837 str = NULL;
840 if (str)
841 SetStringForKey(str, defaultName);
846 GetSpeedForKey(char *defaultName)
848 char *str;
849 int i;
851 str = GetStringForKey(defaultName);
852 if (strcasecmp(str, "ultraslow")==0)
853 i = 0;
854 else if (strcasecmp(str, "slow")==0)
855 i = 1;
856 else if (strcasecmp(str, "medium")==0)
857 i = 2;
858 else if (strcasecmp(str, "fast")==0)
859 i = 3;
860 else if (strcasecmp(str, "ultrafast")==0)
861 i = 4;
862 else {
863 wwarning(_("bad speed value for option %s\n. Using default Medium"),
864 defaultName);
865 i = 2;
867 return i;