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
103f66df612Smrgstatic void yyerror(const char *s);
104c2535118Smrg
1053e747e6dSmrg%}
1063e747e6dSmrg
1073e747e6dSmrg%union
1083e747e6dSmrg{
1093e747e6dSmrg    int num;
1103e747e6dSmrg    char *ptr;
1113e747e6dSmrg};
1123e747e6dSmrg
1133e747e6dSmrg%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
114c2535118Smrg%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
1153e747e6dSmrg%token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS
1163e747e6dSmrg%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE GRAYSCALE
117c2535118Smrg%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING
118c2535118Smrg%token <num> NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION
119c2535118Smrg%token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
1203e747e6dSmrg%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
1213e747e6dSmrg%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
122c2535118Smrg%token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
123c2535118Smrg%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
1243e747e6dSmrg%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
1253e747e6dSmrg%token <num> NO_STACKMODE
126c2535118Smrg%token <ptr> STRING
127f66df612Smrg%token <num> error
1283e747e6dSmrg
1293e747e6dSmrg%type <ptr> string
1303e747e6dSmrg%type <num> pixmap_list cursor_list color_list save_color_list stmt
1313e747e6dSmrg%type <num> win_color_list iconm_list win_list icon_list function menu
132f66df612Smrg%type <num> noarg sarg narg squeeze color_entry
1333e747e6dSmrg%type <num> action button number signed_number full fullkey
1343e747e6dSmrg
135c2535118Smrg%start twmrc
1363e747e6dSmrg
1373e747e6dSmrg%%
138f66df612Smrgtwmrc           : stmts
139f66df612Smrg                ;
140f66df612Smrg
141f66df612Smrgstmts           : /* Empty */
142f66df612Smrg                | stmts stmt
143f66df612Smrg                ;
144f66df612Smrg
145f66df612Smrgstmt            : error
146f66df612Smrg                | noarg
147f66df612Smrg                | sarg
148f66df612Smrg                | narg
149f66df612Smrg                | squeeze
150f66df612Smrg                | ICON_REGION string DKEYWORD DKEYWORD number number
151f66df612Smrg                                        { AddIconRegion($2, $3, $4, $5, $6); }
152f66df612Smrg                | ICONMGR_GEOMETRY string number        { if (Scr->FirstTime)
153f66df612Smrg                                                  {
154f66df612Smrg                                                    Scr->iconmgr.geometry=$2;
155f66df612Smrg                                                    Scr->iconmgr.columns=$3;
156f66df612Smrg                                                  }
157f66df612Smrg                                                }
158f66df612Smrg                | ICONMGR_GEOMETRY string       { if (Scr->FirstTime)
159f66df612Smrg                                                    Scr->iconmgr.geometry = $2;
160f66df612Smrg                                                }
161f66df612Smrg                | ZOOM number           { if (Scr->FirstTime)
162f66df612Smrg                                          {
163f66df612Smrg                                                Scr->DoZoom = TRUE;
164f66df612Smrg                                                Scr->ZoomCount = (short)$2;
165f66df612Smrg                                          }
166f66df612Smrg                                        }
167f66df612Smrg                | ZOOM                  { if (Scr->FirstTime)
168f66df612Smrg                                                Scr->DoZoom = TRUE; }
169f66df612Smrg                | PIXMAPS pixmap_list   {}
170f66df612Smrg                | CURSORS cursor_list   {}
171f66df612Smrg                | ICONIFY_BY_UNMAPPING  { list = &Scr->IconifyByUn; }
172f66df612Smrg                  win_list
173f66df612Smrg                | ICONIFY_BY_UNMAPPING  { if (Scr->FirstTime)
174f66df612Smrg                    Scr->IconifyByUnmapping = TRUE; }
175f66df612Smrg                | LEFT_TITLEBUTTON string EQUALS action {
176f66df612Smrg                                          GotTitleButton ($2, $4, False);
177f66df612Smrg                                        }
178f66df612Smrg                | RIGHT_TITLEBUTTON string EQUALS action {
179f66df612Smrg                                          GotTitleButton ($2, $4, True);
180f66df612Smrg                                        }
181f66df612Smrg                | button string         { root = GetRoot($2, NULLSTR, NULLSTR);
182f66df612Smrg                                          Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
183f66df612Smrg                                          Scr->Mouse[$1][C_ROOT][0].menu = root;
184f66df612Smrg                                        }
185f66df612Smrg                | button action         { Scr->Mouse[$1][C_ROOT][0].func = $2;
186f66df612Smrg                                          if ($2 == F_MENU)
187f66df612Smrg                                          {
188f66df612Smrg                                            pull->prev = NULL;
189f66df612Smrg                                            Scr->Mouse[$1][C_ROOT][0].menu = pull;
190f66df612Smrg                                          }
191f66df612Smrg                                          else
192f66df612Smrg                                          {
193f66df612Smrg                                            root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
194f66df612Smrg                                            Scr->Mouse[$1][C_ROOT][0].item =
195f66df612Smrg                                                AddToMenu(root,"x",Action,
196f66df612Smrg                                                          NULL,$2,NULLSTR,NULLSTR);
197f66df612Smrg                                          }
198f66df612Smrg                                          Action = empty;
199f66df612Smrg                                          pull = NULL;
200f66df612Smrg                                        }
201f66df612Smrg                | string fullkey        { GotKey($1, $2); }
202f66df612Smrg                | button full           { GotButton($1, $2); }
203f66df612Smrg                | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
204f66df612Smrg                  win_list
205f66df612Smrg                | ICONMGR_NOSHOW        { list = &Scr->IconMgrNoShow; }
206f66df612Smrg                  win_list
207f66df612Smrg                | ICONMGR_NOSHOW        { Scr->IconManagerDontShow = TRUE; }
208f66df612Smrg                | ICONMGRS              { list = &Scr->IconMgrs; }
209f66df612Smrg                  iconm_list
210f66df612Smrg                | ICONMGR_SHOW          { list = &Scr->IconMgrShow; }
211f66df612Smrg                  win_list
212f66df612Smrg                | NO_TITLE_HILITE       { list = &Scr->NoTitleHighlight; }
213f66df612Smrg                  win_list
214f66df612Smrg                | NO_TITLE_HILITE       { if (Scr->FirstTime)
215f66df612Smrg                                                Scr->TitleHighlight = FALSE; }
216f66df612Smrg                | NO_HILITE             { list = &Scr->NoHighlight; }
217f66df612Smrg                  win_list
218f66df612Smrg                | NO_HILITE             { if (Scr->FirstTime)
219f66df612Smrg                                                Scr->Highlight = FALSE; }
220f66df612Smrg                | NO_STACKMODE          { list = &Scr->NoStackModeL; }
221f66df612Smrg                  win_list
222f66df612Smrg                | NO_STACKMODE          { if (Scr->FirstTime)
223f66df612Smrg                                                Scr->StackMode = FALSE; }
224f66df612Smrg                | NO_TITLE              { list = &Scr->NoTitle; }
225f66df612Smrg                  win_list
226f66df612Smrg                | NO_TITLE              { if (Scr->FirstTime)
227f66df612Smrg                                                Scr->NoTitlebar = TRUE; }
228f66df612Smrg                | MAKE_TITLE            { list = &Scr->MakeTitle; }
229f66df612Smrg                  win_list
230f66df612Smrg                | START_ICONIFIED       { list = &Scr->StartIconified; }
231f66df612Smrg                  win_list
232f66df612Smrg                | AUTO_RAISE            { list = &Scr->AutoRaise; }
233f66df612Smrg                  win_list
234f66df612Smrg                | MENU string LP string COLON string RP {
235f66df612Smrg                                        root = GetRoot($2, $4, $6); }
236f66df612Smrg                  menu                  { root->real_menu = TRUE;}
237f66df612Smrg                | MENU string           { root = GetRoot($2, NULLSTR, NULLSTR); }
238f66df612Smrg                  menu                  { root->real_menu = TRUE; }
239f66df612Smrg                | FUNCTION string       { root = GetRoot($2, NULLSTR, NULLSTR); }
240f66df612Smrg                  function
241f66df612Smrg                | ICONS                 { list = &Scr->IconNames; }
242f66df612Smrg                  icon_list
243f66df612Smrg                | COLOR                 { color = COLOR; }
244f66df612Smrg                  color_list
245f66df612Smrg                | GRAYSCALE             { color = GRAYSCALE; }
246f66df612Smrg                  color_list
247f66df612Smrg                | SAVECOLOR
2483e747e6dSmrg                  save_color_list
249f66df612Smrg                | MONOCHROME            { color = MONOCHROME; }
250f66df612Smrg                  color_list
251f66df612Smrg                | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
252f66df612Smrg                                          if ($2 == F_MENU)
253f66df612Smrg                                          {
254f66df612Smrg                                            pull->prev = NULL;
255f66df612Smrg                                            Scr->DefaultFunction.menu = pull;
256f66df612Smrg                                          }
257f66df612Smrg                                          else
258f66df612Smrg                                          {
259f66df612Smrg                                            root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
260f66df612Smrg                                            Scr->DefaultFunction.item =
261f66df612Smrg                                                AddToMenu(root,"x",Action,
262f66df612Smrg                                                          NULL,$2, NULLSTR, NULLSTR);
263f66df612Smrg                                          }
264f66df612Smrg                                          Action = empty;
265f66df612Smrg                                          pull = NULL;
266f66df612Smrg                                        }
267f66df612Smrg                | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
268f66df612Smrg                                           root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
269f66df612Smrg                                           Scr->WindowFunction.item =
270f66df612Smrg                                                AddToMenu(root,"x",Action,
271f66df612Smrg                                                          NULL,$2, NULLSTR, NULLSTR);
272f66df612Smrg                                           Action = empty;
273f66df612Smrg                                           pull = NULL;
274f66df612Smrg                                        }
275f66df612Smrg                | WARP_CURSOR           { list = &Scr->WarpCursorL; }
276f66df612Smrg                  win_list
277f66df612Smrg                | WARP_CURSOR           { if (Scr->FirstTime)
278f66df612Smrg                                            Scr->WarpCursor = TRUE; }
279f66df612Smrg                | WINDOW_RING           { list = &Scr->WindowRingL; }
280f66df612Smrg                  win_list
281f66df612Smrg                ;
282f66df612Smrg
283f66df612Smrg
284f66df612Smrgnoarg           : KEYWORD               { if (!do_single_keyword ($1)) {
285f66df612Smrg                                            parseWarning (
286f66df612Smrg                                                 "unknown singleton keyword %d",
287f66df612Smrg                                                 $1);
288f66df612Smrg                                            ParseError = 1;
289f66df612Smrg                                          }
290f66df612Smrg                                        }
291f66df612Smrg                ;
292f66df612Smrg
293f66df612Smrgsarg            : SKEYWORD string       { if (!do_string_keyword ($1, $2)) {
294f66df612Smrg                                            parseWarning (
295f66df612Smrg                                                 "unknown string keyword %d (value \"%s\")",
296f66df612Smrg                                                 $1, $2);
297f66df612Smrg                                            ParseError = 1;
298f66df612Smrg                                          }
299f66df612Smrg                                        }
300f66df612Smrg                ;
301f66df612Smrg
302f66df612Smrgnarg            : NKEYWORD number       { if (!do_number_keyword ($1, $2)) {
303f66df612Smrg                                            parseWarning (
304f66df612Smrg                                                 "unknown numeric keyword %d (value %d)",
305f66df612Smrg                                                 $1, $2);
306f66df612Smrg                                            ParseError = 1;
307f66df612Smrg                                          }
308f66df612Smrg                                        }
309f66df612Smrg                ;
310f66df612Smrg
311f66df612Smrg
312f66df612Smrg
313f66df612Smrgfull            : EQUALS keys COLON contexts COLON action  { $$ = $6; }
314f66df612Smrg                ;
315f66df612Smrg
316f66df612Smrgfullkey         : EQUALS keys COLON contextkeys COLON action  { $$ = $6; }
317f66df612Smrg                ;
318f66df612Smrg
319f66df612Smrgkeys            : /* Empty */
320f66df612Smrg                | keys key
321f66df612Smrg                ;
322f66df612Smrg
323f66df612Smrgkey             : META                  { mods |= Mod1Mask; }
324f66df612Smrg                | SHIFT                 { mods |= ShiftMask; }
325f66df612Smrg                | LOCK                  { mods |= LockMask; }
326f66df612Smrg                | CONTROL               { mods |= ControlMask; }
327f66df612Smrg                | META number           { if ($2 < 1 || $2 > 5) {
328f66df612Smrg                                             parseWarning (
329f66df612Smrg                                                  "bad modifier number (%d), must be 1-5",
330f66df612Smrg                                                  $2);
331f66df612Smrg                                             ParseError = 1;
332f66df612Smrg                                          } else {
333f66df612Smrg                                             mods |= (Mod1Mask << ($2 - 1));
334f66df612Smrg                                          }
335f66df612Smrg                                        }
336f66df612Smrg                | OR                    { }
337f66df612Smrg                ;
338f66df612Smrg
339f66df612Smrgcontexts        : /* Empty */
340f66df612Smrg                | contexts context
341f66df612Smrg                ;
342f66df612Smrg
343f66df612Smrgcontext         : WINDOW                { cont |= C_WINDOW_BIT; }
344f66df612Smrg                | TITLE                 { cont |= C_TITLE_BIT; }
345f66df612Smrg                | ICON                  { cont |= C_ICON_BIT; }
346f66df612Smrg                | ROOT                  { cont |= C_ROOT_BIT; }
347f66df612Smrg                | FRAME                 { cont |= C_FRAME_BIT; }
348f66df612Smrg                | ICONMGR               { cont |= C_ICONMGR_BIT; }
349f66df612Smrg                | META                  { cont |= C_ICONMGR_BIT; }
350f66df612Smrg                | ALL                   { cont |= C_ALL_BITS; }
351f66df612Smrg                | OR                    {  }
352f66df612Smrg                ;
353f66df612Smrg
354f66df612Smrgcontextkeys     : /* Empty */
355f66df612Smrg                | contextkeys contextkey
356f66df612Smrg                ;
357f66df612Smrg
358f66df612Smrgcontextkey      : WINDOW                { cont |= C_WINDOW_BIT; }
359f66df612Smrg                | TITLE                 { cont |= C_TITLE_BIT; }
360f66df612Smrg                | ICON                  { cont |= C_ICON_BIT; }
361f66df612Smrg                | ROOT                  { cont |= C_ROOT_BIT; }
362f66df612Smrg                | FRAME                 { cont |= C_FRAME_BIT; }
363f66df612Smrg                | ICONMGR               { cont |= C_ICONMGR_BIT; }
364f66df612Smrg                | META                  { cont |= C_ICONMGR_BIT; }
365f66df612Smrg                | ALL                   { cont |= C_ALL_BITS; }
366f66df612Smrg                | OR                    { }
367f66df612Smrg                | string                { Name = $1; cont |= C_NAME_BIT; }
368f66df612Smrg                ;
369f66df612Smrg
370f66df612Smrg
371f66df612Smrgpixmap_list     : LB pixmap_entries RB
372f66df612Smrg                ;
373f66df612Smrg
374f66df612Smrgpixmap_entries  : /* Empty */
375f66df612Smrg                | pixmap_entries pixmap_entry
376f66df612Smrg                ;
377f66df612Smrg
378f66df612Smrgpixmap_entry    : TITLE_HILITE string { SetHighlightPixmap ($2); }
379f66df612Smrg                ;
380f66df612Smrg
381f66df612Smrg
382f66df612Smrgcursor_list     : LB cursor_entries RB
383f66df612Smrg                ;
384f66df612Smrg
385f66df612Smrgcursor_entries  : /* Empty */
386f66df612Smrg                | cursor_entries cursor_entry
387f66df612Smrg                ;
388f66df612Smrg
389f66df612Smrgcursor_entry    : FRAME string string {
390f66df612Smrg                        NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
391f66df612Smrg                | FRAME string  {
392f66df612Smrg                        NewFontCursor(&Scr->FrameCursor, $2); }
393f66df612Smrg                | TITLE string string {
394f66df612Smrg                        NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
395f66df612Smrg                | TITLE string {
396f66df612Smrg                        NewFontCursor(&Scr->TitleCursor, $2); }
397f66df612Smrg                | ICON string string {
398f66df612Smrg                        NewBitmapCursor(&Scr->IconCursor, $2, $3); }
399f66df612Smrg                | ICON string {
400f66df612Smrg                        NewFontCursor(&Scr->IconCursor, $2); }
401f66df612Smrg                | ICONMGR string string {
402f66df612Smrg                        NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
403f66df612Smrg                | ICONMGR string {
404f66df612Smrg                        NewFontCursor(&Scr->IconMgrCursor, $2); }
405f66df612Smrg                | BUTTON string string {
406f66df612Smrg                        NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
407f66df612Smrg                | BUTTON string {
408f66df612Smrg                        NewFontCursor(&Scr->ButtonCursor, $2); }
409f66df612Smrg                | MOVE string string {
410f66df612Smrg                        NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
411f66df612Smrg                | MOVE string {
412f66df612Smrg                        NewFontCursor(&Scr->MoveCursor, $2); }
413f66df612Smrg                | RESIZE string string {
414f66df612Smrg                        NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
415f66df612Smrg                | RESIZE string {
416f66df612Smrg                        NewFontCursor(&Scr->ResizeCursor, $2); }
417f66df612Smrg                | WAIT string string {
418f66df612Smrg                        NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
419f66df612Smrg                | WAIT string {
420f66df612Smrg                        NewFontCursor(&Scr->WaitCursor, $2); }
421f66df612Smrg                | MENU string string {
422f66df612Smrg                        NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
423f66df612Smrg                | MENU string {
424f66df612Smrg                        NewFontCursor(&Scr->MenuCursor, $2); }
425f66df612Smrg                | SELECT string string {
426f66df612Smrg                        NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
427f66df612Smrg                | SELECT string {
428f66df612Smrg                        NewFontCursor(&Scr->SelectCursor, $2); }
429f66df612Smrg                | KILL string string {
430f66df612Smrg                        NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
431f66df612Smrg                | KILL string {
432f66df612Smrg                        NewFontCursor(&Scr->DestroyCursor, $2); }
433f66df612Smrg                ;
434f66df612Smrg
435f66df612Smrgcolor_list      : LB color_entries RB
436f66df612Smrg                ;
437f66df612Smrg
438f66df612Smrg
439f66df612Smrgcolor_entries   : /* Empty */
440f66df612Smrg                | color_entries color_entry
441f66df612Smrg                ;
442f66df612Smrg
443f66df612Smrgcolor_entry     : CLKEYWORD string      { if (!do_colorlist_keyword ($1, color,
444f66df612Smrg                                                                     $2)) {
445f66df612Smrg                                            parseWarning (
446f66df612Smrg                                                 "unhandled list color keyword %d (string \"%s\")",
447f66df612Smrg                                                 $1, $2);
448f66df612Smrg                                            ParseError = 1;
449f66df612Smrg                                          }
450f66df612Smrg                                        }
451f66df612Smrg                | CLKEYWORD string      { list = do_colorlist_keyword($1,color,
452f66df612Smrg                                                                      $2);
453f66df612Smrg                                          if (!list) {
454f66df612Smrg                                            parseWarning (
455f66df612Smrg                                                 "unhandled color list keyword %d (string \"%s\")",
456f66df612Smrg                                                 $1, $2);
457f66df612Smrg                                            ParseError = 1;
458f66df612Smrg                                          }
459f66df612Smrg                                        }
460f66df612Smrg                  win_color_list        { /* No action */; }
461f66df612Smrg                | CKEYWORD string       { if (!do_color_keyword ($1, color,
462f66df612Smrg                                                                 $2)) {
463f66df612Smrg                                            parseWarning (
464f66df612Smrg                                                 "unhandled color keyword %d (string \"%s\")",
465f66df612Smrg                                                 $1, $2);
466f66df612Smrg                                            ParseError = 1;
467f66df612Smrg                                          }
468f66df612Smrg                                        }
469f66df612Smrg                ;
4703e747e6dSmrg
471c2535118Smrgsave_color_list : LB s_color_entries RB
4723e747e6dSmrg                ;
4733e747e6dSmrg
4743e747e6dSmrgs_color_entries : /* Empty */
475c2535118Smrg                | s_color_entries s_color_entry
4763e747e6dSmrg                ;
4773e747e6dSmrg
4783e747e6dSmrgs_color_entry   : string            { do_string_savecolor(color, $1); }
4793e747e6dSmrg                | CLKEYWORD         { do_var_savecolor($1); }
4803e747e6dSmrg                ;
4813e747e6dSmrg
482f66df612Smrgwin_color_list  : LB win_color_entries RB
483f66df612Smrg                ;
484f66df612Smrg
485f66df612Smrgwin_color_entries       : /* Empty */
486f66df612Smrg                | win_color_entries win_color_entry
487f66df612Smrg                ;
488f66df612Smrg
489f66df612Smrgwin_color_entry : string string         { if (Scr->FirstTime &&
490f66df612Smrg                                              color == Scr->Monochrome)
491f66df612Smrg                                            AddToList(list, $1, $2); }
492f66df612Smrg                ;
493f66df612Smrg
494f66df612Smrgsqueeze         : SQUEEZE_TITLE {
495f66df612Smrg                                    if (HasShape) Scr->SqueezeTitle = TRUE;
496f66df612Smrg                                }
497f66df612Smrg                | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL;
498f66df612Smrg                                  if (HasShape && Scr->SqueezeTitle == -1)
499f66df612Smrg                                    Scr->SqueezeTitle = TRUE;
500f66df612Smrg                                }
501f66df612Smrg                  LB win_sqz_entries RB
502f66df612Smrg                | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
503f66df612Smrg                | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
504f66df612Smrg                  win_list
505f66df612Smrg                ;
506f66df612Smrg
507f66df612Smrgwin_sqz_entries : /* Empty */
508f66df612Smrg                | win_sqz_entries string JKEYWORD signed_number number  {
509f66df612Smrg                                if (Scr->FirstTime) {
510f66df612Smrg                                   do_squeeze_entry (list, $2, $3, $4, $5);
511f66df612Smrg                                }
512f66df612Smrg                        }
513f66df612Smrg                ;
514f66df612Smrg
515f66df612Smrg
516f66df612Smrgiconm_list      : LB iconm_entries RB
517f66df612Smrg                ;
518f66df612Smrg
519f66df612Smrgiconm_entries   : /* Empty */
520f66df612Smrg                | iconm_entries iconm_entry
521f66df612Smrg                ;
522f66df612Smrg
523f66df612Smrgiconm_entry     : string string number  { if (Scr->FirstTime)
524f66df612Smrg                                            AddToList(list, $1, (char *)
525f66df612Smrg                                                AllocateIconManager($1, NULLSTR,
526f66df612Smrg                                                        $2,$3));
527f66df612Smrg                                        }
528f66df612Smrg                | string string string number
529f66df612Smrg                                        { if (Scr->FirstTime)
530f66df612Smrg                                            AddToList(list, $1, (char *)
531f66df612Smrg                                                AllocateIconManager($1,$2,
532f66df612Smrg                                                $3, $4));
533f66df612Smrg                                        }
534f66df612Smrg                ;
535f66df612Smrg
536f66df612Smrgwin_list        : LB win_entries RB
537f66df612Smrg                ;
538f66df612Smrg
539f66df612Smrgwin_entries     : /* Empty */
540f66df612Smrg                | win_entries win_entry
541f66df612Smrg                ;
542f66df612Smrg
543f66df612Smrgwin_entry       : string                { if (Scr->FirstTime)
5446d8e82c3Smrg                                            AddToList(list, $1, NULL);
545f66df612Smrg                                        }
546f66df612Smrg                ;
547f66df612Smrg
548f66df612Smrgicon_list       : LB icon_entries RB
549f66df612Smrg                ;
550f66df612Smrg
551f66df612Smrgicon_entries    : /* Empty */
552f66df612Smrg                | icon_entries icon_entry
553f66df612Smrg                ;
554f66df612Smrg
555f66df612Smrgicon_entry      : string string         { if (Scr->FirstTime) AddToList(list, $1, $2); }
556f66df612Smrg                ;
557f66df612Smrg
558f66df612Smrgfunction        : LB function_entries RB
559f66df612Smrg                ;
5603e747e6dSmrg
5613e747e6dSmrgfunction_entries: /* Empty */
562f66df612Smrg                | function_entries function_entry
563f66df612Smrg                ;
564f66df612Smrg
565f66df612Smrgfunction_entry  : action                { AddToMenu(root, empty, Action, NULL, $1,
566f66df612Smrg                                                NULLSTR, NULLSTR);
567f66df612Smrg                                          Action = empty;
568f66df612Smrg                                        }
569f66df612Smrg                ;
570f66df612Smrg
571f66df612Smrgmenu            : LB menu_entries RB
572f66df612Smrg                ;
573f66df612Smrg
574f66df612Smrgmenu_entries    : /* Empty */
575f66df612Smrg                | menu_entries menu_entry
576f66df612Smrg                ;
577f66df612Smrg
578f66df612Smrgmenu_entry      : string action         { AddToMenu(root, $1, Action, pull, $2,
579f66df612Smrg                                                NULLSTR, NULLSTR);
580f66df612Smrg                                          Action = empty;
581f66df612Smrg                                          pull = NULL;
582f66df612Smrg                                        }
583f66df612Smrg                | string LP string COLON string RP action {
584f66df612Smrg                                          AddToMenu(root, $1, Action, pull, $7,
585f66df612Smrg                                                $3, $5);
586f66df612Smrg                                          Action = empty;
587f66df612Smrg                                          pull = NULL;
588f66df612Smrg                                        }
589f66df612Smrg                ;
590f66df612Smrg
591f66df612Smrgaction          : FKEYWORD      { $$ = $1; }
592f66df612Smrg                | FSKEYWORD string {
593f66df612Smrg                                $$ = $1;
594f66df612Smrg                                Action = $2;
595f66df612Smrg                                switch ($1) {
596f66df612Smrg                                  case F_MENU:
597f66df612Smrg                                    pull = GetRoot ($2, NULLSTR,NULLSTR);
598f66df612Smrg                                    pull->prev = root;
599f66df612Smrg                                    break;
600f66df612Smrg                                  case F_WARPRING:
601f66df612Smrg                                    if (!CheckWarpRingArg (Action)) {
602f66df612Smrg                                        parseWarning (
603f66df612Smrg                                             "ignoring invalid f.warptoring argument \"%s\"",
604f66df612Smrg                                             Action);
605f66df612Smrg                                        $$ = F_NOP;
606f66df612Smrg                                    }
607f66df612Smrg                                    break;
608f66df612Smrg                                  case F_WARPTOSCREEN:
609f66df612Smrg                                    if (!CheckWarpScreenArg (Action)) {
610f66df612Smrg                                        parseWarning (
611f66df612Smrg                                             "ignoring invalid f.warptoscreen argument \"%s\"",
612f66df612Smrg                                             Action);
613f66df612Smrg                                        $$ = F_NOP;
614f66df612Smrg                                    }
615f66df612Smrg                                    break;
616f66df612Smrg                                  case F_COLORMAP:
617f66df612Smrg                                    if (CheckColormapArg (Action)) {
618f66df612Smrg                                        $$ = F_COLORMAP;
619f66df612Smrg                                    } else {
620f66df612Smrg                                        parseWarning (
621f66df612Smrg                                             "ignoring invalid f.colormap argument \"%s\"",
622f66df612Smrg                                             Action);
623f66df612Smrg                                        $$ = F_NOP;
624f66df612Smrg                                    }
625f66df612Smrg                                    break;
626f66df612Smrg                                } /* end switch */
627f66df612Smrg                                   }
628f66df612Smrg                ;
629f66df612Smrg
630f66df612Smrg
631f66df612Smrgsigned_number   : number                { $$ = $1; }
632f66df612Smrg                | PLUS number           { $$ = $2; }
633f66df612Smrg                | MINUS number          { $$ = -($2); }
634f66df612Smrg                ;
635f66df612Smrg
636f66df612Smrgbutton          : BUTTON number         { $$ = $2;
637f66df612Smrg                                          if ($2 == 0)
638f66df612Smrg                                                yyerror("bad button 0");
639f66df612Smrg
640f66df612Smrg                                          if ($2 > MAX_BUTTONS)
641f66df612Smrg                                          {
642f66df612Smrg                                                $$ = 0;
643f66df612Smrg                                                yyerror("button number too large");
644f66df612Smrg                                          }
645f66df612Smrg                                        }
646f66df612Smrg                ;
647f66df612Smrg
648f66df612Smrgstring          : STRING                { ptr = strdup($1);
649f66df612Smrg                                          RemoveDQuote(ptr);
650f66df612Smrg                                          $$ = ptr;
651f66df612Smrg                                        }
652f66df612Smrg                ;
653f66df612Smrgnumber          : NUMBER                { $$ = $1; }
654f66df612Smrg                ;
6553e747e6dSmrg
6563e747e6dSmrg%%
657f66df612Smrg
658c2535118Smrgstatic void
659c2535118Smrgyyerror(const char *s)
6603e747e6dSmrg{
661f66df612Smrg    parseWarning("error in input file:  %s", s ? s : "");
6623e747e6dSmrg    ParseError = 1;
6633e747e6dSmrg}
6643e747e6dSmrg
665c2535118Smrgstatic void
6663e747e6dSmrgRemoveDQuote(char *str)
6673e747e6dSmrg{
6686d8e82c3Smrg    char *i, *o;
6696d8e82c3Smrg    int n;
6706d8e82c3Smrg    int count;
6713e747e6dSmrg
672f66df612Smrg    for (i = str + 1, o = str; *i && *i != '\"'; o++) {
673f66df612Smrg        if (*i == '\\') {
674f66df612Smrg            switch (*++i) {
675f66df612Smrg            case 'n':
676f66df612Smrg                *o = '\n';
677f66df612Smrg                i++;
678f66df612Smrg                break;
679f66df612Smrg            case 'b':
680f66df612Smrg                *o = '\b';
681f66df612Smrg                i++;
682f66df612Smrg                break;
683f66df612Smrg            case 'r':
684f66df612Smrg                *o = '\r';
685f66df612Smrg                i++;
686f66df612Smrg                break;
687f66df612Smrg            case 't':
688f66df612Smrg                *o = '\t';
689f66df612Smrg                i++;
690f66df612Smrg                break;
691f66df612Smrg            case 'f':
692f66df612Smrg                *o = '\f';
693f66df612Smrg                i++;
694f66df612Smrg                break;
695f66df612Smrg            case '0':
696f66df612Smrg                if (*++i == 'x')
697f66df612Smrg                    goto hex;
698f66df612Smrg                else
699f66df612Smrg                    --i;
700f66df612Smrg                /* FALLTHRU */
701f66df612Smrg            case '1':
702f66df612Smrg            case '2':
703f66df612Smrg            case '3':
704f66df612Smrg            case '4':
705f66df612Smrg            case '5':
706f66df612Smrg            case '6':
707f66df612Smrg            case '7':
708f66df612Smrg                n = 0;
709f66df612Smrg                count = 0;
710f66df612Smrg                while (*i >= '0' && *i <= '7' && count < 3) {
711f66df612Smrg                    n = (n << 3) + (*i++ - '0');
712f66df612Smrg                    count++;
713f66df612Smrg                }
714f66df612Smrg                *o = (char) n;
715f66df612Smrg                break;
716f66df612Smrg              hex:
717f66df612Smrg            case 'x':
718f66df612Smrg                n = 0;
719f66df612Smrg                count = 0;
720f66df612Smrg                while (i++, count++ < 2) {
721f66df612Smrg                    if (*i >= '0' && *i <= '9')
722f66df612Smrg                        n = (n << 4) + (*i - '0');
723f66df612Smrg                    else if (*i >= 'a' && *i <= 'f')
724f66df612Smrg                        n = (n << 4) + (*i - 'a') + 10;
725f66df612Smrg                    else if (*i >= 'A' && *i <= 'F')
726f66df612Smrg                        n = (n << 4) + (*i - 'A') + 10;
727f66df612Smrg                    else
728f66df612Smrg                        break;
729f66df612Smrg                }
730f66df612Smrg                *o = (char) n;
731f66df612Smrg                break;
732f66df612Smrg            case '\n':
733f66df612Smrg                i++;            /* punt */
734f66df612Smrg                o--;            /* to account for o++ at end of loop */
735f66df612Smrg                break;
736f66df612Smrg            case '\"':
737f66df612Smrg            case '\'':
738f66df612Smrg            case '\\':
739f66df612Smrg            default:
740f66df612Smrg                *o = *i++;
741f66df612Smrg                break;
742f66df612Smrg            }
743f66df612Smrg        }
744f66df612Smrg        else
745f66df612Smrg            *o = *i++;
7463e747e6dSmrg    }
7473e747e6dSmrg    *o = '\0';
7483e747e6dSmrg}
7493e747e6dSmrg
750f66df612Smrgstatic MenuRoot *
751f66df612SmrgGetRoot(const char *name, const char *fore, const char *back)
7523e747e6dSmrg{
7533e747e6dSmrg    MenuRoot *tmp;
7543e747e6dSmrg
7553e747e6dSmrg    tmp = FindMenuRoot(name);
7563e747e6dSmrg    if (tmp == NULL)
757f66df612Smrg        tmp = NewMenuRoot(name);
7583e747e6dSmrg
759f66df612Smrg    if (fore) {
760f66df612Smrg        int save;
7613e747e6dSmrg
762f66df612Smrg        save = Scr->FirstTime;
763f66df612Smrg        Scr->FirstTime = TRUE;
764f66df612Smrg        GetColor(COLOR, &tmp->hi_fore, fore);
765f66df612Smrg        GetColor(COLOR, &tmp->hi_back, back);
766f66df612Smrg        Scr->FirstTime = (short) save;
7673e747e6dSmrg    }
7683e747e6dSmrg
7693e747e6dSmrg    return tmp;
7703e747e6dSmrg}
7713e747e6dSmrg
772f66df612Smrgstatic void
773f66df612SmrgGotButton(int butt, int func)
7743e747e6dSmrg{
7753e747e6dSmrg    int i;
7763e747e6dSmrg
777f66df612Smrg    for (i = 0; i < NUM_CONTEXTS; i++) {
778f66df612Smrg        if ((cont & (1 << i)) == 0)
779f66df612Smrg            continue;
780f66df612Smrg
781f66df612Smrg        Scr->Mouse[butt][i][mods].func = func;
782f66df612Smrg        if (func == F_MENU) {
783f66df612Smrg            pull->prev = NULL;
784f66df612Smrg            Scr->Mouse[butt][i][mods].menu = pull;
785f66df612Smrg        }
786f66df612Smrg        else {
787f66df612Smrg            root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
788f66df612Smrg            Scr->Mouse[butt][i][mods].item = AddToMenu(root, "x", Action,
789f66df612Smrg                                                       NULL, func, NULLSTR, NULLSTR);
790f66df612Smrg        }
7913e747e6dSmrg    }
792f66df612Smrg    Action = empty;
7933e747e6dSmrg    pull = NULL;
7943e747e6dSmrg    cont = 0;
795f66df612Smrg    mods_used |= (unsigned) mods;
7963e747e6dSmrg    mods = 0;
7973e747e6dSmrg}
7983e747e6dSmrg
799f66df612Smrgstatic void
800f66df612SmrgGotKey(char *key, int func)
8013e747e6dSmrg{
8023e747e6dSmrg    int i;
8033e747e6dSmrg
804f66df612Smrg    for (i = 0; i < NUM_CONTEXTS; i++) {
805f66df612Smrg        if ((cont & (1 << i)) == 0)
806f66df612Smrg            continue;
807f66df612Smrg        if (!AddFuncKey(key, i, mods, func, Name, Action))
808f66df612Smrg            break;
8093e747e6dSmrg    }
8103e747e6dSmrg
811f66df612Smrg    Action = empty;
8123e747e6dSmrg    pull = NULL;
8133e747e6dSmrg    cont = 0;
814f66df612Smrg    mods_used |= (unsigned) mods;
8153e747e6dSmrg    mods = 0;
8163e747e6dSmrg}
8173e747e6dSmrg
818f66df612Smrgstatic void
819f66df612SmrgGotTitleButton(char *bitmapname, int func, Bool rightside)
8203e747e6dSmrg{
821f66df612Smrg    if (!CreateTitleButton(bitmapname, func, Action, pull, rightside, True)) {
822f66df612Smrg        parseWarning("unable to create %s titlebutton \"%s\"",
823f66df612Smrg                     rightside ? "right" : "left", bitmapname);
8243e747e6dSmrg    }
825f66df612Smrg    Action = empty;
8263e747e6dSmrg    pull = NULL;
8273e747e6dSmrg}
8283e747e6dSmrg
829f66df612Smrgstatic Bool
830f66df612SmrgCheckWarpScreenArg(char *s)
8313e747e6dSmrg{
832f66df612Smrg    XmuCopyISOLatin1Lowered(s, s);
8333e747e6dSmrg
834f66df612Smrg    if (strcmp(s, WARPSCREEN_NEXT) == 0 ||
835f66df612Smrg        strcmp(s, WARPSCREEN_PREV) == 0 ||
836f66df612Smrg        strcmp(s, WARPSCREEN_BACK) == 0)
837f66df612Smrg        return True;
8383e747e6dSmrg
839f66df612Smrg    for (; *s && isascii(*s) && isdigit(*s); s++);      /* SUPPRESS 530 */
8403e747e6dSmrg    return (*s ? False : True);
8413e747e6dSmrg}
8423e747e6dSmrg
843f66df612Smrgstatic Bool
844f66df612SmrgCheckWarpRingArg(char *s)
8453e747e6dSmrg{
846f66df612Smrg    XmuCopyISOLatin1Lowered(s, s);
8473e747e6dSmrg
848f66df612Smrg    if (strcmp(s, WARPSCREEN_NEXT) == 0 ||
849f66df612Smrg        strcmp(s, WARPSCREEN_PREV) == 0)
850f66df612Smrg        return True;
8513e747e6dSmrg
8523e747e6dSmrg    return False;
8533e747e6dSmrg}
8543e747e6dSmrg
855f66df612Smrgstatic Bool
856f66df612SmrgCheckColormapArg(char *s)
8573e747e6dSmrg{
858f66df612Smrg    XmuCopyISOLatin1Lowered(s, s);
8593e747e6dSmrg
860f66df612Smrg    if (strcmp(s, COLORMAP_NEXT) == 0 ||
861f66df612Smrg        strcmp(s, COLORMAP_PREV) == 0 ||
862f66df612Smrg        strcmp(s, COLORMAP_DEFAULT) == 0)
863f66df612Smrg        return True;
8643e747e6dSmrg
8653e747e6dSmrg    return False;
8663e747e6dSmrg}
867