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"), 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
);
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
);
350 hidePanel(Panel
*panel
)
352 PanelRec
*rec
= (PanelRec
*)panel
;
354 WMUnmapWidget(rec
->frame
);
359 savePanelData(Panel
*panel
)
361 PanelRec
*rec
= (PanelRec
*)panel
;
363 if (rec
->callbacks
.updateDomain
) {
364 (*rec
->callbacks
.updateDomain
)(panel
);
370 changeSection(WMWidget
*self
, void *data
)
373 WMDestroyWidget(WPrefs
.banner
);
374 WPrefs
.banner
= NULL
;
375 /* WMMapWidget(WPrefs.undosBtn);
376 WMMapWidget(WPrefs.undoBtn);
378 WMMapWidget(WPrefs
.saveBtn
);
383 if (WPrefs
.currentPanel
)
384 hidePanel(WPrefs
.currentPanel
);
385 WPrefs
.currentPanel
= data
;
393 LocateImage(char *name
)
396 char *tmp
= wmalloc(strlen(name
)+8);
399 sprintf(tmp
, "%s.tiff", name
);
400 path
= WMPathForResourceOfType(tmp
, "tiff");
402 sprintf(tmp
, "%s.xpm", name
);
403 path
= WMPathForResourceOfType(tmp
, "xpm");
407 wwarning(_("could not locate image file %s\n"), name
);
415 SetButtonAlphaImage(WMScreen
*scr
, WMButton
*bPtr
, char *file
)
421 iconPath
= LocateImage(file
);
428 icon
= WMCreateBlendedPixmapFromFile(scr
, iconPath
, &color
);
430 wwarning(_("could not load icon file %s"), iconPath
);
435 WMSetButtonImage(bPtr
, icon
);
438 WMReleasePixmap(icon
);
445 icon
= WMCreateBlendedPixmapFromFile(scr
, iconPath
, &color
);
447 wwarning(_("could not load icon file %s"), iconPath
);
452 WMSetButtonAltImage(bPtr
, icon
);
455 WMReleasePixmap(icon
);
463 AddSection(Panel
*panel
, char *iconFile
)
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
);
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);
495 Initialize(WMScreen
*scr
)
503 list
= RSupportedFileFormats();
504 for (i
=0; list
[i
]!=NULL
; i
++) {
505 if (strcmp(list
[i
], "TIFF")==0) {
512 path
= WMPathForResourceOfType("WPrefs.tiff", NULL
);
514 path
= WMPathForResourceOfType("WPrefs.xpm", NULL
);
518 tmp
= RLoadImage(WMScreenRContext(scr
), path
, 0);
520 wwarning(_("could not load image file %s:%s"), path
,
521 RMessageForError(RErrorCode
));
523 icon
= WMCreatePixmapFromRImage(scr
, tmp
, 0);
526 WMSetApplicationIconImage(scr
, icon
);
527 WMReleasePixmap(icon
);
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
);
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
);
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."));
582 GetWindow(Panel
*panel
)
589 loadConfigurations(WMScreen
*scr
, WMWindow
*mainw
)
598 path
= wdefaultspathfordomain("WindowMaker");
600 db
= PLGetProplistWithPath(path
);
602 if (!PLIsDictionary(db
)) {
605 sprintf(mbuf
, _("Window Maker domain (%s) is corrupted!"), path
);
606 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
609 sprintf(mbuf
, _("Could not load Window Maker domain (%s) from defaults database."),
611 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
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
);
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
);
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
);
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."),
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\"."));
656 ptr
= strchr(buffer
, '\n');
659 strcat(buffer
, "/WindowMaker");
665 gdb
= PLGetProplistWithPath(buffer
);
667 if (!PLIsDictionary(gdb
)) {
670 sprintf(mbuf
, _("Window Maker domain (%s) is corrupted!"), buffer
);
671 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
674 sprintf(mbuf
, _("Could not load global Window Maker domain (%s)."),
676 WMRunAlertPanel(scr
, mainw
, _("Error"), mbuf
, _("OK"), NULL
, NULL
);
680 db
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
683 gdb
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
693 GetObjectForKey(char *defaultName
)
695 proplist_t object
= NULL
;
696 proplist_t key
= PLMakeString(defaultName
);
698 object
= PLGetDictionaryEntry(WindowMakerDB
, key
);
700 object
= PLGetDictionaryEntry(GlobalDB
, key
);
709 SetObjectForKey(proplist_t object
, char *defaultName
)
711 proplist_t key
= PLMakeString(defaultName
);
713 PLInsertDictionaryEntry(WindowMakerDB
, key
, object
);
719 RemoveObjectForKey(char *defaultName
)
721 proplist_t key
= PLMakeString(defaultName
);
723 PLRemoveDictionaryEntry(WindowMakerDB
, key
);
730 GetStringForKey(char *defaultName
)
734 val
= GetObjectForKey(defaultName
);
739 if (!PLIsString(val
))
742 return PLGetString(val
);
748 GetArrayForKey(char *defaultName
)
752 val
= GetObjectForKey(defaultName
);
765 GetDictionaryForKey(char *defaultName
)
769 val
= GetObjectForKey(defaultName
);
774 if (!PLIsDictionary(val
))
782 GetIntegerForKey(char *defaultName
)
788 val
= GetObjectForKey(defaultName
);
793 if (!PLIsString(val
))
796 str
= PLGetString(val
);
800 if (sscanf(str
, "%i", &value
)!=1)
808 GetBoolForKey(char *defaultName
)
813 str
= GetStringForKey(defaultName
);
818 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
821 if (strcasecmp(str
, "YES")==0)
824 if (strcasecmp(str
, "Y")==0)
832 SetIntegerForKey(int value
, char *defaultName
)
837 sprintf(buffer
, "%i", value
);
838 object
= PLMakeString(buffer
);
840 SetObjectForKey(object
, defaultName
);
847 SetStringForKey(char *value
, char *defaultName
)
851 object
= PLMakeString(value
);
853 SetObjectForKey(object
, defaultName
);
859 SetBoolForKey(Bool value
, char *defaultName
)
861 static proplist_t yes
= NULL
, no
= NULL
;
864 yes
= PLMakeString("YES");
865 no
= PLMakeString("NO");
868 SetObjectForKey(value
? yes
: no
, defaultName
);
873 SetSpeedForKey(int speed
, char *defaultName
)
898 SetStringForKey(str
, defaultName
);
903 GetSpeedForKey(char *defaultName
)
908 str
= GetStringForKey(defaultName
);
912 if (strcasecmp(str
, "ultraslow")==0)
914 else if (strcasecmp(str
, "slow")==0)
916 else if (strcasecmp(str
, "medium")==0)
918 else if (strcasecmp(str
, "fast")==0)
920 else if (strcasecmp(str
, "ultrafast")==0)
923 wwarning(_("bad speed value for option %s\n. Using default Medium"),