1 /* WPrefs.c- main window and other basic stuff
3 * WPrefs - Window Maker Preferences Program
5 * Copyright (c) 1998 Alfredo K. Kojima
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,
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
{
68 WMScrollView
*scrollV
;
70 WMButton
*sectionB
[MAX_SECTIONS
];
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();
112 quit(WMWidget
*w
, void *data
)
121 save(WMWidget
*w
, void *data
)
127 char *msg
= "Reconfigure";
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
);
149 /* The global doesn't have it, so no problem either. */
150 p2
= PLGetDictionaryEntry(GlobalDB
, key
);
153 /* If both values are the same, don't save. */
154 if (PLIsEqual(p1
, p2
))
155 PLRemoveDictionaryEntry(WindowMakerDB
, key
);
157 /* puts(PLGetDescription(WindowMakerDB));*/
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
)));
184 undo(WMWidget
*w
, void *data
)
186 PanelRec
*rec
= (PanelRec
*)WPrefs
.currentPanel
;
191 if (rec
->callbacks
.undoChanges
192 && (rec
->callbacks
.flags
& INITIALIZED_PANEL
)) {
193 (*rec
->callbacks
.undoChanges
)(WPrefs
.currentPanel
);
199 undoAll(WMWidget
*w
, void *data
)
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
);
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
);
231 createMainWindow(WMScreen
*scr
)
233 WMScroller
*scroller
;
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
);
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-*");
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"));
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
,
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
);
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
);
351 hidePanel(Panel
*panel
)
353 PanelRec
*rec
= (PanelRec
*)panel
;
355 WMUnmapWidget(rec
->frame
);
360 savePanelData(Panel
*panel
)
362 PanelRec
*rec
= (PanelRec
*)panel
;
364 if (rec
->callbacks
.updateDomain
) {
365 (*rec
->callbacks
.updateDomain
)(panel
);
371 changeSection(WMWidget
*self
, void *data
)
374 WMDestroyWidget(WPrefs
.banner
);
375 WPrefs
.banner
= NULL
;
376 /* WMMapWidget(WPrefs.undosBtn);
377 WMMapWidget(WPrefs.undoBtn);
379 WMMapWidget(WPrefs
.saveBtn
);
384 if (WPrefs
.currentPanel
)
385 hidePanel(WPrefs
.currentPanel
);
386 WPrefs
.currentPanel
= data
;
394 LocateImage(char *name
)
397 char *tmp
= wmalloc(strlen(name
)+8);
400 sprintf(tmp
, "%s.tiff", name
);
401 path
= WMPathForResourceOfType(tmp
, "tiff");
403 sprintf(tmp
, "%s.xpm", name
);
404 path
= WMPathForResourceOfType(tmp
, "xpm");
408 wwarning(_("could not locate image file %s\n"), name
);
416 SetButtonAlphaImage(WMScreen
*scr
, WMButton
*bPtr
, char *file
)
422 iconPath
= LocateImage(file
);
429 icon
= WMCreateBlendedPixmapFromFile(scr
, iconPath
, &color
);
431 wwarning(_("could not load icon file %s"), iconPath
);
436 WMSetButtonImage(bPtr
, icon
);
439 WMReleasePixmap(icon
);
446 icon
= WMCreateBlendedPixmapFromFile(scr
, iconPath
, &color
);
448 wwarning(_("could not load icon file %s"), iconPath
);
453 WMSetButtonAltImage(bPtr
, icon
);
456 WMReleasePixmap(icon
);
464 AddSection(Panel
*panel
, char *iconFile
)
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
,
482 SetButtonAlphaImage(WMWidgetScreen(bPtr
), bPtr
, iconFile
);
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);
499 Initialize(WMScreen
*scr
)
507 list
= RSupportedFileFormats();
508 for (i
=0; list
[i
]!=NULL
; i
++) {
509 if (strcmp(list
[i
], "TIFF")==0) {
516 path
= WMPathForResourceOfType("WPrefs.tiff", NULL
);
518 path
= WMPathForResourceOfType("WPrefs.xpm", NULL
);
522 tmp
= RLoadImage(WMScreenRContext(scr
), path
, 0);
524 wwarning(_("could not load image file %s:%s"), path
,
525 RMessageForError(RErrorCode
));
527 icon
= WMCreatePixmapFromRImage(scr
, tmp
, 0);
530 WMSetApplicationIconImage(scr
, icon
);
531 WMReleasePixmap(icon
);
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
);
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
);
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."));
586 GetWindow(Panel
*panel
)
593 loadConfigurations(WMScreen
*scr
, WMWindow
*mainw
)
602 path
= wdefaultspathfordomain("WindowMaker");
604 db
= PLGetProplistWithPath(path
);
606 if (!PLIsDictionary(db
)) {
609 sprintf(mbuf
, _("Window Maker domain (%s) is corrupted!"), path
);
610 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
613 sprintf(mbuf
, _("Could not load Window Maker domain (%s) from defaults database."),
615 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
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
);
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
);
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
);
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."),
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\"."));
660 ptr
= strchr(buffer
, '\n');
663 strcat(buffer
, "/WindowMaker");
669 gdb
= PLGetProplistWithPath(buffer
);
671 if (!PLIsDictionary(gdb
)) {
674 sprintf(mbuf
, _("Window Maker domain (%s) is corrupted!"), buffer
);
675 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
678 sprintf(mbuf
, _("Could not load global Window Maker domain (%s)."),
680 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
684 db
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
687 gdb
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
697 GetObjectForKey(char *defaultName
)
699 proplist_t object
= NULL
;
700 proplist_t key
= PLMakeString(defaultName
);
702 object
= PLGetDictionaryEntry(WindowMakerDB
, key
);
704 object
= PLGetDictionaryEntry(GlobalDB
, key
);
713 SetObjectForKey(proplist_t object
, char *defaultName
)
715 proplist_t key
= PLMakeString(defaultName
);
717 PLInsertDictionaryEntry(WindowMakerDB
, key
, object
);
723 RemoveObjectForKey(char *defaultName
)
725 proplist_t key
= PLMakeString(defaultName
);
727 PLRemoveDictionaryEntry(WindowMakerDB
, key
);
734 GetStringForKey(char *defaultName
)
738 val
= GetObjectForKey(defaultName
);
743 if (!PLIsString(val
))
746 return PLGetString(val
);
752 GetArrayForKey(char *defaultName
)
756 val
= GetObjectForKey(defaultName
);
769 GetDictionaryForKey(char *defaultName
)
773 val
= GetObjectForKey(defaultName
);
778 if (!PLIsDictionary(val
))
786 GetIntegerForKey(char *defaultName
)
792 val
= GetObjectForKey(defaultName
);
797 if (!PLIsString(val
))
800 str
= PLGetString(val
);
804 if (sscanf(str
, "%i", &value
)!=1)
812 GetBoolForKey(char *defaultName
)
817 str
= GetStringForKey(defaultName
);
822 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
825 if (strcasecmp(str
, "YES")==0)
828 if (strcasecmp(str
, "Y")==0)
836 SetIntegerForKey(int value
, char *defaultName
)
841 sprintf(buffer
, "%i", value
);
842 object
= PLMakeString(buffer
);
844 SetObjectForKey(object
, defaultName
);
851 SetStringForKey(char *value
, char *defaultName
)
855 object
= PLMakeString(value
);
857 SetObjectForKey(object
, defaultName
);
863 SetBoolForKey(Bool value
, char *defaultName
)
865 static proplist_t yes
= NULL
, no
= NULL
;
868 yes
= PLMakeString("YES");
869 no
= PLMakeString("NO");
872 SetObjectForKey(value
? yes
: no
, defaultName
);
877 SetSpeedForKey(int speed
, char *defaultName
)
902 SetStringForKey(str
, defaultName
);
907 GetSpeedForKey(char *defaultName
)
912 str
= GetStringForKey(defaultName
);
916 if (strcasecmp(str
, "ultraslow")==0)
918 else if (strcasecmp(str
, "slow")==0)
920 else if (strcasecmp(str
, "medium")==0)
922 else if (strcasecmp(str
, "fast")==0)
924 else if (strcasecmp(str
, "ultrafast")==0)
927 wwarning(_("bad speed value for option %s\n. Using default Medium"),