gram.y revision 645f5050
1645f5050Syouri/*****************************************************************************/
2645f5050Syouri/**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
3645f5050Syouri/**                          Salt Lake City, Utah                           **/
4645f5050Syouri/**  Portions Copyright 1989 by the Massachusetts Institute of Technology   **/
5645f5050Syouri/**                        Cambridge, Massachusetts                         **/
6645f5050Syouri/**                                                                         **/
7645f5050Syouri/**                           All Rights Reserved                           **/
8645f5050Syouri/**                                                                         **/
9645f5050Syouri/**    Permission to use, copy, modify, and distribute this software and    **/
10645f5050Syouri/**    its documentation  for  any  purpose  and  without  fee is hereby    **/
11645f5050Syouri/**    granted, provided that the above copyright notice appear  in  all    **/
12645f5050Syouri/**    copies and that both  that  copyright  notice  and  this  permis-    **/
13645f5050Syouri/**    sion  notice appear in supporting  documentation,  and  that  the    **/
14645f5050Syouri/**    names of Evans & Sutherland and M.I.T. not be used in advertising    **/
15645f5050Syouri/**    in publicity pertaining to distribution of the  software  without    **/
16645f5050Syouri/**    specific, written prior permission.                                  **/
17645f5050Syouri/**                                                                         **/
18645f5050Syouri/**    EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD    **/
19645f5050Syouri/**    TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES  OF  MERCHANT-    **/
20645f5050Syouri/**    ABILITY  AND  FITNESS,  IN  NO  EVENT SHALL EVANS & SUTHERLAND OR    **/
21645f5050Syouri/**    M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL  DAM-    **/
22645f5050Syouri/**    AGES OR  ANY DAMAGES WHATSOEVER  RESULTING FROM LOSS OF USE, DATA    **/
23645f5050Syouri/**    OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER    **/
24645f5050Syouri/**    TORTIOUS ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE    **/
25645f5050Syouri/**    OR PERFORMANCE OF THIS SOFTWARE.                                     **/
26645f5050Syouri/*****************************************************************************/
27645f5050Syouri/*
28645f5050Syouri *  [ ctwm ]
29645f5050Syouri *
30645f5050Syouri *  Copyright 1992 Claude Lecommandeur.
31645f5050Syouri *
32645f5050Syouri * Permission to use, copy, modify  and distribute this software  [ctwm] and
33645f5050Syouri * its documentation for any purpose is hereby granted without fee, provided
34645f5050Syouri * that the above  copyright notice appear  in all copies and that both that
35645f5050Syouri * copyright notice and this permission notice appear in supporting documen-
36645f5050Syouri * tation, and that the name of  Claude Lecommandeur not be used in adverti-
37645f5050Syouri * sing or  publicity  pertaining to  distribution of  the software  without
38645f5050Syouri * specific, written prior permission. Claude Lecommandeur make no represen-
39645f5050Syouri * tations  about the suitability  of this software  for any purpose.  It is
40645f5050Syouri * provided "as is" without express or implied warranty.
41645f5050Syouri *
42645f5050Syouri * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
43645f5050Syouri * INCLUDING ALL  IMPLIED WARRANTIES OF  MERCHANTABILITY AND FITNESS.  IN NO
44645f5050Syouri * EVENT SHALL  Claude Lecommandeur  BE LIABLE FOR ANY SPECIAL,  INDIRECT OR
45645f5050Syouri * CONSEQUENTIAL  DAMAGES OR ANY  DAMAGES WHATSOEVER  RESULTING FROM LOSS OF
46645f5050Syouri * USE, DATA  OR PROFITS,  WHETHER IN AN ACTION  OF CONTRACT,  NEGLIGENCE OR
47645f5050Syouri * OTHER  TORTIOUS ACTION,  ARISING OUT OF OR IN  CONNECTION WITH THE USE OR
48645f5050Syouri * PERFORMANCE OF THIS SOFTWARE.
49645f5050Syouri *
50645f5050Syouri * Author:  Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ]
51645f5050Syouri */
52645f5050Syouri
53645f5050Syouri
54645f5050Syouri/***********************************************************************
55645f5050Syouri *
56645f5050Syouri * $XConsortium: gram.y,v 1.91 91/02/08 18:21:56 dave Exp $
57645f5050Syouri *
58645f5050Syouri * .twmrc command grammer
59645f5050Syouri *
60645f5050Syouri * 07-Jan-86 Thomas E. LaStrange	File created
61645f5050Syouri * 11-Nov-90 Dave Sternlicht            Adding SaveColors
62645f5050Syouri * 10-Oct-90 David M. Sternlicht        Storing saved colors on root
63645f5050Syouri * 22-April-92 Claude Lecommandeur	modifications for ctwm.
64645f5050Syouri *
65645f5050Syouri ***********************************************************************/
66645f5050Syouri
67645f5050Syouri%{
68645f5050Syouri#include <stdio.h>
69645f5050Syouri#include <ctype.h>
70645f5050Syouri#include "twm.h"
71645f5050Syouri#include "menus.h"
72645f5050Syouri#include "icons.h"
73645f5050Syouri#include "windowbox.h"
74645f5050Syouri#include "add_window.h"
75645f5050Syouri#include "list.h"
76645f5050Syouri#include "util.h"
77645f5050Syouri#include "screen.h"
78645f5050Syouri#include "parse.h"
79645f5050Syouri#include "cursor.h"
80645f5050Syouri#ifdef VMS
81645f5050Syouri#  include <decw$include/Xos.h>
82645f5050Syouri#  include <X11Xmu/CharSet.h>
83645f5050Syouri#else
84645f5050Syouri#  include <X11/Xos.h>
85645f5050Syouri#  include <X11/Xmu/CharSet.h>
86645f5050Syouri#endif
87645f5050Syouri
88645f5050Syouristatic char *Action = "";
89645f5050Syouristatic char *Name = "";
90645f5050Syouristatic char *defstring = "default";
91645f5050Syouristatic MenuRoot	*root, *pull = NULL;
92645f5050Syouristatic char *curWorkSpc;
93645f5050Syouristatic char *client, *workspace;
94645f5050Syouristatic MenuItem *lastmenuitem = (MenuItem*) 0;
95645f5050Syouri
96645f5050Syouriextern void yyerror(char *s);
97645f5050Syouriextern void RemoveDQuote(char *str);
98645f5050Syouri
99645f5050Syouristatic MenuRoot *GetRoot(char *name, char *fore, char *back);
100645f5050Syouri
101645f5050Syouristatic Bool CheckWarpScreenArg(register char *s);
102645f5050Syouristatic Bool CheckWarpRingArg(register char *s);
103645f5050Syouristatic Bool CheckColormapArg(register char *s);
104645f5050Syouristatic void GotButton(int butt, int func);
105645f5050Syouristatic void GotKey(char *key, int func);
106645f5050Syouristatic void GotTitleButton(char *bitmapname, int func, Bool rightside);
107645f5050Syouristatic char *ptr;
108645f5050Syouristatic name_list **list;
109645f5050Syouristatic int cont = 0;
110645f5050Syouristatic int color;
111645f5050SyouriBool donttoggleworkspacemanagerstate = FALSE;
112645f5050Syouriint mods = 0;
113645f5050Syouriunsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask);
114645f5050Syouri
115645f5050Syouriextern void twmrc_error_prefix(void);
116645f5050Syouri
117645f5050Syouriextern int yylex(void);
118645f5050Syouriextern int yyparse(void);
119645f5050Syouri%}
120645f5050Syouri
121645f5050Syouri%union
122645f5050Syouri{
123645f5050Syouri    int num;
124645f5050Syouri    char *ptr;
125645f5050Syouri};
126645f5050Syouri
127645f5050Syouri
128645f5050Syouri%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
129645f5050Syouri%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
130645f5050Syouri%token <num> ICONMGR_SHOW ICONMGR ALTER WINDOW_FUNCTION ZOOM ICONMGRS
131645f5050Syouri%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE
132645f5050Syouri%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING
133645f5050Syouri%token <num> NO_BORDER NO_ICON_TITLE NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION
134645f5050Syouri%token <num> WINDOW_REGION META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
135645f5050Syouri%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
136645f5050Syouri%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
137645f5050Syouri%token <num> MOVE RESIZE WAITC SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
138645f5050Syouri%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
139645f5050Syouri%token <num> SKEYWORD SSKEYWORD DKEYWORD JKEYWORD WINDOW_RING WINDOW_RING_EXCLUDE WARP_CURSOR ERRORTOKEN
140645f5050Syouri%token <num> NO_STACKMODE ALWAYS_ON_TOP WORKSPACE WORKSPACES WORKSPCMGR_GEOMETRY
141645f5050Syouri%token <num> OCCUPYALL OCCUPYLIST MAPWINDOWCURRENTWORKSPACE MAPWINDOWDEFAULTWORKSPACE
142645f5050Syouri%token <num> UNMAPBYMOVINGFARAWAY OPAQUEMOVE NOOPAQUEMOVE OPAQUERESIZE NOOPAQUERESIZE
143645f5050Syouri%token <num> DONTSETINACTIVE CHANGE_WORKSPACE_FUNCTION DEICONIFY_FUNCTION ICONIFY_FUNCTION
144645f5050Syouri%token <num> AUTOSQUEEZE STARTSQUEEZED DONT_SAVE AUTO_LOWER ICONMENU_DONTSHOW WINDOW_BOX
145645f5050Syouri%token <num> IGNOREMODIFIER WINDOW_GEOMETRIES ALWAYSSQUEEZETOGRAVITY VIRTUAL_SCREENS
146645f5050Syouri%token <num> IGNORE_TRANSIENT DONTTOGGLEWORKSPACEMANAGERSTATE
147645f5050Syouri%token <ptr> STRING
148645f5050Syouri
149645f5050Syouri%type <ptr> string
150645f5050Syouri%type <num> action button number signed_number keyaction full fullkey
151645f5050Syouri
152645f5050Syouri%start twmrc
153645f5050Syouri
154645f5050Syouri%%
155645f5050Syouritwmrc		: stmts
156645f5050Syouri		;
157645f5050Syouri
158645f5050Syouristmts		: /* Empty */
159645f5050Syouri		| stmts stmt
160645f5050Syouri		;
161645f5050Syouri
162645f5050Syouristmt		: error
163645f5050Syouri		| noarg
164645f5050Syouri		| sarg
165645f5050Syouri		| narg
166645f5050Syouri		| squeeze
167645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number {
168645f5050Syouri		      (void) AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef");
169645f5050Syouri		  }
170645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number string {
171645f5050Syouri		      (void) AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef");
172645f5050Syouri		  }
173645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number string string {
174645f5050Syouri		      (void) AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef");
175645f5050Syouri		  }
176645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number string string string {
177645f5050Syouri		      (void) AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9);
178645f5050Syouri		  }
179645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number {
180645f5050Syouri		      list = AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef");
181645f5050Syouri		  }
182645f5050Syouri		  win_list
183645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number string {
184645f5050Syouri		      list = AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef");
185645f5050Syouri		  }
186645f5050Syouri		  win_list
187645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number string string {
188645f5050Syouri		      list = AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef");
189645f5050Syouri		  }
190645f5050Syouri		  win_list
191645f5050Syouri		| ICON_REGION string DKEYWORD DKEYWORD number number string string string {
192645f5050Syouri		      list = AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9);
193645f5050Syouri		  }
194645f5050Syouri		  win_list
195645f5050Syouri
196645f5050Syouri		| WINDOW_REGION string DKEYWORD DKEYWORD {
197645f5050Syouri		      list = AddWindowRegion ($2, $3, $4);
198645f5050Syouri		  }
199645f5050Syouri		  win_list
200645f5050Syouri
201645f5050Syouri		| WINDOW_BOX string string {
202645f5050Syouri		      list = addWindowBox ($2, $3);
203645f5050Syouri		  }
204645f5050Syouri		  win_list
205645f5050Syouri
206645f5050Syouri		| ICONMGR_GEOMETRY string number	{ if (Scr->FirstTime)
207645f5050Syouri						  {
208645f5050Syouri						    Scr->iconmgr->geometry= (char*)$2;
209645f5050Syouri						    Scr->iconmgr->columns=$3;
210645f5050Syouri						  }
211645f5050Syouri						}
212645f5050Syouri		| ICONMGR_GEOMETRY string	{ if (Scr->FirstTime)
213645f5050Syouri						    Scr->iconmgr->geometry = (char*)$2;
214645f5050Syouri						}
215645f5050Syouri		| WORKSPCMGR_GEOMETRY string number	{ if (Scr->FirstTime)
216645f5050Syouri				{
217645f5050Syouri				    Scr->workSpaceMgr.geometry= (char*)$2;
218645f5050Syouri				    Scr->workSpaceMgr.columns=$3;
219645f5050Syouri				}
220645f5050Syouri						}
221645f5050Syouri		| WORKSPCMGR_GEOMETRY string	{ if (Scr->FirstTime)
222645f5050Syouri				    Scr->workSpaceMgr.geometry = (char*)$2;
223645f5050Syouri						}
224645f5050Syouri		| MAPWINDOWCURRENTWORKSPACE {}
225645f5050Syouri		  curwork
226645f5050Syouri
227645f5050Syouri		| MAPWINDOWDEFAULTWORKSPACE {}
228645f5050Syouri		  defwork
229645f5050Syouri
230645f5050Syouri		| ZOOM number		{ if (Scr->FirstTime)
231645f5050Syouri					  {
232645f5050Syouri						Scr->DoZoom = TRUE;
233645f5050Syouri						Scr->ZoomCount = $2;
234645f5050Syouri					  }
235645f5050Syouri					}
236645f5050Syouri		| ZOOM			{ if (Scr->FirstTime)
237645f5050Syouri						Scr->DoZoom = TRUE; }
238645f5050Syouri		| PIXMAPS pixmap_list	{}
239645f5050Syouri		| CURSORS cursor_list	{}
240645f5050Syouri		| ICONIFY_BY_UNMAPPING	{ list = &Scr->IconifyByUn; }
241645f5050Syouri		  win_list
242645f5050Syouri		| ICONIFY_BY_UNMAPPING	{ if (Scr->FirstTime)
243645f5050Syouri		    Scr->IconifyByUnmapping = TRUE; }
244645f5050Syouri
245645f5050Syouri		| OPAQUEMOVE	{ list = &Scr->OpaqueMoveList; }
246645f5050Syouri		  win_list
247645f5050Syouri		| OPAQUEMOVE	{ if (Scr->FirstTime) Scr->DoOpaqueMove = TRUE; }
248645f5050Syouri		| NOOPAQUEMOVE	{ list = &Scr->NoOpaqueMoveList; }
249645f5050Syouri		  win_list
250645f5050Syouri		| NOOPAQUEMOVE	{ if (Scr->FirstTime) Scr->DoOpaqueMove = FALSE; }
251645f5050Syouri		| OPAQUERESIZE	{ list = &Scr->OpaqueMoveList; }
252645f5050Syouri		  win_list
253645f5050Syouri		| OPAQUERESIZE	{ if (Scr->FirstTime) Scr->DoOpaqueResize = TRUE; }
254645f5050Syouri		| NOOPAQUERESIZE	{ list = &Scr->NoOpaqueResizeList; }
255645f5050Syouri		  win_list
256645f5050Syouri		| NOOPAQUERESIZE	{ if (Scr->FirstTime) Scr->DoOpaqueResize = FALSE; }
257645f5050Syouri
258645f5050Syouri		| LEFT_TITLEBUTTON string EQUALS action {
259645f5050Syouri					  GotTitleButton ($2, $4, False);
260645f5050Syouri					}
261645f5050Syouri		| RIGHT_TITLEBUTTON string EQUALS action {
262645f5050Syouri					  GotTitleButton ($2, $4, True);
263645f5050Syouri					}
264645f5050Syouri		| LEFT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, FALSE, TRUE); }
265645f5050Syouri		  binding_list
266645f5050Syouri		| RIGHT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, TRUE, TRUE); }
267645f5050Syouri		  binding_list
268645f5050Syouri		| button string		{
269645f5050Syouri		    root = GetRoot($2, NULLSTR, NULLSTR);
270645f5050Syouri		    AddFuncButton ($1, C_ROOT, 0, F_MENU, root, (MenuItem*) 0);
271645f5050Syouri		}
272645f5050Syouri		| button action		{
273645f5050Syouri			if ($2 == F_MENU) {
274645f5050Syouri			    pull->prev = NULL;
275645f5050Syouri			    AddFuncButton ($1, C_ROOT, 0, $2, pull, (MenuItem*) 0);
276645f5050Syouri			}
277645f5050Syouri			else {
278645f5050Syouri			    MenuItem *item;
279645f5050Syouri
280645f5050Syouri			    root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
281645f5050Syouri			    item = AddToMenu (root, "x", Action,
282645f5050Syouri					NULL, $2, NULLSTR, NULLSTR);
283645f5050Syouri			    AddFuncButton ($1, C_ROOT, 0, $2, (MenuRoot*) 0, item);
284645f5050Syouri			}
285645f5050Syouri			Action = "";
286645f5050Syouri			pull = NULL;
287645f5050Syouri		}
288645f5050Syouri		| string fullkey	{ GotKey($1, $2); }
289645f5050Syouri		| button full		{ GotButton($1, $2); }
290645f5050Syouri
291645f5050Syouri		| DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
292645f5050Syouri		  win_list
293645f5050Syouri		| WORKSPACES {}
294645f5050Syouri		  workspc_list
295645f5050Syouri		| IGNOREMODIFIER {} LB keys  { Scr->IgnoreModifier = mods; mods = 0; } RB
296645f5050Syouri		| OCCUPYALL		{ list = &Scr->OccupyAll; }
297645f5050Syouri		  win_list
298645f5050Syouri		| ICONMENU_DONTSHOW	{ list = &Scr->IconMenuDontShow; }
299645f5050Syouri		  win_list
300645f5050Syouri		| OCCUPYLIST {}
301645f5050Syouri		  occupy_list
302645f5050Syouri		| UNMAPBYMOVINGFARAWAY	{ list = &Scr->UnmapByMovingFarAway; }
303645f5050Syouri		  win_list
304645f5050Syouri		| AUTOSQUEEZE		{ list = &Scr->AutoSqueeze; }
305645f5050Syouri		  win_list
306645f5050Syouri		| STARTSQUEEZED		{ list = &Scr->StartSqueezed; }
307645f5050Syouri		  win_list
308645f5050Syouri		| ALWAYSSQUEEZETOGRAVITY	{ Scr->AlwaysSqueezeToGravity = TRUE; }
309645f5050Syouri		| ALWAYSSQUEEZETOGRAVITY	{ list = &Scr->AlwaysSqueezeToGravityL; }
310645f5050Syouri		  win_list
311645f5050Syouri		| DONTSETINACTIVE	{ list = &Scr->DontSetInactive; }
312645f5050Syouri		  win_list
313645f5050Syouri		| ICONMGR_NOSHOW	{ list = &Scr->IconMgrNoShow; }
314645f5050Syouri		  win_list
315645f5050Syouri		| ICONMGR_NOSHOW	{ Scr->IconManagerDontShow = TRUE; }
316645f5050Syouri		| ICONMGRS		{ list = &Scr->IconMgrs; }
317645f5050Syouri		  iconm_list
318645f5050Syouri		| ICONMGR_SHOW		{ list = &Scr->IconMgrShow; }
319645f5050Syouri		  win_list
320645f5050Syouri		| NO_TITLE_HILITE	{ list = &Scr->NoTitleHighlight; }
321645f5050Syouri		  win_list
322645f5050Syouri		| NO_TITLE_HILITE	{ if (Scr->FirstTime)
323645f5050Syouri						Scr->TitleHighlight = FALSE; }
324645f5050Syouri		| NO_HILITE		{ list = &Scr->NoHighlight; }
325645f5050Syouri		  win_list
326645f5050Syouri		| NO_HILITE		{ if (Scr->FirstTime)
327645f5050Syouri						Scr->Highlight = FALSE; }
328645f5050Syouri		| ALWAYS_ON_TOP		{ list = &Scr->AlwaysOnTopL; }
329645f5050Syouri		  win_list
330645f5050Syouri		| NO_STACKMODE		{ list = &Scr->NoStackModeL; }
331645f5050Syouri		  win_list
332645f5050Syouri		| NO_STACKMODE		{ if (Scr->FirstTime)
333645f5050Syouri						Scr->StackMode = FALSE; }
334645f5050Syouri		| NO_BORDER		{ list = &Scr->NoBorder; }
335645f5050Syouri		  win_list
336645f5050Syouri		| DONT_SAVE		{ list = &Scr->DontSave; }
337645f5050Syouri		  win_list
338645f5050Syouri		| NO_ICON_TITLE		{ list = &Scr->NoIconTitle; }
339645f5050Syouri		  win_list
340645f5050Syouri		| NO_ICON_TITLE		{ if (Scr->FirstTime)
341645f5050Syouri						Scr->NoIconTitlebar = TRUE; }
342645f5050Syouri		| NO_TITLE		{ list = &Scr->NoTitle; }
343645f5050Syouri		  win_list
344645f5050Syouri		| NO_TITLE		{ if (Scr->FirstTime)
345645f5050Syouri						Scr->NoTitlebar = TRUE; }
346645f5050Syouri		| IGNORE_TRANSIENT	{ list = &Scr->IgnoreTransientL; }
347645f5050Syouri		  win_list
348645f5050Syouri		| DONTTOGGLEWORKSPACEMANAGERSTATE  { donttoggleworkspacemanagerstate = TRUE; }
349645f5050Syouri		| MAKE_TITLE		{ list = &Scr->MakeTitle; }
350645f5050Syouri		  win_list
351645f5050Syouri		| START_ICONIFIED	{ list = &Scr->StartIconified; }
352645f5050Syouri		  win_list
353645f5050Syouri		| AUTO_RAISE		{ list = &Scr->AutoRaise; }
354645f5050Syouri		  win_list
355645f5050Syouri		| AUTO_RAISE		{ Scr->AutoRaiseDefault = TRUE; }
356645f5050Syouri		| AUTO_LOWER		{ list = &Scr->AutoLower; }
357645f5050Syouri		  win_list
358645f5050Syouri		| AUTO_LOWER		{ Scr->AutoLowerDefault = TRUE; }
359645f5050Syouri		| MENU string LP string COLON string RP	{
360645f5050Syouri					root = GetRoot($2, $4, $6); }
361645f5050Syouri		  menu			{ root->real_menu = TRUE;}
362645f5050Syouri		| MENU string		{ root = GetRoot($2, NULLSTR, NULLSTR); }
363645f5050Syouri		  menu			{ root->real_menu = TRUE; }
364645f5050Syouri		| FUNCTION string	{ root = GetRoot($2, NULLSTR, NULLSTR); }
365645f5050Syouri		  function
366645f5050Syouri		| ICONS			{ list = &Scr->IconNames; }
367645f5050Syouri		  icon_list
368645f5050Syouri		| COLOR			{ color = COLOR; }
369645f5050Syouri		  color_list
370645f5050Syouri		| SAVECOLOR		{}
371645f5050Syouri		  save_color_list
372645f5050Syouri		| MONOCHROME		{ color = MONOCHROME; }
373645f5050Syouri		  color_list
374645f5050Syouri		| DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
375645f5050Syouri					  if ($2 == F_MENU)
376645f5050Syouri					  {
377645f5050Syouri					    pull->prev = NULL;
378645f5050Syouri					    Scr->DefaultFunction.menu = pull;
379645f5050Syouri					  }
380645f5050Syouri					  else
381645f5050Syouri					  {
382645f5050Syouri					    root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
383645f5050Syouri					    Scr->DefaultFunction.item =
384645f5050Syouri						AddToMenu(root,"x",Action,
385645f5050Syouri							  NULL,$2, NULLSTR, NULLSTR);
386645f5050Syouri					  }
387645f5050Syouri					  Action = "";
388645f5050Syouri					  pull = NULL;
389645f5050Syouri					}
390645f5050Syouri		| WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
391645f5050Syouri					   root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
392645f5050Syouri					   Scr->WindowFunction.item =
393645f5050Syouri						AddToMenu(root,"x",Action,
394645f5050Syouri							  NULL,$2, NULLSTR, NULLSTR);
395645f5050Syouri					   Action = "";
396645f5050Syouri					   pull = NULL;
397645f5050Syouri					}
398645f5050Syouri		| CHANGE_WORKSPACE_FUNCTION action { Scr->ChangeWorkspaceFunction.func = $2;
399645f5050Syouri					   root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
400645f5050Syouri					   Scr->ChangeWorkspaceFunction.item =
401645f5050Syouri						AddToMenu(root,"x",Action,
402645f5050Syouri							  NULL,$2, NULLSTR, NULLSTR);
403645f5050Syouri					   Action = "";
404645f5050Syouri					   pull = NULL;
405645f5050Syouri					}
406645f5050Syouri		| DEICONIFY_FUNCTION action { Scr->DeIconifyFunction.func = $2;
407645f5050Syouri					   root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
408645f5050Syouri					   Scr->DeIconifyFunction.item =
409645f5050Syouri						AddToMenu(root,"x",Action,
410645f5050Syouri							  NULL,$2, NULLSTR, NULLSTR);
411645f5050Syouri					   Action = "";
412645f5050Syouri					   pull = NULL;
413645f5050Syouri					}
414645f5050Syouri		| ICONIFY_FUNCTION action { Scr->IconifyFunction.func = $2;
415645f5050Syouri					   root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
416645f5050Syouri					   Scr->IconifyFunction.item =
417645f5050Syouri						AddToMenu(root,"x",Action,
418645f5050Syouri							  NULL,$2, NULLSTR, NULLSTR);
419645f5050Syouri					   Action = "";
420645f5050Syouri					   pull = NULL;
421645f5050Syouri					}
422645f5050Syouri		| WARP_CURSOR		{ list = &Scr->WarpCursorL; }
423645f5050Syouri		  win_list
424645f5050Syouri		| WARP_CURSOR		{ if (Scr->FirstTime)
425645f5050Syouri					    Scr->WarpCursor = TRUE; }
426645f5050Syouri		| WINDOW_RING		{ list = &Scr->WindowRingL; }
427645f5050Syouri		  win_list
428645f5050Syouri		| WINDOW_RING		{ Scr->WindowRingAll = TRUE; }
429645f5050Syouri		| WINDOW_RING_EXCLUDE	{ if (!Scr->WindowRingL)
430645f5050Syouri					    Scr->WindowRingAll = TRUE;
431645f5050Syouri					  list = &Scr->WindowRingExcludeL; }
432645f5050Syouri		  win_list
433645f5050Syouri		| WINDOW_GEOMETRIES	{  }
434645f5050Syouri		  wingeom_list
435645f5050Syouri		| VIRTUAL_SCREENS	{ }
436645f5050Syouri		  geom_list
437645f5050Syouri		;
438645f5050Syouri
439645f5050Syourinoarg		: KEYWORD		{ if (!do_single_keyword ($1)) {
440645f5050Syouri					    twmrc_error_prefix();
441645f5050Syouri					    fprintf (stderr,
442645f5050Syouri					"unknown singleton keyword %d\n",
443645f5050Syouri						     $1);
444645f5050Syouri					    ParseError = 1;
445645f5050Syouri					  }
446645f5050Syouri					}
447645f5050Syouri		;
448645f5050Syouri
449645f5050Syourisarg		: SKEYWORD string	{ if (!do_string_keyword ($1, $2)) {
450645f5050Syouri					    twmrc_error_prefix();
451645f5050Syouri					    fprintf (stderr,
452645f5050Syouri				"unknown string keyword %d (value \"%s\")\n",
453645f5050Syouri						     $1, $2);
454645f5050Syouri					    ParseError = 1;
455645f5050Syouri					  }
456645f5050Syouri					}
457645f5050Syouri		| SKEYWORD		{ if (!do_string_keyword ($1, defstring)) {
458645f5050Syouri					    twmrc_error_prefix();
459645f5050Syouri					    fprintf (stderr,
460645f5050Syouri				"unknown string keyword %d (no value)\n",
461645f5050Syouri						     $1);
462645f5050Syouri					    ParseError = 1;
463645f5050Syouri					  }
464645f5050Syouri					}
465645f5050Syouri		;
466645f5050Syouri
467645f5050Syourisarg		: SSKEYWORD string string
468645f5050Syouri					{ if (!do_string_string_keyword ($1, $2, $3)) {
469645f5050Syouri					    twmrc_error_prefix();
470645f5050Syouri					    fprintf (stderr,
471645f5050Syouri				"unknown strings keyword %d (value \"%s\" and \"%s\")\n",
472645f5050Syouri						     $1, $2, $3);
473645f5050Syouri					    ParseError = 1;
474645f5050Syouri					  }
475645f5050Syouri					}
476645f5050Syouri		| SSKEYWORD string	{ if (!do_string_string_keyword ($1, $2, defstring)) {
477645f5050Syouri					    twmrc_error_prefix();
478645f5050Syouri					    fprintf (stderr,
479645f5050Syouri				"unknown string keyword %d (value \"%s\")\n",
480645f5050Syouri						     $1, $2);
481645f5050Syouri					    ParseError = 1;
482645f5050Syouri					  }
483645f5050Syouri					}
484645f5050Syouri		| SSKEYWORD		{ if (!do_string_string_keyword ($1, defstring, defstring)) {
485645f5050Syouri					    twmrc_error_prefix();
486645f5050Syouri					    fprintf (stderr,
487645f5050Syouri				"unknown string keyword %d (no value)\n",
488645f5050Syouri						     $1);
489645f5050Syouri					    ParseError = 1;
490645f5050Syouri					  }
491645f5050Syouri					}
492645f5050Syouri		;
493645f5050Syouri
494645f5050Syourinarg		: NKEYWORD number	{ if (!do_number_keyword ($1, $2)) {
495645f5050Syouri					    twmrc_error_prefix();
496645f5050Syouri					    fprintf (stderr,
497645f5050Syouri				"unknown numeric keyword %d (value %d)\n",
498645f5050Syouri						     $1, $2);
499645f5050Syouri					    ParseError = 1;
500645f5050Syouri					  }
501645f5050Syouri					}
502645f5050Syouri		;
503645f5050Syouri
504645f5050Syouri
505645f5050Syouri
506645f5050Syourikeyaction	: EQUALS keys COLON action  { $$ = $4; }
507645f5050Syouri		;
508645f5050Syouri
509645f5050Syourifull		: EQUALS keys COLON contexts COLON action  { $$ = $6; }
510645f5050Syouri		;
511645f5050Syouri
512645f5050Syourifullkey		: EQUALS keys COLON contextkeys COLON action  { $$ = $6; }
513645f5050Syouri		;
514645f5050Syouri
515645f5050Syourikeys		: /* Empty */
516645f5050Syouri		| keys key
517645f5050Syouri		;
518645f5050Syouri
519645f5050Syourikey		: META			{ mods |= Mod1Mask; }
520645f5050Syouri		| SHIFT			{ mods |= ShiftMask; }
521645f5050Syouri		| LOCK			{ mods |= LockMask; }
522645f5050Syouri		| CONTROL		{ mods |= ControlMask; }
523645f5050Syouri		| ALTER number		{ if ($2 < 1 || $2 > 5) {
524645f5050Syouri					     twmrc_error_prefix();
525645f5050Syouri					     fprintf (stderr,
526645f5050Syouri				"bad modifier number (%d), must be 1-5\n",
527645f5050Syouri						      $2);
528645f5050Syouri					     ParseError = 1;
529645f5050Syouri					  } else {
530645f5050Syouri					     mods |= (Alt1Mask << ($2 - 1));
531645f5050Syouri					  }
532645f5050Syouri					}
533645f5050Syouri		| META number		{ if ($2 < 1 || $2 > 5) {
534645f5050Syouri					     twmrc_error_prefix();
535645f5050Syouri					     fprintf (stderr,
536645f5050Syouri				"bad modifier number (%d), must be 1-5\n",
537645f5050Syouri						      $2);
538645f5050Syouri					     ParseError = 1;
539645f5050Syouri					  } else {
540645f5050Syouri					     mods |= (Mod1Mask << ($2 - 1));
541645f5050Syouri					  }
542645f5050Syouri					}
543645f5050Syouri		| OR			{ }
544645f5050Syouri		;
545645f5050Syouri
546645f5050Syouricontexts	: /* Empty */
547645f5050Syouri		| contexts context
548645f5050Syouri		;
549645f5050Syouri
550645f5050Syouricontext		: WINDOW		{ cont |= C_WINDOW_BIT; }
551645f5050Syouri		| TITLE			{ cont |= C_TITLE_BIT; }
552645f5050Syouri		| ICON			{ cont |= C_ICON_BIT; }
553645f5050Syouri		| ROOT			{ cont |= C_ROOT_BIT; }
554645f5050Syouri		| FRAME			{ cont |= C_FRAME_BIT; }
555645f5050Syouri		| WORKSPACE		{ cont |= C_WORKSPACE_BIT; }
556645f5050Syouri		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
557645f5050Syouri		| META			{ cont |= C_ICONMGR_BIT; }
558645f5050Syouri		| ALTER			{ cont |= C_ALTER_BIT; }
559645f5050Syouri		| ALL			{ cont |= C_ALL_BITS; }
560645f5050Syouri		| OR			{  }
561645f5050Syouri		;
562645f5050Syouri
563645f5050Syouricontextkeys	: /* Empty */
564645f5050Syouri		| contextkeys contextkey
565645f5050Syouri		;
566645f5050Syouri
567645f5050Syouricontextkey	: WINDOW		{ cont |= C_WINDOW_BIT; }
568645f5050Syouri		| TITLE			{ cont |= C_TITLE_BIT; }
569645f5050Syouri		| ICON			{ cont |= C_ICON_BIT; }
570645f5050Syouri		| ROOT			{ cont |= C_ROOT_BIT; }
571645f5050Syouri		| FRAME			{ cont |= C_FRAME_BIT; }
572645f5050Syouri		| WORKSPACE		{ cont |= C_WORKSPACE_BIT; }
573645f5050Syouri		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
574645f5050Syouri		| META			{ cont |= C_ICONMGR_BIT; }
575645f5050Syouri		| ALL			{ cont |= C_ALL_BITS; }
576645f5050Syouri		| ALTER			{ cont |= C_ALTER_BIT; }
577645f5050Syouri		| OR			{ }
578645f5050Syouri		| string		{ Name = (char*)$1; cont |= C_NAME_BIT; }
579645f5050Syouri		;
580645f5050Syouri
581645f5050Syouri
582645f5050Syouribinding_list    : LB binding_entries RB {}
583645f5050Syouri		;
584645f5050Syouri
585645f5050Syouribinding_entries : /* Empty */
586645f5050Syouri		| binding_entries binding_entry
587645f5050Syouri		;
588645f5050Syouri
589645f5050Syouribinding_entry   : button keyaction { ModifyCurrentTB($1, mods, $2, Action, pull); mods = 0;}
590645f5050Syouri		| button EQUALS action { ModifyCurrentTB($1, 0, $3, Action, pull);}
591645f5050Syouri		/* The following is deprecated! */
592645f5050Syouri		| button COLON action { ModifyCurrentTB($1, 0, $3, Action, pull);}
593645f5050Syouri		;
594645f5050Syouri
595645f5050Syouri
596645f5050Syouripixmap_list	: LB pixmap_entries RB {}
597645f5050Syouri		;
598645f5050Syouri
599645f5050Syouripixmap_entries	: /* Empty */
600645f5050Syouri		| pixmap_entries pixmap_entry
601645f5050Syouri		;
602645f5050Syouri
603645f5050Syouripixmap_entry	: TITLE_HILITE string { SetHighlightPixmap ($2); }
604645f5050Syouri		;
605645f5050Syouri
606645f5050Syouri
607645f5050Syouricursor_list	: LB cursor_entries RB {}
608645f5050Syouri		;
609645f5050Syouri
610645f5050Syouricursor_entries	: /* Empty */
611645f5050Syouri		| cursor_entries cursor_entry
612645f5050Syouri		;
613645f5050Syouri
614645f5050Syouricursor_entry	: FRAME string string {
615645f5050Syouri			NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
616645f5050Syouri		| FRAME string	{
617645f5050Syouri			NewFontCursor(&Scr->FrameCursor, $2); }
618645f5050Syouri		| TITLE string string {
619645f5050Syouri			NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
620645f5050Syouri		| TITLE string {
621645f5050Syouri			NewFontCursor(&Scr->TitleCursor, $2); }
622645f5050Syouri		| ICON string string {
623645f5050Syouri			NewBitmapCursor(&Scr->IconCursor, $2, $3); }
624645f5050Syouri		| ICON string {
625645f5050Syouri			NewFontCursor(&Scr->IconCursor, $2); }
626645f5050Syouri		| ICONMGR string string {
627645f5050Syouri			NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
628645f5050Syouri		| ICONMGR string {
629645f5050Syouri			NewFontCursor(&Scr->IconMgrCursor, $2); }
630645f5050Syouri		| BUTTON string string {
631645f5050Syouri			NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
632645f5050Syouri		| BUTTON string {
633645f5050Syouri			NewFontCursor(&Scr->ButtonCursor, $2); }
634645f5050Syouri		| MOVE string string {
635645f5050Syouri			NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
636645f5050Syouri		| MOVE string {
637645f5050Syouri			NewFontCursor(&Scr->MoveCursor, $2); }
638645f5050Syouri		| RESIZE string string {
639645f5050Syouri			NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
640645f5050Syouri		| RESIZE string {
641645f5050Syouri			NewFontCursor(&Scr->ResizeCursor, $2); }
642645f5050Syouri		| WAITC string string {
643645f5050Syouri			NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
644645f5050Syouri		| WAITC string {
645645f5050Syouri			NewFontCursor(&Scr->WaitCursor, $2); }
646645f5050Syouri		| MENU string string {
647645f5050Syouri			NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
648645f5050Syouri		| MENU string {
649645f5050Syouri			NewFontCursor(&Scr->MenuCursor, $2); }
650645f5050Syouri		| SELECT string string {
651645f5050Syouri			NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
652645f5050Syouri		| SELECT string {
653645f5050Syouri			NewFontCursor(&Scr->SelectCursor, $2); }
654645f5050Syouri		| KILL string string {
655645f5050Syouri			NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
656645f5050Syouri		| KILL string {
657645f5050Syouri			NewFontCursor(&Scr->DestroyCursor, $2); }
658645f5050Syouri		;
659645f5050Syouri
660645f5050Syouricolor_list	: LB color_entries RB {}
661645f5050Syouri		;
662645f5050Syouri
663645f5050Syouri
664645f5050Syouricolor_entries	: /* Empty */
665645f5050Syouri		| color_entries color_entry
666645f5050Syouri		;
667645f5050Syouri
668645f5050Syouricolor_entry	: CLKEYWORD string	{ if (!do_colorlist_keyword ($1, color,
669645f5050Syouri								     $2)) {
670645f5050Syouri					    twmrc_error_prefix();
671645f5050Syouri					    fprintf (stderr,
672645f5050Syouri			"unhandled list color keyword %d (string \"%s\")\n",
673645f5050Syouri						     $1, $2);
674645f5050Syouri					    ParseError = 1;
675645f5050Syouri					  }
676645f5050Syouri					}
677645f5050Syouri		| CLKEYWORD string	{ list = do_colorlist_keyword($1,color,
678645f5050Syouri								      $2);
679645f5050Syouri					  if (!list) {
680645f5050Syouri					    twmrc_error_prefix();
681645f5050Syouri					    fprintf (stderr,
682645f5050Syouri			"unhandled color list keyword %d (string \"%s\")\n",
683645f5050Syouri						     $1, $2);
684645f5050Syouri					    ParseError = 1;
685645f5050Syouri					  }
686645f5050Syouri					}
687645f5050Syouri		  win_color_list
688645f5050Syouri		| CKEYWORD string	{ if (!do_color_keyword ($1, color,
689645f5050Syouri								 $2)) {
690645f5050Syouri					    twmrc_error_prefix();
691645f5050Syouri					    fprintf (stderr,
692645f5050Syouri			"unhandled color keyword %d (string \"%s\")\n",
693645f5050Syouri						     $1, $2);
694645f5050Syouri					    ParseError = 1;
695645f5050Syouri					  }
696645f5050Syouri					}
697645f5050Syouri		;
698645f5050Syouri
699645f5050Syourisave_color_list : LB s_color_entries RB {}
700645f5050Syouri		;
701645f5050Syouri
702645f5050Syouris_color_entries : /* Empty */
703645f5050Syouri		| s_color_entries s_color_entry
704645f5050Syouri		;
705645f5050Syouri
706645f5050Syouris_color_entry   : string		{ do_string_savecolor(color, $1); }
707645f5050Syouri		| CLKEYWORD		{ do_var_savecolor($1); }
708645f5050Syouri		;
709645f5050Syouri
710645f5050Syouriwin_color_list	: LB win_color_entries RB {}
711645f5050Syouri		;
712645f5050Syouri
713645f5050Syouriwin_color_entries	: /* Empty */
714645f5050Syouri		| win_color_entries win_color_entry
715645f5050Syouri		;
716645f5050Syouri
717645f5050Syouriwin_color_entry	: string string		{ if (Scr->FirstTime &&
718645f5050Syouri					      color == Scr->Monochrome)
719645f5050Syouri					    AddToList(list, $1, $2); }
720645f5050Syouri		;
721645f5050Syouri
722645f5050Syouriwingeom_list	: LB wingeom_entries RB {}
723645f5050Syouri		;
724645f5050Syouri
725645f5050Syouriwingeom_entries	: /* Empty */
726645f5050Syouri		| wingeom_entries wingeom_entry
727645f5050Syouri		;
728645f5050Syouri/* added a ';' after call to AddToList */
729645f5050Syouriwingeom_entry	: string string	{ AddToList (&Scr->WindowGeometries, $1, $2); }
730645f5050Syouri		;
731645f5050Syouri
732645f5050Syourigeom_list	: LB geom_entries RB {}
733645f5050Syouri		;
734645f5050Syouri
735645f5050Syourigeom_entries	: /* Empty */
736645f5050Syouri		| geom_entries geom_entry
737645f5050Syouri		;
738645f5050Syouri
739645f5050Syourigeom_entry	: string { AddToList (&Scr->VirtualScreens, $1, ""); }
740645f5050Syouri		;
741645f5050Syouri
742645f5050Syourisqueeze		: SQUEEZE_TITLE {
743645f5050Syouri				    if (HasShape) Scr->SqueezeTitle = TRUE;
744645f5050Syouri				}
745645f5050Syouri		| SQUEEZE_TITLE { list = &Scr->SqueezeTitleL;
746645f5050Syouri				  if (HasShape && Scr->SqueezeTitle == -1)
747645f5050Syouri				    Scr->SqueezeTitle = TRUE;
748645f5050Syouri				}
749645f5050Syouri		  LB win_sqz_entries RB
750645f5050Syouri		| DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
751645f5050Syouri		| DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
752645f5050Syouri		  win_list
753645f5050Syouri		;
754645f5050Syouri
755645f5050Syouriwin_sqz_entries	: /* Empty */
756645f5050Syouri		| win_sqz_entries string JKEYWORD signed_number number	{
757645f5050Syouri				if (Scr->FirstTime) {
758645f5050Syouri				   do_squeeze_entry (list, $2, $3, $4, $5);
759645f5050Syouri				}
760645f5050Syouri			}
761645f5050Syouri		;
762645f5050Syouri
763645f5050Syouri
764645f5050Syouriiconm_list	: LB iconm_entries RB {}
765645f5050Syouri		;
766645f5050Syouri
767645f5050Syouriiconm_entries	: /* Empty */
768645f5050Syouri		| iconm_entries iconm_entry
769645f5050Syouri		;
770645f5050Syouri
771645f5050Syouriiconm_entry	: string string number	{ if (Scr->FirstTime)
772645f5050Syouri					    AddToList(list, $1, (char *)
773645f5050Syouri						AllocateIconManager($1, NULLSTR,
774645f5050Syouri							$2,$3));
775645f5050Syouri					}
776645f5050Syouri		| string string string number
777645f5050Syouri					{ if (Scr->FirstTime)
778645f5050Syouri					    AddToList(list, $1, (char *)
779645f5050Syouri						AllocateIconManager($1,$2,
780645f5050Syouri						$3, $4));
781645f5050Syouri					}
782645f5050Syouri		;
783645f5050Syouri
784645f5050Syouriworkspc_list	: LB workspc_entries RB {}
785645f5050Syouri		;
786645f5050Syouri
787645f5050Syouriworkspc_entries	: /* Empty */
788645f5050Syouri		| workspc_entries workspc_entry
789645f5050Syouri		;
790645f5050Syouri
791645f5050Syouriworkspc_entry	: string	{
792645f5050Syouri			AddWorkSpace ($1, NULLSTR, NULLSTR, NULLSTR, NULLSTR, NULLSTR);
793645f5050Syouri		}
794645f5050Syouri		| string	{
795645f5050Syouri			curWorkSpc = (char*)$1;
796645f5050Syouri		}
797645f5050Syouri		workapp_list
798645f5050Syouri		;
799645f5050Syouri
800645f5050Syouriworkapp_list	: LB workapp_entries RB {}
801645f5050Syouri		;
802645f5050Syouri
803645f5050Syouriworkapp_entries	: /* Empty */
804645f5050Syouri		| workapp_entries workapp_entry
805645f5050Syouri		;
806645f5050Syouri
807645f5050Syouriworkapp_entry	: string		{
808645f5050Syouri			AddWorkSpace (curWorkSpc, $1, NULLSTR, NULLSTR, NULLSTR, NULLSTR);
809645f5050Syouri		}
810645f5050Syouri		| string string		{
811645f5050Syouri			AddWorkSpace (curWorkSpc, $1, $2, NULLSTR, NULLSTR, NULLSTR);
812645f5050Syouri		}
813645f5050Syouri		| string string string	{
814645f5050Syouri			AddWorkSpace (curWorkSpc, $1, $2, $3, NULLSTR, NULLSTR);
815645f5050Syouri		}
816645f5050Syouri		| string string string string	{
817645f5050Syouri			AddWorkSpace (curWorkSpc, $1, $2, $3, $4, NULLSTR);
818645f5050Syouri		}
819645f5050Syouri		| string string string string string	{
820645f5050Syouri			AddWorkSpace (curWorkSpc, $1, $2, $3, $4, $5);
821645f5050Syouri		}
822645f5050Syouri		;
823645f5050Syouri
824645f5050Syouricurwork		: LB string RB {
825645f5050Syouri		    WMapCreateCurrentBackGround ($2, NULL, NULL, NULL);
826645f5050Syouri		}
827645f5050Syouri		| LB string string RB {
828645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, NULL, NULL);
829645f5050Syouri		}
830645f5050Syouri		| LB string string string RB {
831645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, $4, NULL);
832645f5050Syouri		}
833645f5050Syouri		| LB string string string string RB {
834645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, $4, $5);
835645f5050Syouri		}
836645f5050Syouri		;
837645f5050Syouri
838645f5050Syouridefwork		: LB string RB {
839645f5050Syouri		    WMapCreateDefaultBackGround ($2, NULL, NULL, NULL);
840645f5050Syouri		}
841645f5050Syouri		| LB string string RB {
842645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, NULL, NULL);
843645f5050Syouri		}
844645f5050Syouri		| LB string string string RB {
845645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, $4, NULL);
846645f5050Syouri		}
847645f5050Syouri		| LB string string string string RB {
848645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, $4, $5);
849645f5050Syouri		}
850645f5050Syouri		;
851645f5050Syouri
852645f5050Syouriwin_list	: LB win_entries RB {}
853645f5050Syouri		;
854645f5050Syouri
855645f5050Syouriwin_entries	: /* Empty */
856645f5050Syouri		| win_entries win_entry
857645f5050Syouri		;
858645f5050Syouri
859645f5050Syouriwin_entry	: string		{ if (Scr->FirstTime)
860645f5050Syouri					    AddToList(list, $1, 0);
861645f5050Syouri					}
862645f5050Syouri		;
863645f5050Syouri
864645f5050Syourioccupy_list	: LB occupy_entries RB {}
865645f5050Syouri		;
866645f5050Syouri
867645f5050Syourioccupy_entries	:  /* Empty */
868645f5050Syouri		| occupy_entries occupy_entry
869645f5050Syouri		;
870645f5050Syouri
871645f5050Syourioccupy_entry	: string {client = (char*)$1;}
872645f5050Syouri		  occupy_workspc_list
873645f5050Syouri		| WINDOW    string {client = (char*)$2;}
874645f5050Syouri		  occupy_workspc_list
875645f5050Syouri		| WORKSPACE string {workspace = (char*)$2;}
876645f5050Syouri		  occupy_window_list
877645f5050Syouri		;
878645f5050Syouri
879645f5050Syourioccupy_workspc_list	: LB occupy_workspc_entries RB {}
880645f5050Syouri			;
881645f5050Syouri
882645f5050Syourioccupy_workspc_entries	:   /* Empty */
883645f5050Syouri			| occupy_workspc_entries occupy_workspc_entry
884645f5050Syouri			;
885645f5050Syouri
886645f5050Syourioccupy_workspc_entry	: string {
887645f5050Syouri				AddToClientsList ($1, client);
888645f5050Syouri			  }
889645f5050Syouri			;
890645f5050Syouri
891645f5050Syourioccupy_window_list	: LB occupy_window_entries RB {}
892645f5050Syouri			;
893645f5050Syouri
894645f5050Syourioccupy_window_entries	:   /* Empty */
895645f5050Syouri			| occupy_window_entries occupy_window_entry
896645f5050Syouri			;
897645f5050Syouri
898645f5050Syourioccupy_window_entry	: string {
899645f5050Syouri				AddToClientsList (workspace, $1);
900645f5050Syouri			  }
901645f5050Syouri			;
902645f5050Syouri
903645f5050Syouriicon_list	: LB icon_entries RB {}
904645f5050Syouri		;
905645f5050Syouri
906645f5050Syouriicon_entries	: /* Empty */
907645f5050Syouri		| icon_entries icon_entry
908645f5050Syouri		;
909645f5050Syouri
910645f5050Syouriicon_entry	: string string		{ if (Scr->FirstTime) AddToList(list, $1, $2); }
911645f5050Syouri		;
912645f5050Syouri
913645f5050Syourifunction	: LB function_entries RB {}
914645f5050Syouri		;
915645f5050Syouri
916645f5050Syourifunction_entries: /* Empty */
917645f5050Syouri		| function_entries function_entry
918645f5050Syouri		;
919645f5050Syouri
920645f5050Syourifunction_entry	: action		{ AddToMenu(root, "", Action, NULL, $1,
921645f5050Syouri						    NULLSTR, NULLSTR);
922645f5050Syouri					  Action = "";
923645f5050Syouri					}
924645f5050Syouri		;
925645f5050Syouri
926645f5050Syourimenu		: LB menu_entries RB {lastmenuitem = (MenuItem*) 0;}
927645f5050Syouri		;
928645f5050Syouri
929645f5050Syourimenu_entries	: /* Empty */
930645f5050Syouri		| menu_entries menu_entry
931645f5050Syouri		;
932645f5050Syouri
933645f5050Syourimenu_entry	: string action		{
934645f5050Syouri			if ($2 == F_SEPARATOR) {
935645f5050Syouri			    if (lastmenuitem) lastmenuitem->separated = 1;
936645f5050Syouri			}
937645f5050Syouri			else {
938645f5050Syouri			    lastmenuitem = AddToMenu(root, $1, Action, pull, $2, NULLSTR, NULLSTR);
939645f5050Syouri			    Action = "";
940645f5050Syouri			    pull = NULL;
941645f5050Syouri			}
942645f5050Syouri		}
943645f5050Syouri		| string LP string COLON string RP action {
944645f5050Syouri			if ($7 == F_SEPARATOR) {
945645f5050Syouri			    if (lastmenuitem) lastmenuitem->separated = 1;
946645f5050Syouri			}
947645f5050Syouri			else {
948645f5050Syouri			    lastmenuitem = AddToMenu(root, $1, Action, pull, $7, $3, $5);
949645f5050Syouri			    Action = "";
950645f5050Syouri			    pull = NULL;
951645f5050Syouri			}
952645f5050Syouri		}
953645f5050Syouri		;
954645f5050Syouri
955645f5050Syouriaction		: FKEYWORD	{ $$ = $1; }
956645f5050Syouri		| FSKEYWORD string {
957645f5050Syouri				$$ = $1;
958645f5050Syouri				Action = (char*)$2;
959645f5050Syouri				switch ($1) {
960645f5050Syouri				  case F_MENU:
961645f5050Syouri				    pull = GetRoot ($2, NULLSTR,NULLSTR);
962645f5050Syouri				    pull->prev = root;
963645f5050Syouri				    break;
964645f5050Syouri				  case F_WARPRING:
965645f5050Syouri				    if (!CheckWarpRingArg (Action)) {
966645f5050Syouri					twmrc_error_prefix();
967645f5050Syouri					fprintf (stderr,
968645f5050Syouri			"ignoring invalid f.warptoring argument \"%s\"\n",
969645f5050Syouri						 Action);
970645f5050Syouri					$$ = F_NOP;
971645f5050Syouri				    }
972645f5050Syouri				  case F_WARPTOSCREEN:
973645f5050Syouri				    if (!CheckWarpScreenArg (Action)) {
974645f5050Syouri					twmrc_error_prefix();
975645f5050Syouri					fprintf (stderr,
976645f5050Syouri			"ignoring invalid f.warptoscreen argument \"%s\"\n",
977645f5050Syouri						 Action);
978645f5050Syouri					$$ = F_NOP;
979645f5050Syouri				    }
980645f5050Syouri				    break;
981645f5050Syouri				  case F_COLORMAP:
982645f5050Syouri				    if (CheckColormapArg (Action)) {
983645f5050Syouri					$$ = F_COLORMAP;
984645f5050Syouri				    } else {
985645f5050Syouri					twmrc_error_prefix();
986645f5050Syouri					fprintf (stderr,
987645f5050Syouri			"ignoring invalid f.colormap argument \"%s\"\n",
988645f5050Syouri						 Action);
989645f5050Syouri					$$ = F_NOP;
990645f5050Syouri				    }
991645f5050Syouri				    break;
992645f5050Syouri				} /* end switch */
993645f5050Syouri				   }
994645f5050Syouri		;
995645f5050Syouri
996645f5050Syouri
997645f5050Syourisigned_number	: number		{ $$ = $1; }
998645f5050Syouri		| PLUS number		{ $$ = $2; }
999645f5050Syouri		| MINUS number		{ $$ = -($2); }
1000645f5050Syouri		;
1001645f5050Syouri
1002645f5050Syouributton		: BUTTON number		{ $$ = $2;
1003645f5050Syouri					  if ($2 == 0)
1004645f5050Syouri						yyerror("bad button 0");
1005645f5050Syouri
1006645f5050Syouri					  if ($2 > MAX_BUTTONS)
1007645f5050Syouri					  {
1008645f5050Syouri						$$ = 0;
1009645f5050Syouri						yyerror("button number too large");
1010645f5050Syouri					  }
1011645f5050Syouri					}
1012645f5050Syouri		;
1013645f5050Syouri
1014645f5050Syouristring		: STRING		{ ptr = (char *)malloc(strlen((char*)$1)+1);
1015645f5050Syouri					  strcpy(ptr, $1);
1016645f5050Syouri					  RemoveDQuote(ptr);
1017645f5050Syouri					  $$ = ptr;
1018645f5050Syouri					}
1019645f5050Syouri		;
1020645f5050Syouri
1021645f5050Syourinumber		: NUMBER		{ $$ = $1; }
1022645f5050Syouri		;
1023645f5050Syouri
1024645f5050Syouri%%
1025645f5050Syourivoid yyerror(char *s)
1026645f5050Syouri{
1027645f5050Syouri    twmrc_error_prefix();
1028645f5050Syouri    fprintf (stderr, "error in input file:  %s\n", s ? s : "");
1029645f5050Syouri    ParseError = 1;
1030645f5050Syouri}
1031645f5050Syouri
1032645f5050Syourivoid RemoveDQuote(char *str)
1033645f5050Syouri{
1034645f5050Syouri    register char *i, *o;
1035645f5050Syouri    register int n;
1036645f5050Syouri    register int count;
1037645f5050Syouri
1038645f5050Syouri    for (i=str+1, o=str; *i && *i != '\"'; o++)
1039645f5050Syouri    {
1040645f5050Syouri	if (*i == '\\')
1041645f5050Syouri	{
1042645f5050Syouri	    switch (*++i)
1043645f5050Syouri	    {
1044645f5050Syouri	    case 'n':
1045645f5050Syouri		*o = '\n';
1046645f5050Syouri		i++;
1047645f5050Syouri		break;
1048645f5050Syouri	    case 'b':
1049645f5050Syouri		*o = '\b';
1050645f5050Syouri		i++;
1051645f5050Syouri		break;
1052645f5050Syouri	    case 'r':
1053645f5050Syouri		*o = '\r';
1054645f5050Syouri		i++;
1055645f5050Syouri		break;
1056645f5050Syouri	    case 't':
1057645f5050Syouri		*o = '\t';
1058645f5050Syouri		i++;
1059645f5050Syouri		break;
1060645f5050Syouri	    case 'f':
1061645f5050Syouri		*o = '\f';
1062645f5050Syouri		i++;
1063645f5050Syouri		break;
1064645f5050Syouri	    case '0':
1065645f5050Syouri		if (*++i == 'x')
1066645f5050Syouri		    goto hex;
1067645f5050Syouri		else
1068645f5050Syouri		    --i;
1069645f5050Syouri	    case '1': case '2': case '3':
1070645f5050Syouri	    case '4': case '5': case '6': case '7':
1071645f5050Syouri		n = 0;
1072645f5050Syouri		count = 0;
1073645f5050Syouri		while (*i >= '0' && *i <= '7' && count < 3)
1074645f5050Syouri		{
1075645f5050Syouri		    n = (n<<3) + (*i++ - '0');
1076645f5050Syouri		    count++;
1077645f5050Syouri		}
1078645f5050Syouri		*o = n;
1079645f5050Syouri		break;
1080645f5050Syouri	    hex:
1081645f5050Syouri	    case 'x':
1082645f5050Syouri		n = 0;
1083645f5050Syouri		count = 0;
1084645f5050Syouri		while (i++, count++ < 2)
1085645f5050Syouri		{
1086645f5050Syouri		    if (*i >= '0' && *i <= '9')
1087645f5050Syouri			n = (n<<4) + (*i - '0');
1088645f5050Syouri		    else if (*i >= 'a' && *i <= 'f')
1089645f5050Syouri			n = (n<<4) + (*i - 'a') + 10;
1090645f5050Syouri		    else if (*i >= 'A' && *i <= 'F')
1091645f5050Syouri			n = (n<<4) + (*i - 'A') + 10;
1092645f5050Syouri		    else
1093645f5050Syouri			break;
1094645f5050Syouri		}
1095645f5050Syouri		*o = n;
1096645f5050Syouri		break;
1097645f5050Syouri	    case '\n':
1098645f5050Syouri		i++;	/* punt */
1099645f5050Syouri		o--;	/* to account for o++ at end of loop */
1100645f5050Syouri		break;
1101645f5050Syouri	    case '\"':
1102645f5050Syouri	    case '\'':
1103645f5050Syouri	    case '\\':
1104645f5050Syouri	    default:
1105645f5050Syouri		*o = *i++;
1106645f5050Syouri		break;
1107645f5050Syouri	    }
1108645f5050Syouri	}
1109645f5050Syouri	else
1110645f5050Syouri	    *o = *i++;
1111645f5050Syouri    }
1112645f5050Syouri    *o = '\0';
1113645f5050Syouri}
1114645f5050Syouri
1115645f5050Syouristatic MenuRoot *GetRoot(char *name, char *fore, char *back)
1116645f5050Syouri{
1117645f5050Syouri    MenuRoot *tmp;
1118645f5050Syouri
1119645f5050Syouri    tmp = FindMenuRoot(name);
1120645f5050Syouri    if (tmp == NULL)
1121645f5050Syouri	tmp = NewMenuRoot(name);
1122645f5050Syouri
1123645f5050Syouri    if (fore)
1124645f5050Syouri    {
1125645f5050Syouri	int save;
1126645f5050Syouri
1127645f5050Syouri	save = Scr->FirstTime;
1128645f5050Syouri	Scr->FirstTime = TRUE;
1129645f5050Syouri	GetColor(COLOR, &tmp->highlight.fore, fore);
1130645f5050Syouri	GetColor(COLOR, &tmp->highlight.back, back);
1131645f5050Syouri	Scr->FirstTime = save;
1132645f5050Syouri    }
1133645f5050Syouri
1134645f5050Syouri    return tmp;
1135645f5050Syouri}
1136645f5050Syouri
1137645f5050Syouristatic void GotButton (int butt, int func)
1138645f5050Syouri{
1139645f5050Syouri    int i;
1140645f5050Syouri    MenuItem *item;
1141645f5050Syouri
1142645f5050Syouri    for (i = 0; i < NUM_CONTEXTS; i++) {
1143645f5050Syouri	if ((cont & (1 << i)) == 0) continue;
1144645f5050Syouri
1145645f5050Syouri	if (func == F_MENU) {
1146645f5050Syouri	    pull->prev = NULL;
1147645f5050Syouri	    AddFuncButton (butt, i, mods, func, pull, (MenuItem*) 0);
1148645f5050Syouri	}
1149645f5050Syouri	else {
1150645f5050Syouri	    root = GetRoot (TWM_ROOT, NULLSTR, NULLSTR);
1151645f5050Syouri	    item = AddToMenu (root, "x", Action, NULL, func, NULLSTR, NULLSTR);
1152645f5050Syouri	    AddFuncButton (butt, i, mods, func, (MenuRoot*) 0, item);
1153645f5050Syouri	}
1154645f5050Syouri    }
1155645f5050Syouri
1156645f5050Syouri    Action = "";
1157645f5050Syouri    pull = NULL;
1158645f5050Syouri    cont = 0;
1159645f5050Syouri    mods_used |= mods;
1160645f5050Syouri    mods = 0;
1161645f5050Syouri}
1162645f5050Syouri
1163645f5050Syouristatic void GotKey(char *key, int func)
1164645f5050Syouri{
1165645f5050Syouri    int i;
1166645f5050Syouri
1167645f5050Syouri    for (i = 0; i < NUM_CONTEXTS; i++)
1168645f5050Syouri    {
1169645f5050Syouri	if ((cont & (1 << i)) == 0)
1170645f5050Syouri	  continue;
1171645f5050Syouri
1172645f5050Syouri	if (func == F_MENU) {
1173645f5050Syouri	    pull->prev = NULL;
1174645f5050Syouri	    if (!AddFuncKey (key, i, mods, func, pull, Name, Action)) break;
1175645f5050Syouri	}
1176645f5050Syouri	else
1177645f5050Syouri	if (!AddFuncKey(key, i, mods, func, (MenuRoot*) 0, Name, Action))
1178645f5050Syouri	  break;
1179645f5050Syouri    }
1180645f5050Syouri
1181645f5050Syouri    Action = "";
1182645f5050Syouri    pull = NULL;
1183645f5050Syouri    cont = 0;
1184645f5050Syouri    mods_used |= mods;
1185645f5050Syouri    mods = 0;
1186645f5050Syouri}
1187645f5050Syouri
1188645f5050Syouri
1189645f5050Syouristatic void GotTitleButton (char *bitmapname, int func, Bool rightside)
1190645f5050Syouri{
1191645f5050Syouri    if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) {
1192645f5050Syouri	twmrc_error_prefix();
1193645f5050Syouri	fprintf (stderr,
1194645f5050Syouri		 "unable to create %s titlebutton \"%s\"\n",
1195645f5050Syouri		 rightside ? "right" : "left", bitmapname);
1196645f5050Syouri    }
1197645f5050Syouri    Action = "";
1198645f5050Syouri    pull = NULL;
1199645f5050Syouri}
1200645f5050Syouri
1201645f5050Syouristatic Bool CheckWarpScreenArg (register char *s)
1202645f5050Syouri{
1203645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
1204645f5050Syouri
1205645f5050Syouri    if (strcmp (s,  WARPSCREEN_NEXT) == 0 ||
1206645f5050Syouri	strcmp (s,  WARPSCREEN_PREV) == 0 ||
1207645f5050Syouri	strcmp (s,  WARPSCREEN_BACK) == 0)
1208645f5050Syouri      return True;
1209645f5050Syouri
1210645f5050Syouri    for (; *s && Isascii(*s) && Isdigit(*s); s++) ; /* SUPPRESS 530 */
1211645f5050Syouri    return (*s ? False : True);
1212645f5050Syouri}
1213645f5050Syouri
1214645f5050Syouri
1215645f5050Syouristatic Bool CheckWarpRingArg (register char *s)
1216645f5050Syouri{
1217645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
1218645f5050Syouri
1219645f5050Syouri    if (strcmp (s,  WARPSCREEN_NEXT) == 0 ||
1220645f5050Syouri	strcmp (s,  WARPSCREEN_PREV) == 0)
1221645f5050Syouri      return True;
1222645f5050Syouri
1223645f5050Syouri    return False;
1224645f5050Syouri}
1225645f5050Syouri
1226645f5050Syouri
1227645f5050Syouristatic Bool CheckColormapArg (register char *s)
1228645f5050Syouri{
1229645f5050Syouri    XmuCopyISOLatin1Lowered (s, s);
1230645f5050Syouri
1231645f5050Syouri    if (strcmp (s, COLORMAP_NEXT) == 0 ||
1232645f5050Syouri	strcmp (s, COLORMAP_PREV) == 0 ||
1233645f5050Syouri	strcmp (s, COLORMAP_DEFAULT) == 0)
1234645f5050Syouri      return True;
1235645f5050Syouri
1236645f5050Syouri    return False;
1237645f5050Syouri}
1238645f5050Syouri
1239645f5050Syouri
1240645f5050Syourivoid twmrc_error_prefix (void)
1241645f5050Syouri{
1242645f5050Syouri    fprintf (stderr, "%s:  line %d:  ", ProgramName, twmrc_lineno);
1243645f5050Syouri}
1244