gram.y revision f66df612
13e747e6dSmrg/*****************************************************************************/
23e747e6dSmrg/*
33e747e6dSmrg
43e747e6dSmrgCopyright 1989, 1998  The Open Group
53e747e6dSmrg
63e747e6dSmrgPermission to use, copy, modify, distribute, and sell this software and its
73e747e6dSmrgdocumentation for any purpose is hereby granted without fee, provided that
83e747e6dSmrgthe above copyright notice appear in all copies and that both that
93e747e6dSmrgcopyright notice and this permission notice appear in supporting
103e747e6dSmrgdocumentation.
113e747e6dSmrg
123e747e6dSmrgThe above copyright notice and this permission notice shall be included in
133e747e6dSmrgall copies or substantial portions of the Software.
143e747e6dSmrg
153e747e6dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
163e747e6dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
173e747e6dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
183e747e6dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
193e747e6dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
203e747e6dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
213e747e6dSmrg
223e747e6dSmrgExcept as contained in this notice, the name of The Open Group shall not be
233e747e6dSmrgused in advertising or otherwise to promote the sale, use or other dealings
243e747e6dSmrgin this Software without prior written authorization from The Open Group.
253e747e6dSmrg
263e747e6dSmrg*/
273e747e6dSmrg/**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
283e747e6dSmrg/**                          Salt Lake City, Utah                           **/
293e747e6dSmrg/**                        Cambridge, Massachusetts                         **/
303e747e6dSmrg/**                                                                         **/
313e747e6dSmrg/**                           All Rights Reserved                           **/
323e747e6dSmrg/**                                                                         **/
333e747e6dSmrg/**    Permission to use, copy, modify, and distribute this software and    **/
343e747e6dSmrg/**    its documentation  for  any  purpose  and  without  fee is hereby    **/
353e747e6dSmrg/**    granted, provided that the above copyright notice appear  in  all    **/
363e747e6dSmrg/**    copies and that both  that  copyright  notice  and  this  permis-    **/
373e747e6dSmrg/**    sion  notice appear in supporting  documentation,  and  that  the    **/
383e747e6dSmrg/**    name of Evans & Sutherland not be used in advertising    **/
393e747e6dSmrg/**    in publicity pertaining to distribution of the  software  without    **/
403e747e6dSmrg/**    specific, written prior permission.                                  **/
413e747e6dSmrg/**                                                                         **/
423e747e6dSmrg/**    EVANS & SUTHERLAND DISCLAIMs ALL WARRANTIES WITH REGARD    **/
433e747e6dSmrg/**    TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES  OF  MERCHANT-    **/
443e747e6dSmrg/**    ABILITY  AND  FITNESS,  IN  NO  EVENT SHALL EVANS & SUTHERLAND    **/
453e747e6dSmrg/**    BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL  DAM-    **/
463e747e6dSmrg/**    AGES OR  ANY DAMAGES WHATSOEVER  RESULTING FROM LOSS OF USE, DATA    **/
473e747e6dSmrg/**    OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER    **/
483e747e6dSmrg/**    TORTIOUS ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE    **/
493e747e6dSmrg/**    OR PERFORMANCE OF THIS SOFTWARE.                                     **/
503e747e6dSmrg/*****************************************************************************/
513e747e6dSmrg
523e747e6dSmrg
533e747e6dSmrg/***********************************************************************
543e747e6dSmrg *
553e747e6dSmrg * $Xorg: gram.y,v 1.4 2001/02/09 02:05:36 xorgcvs Exp $
563e747e6dSmrg *
57f66df612Smrg * .twmrc command grammar
583e747e6dSmrg *
59f66df612Smrg * 07-Jan-86 Thomas E. LaStrange        File created
603e747e6dSmrg * 11-Nov-90 Dave Sternlicht            Adding SaveColors
613e747e6dSmrg * 10-Oct-90 David M. Sternlicht        Storing saved colors on root
623e747e6dSmrg *
633e747e6dSmrg * $XFree86: xc/programs/twm/gram.y,v 3.8 2002/10/16 21:33:03 tsi Exp $
643e747e6dSmrg *
653e747e6dSmrg ***********************************************************************/
663e747e6dSmrg
673e747e6dSmrg%{
68f66df612Smrg
693e747e6dSmrg#include <stdio.h>
703e747e6dSmrg#include <ctype.h>
713e747e6dSmrg#include "twm.h"
723e747e6dSmrg#include "menus.h"
733e747e6dSmrg#include "list.h"
743e747e6dSmrg#include "util.h"
753e747e6dSmrg#include "screen.h"
763e747e6dSmrg#include "parse.h"
773e747e6dSmrg#include "add_window.h"
783e747e6dSmrg#include "icons.h"
793e747e6dSmrg#include <X11/Xos.h>
803e747e6dSmrg#include <X11/Xmu/CharSet.h>
813e747e6dSmrg
82f66df612Smrgstatic char empty[1];
83f66df612Smrgstatic char *Action = empty;
84f66df612Smrgstatic char *Name = empty;
85f66df612Smrgstatic MenuRoot *root, *pull = NULL;
863e747e6dSmrg
87f66df612Smrgstatic MenuRoot *GetRoot(const char *name, const char *fore, const char *back);
88f66df612Smrgstatic void GotButton(int butt, int func);
89f66df612Smrgstatic void GotKey(char *key, int func);
90f66df612Smrgstatic void GotTitleButton(char *bitmapname, int func, Bool rightside);
91f66df612Smrgstatic Bool CheckWarpScreenArg(char *s);
92f66df612Smrgstatic Bool CheckWarpRingArg(char *s);
93f66df612Smrgstatic Bool CheckColormapArg(char *s);
94f66df612Smrgstatic void RemoveDQuote(char *str);
953e747e6dSmrg
963e747e6dSmrgstatic char *ptr;
973e747e6dSmrgstatic name_list **list;
983e747e6dSmrgstatic int cont = 0;
993e747e6dSmrgstatic int color;
1003e747e6dSmrgint mods = 0;
1013e747e6dSmrgunsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask);
1023e747e6dSmrg
1033e747e6dSmrgextern int yylineno;
104f66df612Smrgstatic void yyerror(const char *s);
105c2535118Smrg
1063e747e6dSmrg%}
1073e747e6dSmrg
1083e747e6dSmrg%union
1093e747e6dSmrg{
1103e747e6dSmrg    int num;
1113e747e6dSmrg    char *ptr;
1123e747e6dSmrg};
1133e747e6dSmrg
1143e747e6dSmrg%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
115c2535118Smrg%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
1163e747e6dSmrg%token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS
1173e747e6dSmrg%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE GRAYSCALE
118c2535118Smrg%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING
119c2535118Smrg%token <num> NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION
120c2535118Smrg%token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
1213e747e6dSmrg%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
1223e747e6dSmrg%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
123c2535118Smrg%token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
124c2535118Smrg%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
1253e747e6dSmrg%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
1263e747e6dSmrg%token <num> NO_STACKMODE
127c2535118Smrg%token <ptr> STRING
128f66df612Smrg%token <num> error
1293e747e6dSmrg
1303e747e6dSmrg%type <ptr> string
1313e747e6dSmrg%type <num> pixmap_list cursor_list color_list save_color_list stmt
1323e747e6dSmrg%type <num> win_color_list iconm_list win_list icon_list function menu
133f66df612Smrg%type <num> noarg sarg narg squeeze color_entry
1343e747e6dSmrg%type <num> action button number signed_number full fullkey
1353e747e6dSmrg
136c2535118Smrg%start twmrc
1373e747e6dSmrg
1383e747e6dSmrg%%
139f66df612Smrgtwmrc           : stmts
140f66df612Smrg                ;
141f66df612Smrg
142f66df612Smrgstmts           : /* Empty */
143f66df612Smrg                | stmts stmt
144f66df612Smrg                ;
145f66df612Smrg
146f66df612Smrgstmt            : error
147f66df612Smrg                | noarg
148f66df612Smrg                | sarg
149f66df612Smrg                | narg
150f66df612Smrg                | squeeze
151f66df612Smrg                | ICON_REGION string DKEYWORD DKEYWORD number number
152f66df612Smrg                                        { AddIconRegion($2, $3, $4, $5, $6); }
153f66df612Smrg                | ICONMGR_GEOMETRY string number        { if (Scr->FirstTime)
154f66df612Smrg                                                  {
155f66df612Smrg                                                    Scr->iconmgr.geometry=$2;
156f66df612Smrg                                                    Scr->iconmgr.columns=$3;
157f66df612Smrg                                                  }
158f66df612Smrg                                                }
159f66df612Smrg                | ICONMGR_GEOMETRY string       { if (Scr->FirstTime)
160f66df612Smrg                                                    Scr->iconmgr.geometry = $2;
161f66df612Smrg                                                }
162f66df612Smrg                | ZOOM number           { if (Scr->FirstTime)
163f66df612Smrg                                          {
164f66df612Smrg                                                Scr->DoZoom = TRUE;
165f66df612Smrg                                                Scr->ZoomCount = (short)$2;
166f66df612Smrg                                          }
167f66df612Smrg                                        }
168f66df612Smrg                | ZOOM                  { if (Scr->FirstTime)
169f66df612Smrg                                                Scr->DoZoom = TRUE; }
170f66df612Smrg                | PIXMAPS pixmap_list   {}
171f66df612Smrg                | CURSORS cursor_list   {}
172f66df612Smrg                | ICONIFY_BY_UNMAPPING  { list = &Scr->IconifyByUn; }
173f66df612Smrg                  win_list
174f66df612Smrg                | ICONIFY_BY_UNMAPPING  { if (Scr->FirstTime)
175f66df612Smrg                    Scr->IconifyByUnmapping = TRUE; }
176f66df612Smrg                | LEFT_TITLEBUTTON string EQUALS action {
177f66df612Smrg                                          GotTitleButton ($2, $4, False);
178f66df612Smrg                                        }
179f66df612Smrg                | RIGHT_TITLEBUTTON string EQUALS action {
180f66df612Smrg                                          GotTitleButton ($2, $4, True);
181f66df612Smrg                                        }
182f66df612Smrg                | button string         { root = GetRoot($2, NULLSTR, NULLSTR);
183f66df612Smrg                                          Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
184f66df612Smrg                                          Scr->Mouse[$1][C_ROOT][0].menu = root;
185f66df612Smrg                                        }
186f66df612Smrg                | button action         { Scr->Mouse[$1][C_ROOT][0].func = $2;
187f66df612Smrg                                          if ($2 == F_MENU)
188f66df612Smrg                                          {
189f66df612Smrg                                            pull->prev = NULL;
190f66df612Smrg                                            Scr->Mouse[$1][C_ROOT][0].menu = pull;
191f66df612Smrg                                          }
192f66df612Smrg                                          else
193f66df612Smrg                                          {
194f66df612Smrg                                            root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
195f66df612Smrg                                            Scr->Mouse[$1][C_ROOT][0].item =
196f66df612Smrg                                                AddToMenu(root,"x",Action,
197f66df612Smrg                                                          NULL,$2,NULLSTR,NULLSTR);
198f66df612Smrg                                          }
199f66df612Smrg                                          Action = empty;
200f66df612Smrg                                          pull = NULL;
201f66df612Smrg                                        }
202f66df612Smrg                | string fullkey        { GotKey($1, $2); }
203f66df612Smrg                | button full           { GotButton($1, $2); }
204f66df612Smrg                | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
205f66df612Smrg                  win_list
206f66df612Smrg                | ICONMGR_NOSHOW        { list = &Scr->IconMgrNoShow; }
207f66df612Smrg                  win_list
208f66df612Smrg                | ICONMGR_NOSHOW        { Scr->IconManagerDontShow = TRUE; }
209f66df612Smrg                | ICONMGRS              { list = &Scr->IconMgrs; }
210f66df612Smrg                  iconm_list
211f66df612Smrg                | ICONMGR_SHOW          { list = &Scr->IconMgrShow; }
212f66df612Smrg                  win_list
213f66df612Smrg                | NO_TITLE_HILITE       { list = &Scr->NoTitleHighlight; }
214f66df612Smrg                  win_list
215f66df612Smrg                | NO_TITLE_HILITE       { if (Scr->FirstTime)
216f66df612Smrg                                                Scr->TitleHighlight = FALSE; }
217f66df612Smrg                | NO_HILITE             { list = &Scr->NoHighlight; }
218f66df612Smrg                  win_list
219f66df612Smrg                | NO_HILITE             { if (Scr->FirstTime)
220f66df612Smrg                                                Scr->Highlight = FALSE; }
221f66df612Smrg                | NO_STACKMODE          { list = &Scr->NoStackModeL; }
222f66df612Smrg                  win_list
223f66df612Smrg                | NO_STACKMODE          { if (Scr->FirstTime)
224f66df612Smrg                                                Scr->StackMode = FALSE; }
225f66df612Smrg                | NO_TITLE              { list = &Scr->NoTitle; }
226f66df612Smrg                  win_list
227f66df612Smrg                | NO_TITLE              { if (Scr->FirstTime)
228f66df612Smrg                                                Scr->NoTitlebar = TRUE; }
229f66df612Smrg                | MAKE_TITLE            { list = &Scr->MakeTitle; }
230f66df612Smrg                  win_list
231f66df612Smrg                | START_ICONIFIED       { list = &Scr->StartIconified; }
232f66df612Smrg                  win_list
233f66df612Smrg                | AUTO_RAISE            { list = &Scr->AutoRaise; }
234f66df612Smrg                  win_list
235f66df612Smrg                | MENU string LP string COLON string RP {
236f66df612Smrg                                        root = GetRoot($2, $4, $6); }
237f66df612Smrg                  menu                  { root->real_menu = TRUE;}
238f66df612Smrg                | MENU string           { root = GetRoot($2, NULLSTR, NULLSTR); }
239f66df612Smrg                  menu                  { root->real_menu = TRUE; }
240f66df612Smrg                | FUNCTION string       { root = GetRoot($2, NULLSTR, NULLSTR); }
241f66df612Smrg                  function
242f66df612Smrg                | ICONS                 { list = &Scr->IconNames; }
243f66df612Smrg                  icon_list
244f66df612Smrg                | COLOR                 { color = COLOR; }
245f66df612Smrg                  color_list
246f66df612Smrg                | GRAYSCALE             { color = GRAYSCALE; }
247f66df612Smrg                  color_list
248f66df612Smrg                | SAVECOLOR
2493e747e6dSmrg                  save_color_list
250f66df612Smrg                | MONOCHROME            { color = MONOCHROME; }
251f66df612Smrg                  color_list
252f66df612Smrg                | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
253f66df612Smrg                                          if ($2 == F_MENU)
254f66df612Smrg                                          {
255f66df612Smrg                                            pull->prev = NULL;
256f66df612Smrg                                            Scr->DefaultFunction.menu = pull;
257f66df612Smrg                                          }
258f66df612Smrg                                          else
259f66df612Smrg                                          {
260f66df612Smrg                                            root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
261f66df612Smrg                                            Scr->DefaultFunction.item =
262f66df612Smrg                                                AddToMenu(root,"x",Action,
263f66df612Smrg                                                          NULL,$2, NULLSTR, NULLSTR);
264f66df612Smrg                                          }
265f66df612Smrg                                          Action = empty;
266f66df612Smrg                                          pull = NULL;
267f66df612Smrg                                        }
268f66df612Smrg                | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
269f66df612Smrg                                           root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
270f66df612Smrg                                           Scr->WindowFunction.item =
271f66df612Smrg                                                AddToMenu(root,"x",Action,
272f66df612Smrg                                                          NULL,$2, NULLSTR, NULLSTR);
273f66df612Smrg                                           Action = empty;
274f66df612Smrg                                           pull = NULL;
275f66df612Smrg                                        }
276f66df612Smrg                | WARP_CURSOR           { list = &Scr->WarpCursorL; }
277f66df612Smrg                  win_list
278f66df612Smrg                | WARP_CURSOR           { if (Scr->FirstTime)
279f66df612Smrg                                            Scr->WarpCursor = TRUE; }
280f66df612Smrg                | WINDOW_RING           { list = &Scr->WindowRingL; }
281f66df612Smrg                  win_list
282f66df612Smrg                ;
283f66df612Smrg
284f66df612Smrg
285f66df612Smrgnoarg           : KEYWORD               { if (!do_single_keyword ($1)) {
286f66df612Smrg                                            parseWarning (
287f66df612Smrg                                                 "unknown singleton keyword %d",
288f66df612Smrg                                                 $1);
289f66df612Smrg                                            ParseError = 1;
290f66df612Smrg                                          }
291f66df612Smrg                                        }
292f66df612Smrg                ;
293f66df612Smrg
294f66df612Smrgsarg            : SKEYWORD string       { if (!do_string_keyword ($1, $2)) {
295f66df612Smrg                                            parseWarning (
296f66df612Smrg                                                 "unknown string keyword %d (value \"%s\")",
297f66df612Smrg                                                 $1, $2);
298f66df612Smrg                                            ParseError = 1;
299f66df612Smrg                                          }
300f66df612Smrg                                        }
301f66df612Smrg                ;
302f66df612Smrg
303f66df612Smrgnarg            : NKEYWORD number       { if (!do_number_keyword ($1, $2)) {
304f66df612Smrg                                            parseWarning (
305f66df612Smrg                                                 "unknown numeric keyword %d (value %d)",
306f66df612Smrg                                                 $1, $2);
307f66df612Smrg                                            ParseError = 1;
308f66df612Smrg                                          }
309f66df612Smrg                                        }
310f66df612Smrg                ;
311f66df612Smrg
312f66df612Smrg
313f66df612Smrg
314f66df612Smrgfull            : EQUALS keys COLON contexts COLON action  { $$ = $6; }
315f66df612Smrg                ;
316f66df612Smrg
317f66df612Smrgfullkey         : EQUALS keys COLON contextkeys COLON action  { $$ = $6; }
318f66df612Smrg                ;
319f66df612Smrg
320f66df612Smrgkeys            : /* Empty */
321f66df612Smrg                | keys key
322f66df612Smrg                ;
323f66df612Smrg
324f66df612Smrgkey             : META                  { mods |= Mod1Mask; }
325f66df612Smrg                | SHIFT                 { mods |= ShiftMask; }
326f66df612Smrg                | LOCK                  { mods |= LockMask; }
327f66df612Smrg                | CONTROL               { mods |= ControlMask; }
328f66df612Smrg                | META number           { if ($2 < 1 || $2 > 5) {
329f66df612Smrg                                             parseWarning (
330f66df612Smrg                                                  "bad modifier number (%d), must be 1-5",
331f66df612Smrg                                                  $2);
332f66df612Smrg                                             ParseError = 1;
333f66df612Smrg                                          } else {
334f66df612Smrg                                             mods |= (Mod1Mask << ($2 - 1));
335f66df612Smrg                                          }
336f66df612Smrg                                        }
337f66df612Smrg                | OR                    { }
338f66df612Smrg                ;
339f66df612Smrg
340f66df612Smrgcontexts        : /* Empty */
341f66df612Smrg                | contexts context
342f66df612Smrg                ;
343f66df612Smrg
344f66df612Smrgcontext         : WINDOW                { cont |= C_WINDOW_BIT; }
345f66df612Smrg                | TITLE                 { cont |= C_TITLE_BIT; }
346f66df612Smrg                | ICON                  { cont |= C_ICON_BIT; }
347f66df612Smrg                | ROOT                  { cont |= C_ROOT_BIT; }
348f66df612Smrg                | FRAME                 { cont |= C_FRAME_BIT; }
349f66df612Smrg                | ICONMGR               { cont |= C_ICONMGR_BIT; }
350f66df612Smrg                | META                  { cont |= C_ICONMGR_BIT; }
351f66df612Smrg                | ALL                   { cont |= C_ALL_BITS; }
352f66df612Smrg                | OR                    {  }
353f66df612Smrg                ;
354f66df612Smrg
355f66df612Smrgcontextkeys     : /* Empty */
356f66df612Smrg                | contextkeys contextkey
357f66df612Smrg                ;
358f66df612Smrg
359f66df612Smrgcontextkey      : WINDOW                { cont |= C_WINDOW_BIT; }
360f66df612Smrg                | TITLE                 { cont |= C_TITLE_BIT; }
361f66df612Smrg                | ICON                  { cont |= C_ICON_BIT; }
362f66df612Smrg                | ROOT                  { cont |= C_ROOT_BIT; }
363f66df612Smrg                | FRAME                 { cont |= C_FRAME_BIT; }
364f66df612Smrg                | ICONMGR               { cont |= C_ICONMGR_BIT; }
365f66df612Smrg                | META                  { cont |= C_ICONMGR_BIT; }
366f66df612Smrg                | ALL                   { cont |= C_ALL_BITS; }
367f66df612Smrg                | OR                    { }
368f66df612Smrg                | string                { Name = $1; cont |= C_NAME_BIT; }
369f66df612Smrg                ;
370f66df612Smrg
371f66df612Smrg
372f66df612Smrgpixmap_list     : LB pixmap_entries RB
373f66df612Smrg                ;
374f66df612Smrg
375f66df612Smrgpixmap_entries  : /* Empty */
376f66df612Smrg                | pixmap_entries pixmap_entry
377f66df612Smrg                ;
378f66df612Smrg
379f66df612Smrgpixmap_entry    : TITLE_HILITE string { SetHighlightPixmap ($2); }
380f66df612Smrg                ;
381f66df612Smrg
382f66df612Smrg
383f66df612Smrgcursor_list     : LB cursor_entries RB
384f66df612Smrg                ;
385f66df612Smrg
386f66df612Smrgcursor_entries  : /* Empty */
387f66df612Smrg                | cursor_entries cursor_entry
388f66df612Smrg                ;
389f66df612Smrg
390f66df612Smrgcursor_entry    : FRAME string string {
391f66df612Smrg                        NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
392f66df612Smrg                | FRAME string  {
393f66df612Smrg                        NewFontCursor(&Scr->FrameCursor, $2); }
394f66df612Smrg                | TITLE string string {
395f66df612Smrg                        NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
396f66df612Smrg                | TITLE string {
397f66df612Smrg                        NewFontCursor(&Scr->TitleCursor, $2); }
398f66df612Smrg                | ICON string string {
399f66df612Smrg                        NewBitmapCursor(&Scr->IconCursor, $2, $3); }
400f66df612Smrg                | ICON string {
401f66df612Smrg                        NewFontCursor(&Scr->IconCursor, $2); }
402f66df612Smrg                | ICONMGR string string {
403f66df612Smrg                        NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
404f66df612Smrg                | ICONMGR string {
405f66df612Smrg                        NewFontCursor(&Scr->IconMgrCursor, $2); }
406f66df612Smrg                | BUTTON string string {
407f66df612Smrg                        NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
408f66df612Smrg                | BUTTON string {
409f66df612Smrg                        NewFontCursor(&Scr->ButtonCursor, $2); }
410f66df612Smrg                | MOVE string string {
411f66df612Smrg                        NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
412f66df612Smrg                | MOVE string {
413f66df612Smrg                        NewFontCursor(&Scr->MoveCursor, $2); }
414f66df612Smrg                | RESIZE string string {
415f66df612Smrg                        NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
416f66df612Smrg                | RESIZE string {
417f66df612Smrg                        NewFontCursor(&Scr->ResizeCursor, $2); }
418f66df612Smrg                | WAIT string string {
419f66df612Smrg                        NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
420f66df612Smrg                | WAIT string {
421f66df612Smrg                        NewFontCursor(&Scr->WaitCursor, $2); }
422f66df612Smrg                | MENU string string {
423f66df612Smrg                        NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
424f66df612Smrg                | MENU string {
425f66df612Smrg                        NewFontCursor(&Scr->MenuCursor, $2); }
426f66df612Smrg                | SELECT string string {
427f66df612Smrg                        NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
428f66df612Smrg                | SELECT string {
429f66df612Smrg                        NewFontCursor(&Scr->SelectCursor, $2); }
430f66df612Smrg                | KILL string string {
431f66df612Smrg                        NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
432f66df612Smrg                | KILL string {
433f66df612Smrg                        NewFontCursor(&Scr->DestroyCursor, $2); }
434f66df612Smrg                ;
435f66df612Smrg
436f66df612Smrgcolor_list      : LB color_entries RB
437f66df612Smrg                ;
438f66df612Smrg
439f66df612Smrg
440f66df612Smrgcolor_entries   : /* Empty */
441f66df612Smrg                | color_entries color_entry
442f66df612Smrg                ;
443f66df612Smrg
444f66df612Smrgcolor_entry     : CLKEYWORD string      { if (!do_colorlist_keyword ($1, color,
445f66df612Smrg                                                                     $2)) {
446f66df612Smrg                                            parseWarning (
447f66df612Smrg                                                 "unhandled list color keyword %d (string \"%s\")",
448f66df612Smrg                                                 $1, $2);
449f66df612Smrg                                            ParseError = 1;
450f66df612Smrg                                          }
451f66df612Smrg                                        }
452f66df612Smrg                | CLKEYWORD string      { list = do_colorlist_keyword($1,color,
453f66df612Smrg                                                                      $2);
454f66df612Smrg                                          if (!list) {
455f66df612Smrg                                            parseWarning (
456f66df612Smrg                                                 "unhandled color list keyword %d (string \"%s\")",
457f66df612Smrg                                                 $1, $2);
458f66df612Smrg                                            ParseError = 1;
459f66df612Smrg                                          }
460f66df612Smrg                                        }
461f66df612Smrg                  win_color_list        { /* No action */; }
462f66df612Smrg                | CKEYWORD string       { if (!do_color_keyword ($1, color,
463f66df612Smrg                                                                 $2)) {
464f66df612Smrg                                            parseWarning (
465f66df612Smrg                                                 "unhandled color keyword %d (string \"%s\")",
466f66df612Smrg                                                 $1, $2);
467f66df612Smrg                                            ParseError = 1;
468f66df612Smrg                                          }
469f66df612Smrg                                        }
470f66df612Smrg                ;
4713e747e6dSmrg
472c2535118Smrgsave_color_list : LB s_color_entries RB
4733e747e6dSmrg                ;
4743e747e6dSmrg
4753e747e6dSmrgs_color_entries : /* Empty */
476c2535118Smrg                | s_color_entries s_color_entry
4773e747e6dSmrg                ;
4783e747e6dSmrg
4793e747e6dSmrgs_color_entry   : string            { do_string_savecolor(color, $1); }
4803e747e6dSmrg                | CLKEYWORD         { do_var_savecolor($1); }
4813e747e6dSmrg                ;
4823e747e6dSmrg
483f66df612Smrgwin_color_list  : LB win_color_entries RB
484f66df612Smrg                ;
485f66df612Smrg
486f66df612Smrgwin_color_entries       : /* Empty */
487f66df612Smrg                | win_color_entries win_color_entry
488f66df612Smrg                ;
489f66df612Smrg
490f66df612Smrgwin_color_entry : string string         { if (Scr->FirstTime &&
491f66df612Smrg                                              color == Scr->Monochrome)
492f66df612Smrg                                            AddToList(list, $1, $2); }
493f66df612Smrg                ;
494f66df612Smrg
495f66df612Smrgsqueeze         : SQUEEZE_TITLE {
496f66df612Smrg                                    if (HasShape) Scr->SqueezeTitle = TRUE;
497f66df612Smrg                                }
498f66df612Smrg                | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL;
499f66df612Smrg                                  if (HasShape && Scr->SqueezeTitle == -1)
500f66df612Smrg                                    Scr->SqueezeTitle = TRUE;
501f66df612Smrg                                }
502f66df612Smrg                  LB win_sqz_entries RB
503f66df612Smrg                | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
504f66df612Smrg                | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
505f66df612Smrg                  win_list
506f66df612Smrg                ;
507f66df612Smrg
508f66df612Smrgwin_sqz_entries : /* Empty */
509f66df612Smrg                | win_sqz_entries string JKEYWORD signed_number number  {
510f66df612Smrg                                if (Scr->FirstTime) {
511f66df612Smrg                                   do_squeeze_entry (list, $2, $3, $4, $5);
512f66df612Smrg                                }
513f66df612Smrg                        }
514f66df612Smrg                ;
515f66df612Smrg
516f66df612Smrg
517f66df612Smrgiconm_list      : LB iconm_entries RB
518f66df612Smrg                ;
519f66df612Smrg
520f66df612Smrgiconm_entries   : /* Empty */
521f66df612Smrg                | iconm_entries iconm_entry
522f66df612Smrg                ;
523f66df612Smrg
524f66df612Smrgiconm_entry     : string string number  { if (Scr->FirstTime)
525f66df612Smrg                                            AddToList(list, $1, (char *)
526f66df612Smrg                                                AllocateIconManager($1, NULLSTR,
527f66df612Smrg                                                        $2,$3));
528f66df612Smrg                                        }
529f66df612Smrg                | string string string number
530f66df612Smrg                                        { if (Scr->FirstTime)
531f66df612Smrg                                            AddToList(list, $1, (char *)
532f66df612Smrg                                                AllocateIconManager($1,$2,
533f66df612Smrg                                                $3, $4));
534f66df612Smrg                                        }
535f66df612Smrg                ;
536f66df612Smrg
537f66df612Smrgwin_list        : LB win_entries RB
538f66df612Smrg                ;
539f66df612Smrg
540f66df612Smrgwin_entries     : /* Empty */
541f66df612Smrg                | win_entries win_entry
542f66df612Smrg                ;
543f66df612Smrg
544f66df612Smrgwin_entry       : string                { if (Scr->FirstTime)
545f66df612Smrg                                            AddToList(list, $1, 0);
546f66df612Smrg                                        }
547f66df612Smrg                ;
548f66df612Smrg
549f66df612Smrgicon_list       : LB icon_entries RB
550f66df612Smrg                ;
551f66df612Smrg
552f66df612Smrgicon_entries    : /* Empty */
553f66df612Smrg                | icon_entries icon_entry
554f66df612Smrg                ;
555f66df612Smrg
556f66df612Smrgicon_entry      : string string         { if (Scr->FirstTime) AddToList(list, $1, $2); }
557f66df612Smrg                ;
558f66df612Smrg
559f66df612Smrgfunction        : LB function_entries RB
560f66df612Smrg                ;
5613e747e6dSmrg
5623e747e6dSmrgfunction_entries: /* Empty */
563f66df612Smrg                | function_entries function_entry
564f66df612Smrg                ;
565f66df612Smrg
566f66df612Smrgfunction_entry  : action                { AddToMenu(root, empty, Action, NULL, $1,
567f66df612Smrg                                                NULLSTR, NULLSTR);
568f66df612Smrg                                          Action = empty;
569f66df612Smrg                                        }
570f66df612Smrg                ;
571f66df612Smrg
572f66df612Smrgmenu            : LB menu_entries RB
573f66df612Smrg                ;
574f66df612Smrg
575f66df612Smrgmenu_entries    : /* Empty */
576f66df612Smrg                | menu_entries menu_entry
577f66df612Smrg                ;
578f66df612Smrg
579f66df612Smrgmenu_entry      : string action         { AddToMenu(root, $1, Action, pull, $2,
580f66df612Smrg                                                NULLSTR, NULLSTR);
581f66df612Smrg                                          Action = empty;
582f66df612Smrg                                          pull = NULL;
583f66df612Smrg                                        }
584f66df612Smrg                | string LP string COLON string RP action {
585f66df612Smrg                                          AddToMenu(root, $1, Action, pull, $7,
586f66df612Smrg                                                $3, $5);
587f66df612Smrg                                          Action = empty;
588f66df612Smrg                                          pull = NULL;
589f66df612Smrg                                        }
590f66df612Smrg                ;
591f66df612Smrg
592f66df612Smrgaction          : FKEYWORD      { $$ = $1; }
593f66df612Smrg                | FSKEYWORD string {
594f66df612Smrg                                $$ = $1;
595f66df612Smrg                                Action = $2;
596f66df612Smrg                                switch ($1) {
597f66df612Smrg                                  case F_MENU:
598f66df612Smrg                                    pull = GetRoot ($2, NULLSTR,NULLSTR);
599f66df612Smrg                                    pull->prev = root;
600f66df612Smrg                                    break;
601f66df612Smrg                                  case F_WARPRING:
602f66df612Smrg                                    if (!CheckWarpRingArg (Action)) {
603f66df612Smrg                                        parseWarning (
604f66df612Smrg                                             "ignoring invalid f.warptoring argument \"%s\"",
605f66df612Smrg                                             Action);
606f66df612Smrg                                        $$ = F_NOP;
607f66df612Smrg                                    }
608f66df612Smrg                                    break;
609f66df612Smrg                                  case F_WARPTOSCREEN:
610f66df612Smrg                                    if (!CheckWarpScreenArg (Action)) {
611f66df612Smrg                                        parseWarning (
612f66df612Smrg                                             "ignoring invalid f.warptoscreen argument \"%s\"",
613f66df612Smrg                                             Action);
614f66df612Smrg                                        $$ = F_NOP;
615f66df612Smrg                                    }
616f66df612Smrg                                    break;
617f66df612Smrg                                  case F_COLORMAP:
618f66df612Smrg                                    if (CheckColormapArg (Action)) {
619f66df612Smrg                                        $$ = F_COLORMAP;
620f66df612Smrg                                    } else {
621f66df612Smrg                                        parseWarning (
622f66df612Smrg                                             "ignoring invalid f.colormap argument \"%s\"",
623f66df612Smrg                                             Action);
624f66df612Smrg                                        $$ = F_NOP;
625f66df612Smrg                                    }
626f66df612Smrg                                    break;
627f66df612Smrg                                } /* end switch */
628f66df612Smrg                                   }
629f66df612Smrg                ;
630f66df612Smrg
631f66df612Smrg
632f66df612Smrgsigned_number   : number                { $$ = $1; }
633f66df612Smrg                | PLUS number           { $$ = $2; }
634f66df612Smrg                | MINUS number          { $$ = -($2); }
635f66df612Smrg                ;
636f66df612Smrg
637f66df612Smrgbutton          : BUTTON number         { $$ = $2;
638f66df612Smrg                                          if ($2 == 0)
639f66df612Smrg                                                yyerror("bad button 0");
640f66df612Smrg
641f66df612Smrg                                          if ($2 > MAX_BUTTONS)
642f66df612Smrg                                          {
643f66df612Smrg                                                $$ = 0;
644f66df612Smrg                                                yyerror("button number too large");
645f66df612Smrg                                          }
646f66df612Smrg                                        }
647f66df612Smrg                ;
648f66df612Smrg
649f66df612Smrgstring          : STRING                { ptr = strdup($1);
650f66df612Smrg                                          RemoveDQuote(ptr);
651f66df612Smrg                                          $$ = ptr;
652f66df612Smrg                                        }
653f66df612Smrg                ;
654f66df612Smrgnumber          : NUMBER                { $$ = $1; }
655f66df612Smrg                ;
6563e747e6dSmrg
6573e747e6dSmrg%%
658f66df612Smrg
659c2535118Smrgstatic void
660c2535118Smrgyyerror(const char *s)
6613e747e6dSmrg{
662f66df612Smrg    parseWarning("error in input file:  %s", s ? s : "");
6633e747e6dSmrg    ParseError = 1;
6643e747e6dSmrg}
6653e747e6dSmrg
666c2535118Smrgstatic void
6673e747e6dSmrgRemoveDQuote(char *str)
6683e747e6dSmrg{
6693e747e6dSmrg    register char *i, *o;
6703e747e6dSmrg    register int n;
6713e747e6dSmrg    register int count;
6723e747e6dSmrg
673f66df612Smrg    for (i = str + 1, o = str; *i && *i != '\"'; o++) {
674f66df612Smrg        if (*i == '\\') {
675f66df612Smrg            switch (*++i) {
676f66df612Smrg            case 'n':
677f66df612Smrg                *o = '\n';
678f66df612Smrg                i++;
679f66df612Smrg                break;
680f66df612Smrg            case 'b':
681f66df612Smrg                *o = '\b';
682f66df612Smrg                i++;
683f66df612Smrg                break;
684f66df612Smrg            case 'r':
685f66df612Smrg                *o = '\r';
686f66df612Smrg                i++;
687f66df612Smrg                break;
688f66df612Smrg            case 't':
689f66df612Smrg                *o = '\t';
690f66df612Smrg                i++;
691f66df612Smrg                break;
692f66df612Smrg            case 'f':
693f66df612Smrg                *o = '\f';
694f66df612Smrg                i++;
695f66df612Smrg                break;
696f66df612Smrg            case '0':
697f66df612Smrg                if (*++i == 'x')
698f66df612Smrg                    goto hex;
699f66df612Smrg                else
700f66df612Smrg                    --i;
701f66df612Smrg                /* FALLTHRU */
702f66df612Smrg            case '1':
703f66df612Smrg            case '2':
704f66df612Smrg            case '3':
705f66df612Smrg            case '4':
706f66df612Smrg            case '5':
707f66df612Smrg            case '6':
708f66df612Smrg            case '7':
709f66df612Smrg                n = 0;
710f66df612Smrg                count = 0;
711f66df612Smrg                while (*i >= '0' && *i <= '7' && count < 3) {
712f66df612Smrg                    n = (n << 3) + (*i++ - '0');
713f66df612Smrg                    count++;
714f66df612Smrg                }
715f66df612Smrg                *o = (char) n;
716f66df612Smrg                break;
717f66df612Smrg              hex:
718f66df612Smrg            case 'x':
719f66df612Smrg                n = 0;
720f66df612Smrg                count = 0;
721f66df612Smrg                while (i++, count++ < 2) {
722f66df612Smrg                    if (*i >= '0' && *i <= '9')
723f66df612Smrg                        n = (n << 4) + (*i - '0');
724f66df612Smrg                    else if (*i >= 'a' && *i <= 'f')
725f66df612Smrg                        n = (n << 4) + (*i - 'a') + 10;
726f66df612Smrg                    else if (*i >= 'A' && *i <= 'F')
727f66df612Smrg                        n = (n << 4) + (*i - 'A') + 10;
728f66df612Smrg                    else
729f66df612Smrg                        break;
730f66df612Smrg                }
731f66df612Smrg                *o = (char) n;
732f66df612Smrg                break;
733f66df612Smrg            case '\n':
734f66df612Smrg                i++;            /* punt */
735f66df612Smrg                o--;            /* to account for o++ at end of loop */
736f66df612Smrg                break;
737f66df612Smrg            case '\"':
738f66df612Smrg            case '\'':
739f66df612Smrg            case '\\':
740f66df612Smrg            default:
741f66df612Smrg                *o = *i++;
742f66df612Smrg                break;
743f66df612Smrg            }
744f66df612Smrg        }
745f66df612Smrg        else
746f66df612Smrg            *o = *i++;
7473e747e6dSmrg    }
7483e747e6dSmrg    *o = '\0';
7493e747e6dSmrg}
7503e747e6dSmrg
751f66df612Smrgstatic MenuRoot *
752f66df612SmrgGetRoot(const char *name, const char *fore, const char *back)
7533e747e6dSmrg{
7543e747e6dSmrg    MenuRoot *tmp;
7553e747e6dSmrg
7563e747e6dSmrg    tmp = FindMenuRoot(name);
7573e747e6dSmrg    if (tmp == NULL)
758f66df612Smrg        tmp = NewMenuRoot(name);
7593e747e6dSmrg
760f66df612Smrg    if (fore) {
761f66df612Smrg        int save;
7623e747e6dSmrg
763f66df612Smrg        save = Scr->FirstTime;
764f66df612Smrg        Scr->FirstTime = TRUE;
765f66df612Smrg        GetColor(COLOR, &tmp->hi_fore, fore);
766f66df612Smrg        GetColor(COLOR, &tmp->hi_back, back);
767f66df612Smrg        Scr->FirstTime = (short) save;
7683e747e6dSmrg    }
7693e747e6dSmrg
7703e747e6dSmrg    return tmp;
7713e747e6dSmrg}
7723e747e6dSmrg
773f66df612Smrgstatic void
774f66df612SmrgGotButton(int butt, int func)
7753e747e6dSmrg{
7763e747e6dSmrg    int i;
7773e747e6dSmrg
778f66df612Smrg    for (i = 0; i < NUM_CONTEXTS; i++) {
779f66df612Smrg        if ((cont & (1 << i)) == 0)
780f66df612Smrg            continue;
781f66df612Smrg
782f66df612Smrg        Scr->Mouse[butt][i][mods].func = func;
783f66df612Smrg        if (func == F_MENU) {
784f66df612Smrg            pull->prev = NULL;
785f66df612Smrg            Scr->Mouse[butt][i][mods].menu = pull;
786f66df612Smrg        }
787f66df612Smrg        else {
788f66df612Smrg            root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
789f66df612Smrg            Scr->Mouse[butt][i][mods].item = AddToMenu(root, "x", Action,
790f66df612Smrg                                                       NULL, func, NULLSTR, NULLSTR);
791f66df612Smrg        }
7923e747e6dSmrg    }
793f66df612Smrg    Action = empty;
7943e747e6dSmrg    pull = NULL;
7953e747e6dSmrg    cont = 0;
796f66df612Smrg    mods_used |= (unsigned) mods;
7973e747e6dSmrg    mods = 0;
7983e747e6dSmrg}
7993e747e6dSmrg
800f66df612Smrgstatic void
801f66df612SmrgGotKey(char *key, int func)
8023e747e6dSmrg{
8033e747e6dSmrg    int i;
8043e747e6dSmrg
805f66df612Smrg    for (i = 0; i < NUM_CONTEXTS; i++) {
806f66df612Smrg        if ((cont & (1 << i)) == 0)
807f66df612Smrg            continue;
808f66df612Smrg        if (!AddFuncKey(key, i, mods, func, Name, Action))
809f66df612Smrg            break;
8103e747e6dSmrg    }
8113e747e6dSmrg
812f66df612Smrg    Action = empty;
8133e747e6dSmrg    pull = NULL;
8143e747e6dSmrg    cont = 0;
815f66df612Smrg    mods_used |= (unsigned) mods;
8163e747e6dSmrg    mods = 0;
8173e747e6dSmrg}
8183e747e6dSmrg
819f66df612Smrgstatic void
820f66df612SmrgGotTitleButton(char *bitmapname, int func, Bool rightside)
8213e747e6dSmrg{
822f66df612Smrg    if (!CreateTitleButton(bitmapname, func, Action, pull, rightside, True)) {
823f66df612Smrg        parseWarning("unable to create %s titlebutton \"%s\"",
824f66df612Smrg                     rightside ? "right" : "left", bitmapname);
8253e747e6dSmrg    }
826f66df612Smrg    Action = empty;
8273e747e6dSmrg    pull = NULL;
8283e747e6dSmrg}
8293e747e6dSmrg
830f66df612Smrgstatic Bool
831f66df612SmrgCheckWarpScreenArg(char *s)
8323e747e6dSmrg{
833f66df612Smrg    XmuCopyISOLatin1Lowered(s, s);
8343e747e6dSmrg
835f66df612Smrg    if (strcmp(s, WARPSCREEN_NEXT) == 0 ||
836f66df612Smrg        strcmp(s, WARPSCREEN_PREV) == 0 ||
837f66df612Smrg        strcmp(s, WARPSCREEN_BACK) == 0)
838f66df612Smrg        return True;
8393e747e6dSmrg
840f66df612Smrg    for (; *s && isascii(*s) && isdigit(*s); s++);      /* SUPPRESS 530 */
8413e747e6dSmrg    return (*s ? False : True);
8423e747e6dSmrg}
8433e747e6dSmrg
844f66df612Smrgstatic Bool
845f66df612SmrgCheckWarpRingArg(char *s)
8463e747e6dSmrg{
847f66df612Smrg    XmuCopyISOLatin1Lowered(s, s);
8483e747e6dSmrg
849f66df612Smrg    if (strcmp(s, WARPSCREEN_NEXT) == 0 ||
850f66df612Smrg        strcmp(s, WARPSCREEN_PREV) == 0)
851f66df612Smrg        return True;
8523e747e6dSmrg
8533e747e6dSmrg    return False;
8543e747e6dSmrg}
8553e747e6dSmrg
856f66df612Smrgstatic Bool
857f66df612SmrgCheckColormapArg(char *s)
8583e747e6dSmrg{
859f66df612Smrg    XmuCopyISOLatin1Lowered(s, s);
8603e747e6dSmrg
861f66df612Smrg    if (strcmp(s, COLORMAP_NEXT) == 0 ||
862f66df612Smrg        strcmp(s, COLORMAP_PREV) == 0 ||
863f66df612Smrg        strcmp(s, COLORMAP_DEFAULT) == 0)
864f66df612Smrg        return True;
8653e747e6dSmrg
8663e747e6dSmrg    return False;
8673e747e6dSmrg}
868