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 SetButtonAlphaImage(WMWidgetScreen(bPtr
), bPtr
, iconFile
);
483 WPrefs
.sectionB
[WPrefs
.sectionCount
] = bPtr
;
485 if (WPrefs
.sectionCount
> 0) {
486 WMGroupButtons(WPrefs
.sectionB
[0], bPtr
);
489 WPrefs
.sectionCount
++;
491 WMResizeWidget(WPrefs
.buttonF
, WPrefs
.sectionCount
*64, 64);
496 Initialize(WMScreen
*scr
)
504 list
= RSupportedFileFormats();
505 for (i
=0; list
[i
]!=NULL
; i
++) {
506 if (strcmp(list
[i
], "TIFF")==0) {
513 path
= WMPathForResourceOfType("WPrefs.tiff", NULL
);
515 path
= WMPathForResourceOfType("WPrefs.xpm", NULL
);
519 tmp
= RLoadImage(WMScreenRContext(scr
), path
, 0);
521 wwarning(_("could not load image file %s:%s"), path
,
522 RMessageForError(RErrorCode
));
524 icon
= WMCreatePixmapFromRImage(scr
, tmp
, 0);
527 WMSetApplicationIconImage(scr
, icon
);
528 WMReleasePixmap(icon
);
534 memset(&WPrefs
, 0, sizeof(_WPrefs
));
535 createMainWindow(scr
);
537 WMRealizeWidget(WPrefs
.win
);
538 WMMapWidget(WPrefs
.win
);
539 XFlush(WMScreenDisplay(scr
));
540 WMSetLabelText(WPrefs
.statusL
, _("Loading Window Maker configuration files..."));
541 XFlush(WMScreenDisplay(scr
));
542 loadConfigurations(scr
, WPrefs
.win
);
544 WMSetLabelText(WPrefs
.statusL
, _("Initializing configuration panels..."));
546 InitWindowHandling(scr
, WPrefs
.win
);
547 InitFocus(scr
, WPrefs
.win
);
548 InitMenuPreferences(scr
, WPrefs
.win
);
549 InitIcons(scr
, WPrefs
.win
);
550 InitPreferences(scr
, WPrefs
.win
);
552 InitPaths(scr
, WPrefs
.win
);
553 InitWorkspace(scr
, WPrefs
.win
);
554 InitConfigurations(scr
, WPrefs
.win
);
556 InitMenu(scr
, WPrefs
.win
);
558 #ifdef not_yet_fully_implemented
559 InitKeyboardSettings(scr
, WPrefs
.win
);
561 InitKeyboardShortcuts(scr
, WPrefs
.win
);
562 InitMouseSettings(scr
, WPrefs
.win
);
564 InitAppearance(scr
, WPrefs
.win
);
565 #ifdef not_yet_fully_implemented
567 InitText(scr
, WPrefs
.win
);
568 InitThemes(scr
, WPrefs
.win
);
570 InitExpert(scr
, WPrefs
.win
);
572 WMRealizeWidget(WPrefs
.scrollV
);
574 WMSetLabelText(WPrefs
.statusL
,
575 _("WPrefs is free software and is distributed WITHOUT ANY\n"
576 "WARRANTY under the terms of the GNU General Public License.\n"
577 "The icons in this program are licensed through the\n"
578 "OpenContent License."));
583 GetWindow(Panel
*panel
)
590 loadConfigurations(WMScreen
*scr
, WMWindow
*mainw
)
599 path
= wdefaultspathfordomain("WindowMaker");
601 db
= PLGetProplistWithPath(path
);
603 if (!PLIsDictionary(db
)) {
606 sprintf(mbuf
, _("Window Maker domain (%s) is corrupted!"), path
);
607 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
610 sprintf(mbuf
, _("Could not load Window Maker domain (%s) from defaults database."),
612 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
616 file
= popen("wmaker --version", "r");
617 if (!file
|| !fgets(buffer
, 1023, file
)) {
618 wsyserror(_("could not extract version information from Window Maker"));
619 wfatal(_("Make sure wmaker is in your search path."));
621 WMRunAlertPanel(scr
, mainw
, _("Error"),
622 _("Could not extract version from Window Maker. Make sure it is correctly installed and is in your PATH environment variable."),
623 _("OK"), NULL
, NULL
);
629 if (sscanf(buffer
, "Window Maker %i.%i.%i",&v1
,&v2
,&v3
)!=3
630 && sscanf(buffer
, "WindowMaker %i.%i.%i",&v1
,&v2
,&v3
)!=3) {
631 WMRunAlertPanel(scr
, mainw
, _("Error"),
632 _("Could not extract version from Window Maker. "
633 "Make sure it is correctly installed and the path "
634 "where it installed is in the PATH environment "
635 "variable."), _("OK"), NULL
, NULL
);
638 if (v1
== 0 && (v2
< 18 || v3
< 0)) {
639 sprintf(mbuf
, _("WPrefs only supports Window Maker 0.18.0 or newer.\n"
640 "The version installed is %i.%i.%i\n"), v1
, v2
, v3
);
641 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
645 if (v1
> 1 || (v1
== 1 && (v2
> 0))) {
646 sprintf(mbuf
, _("Window Maker %i.%i.%i, which is installed in your system, is not fully supported by this version of WPrefs."),
648 WMRunAlertPanel(scr
, mainw
, _("Warning"), mbuf
, _("OK"), NULL
, NULL
);
651 file
= popen("wmaker --global_defaults_path", "r");
652 if (!file
|| !fgets(buffer
, 1023, file
)) {
653 wsyserror(_("could not run \"wmaker --global_defaults_path\"."));
657 ptr
= strchr(buffer
, '\n');
660 strcat(buffer
, "/WindowMaker");
666 gdb
= PLGetProplistWithPath(buffer
);
668 if (!PLIsDictionary(gdb
)) {
671 sprintf(mbuf
, _("Window Maker domain (%s) is corrupted!"), buffer
);
672 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
675 sprintf(mbuf
, _("Could not load global Window Maker domain (%s)."),
677 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
681 db
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
684 gdb
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
694 GetObjectForKey(char *defaultName
)
696 proplist_t object
= NULL
;
697 proplist_t key
= PLMakeString(defaultName
);
699 object
= PLGetDictionaryEntry(WindowMakerDB
, key
);
701 object
= PLGetDictionaryEntry(GlobalDB
, key
);
710 SetObjectForKey(proplist_t object
, char *defaultName
)
712 proplist_t key
= PLMakeString(defaultName
);
714 PLInsertDictionaryEntry(WindowMakerDB
, key
, object
);
720 RemoveObjectForKey(char *defaultName
)
722 proplist_t key
= PLMakeString(defaultName
);
724 PLRemoveDictionaryEntry(WindowMakerDB
, key
);
731 GetStringForKey(char *defaultName
)
735 val
= GetObjectForKey(defaultName
);
740 if (!PLIsString(val
))
743 return PLGetString(val
);
749 GetArrayForKey(char *defaultName
)
753 val
= GetObjectForKey(defaultName
);
766 GetDictionaryForKey(char *defaultName
)
770 val
= GetObjectForKey(defaultName
);
775 if (!PLIsDictionary(val
))
783 GetIntegerForKey(char *defaultName
)
789 val
= GetObjectForKey(defaultName
);
794 if (!PLIsString(val
))
797 str
= PLGetString(val
);
801 if (sscanf(str
, "%i", &value
)!=1)
809 GetBoolForKey(char *defaultName
)
814 str
= GetStringForKey(defaultName
);
819 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
822 if (strcasecmp(str
, "YES")==0)
825 if (strcasecmp(str
, "Y")==0)
833 SetIntegerForKey(int value
, char *defaultName
)
838 sprintf(buffer
, "%i", value
);
839 object
= PLMakeString(buffer
);
841 SetObjectForKey(object
, defaultName
);
848 SetStringForKey(char *value
, char *defaultName
)
852 object
= PLMakeString(value
);
854 SetObjectForKey(object
, defaultName
);
860 SetBoolForKey(Bool value
, char *defaultName
)
862 static proplist_t yes
= NULL
, no
= NULL
;
865 yes
= PLMakeString("YES");
866 no
= PLMakeString("NO");
869 SetObjectForKey(value
? yes
: no
, defaultName
);
874 SetSpeedForKey(int speed
, char *defaultName
)
899 SetStringForKey(str
, defaultName
);
904 GetSpeedForKey(char *defaultName
)
909 str
= GetStringForKey(defaultName
);
913 if (strcasecmp(str
, "ultraslow")==0)
915 else if (strcasecmp(str
, "slow")==0)
917 else if (strcasecmp(str
, "medium")==0)
919 else if (strcasecmp(str
, "fast")==0)
921 else if (strcasecmp(str
, "ultrafast")==0)
924 wwarning(_("bad speed value for option %s\n. Using default Medium"),