chiark / gitweb /
debian/changelog: start -4~
[vtwm.git] / parse.c
1 /*****************************************************************************/
2 /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
3 /**                          Salt Lake City, Utah                           **/
4 /**  Portions Copyright 1989 by the Massachusetts Institute of Technology   **/
5 /**                        Cambridge, Massachusetts                         **/
6 /**                                                                         **/
7 /**                           All Rights Reserved                           **/
8 /**                                                                         **/
9 /**    Permission to use, copy, modify, and distribute this software and    **/
10 /**    its documentation  for  any  purpose  and  without  fee is hereby    **/
11 /**    granted, provided that the above copyright notice appear  in  all    **/
12 /**    copies and that both  that  copyright  notice  and  this  permis-    **/
13 /**    sion  notice appear in supporting  documentation,  and  that  the    **/
14 /**    names of Evans & Sutherland and M.I.T. not be used in advertising    **/
15 /**    in publicity pertaining to distribution of the  software  without    **/
16 /**    specific, written prior permission.                                  **/
17 /**                                                                         **/
18 /**    EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD    **/
19 /**    TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES  OF  MERCHANT-    **/
20 /**    ABILITY  AND  FITNESS,  IN  NO  EVENT SHALL EVANS & SUTHERLAND OR    **/
21 /**    M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL  DAM-    **/
22 /**    AGES OR  ANY DAMAGES WHATSOEVER  RESULTING FROM LOSS OF USE, DATA    **/
23 /**    OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER    **/
24 /**    TORTIOUS ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE    **/
25 /**    OR PERFORMANCE OF THIS SOFTWARE.                                     **/
26 /*****************************************************************************/
27
28
29 /***********************************************************************
30  *
31  * $XConsortium: parse.c,v 1.52 91/07/12 09:59:37 dave Exp $
32  *
33  * parse the .twmrc file
34  *
35  * 17-Nov-87 Thomas E. LaStrange       File created
36  * 10-Oct-90 David M. Sternlicht       Storing saved colors on root
37  ***********************************************************************/
38
39 #include <stdio.h>
40 #include <string.h>
41 #include <limits.h>
42 #include <X11/Xos.h>
43 #include <X11/Xmu/CharSet.h>
44 #include "twm.h"
45 #include "screen.h"
46 #include "menus.h"
47 #include "list.h"
48 #include "util.h"
49 #include "gram.h"
50 #include "parse.h"
51 #include <X11/Xatom.h>
52
53 /* Submitted by Jason Gloudon */
54 #ifndef NO_M4_SUPPORT
55 #include <sys/wait.h>
56 #include <unistd.h>
57 #include <netdb.h>
58 #include <X11/Xmu/SysUtil.h>
59 #endif
60
61 extern void twmrc_error_prefix();
62
63 #define BUF_LEN 300
64
65 static FILE *twmrc;
66 static int ptr = 0;
67 static int len = 0;
68 static char buff[BUF_LEN+1];
69 static char overflowbuff[20];           /* really only need one */
70 static int overflowlen;
71 static char **stringListSource, *currentString;
72 void put_pixel_on_root();
73
74 int RaiseDelay = 0;           /* msec, for AutoRaise *//*RAISEDELAY*/
75 extern int yylineno;
76 extern int mods;
77
78 int ConstrainedMoveTime = 400;          /* milliseconds, event times */
79
80 static int twmFileInput(), twmStringListInput();
81 void twmUnput();
82 int (*twmInputFunc)();
83
84 extern char *defTwmrc[];                /* default bindings */
85
86 /* Submitted by Jason Gloudon */
87 #ifndef NO_M4_SUPPORT
88 #define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
89 #define M4_MAXDIGITS 21 /* greater than the number of digits in a long int */
90 extern Bool PrintErrorMessages;
91 char *make_m4_cmdline();
92 #endif
93
94 /* djhjr - 6/22/01 */
95 #ifndef NO_SOUND_SUPPORT
96 extern void SetSoundHost();
97 extern void SetSoundVolume();
98 #endif
99
100 /***********************************************************************
101  *
102  *  Procedure:
103  *      ParseTwmrc - parse the .twmrc file
104  *
105  *  Inputs:
106  *      filename  - the filename to parse.  A NULL indicates $HOME/.twmrc
107  *
108  ***********************************************************************
109  */
110
111 static int doparse (ifunc, srctypename, srcname)
112     int (*ifunc)();
113     char *srctypename;
114     char *srcname;
115 {
116     mods = 0;
117     ptr = 0;
118     len = 0;
119 /* djhjr - 9/18/03 */
120 #ifdef NEED_YYLINENO_V
121     yylineno = 1;
122 #endif
123     ParseError = FALSE;
124     twmInputFunc = ifunc;
125     overflowlen = 0;
126
127     yyparse();
128
129     if (ParseError) {
130         fprintf (stderr, "%s:  errors found in twm %s",
131                  ProgramName, srctypename);
132         if (srcname) fprintf (stderr, " \"%s\"", srcname);
133         fprintf (stderr, "\n");
134     }
135     return (ParseError ? 0 : 1);
136 }
137
138 /* Changes for m4 pre-processing submitted by Jason Gloudon */
139 /* added support for user-defined parameters - djhjr - 2/20/99 */
140 #ifndef NO_M4_SUPPORT
141 int ParseTwmrc (filename, display_name, m4_preprocess, m4_option)
142     char *filename;
143     char *display_name;
144     int m4_preprocess;
145     char *m4_option; /* djhjr - 2/20/99 */
146 #else
147 int ParseTwmrc (filename)
148     char *filename;
149 #endif
150 {
151     int i;
152     char *cp = NULL;
153     char tmpfilename[257];
154 #ifndef NO_M4_SUPPORT
155     char *m4_cmdline;
156     int m4_status;
157 #endif
158
159     /*
160      * If filename given, try it, else try ~/.vtwmrc.#, else try ~/.vtwmrc,
161      * else try system.vtwmrc, else try ~/.twmrc.#, else ~/.twmrc, else
162      * system.twmrc; finally using built-in defaults.
163      *
164      * This choice allows user, then system, versions of .vtwmrc, followed
165      * by user, then system, versions of .twmrc.
166      * Thus, sites that have both twm and vtwm can allow users without
167      * private .vtwmrc or .twmrc files to fall back to system-wide
168      * defaults (very important when there are many users), yet the
169      * presence of a private .twmrc file for twm will not prevent
170      * features of a system-wide .vtwmrc file from exploiting the mew
171      * features of vtwm. Submitted by Nelson H. F. Beebe
172      */
173     for (twmrc = NULL, i = 0; !twmrc && i <= 6; i++) {
174         switch (i) {
175           case 0:                       /* -f filename */
176             cp = filename;
177             break;
178
179           case 1:                       /* ~/.vtwmrc.screennum */
180             if (!filename) {
181               cp = tmpfilename;
182               (void) sprintf (tmpfilename, "%s/.vtwmrc.%d",
183                               Home, Scr->screen);
184               break;
185             }
186             continue;
187
188           case 2:                       /* ~/.vtwmrc */
189             if (!filename) {
190               tmpfilename[HomeLen + 8] = '\0';
191             }
192             break;
193
194           case 3:                       /* system.vtwmrc */
195             cp = SYSTEM_VTWMRC;
196             break;
197  
198           case 4:                       /* ~/.twmrc.screennum */
199             if (!filename) {
200               cp = tmpfilename;
201               (void) sprintf (tmpfilename, "%s/.twmrc.%d",
202                               Home, Scr->screen);
203               break;
204             }
205             continue;
206
207           case 5:                       /* ~/.twmrc */
208             if(!filename){
209               tmpfilename[HomeLen + 7] = '\0';
210             }
211             break;
212
213           case 6:                       /* system.twmrc */
214             cp = SYSTEM_TWMRC;
215             break;
216         }
217
218 #ifndef NO_M4_SUPPORT
219         if (cp) { 
220             if (m4_preprocess && (access(cp, R_OK) == 0) ) {
221                     if ((m4_cmdline = make_m4_cmdline(display_name, cp, m4_option)) != NULL) {
222                             twmrc = popen(m4_cmdline, "r");
223                             free(m4_cmdline);
224                     }
225                     else {
226                             m4_preprocess = 0; 
227                             twmrc = fopen (cp, "r");
228                     }
229             }
230             else {
231                     twmrc = fopen (cp, "r");
232             }
233         }
234 #else
235         if (cp) twmrc = fopen (cp, "r");
236 #endif
237     }
238
239     if (twmrc) {
240         int status;
241
242         if (filename && cp != filename) {
243             fprintf (stderr,
244                      "%s:  unable to open twmrc file %s, using %s instead\n",
245                      ProgramName, filename, cp);
246         }
247         status = doparse (twmFileInput, "file", cp);
248
249 #ifndef NO_M4_SUPPORT
250         if(m4_preprocess){
251             m4_status = pclose (twmrc);
252             if(!WIFEXITED(m4_status) ||
253                (WIFEXITED(m4_status) && WEXITSTATUS(m4_status)) ){
254                 fprintf(stderr,
255                         "%s: m4 returned %d\n",
256                         ProgramName, WEXITSTATUS(m4_status));
257                 exit(-1); 
258             }
259         }
260         else {
261             fclose (twmrc);
262         }
263 #else
264         fclose (twmrc);
265 #endif
266
267         return status;
268     } else {
269         if (filename) {
270             fprintf (stderr,
271         "%s:  unable to open twmrc file %s, using built-in defaults instead\n",
272                      ProgramName, filename);
273         }
274         return ParseStringList (defTwmrc);
275     }
276 }
277
278 int ParseStringList (sl)
279     char **sl;
280 {
281     stringListSource = sl;
282     currentString = *sl;
283     return doparse (twmStringListInput, "string list", (char *)NULL);
284 }
285
286
287 /***********************************************************************
288  *
289  *  Procedure:
290  *      twmFileInput - redefinition of the lex input routine for file input
291  *
292  *  Returned Value:
293  *      the next input character
294  *
295  ***********************************************************************
296  */
297
298 static int twmFileInput()
299 {
300     if (overflowlen) return (int) overflowbuff[--overflowlen];
301
302     while (ptr == len)
303     {
304         if (fgets(buff, BUF_LEN, twmrc) == NULL)
305             return 0;
306
307 /* djhjr - 9/18/03 */
308 #ifdef NEED_YYLINENO_V
309         yylineno++;
310 #endif
311
312         ptr = 0;
313         len = strlen(buff);
314     }
315     return ((int)buff[ptr++]);
316 }
317
318 static int twmStringListInput()
319 {
320     if (overflowlen) return (int) overflowbuff[--overflowlen];
321
322     /*
323      * return the character currently pointed to
324      */
325     if (currentString) {
326         unsigned int c = (unsigned int) *currentString++;
327
328         if (c) return c;                /* if non-nul char */
329         currentString = *++stringListSource;  /* advance to next bol */
330         return '\n';                    /* but say that we hit last eol */
331     }
332     return 0;                           /* eof */
333 }
334
335
336 /***********************************************************************
337  *
338  *  Procedure:
339  *      twmUnput - redefinition of the lex unput routine
340  *
341  *  Inputs:
342  *      c       - the character to push back onto the input stream
343  *
344  ***********************************************************************
345  */
346
347 void twmUnput (c)
348     int c;
349 {
350     if (overflowlen < sizeof overflowbuff) {
351         overflowbuff[overflowlen++] = (char) c;
352     } else {
353         twmrc_error_prefix ();
354         fprintf (stderr, "unable to unput character (%d)\n",
355                  c);
356     }
357 }
358
359
360 /***********************************************************************
361  *
362  *  Procedure:
363  *      TwmOutput - redefinition of the lex output routine
364  *
365  *  Inputs:
366  *      c       - the character to print
367  *
368  ***********************************************************************
369  */
370
371 void
372 TwmOutput(c)
373 {
374     putchar(c);
375 }
376
377
378 /**********************************************************************
379  *
380  *  Parsing table and routines
381  *
382  ***********************************************************************/
383
384 typedef struct _TwmKeyword {
385     char *name;
386     int value;
387     int subnum;
388 } TwmKeyword;
389
390 #define kw0_NoDefaults                  1
391 #define kw0_AutoRelativeResize          2
392 #define kw0_ForceIcons                  3
393 #define kw0_NoIconManagers              4
394 #define kw0_OpaqueMove                  5
395 #define kw0_InterpolateMenuColors       6
396 #define kw0_NoVersion                   7
397 #define kw0_SortIconManager             8
398 #define kw0_NoGrabServer                9
399 #define kw0_NoMenuShadows               10
400 #define kw0_NoRaiseOnMove               11
401 #define kw0_NoRaiseOnResize             12
402 #define kw0_NoRaiseOnDeiconify          13
403 #define kw0_DontMoveOff                 14
404 #define kw0_NoBackingStore              15
405 #define kw0_NoSaveUnders                16
406 #define kw0_RestartPreviousState        17
407 #define kw0_ClientBorderWidth           18
408 #define kw0_NoTitleFocus                19
409 #define kw0_RandomPlacement             20
410 #define kw0_DecorateTransients          21
411 #define kw0_ShowIconManager             22
412 #define kw0_NoCaseSensitive             23
413 #define kw0_NoRaiseOnWarp               24
414 #define kw0_WarpUnmapped                25
415 #define kw0_DeIconifyToScreen           26
416 #define kw0_WarpWindows                 27
417 #define kw0_SnapRealScreen              28
418 #define kw0_NotVirtualGeometries        29
419 #define kw0_OldFashionedTwmWindowsMenu 30 /* RFB */
420
421 /* djhjr - 2/15/99
422 #define kw0_UseRealScreenBorder        31 * RFB *
423 */
424
425 #define kw0_StayUpMenus                32
426 #define kw0_NaturalAutopanBehavior     33 /* DSE */
427 #define kw0_EnhancedExecResources      34 /* DSE */
428 #define kw0_RightHandSidePulldownMenus 35 /* DSE */
429 #define kw0_LessRandomZoomZoom         36 /* DSE */
430 #define kw0_PrettyZoom                 37 /* DSE */
431
432 #define kw0_NoDefaultTitleButtons            38 /* DSE */
433 #define kw0_NoDefaultMouseOrKeyboardBindings 39 /* DSE */
434
435 #define kw0_StickyAbove                      40 /* DSE */
436 #define kw0_DontInterpolateTitles            41 /* DSE */
437 #define kw0_FixTransientVirtualGeometries    42 /* DSE */
438
439 #define kw0_WarpToTransients                 43 /* PF */
440 #define kw0_NoIconifyIconManagers            44 /* PF */
441 #define kw0_StayUpOptionalMenus              45 /* PF */
442
443 #define kw0_WarpSnug                         46 /* DSE */
444
445 #define kw0_PointerPlacement            47      /* cg */
446 /* obsoleted by the *BevelWidth resources - djhjr - 8/11/98
447 * djhjr - 4/18/96 *
448 #define kw0_Use3DMenus                  47
449 #define kw0_Use3DTitles                 48
450 #define kw0_Use3DIconManagers   49
451 #define kw0_Use3DBorders                50
452 */
453
454 /* obsoleted by the ":xpm:*" built-in pixmaps - djhjr - 10/26/02
455 * djhjr - 4/25/96 *
456 #define kw0_SunkFocusWindowTitle                        51
457 */
458
459 /* djhjr - 6/25/96 */
460 #define kw0_ShallowReliefWindowButton           52
461
462 /* djhjr - 9/21/96 */
463 #define kw0_ButtonColorIsFrame                          53
464
465 /* djhjr - 1/6/98 */
466 #define kw0_FixManagedVirtualGeometries         54
467
468 /* djhjr - 1/19/98 */
469 #define kw0_BeNiceToColormap                            55
470
471 /* djhjr - 4/17/98 */
472 #define kw0_VirtualReceivesMotionEvents         56
473 #define kw0_VirtualSendsMotionEvents            57
474
475 /* obsoleted by the *BevelWidth resources - djhjr - 8/11/98
476 * djhjr - 5/5/98 *
477 #define kw0_Use3DIcons                  58
478 */
479
480 /* djhjr - 5/27/98 */
481 #define kw0_NoIconManagerFocus                  59
482
483 /* djhjr - 12/14/98 */
484 #define kw0_StaticIconPositions                 60
485
486 /* for rader - djhjr - 2/9/99 */
487 #define kw0_NoPrettyTitles                              61
488
489 /* djhjr - 6/22/99 */
490 #define kw0_DontDeiconifyTransients             62
491
492 /* submitted by Ugen Antsilevitch - 5/28/00 */
493 #define kw0_WarpVisible                 63
494
495 /* djhjr - 10/2/01 */
496 #define kw0_StrictIconManager           64
497
498 /* djhjr - 10/11/01 */
499 #define kw0_ZoomZoom                    65
500
501 /* djhjr - 10/20/02 */
502 #define kw0_NoBorderDecorations         66
503
504 /* djhjr - 11/3/03 */
505 #define kw0_RaiseOnStart                67
506
507 /* djhjr - 9/24/02
508 #define kws_UsePPosition                1
509 */
510 #define kws_IconFont                    2
511 #define kws_ResizeFont                  3
512 #define kws_MenuFont                    4
513 #define kws_TitleFont                   5
514 #define kws_IconManagerFont             6
515 #define kws_UnknownIcon                 7
516 #define kws_IconDirectory               8
517 #define kws_MaxWindowSize               9
518 #define kws_VirtualFont                 10
519 #define kws_DoorFont                    11
520 #define kws_MenuTitleFont       12 /* DSE */
521
522 /* djhjr - 5/10/96 */
523 #define kws_InfoFont                    13
524
525 /* djhjr - 5/15/96 */
526 #define kws_ResizeRegion                14
527
528 /* djhjr - 6/22/01 */
529 #ifndef NO_SOUND_SUPPORT
530 #define kws_SoundHost                   15
531 #endif
532
533 #define kwn_ConstrainedMoveTime     1
534 #define kwn_MoveDelta               2
535 #define kwn_XorValue                3
536 #define kwn_FramePadding            4
537 #define kwn_TitlePadding            5
538 #define kwn_ButtonIndent            6
539 #define kwn_BorderWidth             7 
540 #define kwn_IconBorderWidth         8
541 #define kwn_TitleButtonBorderWidth  9
542 #define kwn_PanDistanceX           10
543 #define kwn_PanDistanceY           11
544 #define kwn_AutoPan                12
545 #define kwn_RaiseDelay             13 /* RAISEDELAY */
546 #define kwn_AutoPanBorderWidth     14 /* DSE */
547 #define kwn_AutoPanExtraWarp       15 /* DSE */
548 #define kwn_RealScreenBorderWidth  16 /* DSE */
549 #define kwn_AutoPanWarpWithRespectToRealScreen 17 /* DSE */
550
551 /* djhjr - 8/11/98
552 * djhjr - 4/18/96 *
553 #define kwn_ThreeDBorderWidth           18
554 */
555
556 /* djhjr - 4/18/96 */
557 #define kwn_ClearBevelContrast          19
558 #define kwn_DarkBevelContrast           20
559
560 /* djhjr - 5/2/98 */
561 #define kwn_BorderBevelWidth            21
562 #define kwn_IconManagerBevelWidth       22
563 #define kwn_InfoBevelWidth                      23
564 #define kwn_MenuBevelWidth                      24
565 #define kwn_TitleBevelWidth             25
566
567 /* djhjr - 8/11/98 */
568 #define kwn_IconBevelWidth                      26
569 #define kwn_ButtonBevelWidth            27
570
571 /* djhjr - 2/7/99 */
572 #define kwn_DoorBevelWidth                              28
573 #define kwn_VirtualDesktopBevelWidth    29
574
575 /* djhjr - 9/8/98 */
576 #define kwn_PanResistance               30
577
578 /* djhjr - 5/22/00 */
579 #define kwn_MenuScrollBorderWidth       31
580 #define kwn_MenuScrollJump                      32
581
582 /* djhjr - 6/22/01 */
583 #ifndef NO_SOUND_SUPPORT
584 #define kwn_SoundVolume                 33
585 #endif
586 #define kwn_PauseOnExit                 34
587 #define kwn_PauseOnQuit                 35
588
589 #define kwcl_BorderColor                1
590 #define kwcl_IconManagerHighlight       2
591 #define kwcl_BorderTileForeground       3
592 #define kwcl_BorderTileBackground       4
593 #define kwcl_TitleForeground            5
594 #define kwcl_TitleBackground            6
595 #define kwcl_IconForeground             7
596 #define kwcl_IconBackground             8
597 #define kwcl_IconBorderColor            9
598 #define kwcl_IconManagerForeground      10
599 #define kwcl_IconManagerBackground      11
600 #define kwcl_VirtualDesktopBackground   12
601 #define kwcl_VirtualDesktopForeground   13
602 #define kwcl_VirtualDesktopBorder       14
603 #define kwcl_DoorForeground             15
604 #define kwcl_DoorBackground             16
605
606 #define kwc_DefaultForeground           1
607 #define kwc_DefaultBackground           2
608 #define kwc_MenuForeground              3
609 #define kwc_MenuBackground              4
610 #define kwc_MenuTitleForeground         5
611 #define kwc_MenuTitleBackground         6
612 #define kwc_MenuShadowColor             7
613 #define kwc_VirtualForeground   8 /*RFB VCOLOR*/
614 #define kwc_VirtualBackground   9 /*RFB VCOLOR*/
615 #define kwc_RealScreenBackground                10      /* RFB 4/92 */
616 #define kwc_RealScreenForeground                11      /* RFB 4/92 */
617
618 /* djhjr - 10/20/01 */
619 #define kwm_Name                        LTYPE_NAME
620 #define kwm_ResName                     LTYPE_RES_NAME
621 #define kwm_ResClass                    LTYPE_RES_CLASS
622
623 /*
624  * The following is sorted alphabetically according to name (which must be
625  * in lowercase and only contain the letters a-z).  It is fed to a binary
626  * search to parse keywords.
627  */
628 static TwmKeyword keytable[] = {
629     { "all",                    ALL, 0 },
630
631     /* djhjr - 4/26/99 */
632     { "appletregion",   APPLET_REGION, 0 },
633
634     { "autopan",                NKEYWORD, kwn_AutoPan },
635     { "autopanborderwidth", NKEYWORD, kwn_AutoPanBorderWidth },       /* DSE */
636     { "autopanextrawarp", NKEYWORD, kwn_AutoPanExtraWarp },           /* DSE */
637     { "autopanwarpwithrespecttorealscreen", NKEYWORD,
638           kwn_AutoPanWarpWithRespectToRealScreen },                   /* DSE */
639     { "autoraise",              AUTO_RAISE, 0 },
640         { "autoraisedelay",       NKEYWORD, kwn_RaiseDelay },/*RAISEDELAY*/
641     { "autorelativeresize",     KEYWORD, kw0_AutoRelativeResize },
642
643         /* djhjr - 1/19/98 */
644     { "benicetocolormap",       KEYWORD, kw0_BeNiceToColormap },
645
646         /* djhjr - 5/2/98 */
647     { "borderbevelwidth",       NKEYWORD, kwn_BorderBevelWidth },
648
649     { "bordercolor",            CLKEYWORD, kwcl_BorderColor },
650     { "bordertilebackground",   CLKEYWORD, kwcl_BorderTileBackground },
651     { "bordertileforeground",   CLKEYWORD, kwcl_BorderTileForeground },
652     { "borderwidth",            NKEYWORD, kwn_BorderWidth },
653     { "button",                 BUTTON, 0 },
654
655     /* djhjr - 8/11/98 */
656     { "buttonbevelwidth",       NKEYWORD, kwn_ButtonBevelWidth },
657
658         /* djhjr - 9/21/96 */
659     { "buttoncolorisframe",     KEYWORD, kw0_ButtonColorIsFrame },
660
661     { "buttonindent",           SNKEYWORD, kwn_ButtonIndent },
662     { "c",                      CONTROL, 0 },
663     { "center",                 JKEYWORD, J_CENTER },
664
665     /* djhjr - 4/19/96 */
666     { "clearbevelcontrast",     NKEYWORD, kwn_ClearBevelContrast },
667
668     { "clientborderwidth",      KEYWORD, kw0_ClientBorderWidth },
669     { "color",                  COLOR, 0 },
670     { "constrainedmovetime",    NKEYWORD, kwn_ConstrainedMoveTime },
671     { "control",                CONTROL, 0 },
672     { "cursors",                CURSORS, 0 },
673     { "d",                      VIRTUAL_WIN, 0 },
674
675     /* djhjr - 4/19/96 */
676     { "darkbevelcontrast",      NKEYWORD, kwn_DarkBevelContrast },
677
678     { "decoratetransients",     KEYWORD, kw0_DecorateTransients },
679     { "defaultbackground",      CKEYWORD, kwc_DefaultBackground },
680     { "defaultforeground",      CKEYWORD, kwc_DefaultForeground },
681     { "defaultfunction",        DEFAULT_FUNCTION, 0 },
682     { "deiconifytoscreen",      KEYWORD, kw0_DeIconifyToScreen },
683     { "desktop",                VIRTUAL_WIN, 0 },
684     { "desktopdisplaybackground",
685           CLKEYWORD, kwcl_VirtualDesktopBackground },
686     { "desktopdisplayborder",
687           CLKEYWORD, kwcl_VirtualDesktopBorder },
688     { "desktopdisplayforeground",
689           CLKEYWORD, kwcl_VirtualDesktopForeground },
690     { "destroy",                KILL, 0 },
691
692         /* djhjr - 6/22/99 */
693     { "dontdeiconifytransients", KEYWORD, kw0_DontDeiconifyTransients },
694
695     { "donticonifybyunmapping", DONT_ICONIFY_BY_UNMAPPING, 0 },
696     { "dontinterpolatetitles", KEYWORD, kw0_DontInterpolateTitles },
697     { "dontmoveoff",            KEYWORD, kw0_DontMoveOff },
698     { "dontshowindisplay",      NO_SHOW_IN_DISPLAY, 0  },
699
700         /* Submitted by Erik Agsjo <erik.agsjo@aktiedirekt.com> */
701     { "dontshowintwmwindows",   NO_SHOW_IN_TWMWINDOWS, 0  },
702         /* djhjr - 6/25/98 */
703     { "dontshowinvtwmwindows",  NO_SHOW_IN_TWMWINDOWS, 0  },
704
705     { "dontsqueezetitle",       DONT_SQUEEZE_TITLE, 0 },
706     { "door",                   DOOR, 0 },
707     { "doorbackground",         CLKEYWORD, kwcl_DoorBackground },
708
709         /* djhjr - 2/7/99 */
710     { "doorbevelwidth",         NKEYWORD, kwn_DoorBevelWidth },
711
712     { "doorfont",               SKEYWORD, kws_DoorFont },
713     { "doorforeground",         CLKEYWORD, kwcl_DoorForeground },
714     { "doors",                  DOORS, 0 },
715     { "east",                   DKEYWORD, D_EAST },
716     { "enhancedexecresources", KEYWORD, kw0_EnhancedExecResources }, /* DSE */
717     { "f",                      FRAME, 0 },
718     { "f.autopan",              FKEYWORD, F_AUTOPAN },/*RFB F_AUTOPAN*/
719     { "f.autoraise",            FKEYWORD, F_AUTORAISE },
720     { "f.backiconmgr",          FKEYWORD, F_BACKICONMGR },
721     { "f.beep",                 FKEYWORD, F_BEEP },
722
723     /* Submitted by Seth Robertson - 9/9/02 */
724     { "f.bindbuttons",          FKEYWORD, F_BINDBUTTONS },
725     { "f.bindkeys",             FKEYWORD, F_BINDKEYS },
726
727     { "f.bottomzoom",           FKEYWORD, F_BOTTOMZOOM },
728     { "f.circledown",           FKEYWORD, F_CIRCLEDOWN },
729     { "f.circleup",             FKEYWORD, F_CIRCLEUP },
730     { "f.colormap",             FSKEYWORD, F_COLORMAP },
731     { "f.cut",                  FSKEYWORD, F_CUT },
732     { "f.cutfile",              FKEYWORD, F_CUTFILE },
733     { "f.deiconify",            FKEYWORD, F_DEICONIFY },
734     { "f.delete",               FKEYWORD, F_DELETE },
735     { "f.deletedoor",           FKEYWORD, F_DELETEDOOR },
736     { "f.deltastop",            FKEYWORD, F_DELTASTOP },
737     { "f.destroy",              FKEYWORD, F_DESTROY },
738     { "f.downiconmgr",          FKEYWORD, F_DOWNICONMGR },
739     { "f.enterdoor",            FKEYWORD, F_ENTERDOOR },
740     { "f.exec",                 FSKEYWORD, F_EXEC },
741     { "f.file",                 FSKEYWORD, F_FILE },
742     { "f.focus",                FKEYWORD, F_FOCUS },
743     { "f.forcemove",            FKEYWORD, F_FORCEMOVE },
744     { "f.forwiconmgr",          FKEYWORD, F_FORWICONMGR },
745     { "f.fullzoom",             FKEYWORD, F_FULLZOOM },
746     { "f.function",             FSKEYWORD, F_FUNCTION },
747     { "f.hbzoom",               FKEYWORD, F_BOTTOMZOOM },
748     { "f.hidedesktopdisplay",   FKEYWORD, F_HIDEDESKTOP },
749     { "f.hideiconmgr",          FKEYWORD, F_HIDELIST },
750     { "f.horizoom",             FKEYWORD, F_HORIZOOM },
751     { "f.htzoom",               FKEYWORD, F_TOPZOOM },
752     { "f.hzoom",                FKEYWORD, F_HORIZOOM },
753     { "f.iconify",              FKEYWORD, F_ICONIFY },
754     { "f.identify",             FKEYWORD, F_IDENTIFY },
755     { "f.lefticonmgr",          FKEYWORD, F_LEFTICONMGR },
756     { "f.leftzoom",             FKEYWORD, F_LEFTZOOM },
757     { "f.lower",                FKEYWORD, F_LOWER },
758     { "f.menu",                 FSKEYWORD, F_MENU },
759     { "f.move",                 FKEYWORD, F_MOVE },
760     { "f.movescreen",           FKEYWORD, F_MOVESCREEN },
761     { "f.nail",                 FKEYWORD, F_NAIL },
762     { "f.nailedabove", FKEYWORD, F_STICKYABOVE }, /* DSE */
763
764     /* djhjr - 4/20/98 */
765     { "f.namedoor",             FKEYWORD, F_NAMEDOOR },
766
767     { "f.newdoor",              FKEYWORD, F_NEWDOOR },
768     { "f.nexticonmgr",          FKEYWORD, F_NEXTICONMGR },
769     { "f.nop",                  FKEYWORD, F_NOP },
770     { "f.pandown",              FSKEYWORD, F_PANDOWN },
771     { "f.panleft",              FSKEYWORD, F_PANLEFT },
772     { "f.panright",             FSKEYWORD, F_PANRIGHT },
773     { "f.panup",                FSKEYWORD, F_PANUP },
774
775     /* djhjr - 11/15/02 */
776     { "f.playsound",            FSKEYWORD, F_PLAYSOUND },
777
778     { "f.previconmgr",          FKEYWORD, F_PREVICONMGR },
779     { "f.quit",                 FKEYWORD, F_QUIT },
780     { "f.raise",                FKEYWORD, F_RAISE },
781     { "f.raiselower",           FKEYWORD, F_RAISELOWER },
782     { "f.refresh",              FKEYWORD, F_REFRESH },
783     { "f.resetdesktop",         FKEYWORD, F_RESETDESKTOP },
784     { "f.resize",               FKEYWORD, F_RESIZE },
785     { "f.restart",              FKEYWORD, F_RESTART },
786     { "f.righticonmgr",         FKEYWORD, F_RIGHTICONMGR },
787     { "f.rightzoom",            FKEYWORD, F_RIGHTZOOM },
788     { "f.ring",         FKEYWORD, F_RING },
789     { "f.saveyourself",         FKEYWORD, F_SAVEYOURSELF },
790
791         /* djhjr - 4/30/96 */
792     { "f.separator",            FKEYWORD, F_SEPARATOR },
793
794     { "f.setrealscreen",        FSKEYWORD, F_SETREALSCREEN },
795     { "f.showdesktopdisplay",   FKEYWORD, F_SHOWDESKTOP },
796     { "f.showiconmgr",          FKEYWORD, F_SHOWLIST },
797     { "f.snap",                 FKEYWORD, F_SNAP },
798     { "f.snaprealscreen",                       FKEYWORD, F_SNAPREALSCREEN },
799     { "f.snugdesktop",        FKEYWORD, F_SNUGDESKTOP },
800     { "f.snugwindow",     FKEYWORD, F_SNUGWINDOW },
801     { "f.sorticonmgr",          FKEYWORD, F_SORTICONMGR },
802
803 /* djhjr - 6/22/01 */
804 #ifndef NO_SOUND_SUPPORT
805     { "f.sounds",               FKEYWORD, F_SOUNDS },
806 #endif
807
808     { "f.source",               FSKEYWORD, F_BEEP },  /* XXX - don't work */
809     { "f.squeezecenter",                FKEYWORD, F_SQUEEZECENTER },/*RFB SQUEEZE*/
810     { "f.squeezeleft",          FKEYWORD, F_SQUEEZELEFT },/*RFB SQUEEZE*/
811     { "f.squeezeright",         FKEYWORD, F_SQUEEZERIGHT },/*RFB SQUEEZE*/
812
813         /* djhjr - 7/15/98 */
814     { "f.startwm",              FSKEYWORD, F_STARTWM },
815
816         /* djhjr - 12/14/98 */
817         { "f.staticiconpositions",      FKEYWORD, F_STATICICONPOSITIONS },
818
819     { "f.stick",                        FKEYWORD, F_NAIL },
820     { "f.stickyabove", FKEYWORD, F_STICKYABOVE }, /* DSE */
821
822     /* djhjr - 10/2/01 */
823     { "f.stricticonmgr",        FKEYWORD, F_STRICTICONMGR },
824
825     { "f.title",                FKEYWORD, F_TITLE },
826     { "f.topzoom",              FKEYWORD, F_TOPZOOM },
827     { "f.twmrc",                FKEYWORD, F_RESTART },
828
829     /* Submitted by Seth Robertson - 9/9/02 */
830     { "f.unbindbuttons",        FKEYWORD, F_UNBINDBUTTONS },
831     { "f.unbindkeys",           FKEYWORD, F_UNBINDKEYS },
832
833     { "f.unfocus",              FKEYWORD, F_UNFOCUS },
834     { "f.upiconmgr",            FKEYWORD, F_UPICONMGR },
835     { "f.version",              FKEYWORD, F_VERSION },
836     { "f.virtualgeometries",    FKEYWORD, F_VIRTUALGEOMETRIES },
837     { "f.vlzoom",               FKEYWORD, F_LEFTZOOM },
838     { "f.vrzoom",               FKEYWORD, F_RIGHTZOOM },
839     { "f.warp",                 FKEYWORD, F_WARP },               /* PF */
840     { "f.warpclassnext",        FSKEYWORD, F_WARPCLASSNEXT }, /* PF */
841     { "f.warpclassprev",        FSKEYWORD, F_WARPCLASSPREV }, /* PF */
842     { "f.warpring",             FSKEYWORD, F_WARPRING },
843
844     /* djhjr - 5/30/00 */
845     { "f.warpsnug",        FKEYWORD, F_WARPSNUG },
846
847     { "f.warpto",               FSKEYWORD, F_WARPTO },
848     { "f.warptoiconmgr",        FSKEYWORD, F_WARPTOICONMGR },
849     { "f.warptonewest", FKEYWORD, F_WARPTONEWEST }, /* PF */
850     { "f.warptoscreen",         FSKEYWORD, F_WARPTOSCREEN },
851
852     /* submitted by Ugen Antsilevitch - 5/28/00 */
853     { "f.warpvisible",          FKEYWORD, F_WARPVISIBLE },
854
855     { "f.winrefresh",           FKEYWORD, F_WINREFRESH },
856     { "f.zoom",                 FKEYWORD, F_ZOOM },
857     { "f.zoomzoom",                     FKEYWORD, F_ZOOMZOOM },
858
859     /* djhjr - 1/6/98 */
860     { "fixmanagedvirtualgeometries", KEYWORD, kw0_FixManagedVirtualGeometries },
861
862     { "fixtransientvirtualgeometries", KEYWORD, 
863         kw0_FixTransientVirtualGeometries },                          /* DSE */
864     { "forceicons",             KEYWORD, kw0_ForceIcons },
865     { "frame",                  FRAME, 0 },
866     { "framepadding",           NKEYWORD, kwn_FramePadding },
867     { "function",               FUNCTION, 0 },
868     { "i",                      ICON, 0 },
869     { "icon",                   ICON, 0 },
870     { "iconbackground",         CLKEYWORD, kwcl_IconBackground },
871
872     /* djhjr - 8/11/98 */
873     { "iconbevelwidth", NKEYWORD, kwn_IconBevelWidth },
874
875     { "iconbordercolor",        CLKEYWORD, kwcl_IconBorderColor },
876     { "iconborderwidth",        NKEYWORD, kwn_IconBorderWidth },
877     { "icondirectory",          SKEYWORD, kws_IconDirectory },
878     { "iconfont",               SKEYWORD, kws_IconFont },
879     { "iconforeground",         CLKEYWORD, kwcl_IconForeground },
880     { "iconifybyunmapping",     ICONIFY_BY_UNMAPPING, 0 },
881     { "iconmanagerbackground",  CLKEYWORD, kwcl_IconManagerBackground },
882
883         /* djhjr - 5/2/98 */
884     { "iconmanagerbevelwidth",  NKEYWORD, kwn_IconManagerBevelWidth },
885
886     { "iconmanagerdontshow",    ICONMGR_NOSHOW, 0 },
887     { "iconmanagerfont",        SKEYWORD, kws_IconManagerFont },
888     { "iconmanagerforeground",  CLKEYWORD, kwcl_IconManagerForeground },
889     { "iconmanagergeometry",    ICONMGR_GEOMETRY, 0 },
890     { "iconmanagerhighlight",   CLKEYWORD, kwcl_IconManagerHighlight },
891
892     /* djhjr - 10/30/02 */
893     { "iconmanagerpixmap",      ICONMGRICONMAP, 0 },
894
895     { "iconmanagers",           ICONMGRS, 0 },
896     { "iconmanagershow",        ICONMGR_SHOW, 0 },
897     { "iconmgr",                ICONMGR, 0 },
898     { "iconregion",             ICON_REGION, 0 },
899     { "icons",                  ICONS, 0 },
900
901     /* djhjr - 9/10/03 */
902     { "ignoremodifiers",        IGNORE_MODS, 0 },
903
904         /* djhjr - 5/2/98 */
905     { "infobevelwidth", NKEYWORD, kwn_InfoBevelWidth },
906
907         /* djhjr - 5/10/96 */
908     { "infofont",               SKEYWORD, kws_InfoFont },
909
910     { "interpolatemenucolors",  KEYWORD, kw0_InterpolateMenuColors },
911     { "l",                      LOCK, 0 },
912     { "left",                   JKEYWORD, J_LEFT },
913     { "lefttitlebutton",        LEFT_TITLEBUTTON, 0 },
914     { "lessrandomzoomzoom", KEYWORD, kw0_LessRandomZoomZoom }, /* DSE */
915     { "lock",                   LOCK, 0 },
916     { "m",                      META, 0 },
917     { "maketitle",              MAKE_TITLE, 0 },
918     { "maxwindowsize",          SKEYWORD, kws_MaxWindowSize },
919     { "menu",                   MENU, 0 },
920     { "menubackground",         CKEYWORD, kwc_MenuBackground },
921
922         /* djhjr - 5/2/98 */
923     { "menubevelwidth", NKEYWORD, kwn_MenuBevelWidth },
924
925     { "menufont",               SKEYWORD, kws_MenuFont },
926     { "menuforeground",         CKEYWORD, kwc_MenuForeground },
927
928     /* djhjr - 10/30/02 */
929     { "menuiconpixmap",         MENUICONMAP, 0 },
930
931         /* djhjr - 5/22/00 */
932     { "menuscrollborderwidth",  NKEYWORD, kwn_MenuScrollBorderWidth },
933     { "menuscrolljump",         NKEYWORD, kwn_MenuScrollJump },
934
935     { "menushadowcolor",        CKEYWORD, kwc_MenuShadowColor },
936     { "menutitlebackground",    CKEYWORD, kwc_MenuTitleBackground },
937     { "menutitlefont", SKEYWORD, kws_MenuTitleFont },                /* DSE */
938     { "menutitleforeground",    CKEYWORD, kwc_MenuTitleForeground },
939     { "meta",                   META, 0 },
940     { "mod",                    META, 0 },  /* fake it */
941     { "monochrome",             MONOCHROME, 0 },
942     { "move",                   MOVE, 0 },
943     { "movedelta",              NKEYWORD, kwn_MoveDelta },
944     { "nailedabove",    KEYWORD, kw0_StickyAbove },                  /* DSE */
945     { "naileddown",             NAILEDDOWN, 0},
946
947     /* djhjr - 10/20/01 */
948     { "name",                   MKEYWORD, kwm_Name },
949
950     { "naturalautopanbehavior", KEYWORD, 
951         kw0_NaturalAutopanBehavior },                                /* DSE */
952     { "nobackingstore",         KEYWORD, kw0_NoBackingStore },
953
954     /* submitted by Tim Wiess - 8/23/02 */
955     { "noborder",               NO_BORDER, 0 },
956
957     /* djhjr - 10/20/02 */
958     { "noborderdecorations",    KEYWORD, kw0_NoBorderDecorations },
959
960     { "nocasesensitive",        KEYWORD, kw0_NoCaseSensitive },
961     { "nodefaultmouseorkeyboardbindings", KEYWORD,
962         kw0_NoDefaultMouseOrKeyboardBindings },                      /* DSE */
963     { "nodefaults",             KEYWORD, kw0_NoDefaults },
964     { "nodefaulttitlebuttons", KEYWORD, kw0_NoDefaultTitleButtons }, /* DSE */
965     { "nograbserver",           KEYWORD, kw0_NoGrabServer },
966     { "nohighlight",            NO_HILITE, 0 },
967     { "noiconifyiconmanagers",  KEYWORD, kw0_NoIconifyIconManagers }, /* PF */
968
969     /* djhjr - 5/27/98 */
970     { "noiconmanagerfocus",             KEYWORD, kw0_NoIconManagerFocus },
971
972     /* djhjr - 1/27/98 */
973     { "noiconmanagerhighlight",         NO_ICONMGR_HILITE, 0 },
974
975     { "noiconmanagers",         KEYWORD, kw0_NoIconManagers },
976     { "nomenushadows",          KEYWORD, kw0_NoMenuShadows },
977
978         /* djhjr - 4/7/98 */
979     { "noopaquemove",           NO_OPAQUE_MOVE, 0 },
980         { "noopaqueresize",             NO_OPAQUE_RESIZE, 0 },
981
982     /* for rader - djhjr - 2/9/99 */
983     { "noprettytitles",         KEYWORD, kw0_NoPrettyTitles },
984
985     { "noraiseondeiconify",     KEYWORD, kw0_NoRaiseOnDeiconify },
986     { "noraiseonmove",          KEYWORD, kw0_NoRaiseOnMove },
987     { "noraiseonresize",        KEYWORD, kw0_NoRaiseOnResize },
988     { "noraiseonwarp",          KEYWORD, kw0_NoRaiseOnWarp },
989     { "north",                  DKEYWORD, D_NORTH },
990     { "nosaveunders",           KEYWORD, kw0_NoSaveUnders },
991     { "nostackmode",            NO_STACKMODE, 0 },
992     { "notitle",                NO_TITLE, 0 },
993     { "notitlefocus",           KEYWORD, kw0_NoTitleFocus },
994     { "notitlehighlight",       NO_TITLE_HILITE, 0 },
995     { "notvirtualgeometries",   KEYWORD, kw0_NotVirtualGeometries },
996     { "noversion",              KEYWORD, kw0_NoVersion },
997
998     /* submitted by Jonathan Paisley - 10/27/02 */
999     { "nowindowring",           NO_WINDOW_RING, 0 },
1000
1001         { "oldfashionedtwmwindowsmenu", KEYWORD,
1002                         kw0_OldFashionedTwmWindowsMenu },/*RFB*/
1003
1004         /* djhjr - 6/25/98 */
1005         { "oldfashionedvtwmwindowsmenu", KEYWORD,
1006                         kw0_OldFashionedTwmWindowsMenu },/*RFB*/
1007
1008 /* djhjr - 4/7/98
1009     { "opaquemove",                     KEYWORD, kw0_OpaqueMove },
1010 */
1011     { "opaquemove",                     OPAQUE_MOVE, 0 },
1012
1013         /* djhjr - 4/7/98 */
1014         { "opaqueresize",               OPAQUE_RESIZE, 0 },
1015
1016     { "pandistancex",           NKEYWORD, kwn_PanDistanceX },
1017     { "pandistancey",           NKEYWORD, kwn_PanDistanceY },
1018
1019         /* djhjr - 4/7/98 */
1020     { "panresistance",          NKEYWORD, kwn_PanResistance },
1021
1022         /* djhjr - 6/22/01 */
1023     { "pauseonexit",            NKEYWORD, kwn_PauseOnExit },
1024     { "pauseonquit",            NKEYWORD, kwn_PauseOnQuit },
1025
1026         { "pixmaps",            PIXMAPS, 0 },
1027     { "pointerplacement",       KEYWORD, kw0_PointerPlacement },
1028         { "prettyzoom", KEYWORD, kw0_PrettyZoom }, /* DSE */
1029     { "r",                      ROOT, 0 },
1030         { "raisedelay",       NKEYWORD, kwn_RaiseDelay },/*RAISEDELAY*/
1031
1032         /* djhjr - 11/3/03 */
1033     { "raiseonstart",           KEYWORD, kw0_RaiseOnStart },
1034
1035     { "randomplacement",        KEYWORD, kw0_RandomPlacement },
1036     { "realscreenbackground", CKEYWORD, kwc_RealScreenBackground },/*RFB 4/92*/
1037     { "realscreenborderwidth", NKEYWORD, kwn_RealScreenBorderWidth }, /* DSE */
1038     { "realscreenforeground", CKEYWORD, kwc_RealScreenForeground },/*RFB 4/92*/
1039     { "realscreenpixmap",               REALSCREENMAP, 0 },/*RFB PIXMAP*/
1040
1041     /* djhjr - 10/20/01 */
1042     { "resclass",               MKEYWORD, kwm_ResClass },
1043
1044     { "resize",                 RESIZE, 0 },
1045     { "resizefont",             SKEYWORD, kws_ResizeFont },
1046
1047         /* djhjr - 5/15/96 */
1048     { "resizeregion",           SKEYWORD, kws_ResizeRegion },
1049
1050     /* djhjr - 10/20/01 */
1051     { "resname",                MKEYWORD, kwm_ResName },
1052
1053     { "restartpreviousstate",   KEYWORD, kw0_RestartPreviousState },
1054     { "rhspulldownmenus", KEYWORD, kw0_RightHandSidePulldownMenus }, /* DSE */
1055     { "right",                  JKEYWORD, J_RIGHT },
1056     { "righthandsidepulldownmenus", KEYWORD, kw0_RightHandSidePulldownMenus }, /* DSE */
1057     { "righttitlebutton",       RIGHT_TITLEBUTTON, 0 },
1058     { "root",                   ROOT, 0 },
1059     { "s",                      SHIFT, 0 },
1060     { "savecolor",              SAVECOLOR, 0},
1061     { "select",                 SELECT, 0 },
1062
1063         /* djhjr - 6/25/96 */
1064     { "shallowreliefwindowbutton",      KEYWORD, kw0_ShallowReliefWindowButton },
1065
1066     { "shift",                  SHIFT, 0 },
1067     { "showiconmanager",        KEYWORD, kw0_ShowIconManager },
1068     { "snaprealscreen",         KEYWORD, kw0_SnapRealScreen },
1069     { "sorticonmanager",        KEYWORD, kw0_SortIconManager },
1070
1071 /* djhjr - 6/22/01 */
1072 #ifndef NO_SOUND_SUPPORT
1073     { "soundhost",              SKEYWORD, kws_SoundHost },
1074     { "sounds",                 SOUNDS, 0 },
1075     { "soundvolume",            NKEYWORD, kwn_SoundVolume },
1076 #endif
1077
1078     { "south",                  DKEYWORD, D_SOUTH },
1079     { "squeezetitle",           SQUEEZE_TITLE, 0 },
1080     { "starticonified",         START_ICONIFIED, 0 },
1081
1082     /* djhjr - 12/14/98 */
1083     { "staticiconpositions",    KEYWORD, kw0_StaticIconPositions },
1084
1085     { "stayupmenus",            KEYWORD, kw0_StayUpMenus },
1086     { "stayupoptionalmenus",    KEYWORD, kw0_StayUpOptionalMenus }, /* PF */
1087     { "sticky",             NAILEDDOWN, 0 },/*RFB*/
1088     { "stickyabove",        KEYWORD, kw0_StickyAbove },                /* DSE */
1089
1090     /* djhjr - 10/2/01 */
1091     { "stricticonmanager",      KEYWORD, kw0_StrictIconManager },
1092
1093 /* obsoleted by the ":xpm:*" built-in pixmaps - djhjr - 10/26/02
1094         * djhjr - 4/25/96 *
1095     { "sunkfocuswindowtitle",   KEYWORD, kw0_SunkFocusWindowTitle },
1096 */
1097
1098     { "t",                      TITLE, 0 },
1099
1100 /* djhjr - 8/11/98
1101     * djhjr - 4/18/96 *
1102     { "threedborderwidth",      NKEYWORD, kwn_ThreeDBorderWidth },
1103 */
1104
1105     { "title",                  TITLE, 0 },
1106     { "titlebackground",        CLKEYWORD, kwcl_TitleBackground },
1107
1108         /* djhjr - 5/2/98 */
1109     { "titlebevelwidth",        NKEYWORD, kwn_TitleBevelWidth },
1110
1111     { "titlebuttonborderwidth", NKEYWORD, kwn_TitleButtonBorderWidth },
1112     { "titlefont",              SKEYWORD, kws_TitleFont },
1113     { "titleforeground",        CLKEYWORD, kwcl_TitleForeground },
1114     { "titlehighlight",         TITLE_HILITE, 0 },
1115     { "titlepadding",           NKEYWORD, kwn_TitlePadding },
1116     { "unknownicon",            SKEYWORD, kws_UnknownIcon },
1117 /* djhjr - 9/24/02 
1118     { "usepposition",           SKEYWORD, kws_UsePPosition },
1119 */
1120     { "usepposition",           USE_PPOSITION, 0 },
1121
1122 /* djhjr - 2/15/99 - this is dumb - if RealScreenBorderWidth is defined, use it!
1123         { "userealscreenborder", KEYWORD, kw0_UseRealScreenBorder }, *RFB*
1124 */
1125
1126 /* obsoleted by the *BevelWidth resources - djhjr - 8/11/98
1127         * djhjr - 4/18/96 *
1128     { "usethreedborders",       KEYWORD, kw0_Use3DBorders },
1129     { "usethreediconmanagers",  KEYWORD, kw0_Use3DIconManagers },
1130
1131         * djhjr - 5/5/98 *
1132     { "usethreedicons", KEYWORD, kw0_Use3DIcons },
1133
1134     { "usethreedmenus",         KEYWORD, kw0_Use3DMenus },
1135     { "usethreedtitles",        KEYWORD, kw0_Use3DTitles },
1136 */
1137
1138     { "v",                      VIRTUAL, 0 },
1139     { "virtual",                VIRTUAL, 0 },
1140     { "virtualbackground",      CKEYWORD, kwc_VirtualBackground },/*RFB VCOLOR*/
1141     { "virtualbackgroundpixmap",                VIRTUALMAP, 0 },/*RFB PIXMAP*/
1142     { "virtualdesktop",         VIRTUALDESKTOP, 0 },
1143
1144         /* djhjr - 2/7/99 */
1145     { "virtualdesktopbevelwidth",       NKEYWORD, kwn_VirtualDesktopBevelWidth },
1146
1147     { "virtualdesktopfont",     SKEYWORD, kws_VirtualFont },
1148     { "virtualforeground",      CKEYWORD, kwc_VirtualForeground },/*RFB VCOLOR*/
1149
1150         /* djhjr - 4/17/98 */
1151         { "virtualreceivesmotionevents", KEYWORD,
1152                         kw0_VirtualReceivesMotionEvents },
1153         { "virtualsendsmotionevents", KEYWORD,
1154                         kw0_VirtualSendsMotionEvents },
1155
1156     { "w",                      WINDOW, 0 },
1157     { "wait",                   WAIT, 0 },
1158
1159     /* djhjr - 10/16/02 */
1160     { "warpcentered",           WARP_CENTERED, 0 },
1161
1162     { "warpcursor",             WARP_CURSOR, 0 },
1163     { "warpsnug",               KEYWORD, kw0_WarpSnug }, /* DSE */
1164     { "warptotransients",       KEYWORD, kw0_WarpToTransients }, /* PF */
1165     { "warpunmapped",           KEYWORD, kw0_WarpUnmapped },
1166
1167     /* submitted by Ugen Antsilevitch - 5/28/00 */
1168     { "warpvisible",            KEYWORD, kw0_WarpVisible },
1169
1170     { "warpwindows",            KEYWORD, kw0_WarpWindows },
1171     { "west",                   DKEYWORD, D_WEST },
1172     { "window",                 WINDOW, 0 },
1173     { "windowfunction",         WINDOW_FUNCTION, 0 },
1174     { "windowring",             WINDOW_RING, 0 },
1175     { "xorvalue",               NKEYWORD, kwn_XorValue },
1176     { "zoom",                   ZOOM, 0 },
1177
1178         /* djhjr - 10/11/01 */
1179     { "zoomzoom",               KEYWORD, kw0_ZoomZoom },
1180 };
1181
1182 static int numkeywords = (sizeof(keytable)/sizeof(keytable[0]));
1183
1184 int parse_keyword (s, nump)
1185     char *s;
1186     int *nump;
1187 {
1188     register int lower = 0, upper = numkeywords - 1;
1189
1190     XmuCopyISOLatin1Lowered (s, s);
1191     while (lower <= upper) {
1192         int middle = (lower + upper) / 2;
1193         TwmKeyword *p = &keytable[middle];
1194         int res = strcmp (p->name, s);
1195
1196         if (res < 0) {
1197             lower = middle + 1;
1198         } else if (res == 0) {
1199             *nump = p->subnum;
1200             return p->value;
1201         } else {
1202             upper = middle - 1;
1203         }
1204     }
1205     return ERRORTOKEN;
1206 }
1207
1208
1209
1210 /*
1211  * action routines called by grammar
1212  */
1213
1214 int do_single_keyword (keyword)
1215     int keyword;
1216 {
1217     switch (keyword) {
1218       case kw0_NoDefaults:
1219         Scr->NoDefaultMouseOrKeyboardBindings = TRUE;
1220         Scr->NoDefaultTitleButtons = TRUE;
1221         return 1;
1222
1223       case kw0_NoDefaultMouseOrKeyboardBindings: /* DSE */
1224         Scr->NoDefaultMouseOrKeyboardBindings = TRUE;
1225         return 1;
1226
1227       case kw0_NoDefaultTitleButtons: /* DSE */
1228         Scr->NoDefaultTitleButtons = TRUE;
1229         return 1;
1230
1231         case kw0_StayUpMenus:
1232                 if (Scr->FirstTime) Scr->StayUpMenus = TRUE;
1233                 return 1;
1234
1235         case kw0_StayUpOptionalMenus: /* PF */
1236                 if (Scr->FirstTime) Scr->StayUpOptionalMenus = Scr->StayUpMenus = TRUE;
1237                 return 1;
1238
1239 /* djhjr - 2/15/99 - this is dumb - if RealScreenBorderWidth is defined, use it!
1240         case kw0_UseRealScreenBorder: *RFB*
1241                 Scr->UseRealScreenBorder = TRUE;
1242                 return 1;
1243 */
1244
1245         case kw0_OldFashionedTwmWindowsMenu:/*RFB*/
1246                 Scr->OldFashionedTwmWindowsMenu = TRUE;
1247                 return 1;
1248
1249       case kw0_AutoRelativeResize:
1250         Scr->AutoRelativeResize = TRUE;
1251         return 1;
1252
1253       case kw0_ForceIcons:
1254         if (Scr->FirstTime) Scr->ForceIcon = TRUE;
1255         return 1;
1256
1257       case kw0_NoIconManagers:
1258         Scr->NoIconManagers = TRUE;
1259         return 1;
1260
1261       case kw0_NoIconifyIconManagers: /* PF */
1262         Scr->NoIconifyIconManagers = TRUE;
1263         return 1;
1264
1265 /* djhjr - 4/7/98
1266       case kw0_OpaqueMove:
1267         Scr->OpaqueMove = TRUE;
1268         return 1;
1269 */
1270
1271       case kw0_InterpolateMenuColors:
1272         if (Scr->FirstTime) Scr->InterpolateMenuColors = TRUE;
1273         return 1;
1274
1275       case kw0_NoVersion:
1276         /* obsolete */
1277         return 1;
1278
1279       case kw0_SortIconManager:
1280         if (Scr->FirstTime) Scr->SortIconMgr = TRUE;
1281         return 1;
1282
1283       case kw0_NoGrabServer:
1284         Scr->NoGrabServer = TRUE;
1285         return 1;
1286
1287       case kw0_NoMenuShadows:
1288         if (Scr->FirstTime) Scr->Shadow = FALSE;
1289         return 1;
1290
1291       case kw0_NoRaiseOnMove:
1292         if (Scr->FirstTime) Scr->NoRaiseMove = TRUE;
1293         return 1;
1294
1295       case kw0_NoRaiseOnResize:
1296         if (Scr->FirstTime) Scr->NoRaiseResize = TRUE;
1297         return 1;
1298
1299       case kw0_NoRaiseOnDeiconify:
1300         if (Scr->FirstTime) Scr->NoRaiseDeicon = TRUE;
1301         return 1;
1302
1303       case kw0_DontMoveOff:
1304         Scr->DontMoveOff = TRUE;
1305         return 1;
1306
1307       case kw0_NoBackingStore:
1308         Scr->BackingStore = FALSE;
1309         return 1;
1310
1311       case kw0_NoSaveUnders:
1312         Scr->SaveUnder = FALSE;
1313         return 1;
1314
1315       case kw0_RestartPreviousState:
1316         RestartPreviousState = True;
1317         return 1;
1318
1319       case kw0_ClientBorderWidth:
1320         if (Scr->FirstTime) Scr->ClientBorderWidth = TRUE;
1321         return 1;
1322
1323       case kw0_NoTitleFocus:
1324         Scr->TitleFocus = FALSE;
1325         return 1;
1326
1327       case kw0_RandomPlacement:
1328         Scr->RandomPlacement = TRUE;
1329         return 1;
1330
1331       case kw0_PointerPlacement:
1332         Scr->PointerPlacement = TRUE;
1333         return 1;
1334
1335       case kw0_DecorateTransients:
1336         Scr->DecorateTransients = TRUE;
1337         return 1;
1338
1339       case kw0_WarpToTransients: /* PF */
1340         Scr->WarpToTransients = TRUE;
1341         return 1;
1342
1343       case kw0_ShowIconManager:
1344         Scr->ShowIconManager = TRUE;
1345         return 1;
1346
1347       case kw0_NoCaseSensitive:
1348         Scr->CaseSensitive = FALSE;
1349         return 1;
1350
1351       case kw0_NoRaiseOnWarp:
1352         Scr->NoRaiseWarp = TRUE;
1353         return 1;
1354
1355       case kw0_WarpUnmapped:
1356         Scr->WarpUnmapped = TRUE;
1357         return 1;
1358
1359       case kw0_DeIconifyToScreen:
1360         Scr->DeIconifyToScreen = TRUE;
1361         return 1;
1362
1363       case kw0_WarpWindows:
1364         Scr->WarpWindows = TRUE;
1365         return 1;
1366
1367       case kw0_SnapRealScreen:
1368         Scr->snapRealScreen = TRUE;
1369         return 1;
1370
1371       case kw0_NotVirtualGeometries:
1372         Scr->GeometriesAreVirtual = FALSE;
1373         return 1;
1374         
1375         case kw0_NaturalAutopanBehavior: /* DSE */
1376                 Scr->AutoPanWarpWithRespectToRealScreen = 100;
1377                 return 1;
1378         case kw0_EnhancedExecResources: /* DSE */
1379                 Scr->EnhancedExecResources = TRUE;
1380                 return 1;
1381         case kw0_RightHandSidePulldownMenus: /* DSE */
1382                 Scr->RightHandSidePulldownMenus = TRUE;
1383                 return 1;
1384         case kw0_LessRandomZoomZoom: /* DSE */
1385                 Scr->LessRandomZoomZoom = TRUE;
1386                 return 1;
1387         case kw0_PrettyZoom: /* DSE */
1388                 Scr->PrettyZoom = TRUE;
1389                 return 1;
1390         case kw0_StickyAbove: /* DSE */
1391                 Scr->StickyAbove = TRUE;
1392                 return 1;
1393         case kw0_DontInterpolateTitles: /* DSE */
1394                 Scr->DontInterpolateTitles = TRUE;
1395                 return 1;
1396
1397         /* djhjr - 1/6/98 */
1398         case kw0_FixManagedVirtualGeometries:
1399                 Scr->FixManagedVirtualGeometries = TRUE;
1400                 return 1;
1401
1402         case kw0_FixTransientVirtualGeometries: /* DSE */
1403                 Scr->FixTransientVirtualGeometries = TRUE;
1404                 return 1;
1405         case kw0_WarpSnug: /* DSE */
1406                 Scr->WarpSnug = TRUE;
1407                 return 1;
1408
1409         /* djhjr - 6/25/96 */
1410         case kw0_ShallowReliefWindowButton:
1411                 Scr->ShallowReliefWindowButton = 1;
1412                 return 1;
1413
1414 /* obsoleted by the *BevelWidth resources - djhjr - 8/11/98
1415         * djhjr - 4/18/96 *
1416         case kw0_Use3DBorders:
1417                 Scr->use3Dborders = TRUE;
1418                 return 1;
1419         case kw0_Use3DIconManagers:
1420                 Scr->use3Diconmanagers = TRUE;
1421                 return 1;
1422         case kw0_Use3DMenus:
1423                 Scr->use3Dmenus = TRUE;
1424                 return 1;
1425         case kw0_Use3DTitles:
1426                 Scr->use3Dtitles = TRUE;
1427                 return 1;
1428
1429         * djhjr - 5/5/98 *
1430         case kw0_Use3DIcons:
1431                 Scr->use3Dicons = TRUE;
1432                 return 1;
1433 */
1434
1435 /* obsoleted by the ":xpm:*" built-in pixmaps - djhjr - 10/26/02
1436         * djhjr - 4/25/96 *
1437         case kw0_SunkFocusWindowTitle:
1438                 Scr->SunkFocusWindowTitle = TRUE;
1439                 return 1;
1440 */
1441
1442         /* djhjr - 9/21/96 */
1443         case kw0_ButtonColorIsFrame:
1444                 Scr->ButtonColorIsFrame = TRUE;
1445                 return 1;
1446
1447         /* djhjr - 1/19/98 */
1448         case kw0_BeNiceToColormap:
1449                 Scr->BeNiceToColormap = TRUE;
1450                 return 1;
1451
1452         /* djhjr - 4/17/98 */
1453         case kw0_VirtualReceivesMotionEvents:
1454                 Scr->VirtualReceivesMotionEvents = TRUE;
1455                 return 1;
1456         case kw0_VirtualSendsMotionEvents:
1457                 Scr->VirtualSendsMotionEvents = TRUE;
1458                 return 1;
1459
1460         /* djhjr - 5/27/98 */
1461         case kw0_NoIconManagerFocus:
1462                 Scr->IconManagerFocus = FALSE;
1463                 return 1;
1464
1465         /* djhjr - 12/14/98 */
1466         case kw0_StaticIconPositions:
1467                 Scr->StaticIconPositions = TRUE;
1468                 return 1;
1469
1470         /* for rader - djhjr - 2/9/99 */
1471         case kw0_NoPrettyTitles:
1472                 Scr->NoPrettyTitles = TRUE;
1473                 return 1;
1474
1475         /* djhjr - 6/22/99 */
1476         case kw0_DontDeiconifyTransients:
1477                 Scr->DontDeiconifyTransients = TRUE;
1478                 return 1;
1479
1480         /* submitted by Ugen Antsilevitch - 5/28/00 */
1481         case kw0_WarpVisible:
1482                 Scr->WarpVisible = TRUE;
1483                 return 1;
1484
1485         /* djhjr - 10/2/01 */
1486         case kw0_StrictIconManager:
1487                 Scr->StrictIconManager = TRUE;
1488                 return 1;
1489
1490         /* djhjr - 10/11/01 */
1491         case kw0_ZoomZoom: /* DSE */
1492                 Scr->ZoomZoom = TRUE;
1493                 return 1;
1494
1495         /* djhjr - 10/20/02 */
1496         case kw0_NoBorderDecorations: /* DSE */
1497                 Scr->NoBorderDecorations = TRUE;
1498                 return 1;
1499
1500         /* djhjr - 11/3/03 */
1501         case kw0_RaiseOnStart:
1502                 Scr->RaiseOnStart = TRUE;
1503                 return 1;
1504     }
1505
1506     return 0;
1507 }
1508
1509
1510 int do_string_keyword (keyword, s)
1511     int keyword;
1512     char *s;
1513 {
1514     /* idea from Seth Robertson - djhjr - 9/17/03 */
1515     if (s == NULL || s[0] == '\0')
1516         return 0;
1517
1518     switch (keyword) {
1519 /* now in gram.y - djhjr - 9/24/02
1520       case kws_UsePPosition:
1521         {
1522             int ppos = ParseUsePPosition (s);
1523             if (ppos < 0) {
1524                 twmrc_error_prefix();
1525                 fprintf (stderr,
1526                          "ignoring invalid UsePPosition argument \"%s\"\n", s);
1527             } else {
1528                 Scr->UsePPosition = ppos;
1529             }
1530             return 1;
1531         }
1532 */
1533
1534       case kws_IconFont:
1535         if (!Scr->HaveFonts) Scr->IconFont.name = s;
1536         return 1;
1537
1538       case kws_ResizeFont:
1539         if (!Scr->HaveFonts) Scr->SizeFont.name = s;
1540         return 1;
1541
1542       case kws_MenuFont:
1543         if (!Scr->HaveFonts) Scr->MenuFont.name = s;
1544         return 1;
1545
1546       case kws_TitleFont:
1547         if (!Scr->HaveFonts) Scr->TitleBarFont.name = s;
1548         return 1;
1549
1550       case kws_IconManagerFont:
1551         if (!Scr->HaveFonts) Scr->IconManagerFont.name = s;
1552         return 1;
1553
1554       case kws_MenuTitleFont: /* DSE */
1555         if (!Scr->HaveFonts) Scr->MenuTitleFont.name = s;
1556         return 1;
1557
1558         /* djhjr - 5/10/96 */
1559       case kws_InfoFont:
1560         if (!Scr->HaveFonts) Scr->InfoFont.name = s;
1561         return 1;
1562
1563       case kws_UnknownIcon:
1564         if (Scr->FirstTime) GetUnknownIcon (s);
1565         return 1;
1566
1567       case kws_IconDirectory:
1568         if (Scr->FirstTime) Scr->IconDirectory = ExpandFilename (s);
1569         return 1;
1570
1571       case kws_MaxWindowSize:
1572         JunkMask = XParseGeometry (s, &JunkX, &JunkY, &JunkWidth, &JunkHeight);
1573         if ((JunkMask & (WidthValue | HeightValue)) !=
1574             (WidthValue | HeightValue)) {
1575             twmrc_error_prefix();
1576             fprintf (stderr, "bad MaxWindowSize \"%s\"\n", s);
1577             return 0;
1578         }
1579         if (JunkWidth <= 0 || JunkHeight <= 0) {
1580             twmrc_error_prefix();
1581             fprintf (stderr, "MaxWindowSize \"%s\" must be positive\n", s);
1582             return 0;
1583         }
1584         Scr->MaxWindowWidth = JunkWidth;
1585         Scr->MaxWindowHeight = JunkHeight;
1586         return 1;
1587
1588       case kws_VirtualFont:
1589         Scr->NamesInVirtualDesktop = True;
1590         if (!Scr->HaveFonts) Scr->VirtualFont.name = s;
1591         return 1;
1592
1593       case kws_DoorFont:
1594         if (!Scr->HaveFonts) Scr->DoorFont.name = s;
1595         return 1;
1596
1597 /* djhjr - 6/22/01 */
1598 #ifndef NO_SOUND_SUPPORT
1599         case kws_SoundHost:
1600                 if (Scr->FirstTime) SetSoundHost(s);
1601                 return 1;
1602 #endif
1603
1604         /* djhjr - 5/15/96 */
1605         case kws_ResizeRegion:
1606                 XmuCopyISOLatin1Lowered (s, s);
1607                 if (strcmp (s, "northwest") == 0)
1608                 {
1609                         Scr->ResizeX = R_NORTHWEST;
1610                         return 1;
1611                 }
1612                 else if (strcmp (s, "northeast") == 0)
1613                 {
1614                         Scr->ResizeX = R_NORTHEAST;
1615                         return 1;
1616                 }
1617                 if (strcmp (s, "southwest") == 0)
1618                 {
1619                         Scr->ResizeX = R_SOUTHWEST;
1620                         return 1;
1621                 }
1622                 else if (strcmp (s, "southeast") == 0)
1623                 {
1624                         Scr->ResizeX = R_SOUTHEAST;
1625                         return 1;
1626                 }
1627                 else if (strcmp (s, "centered") == 0)
1628                 {
1629                         Scr->ResizeX = R_CENTERED;
1630                         return 1;
1631                 }
1632                 else
1633                 {
1634                         twmrc_error_prefix();
1635                         fprintf (stderr, "Invalid ResizeRegion \"%s\"\n", s);
1636                         return 0;
1637                 }
1638         }
1639
1640     return 0;
1641 }
1642
1643
1644 int do_number_keyword (keyword, num)
1645     int keyword;
1646     int num;
1647 {
1648     switch (keyword) {
1649       case kwn_ConstrainedMoveTime:
1650         ConstrainedMoveTime = num;
1651         return 1;
1652         
1653           case kwn_AutoPanBorderWidth: /* DSE */
1654                 Scr->AutoPanBorderWidth = (num<1)?1:num;
1655                 return 1;
1656                 
1657           case kwn_AutoPanExtraWarp: /* DSE */
1658                 Scr->AutoPanExtraWarp = (num<0)?0:num;
1659             return 1;
1660             
1661           case kwn_RealScreenBorderWidth: /* DSE */
1662                 Scr->RealScreenBorderWidth = (num < 0) ? 0 : num;
1663             return 1;
1664
1665       case kwn_MoveDelta:
1666         Scr->MoveDelta = num;
1667         return 1;
1668
1669       case kwn_XorValue:
1670         if (Scr->FirstTime) Scr->XORvalue = num;
1671         return 1;
1672
1673       case kwn_FramePadding:
1674         if (Scr->FirstTime) Scr->FramePadding = num;
1675         return 1;
1676
1677       case kwn_TitlePadding:
1678         if (Scr->FirstTime) Scr->TitlePadding = num;
1679         return 1;
1680
1681       case kwn_ButtonIndent:
1682         if (Scr->FirstTime) Scr->ButtonIndent = num;
1683         return 1;
1684
1685       case kwn_BorderWidth:
1686         if (Scr->FirstTime) Scr->BorderWidth = num;
1687         return 1;
1688
1689       case kwn_IconBorderWidth:
1690         if (Scr->FirstTime) Scr->IconBorderWidth = num;
1691         return 1;
1692
1693       case kwn_TitleButtonBorderWidth:
1694         if (Scr->FirstTime) Scr->TBInfo.border = num;
1695         return 1;
1696
1697       case kwn_PanDistanceX:
1698         if (Scr->FirstTime)
1699         {
1700                 Scr->VirtualDesktopPanDistanceX = (num * Scr->MyDisplayWidth) / 100;
1701                 /* added this - djhjr - 1/4/98 */
1702                 if (Scr->VirtualDesktopPanDistanceX <= 0) Scr->VirtualDesktopPanDistanceX = 1;
1703         }
1704         return 1;
1705
1706       case kwn_PanDistanceY:
1707         if (Scr->FirstTime)
1708         {
1709                 Scr->VirtualDesktopPanDistanceY = (num * Scr->MyDisplayHeight) / 100;
1710                 /* added this - djhjr - 1/4/98 */
1711                 if (Scr->VirtualDesktopPanDistanceY <= 0) Scr->VirtualDesktopPanDistanceY = 1;
1712         }
1713         return 1;
1714
1715         /* djhjr - 9/8/98 */
1716         case kwn_PanResistance:
1717                 if (Scr->FirstTime) Scr->VirtualDesktopPanResistance = num;
1718                 if (Scr->VirtualDesktopPanResistance < 0)
1719                         Scr->VirtualDesktopPanResistance = 0;
1720                 return 1;
1721
1722         case kwn_RaiseDelay: RaiseDelay = num; return 1;/*RAISEDELAY*/
1723
1724       case kwn_AutoPan:
1725         if (Scr->FirstTime)
1726         {
1727                 Scr->AutoPanX = (num * Scr->MyDisplayWidth) / 100;
1728                 Scr->AutoPanY = (num * Scr->MyDisplayHeight) / 100;
1729                 if (Scr->AutoPanX <= 0) Scr->AutoPanX = 1;
1730                 if (Scr->AutoPanY <= 0) Scr->AutoPanY = 1;
1731         }
1732         return 1;
1733
1734         case kwn_AutoPanWarpWithRespectToRealScreen: /* DSE */
1735                 Scr->AutoPanWarpWithRespectToRealScreen = (num<0)?0:(num>100)?100:num;
1736                 return 1;
1737
1738 /* djhjr - 8/11/98
1739         * djhjr - 4/18/96 *
1740         case kwn_ThreeDBorderWidth:
1741                 if (Scr->FirstTime) Scr->ThreeDBorderWidth = num;
1742                 return 1;
1743 */
1744
1745         /* djhjr - 4/19/96 */
1746         case kwn_ClearBevelContrast:
1747                 if (Scr->FirstTime) Scr->ClearBevelContrast = num;
1748                 if (Scr->ClearBevelContrast <   0) Scr->ClearBevelContrast =   0;
1749                 if (Scr->ClearBevelContrast > 100) Scr->ClearBevelContrast = 100;
1750                 return 1;
1751         case kwn_DarkBevelContrast:
1752                 if (Scr->FirstTime) Scr->DarkBevelContrast = num;
1753                 if (Scr->DarkBevelContrast <   0) Scr->DarkBevelContrast =   0;
1754                 if (Scr->DarkBevelContrast > 100) Scr->DarkBevelContrast = 100;
1755                 return 1;
1756
1757         /* djhjr - 5/2/98 */
1758         case kwn_BorderBevelWidth:
1759                 if (Scr->FirstTime) Scr->BorderBevelWidth = num;
1760                 if (Scr->BorderBevelWidth < 0) Scr->BorderBevelWidth = 0;
1761                 if (Scr->BorderBevelWidth > 9) Scr->BorderBevelWidth = 9;
1762                 return 1;
1763         case kwn_IconManagerBevelWidth:
1764                 if (Scr->FirstTime) Scr->IconMgrBevelWidth = num;
1765                 if (Scr->IconMgrBevelWidth < 0) Scr->IconMgrBevelWidth = 0;
1766                 if (Scr->IconMgrBevelWidth > 9) Scr->IconMgrBevelWidth = 9;
1767                 return 1;
1768         case kwn_InfoBevelWidth:
1769                 if (Scr->FirstTime) Scr->InfoBevelWidth = num;
1770                 if (Scr->InfoBevelWidth < 0) Scr->InfoBevelWidth = 0;
1771                 if (Scr->InfoBevelWidth > 9) Scr->InfoBevelWidth = 9;
1772                 return 1;
1773         case kwn_MenuBevelWidth:
1774                 if (Scr->FirstTime) Scr->MenuBevelWidth = num;
1775                 if (Scr->MenuBevelWidth < 0) Scr->MenuBevelWidth = 0;
1776                 if (Scr->MenuBevelWidth > 9) Scr->MenuBevelWidth = 9;
1777                 return 1;
1778         case kwn_TitleBevelWidth:
1779                 if (Scr->FirstTime) Scr->TitleBevelWidth = num;
1780                 if (Scr->TitleBevelWidth < 0) Scr->TitleBevelWidth = 0;
1781                 if (Scr->TitleBevelWidth > 9) Scr->TitleBevelWidth = 9;
1782                 return 1;
1783
1784         /* djhjr - 8/11/98 */
1785         case kwn_ButtonBevelWidth:
1786                 if (Scr->FirstTime) Scr->ButtonBevelWidth = num;
1787                 if (Scr->ButtonBevelWidth < 0) Scr->ButtonBevelWidth = 0;
1788                 if (Scr->ButtonBevelWidth > 9) Scr->ButtonBevelWidth = 9;
1789                 return 1;
1790         case kwn_IconBevelWidth:
1791                 if (Scr->FirstTime) Scr->IconBevelWidth = num;
1792                 if (Scr->IconBevelWidth < 0) Scr->IconBevelWidth = 0;
1793                 if (Scr->IconBevelWidth > 9) Scr->IconBevelWidth = 9;
1794                 return 1;
1795
1796         /* djhjr - 2/7/99 */
1797         case kwn_DoorBevelWidth:
1798                 if (Scr->FirstTime) Scr->DoorBevelWidth = num;
1799                 if (Scr->DoorBevelWidth < 0) Scr->DoorBevelWidth = 0;
1800                 if (Scr->DoorBevelWidth > 9) Scr->DoorBevelWidth = 9;
1801                 return 1;
1802         case kwn_VirtualDesktopBevelWidth:
1803                 if (Scr->FirstTime) Scr->VirtualDesktopBevelWidth = num;
1804                 if (Scr->VirtualDesktopBevelWidth < 0) Scr->VirtualDesktopBevelWidth = 0;
1805                 if (Scr->VirtualDesktopBevelWidth > 9) Scr->VirtualDesktopBevelWidth = 9;
1806                 return 1;
1807
1808         /* djhjr - 5/22/00 */
1809         case kwn_MenuScrollBorderWidth:
1810                 if (Scr->FirstTime) Scr->MenuScrollBorderWidth = num;
1811                 return 1;
1812         case kwn_MenuScrollJump:
1813                 if (Scr->FirstTime) Scr->MenuScrollJump = num;
1814                 return 1;
1815
1816 /* djhjr - 8/16/01 */
1817 #ifndef NO_SOUND_SUPPORT
1818         case kwn_SoundVolume:
1819                 if (Scr->FirstTime) SetSoundVolume(num);
1820                 return 1;
1821 #endif
1822
1823         /* djhjr - 6/22/01 */
1824         case kwn_PauseOnExit:
1825                 if (Scr->FirstTime) Scr->PauseOnExit = num;
1826                 return 1;
1827         case kwn_PauseOnQuit:
1828                 if (Scr->FirstTime) Scr->PauseOnQuit = num;
1829                 return 1;
1830     }
1831
1832     return 0;
1833 }
1834
1835 name_list **do_colorlist_keyword (keyword, colormode, s)
1836     int keyword;
1837     int colormode;
1838     char *s;
1839 {
1840     switch (keyword) {
1841       case kwcl_BorderColor:
1842         GetColor (colormode, &Scr->BorderColor, s);
1843         return &Scr->BorderColorL;
1844
1845       case kwcl_IconManagerHighlight:
1846         GetColor (colormode, &Scr->IconManagerHighlight, s);
1847         return &Scr->IconManagerHighlightL;
1848
1849       case kwcl_BorderTileForeground:
1850         GetColor (colormode, &Scr->BorderTileC.fore, s);
1851         return &Scr->BorderTileForegroundL;
1852
1853       case kwcl_BorderTileBackground:
1854         GetColor (colormode, &Scr->BorderTileC.back, s);
1855         return &Scr->BorderTileBackgroundL;
1856
1857       case kwcl_TitleForeground:
1858         GetColor (colormode, &Scr->TitleC.fore, s);
1859         return &Scr->TitleForegroundL;
1860
1861       case kwcl_TitleBackground:
1862         GetColor (colormode, &Scr->TitleC.back, s);
1863         return &Scr->TitleBackgroundL;
1864
1865       case kwcl_IconForeground:
1866         GetColor (colormode, &Scr->IconC.fore, s);
1867         return &Scr->IconForegroundL;
1868
1869       case kwcl_IconBackground:
1870         GetColor (colormode, &Scr->IconC.back, s);
1871         return &Scr->IconBackgroundL;
1872
1873       case kwcl_IconBorderColor:
1874         GetColor (colormode, &Scr->IconBorderColor, s);
1875         return &Scr->IconBorderColorL;
1876
1877       case kwcl_IconManagerForeground:
1878         GetColor (colormode, &Scr->IconManagerC.fore, s);
1879         return &Scr->IconManagerFL;
1880
1881       case kwcl_IconManagerBackground:
1882         GetColor (colormode, &Scr->IconManagerC.back, s);
1883         return &Scr->IconManagerBL;
1884
1885       case kwcl_VirtualDesktopForeground:
1886         GetColor (colormode, &Scr->VirtualDesktopDisplayC.fore, s);
1887         return &Scr->VirtualDesktopColorFL;
1888
1889       case kwcl_VirtualDesktopBackground:
1890         GetColor (colormode, &Scr->VirtualDesktopDisplayC.back, s);
1891         return &Scr->VirtualDesktopColorBL;
1892
1893       case kwcl_VirtualDesktopBorder:
1894         GetColor (colormode, &Scr->VirtualDesktopDisplayBorder, s);
1895         return &Scr->VirtualDesktopColorBoL;
1896
1897       case kwcl_DoorForeground:
1898         GetColor (colormode, &Scr->DoorC.fore, s);
1899         return &Scr->DoorForegroundL;
1900
1901       case kwcl_DoorBackground:
1902         GetColor (colormode, &Scr->DoorC.back, s);
1903         return &Scr->DoorBackgroundL;
1904
1905     }
1906     return NULL;
1907 }
1908
1909 int do_color_keyword (keyword, colormode, s)
1910     int keyword;
1911     int colormode;
1912     char *s;
1913 {
1914     switch (keyword) {
1915       case kwc_DefaultForeground:
1916         GetColor (colormode, &Scr->DefaultC.fore, s);
1917         return 1;
1918
1919       case kwc_DefaultBackground:
1920         GetColor (colormode, &Scr->DefaultC.back, s);
1921         return 1;
1922
1923       case kwc_MenuForeground:
1924         GetColor (colormode, &Scr->MenuC.fore, s);
1925         return 1;
1926
1927       case kwc_MenuBackground:
1928         GetColor (colormode, &Scr->MenuC.back, s);
1929         return 1;
1930
1931       case kwc_MenuTitleForeground:
1932         GetColor (colormode, &Scr->MenuTitleC.fore, s);
1933         return 1;
1934
1935       case kwc_MenuTitleBackground:
1936         GetColor (colormode, &Scr->MenuTitleC.back, s);
1937         return 1;
1938
1939       case kwc_MenuShadowColor:
1940         GetColor (colormode, &Scr->MenuShadowColor, s);
1941         return 1;
1942
1943       case kwc_VirtualBackground:/*RFB VCOLOR*/
1944         GetColor (colormode, &Scr->VirtualC.back, s);/*RFB VCOLOR*/
1945         return 1;/*RFB VCOLOR*/
1946
1947       case kwc_VirtualForeground:/*RFB VCOLOR*/
1948         GetColor (colormode, &Scr->VirtualC.fore, s);/*RFB VCOLOR*/
1949         return 1;/*RFB VCOLOR*/
1950
1951       case kwc_RealScreenForeground:
1952         GetColor( colormode, &Scr->RealScreenC.fore, s);/*RFB 4/92 */
1953         return 1;
1954
1955       case kwc_RealScreenBackground:
1956         GetColor( colormode, &Scr->RealScreenC.back, s);/*RFB 4/92 */
1957         return 1;
1958
1959     }
1960
1961     return 0;
1962 }
1963
1964 /*
1965  * put_pixel_on_root() Save a pixel value in twm root window color property.
1966  */
1967 void put_pixel_on_root(pixel)
1968     Pixel pixel;
1969 {
1970   int           i, addPixel = 1;
1971   Atom          pixelAtom, retAtom;
1972   int           retFormat;
1973   unsigned long nPixels, retAfter;
1974   Pixel        *retProp;
1975
1976   pixelAtom = XInternAtom(dpy, "_MIT_PRIORITY_COLORS", True);
1977
1978   /* added tests for success - djhjr - 1/10/98 */
1979   if (XGetWindowProperty(dpy, Scr->Root, pixelAtom, 0, 8192,
1980                      False, XA_CARDINAL, &retAtom,
1981                      &retFormat, &nPixels, &retAfter,
1982                      (unsigned char **)&retProp) != Success || retAtom == None)
1983       return;
1984
1985   for (i=0; i< nPixels; i++)
1986       if (pixel == retProp[i]) addPixel = 0;
1987
1988   if (addPixel)
1989       XChangeProperty (dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS,
1990                        XA_CARDINAL, 32, PropModeAppend,
1991                        (unsigned char *)&pixel, 1);
1992 }
1993
1994 /*
1995  * do_string_savecolor() save a color from a string in the twmrc file.
1996  */
1997 void do_string_savecolor(colormode, s)
1998      int colormode;
1999      char *s;
2000 {
2001   Pixel p = ULONG_MAX;
2002   GetColor(colormode, &p, s);
2003   if (p != ULONG_MAX)
2004   put_pixel_on_root(p);
2005 }
2006
2007 /*
2008  * do_var_savecolor() save a color from a var in the twmrc file.
2009  */
2010 typedef struct _cnode {int i; struct _cnode *next;} Cnode, *Cptr;
2011 Cptr chead = NULL;
2012
2013 void do_var_savecolor(key)
2014 int key;
2015 {
2016   Cptr cptrav, cpnew;
2017   if (!chead) {
2018     chead = (Cptr)malloc(sizeof(Cnode));
2019     chead->i = key; chead->next = NULL;
2020   }
2021   else {
2022     cptrav = chead;
2023     while (cptrav->next != NULL) { cptrav = cptrav->next; }
2024     cpnew = (Cptr)malloc(sizeof(Cnode));
2025     cpnew->i = key; cpnew->next = NULL; cptrav->next = cpnew;
2026   }
2027 }
2028
2029 /*
2030  * assign_var_savecolor() traverse the var save color list placeing the pixels
2031  *                        in the root window property.
2032  */
2033 void assign_var_savecolor()
2034 {
2035   Cptr cp = chead;
2036   while (cp != NULL) {
2037     switch (cp->i) {
2038     case kwcl_BorderColor:
2039       put_pixel_on_root(Scr->BorderColor);
2040       break;
2041     case kwcl_IconManagerHighlight:
2042       put_pixel_on_root(Scr->IconManagerHighlight);
2043       break;
2044     case kwcl_BorderTileForeground:
2045       put_pixel_on_root(Scr->BorderTileC.fore);
2046       break;
2047     case kwcl_BorderTileBackground:
2048       put_pixel_on_root(Scr->BorderTileC.back);
2049       break;
2050     case kwcl_TitleForeground:
2051       put_pixel_on_root(Scr->TitleC.fore);
2052       break;
2053     case kwcl_TitleBackground:
2054       put_pixel_on_root(Scr->TitleC.back);
2055       break;
2056     case kwcl_IconForeground:
2057       put_pixel_on_root(Scr->IconC.fore);
2058       break;
2059     case kwcl_IconBackground:
2060       put_pixel_on_root(Scr->IconC.back);
2061       break;
2062     case kwcl_IconBorderColor:
2063       put_pixel_on_root(Scr->IconBorderColor);
2064       break;
2065     case kwcl_IconManagerForeground:
2066       put_pixel_on_root(Scr->IconManagerC.fore);
2067       break;
2068     case kwcl_IconManagerBackground:
2069       put_pixel_on_root(Scr->IconManagerC.back);
2070       break;
2071     }
2072     cp = cp->next;
2073   }
2074   if (chead) {
2075     free(chead);
2076     chead = NULL;
2077   }
2078 }
2079
2080 /* added 'type' argument - djhjr - 10/20/01 */
2081 void do_squeeze_entry (list, name, type, justify, num, denom)
2082     name_list **list;                   /* squeeze or dont-squeeze list */
2083     char *name;                         /* window name */
2084     short type;                         /* match type */
2085     int justify;                        /* left, center, right */
2086     int num;                            /* signed pixel count or fraction num */
2087     int denom;                          /* signed 0 or indicates fraction denom */
2088 {
2089     int absnum = (num < 0 ? -num : num);
2090     int absdenom = (denom < 0 ? -denom : denom);
2091
2092     if (num < 0) {
2093         twmrc_error_prefix();
2094         fprintf (stderr, "SqueezeTitle numerator %d made positive\n", num);
2095     }
2096     if (denom < 0) {
2097         twmrc_error_prefix();
2098         fprintf (stderr, "SqueezeTitle denominator %d made positive\n", denom);
2099     }
2100     if (absnum > absdenom && denom != 0) {
2101         twmrc_error_prefix();
2102         fprintf (stderr, "SqueezeTitle fraction %d/%d outside window\n",
2103                  num, denom);
2104         return;
2105     }
2106     if (denom == 1) {
2107         twmrc_error_prefix();
2108         fprintf (stderr, "useless SqueezeTitle fraction %d/%d, assuming 0/0\n",
2109                  num, denom);
2110         absnum = 0;
2111         absdenom = 0;
2112     }
2113
2114     if (HasShape) {
2115         SqueezeInfo *sinfo;
2116         sinfo = (SqueezeInfo *) malloc (sizeof(SqueezeInfo));
2117
2118         if (!sinfo) {
2119             twmrc_error_prefix();
2120             fprintf (stderr, "unable to allocate %d bytes for squeeze info\n",
2121                      sizeof(SqueezeInfo));
2122             return;
2123         }
2124         sinfo->justify = justify;
2125         sinfo->num = absnum;
2126         sinfo->denom = absdenom;
2127         /* added 'type' argument - djhjr - 10/20/01 */
2128         AddToList (list, name, type, (char *)sinfo);
2129     }
2130 }
2131
2132 /* Submitted by Jason Gloudon */
2133 /* added support for user-defined parameters - djhjr - 2/20/99 */
2134 /* added support for sound - djhjr - 6/22/01 */
2135 /* added support for regex - djhjr - 10/20/01 */
2136 /* added support for i18n - djhjr - 9/14/03 */
2137 #ifndef NO_M4_SUPPORT
2138 char *make_m4_cmdline(display_name, cp, m4_option)
2139 char *display_name;
2140 char *cp;
2141 char *m4_option; /* djhjr - 2/20/99 */
2142 {
2143   char *m4_lines[6] = {
2144       "m4 -DHOME='%s' -DWIDTH='%d' -DHEIGHT='%d' -DSOUND='%s' ",
2145       "-DPLANES='%d' -DBITS_PER_RGB='%d' -DCLASS='%s' -DXPM='%s' ",
2146       "-DI18N='%s' -DCOLOR='%s' -DX_RESOLUTION='%d' -DY_RESOLUTION='%d' ",
2147       "-DREGEX='%s' -DUSER='%s' -DSERVERHOST='%s' -DCLIENTHOST='%s' ",
2148       "-DHOSTNAME='%s' -DTWM_TYPE='vtwm' -DVERSION='%d' ",
2149       "-DREVISION='%d' -DVENDOR='%s' -DRELEASE='%d'"
2150   };
2151   char *client, *server, *hostname;
2152   char *m4_cmdline, *colon, *vc, *env_username;
2153   char *is_sound, *is_xpm, *is_regex, *is_color, *is_i18n;
2154   int i, client_len, opt_len = 0, cmd_len = 0, server_is_client = 0;
2155   struct hostent *hostname_ent;
2156
2157   /* djhjr - 2/20/99 */
2158   if (m4_option)
2159   {
2160     opt_len = strlen(m4_option);
2161
2162     /* this isn't likely ever needed, but you just never know... */
2163     if (m4_option[0] == '\'' || m4_option[0] == '"')
2164     {
2165       if (m4_option[opt_len - 1] != '\'' && m4_option[opt_len - 1] != '"')
2166       {
2167         fprintf(stderr,"%s: badly formed user-defined m4 parameter\n", ProgramName);
2168         return (NULL);
2169       }
2170       else
2171       {
2172         m4_option++;
2173         opt_len -= 2;
2174       }
2175     }
2176   }
2177
2178   /* the sourcing of various hostnames is stolen from tvtwm */
2179   /* pad for NULL terminator - submitted by Jonathan Paisley - 11/11/02 */
2180   for(client = NULL, client_len = 256; client_len < 1024; client_len *= 2){
2181     if((client = malloc(client_len + 1)) == NULL){
2182       fprintf(stderr,"%s: cannot allocate %d bytes for m4\n", ProgramName, client_len + 1);
2183       return (NULL);
2184     }
2185
2186     client[client_len] = '\0';
2187     XmuGetHostname(client, client_len);
2188
2189     if(client[client_len] == '\0')
2190        break;
2191
2192     free(client);
2193     client = NULL;
2194   }
2195
2196   if(client == NULL){
2197     fprintf(stderr, "%s: cannot get hostname for m4\n", ProgramName);
2198     return (NULL);
2199   }
2200
2201   if((server = XDisplayName(display_name)) == NULL){
2202     fprintf(stderr, "%s: cannot get display name for m4\n", ProgramName);
2203     return (NULL);
2204   }
2205
2206   /* we copy so we can modify it safely */
2207   server = strdup(server);
2208
2209   if((colon = index(server, ':')) != NULL){
2210     *colon = '\0';
2211   }
2212
2213   /* connected to :0 or unix:0 ? */
2214   if((server[0] == '\0') || (!strcmp(server, "unix"))){
2215     if (colon){
2216       *colon = ':';
2217       colon = NULL;
2218     }
2219     free(server);
2220     server = client;
2221     server_is_client = 1;
2222   }
2223
2224   hostname_ent = gethostbyname(client);
2225   hostname = hostname_ent != NULL ? hostname_ent->h_name : client;
2226
2227 #ifdef NO_XPM_SUPPORT
2228   is_xpm = "No";
2229 #else
2230   is_xpm = "Yes";
2231 #endif
2232 #ifdef NO_SOUND_SUPPORT
2233   is_sound = "No";
2234 #else
2235   is_sound = "Yes";
2236 #endif
2237 #ifdef NO_REGEX_SUPPORT
2238   is_regex = "No";
2239 #else
2240   is_regex = "Yes";
2241 #endif
2242 #ifdef NO_I18N_SUPPORT
2243   is_i18n = "No";
2244 #else
2245   is_i18n = "Yes";
2246 #endif
2247
2248   /* assume colour visual */
2249   is_color = "Yes";
2250   switch(Scr->d_visual->class)
2251   {
2252     case(StaticGray):   vc = "StaticGray"; is_color = "No";     break;
2253     case(GrayScale):    vc = "GrayScale";  is_color = "No";     break;
2254     case(StaticColor):  vc = "StaticColor";     break;
2255     case(PseudoColor):  vc = "PseudoColor";     break;
2256     case(TrueColor):    vc = "TrueColor";       break;
2257     case(DirectColor):  vc = "DirectColor";     break;
2258     default:            vc = "NonStandard";     break;
2259   }
2260
2261   if((env_username = getenv("LOGNAME")) == NULL){
2262     env_username = "";
2263   }
2264
2265   /*
2266    * Start with slightly more than the minimal command line, add space for
2267    * nine numeric fields, ensure we have room for each of the strings, and
2268    * add some breathing room
2269    *
2270    * Then add space for any user-defined parameters - djhjr - 2/20/99
2271    */
2272   for (i = 0; i < 6; i++) cmd_len += strlen(m4_lines[i]);
2273   cmd_len += M4_MAXDIGITS * 9 + HomeLen + strlen(vc) + strlen(is_xpm) +
2274       strlen(is_color) + strlen(env_username) + strlen(server) +
2275       strlen(client) + strlen(hostname) + strlen(ServerVendor(dpy)) +
2276       strlen(is_sound) + strlen(is_regex) + strlen(is_i18n) + strlen(cp) + 16;
2277   if (opt_len) cmd_len += opt_len;
2278
2279   if((m4_cmdline = malloc(cmd_len)) == NULL){
2280     fprintf(stderr,"%s: cannot allocate %d bytes for m4\n", ProgramName, cmd_len);
2281     return (NULL);
2282   }
2283
2284   /*
2285    * Non-SysV systems - specifically, BSD-derived systems - return a
2286    * pointer to the string, not its length.
2287    */
2288   sprintf(m4_cmdline, m4_lines[0], Home, Scr->MyDisplayWidth,
2289       Scr->MyDisplayHeight, is_sound);
2290   cmd_len = strlen(m4_cmdline);
2291   sprintf(m4_cmdline + cmd_len, m4_lines[1], Scr->d_depth,
2292       Scr->d_visual->bits_per_rgb, vc, is_xpm);
2293   cmd_len = strlen(m4_cmdline);
2294   sprintf(m4_cmdline + cmd_len, m4_lines[2], is_i18n, is_color, 
2295           Resolution(Scr->MyDisplayWidth, DisplayWidthMM(dpy, Scr->screen)),
2296           Resolution(Scr->MyDisplayHeight, DisplayHeightMM(dpy, Scr->screen)));
2297   cmd_len = strlen(m4_cmdline);
2298   sprintf(m4_cmdline + cmd_len, m4_lines[3], is_regex, env_username,
2299           server, client);
2300   cmd_len = strlen(m4_cmdline);
2301   sprintf(m4_cmdline + cmd_len, m4_lines[4], hostname, ProtocolVersion(dpy));
2302   cmd_len = strlen(m4_cmdline);
2303   sprintf(m4_cmdline + cmd_len, m4_lines[5], ProtocolRevision(dpy),
2304       ServerVendor(dpy), VendorRelease(dpy));
2305
2306   /* djhjr - 2/20/99 */
2307   cmd_len = strlen(m4_cmdline);
2308   if (opt_len)
2309   {
2310     sprintf(m4_cmdline + cmd_len, " %*.*s", opt_len, opt_len, m4_option);
2311     cmd_len = strlen(m4_cmdline);
2312   }
2313   sprintf(m4_cmdline + cmd_len, " < %s", cp);
2314
2315   if (PrintErrorMessages)
2316     fprintf(stderr, "\n%s: %s\n", ProgramName, m4_cmdline);
2317
2318   if (colon) *colon = ':';
2319   if (!server_is_client) free(server);
2320   free(client);
2321
2322   return (m4_cmdline);
2323 }
2324 #endif /* NO_M4_SUPPORT */
2325