new/changelog fix
[wmaker-crm.git] / WPrefs.app / WPrefs.c
blob74d4654c403e81baf61a9bda13325717679b0290
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);
109 static void prepareForClose();
111 void
112 quit(WMWidget *w, void *data)
114 prepareForClose();
116 exit(0);
120 static void
121 save(WMWidget *w, void *data)
123 int i;
124 proplist_t p1, p2;
125 proplist_t keyList;
126 proplist_t key;
127 char *msg = "Reconfigure";
128 XEvent ev;
131 /* puts("gathering data");*/
132 for (i=0; i<WPrefs.sectionCount; i++) {
133 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
134 if ((rec->callbacks.flags & INITIALIZED_PANEL))
135 savePanelData((Panel*)rec);
137 /* puts("compressing data");*/
138 /* compare the user dictionary with the global and remove redundant data */
139 keyList = PLGetAllDictionaryKeys(GlobalDB);
140 /* puts(PLGetDescription(WindowMakerDB));*/
141 for (i=0; i<PLGetNumberOfElements(keyList); i++) {
142 key = PLGetArrayElement(keyList, i);
144 /* We don't have this value anyway, so no problem.
145 * Probably a new option */
146 p1 = PLGetDictionaryEntry(WindowMakerDB, key);
147 if (!p1)
148 continue;
149 /* The global doesn't have it, so no problem either. */
150 p2 = PLGetDictionaryEntry(GlobalDB, key);
151 if (!p2)
152 continue;
153 /* If both values are the same, don't save. */
154 if (PLIsEqual(p1, p2))
155 PLRemoveDictionaryEntry(WindowMakerDB, key);
157 /* puts(PLGetDescription(WindowMakerDB));*/
158 PLRelease(keyList);
159 /* puts("storing data");*/
161 PLSave(WindowMakerDB, YES);
164 memset(&ev, 0, sizeof(XEvent));
166 ev.xclient.type = ClientMessage;
167 ev.xclient.message_type = XInternAtom(WMScreenDisplay(WMWidgetScreen(w)),
168 "_WINDOWMAKER_COMMAND", False);
169 ev.xclient.window = DefaultRootWindow(WMScreenDisplay(WMWidgetScreen(w)));
170 ev.xclient.format = 8;
172 for (i = 0; i <= strlen(msg); i++) {
173 ev.xclient.data.b[i] = msg[i];
175 XSendEvent(WMScreenDisplay(WMWidgetScreen(w)),
176 DefaultRootWindow(WMScreenDisplay(WMWidgetScreen(w))),
177 False, SubstructureRedirectMask, &ev);
178 XFlush(WMScreenDisplay(WMWidgetScreen(w)));
183 static void
184 undo(WMWidget *w, void *data)
186 PanelRec *rec = (PanelRec*)WPrefs.currentPanel;
188 if (!rec)
189 return;
191 if (rec->callbacks.undoChanges
192 && (rec->callbacks.flags & INITIALIZED_PANEL)) {
193 (*rec->callbacks.undoChanges)(WPrefs.currentPanel);
198 static void
199 undoAll(WMWidget *w, void *data)
201 int i;
203 for (i=0; i<WPrefs.sectionCount; i++) {
204 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
206 if (rec->callbacks.undoChanges
207 && (rec->callbacks.flags & INITIALIZED_PANEL))
208 (*rec->callbacks.undoChanges)((Panel*)rec);
214 static void
215 prepareForClose()
217 int i;
219 for (i=0; i<WPrefs.sectionCount; i++) {
220 PanelRec *rec = WMGetHangedData(WPrefs.sectionB[i]);
222 if (rec->callbacks.prepareForClose
223 && (rec->callbacks.flags & INITIALIZED_PANEL))
224 (*rec->callbacks.prepareForClose)((Panel*)rec);
230 static void
231 createMainWindow(WMScreen *scr)
233 WMScroller *scroller;
234 WMFont *font;
235 char buffer[128];
237 WPrefs.win = WMCreateWindow(scr, "wprefs");
238 WMResizeWidget(WPrefs.win, 520, 390);
239 WMSetWindowTitle(WPrefs.win, _("Window Maker Preferences"));
240 WMSetWindowCloseAction(WPrefs.win, quit, NULL);
241 WMSetWindowMaxSize(WPrefs.win, 520, 390);
242 WMSetWindowMinSize(WPrefs.win, 520, 390);
243 WMSetWindowMiniwindowTitle(WPrefs.win, "Preferences");
244 WMSetWindowMiniwindowImage(WPrefs.win, WMGetApplicationIconImage(scr));
246 WPrefs.scrollV = WMCreateScrollView(WPrefs.win);
247 WMResizeWidget(WPrefs.scrollV, 500, 87);
248 WMMoveWidget(WPrefs.scrollV, 10, 10);
249 WMSetScrollViewRelief(WPrefs.scrollV, WRSunken);
250 WMSetScrollViewHasHorizontalScroller(WPrefs.scrollV, True);
251 WMSetScrollViewHasVerticalScroller(WPrefs.scrollV, False);
252 scroller = WMGetScrollViewHorizontalScroller(WPrefs.scrollV);
253 WMSetScrollerArrowsPosition(scroller, WSANone);
255 WPrefs.buttonF = WMCreateFrame(WPrefs.win);
256 WMSetFrameRelief(WPrefs.buttonF, WRFlat);
258 WMSetScrollViewContentView(WPrefs.scrollV, WMWidgetView(WPrefs.buttonF));
260 WPrefs.undosBtn = WMCreateCommandButton(WPrefs.win);
261 WMResizeWidget(WPrefs.undosBtn, 90, 28);
262 WMMoveWidget(WPrefs.undosBtn, 135, 350);
263 WMSetButtonText(WPrefs.undosBtn, _("Revert Page"));
264 WMSetButtonAction(WPrefs.undosBtn, undo, NULL);
266 WPrefs.undoBtn = WMCreateCommandButton(WPrefs.win);
267 WMResizeWidget(WPrefs.undoBtn, 90, 28);
268 WMMoveWidget(WPrefs.undoBtn, 235, 350);
269 WMSetButtonText(WPrefs.undoBtn, _("Revert All"));
270 WMSetButtonAction(WPrefs.undoBtn, undoAll, NULL);
272 WPrefs.saveBtn = WMCreateCommandButton(WPrefs.win);
273 WMResizeWidget(WPrefs.saveBtn, 80, 28);
274 WMMoveWidget(WPrefs.saveBtn, 335, 350);
275 WMSetButtonText(WPrefs.saveBtn, _("Save"));
276 WMSetButtonAction(WPrefs.saveBtn, save, NULL);
278 WPrefs.closeBtn = WMCreateCommandButton(WPrefs.win);
279 WMResizeWidget(WPrefs.closeBtn, 80, 28);
280 WMMoveWidget(WPrefs.closeBtn, 425, 350);
281 WMSetButtonText(WPrefs.closeBtn, _("Close"));
282 WMSetButtonAction(WPrefs.closeBtn, quit, NULL);
284 /* banner */
285 WPrefs.banner = WMCreateFrame(WPrefs.win);
286 WMResizeWidget(WPrefs.banner, FRAME_WIDTH, FRAME_HEIGHT);
287 WMMoveWidget(WPrefs.banner, FRAME_LEFT, FRAME_TOP);
288 WMSetFrameRelief(WPrefs.banner, WRFlat);
290 font = WMCreateFont(scr, "-*-times-bold-r-*-*-24-*-*-*-*-*-*-*,"
291 "-*-fixed-medium-r-normal-*-24-*");
292 if (!font)
293 font = WMBoldSystemFontOfSize(scr, 24);
294 WPrefs.nameL = WMCreateLabel(WPrefs.banner);
295 WMSetLabelTextAlignment(WPrefs.nameL, WACenter);
296 WMResizeWidget(WPrefs.nameL, FRAME_WIDTH-20, 30);
297 WMMoveWidget(WPrefs.nameL, 10, 25);
298 WMSetLabelFont(WPrefs.nameL, font);
299 WMSetLabelText(WPrefs.nameL, _("Window Maker Preferences Utility"));
300 WMReleaseFont(font);
302 WPrefs.versionL = WMCreateLabel(WPrefs.banner);
303 WMResizeWidget(WPrefs.versionL, FRAME_WIDTH-20, 20);
304 WMMoveWidget(WPrefs.versionL, 10, 65);
305 WMSetLabelTextAlignment(WPrefs.versionL, WACenter);
306 sprintf(buffer, _("Version %s for Window Maker %s"), WVERSION, WMVERSION);
307 WMSetLabelText(WPrefs.versionL, buffer);
309 WPrefs.statusL = WMCreateLabel(WPrefs.banner);
310 WMResizeWidget(WPrefs.statusL, FRAME_WIDTH-20, 60);
311 WMMoveWidget(WPrefs.statusL, 10, 100);
312 WMSetLabelTextAlignment(WPrefs.statusL, WACenter);
313 WMSetLabelText(WPrefs.statusL, _("Starting..."));
315 WPrefs.creditsL = WMCreateLabel(WPrefs.banner);
316 WMResizeWidget(WPrefs.creditsL, FRAME_WIDTH-20, 60);
317 WMMoveWidget(WPrefs.creditsL, 10, FRAME_HEIGHT-60);
318 WMSetLabelTextAlignment(WPrefs.creditsL, WACenter);
319 WMSetLabelText(WPrefs.creditsL, _("Programming/Design: Alfredo K. Kojima\n"
320 "Artwork: Marco van Hylckama Vlieg\n"
321 "More Programming: James Thompson"));
324 WMMapSubwidgets(WPrefs.win);
326 WMUnmapWidget(WPrefs.undosBtn);
327 WMUnmapWidget(WPrefs.undoBtn);
328 WMUnmapWidget(WPrefs.saveBtn);
332 static void
333 showPanel(Panel *panel)
335 PanelRec *rec = (PanelRec*)panel;
337 if (!(rec->callbacks.flags & INITIALIZED_PANEL)) {
338 (*rec->callbacks.createWidgets)(panel);
339 rec->callbacks.flags |= INITIALIZED_PANEL;
342 WMSetWindowTitle(WPrefs.win, rec->sectionName);
344 WMMapWidget(rec->frame);
349 static void
350 hidePanel(Panel *panel)
352 PanelRec *rec = (PanelRec*)panel;
354 WMUnmapWidget(rec->frame);
358 static void
359 savePanelData(Panel *panel)
361 PanelRec *rec = (PanelRec*)panel;
363 if (rec->callbacks.updateDomain) {
364 (*rec->callbacks.updateDomain)(panel);
369 static void
370 changeSection(WMWidget *self, void *data)
372 if (WPrefs.banner) {
373 WMDestroyWidget(WPrefs.banner);
374 WPrefs.banner = NULL;
375 /* WMMapWidget(WPrefs.undosBtn);
376 WMMapWidget(WPrefs.undoBtn);
378 WMMapWidget(WPrefs.saveBtn);
381 showPanel(data);
383 if (WPrefs.currentPanel)
384 hidePanel(WPrefs.currentPanel);
385 WPrefs.currentPanel = data;
392 char*
393 LocateImage(char *name)
395 char *path;
396 char *tmp = wmalloc(strlen(name)+8);
398 if (TIFFOK) {
399 sprintf(tmp, "%s.tiff", name);
400 path = WMPathForResourceOfType(tmp, "tiff");
401 } else {
402 sprintf(tmp, "%s.xpm", name);
403 path = WMPathForResourceOfType(tmp, "xpm");
405 free(tmp);
406 if (!path) {
407 wwarning(_("could not locate image file %s\n"), name);
410 return path;
414 void
415 SetButtonAlphaImage(WMScreen *scr, WMButton *bPtr, char *file)
417 WMPixmap *icon;
418 RColor color;
419 char *iconPath;
421 iconPath = LocateImage(file);
423 color.red = 0xae;
424 color.green = 0xaa;
425 color.blue = 0xae;
426 color.alpha = 0;
427 if (iconPath) {
428 icon = WMCreateBlendedPixmapFromFile(scr, iconPath, &color);
429 if (!icon)
430 wwarning(_("could not load icon file %s"), iconPath);
431 } else {
432 icon = NULL;
435 WMSetButtonImage(bPtr, icon);
437 if (icon)
438 WMReleasePixmap(icon);
440 color.red = 0xff;
441 color.green = 0xff;
442 color.blue = 0xff;
443 color.alpha = 0;
444 if (iconPath) {
445 icon = WMCreateBlendedPixmapFromFile(scr, iconPath, &color);
446 if (!icon)
447 wwarning(_("could not load icon file %s"), iconPath);
448 } else {
449 icon = NULL;
452 WMSetButtonAltImage(bPtr, icon);
454 if (icon)
455 WMReleasePixmap(icon);
457 if (iconPath)
458 free(iconPath);
462 void
463 AddSection(Panel *panel, char *iconFile)
465 WMButton *bPtr;
467 assert(WPrefs.sectionCount < MAX_SECTIONS);
470 bPtr = WMCreateCustomButton(WPrefs.buttonF, WBBStateLightMask
471 |WBBStateChangeMask);
472 WMResizeWidget(bPtr, 64, 64);
473 WMMoveWidget(bPtr, WPrefs.sectionCount*64, 0);
474 WMSetButtonImagePosition(bPtr, WIPImageOnly);
475 WMSetButtonAction(bPtr, changeSection, panel);
476 WMHangData(bPtr, panel);
478 SetButtonAlphaImage(WMWidgetScreen(bPtr), bPtr, iconFile);
480 WMMapWidget(bPtr);
482 WPrefs.sectionB[WPrefs.sectionCount] = bPtr;
484 if (WPrefs.sectionCount > 0) {
485 WMGroupButtons(WPrefs.sectionB[0], bPtr);
488 WPrefs.sectionCount++;
490 WMResizeWidget(WPrefs.buttonF, WPrefs.sectionCount*64, 64);
494 void
495 Initialize(WMScreen *scr)
497 char **list;
498 int i;
499 char *path;
500 WMPixmap *icon;
503 list = RSupportedFileFormats();
504 for (i=0; list[i]!=NULL; i++) {
505 if (strcmp(list[i], "TIFF")==0) {
506 TIFFOK = True;
507 break;
511 if (TIFFOK)
512 path = WMPathForResourceOfType("WPrefs.tiff", NULL);
513 else
514 path = WMPathForResourceOfType("WPrefs.xpm", NULL);
515 if (path) {
516 RImage *tmp;
518 tmp = RLoadImage(WMScreenRContext(scr), path, 0);
519 if (!tmp) {
520 wwarning(_("could not load image file %s:%s"), path,
521 RMessageForError(RErrorCode));
522 } else {
523 icon = WMCreatePixmapFromRImage(scr, tmp, 0);
524 RDestroyImage(tmp);
525 if (icon) {
526 WMSetApplicationIconImage(scr, icon);
527 WMReleasePixmap(icon);
530 free(path);
533 memset(&WPrefs, 0, sizeof(_WPrefs));
534 createMainWindow(scr);
536 WMRealizeWidget(WPrefs.win);
537 WMMapWidget(WPrefs.win);
538 XFlush(WMScreenDisplay(scr));
539 WMSetLabelText(WPrefs.statusL, _("Loading Window Maker configuration files..."));
540 XFlush(WMScreenDisplay(scr));
541 loadConfigurations(scr, WPrefs.win);
543 WMSetLabelText(WPrefs.statusL, _("Initializing configuration panels..."));
545 InitWindowHandling(scr, WPrefs.win);
546 InitFocus(scr, WPrefs.win);
547 InitMenuPreferences(scr, WPrefs.win);
548 InitIcons(scr, WPrefs.win);
549 InitPreferences(scr, WPrefs.win);
551 InitPaths(scr, WPrefs.win);
552 InitWorkspace(scr, WPrefs.win);
553 InitConfigurations(scr, WPrefs.win);
555 InitMenu(scr, WPrefs.win);
557 #ifdef not_yet_fully_implemented
558 InitKeyboardSettings(scr, WPrefs.win);
559 #endif
560 InitKeyboardShortcuts(scr, WPrefs.win);
561 InitMouseSettings(scr, WPrefs.win);
563 InitAppearance(scr, WPrefs.win);
564 #ifdef not_yet_fully_implemented
566 InitText(scr, WPrefs.win);
567 InitThemes(scr, WPrefs.win);
568 #endif
569 InitExpert(scr, WPrefs.win);
571 WMRealizeWidget(WPrefs.scrollV);
573 WMSetLabelText(WPrefs.statusL,
574 _("WPrefs is free software and is distributed WITHOUT ANY\n"
575 "WARRANTY under the terms of the GNU General Public License.\n"
576 "The icons in this program are licensed through the\n"
577 "OpenContent License."));
581 WMWindow*
582 GetWindow(Panel *panel)
584 return WPrefs.win;
588 static void
589 loadConfigurations(WMScreen *scr, WMWindow *mainw)
591 proplist_t db, gdb;
592 char *path;
593 FILE *file;
594 char buffer[1024];
595 char mbuf[1024];
596 int v1, v2, v3;
598 path = wdefaultspathfordomain("WindowMaker");
600 db = PLGetProplistWithPath(path);
601 if (db) {
602 if (!PLIsDictionary(db)) {
603 PLRelease(db);
604 db = NULL;
605 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), path);
606 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
608 } else {
609 sprintf(mbuf, _("Could not load Window Maker domain (%s) from defaults database."),
610 path);
611 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
613 free(path);
615 file = popen("wmaker --version", "r");
616 if (!file || !fgets(buffer, 1023, file)) {
617 wsyserror(_("could not extract version information from Window Maker"));
618 wfatal(_("Make sure wmaker is in your search path."));
620 WMRunAlertPanel(scr, mainw, _("Error"),
621 _("Could not extract version from Window Maker. Make sure it is correctly installed and is in your PATH environment variable."),
622 _("OK"), NULL, NULL);
623 exit(1);
625 if (file)
626 pclose(file);
628 if (sscanf(buffer, "Window Maker %i.%i.%i",&v1,&v2,&v3)!=3
629 && sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) {
630 WMRunAlertPanel(scr, mainw, _("Error"),
631 _("Could not extract version from Window Maker. "
632 "Make sure it is correctly installed and the path "
633 "where it installed is in the PATH environment "
634 "variable."), _("OK"), NULL, NULL);
635 exit(1);
637 if (v1 == 0 && (v2 < 18 || v3 < 0)) {
638 sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
639 "The version installed is %i.%i.%i\n"), v1, v2, v3);
640 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
641 exit(1);
644 if (v1 > 1 || (v1 == 1 && (v2 > 0))) {
645 sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
646 v1, v2, v3);
647 WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL);
650 file = popen("wmaker --global_defaults_path", "r");
651 if (!file || !fgets(buffer, 1023, file)) {
652 wsyserror(_("could not run \"wmaker --global_defaults_path\"."));
653 exit(1);
654 } else {
655 char *ptr;
656 ptr = strchr(buffer, '\n');
657 if (ptr)
658 *ptr = 0;
659 strcat(buffer, "/WindowMaker");
662 if (file)
663 pclose(file);
665 gdb = PLGetProplistWithPath(buffer);
666 if (gdb) {
667 if (!PLIsDictionary(gdb)) {
668 PLRelease(gdb);
669 gdb = NULL;
670 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer);
671 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
673 } else {
674 sprintf(mbuf, _("Could not load global Window Maker domain (%s)."),
675 buffer);
676 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
679 if (!db) {
680 db = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
682 if (!gdb) {
683 gdb = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
686 GlobalDB = gdb;
688 WindowMakerDB = db;
692 proplist_t
693 GetObjectForKey(char *defaultName)
695 proplist_t object = NULL;
696 proplist_t key = PLMakeString(defaultName);
698 object = PLGetDictionaryEntry(WindowMakerDB, key);
699 if (!object)
700 object = PLGetDictionaryEntry(GlobalDB, key);
702 PLRelease(key);
704 return object;
708 void
709 SetObjectForKey(proplist_t object, char *defaultName)
711 proplist_t key = PLMakeString(defaultName);
713 PLInsertDictionaryEntry(WindowMakerDB, key, object);
714 PLRelease(key);
718 void
719 RemoveObjectForKey(char *defaultName)
721 proplist_t key = PLMakeString(defaultName);
723 PLRemoveDictionaryEntry(WindowMakerDB, key);
725 PLRelease(key);
729 char*
730 GetStringForKey(char *defaultName)
732 proplist_t val;
734 val = GetObjectForKey(defaultName);
736 if (!val)
737 return NULL;
739 if (!PLIsString(val))
740 return NULL;
742 return PLGetString(val);
747 proplist_t
748 GetArrayForKey(char *defaultName)
750 proplist_t val;
752 val = GetObjectForKey(defaultName);
754 if (!val)
755 return NULL;
757 if (!PLIsArray(val))
758 return NULL;
760 return val;
764 proplist_t
765 GetDictionaryForKey(char *defaultName)
767 proplist_t val;
769 val = GetObjectForKey(defaultName);
771 if (!val)
772 return NULL;
774 if (!PLIsDictionary(val))
775 return NULL;
777 return val;
782 GetIntegerForKey(char *defaultName)
784 proplist_t val;
785 char *str;
786 int value;
788 val = GetObjectForKey(defaultName);
790 if (!val)
791 return 0;
793 if (!PLIsString(val))
794 return 0;
796 str = PLGetString(val);
797 if (!str)
798 return 0;
800 if (sscanf(str, "%i", &value)!=1)
801 return 0;
803 return value;
807 Bool
808 GetBoolForKey(char *defaultName)
810 int value;
811 char *str;
813 str = GetStringForKey(defaultName);
815 if (!str)
816 return False;
818 if (sscanf(str, "%i", &value)==1 && value!=0)
819 return True;
821 if (strcasecmp(str, "YES")==0)
822 return True;
824 if (strcasecmp(str, "Y")==0)
825 return True;
827 return False;
831 void
832 SetIntegerForKey(int value, char *defaultName)
834 proplist_t object;
835 char buffer[128];
837 sprintf(buffer, "%i", value);
838 object = PLMakeString(buffer);
840 SetObjectForKey(object, defaultName);
841 PLRelease(object);
846 void
847 SetStringForKey(char *value, char *defaultName)
849 proplist_t object;
851 object = PLMakeString(value);
853 SetObjectForKey(object, defaultName);
854 PLRelease(object);
858 void
859 SetBoolForKey(Bool value, char *defaultName)
861 static proplist_t yes = NULL, no = NULL;
863 if (!yes) {
864 yes = PLMakeString("YES");
865 no = PLMakeString("NO");
868 SetObjectForKey(value ? yes : no, defaultName);
872 void
873 SetSpeedForKey(int speed, char *defaultName)
875 char *str;
877 switch (speed) {
878 case 0:
879 str = "ultraslow";
880 break;
881 case 1:
882 str = "slow";
883 break;
884 case 2:
885 str = "medium";
886 break;
887 case 3:
888 str = "fast";
889 break;
890 case 4:
891 str = "ultrafast";
892 break;
893 default:
894 str = NULL;
897 if (str)
898 SetStringForKey(str, defaultName);
903 GetSpeedForKey(char *defaultName)
905 char *str;
906 int i;
908 str = GetStringForKey(defaultName);
909 if (!str)
910 return 2;
912 if (strcasecmp(str, "ultraslow")==0)
913 i = 0;
914 else if (strcasecmp(str, "slow")==0)
915 i = 1;
916 else if (strcasecmp(str, "medium")==0)
917 i = 2;
918 else if (strcasecmp(str, "fast")==0)
919 i = 3;
920 else if (strcasecmp(str, "ultrafast")==0)
921 i = 4;
922 else {
923 wwarning(_("bad speed value for option %s\n. Using default Medium"),
924 defaultName);
925 i = 2;
927 return i;