parse.c revision fb81d040
1645f5050Syouri/*****************************************************************************/
2645f5050Syouri/**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
3645f5050Syouri/**                          Salt Lake City, Utah                           **/
4645f5050Syouri/**  Portions Copyright 1989 by the Massachusetts Institute of Technology   **/
5645f5050Syouri/**                        Cambridge, Massachusetts                         **/
6645f5050Syouri/**                                                                         **/
7645f5050Syouri/**                           All Rights Reserved                           **/
8645f5050Syouri/**                                                                         **/
9645f5050Syouri/**    Permission to use, copy, modify, and distribute this software and    **/
10645f5050Syouri/**    its documentation  for  any  purpose  and  without  fee is hereby    **/
11645f5050Syouri/**    granted, provided that the above copyright notice appear  in  all    **/
12645f5050Syouri/**    copies and that both  that  copyright  notice  and  this  permis-    **/
13645f5050Syouri/**    sion  notice appear in supporting  documentation,  and  that  the    **/
14645f5050Syouri/**    names of Evans & Sutherland and M.I.T. not be used in advertising    **/
15645f5050Syouri/**    in publicity pertaining to distribution of the  software  without    **/
16645f5050Syouri/**    specific, written prior permission.                                  **/
17645f5050Syouri/**                                                                         **/
18645f5050Syouri/**    EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD    **/
19645f5050Syouri/**    TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES  OF  MERCHANT-    **/
20645f5050Syouri/**    ABILITY  AND  FITNESS,  IN  NO  EVENT SHALL EVANS & SUTHERLAND OR    **/
21645f5050Syouri/**    M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL  DAM-    **/
22645f5050Syouri/**    AGES OR  ANY DAMAGES WHATSOEVER  RESULTING FROM LOSS OF USE, DATA    **/
23645f5050Syouri/**    OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER    **/
24645f5050Syouri/**    TORTIOUS ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE    **/
25645f5050Syouri/**    OR PERFORMANCE OF THIS SOFTWARE.                                     **/
26645f5050Syouri/*****************************************************************************/
27645f5050Syouri/*
28645f5050Syouri *  [ ctwm ]
29645f5050Syouri *
30645f5050Syouri *  Copyright 1992 Claude Lecommandeur.
31645f5050Syouri *
32645f5050Syouri * Permission to use, copy, modify  and distribute this software  [ctwm] and
33645f5050Syouri * its documentation for any purpose is hereby granted without fee, provided
34645f5050Syouri * that the above  copyright notice appear  in all copies and that both that
35645f5050Syouri * copyright notice and this permission notice appear in supporting documen-
36645f5050Syouri * tation, and that the name of  Claude Lecommandeur not be used in adverti-
37645f5050Syouri * sing or  publicity  pertaining to  distribution of  the software  without
38645f5050Syouri * specific, written prior permission. Claude Lecommandeur make no represen-
39645f5050Syouri * tations  about the suitability  of this software  for any purpose.  It is
40645f5050Syouri * provided "as is" without express or implied warranty.
41645f5050Syouri *
42645f5050Syouri * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
43645f5050Syouri * INCLUDING ALL  IMPLIED WARRANTIES OF  MERCHANTABILITY AND FITNESS.  IN NO
44645f5050Syouri * EVENT SHALL  Claude Lecommandeur  BE LIABLE FOR ANY SPECIAL,  INDIRECT OR
45645f5050Syouri * CONSEQUENTIAL  DAMAGES OR ANY  DAMAGES WHATSOEVER  RESULTING FROM LOSS OF
46645f5050Syouri * USE, DATA  OR PROFITS,  WHETHER IN AN ACTION  OF CONTRACT,  NEGLIGENCE OR
47645f5050Syouri * OTHER  TORTIOUS ACTION,  ARISING OUT OF OR IN  CONNECTION WITH THE USE OR
48645f5050Syouri * PERFORMANCE OF THIS SOFTWARE.
49645f5050Syouri *
50645f5050Syouri * Author:  Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ]
51645f5050Syouri */
52645f5050Syouri
53645f5050Syouri
54645f5050Syouri/***********************************************************************
55645f5050Syouri *
56645f5050Syouri * $XConsortium: parse.c,v 1.52 91/07/12 09:59:37 dave Exp $
57645f5050Syouri *
58645f5050Syouri * parse the .twmrc file
59645f5050Syouri *
60645f5050Syouri * 17-Nov-87 Thomas E. LaStrange       File created
61645f5050Syouri * 10-Oct-90 David M. Sternlicht       Storing saved colors on root
62645f5050Syouri *
63645f5050Syouri * Do the necessary modification to be integrated in ctwm.
64645f5050Syouri * Can no longer be used for the standard twm.
65645f5050Syouri *
66645f5050Syouri * 22-April-92 Claude Lecommandeur.
67645f5050Syouri *
68645f5050Syouri ***********************************************************************/
69645f5050Syouri
70645f5050Syouri#include <stdio.h>
71645f5050Syouri#include <sys/types.h>
72645f5050Syouri#include <sys/wait.h>
73645f5050Syouri#if defined(sony_news) || defined __QNX__
74645f5050Syouri#  include <ctype.h>
75645f5050Syouri#endif
76645f5050Syouri#ifdef VMS
77645f5050Syouri#include <ctype.h>
78645f5050Syouri#include <decw$include/Xos.h>
79645f5050Syouri#include <X11Xmu/CharSet.h>
80645f5050Syouri#include <X11Xmu/SysUtil.h>
81645f5050Syouri#else
82645f5050Syouri#include <X11/Xos.h>
83645f5050Syouri#include <X11/Xmu/CharSet.h>
84645f5050Syouri#include <X11/Xmu/SysUtil.h>
85645f5050Syouri#endif
86645f5050Syouri#include "twm.h"
87645f5050Syouri#include "screen.h"
88645f5050Syouri#include "menus.h"
89645f5050Syouri#include "util.h"
90645f5050Syouri#include "parse.h"
91645f5050Syouri#include "version.h"
92645f5050Syouri#ifdef SOUNDS
93645f5050Syouri#  include "sound.h"
94645f5050Syouri#endif
95645f5050Syouri#ifdef VMS
96645f5050Syouri#  include <decw$include/Xatom.h>
97645f5050Syouri#else
98645f5050Syouri#  include <X11/Xatom.h>
99645f5050Syouri#endif
100645f5050Syouri
101645f5050Syouri/* For m4... */
102645f5050Syouri#ifdef USEM4
103645f5050Syouri#include <sys/param.h>
104645f5050Syouri#include <sys/types.h>
105645f5050Syouri#include <sys/socket.h>
106645f5050Syouri#include <netdb.h>
107645f5050Syouri
108645f5050Syouriextern int GoThroughM4;
109645f5050Syouriextern char *keepM4_filename;
110645f5050Syouriextern int KeepTmpFile;
111645f5050Syouri#endif
112645f5050Syouri
113645f5050Syouri#if defined(ultrix)
114645f5050Syouri#define NOSTEMP
115645f5050Syouri#endif
116645f5050Syouri
117645f5050Syouri#ifndef SYSTEM_INIT_FILE
118645f5050Syouri#ifdef VMS
119645f5050Syouri#define SYSTEM_INIT_FILE "DECW$SYSTEM_DEFAULTS:SYSTEM.CTWMRC"
120645f5050Syouri#else
121645f5050Syouri#define SYSTEM_INIT_FILE "/usr/lib/X11/twm/system.twmrc"
122645f5050Syouri#endif
123645f5050Syouri#endif
124645f5050Syouri#define BUF_LEN 300
125645f5050Syouri
126645f5050Syouristatic int ParseRandomPlacement (register char *s);
127645f5050Syouristatic int ParseButtonStyle (register char *s);
128645f5050Syouriextern int yyparse(void);
129645f5050Syouriextern void twmrc_error_prefix(void);
130645f5050Syouri
131645f5050Syouristatic FILE *twmrc;
132645f5050Syouristatic int ptr = 0;
133645f5050Syouristatic int len = 0;
134645f5050Syouristatic char buff[BUF_LEN+1];
135645f5050Syouristatic char overflowbuff[20];		/* really only need one */
136645f5050Syouristatic int overflowlen;
137645f5050Syouristatic char **stringListSource, *currentString;
138645f5050Syouristatic int ParseUsePPosition (register char *s);
139645f5050Syouri#ifdef USEM4
140645f5050Syouristatic FILE *start_m4(FILE *fraw);
141645f5050Syouristatic char *m4_defs(Display *display, char *host);
142645f5050Syouri#endif
143645f5050Syouri
144645f5050Syouriextern int mods;
145645f5050Syouri
146645f5050Syouriint ConstrainedMoveTime = 400;		/* milliseconds, event times */
147645f5050Syouri
148645f5050Syouriint RaiseDelay = 0;			/* msec, for AutoRaise */
149645f5050Syouri
150645f5050Syouristatic int twmStringListInput(void);
151645f5050Syouri#ifndef USEM4
152645f5050Syouristatic int twmFileInput(void);
153645f5050Syouri#else
154645f5050Syouristatic int m4twmFileInput (void);
155645f5050Syouri#endif
156645f5050Syouriint (*twmInputFunc)(void);
157645f5050Syouri
158645f5050Syouriextern char *defTwmrc[];		/* default bindings */
159645f5050Syouri
160645f5050Syouriextern char *captivename;
161645f5050Syouri
162645f5050Syouri/***********************************************************************
163645f5050Syouri *
164645f5050Syouri *  Procedure:
165645f5050Syouri *	ParseTwmrc - parse the .twmrc file
166645f5050Syouri *
167645f5050Syouri *  Inputs:
168645f5050Syouri *	filename  - the filename to parse.  A NULL indicates $HOME/.twmrc
169645f5050Syouri *
170645f5050Syouri ***********************************************************************
171645f5050Syouri */
172645f5050Syouri
173645f5050Syouri#ifdef YYDEBUG
174645f5050Syouriint yydebug = 1;
175645f5050Syouri#endif
176645f5050Syouri
177645f5050Syouristatic int doparse (int (*ifunc)(void), char *srctypename, char *srcname)
178645f5050Syouri{
179645f5050Syouri    mods = 0;
180645f5050Syouri    ptr = 0;
181645f5050Syouri    len = 0;
182645f5050Syouri    twmrc_lineno = 0;
183645f5050Syouri    ParseError = FALSE;
184645f5050Syouri    twmInputFunc = ifunc;
185645f5050Syouri    overflowlen = 0;
186645f5050Syouri
187645f5050Syouri    yyparse();
188645f5050Syouri
189645f5050Syouri    if (ParseError) {
190645f5050Syouri	fprintf (stderr, "%s:  errors found in twm %s",
191645f5050Syouri		 ProgramName, srctypename);
192645f5050Syouri	if (srcname) fprintf (stderr, " \"%s\"", srcname);
193645f5050Syouri	fprintf (stderr, "\n");
194645f5050Syouri    }
195645f5050Syouri    return (ParseError ? 0 : 1);
196645f5050Syouri}
197645f5050Syouri
198645f5050Syouri
199645f5050Syouriint ParseTwmrc (char *filename)
200645f5050Syouri{
201645f5050Syouri    int i;
202645f5050Syouri    char *home = NULL;
203645f5050Syouri    int homelen = 0;
204645f5050Syouri    char *cp = NULL;
205645f5050Syouri    char tmpfilename[257];
206645f5050Syouri#ifdef USEM4
207645f5050Syouri    static FILE *raw;
208645f5050Syouri#endif
209645f5050Syouri
210645f5050Syouri    /*
211645f5050Syouri     * Check for the twmrc file in the following order:
212645f5050Syouri     *       Unix                  |   VMS
213645f5050Syouri     *   0.  -f filename.#         | -f filename_#
214645f5050Syouri     *   1.  -f filename           | -f filename
215645f5050Syouri     *   2.  .ctwmrc.#             | ctwm.rc_#
216645f5050Syouri     *   3.  .ctwmrc               | ctwm.rc
217645f5050Syouri     *   4.  .twmrc.#              | twm.rc_#
218645f5050Syouri     *   5.  .twmrc                | twm.rc
219645f5050Syouri     *   6.  system.ctwmrc         | system.ctwmrc
220645f5050Syouri     */
221645f5050Syouri    for (twmrc = NULL, i = 0; !twmrc && i < 7; i++) {
222645f5050Syouri	switch (i) {
223645f5050Syouri#ifdef VMS
224645f5050Syouri	  case 0:
225645f5050Syouri	    if (filename != NULL)  {
226645f5050Syouri	       cp = tmpfilename;
227645f5050Syouri	       (void) sprintf (tmpfilename, "%s_%d", filename, Scr->screen);
228645f5050Syouri	    } else
229645f5050Syouri	       cp = filename;
230645f5050Syouri	    break;
231645f5050Syouri
232645f5050Syouri	  case 1:
233645f5050Syouri	    cp = filename;
234645f5050Syouri	    break;
235645f5050Syouri
236645f5050Syouri	  case 2:
237645f5050Syouri	    if (!filename) {
238645f5050Syouri		home = getenv ("DECW$USER_DEFAULTS");
239645f5050Syouri		if (home) {
240645f5050Syouri		    homelen = strlen (home);
241645f5050Syouri		    cp = tmpfilename;
242645f5050Syouri		    (void) sprintf (tmpfilename, "%sctwm.rc_%d",
243645f5050Syouri				    home, Scr->screen);
244645f5050Syouri		    break;
245645f5050Syouri		}
246645f5050Syouri	    }
247645f5050Syouri	    continue;
248645f5050Syouri
249645f5050Syouri	  case 3:
250645f5050Syouri	    if (home) {
251645f5050Syouri		tmpfilename[homelen + 7] = '\0';
252645f5050Syouri	    }
253645f5050Syouri	    break;
254645f5050Syouri
255645f5050Syouri	  case 4:
256645f5050Syouri	    if (!filename) {
257645f5050Syouri		home = getenv ("DECW$USER_DEFAULTS");
258645f5050Syouri		if (home) {
259645f5050Syouri		    homelen = strlen (home);
260645f5050Syouri		    cp = tmpfilename;
261645f5050Syouri		    (void) sprintf (tmpfilename, "%stwm.rc_%d",
262645f5050Syouri				    home, Scr->screen);
263645f5050Syouri		    break;
264645f5050Syouri		}
265645f5050Syouri	    }
266645f5050Syouri	    continue;
267645f5050Syouri
268645f5050Syouri	  case 5:
269645f5050Syouri	    if (home) {
270645f5050Syouri		tmpfilename[homelen + 6] = '\0';
271645f5050Syouri	    }
272645f5050Syouri	    break;
273645f5050Syouri#else
274645f5050Syouri	  case 0:			/* -f filename.# */
275645f5050Syouri	    if (filename) {
276645f5050Syouri		cp = tmpfilename;
277645f5050Syouri		(void) sprintf (tmpfilename, "%s.%d", filename, Scr->screen);
278645f5050Syouri	    }
279645f5050Syouri	    else cp = filename;
280645f5050Syouri	    break;
281645f5050Syouri
282645f5050Syouri	  case 1:			/* -f filename */
283645f5050Syouri	    cp = filename;
284645f5050Syouri	    break;
285645f5050Syouri
286645f5050Syouri	  case 2:			/* ~/.ctwmrc.screennum */
287645f5050Syouri	    if (!filename) {
288645f5050Syouri		home = getenv ("HOME");
289645f5050Syouri		if (home) {
290645f5050Syouri		    homelen = strlen (home);
291645f5050Syouri		    cp = tmpfilename;
292645f5050Syouri		    (void) sprintf (tmpfilename, "%s/.ctwmrc.%d",
293645f5050Syouri				    home, Scr->screen);
294645f5050Syouri		    break;
295645f5050Syouri		}
296645f5050Syouri	    }
297645f5050Syouri	    continue;
298645f5050Syouri
299645f5050Syouri	  case 3:			/* ~/.ctwmrc */
300645f5050Syouri	    if (home) {
301645f5050Syouri		tmpfilename[homelen + 8] = '\0';
302645f5050Syouri	    }
303645f5050Syouri	    break;
304645f5050Syouri
305645f5050Syouri	  case 4:			/* ~/.twmrc.screennum */
306645f5050Syouri	    if (!filename) {
307645f5050Syouri		home = getenv ("HOME");
308645f5050Syouri		if (home) {
309645f5050Syouri		    homelen = strlen (home);
310645f5050Syouri		    cp = tmpfilename;
311645f5050Syouri		    (void) sprintf (tmpfilename, "%s/.twmrc.%d",
312645f5050Syouri				    home, Scr->screen);
313645f5050Syouri		    break;
314645f5050Syouri		}
315645f5050Syouri	    }
316645f5050Syouri	    continue;
317645f5050Syouri
318645f5050Syouri	  case 5:			/* ~/.twmrc */
319645f5050Syouri	    if (home) {
320645f5050Syouri		tmpfilename[homelen + 7] = '\0'; /* C.L. */
321645f5050Syouri	    }
322645f5050Syouri	    break;
323645f5050Syouri#endif
324645f5050Syouri
325645f5050Syouri	  case 6:			/* system.twmrc */
326645f5050Syouri	    cp = SYSTEM_INIT_FILE;
327645f5050Syouri	    break;
328645f5050Syouri	}
329645f5050Syouri
330645f5050Syouri	if (cp) {
331645f5050Syouri            twmrc = fopen (cp, "r");
332645f5050Syouri#ifdef USEM4
333645f5050Syouri            raw = twmrc;
334645f5050Syouri#endif
335645f5050Syouri
336645f5050Syouri        }
337645f5050Syouri    }
338645f5050Syouri
339645f5050Syouri#ifdef USEM4
340645f5050Syouri    if (raw) {
341645f5050Syouri#else
342645f5050Syouri    if (twmrc) {
343645f5050Syouri#endif
344645f5050Syouri
345645f5050Syouri	int status;
346645f5050Syouri
347645f5050Syouri	if (filename && strncmp (cp, filename, strlen (filename))) {
348645f5050Syouri	    fprintf (stderr,
349645f5050Syouri		     "%s:  unable to open twmrc file %s, using %s instead\n",
350645f5050Syouri		     ProgramName, filename, cp);
351645f5050Syouri	}
352645f5050Syouri#ifdef USEM4
353645f5050Syouri	if (GoThroughM4) twmrc = start_m4(raw);
354645f5050Syouri	status = doparse (m4twmFileInput, "file", cp);
355645f5050Syouri	wait (0);
356645f5050Syouri	fclose (twmrc);
357645f5050Syouri        if (GoThroughM4) fclose (raw);
358645f5050Syouri#else
359645f5050Syouri	status = doparse (twmFileInput, "file", cp);
360645f5050Syouri	fclose (twmrc);
361645f5050Syouri#endif
362645f5050Syouri	return status;
363645f5050Syouri    } else {
364645f5050Syouri	if (filename) {
365645f5050Syouri	    fprintf (stderr,
366645f5050Syouri	"%s:  unable to open twmrc file %s, using built-in defaults instead\n",
367645f5050Syouri		     ProgramName, filename);
368645f5050Syouri	}
369645f5050Syouri	return ParseStringList (defTwmrc);
370645f5050Syouri    }
371645f5050Syouri}
372645f5050Syouri
373645f5050Syouriint ParseStringList (char **sl)
374645f5050Syouri{
375645f5050Syouri    stringListSource = sl;
376645f5050Syouri    currentString = *sl;
377645f5050Syouri    return doparse (twmStringListInput, "string list", (char *)NULL);
378645f5050Syouri}
379645f5050Syouri
380645f5050Syouri
381645f5050Syouri/***********************************************************************
382645f5050Syouri *
383645f5050Syouri *  Procedure:
384645f5050Syouri *	twmFileInput - redefinition of the lex input routine for file input
385645f5050Syouri *
386645f5050Syouri *  Returned Value:
387645f5050Syouri *	the next input character
388645f5050Syouri *
389645f5050Syouri ***********************************************************************
390645f5050Syouri */
391645f5050Syouri
392645f5050Syouri
393645f5050Syouri#ifndef USEM4
394645f5050Syouri
395645f5050Syouri/* This has Tom's include() funtionality.  This is utterly useless if you
396645f5050Syouri * can use m4 for the same thing.               Chris P. Ross */
397645f5050Syouri
398645f5050Syouri#define MAX_INCLUDES 10
399645f5050Syouri
400645f5050Syouristatic struct incl {
401645f5050Syouri     FILE *fp;
402645f5050Syouri     char *name;
403645f5050Syouri     int lineno;
404645f5050Syouri} rc_includes[MAX_INCLUDES];
405645f5050Syouristatic int include_file = 0;
406645f5050Syouri
407645f5050Syouri
408645f5050Syouristatic int twmFileInput()
409645f5050Syouri{
410645f5050Syouri    if (overflowlen) return (int) overflowbuff[--overflowlen];
411645f5050Syouri
412645f5050Syouri    while (ptr == len)
413645f5050Syouri    {
414645f5050Syouri        while (include_file) {
415645f5050Syouri            if (fgets(buff, BUF_LEN, rc_includes[include_file].fp) == NULL) {
416645f5050Syouri                free(rc_includes[include_file].name);
417645f5050Syouri                fclose(rc_includes[include_file].fp);
418645f5050Syouri                twmrc_lineno = rc_includes[include_file--].lineno;
419645f5050Syouri            } else
420645f5050Syouri                break;
421645f5050Syouri        }
422645f5050Syouri
423645f5050Syouri        if (!include_file)
424645f5050Syouri	if (fgets(buff, BUF_LEN, twmrc) == NULL)
425645f5050Syouri	    return 0;
426645f5050Syouri	twmrc_lineno++;
427645f5050Syouri
428645f5050Syouri        if (strncmp(buff, "include", 7) == 0) {
429645f5050Syouri             /* Whoops, an include file! */
430645f5050Syouri             char *p = buff + 7, *q;
431645f5050Syouri             FILE *fp;
432645f5050Syouri
433645f5050Syouri             while (isspace(*p)) p++;
434645f5050Syouri             for (q = p; *q && !isspace(*q); q++)
435645f5050Syouri                  continue;
436645f5050Syouri             *q = 0;
437645f5050Syouri
438645f5050Syouri             if ((fp = fopen(p, "r")) == NULL) {
439645f5050Syouri                  fprintf(stderr, "%s: Unable to open included init file %s\n",
440645f5050Syouri                          ProgramName, p);
441645f5050Syouri                  continue;
442645f5050Syouri             }
443645f5050Syouri             if (++include_file >= MAX_INCLUDES) {
444645f5050Syouri                  fprintf(stderr, "%s: init file includes nested too deep\n",
445645f5050Syouri                          ProgramName);
446645f5050Syouri                  continue;
447645f5050Syouri             }
448645f5050Syouri             rc_includes[include_file].fp = fp;
449645f5050Syouri             rc_includes[include_file].lineno = twmrc_lineno;
450645f5050Syouri             twmrc_lineno = 0;
451645f5050Syouri             rc_includes[include_file].name = malloc(strlen(p)+1);
452645f5050Syouri             strcpy(rc_includes[include_file].name, p);
453645f5050Syouri             continue;
454645f5050Syouri        }
455645f5050Syouri	ptr = 0;
456645f5050Syouri	len = strlen(buff);
457645f5050Syouri    }
458645f5050Syouri    return ((int)buff[ptr++]);
459645f5050Syouri}
460645f5050Syouri#else /* USEM4 */
461645f5050Syouri/* If you're going to use m4, use this version instead.  Much simpler.
462645f5050Syouri * m4 ism's credit to Josh Osborne (stripes) */
463645f5050Syouri
464645f5050Syouristatic int m4twmFileInput(void)
465645f5050Syouri{
466645f5050Syouri    int line;
467645f5050Syouri    static FILE *cp = NULL;
468645f5050Syouri
469645f5050Syouri    if ( cp == NULL && keepM4_filename ) {
470645f5050Syouri      cp = fopen (keepM4_filename,"w");
471645f5050Syouri      if ( cp == NULL ) {
472645f5050Syouri	fprintf (stderr,
473645f5050Syouri		 "%s:  unable to create m4 output %s, ignoring\n",
474645f5050Syouri		 ProgramName, keepM4_filename);
475645f5050Syouri	keepM4_filename = NULL;
476645f5050Syouri      }
477645f5050Syouri    }
478645f5050Syouri
479645f5050Syouri    if (overflowlen){
480645f5050Syouri	return((int) overflowbuff[--overflowlen]);
481645f5050Syouri    }
482645f5050Syouri
483645f5050Syouri    while (ptr == len) {
484645f5050Syouri	nextline:
485645f5050Syouri	if (fgets(buff, BUF_LEN, twmrc) == NULL) {
486645f5050Syouri	  if ( cp ) fclose (cp);
487645f5050Syouri	  return(0);
488645f5050Syouri	}
489645f5050Syouri	if ( cp ) fputs (buff, cp);
490645f5050Syouri
491645f5050Syouri	if (sscanf(buff, "#line %d", &line)) {
492645f5050Syouri	    twmrc_lineno = line - 1;
493645f5050Syouri	    goto nextline;
494645f5050Syouri	} else {
495645f5050Syouri	    twmrc_lineno++;
496645f5050Syouri	}
497645f5050Syouri
498645f5050Syouri	ptr = 0;
499645f5050Syouri	len = strlen(buff);
500645f5050Syouri    }
501645f5050Syouri    return ((int)buff[ptr++]);
502645f5050Syouri}
503645f5050Syouri#endif /* USEM4 */
504645f5050Syouri
505645f5050Syouri
506645f5050Syouristatic int twmStringListInput(void)
507645f5050Syouri{
508645f5050Syouri    if (overflowlen) return (int) overflowbuff[--overflowlen];
509645f5050Syouri
510645f5050Syouri    /*
511645f5050Syouri     * return the character currently pointed to
512645f5050Syouri     */
513645f5050Syouri    if (currentString) {
514645f5050Syouri	unsigned int c = (unsigned int) *currentString++;
515645f5050Syouri
516645f5050Syouri	if (c) return c;		/* if non-nul char */
517645f5050Syouri	currentString = *++stringListSource;  /* advance to next bol */
518645f5050Syouri	return '\n';			/* but say that we hit last eol */
519645f5050Syouri    }
520645f5050Syouri    return 0;				/* eof */
521645f5050Syouri}
522645f5050Syouri
523645f5050Syouri
524645f5050Syouri/***********************************************************************
525645f5050Syouri *
526645f5050Syouri *  Procedure:
527645f5050Syouri *	twmUnput - redefinition of the lex unput routine
528645f5050Syouri *
529645f5050Syouri *  Inputs:
530645f5050Syouri *	c	- the character to push back onto the input stream
531645f5050Syouri *
532645f5050Syouri ***********************************************************************
533645f5050Syouri */
534645f5050Syouri
535645f5050Syourivoid twmUnput (int c)
536645f5050Syouri{
537645f5050Syouri    if (overflowlen < sizeof overflowbuff) {
538645f5050Syouri	overflowbuff[overflowlen++] = (char) c;
539645f5050Syouri    } else {
540645f5050Syouri	twmrc_error_prefix ();
541645f5050Syouri	fprintf (stderr, "unable to unput character (%c)\n",
542645f5050Syouri		 c);
543645f5050Syouri    }
544645f5050Syouri}
545645f5050Syouri
546645f5050Syouri
547645f5050Syouri/***********************************************************************
548645f5050Syouri *
549645f5050Syouri *  Procedure:
550645f5050Syouri *	TwmOutput - redefinition of the lex output routine
551645f5050Syouri *
552645f5050Syouri *  Inputs:
553645f5050Syouri *	c	- the character to print
554645f5050Syouri *
555645f5050Syouri ***********************************************************************
556645f5050Syouri */
557645f5050Syouri
558645f5050Syourivoid TwmOutput(int c)
559645f5050Syouri{
560645f5050Syouri    putchar(c);
561645f5050Syouri}
562645f5050Syouri
563645f5050Syouri
564645f5050Syouri/**********************************************************************
565645f5050Syouri *
566645f5050Syouri *  Parsing table and routines
567645f5050Syouri *
568645f5050Syouri ***********************************************************************/
569645f5050Syouri
570645f5050Syouritypedef struct _TwmKeyword {
571645f5050Syouri    char *name;
572645f5050Syouri    int value;
573645f5050Syouri    int subnum;
574645f5050Syouri} TwmKeyword;
575645f5050Syouri
576645f5050Syouri#define kw0_NoDefaults			1
577645f5050Syouri#define kw0_AutoRelativeResize		2
578645f5050Syouri#define kw0_ForceIcons			3
579645f5050Syouri#define kw0_NoIconManagers		4
580645f5050Syouri#define kw0_InterpolateMenuColors	6
581645f5050Syouri#define kw0_NoVersion			7
582645f5050Syouri#define kw0_SortIconManager		8
583645f5050Syouri#define kw0_NoGrabServer		9
584645f5050Syouri#define kw0_NoMenuShadows		10
585645f5050Syouri#define kw0_NoRaiseOnMove		11
586645f5050Syouri#define kw0_NoRaiseOnResize		12
587645f5050Syouri#define kw0_NoRaiseOnDeiconify		13
588645f5050Syouri#define kw0_DontMoveOff			14
589645f5050Syouri#define kw0_NoBackingStore		15
590645f5050Syouri#define kw0_NoSaveUnders		16
591645f5050Syouri#define kw0_RestartPreviousState	17
592645f5050Syouri#define kw0_ClientBorderWidth		18
593645f5050Syouri#define kw0_NoTitleFocus		19
594645f5050Syouri#define kw0_DecorateTransients		21
595645f5050Syouri#define kw0_ShowIconManager		22
596645f5050Syouri#define kw0_NoCaseSensitive		23
597645f5050Syouri#define kw0_NoRaiseOnWarp		24
598645f5050Syouri#define kw0_WarpUnmapped		25
599645f5050Syouri#define kw0_ShowWorkspaceManager	27
600645f5050Syouri#define kw0_StartInMapState		28
601645f5050Syouri#define kw0_NoShowOccupyAll		29
602645f5050Syouri#define kw0_AutoOccupy			30
603645f5050Syouri#define kw0_TransientHasOccupation	31
604645f5050Syouri#define kw0_DontPaintRootWindow		32
605645f5050Syouri#define kw0_Use3DMenus			33
606645f5050Syouri#define kw0_Use3DTitles			34
607645f5050Syouri#define kw0_Use3DIconManagers		35
608645f5050Syouri#define kw0_Use3DBorders		36
609645f5050Syouri#define kw0_SunkFocusWindowTitle	37
610645f5050Syouri#define kw0_BeNiceToColormap		38
611645f5050Syouri#define kw0_WarpRingOnScreen		40
612645f5050Syouri#define kw0_NoIconManagerFocus		41
613645f5050Syouri#define kw0_StayUpMenus			42
614645f5050Syouri#define kw0_ClickToFocus		43
615645f5050Syouri#define kw0_BorderResizeCursors		44
616645f5050Syouri#define kw0_ReallyMoveInWorkspaceManager 45
617645f5050Syouri#define kw0_ShowWinWhenMovingInWmgr	46
618645f5050Syouri#define kw0_Use3DWMap			47
619645f5050Syouri#define kw0_ReverseCurrentWorkspace	48
620645f5050Syouri#define kw0_DontWarpCursorInWMap	49
621645f5050Syouri#define kw0_CenterFeedbackWindow	50
622645f5050Syouri#define kw0_WarpToDefaultMenuEntry	51
623645f5050Syouri#define kw0_ShrinkIconTitles		52
624645f5050Syouri#define kw0_AutoRaiseIcons		53
625645f5050Syouri#define kw0_use3DIconBorders		54
626645f5050Syouri#define kw0_UseSunkTitlePixmap          55
627645f5050Syouri#define kw0_ShortAllWindowsMenus	56
628645f5050Syouri#define kw0_RaiseWhenAutoUnSqueeze	57
629645f5050Syouri#define kw0_RaiseOnClick		58
630645f5050Syouri#define kw0_IgnoreLockModifier		59
631645f5050Syouri#define kw0_AutoFocusToTransients       60 /* kai */
632645f5050Syouri#define kw0_PackNewWindows		61
633645f5050Syouri#define kw0_IgnoreCaseInMenuSelection	62
634645f5050Syouri#define kw0_SloppyFocus                 63
635645f5050Syouri#define kw0_NoImagesInWorkSpaceManager  64
636645f5050Syouri#define kw0_NoWarpToMenuTitle           65
637645f5050Syouri#define kw0_SaveWorkspaceFocus          66 /* blais */
638645f5050Syouri#define kw0_RaiseOnWarp			67
639645f5050Syouri
640645f5050Syouri#define kws_UsePPosition		1
641645f5050Syouri#define kws_IconFont			2
642645f5050Syouri#define kws_ResizeFont			3
643645f5050Syouri#define kws_MenuFont			4
644645f5050Syouri#define kws_TitleFont			5
645645f5050Syouri#define kws_IconManagerFont		6
646645f5050Syouri#define kws_UnknownIcon			7
647645f5050Syouri#define kws_IconDirectory		8
648645f5050Syouri#define kws_MaxWindowSize		9
649645f5050Syouri#define kws_PixmapDirectory		10
650645f5050Syouri/* RandomPlacement moved because it's now a string string keyword */
651645f5050Syouri#define kws_IconJustification		12
652645f5050Syouri#define kws_TitleJustification		13
653645f5050Syouri#define kws_IconRegionJustification	14
654645f5050Syouri#define kws_IconRegionAlignement	15
655645f5050Syouri#ifdef SOUNDS
656645f5050Syouri#define kws_SoundHost			16
657645f5050Syouri#endif
658645f5050Syouri#define kws_WMgrButtonStyle		17
659645f5050Syouri#define kws_WorkSpaceFont               18
660645f5050Syouri#define kws_IconifyStyle                19
661645f5050Syouri
662645f5050Syouri#define kwss_RandomPlacement		1
663645f5050Syouri
664645f5050Syouri#define kwn_ConstrainedMoveTime		1
665645f5050Syouri#define kwn_MoveDelta			2
666645f5050Syouri#define kwn_XorValue			3
667645f5050Syouri#define kwn_FramePadding		4
668645f5050Syouri#define kwn_TitlePadding		5
669645f5050Syouri#define kwn_ButtonIndent		6
670645f5050Syouri#define kwn_BorderWidth			7
671645f5050Syouri#define kwn_IconBorderWidth		8
672645f5050Syouri#define kwn_TitleButtonBorderWidth	9
673645f5050Syouri#define kwn_RaiseDelay			10
674645f5050Syouri#define kwn_TransientOnTop		11
675645f5050Syouri#define kwn_OpaqueMoveThreshold		12
676645f5050Syouri#define kwn_OpaqueResizeThreshold	13
677645f5050Syouri#define kwn_WMgrVertButtonIndent	14
678645f5050Syouri#define kwn_WMgrHorizButtonIndent	15
679645f5050Syouri#define kwn_ClearShadowContrast		16
680645f5050Syouri#define kwn_DarkShadowContrast		17
681645f5050Syouri#define kwn_WMgrButtonShadowDepth	18
682645f5050Syouri#define kwn_MaxIconTitleWidth		19
683645f5050Syouri#define kwn_AnimationSpeed		20
684645f5050Syouri#define kwn_ThreeDBorderWidth		21
685645f5050Syouri#define kwn_MoveOffResistance		22
686645f5050Syouri#define kwn_BorderShadowDepth		23
687645f5050Syouri#define kwn_TitleShadowDepth		24
688645f5050Syouri#define kwn_TitleButtonShadowDepth	25
689645f5050Syouri#define kwn_MenuShadowDepth		26
690645f5050Syouri#define kwn_IconManagerShadowDepth	27
691645f5050Syouri#define kwn_MovePackResistance		28
692645f5050Syouri#define kwn_XMoveGrid			29
693645f5050Syouri#define kwn_YMoveGrid			30
694645f5050Syouri#define kwn_OpenWindowTimeout		31
695645f5050Syouri#define kwn_RaiseOnClickButton		32
696645f5050Syouri
697645f5050Syouri#define kwn_BorderTop			33
698645f5050Syouri#define kwn_BorderBottom		34
699645f5050Syouri#define kwn_BorderLeft			35
700645f5050Syouri#define kwn_BorderRight			36
701645f5050Syouri
702645f5050Syouri#define kwcl_BorderColor		1
703645f5050Syouri#define kwcl_IconManagerHighlight	2
704645f5050Syouri#define kwcl_BorderTileForeground	3
705645f5050Syouri#define kwcl_BorderTileBackground	4
706645f5050Syouri#define kwcl_TitleForeground		5
707645f5050Syouri#define kwcl_TitleBackground		6
708645f5050Syouri#define kwcl_IconForeground		7
709645f5050Syouri#define kwcl_IconBackground		8
710645f5050Syouri#define kwcl_IconBorderColor		9
711645f5050Syouri#define kwcl_IconManagerForeground	10
712645f5050Syouri#define kwcl_IconManagerBackground	11
713645f5050Syouri#define kwcl_MapWindowBackground	12
714645f5050Syouri#define kwcl_MapWindowForeground	13
715645f5050Syouri
716645f5050Syouri#define kwc_DefaultForeground		1
717645f5050Syouri#define kwc_DefaultBackground		2
718645f5050Syouri#define kwc_MenuForeground		3
719645f5050Syouri#define kwc_MenuBackground		4
720645f5050Syouri#define kwc_MenuTitleForeground		5
721645f5050Syouri#define kwc_MenuTitleBackground		6
722645f5050Syouri#define kwc_MenuShadowColor		7
723645f5050Syouri
724645f5050Syouri/*
725645f5050Syouri * The following is sorted alphabetically according to name (which must be
726645f5050Syouri * in lowercase and only contain the letters a-z).  It is fed to a binary
727645f5050Syouri * search to parse keywords.
728645f5050Syouri */
729645f5050Syouristatic TwmKeyword keytable[] = {
730645f5050Syouri    { "a",			ALTER, 0 },
731645f5050Syouri    { "all",			ALL, 0 },
732645f5050Syouri    { "alter",			ALTER, 0 },
733645f5050Syouri    { "alwaysontop",		ALWAYS_ON_TOP, 0 },
734645f5050Syouri    { "alwaysshowwindowwhenmovingfromworkspacemanager", KEYWORD, kw0_ShowWinWhenMovingInWmgr },
735645f5050Syouri    { "alwayssqueezetogravity",	ALWAYSSQUEEZETOGRAVITY, 0 },
736645f5050Syouri    { "animationspeed",		NKEYWORD, kwn_AnimationSpeed },
737645f5050Syouri    { "autofocustotransients",  KEYWORD, kw0_AutoFocusToTransients }, /* kai */
738645f5050Syouri    { "autolower",		AUTO_LOWER, 0 },
739645f5050Syouri    { "autooccupy",		KEYWORD, kw0_AutoOccupy },
740645f5050Syouri    { "autoraise",		AUTO_RAISE, 0 },
741645f5050Syouri    { "autoraiseicons",		KEYWORD, kw0_AutoRaiseIcons },
742645f5050Syouri    { "autorelativeresize",	KEYWORD, kw0_AutoRelativeResize },
743645f5050Syouri    { "autosqueeze",		AUTOSQUEEZE, 0 },
744645f5050Syouri    { "benicetocolormap",	KEYWORD, kw0_BeNiceToColormap },
745645f5050Syouri    { "borderbottom",		NKEYWORD, kwn_BorderBottom },
746645f5050Syouri    { "bordercolor",		CLKEYWORD, kwcl_BorderColor },
747645f5050Syouri    { "borderleft",		NKEYWORD, kwn_BorderLeft },
748645f5050Syouri    { "borderresizecursors",	KEYWORD, kw0_BorderResizeCursors },
749645f5050Syouri    { "borderright",		NKEYWORD, kwn_BorderRight },
750645f5050Syouri    { "bordershadowdepth",	NKEYWORD, kwn_BorderShadowDepth },
751645f5050Syouri    { "bordertilebackground",	CLKEYWORD, kwcl_BorderTileBackground },
752645f5050Syouri    { "bordertileforeground",	CLKEYWORD, kwcl_BorderTileForeground },
753645f5050Syouri    { "bordertop",		NKEYWORD, kwn_BorderTop },
754645f5050Syouri    { "borderwidth",		NKEYWORD, kwn_BorderWidth },
755645f5050Syouri    { "button",			BUTTON, 0 },
756645f5050Syouri    { "buttonindent",		NKEYWORD, kwn_ButtonIndent },
757645f5050Syouri    { "c",			CONTROL, 0 },
758645f5050Syouri    { "center",			JKEYWORD, J_CENTER },
759645f5050Syouri    { "centerfeedbackwindow",	KEYWORD, kw0_CenterFeedbackWindow },
760645f5050Syouri    { "changeworkspacefunction", CHANGE_WORKSPACE_FUNCTION, 0 },
761645f5050Syouri    { "clearshadowcontrast",	NKEYWORD, kwn_ClearShadowContrast },
762645f5050Syouri    { "clicktofocus",		KEYWORD, kw0_ClickToFocus },
763645f5050Syouri    { "clientborderwidth",	KEYWORD, kw0_ClientBorderWidth },
764645f5050Syouri    { "color",			COLOR, 0 },
765645f5050Syouri    { "constrainedmovetime",	NKEYWORD, kwn_ConstrainedMoveTime },
766645f5050Syouri    { "control",		CONTROL, 0 },
767645f5050Syouri    { "cursors",		CURSORS, 0 },
768645f5050Syouri    { "darkshadowcontrast",	NKEYWORD, kwn_DarkShadowContrast },
769645f5050Syouri    { "decoratetransients",	KEYWORD, kw0_DecorateTransients },
770645f5050Syouri    { "defaultbackground",	CKEYWORD, kwc_DefaultBackground },
771645f5050Syouri    { "defaultforeground",	CKEYWORD, kwc_DefaultForeground },
772645f5050Syouri    { "defaultfunction",	DEFAULT_FUNCTION, 0 },
773645f5050Syouri    { "deiconifyfunction",	DEICONIFY_FUNCTION, 0 },
774645f5050Syouri    { "destroy",		KILL, 0 },
775645f5050Syouri    { "donticonifybyunmapping",	DONT_ICONIFY_BY_UNMAPPING, 0 },
776645f5050Syouri    { "dontmoveoff",		KEYWORD, kw0_DontMoveOff },
777645f5050Syouri    { "dontpaintrootwindow",	KEYWORD, kw0_DontPaintRootWindow },
778645f5050Syouri    { "dontsave",		DONT_SAVE, 0 },
779645f5050Syouri    { "dontsetinactive",	DONTSETINACTIVE, 0 },
780645f5050Syouri    { "dontsqueezetitle",	DONT_SQUEEZE_TITLE, 0 },
781645f5050Syouri    { "donttoggleworkspacemanagerstate", DONTTOGGLEWORKSPACEMANAGERSTATE, 0 },
782645f5050Syouri    { "dontwarpcursorinwmap",	KEYWORD, kw0_DontWarpCursorInWMap },
783645f5050Syouri    { "east",			DKEYWORD, D_EAST },
784645f5050Syouri    { "f",			FRAME, 0 },
785645f5050Syouri    { "f.addtoworkspace",	FSKEYWORD, F_ADDTOWORKSPACE },
786645f5050Syouri    { "f.adoptwindow",		FKEYWORD, F_ADOPTWINDOW },
787645f5050Syouri    { "f.altcontext",		FKEYWORD, F_ALTCONTEXT },
788645f5050Syouri    { "f.altkeymap",		FSKEYWORD, F_ALTKEYMAP },
789645f5050Syouri    { "f.autolower",		FKEYWORD, F_AUTOLOWER },
790645f5050Syouri    { "f.autoraise",		FKEYWORD, F_AUTORAISE },
791645f5050Syouri    { "f.backiconmgr",		FKEYWORD, F_BACKICONMGR },
792645f5050Syouri    { "f.backmapiconmgr",	FKEYWORD, F_BACKMAPICONMGR },
793645f5050Syouri    { "f.beep",			FKEYWORD, F_BEEP },
794645f5050Syouri    { "f.bottomzoom",		FKEYWORD, F_BOTTOMZOOM },
795645f5050Syouri    { "f.changesize",           FSKEYWORD, F_CHANGESIZE },
796645f5050Syouri    { "f.circledown",		FKEYWORD, F_CIRCLEDOWN },
797645f5050Syouri    { "f.circleup",		FKEYWORD, F_CIRCLEUP },
798645f5050Syouri    { "f.colormap",		FSKEYWORD, F_COLORMAP },
799645f5050Syouri    { "f.cut",			FSKEYWORD, F_CUT },
800645f5050Syouri    { "f.cutfile",		FKEYWORD, F_CUTFILE },
801645f5050Syouri    { "f.deiconify",		FKEYWORD, F_DEICONIFY },
802645f5050Syouri    { "f.delete",		FKEYWORD, F_DELETE },
803645f5050Syouri    { "f.deleteordestroy",	FKEYWORD, F_DELETEORDESTROY },
804645f5050Syouri    { "f.deltastop",		FKEYWORD, F_DELTASTOP },
805645f5050Syouri    { "f.destroy",		FKEYWORD, F_DESTROY },
806645f5050Syouri    { "f.downiconmgr",		FKEYWORD, F_DOWNICONMGR },
807645f5050Syouri    { "f.downworkspace",	FKEYWORD, F_DOWNWORKSPACE },
808645f5050Syouri    { "f.exec",			FSKEYWORD, F_EXEC },
809645f5050Syouri    { "f.file",			FSKEYWORD, F_FILE },
810645f5050Syouri    { "f.fill",			FSKEYWORD, F_FILL },
811645f5050Syouri    { "f.fittocontent",		FKEYWORD, F_FITTOCONTENT },
812645f5050Syouri    { "f.focus",		FKEYWORD, F_FOCUS },
813645f5050Syouri    { "f.forcemove",		FKEYWORD, F_FORCEMOVE },
814645f5050Syouri    { "f.forwiconmgr",		FKEYWORD, F_FORWICONMGR },
815645f5050Syouri    { "f.forwmapiconmgr",	FKEYWORD, F_FORWMAPICONMGR },
816645f5050Syouri    { "f.fullzoom",		FKEYWORD, F_FULLZOOM },
817645f5050Syouri    { "f.function",		FSKEYWORD, F_FUNCTION },
818645f5050Syouri    { "f.gotoworkspace",	FSKEYWORD, F_GOTOWORKSPACE },
819645f5050Syouri    { "f.hbzoom",		FKEYWORD, F_BOTTOMZOOM },
820645f5050Syouri    { "f.hideiconmgr",		FKEYWORD, F_HIDELIST },
821645f5050Syouri    { "f.hideworkspacemgr",	FKEYWORD, F_HIDEWORKMGR },
822645f5050Syouri    { "f.horizoom",		FKEYWORD, F_HORIZOOM },
823645f5050Syouri    { "f.htzoom",		FKEYWORD, F_TOPZOOM },
824645f5050Syouri    { "f.hypermove",		FKEYWORD, F_HYPERMOVE },
825645f5050Syouri    { "f.hzoom",		FKEYWORD, F_HORIZOOM },
826645f5050Syouri    { "f.iconify",		FKEYWORD, F_ICONIFY },
827645f5050Syouri    { "f.identify",		FKEYWORD, F_IDENTIFY },
828645f5050Syouri    { "f.initsize",		FKEYWORD, F_INITSIZE },
829645f5050Syouri    { "f.jumpdown",		FSKEYWORD, F_JUMPDOWN },
830645f5050Syouri    { "f.jumpleft",		FSKEYWORD, F_JUMPLEFT },
831645f5050Syouri    { "f.jumpright",		FSKEYWORD, F_JUMPRIGHT },
832645f5050Syouri    { "f.jumpup",		FSKEYWORD, F_JUMPUP },
833645f5050Syouri    { "f.lefticonmgr",		FKEYWORD, F_LEFTICONMGR },
834645f5050Syouri    { "f.leftworkspace",	FKEYWORD, F_LEFTWORKSPACE },
835645f5050Syouri    { "f.leftzoom",		FKEYWORD, F_LEFTZOOM },
836645f5050Syouri    { "f.lower",		FKEYWORD, F_LOWER },
837645f5050Syouri    { "f.menu",			FSKEYWORD, F_MENU },
838645f5050Syouri    { "f.move",			FKEYWORD, F_MOVE },
839645f5050Syouri    { "f.movemenu",		FKEYWORD, F_MOVEMENU },
840645f5050Syouri    { "f.movepack",		FKEYWORD, F_MOVEPACK },
841645f5050Syouri    { "f.movepush",		FKEYWORD, F_MOVEPUSH },
842645f5050Syouri    { "f.moveresize",		FSKEYWORD, F_MOVERESIZE },
843645f5050Syouri    { "f.movetitlebar",		FKEYWORD, F_MOVETITLEBAR },
844645f5050Syouri    { "f.movetonextworkspace",  FKEYWORD, F_MOVETONEXTWORKSPACE },
845645f5050Syouri    { "f.movetonextworkspaceandfollow",  FKEYWORD, F_MOVETONEXTWORKSPACEANDFOLLOW },
846645f5050Syouri    { "f.movetoprevworkspace",  FKEYWORD, F_MOVETOPREVWORKSPACE },
847645f5050Syouri    { "f.movetoprevworkspaceandfollow",  FKEYWORD, F_MOVETOPREVWORKSPACEANDFOLLOW },
848645f5050Syouri    { "f.nexticonmgr",		FKEYWORD, F_NEXTICONMGR },
849645f5050Syouri    { "f.nextworkspace",	FKEYWORD, F_NEXTWORKSPACE },
850645f5050Syouri    { "f.nop",			FKEYWORD, F_NOP },
851645f5050Syouri    { "f.occupy",		FKEYWORD, F_OCCUPY },
852645f5050Syouri    { "f.occupyall",		FKEYWORD, F_OCCUPYALL },
853645f5050Syouri    { "f.pack",			FSKEYWORD, F_PACK },
854645f5050Syouri    { "f.pin",			FKEYWORD, F_PIN },
855645f5050Syouri    { "f.previconmgr",		FKEYWORD, F_PREVICONMGR },
856645f5050Syouri    { "f.prevworkspace",	FKEYWORD, F_PREVWORKSPACE },
857645f5050Syouri    { "f.quit",			FKEYWORD, F_QUIT },
858645f5050Syouri    { "f.raise",		FKEYWORD, F_RAISE },
859645f5050Syouri    { "f.raiseicons",		FKEYWORD, F_RAISEICONS },
860645f5050Syouri    { "f.raiselower",		FKEYWORD, F_RAISELOWER },
861645f5050Syouri    { "f.refresh",		FKEYWORD, F_REFRESH },
862645f5050Syouri    { "f.removefromworkspace",	FSKEYWORD, F_REMOVEFROMWORKSPACE },
863645f5050Syouri#ifdef SOUNDS
864645f5050Syouri    { "f.rereadsounds",		FKEYWORD, F_REREADSOUNDS },
865645f5050Syouri#endif
866645f5050Syouri    { "f.resize",		FKEYWORD, F_RESIZE },
867645f5050Syouri    { "f.restart",		FKEYWORD, F_RESTART },
868645f5050Syouri    { "f.restoregeometry",	FKEYWORD, F_RESTOREGEOMETRY },
869645f5050Syouri    { "f.righticonmgr",		FKEYWORD, F_RIGHTICONMGR },
870645f5050Syouri    { "f.rightworkspace",	FKEYWORD, F_RIGHTWORKSPACE },
871645f5050Syouri    { "f.rightzoom",		FKEYWORD, F_RIGHTZOOM },
872645f5050Syouri    { "f.ring",			FKEYWORD, F_RING },
873645f5050Syouri    { "f.savegeometry",		FKEYWORD, F_SAVEGEOMETRY },
874645f5050Syouri    { "f.saveyourself",		FKEYWORD, F_SAVEYOURSELF },
875645f5050Syouri    { "f.separator",		FKEYWORD, F_SEPARATOR },
876645f5050Syouri    { "f.setbuttonsstate",	FKEYWORD, F_SETBUTTONSTATE },
877645f5050Syouri    { "f.setmapstate",		FKEYWORD, F_SETMAPSTATE },
878645f5050Syouri    { "f.showbackground",      	FKEYWORD, F_SHOWBGRD },
879645f5050Syouri    { "f.showiconmgr",		FKEYWORD, F_SHOWLIST },
880645f5050Syouri    { "f.showworkspacemgr",	FKEYWORD, F_SHOWWORKMGR },
881645f5050Syouri    { "f.slowdownanimation",	FKEYWORD, F_SLOWDOWNANIMATION },
882645f5050Syouri    { "f.sorticonmgr",		FKEYWORD, F_SORTICONMGR },
883645f5050Syouri    { "f.source",		FSKEYWORD, F_BEEP },  /* XXX - don't work */
884645f5050Syouri    { "f.speedupanimation",	FKEYWORD, F_SPEEDUPANIMATION },
885645f5050Syouri    { "f.squeeze",		FKEYWORD, F_SQUEEZE },
886645f5050Syouri    { "f.startanimation",	FKEYWORD, F_STARTANIMATION },
887645f5050Syouri    { "f.stopanimation",	FKEYWORD, F_STOPANIMATION },
888645f5050Syouri    { "f.title",		FKEYWORD, F_TITLE },
889645f5050Syouri    { "f.toggleoccupation",	FSKEYWORD, F_TOGGLEOCCUPATION },
890645f5050Syouri#ifdef SOUNDS
891645f5050Syouri    { "f.togglesound",		FKEYWORD, F_TOGGLESOUND },
892645f5050Syouri#endif
893645f5050Syouri    { "f.togglestate",		FKEYWORD, F_TOGGLESTATE },
894645f5050Syouri    { "f.toggleworkspacemgr",	FKEYWORD, F_TOGGLEWORKMGR },
895645f5050Syouri    { "f.topzoom",		FKEYWORD, F_TOPZOOM },
896645f5050Syouri    { "f.trace",		FSKEYWORD, F_TRACE },
897645f5050Syouri    { "f.twmrc",		FKEYWORD, F_RESTART },
898645f5050Syouri    { "f.unfocus",		FKEYWORD, F_UNFOCUS },
899645f5050Syouri    { "f.upiconmgr",		FKEYWORD, F_UPICONMGR },
900645f5050Syouri    { "f.upworkspace",		FKEYWORD, F_UPWORKSPACE },
901645f5050Syouri    { "f.vanish",		FKEYWORD, F_VANISH },
902645f5050Syouri    { "f.version",		FKEYWORD, F_VERSION },
903645f5050Syouri    { "f.vlzoom",		FKEYWORD, F_LEFTZOOM },
904645f5050Syouri    { "f.vrzoom",		FKEYWORD, F_RIGHTZOOM },
905645f5050Syouri    { "f.warphere",		FSKEYWORD, F_WARPHERE },
906645f5050Syouri    { "f.warpring",		FSKEYWORD, F_WARPRING },
907645f5050Syouri    { "f.warpto",		FSKEYWORD, F_WARPTO },
908645f5050Syouri    { "f.warptoiconmgr",	FSKEYWORD, F_WARPTOICONMGR },
909645f5050Syouri    { "f.warptoscreen",		FSKEYWORD, F_WARPTOSCREEN },
910645f5050Syouri    { "f.winrefresh",		FKEYWORD, F_WINREFRESH },
911645f5050Syouri    { "f.zoom",			FKEYWORD, F_ZOOM },
912645f5050Syouri    { "forceicons",		KEYWORD, kw0_ForceIcons },
913645f5050Syouri    { "frame",			FRAME, 0 },
914645f5050Syouri    { "framepadding",		NKEYWORD, kwn_FramePadding },
915645f5050Syouri    { "function",		FUNCTION, 0 },
916645f5050Syouri    { "i",			ICON, 0 },
917645f5050Syouri    { "icon",			ICON, 0 },
918645f5050Syouri    { "iconbackground",		CLKEYWORD, kwcl_IconBackground },
919645f5050Syouri    { "iconbordercolor",	CLKEYWORD, kwcl_IconBorderColor },
920645f5050Syouri    { "iconborderwidth",	NKEYWORD, kwn_IconBorderWidth },
921645f5050Syouri    { "icondirectory",		SKEYWORD, kws_IconDirectory },
922645f5050Syouri    { "iconfont",		SKEYWORD, kws_IconFont },
923645f5050Syouri    { "iconforeground",		CLKEYWORD, kwcl_IconForeground },
924645f5050Syouri    { "iconifybyunmapping",	ICONIFY_BY_UNMAPPING, 0 },
925645f5050Syouri    { "iconifyfunction",	ICONIFY_FUNCTION, 0 },
926645f5050Syouri    { "iconifystyle",		SKEYWORD, kws_IconifyStyle },
927645f5050Syouri    { "iconjustification",	SKEYWORD, kws_IconJustification },
928645f5050Syouri    { "iconmanagerbackground",	CLKEYWORD, kwcl_IconManagerBackground },
929645f5050Syouri    { "iconmanagerdontshow",	ICONMGR_NOSHOW, 0 },
930645f5050Syouri    { "iconmanagerfont",	SKEYWORD, kws_IconManagerFont },
931645f5050Syouri    { "iconmanagerforeground",	CLKEYWORD, kwcl_IconManagerForeground },
932645f5050Syouri    { "iconmanagergeometry",	ICONMGR_GEOMETRY, 0 },
933645f5050Syouri    { "iconmanagerhighlight",	CLKEYWORD, kwcl_IconManagerHighlight },
934645f5050Syouri    { "iconmanagers",		ICONMGRS, 0 },
935645f5050Syouri    { "iconmanagershadowdepth",	NKEYWORD, kwn_IconManagerShadowDepth },
936645f5050Syouri    { "iconmanagershow",	ICONMGR_SHOW, 0 },
937645f5050Syouri    { "iconmenudontshow",	ICONMENU_DONTSHOW, 0 },
938645f5050Syouri    { "iconmgr",		ICONMGR, 0 },
939645f5050Syouri    { "iconregion",		ICON_REGION, 0 },
940645f5050Syouri    { "iconregionalignement",	SKEYWORD, kws_IconRegionAlignement },
941645f5050Syouri    { "iconregionjustification",SKEYWORD, kws_IconRegionJustification },
942645f5050Syouri    { "icons",			ICONS, 0 },
943645f5050Syouri    { "ignorecaseinmenuselection",	KEYWORD, kw0_IgnoreCaseInMenuSelection },
944645f5050Syouri    { "ignorelockmodifier",	KEYWORD, kw0_IgnoreLockModifier },
945645f5050Syouri    { "ignoremodifier",		IGNOREMODIFIER, 0 },
946645f5050Syouri    { "ignoretransient",	IGNORE_TRANSIENT, 0 },
947645f5050Syouri    { "interpolatemenucolors",	KEYWORD, kw0_InterpolateMenuColors },
948645f5050Syouri    { "l",			LOCK, 0 },
949645f5050Syouri    { "left",			JKEYWORD, J_LEFT },
950645f5050Syouri    { "lefttitlebutton",	LEFT_TITLEBUTTON, 0 },
951645f5050Syouri    { "lock",			LOCK, 0 },
952645f5050Syouri    { "m",			META, 0 },
953645f5050Syouri    { "maketitle",		MAKE_TITLE, 0 },
954645f5050Syouri    { "mapwindowbackground",	CLKEYWORD, kwcl_MapWindowBackground },
955645f5050Syouri    { "mapwindowcurrentworkspace", MAPWINDOWCURRENTWORKSPACE, 0},
956645f5050Syouri    { "mapwindowdefaultworkspace", MAPWINDOWDEFAULTWORKSPACE, 0},
957645f5050Syouri    { "mapwindowforeground",	CLKEYWORD, kwcl_MapWindowForeground },
958645f5050Syouri    { "maxicontitlewidth",	NKEYWORD, kwn_MaxIconTitleWidth },
959645f5050Syouri    { "maxwindowsize",		SKEYWORD, kws_MaxWindowSize },
960645f5050Syouri    { "menu",			MENU, 0 },
961645f5050Syouri    { "menubackground",		CKEYWORD, kwc_MenuBackground },
962645f5050Syouri    { "menufont",		SKEYWORD, kws_MenuFont },
963645f5050Syouri    { "menuforeground",		CKEYWORD, kwc_MenuForeground },
964645f5050Syouri    { "menushadowcolor",	CKEYWORD, kwc_MenuShadowColor },
965645f5050Syouri    { "menushadowdepth",	NKEYWORD, kwn_MenuShadowDepth },
966645f5050Syouri    { "menutitlebackground",	CKEYWORD, kwc_MenuTitleBackground },
967645f5050Syouri    { "menutitleforeground",	CKEYWORD, kwc_MenuTitleForeground },
968645f5050Syouri    { "meta",			META, 0 },
969645f5050Syouri    { "mod",			META, 0 },  /* fake it */
970645f5050Syouri    { "monochrome",		MONOCHROME, 0 },
971645f5050Syouri    { "move",			MOVE, 0 },
972645f5050Syouri    { "movedelta",		NKEYWORD, kwn_MoveDelta },
973645f5050Syouri    { "moveoffresistance",	NKEYWORD, kwn_MoveOffResistance },
974645f5050Syouri    { "movepackresistance",	NKEYWORD, kwn_MovePackResistance },
975645f5050Syouri    { "nobackingstore",		KEYWORD, kw0_NoBackingStore },
976645f5050Syouri    { "noborder",		NO_BORDER, 0 },
977645f5050Syouri    { "nocasesensitive",	KEYWORD, kw0_NoCaseSensitive },
978645f5050Syouri    { "nodefaults",		KEYWORD, kw0_NoDefaults },
979645f5050Syouri    { "nograbserver",		KEYWORD, kw0_NoGrabServer },
980645f5050Syouri    { "nohighlight",		NO_HILITE, 0 },
981645f5050Syouri    { "noiconmanagerfocus",	KEYWORD, kw0_NoIconManagerFocus },
982645f5050Syouri    { "noiconmanagers",		KEYWORD, kw0_NoIconManagers },
983645f5050Syouri    { "noicontitle",		NO_ICON_TITLE, 0  },
984645f5050Syouri    { "noimagesinworkspacemanager", KEYWORD, kw0_NoImagesInWorkSpaceManager },
985645f5050Syouri    { "nomenushadows",		KEYWORD, kw0_NoMenuShadows },
986645f5050Syouri    { "noopaquemove",		NOOPAQUEMOVE, 0 },
987645f5050Syouri    { "noopaqueresize",		NOOPAQUERESIZE, 0 },
988645f5050Syouri    { "noraiseondeiconify",	KEYWORD, kw0_NoRaiseOnDeiconify },
989645f5050Syouri    { "noraiseonmove",		KEYWORD, kw0_NoRaiseOnMove },
990645f5050Syouri    { "noraiseonresize",	KEYWORD, kw0_NoRaiseOnResize },
991645f5050Syouri    { "noraiseonwarp",		KEYWORD, kw0_NoRaiseOnWarp },
992645f5050Syouri    { "north",			DKEYWORD, D_NORTH },
993645f5050Syouri    { "nosaveunders",		KEYWORD, kw0_NoSaveUnders },
994645f5050Syouri    { "noshowoccupyall",	KEYWORD, kw0_NoShowOccupyAll },
995645f5050Syouri    { "nostackmode",		NO_STACKMODE, 0 },
996645f5050Syouri    { "notitle",		NO_TITLE, 0 },
997645f5050Syouri    { "notitlefocus",		KEYWORD, kw0_NoTitleFocus },
998645f5050Syouri    { "notitlehighlight",	NO_TITLE_HILITE, 0 },
999645f5050Syouri    { "noversion",		KEYWORD, kw0_NoVersion },
1000645f5050Syouri    { "nowarptomenutitle",      KEYWORD, kw0_NoWarpToMenuTitle },
1001645f5050Syouri    { "occupy",			OCCUPYLIST, 0 },
1002645f5050Syouri    { "occupyall",		OCCUPYALL, 0 },
1003645f5050Syouri    { "opaquemove",		OPAQUEMOVE, 0 },
1004645f5050Syouri    { "opaquemovethreshold",	NKEYWORD, kwn_OpaqueMoveThreshold },
1005645f5050Syouri    { "opaqueresize",		OPAQUERESIZE, 0 },
1006645f5050Syouri    { "opaqueresizethreshold",	NKEYWORD, kwn_OpaqueResizeThreshold },
1007645f5050Syouri    { "openwindowtimeout",	NKEYWORD, kwn_OpenWindowTimeout },
1008645f5050Syouri    { "packnewwindows",		KEYWORD, kw0_PackNewWindows },
1009645f5050Syouri    { "pixmapdirectory",	SKEYWORD, kws_PixmapDirectory },
1010645f5050Syouri    { "pixmaps",		PIXMAPS, 0 },
1011645f5050Syouri    { "r",			ROOT, 0 },
1012645f5050Syouri    { "raisedelay",		NKEYWORD, kwn_RaiseDelay },
1013645f5050Syouri    { "raiseonclick",		KEYWORD, kw0_RaiseOnClick },
1014645f5050Syouri    { "raiseonclickbutton",	NKEYWORD, kwn_RaiseOnClickButton },
1015645f5050Syouri    { "raiseonwarp",		KEYWORD, kw0_RaiseOnWarp },
1016645f5050Syouri    { "raisewhenautounsqueeze",	KEYWORD, kw0_RaiseWhenAutoUnSqueeze },
1017645f5050Syouri    { "randomplacement",	SSKEYWORD, kwss_RandomPlacement },
1018645f5050Syouri    { "reallymoveinworkspacemanager",	KEYWORD, kw0_ReallyMoveInWorkspaceManager },
1019645f5050Syouri    { "resize",			RESIZE, 0 },
1020645f5050Syouri    { "resizefont",		SKEYWORD, kws_ResizeFont },
1021645f5050Syouri    { "restartpreviousstate",	KEYWORD, kw0_RestartPreviousState },
1022645f5050Syouri    { "reversecurrentworkspace",KEYWORD, kw0_ReverseCurrentWorkspace },
1023645f5050Syouri    { "right",			JKEYWORD, J_RIGHT },
1024645f5050Syouri    { "righttitlebutton",	RIGHT_TITLEBUTTON, 0 },
1025645f5050Syouri    { "root",			ROOT, 0 },
1026645f5050Syouri    { "s",			SHIFT, 0 },
1027645f5050Syouri    { "savecolor",              SAVECOLOR, 0},
1028645f5050Syouri    { "saveworkspacefocus",     KEYWORD, kw0_SaveWorkspaceFocus },
1029645f5050Syouri    { "schrinkicontitles",	KEYWORD, kw0_ShrinkIconTitles },
1030645f5050Syouri    { "select",			SELECT, 0 },
1031645f5050Syouri    { "shift",			SHIFT, 0 },
1032645f5050Syouri    { "shortallwindowsmenus",	KEYWORD, kw0_ShortAllWindowsMenus },
1033645f5050Syouri    { "showiconmanager",	KEYWORD, kw0_ShowIconManager },
1034645f5050Syouri    { "showworkspacemanager",	KEYWORD, kw0_ShowWorkspaceManager },
1035645f5050Syouri    { "shrinkicontitles",	KEYWORD, kw0_ShrinkIconTitles },
1036645f5050Syouri    { "sloppyfocus",            KEYWORD, kw0_SloppyFocus },
1037645f5050Syouri    { "sorticonmanager",	KEYWORD, kw0_SortIconManager },
1038645f5050Syouri#ifdef SOUNDS
1039645f5050Syouri    { "soundhost",		SKEYWORD, kws_SoundHost },
1040645f5050Syouri#endif
1041645f5050Syouri    { "south",			DKEYWORD, D_SOUTH },
1042645f5050Syouri    { "squeezetitle",		SQUEEZE_TITLE, 0 },
1043645f5050Syouri    { "starticonified",		START_ICONIFIED, 0 },
1044645f5050Syouri    { "startinmapstate",	KEYWORD, kw0_StartInMapState },
1045645f5050Syouri    { "startsqueezed",		STARTSQUEEZED, 0 },
1046645f5050Syouri    { "stayupmenus",		KEYWORD, kw0_StayUpMenus },
1047645f5050Syouri    { "sunkfocuswindowtitle",	KEYWORD, kw0_SunkFocusWindowTitle },
1048645f5050Syouri    { "t",			TITLE, 0 },
1049645f5050Syouri    { "threedborderwidth",	NKEYWORD, kwn_ThreeDBorderWidth },
1050645f5050Syouri    { "title",			TITLE, 0 },
1051645f5050Syouri    { "titlebackground",	CLKEYWORD, kwcl_TitleBackground },
1052645f5050Syouri    { "titlebuttonborderwidth",	NKEYWORD, kwn_TitleButtonBorderWidth },
1053645f5050Syouri    { "titlebuttonshadowdepth",	NKEYWORD, kwn_TitleButtonShadowDepth },
1054645f5050Syouri    { "titlefont",		SKEYWORD, kws_TitleFont },
1055645f5050Syouri    { "titleforeground",	CLKEYWORD, kwcl_TitleForeground },
1056645f5050Syouri    { "titlehighlight",		TITLE_HILITE, 0 },
1057645f5050Syouri    { "titlejustification",	SKEYWORD, kws_TitleJustification },
1058645f5050Syouri    { "titlepadding",		NKEYWORD, kwn_TitlePadding },
1059645f5050Syouri    { "titleshadowdepth",	NKEYWORD, kwn_TitleShadowDepth },
1060645f5050Syouri    { "transienthasoccupation",	KEYWORD, kw0_TransientHasOccupation },
1061645f5050Syouri    { "transientontop",		NKEYWORD, kwn_TransientOnTop },
1062645f5050Syouri    { "unknownicon",		SKEYWORD, kws_UnknownIcon },
1063645f5050Syouri    { "unmapbymovingfaraway",	UNMAPBYMOVINGFARAWAY, 0 },
1064645f5050Syouri    { "usepposition",		SKEYWORD, kws_UsePPosition },
1065645f5050Syouri    { "usesunktitlepixmap",     KEYWORD, kw0_UseSunkTitlePixmap },
1066645f5050Syouri    { "usethreedborders",	KEYWORD, kw0_Use3DBorders },
1067645f5050Syouri    { "usethreediconborders",	KEYWORD, kw0_use3DIconBorders },
1068645f5050Syouri    { "usethreediconmanagers",	KEYWORD, kw0_Use3DIconManagers },
1069645f5050Syouri    { "usethreedmenus",		KEYWORD, kw0_Use3DMenus },
1070645f5050Syouri    { "usethreedtitles",	KEYWORD, kw0_Use3DTitles },
1071645f5050Syouri    { "usethreedwmap",		KEYWORD, kw0_Use3DWMap },
1072645f5050Syouri    { "virtualscreens",         VIRTUAL_SCREENS, 0 },
1073645f5050Syouri    { "w",			WINDOW, 0 },
1074645f5050Syouri    { "wait",			WAITC, 0 },
1075645f5050Syouri    { "warpcursor",		WARP_CURSOR, 0 },
1076645f5050Syouri    { "warpringonscreen",	KEYWORD, kw0_WarpRingOnScreen },
1077645f5050Syouri    { "warptodefaultmenuentry",	KEYWORD, kw0_WarpToDefaultMenuEntry },
1078645f5050Syouri    { "warpunmapped",		KEYWORD, kw0_WarpUnmapped },
1079645f5050Syouri    { "west",			DKEYWORD, D_WEST },
1080645f5050Syouri    { "window",			WINDOW, 0 },
1081645f5050Syouri    { "windowbox",		WINDOW_BOX, 0 },
1082645f5050Syouri    { "windowfunction",		WINDOW_FUNCTION, 0 },
1083645f5050Syouri    { "windowgeometries",	WINDOW_GEOMETRIES, 0 },
1084645f5050Syouri    { "windowregion",		WINDOW_REGION, 0 },
1085645f5050Syouri    { "windowring",		WINDOW_RING, 0 },
1086645f5050Syouri    { "windowringexclude",      WINDOW_RING_EXCLUDE, 0},
1087645f5050Syouri    { "wmgrbuttonshadowdepth",	NKEYWORD, kwn_WMgrButtonShadowDepth },
1088645f5050Syouri    { "wmgrbuttonstyle",	SKEYWORD, kws_WMgrButtonStyle },
1089645f5050Syouri    { "wmgrhorizbuttonindent",	NKEYWORD, kwn_WMgrHorizButtonIndent },
1090645f5050Syouri    { "wmgrvertbuttonindent",	NKEYWORD, kwn_WMgrVertButtonIndent },
1091645f5050Syouri    { "workspace", 		WORKSPACE, 0 },
1092645f5050Syouri    { "workspacefont",          SKEYWORD, kws_WorkSpaceFont },
1093645f5050Syouri    { "workspacemanagergeometry", WORKSPCMGR_GEOMETRY, 0 },
1094645f5050Syouri    { "workspaces",             WORKSPACES, 0},
1095645f5050Syouri    { "xmovegrid",		NKEYWORD, kwn_XMoveGrid },
1096645f5050Syouri    { "xorvalue",		NKEYWORD, kwn_XorValue },
1097645f5050Syouri    { "xpmicondirectory",	SKEYWORD, kws_PixmapDirectory },
1098645f5050Syouri    { "ymovegrid",		NKEYWORD, kwn_YMoveGrid },
1099645f5050Syouri    { "zoom",			ZOOM, 0 },
1100645f5050Syouri};
1101645f5050Syouri
1102645f5050Syouristatic int numkeywords = (sizeof(keytable)/sizeof(keytable[0]));
1103645f5050Syouri
1104645f5050Syouriint parse_keyword (char *s, int *nump)
1105645f5050Syouri{
1106645f5050Syouri    register int lower = 0, upper = numkeywords - 1;
1107645f5050Syouri
1108645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
1109645f5050Syouri    while (lower <= upper) {
1110645f5050Syouri        int middle = (lower + upper) / 2;
1111645f5050Syouri	TwmKeyword *p = &keytable[middle];
1112645f5050Syouri        int res = strcmp (p->name, s);
1113645f5050Syouri
1114645f5050Syouri        if (res < 0) {
1115645f5050Syouri            lower = middle + 1;
1116645f5050Syouri        } else if (res == 0) {
1117645f5050Syouri	    *nump = p->subnum;
1118645f5050Syouri            return p->value;
1119645f5050Syouri        } else {
1120645f5050Syouri            upper = middle - 1;
1121645f5050Syouri        }
1122645f5050Syouri    }
1123645f5050Syouri    return ERRORTOKEN;
1124645f5050Syouri}
1125645f5050Syouri
1126645f5050Syouri
1127645f5050Syouri
1128645f5050Syouri/*
1129645f5050Syouri * action routines called by grammar
1130645f5050Syouri */
1131645f5050Syouri
1132645f5050Syouriint do_single_keyword (int keyword)
1133645f5050Syouri{
1134645f5050Syouri    switch (keyword) {
1135645f5050Syouri      case kw0_NoDefaults:
1136645f5050Syouri	Scr->NoDefaults = TRUE;
1137645f5050Syouri	return 1;
1138645f5050Syouri
1139645f5050Syouri      case kw0_AutoRelativeResize:
1140645f5050Syouri	Scr->AutoRelativeResize = TRUE;
1141645f5050Syouri	return 1;
1142645f5050Syouri
1143645f5050Syouri      case kw0_ForceIcons:
1144645f5050Syouri	if (Scr->FirstTime) Scr->ForceIcon = TRUE;
1145645f5050Syouri	return 1;
1146645f5050Syouri
1147645f5050Syouri      case kw0_NoIconManagers:
1148645f5050Syouri	Scr->NoIconManagers = TRUE;
1149645f5050Syouri	return 1;
1150645f5050Syouri
1151645f5050Syouri      case kw0_InterpolateMenuColors:
1152645f5050Syouri	if (Scr->FirstTime) Scr->InterpolateMenuColors = TRUE;
1153645f5050Syouri	return 1;
1154645f5050Syouri
1155645f5050Syouri      case kw0_NoVersion:
1156645f5050Syouri	/* obsolete */
1157645f5050Syouri	return 1;
1158645f5050Syouri
1159645f5050Syouri      case kw0_SortIconManager:
1160645f5050Syouri	if (Scr->FirstTime) Scr->SortIconMgr = TRUE;
1161645f5050Syouri	return 1;
1162645f5050Syouri
1163645f5050Syouri      case kw0_NoGrabServer:
1164645f5050Syouri	Scr->NoGrabServer = TRUE;
1165645f5050Syouri	return 1;
1166645f5050Syouri
1167645f5050Syouri      case kw0_NoMenuShadows:
1168645f5050Syouri	if (Scr->FirstTime) Scr->Shadow = FALSE;
1169645f5050Syouri	return 1;
1170645f5050Syouri
1171645f5050Syouri      case kw0_NoRaiseOnMove:
1172645f5050Syouri	if (Scr->FirstTime) Scr->NoRaiseMove = TRUE;
1173645f5050Syouri	return 1;
1174645f5050Syouri
1175645f5050Syouri      case kw0_NoRaiseOnResize:
1176645f5050Syouri	if (Scr->FirstTime) Scr->NoRaiseResize = TRUE;
1177645f5050Syouri	return 1;
1178645f5050Syouri
1179645f5050Syouri      case kw0_NoRaiseOnDeiconify:
1180645f5050Syouri	if (Scr->FirstTime) Scr->NoRaiseDeicon = TRUE;
1181645f5050Syouri	return 1;
1182645f5050Syouri
1183645f5050Syouri      case kw0_DontMoveOff:
1184645f5050Syouri	Scr->DontMoveOff = TRUE;
1185645f5050Syouri	return 1;
1186645f5050Syouri
1187645f5050Syouri      case kw0_NoBackingStore:
1188645f5050Syouri	Scr->BackingStore = FALSE;
1189645f5050Syouri	return 1;
1190645f5050Syouri
1191645f5050Syouri      case kw0_NoSaveUnders:
1192645f5050Syouri	Scr->SaveUnder = FALSE;
1193645f5050Syouri	return 1;
1194645f5050Syouri
1195645f5050Syouri      case kw0_RestartPreviousState:
1196645f5050Syouri	RestartPreviousState = True;
1197645f5050Syouri	return 1;
1198645f5050Syouri
1199645f5050Syouri      case kw0_ClientBorderWidth:
1200645f5050Syouri	if (Scr->FirstTime) Scr->ClientBorderWidth = TRUE;
1201645f5050Syouri	return 1;
1202645f5050Syouri
1203645f5050Syouri      case kw0_NoTitleFocus:
1204645f5050Syouri	Scr->TitleFocus = TRUE /*FALSE*/;
1205645f5050Syouri	return 1;
1206645f5050Syouri
1207645f5050Syouri      case kw0_DecorateTransients:
1208645f5050Syouri	Scr->DecorateTransients = TRUE;
1209645f5050Syouri	return 1;
1210645f5050Syouri
1211645f5050Syouri      case kw0_ShowIconManager:
1212645f5050Syouri	Scr->ShowIconManager = TRUE;
1213645f5050Syouri	return 1;
1214645f5050Syouri
1215645f5050Syouri      case kw0_ShowWorkspaceManager:
1216645f5050Syouri	Scr->ShowWorkspaceManager = TRUE;
1217645f5050Syouri	return 1;
1218645f5050Syouri
1219645f5050Syouri      case kw0_StartInMapState:
1220645f5050Syouri	Scr->workSpaceMgr.initialstate = MAPSTATE;
1221645f5050Syouri	return 1;
1222645f5050Syouri
1223645f5050Syouri      case kw0_NoShowOccupyAll:
1224645f5050Syouri	Scr->workSpaceMgr.noshowoccupyall = TRUE;
1225645f5050Syouri	return 1;
1226645f5050Syouri
1227645f5050Syouri      case kw0_AutoOccupy:
1228645f5050Syouri	Scr->AutoOccupy = TRUE;
1229645f5050Syouri	return 1;
1230645f5050Syouri
1231645f5050Syouri      case kw0_TransientHasOccupation:
1232645f5050Syouri	Scr->TransientHasOccupation = TRUE;
1233645f5050Syouri	return 1;
1234645f5050Syouri
1235645f5050Syouri      case kw0_DontPaintRootWindow:
1236645f5050Syouri	Scr->DontPaintRootWindow = TRUE;
1237645f5050Syouri	return 1;
1238645f5050Syouri
1239645f5050Syouri      case kw0_UseSunkTitlePixmap:
1240645f5050Syouri	Scr->UseSunkTitlePixmap = TRUE;
1241645f5050Syouri	return 1;
1242645f5050Syouri
1243645f5050Syouri      case kw0_Use3DBorders:
1244645f5050Syouri	Scr->use3Dborders = TRUE;
1245645f5050Syouri	return 1;
1246645f5050Syouri
1247645f5050Syouri      case kw0_Use3DIconManagers:
1248645f5050Syouri	Scr->use3Diconmanagers = TRUE;
1249645f5050Syouri	return 1;
1250645f5050Syouri
1251645f5050Syouri      case kw0_Use3DMenus:
1252645f5050Syouri	Scr->use3Dmenus = TRUE;
1253645f5050Syouri	return 1;
1254645f5050Syouri
1255645f5050Syouri      case kw0_Use3DTitles:
1256645f5050Syouri	Scr->use3Dtitles = TRUE;
1257645f5050Syouri	return 1;
1258645f5050Syouri
1259645f5050Syouri      case kw0_Use3DWMap:
1260645f5050Syouri	Scr->use3Dwmap = TRUE;
1261645f5050Syouri	return 1;
1262645f5050Syouri
1263645f5050Syouri      case kw0_SunkFocusWindowTitle:
1264645f5050Syouri	Scr->SunkFocusWindowTitle = TRUE;
1265645f5050Syouri	return 1;
1266645f5050Syouri
1267645f5050Syouri      case kw0_BeNiceToColormap:
1268645f5050Syouri	Scr->BeNiceToColormap = TRUE;
1269645f5050Syouri	return 1;
1270645f5050Syouri
1271645f5050Syouri      case kw0_BorderResizeCursors:
1272645f5050Syouri	Scr->BorderCursors = TRUE;
1273645f5050Syouri	return 1;
1274645f5050Syouri
1275645f5050Syouri      case kw0_NoCaseSensitive:
1276645f5050Syouri	Scr->CaseSensitive = FALSE;
1277645f5050Syouri	return 1;
1278645f5050Syouri
1279645f5050Syouri      case kw0_NoRaiseOnWarp:
1280645f5050Syouri	Scr->RaiseOnWarp = FALSE;
1281645f5050Syouri	return 1;
1282645f5050Syouri
1283645f5050Syouri      case kw0_RaiseOnWarp:
1284645f5050Syouri	Scr->RaiseOnWarp = TRUE;
1285645f5050Syouri	return 1;
1286645f5050Syouri
1287645f5050Syouri      case kw0_WarpUnmapped:
1288645f5050Syouri	Scr->WarpUnmapped = TRUE;
1289645f5050Syouri	return 1;
1290645f5050Syouri
1291645f5050Syouri      case kw0_WarpRingOnScreen:
1292645f5050Syouri	Scr->WarpRingAnyWhere = FALSE;
1293645f5050Syouri	return 1;
1294645f5050Syouri
1295645f5050Syouri      case kw0_NoIconManagerFocus:
1296645f5050Syouri	Scr->IconManagerFocus = FALSE;
1297645f5050Syouri	return 1;
1298645f5050Syouri
1299645f5050Syouri      case kw0_StayUpMenus:
1300645f5050Syouri	Scr->StayUpMenus = TRUE;
1301645f5050Syouri	return 1;
1302645f5050Syouri
1303645f5050Syouri      case kw0_ClickToFocus:
1304645f5050Syouri	Scr->ClickToFocus = TRUE;
1305645f5050Syouri	return 1;
1306645f5050Syouri
1307645f5050Syouri      case kw0_ReallyMoveInWorkspaceManager:
1308645f5050Syouri	Scr->ReallyMoveInWorkspaceManager = TRUE;
1309645f5050Syouri	return 1;
1310645f5050Syouri
1311645f5050Syouri      case kw0_ShowWinWhenMovingInWmgr:
1312645f5050Syouri	Scr->ShowWinWhenMovingInWmgr = TRUE;
1313645f5050Syouri	return 1;
1314645f5050Syouri
1315645f5050Syouri      case kw0_ReverseCurrentWorkspace:
1316645f5050Syouri	Scr->ReverseCurrentWorkspace = TRUE;
1317645f5050Syouri	return 1;
1318645f5050Syouri
1319645f5050Syouri      case kw0_DontWarpCursorInWMap:
1320645f5050Syouri	Scr->DontWarpCursorInWMap = TRUE;
1321645f5050Syouri	return 1;
1322645f5050Syouri
1323645f5050Syouri      case kw0_CenterFeedbackWindow:
1324645f5050Syouri	Scr->CenterFeedbackWindow = TRUE;
1325645f5050Syouri	return 1;
1326645f5050Syouri
1327645f5050Syouri      case kw0_WarpToDefaultMenuEntry:
1328645f5050Syouri	Scr->WarpToDefaultMenuEntry = TRUE;
1329645f5050Syouri	return 1;
1330645f5050Syouri
1331645f5050Syouri      case kw0_ShrinkIconTitles:
1332645f5050Syouri	Scr->ShrinkIconTitles = TRUE;
1333645f5050Syouri	return 1;
1334645f5050Syouri
1335645f5050Syouri      case kw0_AutoRaiseIcons:
1336645f5050Syouri	Scr->AutoRaiseIcons = TRUE;
1337645f5050Syouri	return 1;
1338645f5050Syouri
1339645f5050Syouri      /* kai */
1340645f5050Syouri      case kw0_AutoFocusToTransients:
1341645f5050Syouri        Scr->AutoFocusToTransients = TRUE;
1342645f5050Syouri        return 1;
1343645f5050Syouri
1344645f5050Syouri      case kw0_use3DIconBorders:
1345645f5050Syouri	Scr->use3Diconborders = TRUE;
1346645f5050Syouri	return 1;
1347645f5050Syouri
1348645f5050Syouri      case kw0_ShortAllWindowsMenus:
1349645f5050Syouri	Scr->ShortAllWindowsMenus = TRUE;
1350645f5050Syouri	return 1;
1351645f5050Syouri
1352645f5050Syouri      case kw0_RaiseWhenAutoUnSqueeze:
1353645f5050Syouri	Scr->RaiseWhenAutoUnSqueeze = TRUE;
1354645f5050Syouri	return 1;
1355645f5050Syouri
1356645f5050Syouri      case kw0_RaiseOnClick:
1357645f5050Syouri	Scr->RaiseOnClick = TRUE;
1358645f5050Syouri	return 1;
1359645f5050Syouri
1360645f5050Syouri      case kw0_IgnoreLockModifier:
1361645f5050Syouri	Scr->IgnoreLockModifier = TRUE;
1362645f5050Syouri	return 1;
1363645f5050Syouri
1364645f5050Syouri      case kw0_PackNewWindows:
1365645f5050Syouri	Scr->PackNewWindows = TRUE;
1366645f5050Syouri	return 1;
1367645f5050Syouri
1368645f5050Syouri      case kw0_IgnoreCaseInMenuSelection:
1369645f5050Syouri	Scr->IgnoreCaseInMenuSelection = TRUE;
1370645f5050Syouri	return 1;
1371645f5050Syouri
1372645f5050Syouri      case kw0_SloppyFocus:
1373645f5050Syouri	Scr->SloppyFocus = TRUE;
1374645f5050Syouri	return 1;
1375645f5050Syouri
1376645f5050Syouri      case kw0_SaveWorkspaceFocus:
1377645f5050Syouri	Scr->SaveWorkspaceFocus = TRUE;
1378645f5050Syouri	return 1;
1379645f5050Syouri
1380645f5050Syouri      case kw0_NoImagesInWorkSpaceManager:
1381645f5050Syouri	Scr->NoImagesInWorkSpaceManager = TRUE;
1382645f5050Syouri	return 1;
1383645f5050Syouri
1384645f5050Syouri      case kw0_NoWarpToMenuTitle:
1385645f5050Syouri	Scr->NoWarpToMenuTitle = TRUE;
1386645f5050Syouri	return 1;
1387645f5050Syouri
1388645f5050Syouri    }
1389645f5050Syouri    return 0;
1390645f5050Syouri}
1391645f5050Syouri
1392645f5050Syouri
1393645f5050Syouriint do_string_string_keyword (int keyword, char *s1, char *s2)
1394645f5050Syouri{
1395645f5050Syouri    switch (keyword) {
1396645f5050Syouri       case kwss_RandomPlacement:
1397645f5050Syouri       {
1398645f5050Syouri	    int rp = ParseRandomPlacement (s1);
1399645f5050Syouri	    if (rp < 0) {
1400645f5050Syouri		twmrc_error_prefix();
1401645f5050Syouri		fprintf (stderr,
1402645f5050Syouri			 "ignoring invalid RandomPlacement argument 1 \"%s\"\n", s1);
1403645f5050Syouri	    } else {
1404645f5050Syouri		Scr->RandomPlacement = rp;
1405645f5050Syouri	    }
1406645f5050Syouri	}
1407645f5050Syouri	{
1408645f5050Syouri	    if (strcmp (s2, "default") == 0) return 1;
1409645f5050Syouri	    JunkMask = XParseGeometry (s2, &JunkX, &JunkY, &JunkWidth, &JunkHeight);
1410645f5050Syouri#ifdef DEBUG
1411645f5050Syouri	    fprintf (stderr, "DEBUG:: JunkMask = %x, WidthValue = %x, HeightValue = %x\n", JunkMask, WidthValue, HeightValue);
1412645f5050Syouri	    fprintf (stderr, "DEBUG:: JunkX = %d, JunkY = %d\n", JunkX, JunkY);
1413645f5050Syouri#endif
1414645f5050Syouri	    if ((JunkMask & (XValue | YValue)) !=
1415645f5050Syouri		(XValue | YValue)) {
1416645f5050Syouri		twmrc_error_prefix();
1417645f5050Syouri		fprintf (stderr,
1418645f5050Syouri			 "ignoring invalid RandomPlacement displacement \"%s\"\n", s2);
1419645f5050Syouri	    } else {
1420645f5050Syouri		Scr->RandomDisplacementX = JunkX;
1421645f5050Syouri		Scr->RandomDisplacementY = JunkY;
1422645f5050Syouri	    }
1423645f5050Syouri	    return 1;
1424645f5050Syouri	}
1425645f5050Syouri    }
1426645f5050Syouri    return 0;
1427645f5050Syouri}
1428645f5050Syouri
1429645f5050Syouri
1430645f5050Syouriint do_string_keyword (int keyword, char *s)
1431645f5050Syouri{
1432645f5050Syouri    switch (keyword) {
1433645f5050Syouri      case kws_UsePPosition:
1434645f5050Syouri	{
1435645f5050Syouri	    int ppos = ParseUsePPosition (s);
1436645f5050Syouri	    if (ppos < 0) {
1437645f5050Syouri		twmrc_error_prefix();
1438645f5050Syouri		fprintf (stderr,
1439645f5050Syouri			 "ignoring invalid UsePPosition argument \"%s\"\n", s);
1440645f5050Syouri	    } else {
1441645f5050Syouri		Scr->UsePPosition = ppos;
1442645f5050Syouri	    }
1443645f5050Syouri	    return 1;
1444645f5050Syouri	}
1445645f5050Syouri
1446645f5050Syouri      case kws_IconFont:
1447645f5050Syouri	if (!Scr->HaveFonts) Scr->IconFont.basename = s;
1448645f5050Syouri	return 1;
1449645f5050Syouri
1450645f5050Syouri      case kws_ResizeFont:
1451645f5050Syouri	if (!Scr->HaveFonts) Scr->SizeFont.basename = s;
1452645f5050Syouri	return 1;
1453645f5050Syouri
1454645f5050Syouri      case kws_MenuFont:
1455645f5050Syouri	if (!Scr->HaveFonts) Scr->MenuFont.basename = s;
1456645f5050Syouri	return 1;
1457645f5050Syouri
1458645f5050Syouri      case kws_WorkSpaceFont:
1459645f5050Syouri	if (!Scr->HaveFonts) Scr->workSpaceMgr.windowFont.basename = s;
1460645f5050Syouri	return 1;
1461645f5050Syouri
1462645f5050Syouri      case kws_TitleFont:
1463645f5050Syouri	if (!Scr->HaveFonts) Scr->TitleBarFont.basename = s;
1464645f5050Syouri	return 1;
1465645f5050Syouri
1466645f5050Syouri      case kws_IconManagerFont:
1467645f5050Syouri	if (!Scr->HaveFonts) Scr->IconManagerFont.basename = s;
1468645f5050Syouri	return 1;
1469645f5050Syouri
1470645f5050Syouri      case kws_UnknownIcon:
1471645f5050Syouri	if (Scr->FirstTime) GetUnknownIcon (s);
1472645f5050Syouri	return 1;
1473645f5050Syouri
1474645f5050Syouri      case kws_IconDirectory:
1475645f5050Syouri	if (Scr->FirstTime) Scr->IconDirectory = ExpandFilePath (s);
1476645f5050Syouri	return 1;
1477645f5050Syouri
1478645f5050Syouri      case kws_PixmapDirectory:
1479645f5050Syouri	if (Scr->FirstTime) Scr->PixmapDirectory = ExpandFilePath (s);
1480645f5050Syouri	return 1;
1481645f5050Syouri
1482645f5050Syouri      case kws_MaxWindowSize:
1483645f5050Syouri	JunkMask = XParseGeometry (s, &JunkX, &JunkY, &JunkWidth, &JunkHeight);
1484645f5050Syouri	if ((JunkMask & (WidthValue | HeightValue)) !=
1485645f5050Syouri	    (WidthValue | HeightValue)) {
1486645f5050Syouri	    twmrc_error_prefix();
1487645f5050Syouri	    fprintf (stderr, "bad MaxWindowSize \"%s\"\n", s);
1488645f5050Syouri	    return 0;
1489645f5050Syouri	}
1490645f5050Syouri	if (JunkWidth == 0 || JunkHeight == 0) {
1491645f5050Syouri	    twmrc_error_prefix();
1492645f5050Syouri	    fprintf (stderr, "MaxWindowSize \"%s\" must be non-zero\n", s);
1493645f5050Syouri	    return 0;
1494645f5050Syouri	}
1495645f5050Syouri	Scr->MaxWindowWidth = JunkWidth;
1496645f5050Syouri	Scr->MaxWindowHeight = JunkHeight;
1497645f5050Syouri	return 1;
1498645f5050Syouri
1499645f5050Syouri      case kws_IconJustification:
1500645f5050Syouri	{
1501645f5050Syouri	    int just = ParseJustification (s);
1502645f5050Syouri
1503645f5050Syouri 	    if ((just < 0) || (just == J_BORDER)) {
1504645f5050Syouri 		twmrc_error_prefix();
1505645f5050Syouri 		fprintf (stderr,
1506645f5050Syouri 			 "ignoring invalid IconJustification argument \"%s\"\n", s);
1507645f5050Syouri 	    } else {
1508645f5050Syouri 		Scr->IconJustification = just;
1509645f5050Syouri 	    }
1510645f5050Syouri 	    return 1;
1511645f5050Syouri 	}
1512645f5050Syouri      case kws_IconRegionJustification:
1513645f5050Syouri	{
1514645f5050Syouri	    int just = ParseJustification (s);
1515645f5050Syouri
1516645f5050Syouri 	    if (just < 0) {
1517645f5050Syouri 		twmrc_error_prefix();
1518645f5050Syouri 		fprintf (stderr,
1519645f5050Syouri 			 "ignoring invalid IconRegionJustification argument \"%s\"\n", s);
1520645f5050Syouri 	    } else {
1521645f5050Syouri 		Scr->IconRegionJustification = just;
1522645f5050Syouri 	    }
1523645f5050Syouri 	    return 1;
1524645f5050Syouri 	}
1525645f5050Syouri      case kws_IconRegionAlignement:
1526645f5050Syouri	{
1527645f5050Syouri	    int just = ParseAlignement (s);
1528645f5050Syouri
1529645f5050Syouri 	    if (just < 0) {
1530645f5050Syouri 		twmrc_error_prefix();
1531645f5050Syouri 		fprintf (stderr,
1532645f5050Syouri 			 "ignoring invalid IconRegionAlignement argument \"%s\"\n", s);
1533645f5050Syouri 	    } else {
1534645f5050Syouri 		Scr->IconRegionAlignement = just;
1535645f5050Syouri 	    }
1536645f5050Syouri 	    return 1;
1537645f5050Syouri 	}
1538645f5050Syouri
1539645f5050Syouri      case kws_TitleJustification:
1540645f5050Syouri	{
1541645f5050Syouri	    int just = ParseJustification (s);
1542645f5050Syouri
1543645f5050Syouri 	    if ((just < 0) || (just == J_BORDER)) {
1544645f5050Syouri 		twmrc_error_prefix();
1545645f5050Syouri 		fprintf (stderr,
1546645f5050Syouri 			 "ignoring invalid TitleJustification argument \"%s\"\n", s);
1547645f5050Syouri 	    } else {
1548645f5050Syouri 		Scr->TitleJustification = just;
1549645f5050Syouri 	    }
1550645f5050Syouri 	    return 1;
1551645f5050Syouri 	}
1552645f5050Syouri#ifdef SOUNDS
1553645f5050Syouri      case kws_SoundHost:
1554645f5050Syouri        if (Scr->FirstTime) set_sound_host(s);
1555645f5050Syouri        return 1;
1556645f5050Syouri#endif
1557645f5050Syouri
1558645f5050Syouri      case kws_WMgrButtonStyle:
1559645f5050Syouri	{
1560645f5050Syouri	    int style = ParseButtonStyle (s);
1561645f5050Syouri
1562645f5050Syouri 	    if (style < 0) {
1563645f5050Syouri 		twmrc_error_prefix();
1564645f5050Syouri 		fprintf (stderr,
1565645f5050Syouri 			 "ignoring invalid WMgrButtonStyle argument \"%s\"\n", s);
1566645f5050Syouri 	    } else {
1567645f5050Syouri 		Scr->workSpaceMgr.buttonStyle = style;
1568645f5050Syouri 	    }
1569645f5050Syouri 	    return 1;
1570645f5050Syouri	}
1571645f5050Syouri
1572645f5050Syouri      case kws_IconifyStyle:
1573645f5050Syouri	{
1574645f5050Syouri	  if (strlen (s) == 0) {
1575645f5050Syouri	    twmrc_error_prefix();
1576645f5050Syouri	    fprintf (stderr, "ignoring invalid IconifyStyle argument \"%s\"\n", s);
1577645f5050Syouri	  }
1578645f5050Syouri	  if (strcmp (s,  "default") == 0) Scr->IconifyStyle = ICONIFY_NORMAL;
1579645f5050Syouri	  XmuCopyISOLatin1Lowered (s, s);
1580645f5050Syouri	  if (strcmp (s,  "normal") == 0) Scr->IconifyStyle = ICONIFY_NORMAL;
1581645f5050Syouri	  if (strcmp (s,  "mosaic") == 0) Scr->IconifyStyle = ICONIFY_MOSAIC;
1582645f5050Syouri	  if (strcmp (s,  "zoomin") == 0) Scr->IconifyStyle = ICONIFY_ZOOMIN;
1583645f5050Syouri	  if (strcmp (s, "zoomout") == 0) Scr->IconifyStyle = ICONIFY_ZOOMOUT;
1584645f5050Syouri	  if (strcmp (s,   "sweep") == 0) Scr->IconifyStyle = ICONIFY_SWEEP;
1585645f5050Syouri	  return 1;
1586645f5050Syouri	}
1587645f5050Syouri    }
1588645f5050Syouri    return 0;
1589645f5050Syouri}
1590645f5050Syouri
1591645f5050Syouri
1592645f5050Syouriint do_number_keyword (int keyword, int num)
1593645f5050Syouri{
1594645f5050Syouri    switch (keyword) {
1595645f5050Syouri      case kwn_ConstrainedMoveTime:
1596645f5050Syouri	ConstrainedMoveTime = num;
1597645f5050Syouri	return 1;
1598645f5050Syouri
1599645f5050Syouri      case kwn_MoveDelta:
1600645f5050Syouri	Scr->MoveDelta = num;
1601645f5050Syouri	return 1;
1602645f5050Syouri
1603645f5050Syouri      case kwn_MoveOffResistance:
1604645f5050Syouri	Scr->MoveOffResistance = num;
1605645f5050Syouri	return 1;
1606645f5050Syouri
1607645f5050Syouri      case kwn_MovePackResistance:
1608645f5050Syouri	if (num < 0) num = 20;
1609645f5050Syouri	Scr->MovePackResistance = num;
1610645f5050Syouri	return 1;
1611645f5050Syouri
1612645f5050Syouri      case kwn_XMoveGrid:
1613645f5050Syouri	if (num <   1) num =   1;
1614645f5050Syouri	if (num > 100) num = 100;
1615645f5050Syouri	Scr->XMoveGrid = num;
1616645f5050Syouri	return 1;
1617645f5050Syouri
1618645f5050Syouri      case kwn_YMoveGrid:
1619645f5050Syouri	if (num <   1) num =   1;
1620645f5050Syouri	if (num > 100) num = 100;
1621645f5050Syouri	Scr->YMoveGrid = num;
1622645f5050Syouri	return 1;
1623645f5050Syouri
1624645f5050Syouri      case kwn_XorValue:
1625645f5050Syouri	if (Scr->FirstTime) Scr->XORvalue = num;
1626645f5050Syouri	return 1;
1627645f5050Syouri
1628645f5050Syouri      case kwn_FramePadding:
1629645f5050Syouri	if (Scr->FirstTime) Scr->FramePadding = num;
1630645f5050Syouri	return 1;
1631645f5050Syouri
1632645f5050Syouri      case kwn_TitlePadding:
1633645f5050Syouri	if (Scr->FirstTime) {
1634645f5050Syouri	    Scr->TitlePadding = num;
1635645f5050Syouri	}
1636645f5050Syouri	return 1;
1637645f5050Syouri
1638645f5050Syouri      case kwn_ButtonIndent:
1639645f5050Syouri	if (Scr->FirstTime) Scr->ButtonIndent = num;
1640645f5050Syouri	return 1;
1641645f5050Syouri
1642645f5050Syouri      case kwn_ThreeDBorderWidth:
1643645f5050Syouri	if (Scr->FirstTime) Scr->ThreeDBorderWidth = num;
1644645f5050Syouri	return 1;
1645645f5050Syouri
1646645f5050Syouri      case kwn_BorderWidth:
1647645f5050Syouri	if (Scr->FirstTime) Scr->BorderWidth = num;
1648645f5050Syouri	return 1;
1649645f5050Syouri
1650645f5050Syouri      case kwn_IconBorderWidth:
1651645f5050Syouri	if (Scr->FirstTime) Scr->IconBorderWidth = num;
1652645f5050Syouri	return 1;
1653645f5050Syouri
1654645f5050Syouri      case kwn_TitleButtonBorderWidth:
1655645f5050Syouri	if (Scr->FirstTime) Scr->TBInfo.border = num;
1656645f5050Syouri	return 1;
1657645f5050Syouri
1658645f5050Syouri      case kwn_RaiseDelay:
1659645f5050Syouri	RaiseDelay = num;
1660645f5050Syouri	return 1;
1661645f5050Syouri
1662645f5050Syouri      case kwn_TransientOnTop:
1663645f5050Syouri	if (Scr->FirstTime) Scr->TransientOnTop = num;
1664645f5050Syouri	return 1;
1665645f5050Syouri
1666645f5050Syouri      case kwn_OpaqueMoveThreshold:
1667645f5050Syouri	if (Scr->FirstTime) Scr->OpaqueMoveThreshold = num;
1668645f5050Syouri	return 1;
1669645f5050Syouri
1670645f5050Syouri      case kwn_OpaqueResizeThreshold:
1671645f5050Syouri	if (Scr->FirstTime) Scr->OpaqueResizeThreshold = num;
1672645f5050Syouri	return 1;
1673645f5050Syouri
1674645f5050Syouri      case kwn_WMgrVertButtonIndent:
1675645f5050Syouri	if (Scr->FirstTime) Scr->WMgrVertButtonIndent = num;
1676645f5050Syouri	if (Scr->WMgrVertButtonIndent < 0) Scr->WMgrVertButtonIndent = 0;
1677645f5050Syouri	Scr->workSpaceMgr.vspace = Scr->WMgrVertButtonIndent;
1678645f5050Syouri	Scr->workSpaceMgr.occupyWindow->vspace = Scr->WMgrVertButtonIndent;
1679645f5050Syouri	return 1;
1680645f5050Syouri
1681645f5050Syouri      case kwn_WMgrHorizButtonIndent:
1682645f5050Syouri	if (Scr->FirstTime) Scr->WMgrHorizButtonIndent = num;
1683645f5050Syouri	if (Scr->WMgrHorizButtonIndent < 0) Scr->WMgrHorizButtonIndent = 0;
1684645f5050Syouri	Scr->workSpaceMgr.hspace = Scr->WMgrHorizButtonIndent;
1685645f5050Syouri	Scr->workSpaceMgr.occupyWindow->hspace = Scr->WMgrHorizButtonIndent;
1686645f5050Syouri	return 1;
1687645f5050Syouri
1688645f5050Syouri      case kwn_WMgrButtonShadowDepth:
1689645f5050Syouri	if (Scr->FirstTime) Scr->WMgrButtonShadowDepth = num;
1690645f5050Syouri	if (Scr->WMgrButtonShadowDepth < 1) Scr->WMgrButtonShadowDepth = 1;
1691645f5050Syouri	return 1;
1692645f5050Syouri
1693645f5050Syouri      case kwn_MaxIconTitleWidth:
1694645f5050Syouri	if (Scr->FirstTime) Scr->MaxIconTitleWidth = num;
1695645f5050Syouri	return 1;
1696645f5050Syouri
1697645f5050Syouri      case kwn_ClearShadowContrast:
1698645f5050Syouri	if (Scr->FirstTime) Scr->ClearShadowContrast = num;
1699645f5050Syouri	if (Scr->ClearShadowContrast <   0) Scr->ClearShadowContrast =   0;
1700645f5050Syouri	if (Scr->ClearShadowContrast > 100) Scr->ClearShadowContrast = 100;
1701645f5050Syouri	return 1;
1702645f5050Syouri
1703645f5050Syouri      case kwn_DarkShadowContrast:
1704645f5050Syouri	if (Scr->FirstTime) Scr->DarkShadowContrast = num;
1705645f5050Syouri	if (Scr->DarkShadowContrast <   0) Scr->DarkShadowContrast =   0;
1706645f5050Syouri	if (Scr->DarkShadowContrast > 100) Scr->DarkShadowContrast = 100;
1707645f5050Syouri	return 1;
1708645f5050Syouri
1709645f5050Syouri      case kwn_AnimationSpeed:
1710645f5050Syouri	if (num < 0) num = 0;
1711645f5050Syouri	SetAnimationSpeed (num);
1712645f5050Syouri	return 1;
1713645f5050Syouri
1714645f5050Syouri      case kwn_BorderShadowDepth:
1715645f5050Syouri	if (Scr->FirstTime) Scr->BorderShadowDepth = num;
1716645f5050Syouri	if (Scr->BorderShadowDepth < 0) Scr->BorderShadowDepth = 2;
1717645f5050Syouri	return 1;
1718645f5050Syouri
1719645f5050Syouri      case kwn_BorderLeft:
1720645f5050Syouri	if (Scr->FirstTime) Scr->BorderLeft = num;
1721645f5050Syouri	if (Scr->BorderLeft < 0) Scr->BorderLeft = 0;
1722645f5050Syouri	return 1;
1723645f5050Syouri
1724645f5050Syouri      case kwn_BorderRight:
1725645f5050Syouri	if (Scr->FirstTime) Scr->BorderRight = num;
1726645f5050Syouri	if (Scr->BorderRight < 0) Scr->BorderRight = 0;
1727645f5050Syouri	return 1;
1728645f5050Syouri
1729645f5050Syouri      case kwn_BorderTop:
1730645f5050Syouri	if (Scr->FirstTime) Scr->BorderTop = num;
1731645f5050Syouri	if (Scr->BorderTop < 0) Scr->BorderTop = 0;
1732645f5050Syouri	return 1;
1733645f5050Syouri
1734645f5050Syouri      case kwn_BorderBottom:
1735645f5050Syouri	if (Scr->FirstTime) Scr->BorderBottom = num;
1736645f5050Syouri	if (Scr->BorderBottom < 0) Scr->BorderBottom = 0;
1737645f5050Syouri	return 1;
1738645f5050Syouri
1739645f5050Syouri      case kwn_TitleButtonShadowDepth:
1740645f5050Syouri	if (Scr->FirstTime) Scr->TitleButtonShadowDepth = num;
1741645f5050Syouri	if (Scr->TitleButtonShadowDepth < 0) Scr->TitleButtonShadowDepth = 2;
1742645f5050Syouri	return 1;
1743645f5050Syouri
1744645f5050Syouri      case kwn_TitleShadowDepth:
1745645f5050Syouri	if (Scr->FirstTime) Scr->TitleShadowDepth = num;
1746645f5050Syouri	if (Scr->TitleShadowDepth < 0) Scr->TitleShadowDepth = 2;
1747645f5050Syouri	return 1;
1748645f5050Syouri
1749645f5050Syouri      case kwn_IconManagerShadowDepth:
1750645f5050Syouri	if (Scr->FirstTime) Scr->IconManagerShadowDepth = num;
1751645f5050Syouri	if (Scr->IconManagerShadowDepth < 0) Scr->IconManagerShadowDepth = 2;
1752645f5050Syouri	return 1;
1753645f5050Syouri
1754645f5050Syouri      case kwn_MenuShadowDepth:
1755645f5050Syouri	if (Scr->FirstTime) Scr->MenuShadowDepth = num;
1756645f5050Syouri	if (Scr->MenuShadowDepth < 0) Scr->MenuShadowDepth = 2;
1757645f5050Syouri	return 1;
1758645f5050Syouri
1759645f5050Syouri      case kwn_OpenWindowTimeout:
1760645f5050Syouri	if (Scr->FirstTime) Scr->OpenWindowTimeout = num;
1761645f5050Syouri	if (Scr->OpenWindowTimeout < 0) Scr->OpenWindowTimeout = 0;
1762645f5050Syouri	return 1;
1763645f5050Syouri
1764645f5050Syouri      case kwn_RaiseOnClickButton:
1765645f5050Syouri	if (Scr->FirstTime) Scr->RaiseOnClickButton = num;
1766645f5050Syouri	if (Scr->RaiseOnClickButton < 1) Scr->RaiseOnClickButton = 1;
1767645f5050Syouri	if (Scr->RaiseOnClickButton > MAX_BUTTONS) Scr->RaiseOnClickButton = MAX_BUTTONS;
1768645f5050Syouri	return 1;
1769645f5050Syouri
1770645f5050Syouri    }
1771645f5050Syouri
1772645f5050Syouri    return 0;
1773645f5050Syouri}
1774645f5050Syouri
1775645f5050Syouriname_list **do_colorlist_keyword (int keyword, int colormode, char *s)
1776645f5050Syouri{
1777645f5050Syouri    switch (keyword) {
1778645f5050Syouri      case kwcl_BorderColor:
1779645f5050Syouri	GetColor (colormode, &Scr->BorderColorC.back, s);
1780645f5050Syouri	return &Scr->BorderColorL;
1781645f5050Syouri
1782645f5050Syouri      case kwcl_IconManagerHighlight:
1783645f5050Syouri	GetColor (colormode, &Scr->IconManagerHighlight, s);
1784645f5050Syouri	return &Scr->IconManagerHighlightL;
1785645f5050Syouri
1786645f5050Syouri      case kwcl_BorderTileForeground:
1787645f5050Syouri	GetColor (colormode, &Scr->BorderTileC.fore, s);
1788645f5050Syouri	return &Scr->BorderTileForegroundL;
1789645f5050Syouri
1790645f5050Syouri      case kwcl_BorderTileBackground:
1791645f5050Syouri	GetColor (colormode, &Scr->BorderTileC.back, s);
1792645f5050Syouri	return &Scr->BorderTileBackgroundL;
1793645f5050Syouri
1794645f5050Syouri      case kwcl_TitleForeground:
1795645f5050Syouri	GetColor (colormode, &Scr->TitleC.fore, s);
1796645f5050Syouri	return &Scr->TitleForegroundL;
1797645f5050Syouri
1798645f5050Syouri      case kwcl_TitleBackground:
1799645f5050Syouri	GetColor (colormode, &Scr->TitleC.back, s);
1800645f5050Syouri	return &Scr->TitleBackgroundL;
1801645f5050Syouri
1802645f5050Syouri      case kwcl_IconForeground:
1803645f5050Syouri	GetColor (colormode, &Scr->IconC.fore, s);
1804645f5050Syouri	return &Scr->IconForegroundL;
1805645f5050Syouri
1806645f5050Syouri      case kwcl_IconBackground:
1807645f5050Syouri	GetColor (colormode, &Scr->IconC.back, s);
1808645f5050Syouri	return &Scr->IconBackgroundL;
1809645f5050Syouri
1810645f5050Syouri      case kwcl_IconBorderColor:
1811645f5050Syouri	GetColor (colormode, &Scr->IconBorderColor, s);
1812645f5050Syouri	return &Scr->IconBorderColorL;
1813645f5050Syouri
1814645f5050Syouri      case kwcl_IconManagerForeground:
1815645f5050Syouri	GetColor (colormode, &Scr->IconManagerC.fore, s);
1816645f5050Syouri	return &Scr->IconManagerFL;
1817645f5050Syouri
1818645f5050Syouri      case kwcl_IconManagerBackground:
1819645f5050Syouri	GetColor (colormode, &Scr->IconManagerC.back, s);
1820645f5050Syouri	return &Scr->IconManagerBL;
1821645f5050Syouri
1822645f5050Syouri      case kwcl_MapWindowBackground:
1823645f5050Syouri	GetColor (colormode, &Scr->workSpaceMgr.windowcp.back, s);
1824645f5050Syouri	Scr->workSpaceMgr.windowcpgiven = True;
1825645f5050Syouri	return &Scr->workSpaceMgr.windowBackgroundL;
1826645f5050Syouri
1827645f5050Syouri      case kwcl_MapWindowForeground:
1828645f5050Syouri	GetColor (colormode, &Scr->workSpaceMgr.windowcp.fore, s);
1829645f5050Syouri	Scr->workSpaceMgr.windowcpgiven = True;
1830645f5050Syouri	return &Scr->workSpaceMgr.windowForegroundL;
1831645f5050Syouri    }
1832645f5050Syouri    return NULL;
1833645f5050Syouri}
1834645f5050Syouri
1835645f5050Syouriint do_color_keyword (int keyword, int colormode, char *s)
1836645f5050Syouri{
1837645f5050Syouri    switch (keyword) {
1838645f5050Syouri      case kwc_DefaultForeground:
1839645f5050Syouri	GetColor (colormode, &Scr->DefaultC.fore, s);
1840645f5050Syouri	return 1;
1841645f5050Syouri
1842645f5050Syouri      case kwc_DefaultBackground:
1843645f5050Syouri	GetColor (colormode, &Scr->DefaultC.back, s);
1844645f5050Syouri	return 1;
1845645f5050Syouri
1846645f5050Syouri      case kwc_MenuForeground:
1847645f5050Syouri	GetColor (colormode, &Scr->MenuC.fore, s);
1848645f5050Syouri	return 1;
1849645f5050Syouri
1850645f5050Syouri      case kwc_MenuBackground:
1851645f5050Syouri	GetColor (colormode, &Scr->MenuC.back, s);
1852645f5050Syouri	return 1;
1853645f5050Syouri
1854645f5050Syouri      case kwc_MenuTitleForeground:
1855645f5050Syouri	GetColor (colormode, &Scr->MenuTitleC.fore, s);
1856645f5050Syouri	return 1;
1857645f5050Syouri
1858645f5050Syouri      case kwc_MenuTitleBackground:
1859645f5050Syouri	GetColor (colormode, &Scr->MenuTitleC.back, s);
1860645f5050Syouri	return 1;
1861645f5050Syouri
1862645f5050Syouri      case kwc_MenuShadowColor:
1863645f5050Syouri	GetColor (colormode, &Scr->MenuShadowColor, s);
1864645f5050Syouri	return 1;
1865645f5050Syouri
1866645f5050Syouri    }
1867645f5050Syouri
1868645f5050Syouri    return 0;
1869645f5050Syouri}
1870645f5050Syouri
1871645f5050Syouri/*
1872645f5050Syouri * put_pixel_on_root() Save a pixel value in twm root window color property.
1873645f5050Syouri */
1874645f5050Syouristatic void put_pixel_on_root(Pixel pixel)
1875645f5050Syouri{
1876645f5050Syouri  int           i, addPixel = 1;
1877645f5050Syouri  Atom          retAtom;
1878645f5050Syouri  int           retFormat;
1879645f5050Syouri  unsigned long nPixels, retAfter;
1880645f5050Syouri  Pixel        *retProp;
1881645f5050Syouri
1882645f5050Syouri  if (XGetWindowProperty(dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS, 0, 8192,
1883645f5050Syouri		     False, XA_CARDINAL, &retAtom,
1884645f5050Syouri		     &retFormat, &nPixels, &retAfter,
1885645f5050Syouri		     (unsigned char **)&retProp) != Success || !retProp)
1886645f5050Syouri      return;
1887645f5050Syouri
1888645f5050Syouri  for (i=0; i< nPixels; i++)
1889645f5050Syouri      if (pixel == retProp[i]) addPixel = 0;
1890645f5050Syouri
1891645f5050Syouri  XFree((char *)retProp);
1892645f5050Syouri
1893645f5050Syouri  if (addPixel)
1894645f5050Syouri      XChangeProperty (dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS,
1895645f5050Syouri		       XA_CARDINAL, 32, PropModeAppend,
1896645f5050Syouri		       (unsigned char *)&pixel, 1);
1897645f5050Syouri}
1898645f5050Syouri
1899645f5050Syouri/*
1900645f5050Syouri * do_string_savecolor() save a color from a string in the twmrc file.
1901645f5050Syouri */
1902645f5050Syouriint do_string_savecolor(int colormode, char *s)
1903645f5050Syouri{
1904645f5050Syouri  Pixel p;
1905645f5050Syouri  GetColor(colormode, &p, s);
1906645f5050Syouri  put_pixel_on_root(p);
1907645f5050Syouri  return 0;
1908645f5050Syouri}
1909645f5050Syouri
1910645f5050Syouri/*
1911645f5050Syouri * do_var_savecolor() save a color from a var in the twmrc file.
1912645f5050Syouri */
1913645f5050Syouritypedef struct _cnode {int i; struct _cnode *next;} Cnode, *Cptr;
1914645f5050SyouriCptr chead = NULL;
1915645f5050Syouri
1916645f5050Syouriint do_var_savecolor(int key)
1917645f5050Syouri{
1918645f5050Syouri  Cptr cptrav, cpnew;
1919645f5050Syouri  if (!chead) {
1920645f5050Syouri    chead = (Cptr)malloc(sizeof(Cnode));
1921645f5050Syouri    chead->i = key; chead->next = NULL;
1922645f5050Syouri  }
1923645f5050Syouri  else {
1924645f5050Syouri    cptrav = chead;
1925645f5050Syouri    while (cptrav->next != NULL) { cptrav = cptrav->next; }
1926645f5050Syouri    cpnew = (Cptr)malloc(sizeof(Cnode));
1927645f5050Syouri    cpnew->i = key; cpnew->next = NULL; cptrav->next = cpnew;
1928645f5050Syouri  }
1929645f5050Syouri  return 0;
1930645f5050Syouri}
1931645f5050Syouri
1932645f5050Syouri/*
1933645f5050Syouri * assign_var_savecolor() traverse the var save color list placeing the pixels
1934645f5050Syouri *                        in the root window property.
1935645f5050Syouri */
1936645f5050Syourivoid assign_var_savecolor(void)
1937645f5050Syouri{
1938645f5050Syouri  Cptr cp = chead;
1939645f5050Syouri  while (cp != NULL) {
1940645f5050Syouri    switch (cp->i) {
1941645f5050Syouri    case kwcl_BorderColor:
1942645f5050Syouri      put_pixel_on_root(Scr->BorderColorC.back);
1943645f5050Syouri      break;
1944645f5050Syouri    case kwcl_IconManagerHighlight:
1945645f5050Syouri      put_pixel_on_root(Scr->IconManagerHighlight);
1946645f5050Syouri      break;
1947645f5050Syouri    case kwcl_BorderTileForeground:
1948645f5050Syouri      put_pixel_on_root(Scr->BorderTileC.fore);
1949645f5050Syouri      break;
1950645f5050Syouri    case kwcl_BorderTileBackground:
1951645f5050Syouri      put_pixel_on_root(Scr->BorderTileC.back);
1952645f5050Syouri      break;
1953645f5050Syouri    case kwcl_TitleForeground:
1954645f5050Syouri      put_pixel_on_root(Scr->TitleC.fore);
1955645f5050Syouri      break;
1956645f5050Syouri    case kwcl_TitleBackground:
1957645f5050Syouri      put_pixel_on_root(Scr->TitleC.back);
1958645f5050Syouri      break;
1959645f5050Syouri    case kwcl_IconForeground:
1960645f5050Syouri      put_pixel_on_root(Scr->IconC.fore);
1961645f5050Syouri      break;
1962645f5050Syouri    case kwcl_IconBackground:
1963645f5050Syouri      put_pixel_on_root(Scr->IconC.back);
1964645f5050Syouri      break;
1965645f5050Syouri    case kwcl_IconBorderColor:
1966645f5050Syouri      put_pixel_on_root(Scr->IconBorderColor);
1967645f5050Syouri      break;
1968645f5050Syouri    case kwcl_IconManagerForeground:
1969645f5050Syouri      put_pixel_on_root(Scr->IconManagerC.fore);
1970645f5050Syouri      break;
1971645f5050Syouri    case kwcl_IconManagerBackground:
1972645f5050Syouri      put_pixel_on_root(Scr->IconManagerC.back);
1973645f5050Syouri      break;
1974645f5050Syouri    case kwcl_MapWindowForeground:
1975645f5050Syouri      put_pixel_on_root(Scr->workSpaceMgr.windowcp.fore);
1976645f5050Syouri      break;
1977645f5050Syouri    case kwcl_MapWindowBackground:
1978645f5050Syouri      put_pixel_on_root(Scr->workSpaceMgr.windowcp.back);
1979645f5050Syouri      break;
1980645f5050Syouri    }
1981645f5050Syouri    cp = cp->next;
1982645f5050Syouri  }
1983645f5050Syouri  if (chead) {
1984645f5050Syouri    free(chead);
1985645f5050Syouri    chead = NULL;
1986645f5050Syouri  }
1987645f5050Syouri}
1988645f5050Syouri
1989645f5050Syouristatic int ParseRandomPlacement (register char *s)
1990645f5050Syouri{
1991645f5050Syouri    if (strlen (s) == 0) return RP_ALL;
1992645f5050Syouri    if (strcmp (s, "default") == 0) return RP_ALL;
1993645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
1994645f5050Syouri
1995645f5050Syouri    if (strcmp (s,      "off") == 0) return RP_OFF;
1996645f5050Syouri    if (strcmp (s,       "on") == 0) return RP_ALL;
1997645f5050Syouri    if (strcmp (s,      "all") == 0) return RP_ALL;
1998645f5050Syouri    if (strcmp (s, "unmapped") == 0) return RP_UNMAPPED;
1999645f5050Syouri    return (-1);
2000645f5050Syouri}
2001645f5050Syouri
2002645f5050Syouriint ParseJustification (register char *s)
2003645f5050Syouri{
2004645f5050Syouri    if (strlen (s) == 0) return (-1);
2005645f5050Syouri    if (strcmp (s, "default") == 0) return J_CENTER;
2006645f5050Syouri    if (strcmp (s,   "undef") == 0) return J_UNDEF;
2007645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
2008645f5050Syouri
2009645f5050Syouri    if (strcmp (s,   "undef") == 0) return J_UNDEF;
2010645f5050Syouri    if (strcmp (s, "default") == 0) return J_CENTER;
2011645f5050Syouri    if (strcmp (s,    "left") == 0) return J_LEFT;
2012645f5050Syouri    if (strcmp (s,  "center") == 0) return J_CENTER;
2013645f5050Syouri    if (strcmp (s,   "right") == 0) return J_RIGHT;
2014645f5050Syouri    if (strcmp (s,  "border") == 0) return J_BORDER;
2015645f5050Syouri    return (-1);
2016645f5050Syouri}
2017645f5050Syouri
2018645f5050Syouriint ParseAlignement (register char *s)
2019645f5050Syouri{
2020645f5050Syouri    if (strlen (s) == 0) return (-1);
2021645f5050Syouri    if (strcmp (s, "default") == 0) return J_CENTER;
2022645f5050Syouri    if (strcmp (s,   "undef") == 0) return J_UNDEF;
2023645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
2024645f5050Syouri
2025645f5050Syouri    if (strcmp (s,   "undef") == 0) return J_UNDEF;
2026645f5050Syouri    if (strcmp (s, "default") == 0) return J_CENTER;
2027645f5050Syouri    if (strcmp (s,     "top") == 0) return J_TOP;
2028645f5050Syouri    if (strcmp (s,  "center") == 0) return J_CENTER;
2029645f5050Syouri    if (strcmp (s,  "bottom") == 0) return J_BOTTOM;
2030645f5050Syouri    if (strcmp (s,  "border") == 0) return J_BORDER;
2031645f5050Syouri    return (-1);
2032645f5050Syouri}
2033645f5050Syouri
2034645f5050Syouristatic int ParseUsePPosition (register char *s)
2035645f5050Syouri{
2036645f5050Syouri    if (strlen (s) == 0) return (-1);
2037645f5050Syouri    if (strcmp (s,  "default") == 0) return PPOS_OFF;
2038645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
2039645f5050Syouri
2040645f5050Syouri    if (strcmp (s,  "default") == 0) return PPOS_OFF;
2041645f5050Syouri    if (strcmp (s,      "off") == 0) return PPOS_OFF;
2042645f5050Syouri    if (strcmp (s,       "on") == 0) return PPOS_ON;
2043645f5050Syouri    if (strcmp (s, "non-zero") == 0) return PPOS_NON_ZERO;
2044645f5050Syouri    if (strcmp (s,  "nonzero") == 0) return PPOS_NON_ZERO;
2045645f5050Syouri    return (-1);
2046645f5050Syouri}
2047645f5050Syouri
2048645f5050Syouristatic int ParseButtonStyle (register char *s)
2049645f5050Syouri{
2050645f5050Syouri    if (strlen (s) == 0) return (-1);
2051645f5050Syouri    if (strcmp (s,  "default") == 0) return STYLE_NORMAL;
2052645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
2053645f5050Syouri
2054645f5050Syouri    if (strcmp (s, "normal") == 0) return STYLE_NORMAL;
2055645f5050Syouri    if (strcmp (s, "style1") == 0) return STYLE_STYLE1;
2056645f5050Syouri    if (strcmp (s, "style2") == 0) return STYLE_STYLE2;
2057645f5050Syouri    if (strcmp (s, "style3") == 0) return STYLE_STYLE3;
2058645f5050Syouri    return (-1);
2059645f5050Syouri}
2060645f5050Syouri
2061645f5050Syouriint do_squeeze_entry (name_list **list,	/* squeeze or dont-squeeze list */
2062645f5050Syouri		      char *name,	/* window name */
2063645f5050Syouri		      int justify,	/* left, center, right */
2064645f5050Syouri		      int num,		/* signed num */
2065645f5050Syouri		      int denom)	/* 0 or indicates fraction denom */
2066645f5050Syouri{
2067645f5050Syouri    int absnum = (num < 0 ? -num : num);
2068645f5050Syouri
2069645f5050Syouri    if (denom < 0) {
2070645f5050Syouri	twmrc_error_prefix();
2071645f5050Syouri	fprintf (stderr, "negative SqueezeTitle denominator %d\n", denom);
2072645f5050Syouri	return (1);
2073645f5050Syouri    }
2074645f5050Syouri    if (absnum > denom && denom != 0) {
2075645f5050Syouri	twmrc_error_prefix();
2076645f5050Syouri	fprintf (stderr, "SqueezeTitle fraction %d/%d outside window\n",
2077645f5050Syouri		 num, denom);
2078645f5050Syouri	return (1);
2079645f5050Syouri    }
2080645f5050Syouri    /* Process the special cases from the manual here rather than
2081645f5050Syouri     * each time we calculate the position of the title bar
2082645f5050Syouri     * in add_window.c:ComputeTitleLocation().
2083645f5050Syouri     * In fact, it's better to get rid of them entirely, but we
2084645f5050Syouri     * probably should not do that for compatibility's sake.
2085645f5050Syouri     * By using a non-zero denominator the position will be relative.
2086645f5050Syouri     */
2087645f5050Syouri    if (denom == 0 && num == 0) {
2088645f5050Syouri	if (justify == J_CENTER) {
2089645f5050Syouri	    num = 1;
2090645f5050Syouri	    denom = 2;
2091645f5050Syouri	} else if (justify == J_RIGHT) {
2092645f5050Syouri	    num = 2;
2093645f5050Syouri	    denom = 2;
2094645f5050Syouri	}
2095645f5050Syouri	twmrc_error_prefix();
2096645f5050Syouri	fprintf (stderr, "deprecated SqueezeTitle faction 0/0, assuming %d/%d\n",
2097645f5050Syouri		 num, denom);
2098645f5050Syouri    }
2099645f5050Syouri
2100645f5050Syouri    if (HasShape) {
2101645f5050Syouri	SqueezeInfo *sinfo;
2102645f5050Syouri	sinfo = (SqueezeInfo *) malloc (sizeof(SqueezeInfo));
2103645f5050Syouri
2104645f5050Syouri	if (!sinfo) {
2105645f5050Syouri	    twmrc_error_prefix();
2106645f5050Syouri	    fprintf (stderr, "unable to allocate %lu bytes for squeeze info\n",
2107645f5050Syouri		     (unsigned long) sizeof(SqueezeInfo));
2108645f5050Syouri	    return (1);
2109645f5050Syouri	}
2110645f5050Syouri	sinfo->justify = justify;
2111645f5050Syouri	sinfo->num = num;
2112645f5050Syouri	sinfo->denom = denom;
2113645f5050Syouri	AddToList (list, name, (char *) sinfo);
2114645f5050Syouri    }
2115645f5050Syouri    return (0);
2116645f5050Syouri}
2117645f5050Syouri
2118645f5050Syouri#ifdef USEM4
2119645f5050Syouri
2120645f5050Syouristatic FILE *start_m4(FILE *fraw)
2121645f5050Syouri{
2122645f5050Syouri        int fno;
2123645f5050Syouri        int fids[2];
2124645f5050Syouri        int fres;               /* Fork result */
2125645f5050Syouri
2126645f5050Syouri        fno = fileno(fraw);
2127645f5050Syouri        /* if (-1 == fcntl(fno, F_SETFD, 0)) perror("fcntl()"); */
2128fb81d040Schristos        if (pipe(fids) < 0) {
2129fb81d040Schristos                perror("Pipe for " M4CMD " failed");
2130fb81d040Schristos                exit(23);
2131fb81d040Schristos	}
2132645f5050Syouri        fres = fork();
2133645f5050Syouri        if (fres < 0) {
2134645f5050Syouri                perror("Fork for " M4CMD " failed");
2135645f5050Syouri                exit(23);
2136645f5050Syouri        }
2137645f5050Syouri        if (fres == 0) {
2138645f5050Syouri                char *tmp_file;
2139645f5050Syouri
2140645f5050Syouri                /* Child */
2141645f5050Syouri                close(0);                       /* stdin */
2142645f5050Syouri                close(1);                       /* stdout */
2143645f5050Syouri                dup2(fno, 0);           /* stdin = fraw */
2144645f5050Syouri                dup2(fids[1], 1);       /* stdout = pipe to parent */
2145645f5050Syouri                /* get_defs("m4", dpy, display_name) */
2146645f5050Syouri                tmp_file = m4_defs(dpy, display_name);
2147645f5050Syouri                execlp(M4CMD, M4CMD, "-s", tmp_file, "-", NULL);
2148645f5050Syouri
2149645f5050Syouri                /* If we get here we are screwed... */
2150645f5050Syouri                perror("Can't execlp() " M4CMD);
2151645f5050Syouri                exit(124);
2152645f5050Syouri        }
2153645f5050Syouri        /* Parent */
2154645f5050Syouri        close(fids[1]);
2155645f5050Syouri        return ((FILE*)fdopen(fids[0], "r"));
2156645f5050Syouri}
2157645f5050Syouri
2158645f5050Syouri/* Code taken and munged from xrdb.c */
2159645f5050Syouri#define MAXHOSTNAME 255
2160645f5050Syouri#define Resolution(pixels, mm)  ((((pixels) * 100000 / (mm)) + 50) / 100)
2161645f5050Syouri#define EXTRA   16
2162645f5050Syouri
2163645f5050Syouristatic char *MkDef(char *name, char *def)
2164645f5050Syouri{
2165645f5050Syouri        static char *cp = NULL;
2166645f5050Syouri        static int maxsize = 0;
2167645f5050Syouri        int n, nl;
2168645f5050Syouri
2169645f5050Syouri	if (def == NULL) return ("");     /* XXX JWS: prevent segfaults */
2170645f5050Syouri        /* The char * storage only lasts for 1 call... */
2171645f5050Syouri        if ((n = EXTRA + ((nl = strlen(name)) +  strlen(def))) > maxsize) {
2172645f5050Syouri		maxsize = n;
2173645f5050Syouri                if (cp) free(cp);
2174645f5050Syouri
2175645f5050Syouri                cp = malloc(n);
2176645f5050Syouri        }
2177645f5050Syouri        /* Otherwise cp is aready big 'nuf */
2178645f5050Syouri        if (cp == NULL) {
2179645f5050Syouri                fprintf(stderr, "Can't get %d bytes for arg parm\n", n);
2180645f5050Syouri                exit(468);
2181645f5050Syouri        }
2182645f5050Syouri	strcpy (cp, "define(`");
2183645f5050Syouri	strcat (cp, name);
2184645f5050Syouri	strcat (cp, "', `");
2185645f5050Syouri	strcat (cp, def);
2186645f5050Syouri	strcat (cp, "')\n");
2187645f5050Syouri
2188645f5050Syouri        return(cp);
2189645f5050Syouri}
2190645f5050Syouri
2191645f5050Syouristatic char *MkNum(char *name, int def)
2192645f5050Syouri{
2193645f5050Syouri        char num[20];
2194645f5050Syouri
2195645f5050Syouri        sprintf(num, "%d", def);
2196645f5050Syouri        return(MkDef(name, num));
2197645f5050Syouri}
2198645f5050Syouri
2199645f5050Syouri#ifdef NOSTEMP
2200645f5050Syouriint mkstemp(str)
2201645f5050Syourichar *str;
2202645f5050Syouri{
2203645f5050Syouri        int fd;
2204645f5050Syouri
2205645f5050Syouri        mktemp(str);
2206645f5050Syouri        fd = creat(str, 0744);
2207645f5050Syouri        if (fd == -1) perror("mkstemp's creat");
2208645f5050Syouri        return(fd);
2209645f5050Syouri}
2210645f5050Syouri#endif
2211645f5050Syouri
2212645f5050Syouristatic char *m4_defs(Display *display, char *host)
2213645f5050Syouri{
2214645f5050Syouri        Screen *screen;
2215645f5050Syouri        Visual *visual;
2216645f5050Syouri        char client[MAXHOSTNAME], server[MAXHOSTNAME], *colon;
2217645f5050Syouri        struct hostent *hostname;
2218645f5050Syouri        char *vc;               /* Visual Class */
2219645f5050Syouri        static char tmp_name[] = "/tmp/twmrcXXXXXX";
2220645f5050Syouri        int fd;
2221645f5050Syouri        FILE *tmpf;
2222645f5050Syouri	char *user;
2223645f5050Syouri
2224645f5050Syouri        fd = mkstemp(tmp_name);		/* I *hope* mkstemp exists, because */
2225645f5050Syouri					/* I tried to find the "portable" */
2226645f5050Syouri					/* mktmp... */
2227645f5050Syouri        if (fd < 0) {
2228645f5050Syouri                perror("mkstemp failed in m4_defs");
2229645f5050Syouri                exit(377);
2230645f5050Syouri        }
2231645f5050Syouri        tmpf = (FILE*) fdopen(fd, "w+");
2232645f5050Syouri        XmuGetHostname(client, MAXHOSTNAME);
2233645f5050Syouri        hostname = gethostbyname(client);
2234645f5050Syouri        strcpy(server, XDisplayName(host));
2235645f5050Syouri        colon = strchr(server, ':');
2236645f5050Syouri        if (colon != NULL) *colon = '\0';
2237645f5050Syouri        if ((server[0] == '\0') || (!strcmp(server, "unix")))
2238645f5050Syouri                strcpy(server, client); /* must be connected to :0 or unix:0 */
2239645f5050Syouri        /* The machine running the X server */
2240645f5050Syouri        fputs(MkDef("SERVERHOST", server), tmpf);
2241645f5050Syouri        /* The machine running the window manager process */
2242645f5050Syouri        fputs(MkDef("CLIENTHOST", client), tmpf);
2243645f5050Syouri        if (hostname)
2244645f5050Syouri                fputs(MkDef("HOSTNAME", hostname->h_name), tmpf);
2245645f5050Syouri        else
2246645f5050Syouri                fputs(MkDef("HOSTNAME", client), tmpf);
2247645f5050Syouri
2248645f5050Syouri	if (!(user=getenv("USER")) && !(user=getenv("LOGNAME"))) user = "unknown";
2249645f5050Syouri        fputs(MkDef("USER", user), tmpf);
2250645f5050Syouri        fputs(MkDef("HOME", getenv("HOME")), tmpf);
2251645f5050Syouri        fputs(MkDef("PIXMAP_DIRECTORY", PIXMAP_DIRECTORY), tmpf);
2252645f5050Syouri        fputs(MkNum("VERSION", ProtocolVersion(display)), tmpf);
2253645f5050Syouri        fputs(MkNum("REVISION", ProtocolRevision(display)), tmpf);
2254645f5050Syouri        fputs(MkDef("VENDOR", ServerVendor(display)), tmpf);
2255645f5050Syouri        fputs(MkNum("RELEASE", VendorRelease(display)), tmpf);
2256645f5050Syouri        screen = ScreenOfDisplay(display, Scr->screen);
2257645f5050Syouri        visual = DefaultVisualOfScreen(screen);
2258645f5050Syouri        fputs(MkNum("WIDTH", screen->width), tmpf);
2259645f5050Syouri        fputs(MkNum("HEIGHT", screen->height), tmpf);
2260645f5050Syouri        fputs(MkNum("X_RESOLUTION",Resolution(screen->width,screen->mwidth)), tmpf);
2261645f5050Syouri        fputs(MkNum("Y_RESOLUTION",Resolution(screen->height,screen->mheight)),tmpf);
2262645f5050Syouri        fputs(MkNum("PLANES",DisplayPlanes(display, Scr->screen)), tmpf);
2263645f5050Syouri        fputs(MkNum("BITS_PER_RGB", visual->bits_per_rgb), tmpf);
2264645f5050Syouri        fputs(MkDef("TWM_TYPE", "ctwm"), tmpf);
2265645f5050Syouri        fputs(MkDef("TWM_VERSION", VersionNumber), tmpf);
2266645f5050Syouri        switch(visual->class) {
2267645f5050Syouri                case(StaticGray):       vc = "StaticGray";      break;
2268645f5050Syouri                case(GrayScale):        vc = "GrayScale";       break;
2269645f5050Syouri                case(StaticColor):      vc = "StaticColor";     break;
2270645f5050Syouri                case(PseudoColor):      vc = "PseudoColor";     break;
2271645f5050Syouri                case(TrueColor):        vc = "TrueColor";       break;
2272645f5050Syouri                case(DirectColor):      vc = "DirectColor";     break;
2273645f5050Syouri                default:                vc = "NonStandard";     break;
2274645f5050Syouri        }
2275645f5050Syouri        fputs(MkDef("CLASS", vc), tmpf);
2276645f5050Syouri        if (visual->class != StaticGray && visual->class != GrayScale) {
2277645f5050Syouri                fputs(MkDef("COLOR", "Yes"), tmpf);
2278645f5050Syouri        } else {
2279645f5050Syouri                fputs(MkDef("COLOR", "No"), tmpf);
2280645f5050Syouri        }
2281645f5050Syouri#ifdef XPM
2282645f5050Syouri	fputs(MkDef("XPM", "Yes"), tmpf);
2283645f5050Syouri#endif
2284645f5050Syouri#ifdef JPEG
2285645f5050Syouri	fputs(MkDef("JPEG", "Yes"), tmpf);
2286645f5050Syouri#endif
2287645f5050Syouri#ifdef IMCONV
2288645f5050Syouri	fputs(MkDef("IMCONV", "Yes"), tmpf);
2289645f5050Syouri#endif
2290645f5050Syouri#ifdef GNOME
2291645f5050Syouri	fputs(MkDef("GNOME", "Yes"), tmpf);
2292645f5050Syouri#endif
2293645f5050Syouri#ifdef SOUNDS
2294645f5050Syouri	fputs(MkDef("SOUNDS", "Yes"), tmpf);
2295645f5050Syouri#endif
2296645f5050Syouri	fputs(MkDef("I18N", "Yes"), tmpf);
2297645f5050Syouri	if (captive && captivename) {
2298645f5050Syouri            fputs (MkDef ("TWM_CAPTIVE", "Yes"), tmpf);
2299645f5050Syouri            fputs (MkDef ("TWM_CAPTIVE_NAME", captivename), tmpf);
2300645f5050Syouri	} else {
2301645f5050Syouri            fputs (MkDef ("TWM_CAPTIVE", "No"), tmpf);
2302645f5050Syouri	}
2303645f5050Syouri        if (KeepTmpFile) {
2304645f5050Syouri                fprintf(stderr, "Left file: %s\n", tmp_name);
2305645f5050Syouri        } else {
2306645f5050Syouri                fprintf(tmpf, "syscmd(/bin/rm %s)\n", tmp_name);
2307645f5050Syouri        }
2308645f5050Syouri        fclose(tmpf);
2309645f5050Syouri        return(tmp_name);
2310645f5050Syouri}
2311645f5050Syouri#endif /* USEM4 */
2312