added balloon help
[wmaker-crm.git] / WPrefs.app / WPrefs.c
blob6c87e706f77b42bc14c0046731e7ffecbdfbb79c
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 or newer"), WVERSION,
307 WMVERSION);
308 WMSetLabelText(WPrefs.versionL, buffer);
310 WPrefs.statusL = WMCreateLabel(WPrefs.banner);
311 WMResizeWidget(WPrefs.statusL, FRAME_WIDTH-20, 60);
312 WMMoveWidget(WPrefs.statusL, 10, 100);
313 WMSetLabelTextAlignment(WPrefs.statusL, WACenter);
314 WMSetLabelText(WPrefs.statusL, _("Starting..."));
316 WPrefs.creditsL = WMCreateLabel(WPrefs.banner);
317 WMResizeWidget(WPrefs.creditsL, FRAME_WIDTH-20, 60);
318 WMMoveWidget(WPrefs.creditsL, 10, FRAME_HEIGHT-60);
319 WMSetLabelTextAlignment(WPrefs.creditsL, WACenter);
320 WMSetLabelText(WPrefs.creditsL, _("Programming/Design: Alfredo K. Kojima\n"
321 "Artwork: Marco van Hylckama Vlieg\n"
322 "More Programming: James Thompson"));
325 WMMapSubwidgets(WPrefs.win);
327 WMUnmapWidget(WPrefs.undosBtn);
328 WMUnmapWidget(WPrefs.undoBtn);
329 WMUnmapWidget(WPrefs.saveBtn);
333 static void
334 showPanel(Panel *panel)
336 PanelRec *rec = (PanelRec*)panel;
338 if (!(rec->callbacks.flags & INITIALIZED_PANEL)) {
339 (*rec->callbacks.createWidgets)(panel);
340 rec->callbacks.flags |= INITIALIZED_PANEL;
343 WMSetWindowTitle(WPrefs.win, rec->sectionName);
345 WMMapWidget(rec->frame);
350 static void
351 hidePanel(Panel *panel)
353 PanelRec *rec = (PanelRec*)panel;
355 WMUnmapWidget(rec->frame);
359 static void
360 savePanelData(Panel *panel)
362 PanelRec *rec = (PanelRec*)panel;
364 if (rec->callbacks.updateDomain) {
365 (*rec->callbacks.updateDomain)(panel);
370 static void
371 changeSection(WMWidget *self, void *data)
373 if (WPrefs.banner) {
374 WMDestroyWidget(WPrefs.banner);
375 WPrefs.banner = NULL;
376 /* WMMapWidget(WPrefs.undosBtn);
377 WMMapWidget(WPrefs.undoBtn);
379 WMMapWidget(WPrefs.saveBtn);
382 showPanel(data);
384 if (WPrefs.currentPanel)
385 hidePanel(WPrefs.currentPanel);
386 WPrefs.currentPanel = data;
393 char*
394 LocateImage(char *name)
396 char *path;
397 char *tmp = wmalloc(strlen(name)+8);
399 if (TIFFOK) {
400 sprintf(tmp, "%s.tiff", name);
401 path = WMPathForResourceOfType(tmp, "tiff");
402 } else {
403 sprintf(tmp, "%s.xpm", name);
404 path = WMPathForResourceOfType(tmp, "xpm");
406 free(tmp);
407 if (!path) {
408 wwarning(_("could not locate image file %s\n"), name);
411 return path;
415 void
416 SetButtonAlphaImage(WMScreen *scr, WMButton *bPtr, char *file)
418 WMPixmap *icon;
419 RColor color;
420 char *iconPath;
422 iconPath = LocateImage(file);
424 color.red = 0xae;
425 color.green = 0xaa;
426 color.blue = 0xae;
427 color.alpha = 0;
428 if (iconPath) {
429 icon = WMCreateBlendedPixmapFromFile(scr, iconPath, &color);
430 if (!icon)
431 wwarning(_("could not load icon file %s"), iconPath);
432 } else {
433 icon = NULL;
436 WMSetButtonImage(bPtr, icon);
438 if (icon)
439 WMReleasePixmap(icon);
441 color.red = 0xff;
442 color.green = 0xff;
443 color.blue = 0xff;
444 color.alpha = 0;
445 if (iconPath) {
446 icon = WMCreateBlendedPixmapFromFile(scr, iconPath, &color);
447 if (!icon)
448 wwarning(_("could not load icon file %s"), iconPath);
449 } else {
450 icon = NULL;
453 WMSetButtonAltImage(bPtr, icon);
455 if (icon)
456 WMReleasePixmap(icon);
458 if (iconPath)
459 free(iconPath);
463 void
464 AddSection(Panel *panel, char *iconFile)
466 WMButton *bPtr;
468 assert(WPrefs.sectionCount < MAX_SECTIONS);
471 bPtr = WMCreateCustomButton(WPrefs.buttonF, WBBStateLightMask
472 |WBBStateChangeMask);
473 WMResizeWidget(bPtr, 64, 64);
474 WMMoveWidget(bPtr, WPrefs.sectionCount*64, 0);
475 WMSetButtonImagePosition(bPtr, WIPImageOnly);
476 WMSetButtonAction(bPtr, changeSection, panel);
477 WMHangData(bPtr, panel);
479 WMSetBalloonTextForView(((PanelRec*)panel)->description,
480 WMWidgetView(bPtr));
482 SetButtonAlphaImage(WMWidgetScreen(bPtr), bPtr, iconFile);
484 WMMapWidget(bPtr);
486 WPrefs.sectionB[WPrefs.sectionCount] = bPtr;
488 if (WPrefs.sectionCount > 0) {
489 WMGroupButtons(WPrefs.sectionB[0], bPtr);
492 WPrefs.sectionCount++;
494 WMResizeWidget(WPrefs.buttonF, WPrefs.sectionCount*64, 64);
498 void
499 Initialize(WMScreen *scr)
501 char **list;
502 int i;
503 char *path;
504 WMPixmap *icon;
507 list = RSupportedFileFormats();
508 for (i=0; list[i]!=NULL; i++) {
509 if (strcmp(list[i], "TIFF")==0) {
510 TIFFOK = True;
511 break;
515 if (TIFFOK)
516 path = WMPathForResourceOfType("WPrefs.tiff", NULL);
517 else
518 path = WMPathForResourceOfType("WPrefs.xpm", NULL);
519 if (path) {
520 RImage *tmp;
522 tmp = RLoadImage(WMScreenRContext(scr), path, 0);
523 if (!tmp) {
524 wwarning(_("could not load image file %s:%s"), path,
525 RMessageForError(RErrorCode));
526 } else {
527 icon = WMCreatePixmapFromRImage(scr, tmp, 0);
528 RDestroyImage(tmp);
529 if (icon) {
530 WMSetApplicationIconImage(scr, icon);
531 WMReleasePixmap(icon);
534 free(path);
537 memset(&WPrefs, 0, sizeof(_WPrefs));
538 createMainWindow(scr);
540 WMRealizeWidget(WPrefs.win);
541 WMMapWidget(WPrefs.win);
542 XFlush(WMScreenDisplay(scr));
543 WMSetLabelText(WPrefs.statusL, _("Loading Window Maker configuration files..."));
544 XFlush(WMScreenDisplay(scr));
545 loadConfigurations(scr, WPrefs.win);
547 WMSetLabelText(WPrefs.statusL, _("Initializing configuration panels..."));
549 InitWindowHandling(scr, WPrefs.win);
550 InitFocus(scr, WPrefs.win);
551 InitMenuPreferences(scr, WPrefs.win);
552 InitIcons(scr, WPrefs.win);
553 InitPreferences(scr, WPrefs.win);
555 InitPaths(scr, WPrefs.win);
556 InitWorkspace(scr, WPrefs.win);
557 InitConfigurations(scr, WPrefs.win);
559 InitMenu(scr, WPrefs.win);
561 #ifdef not_yet_fully_implemented
562 InitKeyboardSettings(scr, WPrefs.win);
563 #endif
564 InitKeyboardShortcuts(scr, WPrefs.win);
565 InitMouseSettings(scr, WPrefs.win);
567 InitAppearance(scr, WPrefs.win);
568 #ifdef not_yet_fully_implemented
570 InitText(scr, WPrefs.win);
571 InitThemes(scr, WPrefs.win);
572 #endif
573 InitExpert(scr, WPrefs.win);
575 WMRealizeWidget(WPrefs.scrollV);
577 WMSetLabelText(WPrefs.statusL,
578 _("WPrefs is free software and is distributed WITHOUT ANY\n"
579 "WARRANTY under the terms of the GNU General Public License.\n"
580 "The icons in this program are licensed through the\n"
581 "OpenContent License."));
585 WMWindow*
586 GetWindow(Panel *panel)
588 return WPrefs.win;
592 static void
593 loadConfigurations(WMScreen *scr, WMWindow *mainw)
595 proplist_t db, gdb;
596 char *path;
597 FILE *file;
598 char buffer[1024];
599 char mbuf[1024];
600 int v1, v2, v3;
602 path = wdefaultspathfordomain("WindowMaker");
604 db = PLGetProplistWithPath(path);
605 if (db) {
606 if (!PLIsDictionary(db)) {
607 PLRelease(db);
608 db = NULL;
609 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), path);
610 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
612 } else {
613 sprintf(mbuf, _("Could not load Window Maker domain (%s) from defaults database."),
614 path);
615 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
617 free(path);
619 file = popen("wmaker --version", "r");
620 if (!file || !fgets(buffer, 1023, file)) {
621 wsyserror(_("could not extract version information from Window Maker"));
622 wfatal(_("Make sure wmaker is in your search path."));
624 WMRunAlertPanel(scr, mainw, _("Error"),
625 _("Could not extract version from Window Maker. Make sure it is correctly installed and is in your PATH environment variable."),
626 _("OK"), NULL, NULL);
627 exit(1);
629 if (file)
630 pclose(file);
632 if (sscanf(buffer, "Window Maker %i.%i.%i",&v1,&v2,&v3)!=3
633 && sscanf(buffer, "WindowMaker %i.%i.%i",&v1,&v2,&v3)!=3) {
634 WMRunAlertPanel(scr, mainw, _("Error"),
635 _("Could not extract version from Window Maker. "
636 "Make sure it is correctly installed and the path "
637 "where it installed is in the PATH environment "
638 "variable."), _("OK"), NULL, NULL);
639 exit(1);
641 if (v1 == 0 && (v2 < 18 || v3 < 0)) {
642 sprintf(mbuf, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
643 "The version installed is %i.%i.%i\n"), v1, v2, v3);
644 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
645 exit(1);
648 if (v1 > 1 || (v1 == 1 && (v2 > 0))) {
649 sprintf(mbuf, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
650 v1, v2, v3);
651 WMRunAlertPanel(scr, mainw, _("Warning"), mbuf, _("OK"), NULL, NULL);
654 file = popen("wmaker --global_defaults_path", "r");
655 if (!file || !fgets(buffer, 1023, file)) {
656 wsyserror(_("could not run \"wmaker --global_defaults_path\"."));
657 exit(1);
658 } else {
659 char *ptr;
660 ptr = strchr(buffer, '\n');
661 if (ptr)
662 *ptr = 0;
663 strcat(buffer, "/WindowMaker");
666 if (file)
667 pclose(file);
669 gdb = PLGetProplistWithPath(buffer);
670 if (gdb) {
671 if (!PLIsDictionary(gdb)) {
672 PLRelease(gdb);
673 gdb = NULL;
674 sprintf(mbuf, _("Window Maker domain (%s) is corrupted!"), buffer);
675 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
677 } else {
678 sprintf(mbuf, _("Could not load global Window Maker domain (%s)."),
679 buffer);
680 WMRunAlertPanel(scr, mainw, _("Error"), mbuf, _("OK"), NULL, NULL);
683 if (!db) {
684 db = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
686 if (!gdb) {
687 gdb = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
690 GlobalDB = gdb;
692 WindowMakerDB = db;
696 proplist_t
697 GetObjectForKey(char *defaultName)
699 proplist_t object = NULL;
700 proplist_t key = PLMakeString(defaultName);
702 object = PLGetDictionaryEntry(WindowMakerDB, key);
703 if (!object)
704 object = PLGetDictionaryEntry(GlobalDB, key);
706 PLRelease(key);
708 return object;
712 void
713 SetObjectForKey(proplist_t object, char *defaultName)
715 proplist_t key = PLMakeString(defaultName);
717 PLInsertDictionaryEntry(WindowMakerDB, key, object);
718 PLRelease(key);
722 void
723 RemoveObjectForKey(char *defaultName)
725 proplist_t key = PLMakeString(defaultName);
727 PLRemoveDictionaryEntry(WindowMakerDB, key);
729 PLRelease(key);
733 char*
734 GetStringForKey(char *defaultName)
736 proplist_t val;
738 val = GetObjectForKey(defaultName);
740 if (!val)
741 return NULL;
743 if (!PLIsString(val))
744 return NULL;
746 return PLGetString(val);
751 proplist_t
752 GetArrayForKey(char *defaultName)
754 proplist_t val;
756 val = GetObjectForKey(defaultName);
758 if (!val)
759 return NULL;
761 if (!PLIsArray(val))
762 return NULL;
764 return val;
768 proplist_t
769 GetDictionaryForKey(char *defaultName)
771 proplist_t val;
773 val = GetObjectForKey(defaultName);
775 if (!val)
776 return NULL;
778 if (!PLIsDictionary(val))
779 return NULL;
781 return val;
786 GetIntegerForKey(char *defaultName)
788 proplist_t val;
789 char *str;
790 int value;
792 val = GetObjectForKey(defaultName);
794 if (!val)
795 return 0;
797 if (!PLIsString(val))
798 return 0;
800 str = PLGetString(val);
801 if (!str)
802 return 0;
804 if (sscanf(str, "%i", &value)!=1)
805 return 0;
807 return value;
811 Bool
812 GetBoolForKey(char *defaultName)
814 int value;
815 char *str;
817 str = GetStringForKey(defaultName);
819 if (!str)
820 return False;
822 if (sscanf(str, "%i", &value)==1 && value!=0)
823 return True;
825 if (strcasecmp(str, "YES")==0)
826 return True;
828 if (strcasecmp(str, "Y")==0)
829 return True;
831 return False;
835 void
836 SetIntegerForKey(int value, char *defaultName)
838 proplist_t object;
839 char buffer[128];
841 sprintf(buffer, "%i", value);
842 object = PLMakeString(buffer);
844 SetObjectForKey(object, defaultName);
845 PLRelease(object);
850 void
851 SetStringForKey(char *value, char *defaultName)
853 proplist_t object;
855 object = PLMakeString(value);
857 SetObjectForKey(object, defaultName);
858 PLRelease(object);
862 void
863 SetBoolForKey(Bool value, char *defaultName)
865 static proplist_t yes = NULL, no = NULL;
867 if (!yes) {
868 yes = PLMakeString("YES");
869 no = PLMakeString("NO");
872 SetObjectForKey(value ? yes : no, defaultName);
876 void
877 SetSpeedForKey(int speed, char *defaultName)
879 char *str;
881 switch (speed) {
882 case 0:
883 str = "ultraslow";
884 break;
885 case 1:
886 str = "slow";
887 break;
888 case 2:
889 str = "medium";
890 break;
891 case 3:
892 str = "fast";
893 break;
894 case 4:
895 str = "ultrafast";
896 break;
897 default:
898 str = NULL;
901 if (str)
902 SetStringForKey(str, defaultName);
907 GetSpeedForKey(char *defaultName)
909 char *str;
910 int i;
912 str = GetStringForKey(defaultName);
913 if (!str)
914 return 2;
916 if (strcasecmp(str, "ultraslow")==0)
917 i = 0;
918 else if (strcasecmp(str, "slow")==0)
919 i = 1;
920 else if (strcasecmp(str, "medium")==0)
921 i = 2;
922 else if (strcasecmp(str, "fast")==0)
923 i = 3;
924 else if (strcasecmp(str, "ultrafast")==0)
925 i = 4;
926 else {
927 wwarning(_("bad speed value for option %s\n. Using default Medium"),
928 defaultName);
929 i = 2;
931 return i;