gram.y revision 0bbfda8a
1645f5050Syouri/*
20bbfda8aSnia *       Copyright 1988 by Evans & Sutherland Computer Corporation,
30bbfda8aSnia *                          Salt Lake City, Utah
40bbfda8aSnia *  Portions Copyright 1989 by the Massachusetts Institute of Technology
50bbfda8aSnia *                        Cambridge, Massachusetts
6645f5050Syouri *
70bbfda8aSnia * Copyright 1992 Claude Lecommandeur.
8645f5050Syouri */
9645f5050Syouri
10645f5050Syouri/***********************************************************************
11645f5050Syouri *
12645f5050Syouri * $XConsortium: gram.y,v 1.91 91/02/08 18:21:56 dave Exp $
13645f5050Syouri *
14645f5050Syouri * .twmrc command grammer
15645f5050Syouri *
16645f5050Syouri * 07-Jan-86 Thomas E. LaStrange	File created
17645f5050Syouri * 11-Nov-90 Dave Sternlicht            Adding SaveColors
18645f5050Syouri * 10-Oct-90 David M. Sternlicht        Storing saved colors on root
19645f5050Syouri * 22-April-92 Claude Lecommandeur	modifications for ctwm.
20645f5050Syouri *
21645f5050Syouri ***********************************************************************/
22645f5050Syouri
23645f5050Syouri%{
240bbfda8aSnia#include "ctwm.h"
250bbfda8aSnia
26645f5050Syouri#include <stdio.h>
270bbfda8aSnia#include <string.h>
280bbfda8aSnia#include <strings.h>
290bbfda8aSnia
300bbfda8aSnia#include "otp.h"
310bbfda8aSnia#include "iconmgr.h"
32645f5050Syouri#include "icons.h"
33645f5050Syouri#include "windowbox.h"
340bbfda8aSnia#include "functions_defs.h"
35645f5050Syouri#include "list.h"
36645f5050Syouri#include "util.h"
370bbfda8aSnia#include "occupation.h"
38645f5050Syouri#include "screen.h"
39645f5050Syouri#include "parse.h"
400bbfda8aSnia#include "parse_be.h"
410bbfda8aSnia#include "parse_yacc.h"
42645f5050Syouri#include "cursor.h"
430bbfda8aSnia#include "win_decorations_init.h"
440bbfda8aSnia#include "win_regions.h"
450bbfda8aSnia#include "workspace_config.h"
460bbfda8aSnia#ifdef SOUNDS
470bbfda8aSnia#	include "sound.h"
48645f5050Syouri#endif
49645f5050Syouri
500bbfda8aSniastatic char *curWorkSpc = NULL;
510bbfda8aSniastatic char *client = NULL;
520bbfda8aSniastatic char *workspace = NULL;
530bbfda8aSniastatic MenuItem *lastmenuitem = NULL;
540bbfda8aSniastatic name_list **curplist = NULL;
550bbfda8aSniastatic int color = 0;
560bbfda8aSniaextern char *yytext; // Have to manually pull this in
570bbfda8aSnia
580bbfda8aSniaint yylex(void);
59645f5050Syouri%}
60645f5050Syouri
61645f5050Syouri%union
62645f5050Syouri{
63645f5050Syouri    int num;
64645f5050Syouri    char *ptr;
65645f5050Syouri};
66645f5050Syouri
67645f5050Syouri
68645f5050Syouri%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
69645f5050Syouri%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
70645f5050Syouri%token <num> ICONMGR_SHOW ICONMGR ALTER WINDOW_FUNCTION ZOOM ICONMGRS
71645f5050Syouri%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE
72645f5050Syouri%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING
730bbfda8aSnia%token <num> AUTO_POPUP
74645f5050Syouri%token <num> NO_BORDER NO_ICON_TITLE NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION
75645f5050Syouri%token <num> WINDOW_REGION META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
76645f5050Syouri%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
770bbfda8aSnia%token <num> WARP_ON_DEICONIFY
78645f5050Syouri%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
79645f5050Syouri%token <num> MOVE RESIZE WAITC SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
80645f5050Syouri%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
810bbfda8aSnia%token <num> FNKEYWORD PRIORITY_SWITCHING PRIORITY_NOT_SWITCHING
820bbfda8aSnia%token <num> SKEYWORD SSKEYWORD WINDOW_RING WINDOW_RING_EXCLUDE WARP_CURSOR ERRORTOKEN
830bbfda8aSnia%token <num> GRAVITY /* N/S/E/W */
840bbfda8aSnia%token <num> SIJENUM /* SqueezeTitle justifications, SIJust enum */
85645f5050Syouri%token <num> NO_STACKMODE ALWAYS_ON_TOP WORKSPACE WORKSPACES WORKSPCMGR_GEOMETRY
86645f5050Syouri%token <num> OCCUPYALL OCCUPYLIST MAPWINDOWCURRENTWORKSPACE MAPWINDOWDEFAULTWORKSPACE
870bbfda8aSnia%token <num> ON_TOP_PRIORITY
88645f5050Syouri%token <num> UNMAPBYMOVINGFARAWAY OPAQUEMOVE NOOPAQUEMOVE OPAQUERESIZE NOOPAQUERESIZE
89645f5050Syouri%token <num> DONTSETINACTIVE CHANGE_WORKSPACE_FUNCTION DEICONIFY_FUNCTION ICONIFY_FUNCTION
90645f5050Syouri%token <num> AUTOSQUEEZE STARTSQUEEZED DONT_SAVE AUTO_LOWER ICONMENU_DONTSHOW WINDOW_BOX
91645f5050Syouri%token <num> IGNOREMODIFIER WINDOW_GEOMETRIES ALWAYSSQUEEZETOGRAVITY VIRTUAL_SCREENS
920bbfda8aSnia%token <num> IGNORE_TRANSIENT
930bbfda8aSnia%token <num> EWMH_IGNORE
940bbfda8aSnia%token <num> MWM_IGNORE
950bbfda8aSnia%token <num> RPLAY_SOUNDS
960bbfda8aSnia%token <num> FORCE_FOCUS
97645f5050Syouri%token <ptr> STRING
98645f5050Syouri
99645f5050Syouri%type <ptr> string
100645f5050Syouri%type <num> action button number signed_number keyaction full fullkey
1010bbfda8aSnia%type <num> vgrav hgrav
102645f5050Syouri
103645f5050Syouri%start twmrc
104645f5050Syouri
105645f5050Syouri%%
1060bbfda8aSniatwmrc		: { InitGramVariables(); }
1070bbfda8aSnia                  stmts
108645f5050Syouri		;
109645f5050Syouri
110645f5050Syouristmts		: /* Empty */
111645f5050Syouri		| stmts stmt
112645f5050Syouri		;
113645f5050Syouri
114645f5050Syouristmt		: error
115645f5050Syouri		| noarg
116645f5050Syouri		| sarg
117645f5050Syouri		| narg
118645f5050Syouri		| squeeze
1190bbfda8aSnia		| ICON_REGION string vgrav hgrav number number {
1200bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef");
121645f5050Syouri		  }
1220bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string {
1230bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef");
124645f5050Syouri		  }
1250bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string {
1260bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef");
127645f5050Syouri		  }
1280bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string string {
1290bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9);
130645f5050Syouri		  }
1310bbfda8aSnia		| ICON_REGION string vgrav hgrav number number {
1320bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef");
133645f5050Syouri		  }
134645f5050Syouri		  win_list
1350bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string {
1360bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef");
137645f5050Syouri		  }
138645f5050Syouri		  win_list
1390bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string {
1400bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef");
141645f5050Syouri		  }
142645f5050Syouri		  win_list
1430bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string string {
1440bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9);
145645f5050Syouri		  }
146645f5050Syouri		  win_list
147645f5050Syouri
1480bbfda8aSnia		| WINDOW_REGION string vgrav hgrav {
1490bbfda8aSnia		      curplist = AddWindowRegion ($2, $3, $4);
150645f5050Syouri		  }
151645f5050Syouri		  win_list
152645f5050Syouri
153645f5050Syouri		| WINDOW_BOX string string {
1540bbfda8aSnia		      curplist = addWindowBox ($2, $3);
155645f5050Syouri		  }
156645f5050Syouri		  win_list
157645f5050Syouri
158645f5050Syouri		| ICONMGR_GEOMETRY string number	{ if (Scr->FirstTime)
159645f5050Syouri						  {
160645f5050Syouri						    Scr->iconmgr->geometry= (char*)$2;
161645f5050Syouri						    Scr->iconmgr->columns=$3;
162645f5050Syouri						  }
163645f5050Syouri						}
164645f5050Syouri		| ICONMGR_GEOMETRY string	{ if (Scr->FirstTime)
165645f5050Syouri						    Scr->iconmgr->geometry = (char*)$2;
166645f5050Syouri						}
167645f5050Syouri		| WORKSPCMGR_GEOMETRY string number	{ if (Scr->FirstTime)
168645f5050Syouri				{
169645f5050Syouri				    Scr->workSpaceMgr.geometry= (char*)$2;
170645f5050Syouri				    Scr->workSpaceMgr.columns=$3;
171645f5050Syouri				}
172645f5050Syouri						}
173645f5050Syouri		| WORKSPCMGR_GEOMETRY string	{ if (Scr->FirstTime)
174645f5050Syouri				    Scr->workSpaceMgr.geometry = (char*)$2;
175645f5050Syouri						}
176645f5050Syouri		| MAPWINDOWCURRENTWORKSPACE {}
177645f5050Syouri		  curwork
178645f5050Syouri
179645f5050Syouri		| MAPWINDOWDEFAULTWORKSPACE {}
180645f5050Syouri		  defwork
181645f5050Syouri
182645f5050Syouri		| ZOOM number		{ if (Scr->FirstTime)
183645f5050Syouri					  {
1840bbfda8aSnia						Scr->DoZoom = true;
185645f5050Syouri						Scr->ZoomCount = $2;
186645f5050Syouri					  }
187645f5050Syouri					}
188645f5050Syouri		| ZOOM			{ if (Scr->FirstTime)
1890bbfda8aSnia						Scr->DoZoom = true; }
190645f5050Syouri		| PIXMAPS pixmap_list	{}
191645f5050Syouri		| CURSORS cursor_list	{}
1920bbfda8aSnia		| ICONIFY_BY_UNMAPPING	{ curplist = &Scr->IconifyByUn; }
193645f5050Syouri		  win_list
194645f5050Syouri		| ICONIFY_BY_UNMAPPING	{ if (Scr->FirstTime)
1950bbfda8aSnia		    Scr->IconifyByUnmapping = true; }
196645f5050Syouri
1970bbfda8aSnia		| OPAQUEMOVE	{ curplist = &Scr->OpaqueMoveList; }
198645f5050Syouri		  win_list
1990bbfda8aSnia		| OPAQUEMOVE	{ if (Scr->FirstTime) Scr->DoOpaqueMove = true; }
2000bbfda8aSnia		| NOOPAQUEMOVE	{ curplist = &Scr->NoOpaqueMoveList; }
201645f5050Syouri		  win_list
2020bbfda8aSnia		| NOOPAQUEMOVE	{ if (Scr->FirstTime) Scr->DoOpaqueMove = false; }
2030bbfda8aSnia		| OPAQUERESIZE	{ curplist = &Scr->OpaqueMoveList; }
204645f5050Syouri		  win_list
2050bbfda8aSnia		| OPAQUERESIZE	{ if (Scr->FirstTime) Scr->DoOpaqueResize = true; }
2060bbfda8aSnia		| NOOPAQUERESIZE	{ curplist = &Scr->NoOpaqueResizeList; }
207645f5050Syouri		  win_list
2080bbfda8aSnia		| NOOPAQUERESIZE	{ if (Scr->FirstTime) Scr->DoOpaqueResize = false; }
209645f5050Syouri
210645f5050Syouri		| LEFT_TITLEBUTTON string EQUALS action {
2110bbfda8aSnia					  GotTitleButton ($2, $4, false);
212645f5050Syouri					}
213645f5050Syouri		| RIGHT_TITLEBUTTON string EQUALS action {
2140bbfda8aSnia					  GotTitleButton ($2, $4, true);
215645f5050Syouri					}
2160bbfda8aSnia		| LEFT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, false, true); }
217645f5050Syouri		  binding_list
2180bbfda8aSnia		| RIGHT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, true, true); }
219645f5050Syouri		  binding_list
220645f5050Syouri		| button string		{
2210bbfda8aSnia		    root = GetRoot($2, NULL, NULL);
2220bbfda8aSnia		    AddFuncButton ($1, C_ROOT, 0, F_MENU, root, NULL);
223645f5050Syouri		}
224645f5050Syouri		| button action		{
225645f5050Syouri			if ($2 == F_MENU) {
226645f5050Syouri			    pull->prev = NULL;
2270bbfda8aSnia			    AddFuncButton ($1, C_ROOT, 0, $2, pull, NULL);
228645f5050Syouri			}
229645f5050Syouri			else {
230645f5050Syouri			    MenuItem *item;
231645f5050Syouri
2320bbfda8aSnia			    root = GetRoot(TWM_ROOT,NULL,NULL);
233645f5050Syouri			    item = AddToMenu (root, "x", Action,
2340bbfda8aSnia					NULL, $2, NULL, NULL);
2350bbfda8aSnia			    AddFuncButton ($1, C_ROOT, 0, $2, NULL, item);
236645f5050Syouri			}
237645f5050Syouri			Action = "";
238645f5050Syouri			pull = NULL;
239645f5050Syouri		}
240645f5050Syouri		| string fullkey	{ GotKey($1, $2); }
241645f5050Syouri		| button full		{ GotButton($1, $2); }
242645f5050Syouri
2430bbfda8aSnia		| DONT_ICONIFY_BY_UNMAPPING { curplist = &Scr->DontIconify; }
244645f5050Syouri		  win_list
245645f5050Syouri		| WORKSPACES {}
246645f5050Syouri		  workspc_list
2470bbfda8aSnia		| IGNOREMODIFIER
2480bbfda8aSnia			{ mods = 0; }
2490bbfda8aSnia			LB keys
2500bbfda8aSnia			{ Scr->IgnoreModifier |= mods; mods = 0; }
2510bbfda8aSnia			RB
2520bbfda8aSnia		| OCCUPYALL		{ curplist = &Scr->OccupyAll; }
253645f5050Syouri		  win_list
2540bbfda8aSnia		| ICONMENU_DONTSHOW	{ curplist = &Scr->IconMenuDontShow; }
255645f5050Syouri		  win_list
256645f5050Syouri		| OCCUPYLIST {}
257645f5050Syouri		  occupy_list
2580bbfda8aSnia		| UNMAPBYMOVINGFARAWAY	{ curplist = &Scr->UnmapByMovingFarAway; }
259645f5050Syouri		  win_list
2600bbfda8aSnia		| AUTOSQUEEZE		{ curplist = &Scr->AutoSqueeze; }
261645f5050Syouri		  win_list
2620bbfda8aSnia		| STARTSQUEEZED		{ curplist = &Scr->StartSqueezed; }
263645f5050Syouri		  win_list
2640bbfda8aSnia		| ALWAYSSQUEEZETOGRAVITY	{ Scr->AlwaysSqueezeToGravity = true; }
2650bbfda8aSnia		| ALWAYSSQUEEZETOGRAVITY	{ curplist = &Scr->AlwaysSqueezeToGravityL; }
266645f5050Syouri		  win_list
2670bbfda8aSnia		| DONTSETINACTIVE	{ curplist = &Scr->DontSetInactive; }
268645f5050Syouri		  win_list
2690bbfda8aSnia		| ICONMGR_NOSHOW	{ curplist = &Scr->IconMgrNoShow; }
270645f5050Syouri		  win_list
2710bbfda8aSnia		| ICONMGR_NOSHOW	{ Scr->IconManagerDontShow = true; }
2720bbfda8aSnia		| ICONMGRS		{ curplist = &Scr->IconMgrs; }
273645f5050Syouri		  iconm_list
2740bbfda8aSnia		| ICONMGR_SHOW		{ curplist = &Scr->IconMgrShow; }
275645f5050Syouri		  win_list
2760bbfda8aSnia		| NO_TITLE_HILITE	{ curplist = &Scr->NoTitleHighlight; }
277645f5050Syouri		  win_list
278645f5050Syouri		| NO_TITLE_HILITE	{ if (Scr->FirstTime)
2790bbfda8aSnia						Scr->TitleHighlight = false; }
2800bbfda8aSnia		| NO_HILITE		{ curplist = &Scr->NoHighlight; }
281645f5050Syouri		  win_list
282645f5050Syouri		| NO_HILITE		{ if (Scr->FirstTime)
2830bbfda8aSnia						Scr->Highlight = false; }
2840bbfda8aSnia                | ON_TOP_PRIORITY signed_number
2850bbfda8aSnia                                        { OtpScrSetZero(Scr, WinWin, $2); }
2860bbfda8aSnia		| ON_TOP_PRIORITY ICONS signed_number
2870bbfda8aSnia                                        { OtpScrSetZero(Scr, IconWin, $3); }
2880bbfda8aSnia		| ON_TOP_PRIORITY signed_number
2890bbfda8aSnia                                        { curplist = OtpScrPriorityL(Scr, WinWin, $2); }
2900bbfda8aSnia		  win_list
2910bbfda8aSnia		| ON_TOP_PRIORITY ICONS signed_number
2920bbfda8aSnia                                        { curplist = OtpScrPriorityL(Scr, IconWin, $3); }
2930bbfda8aSnia		  win_list
2940bbfda8aSnia		| ALWAYS_ON_TOP		{ curplist = OtpScrPriorityL(Scr, WinWin, 8); }
2950bbfda8aSnia		  win_list
2960bbfda8aSnia		| PRIORITY_SWITCHING	{ OtpScrSetSwitching(Scr, WinWin, false);
2970bbfda8aSnia		                          curplist = OtpScrSwitchingL(Scr, WinWin); }
2980bbfda8aSnia		  win_list
2990bbfda8aSnia		| PRIORITY_NOT_SWITCHING { OtpScrSetSwitching(Scr, WinWin, true);
3000bbfda8aSnia		                          curplist = OtpScrSwitchingL(Scr, WinWin); }
301645f5050Syouri		  win_list
3020bbfda8aSnia		| PRIORITY_SWITCHING ICONS
3030bbfda8aSnia                                        { OtpScrSetSwitching(Scr, IconWin, false);
3040bbfda8aSnia                                        curplist = OtpScrSwitchingL(Scr, IconWin); }
3050bbfda8aSnia		  win_list
3060bbfda8aSnia		| PRIORITY_NOT_SWITCHING ICONS
3070bbfda8aSnia                                        { OtpScrSetSwitching(Scr, IconWin, true);
3080bbfda8aSnia		                          curplist = OtpScrSwitchingL(Scr, IconWin); }
3090bbfda8aSnia		  win_list
3100bbfda8aSnia
3110bbfda8aSnia		  win_list
3120bbfda8aSnia		| NO_STACKMODE		{ curplist = &Scr->NoStackModeL; }
313645f5050Syouri		  win_list
314645f5050Syouri		| NO_STACKMODE		{ if (Scr->FirstTime)
3150bbfda8aSnia						Scr->StackMode = false; }
3160bbfda8aSnia		| NO_BORDER		{ curplist = &Scr->NoBorder; }
3170bbfda8aSnia		  win_list
3180bbfda8aSnia		| AUTO_POPUP		{ Scr->AutoPopup = true; }
3190bbfda8aSnia		| AUTO_POPUP		{ curplist = &Scr->AutoPopupL; }
320645f5050Syouri		  win_list
3210bbfda8aSnia		| DONT_SAVE		{ curplist = &Scr->DontSave; }
322645f5050Syouri		  win_list
3230bbfda8aSnia		| NO_ICON_TITLE		{ curplist = &Scr->NoIconTitle; }
324645f5050Syouri		  win_list
325645f5050Syouri		| NO_ICON_TITLE		{ if (Scr->FirstTime)
3260bbfda8aSnia						Scr->NoIconTitlebar = true; }
3270bbfda8aSnia		| NO_TITLE		{ curplist = &Scr->NoTitle; }
328645f5050Syouri		  win_list
329645f5050Syouri		| NO_TITLE		{ if (Scr->FirstTime)
3300bbfda8aSnia						Scr->NoTitlebar = true; }
3310bbfda8aSnia		| IGNORE_TRANSIENT	{ curplist = &Scr->IgnoreTransientL; }
3320bbfda8aSnia		  win_list
3330bbfda8aSnia		| MAKE_TITLE		{ curplist = &Scr->MakeTitle; }
334645f5050Syouri		  win_list
3350bbfda8aSnia		| START_ICONIFIED	{ curplist = &Scr->StartIconified; }
336645f5050Syouri		  win_list
3370bbfda8aSnia		| AUTO_RAISE		{ curplist = &Scr->AutoRaise; }
338645f5050Syouri		  win_list
3390bbfda8aSnia		| AUTO_RAISE		{ Scr->AutoRaiseDefault = true; }
3400bbfda8aSnia		| WARP_ON_DEICONIFY	{ curplist = &Scr->WarpOnDeIconify; }
341645f5050Syouri		  win_list
3420bbfda8aSnia		| AUTO_LOWER		{ curplist = &Scr->AutoLower; }
343645f5050Syouri		  win_list
3440bbfda8aSnia		| AUTO_LOWER		{ Scr->AutoLowerDefault = true; }
345645f5050Syouri		| MENU string LP string COLON string RP	{
346645f5050Syouri					root = GetRoot($2, $4, $6); }
3470bbfda8aSnia		  menu			{ root->real_menu = true;}
3480bbfda8aSnia		| MENU string		{ root = GetRoot($2, NULL, NULL); }
3490bbfda8aSnia		  menu			{ root->real_menu = true; }
3500bbfda8aSnia		| FUNCTION string	{ root = GetRoot($2, NULL, NULL); }
351645f5050Syouri		  function
3520bbfda8aSnia		| ICONS			{ curplist = &Scr->IconNames; }
353645f5050Syouri		  icon_list
354645f5050Syouri		| COLOR			{ color = COLOR; }
355645f5050Syouri		  color_list
356645f5050Syouri		| SAVECOLOR		{}
357645f5050Syouri		  save_color_list
358645f5050Syouri		| MONOCHROME		{ color = MONOCHROME; }
359645f5050Syouri		  color_list
360645f5050Syouri		| DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
361645f5050Syouri					  if ($2 == F_MENU)
362645f5050Syouri					  {
363645f5050Syouri					    pull->prev = NULL;
364645f5050Syouri					    Scr->DefaultFunction.menu = pull;
365645f5050Syouri					  }
366645f5050Syouri					  else
367645f5050Syouri					  {
3680bbfda8aSnia					    root = GetRoot(TWM_ROOT,NULL,NULL);
369645f5050Syouri					    Scr->DefaultFunction.item =
370645f5050Syouri						AddToMenu(root,"x",Action,
3710bbfda8aSnia							  NULL,$2, NULL, NULL);
372645f5050Syouri					  }
373645f5050Syouri					  Action = "";
374645f5050Syouri					  pull = NULL;
375645f5050Syouri					}
376645f5050Syouri		| WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
3770bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
378645f5050Syouri					   Scr->WindowFunction.item =
379645f5050Syouri						AddToMenu(root,"x",Action,
3800bbfda8aSnia							  NULL,$2, NULL, NULL);
381645f5050Syouri					   Action = "";
382645f5050Syouri					   pull = NULL;
383645f5050Syouri					}
384645f5050Syouri		| CHANGE_WORKSPACE_FUNCTION action { Scr->ChangeWorkspaceFunction.func = $2;
3850bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
386645f5050Syouri					   Scr->ChangeWorkspaceFunction.item =
387645f5050Syouri						AddToMenu(root,"x",Action,
3880bbfda8aSnia							  NULL,$2, NULL, NULL);
389645f5050Syouri					   Action = "";
390645f5050Syouri					   pull = NULL;
391645f5050Syouri					}
392645f5050Syouri		| DEICONIFY_FUNCTION action { Scr->DeIconifyFunction.func = $2;
3930bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
394645f5050Syouri					   Scr->DeIconifyFunction.item =
395645f5050Syouri						AddToMenu(root,"x",Action,
3960bbfda8aSnia							  NULL,$2, NULL, NULL);
397645f5050Syouri					   Action = "";
398645f5050Syouri					   pull = NULL;
399645f5050Syouri					}
400645f5050Syouri		| ICONIFY_FUNCTION action { Scr->IconifyFunction.func = $2;
4010bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
402645f5050Syouri					   Scr->IconifyFunction.item =
403645f5050Syouri						AddToMenu(root,"x",Action,
4040bbfda8aSnia							  NULL,$2, NULL, NULL);
405645f5050Syouri					   Action = "";
406645f5050Syouri					   pull = NULL;
407645f5050Syouri					}
4080bbfda8aSnia		| WARP_CURSOR		{ curplist = &Scr->WarpCursorL; }
409645f5050Syouri		  win_list
410645f5050Syouri		| WARP_CURSOR		{ if (Scr->FirstTime)
4110bbfda8aSnia					    Scr->WarpCursor = true; }
4120bbfda8aSnia		| WINDOW_RING		{ curplist = &Scr->WindowRingL; }
413645f5050Syouri		  win_list
4140bbfda8aSnia		| WINDOW_RING		{ Scr->WindowRingAll = true; }
415645f5050Syouri		| WINDOW_RING_EXCLUDE	{ if (!Scr->WindowRingL)
4160bbfda8aSnia					    Scr->WindowRingAll = true;
4170bbfda8aSnia					  curplist = &Scr->WindowRingExcludeL; }
418645f5050Syouri		  win_list
419645f5050Syouri		| WINDOW_GEOMETRIES	{  }
420645f5050Syouri		  wingeom_list
421645f5050Syouri		| VIRTUAL_SCREENS	{ }
422645f5050Syouri		  geom_list
4230bbfda8aSnia		| EWMH_IGNORE		{ }
4240bbfda8aSnia		  ewmh_ignore_list
4250bbfda8aSnia		| MWM_IGNORE		{ }
4260bbfda8aSnia		  mwm_ignore_list
4270bbfda8aSnia		| RPLAY_SOUNDS { }
4280bbfda8aSnia		  rplay_sounds_list
4290bbfda8aSnia		| FORCE_FOCUS { Scr->ForceFocus = true; }
4300bbfda8aSnia		| FORCE_FOCUS { curplist = &Scr->ForceFocusL; }
4310bbfda8aSnia		  win_list
432645f5050Syouri		;
433645f5050Syouri
434645f5050Syourinoarg		: KEYWORD		{ if (!do_single_keyword ($1)) {
435645f5050Syouri					    twmrc_error_prefix();
436645f5050Syouri					    fprintf (stderr,
437645f5050Syouri					"unknown singleton keyword %d\n",
438645f5050Syouri						     $1);
4390bbfda8aSnia					    ParseError = true;
440645f5050Syouri					  }
441645f5050Syouri					}
442645f5050Syouri		;
443645f5050Syouri
444645f5050Syourisarg		: SKEYWORD string	{ if (!do_string_keyword ($1, $2)) {
445645f5050Syouri					    twmrc_error_prefix();
446645f5050Syouri					    fprintf (stderr,
447645f5050Syouri				"unknown string keyword %d (value \"%s\")\n",
448645f5050Syouri						     $1, $2);
4490bbfda8aSnia					    ParseError = true;
450645f5050Syouri					  }
451645f5050Syouri					}
4520bbfda8aSnia		| SKEYWORD		{ if (!do_string_keyword ($1, DEFSTRING)) {
453645f5050Syouri					    twmrc_error_prefix();
454645f5050Syouri					    fprintf (stderr,
455645f5050Syouri				"unknown string keyword %d (no value)\n",
456645f5050Syouri						     $1);
4570bbfda8aSnia					    ParseError = true;
458645f5050Syouri					  }
459645f5050Syouri					}
460645f5050Syouri		;
461645f5050Syouri
462645f5050Syourisarg		: SSKEYWORD string string
463645f5050Syouri					{ if (!do_string_string_keyword ($1, $2, $3)) {
464645f5050Syouri					    twmrc_error_prefix();
465645f5050Syouri					    fprintf (stderr,
466645f5050Syouri				"unknown strings keyword %d (value \"%s\" and \"%s\")\n",
467645f5050Syouri						     $1, $2, $3);
4680bbfda8aSnia					    ParseError = true;
469645f5050Syouri					  }
470645f5050Syouri					}
4710bbfda8aSnia		| SSKEYWORD string	{ if (!do_string_string_keyword ($1, $2, NULL)) {
472645f5050Syouri					    twmrc_error_prefix();
473645f5050Syouri					    fprintf (stderr,
474645f5050Syouri				"unknown string keyword %d (value \"%s\")\n",
475645f5050Syouri						     $1, $2);
4760bbfda8aSnia					    ParseError = true;
477645f5050Syouri					  }
478645f5050Syouri					}
4790bbfda8aSnia		| SSKEYWORD		{ if (!do_string_string_keyword ($1, NULL, NULL)) {
480645f5050Syouri					    twmrc_error_prefix();
481645f5050Syouri					    fprintf (stderr,
482645f5050Syouri				"unknown string keyword %d (no value)\n",
483645f5050Syouri						     $1);
4840bbfda8aSnia					    ParseError = true;
485645f5050Syouri					  }
486645f5050Syouri					}
487645f5050Syouri		;
488645f5050Syouri
489645f5050Syourinarg		: NKEYWORD number	{ if (!do_number_keyword ($1, $2)) {
490645f5050Syouri					    twmrc_error_prefix();
491645f5050Syouri					    fprintf (stderr,
492645f5050Syouri				"unknown numeric keyword %d (value %d)\n",
493645f5050Syouri						     $1, $2);
4940bbfda8aSnia					    ParseError = true;
495645f5050Syouri					  }
496645f5050Syouri					}
497645f5050Syouri		;
498645f5050Syouri
499645f5050Syouri
500645f5050Syouri
501645f5050Syourikeyaction	: EQUALS keys COLON action  { $$ = $4; }
502645f5050Syouri		;
503645f5050Syouri
504645f5050Syourifull		: EQUALS keys COLON contexts COLON action  { $$ = $6; }
505645f5050Syouri		;
506645f5050Syouri
507645f5050Syourifullkey		: EQUALS keys COLON contextkeys COLON action  { $$ = $6; }
508645f5050Syouri		;
509645f5050Syouri
510645f5050Syourikeys		: /* Empty */
511645f5050Syouri		| keys key
512645f5050Syouri		;
513645f5050Syouri
514645f5050Syourikey		: META			{ mods |= Mod1Mask; }
515645f5050Syouri		| SHIFT			{ mods |= ShiftMask; }
516645f5050Syouri		| LOCK			{ mods |= LockMask; }
517645f5050Syouri		| CONTROL		{ mods |= ControlMask; }
518645f5050Syouri		| ALTER number		{ if ($2 < 1 || $2 > 5) {
519645f5050Syouri					     twmrc_error_prefix();
520645f5050Syouri					     fprintf (stderr,
5210bbfda8aSnia				"bad altkeymap number (%d), must be 1-5\n",
522645f5050Syouri						      $2);
5230bbfda8aSnia					     ParseError = true;
524645f5050Syouri					  } else {
525645f5050Syouri					     mods |= (Alt1Mask << ($2 - 1));
526645f5050Syouri					  }
527645f5050Syouri					}
528645f5050Syouri		| META number		{ if ($2 < 1 || $2 > 5) {
529645f5050Syouri					     twmrc_error_prefix();
530645f5050Syouri					     fprintf (stderr,
531645f5050Syouri				"bad modifier number (%d), must be 1-5\n",
532645f5050Syouri						      $2);
5330bbfda8aSnia					     ParseError = true;
534645f5050Syouri					  } else {
535645f5050Syouri					     mods |= (Mod1Mask << ($2 - 1));
536645f5050Syouri					  }
537645f5050Syouri					}
538645f5050Syouri		| OR			{ }
539645f5050Syouri		;
540645f5050Syouri
5410bbfda8aSniavgrav	: GRAVITY {
5420bbfda8aSnia			switch($1) {
5430bbfda8aSnia				case GRAV_NORTH:
5440bbfda8aSnia				case GRAV_SOUTH:
5450bbfda8aSnia					/* OK */
5460bbfda8aSnia					$$ = $1;
5470bbfda8aSnia					break;
5480bbfda8aSnia				default:
5490bbfda8aSnia					twmrc_error_prefix();
5500bbfda8aSnia					fprintf(stderr, "Bad vertical gravity '%s'\n", yytext);
5510bbfda8aSnia					ParseError = true;
5520bbfda8aSnia					YYERROR;
5530bbfda8aSnia			}
5540bbfda8aSnia		}
5550bbfda8aSnia
5560bbfda8aSniahgrav	: GRAVITY {
5570bbfda8aSnia			switch($1) {
5580bbfda8aSnia				case GRAV_EAST:
5590bbfda8aSnia				case GRAV_WEST:
5600bbfda8aSnia					/* OK */
5610bbfda8aSnia					$$ = $1;
5620bbfda8aSnia					break;
5630bbfda8aSnia				default:
5640bbfda8aSnia					twmrc_error_prefix();
5650bbfda8aSnia					fprintf(stderr, "Bad horiz gravity '%s'\n", yytext);
5660bbfda8aSnia					ParseError = true;
5670bbfda8aSnia					YYERROR;
5680bbfda8aSnia			}
5690bbfda8aSnia		}
5700bbfda8aSnia
571645f5050Syouricontexts	: /* Empty */
572645f5050Syouri		| contexts context
573645f5050Syouri		;
574645f5050Syouri
575645f5050Syouricontext		: WINDOW		{ cont |= C_WINDOW_BIT; }
576645f5050Syouri		| TITLE			{ cont |= C_TITLE_BIT; }
577645f5050Syouri		| ICON			{ cont |= C_ICON_BIT; }
578645f5050Syouri		| ROOT			{ cont |= C_ROOT_BIT; }
579645f5050Syouri		| FRAME			{ cont |= C_FRAME_BIT; }
580645f5050Syouri		| WORKSPACE		{ cont |= C_WORKSPACE_BIT; }
581645f5050Syouri		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
582645f5050Syouri		| META			{ cont |= C_ICONMGR_BIT; }
583645f5050Syouri		| ALTER			{ cont |= C_ALTER_BIT; }
584645f5050Syouri		| ALL			{ cont |= C_ALL_BITS; }
5850bbfda8aSnia		| OR			{ }
586645f5050Syouri		;
587645f5050Syouri
588645f5050Syouricontextkeys	: /* Empty */
589645f5050Syouri		| contextkeys contextkey
590645f5050Syouri		;
591645f5050Syouri
592645f5050Syouricontextkey	: WINDOW		{ cont |= C_WINDOW_BIT; }
593645f5050Syouri		| TITLE			{ cont |= C_TITLE_BIT; }
594645f5050Syouri		| ICON			{ cont |= C_ICON_BIT; }
595645f5050Syouri		| ROOT			{ cont |= C_ROOT_BIT; }
596645f5050Syouri		| FRAME			{ cont |= C_FRAME_BIT; }
597645f5050Syouri		| WORKSPACE		{ cont |= C_WORKSPACE_BIT; }
598645f5050Syouri		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
599645f5050Syouri		| META			{ cont |= C_ICONMGR_BIT; }
600645f5050Syouri		| ALTER			{ cont |= C_ALTER_BIT; }
6010bbfda8aSnia		| ALL			{ cont |= C_ALL_BITS; }
602645f5050Syouri		| OR			{ }
603645f5050Syouri		| string		{ Name = (char*)$1; cont |= C_NAME_BIT; }
604645f5050Syouri		;
605645f5050Syouri
606645f5050Syouri
607645f5050Syouribinding_list    : LB binding_entries RB {}
608645f5050Syouri		;
609645f5050Syouri
610645f5050Syouribinding_entries : /* Empty */
611645f5050Syouri		| binding_entries binding_entry
612645f5050Syouri		;
613645f5050Syouri
6140bbfda8aSniabinding_entry   : button keyaction { SetCurrentTBAction($1, mods, $2, Action, pull); mods = 0;}
6150bbfda8aSnia		| button EQUALS action { SetCurrentTBAction($1, 0, $3, Action, pull);}
6160bbfda8aSnia		| button COLON action {
6170bbfda8aSnia			/* Deprecated since 3.8, no longer supported */
6180bbfda8aSnia			yyerror("Title buttons specifications without = are no "
6190bbfda8aSnia			        "longer supported.");
6200bbfda8aSnia		}
621645f5050Syouri		;
622645f5050Syouri
623645f5050Syouri
624645f5050Syouripixmap_list	: LB pixmap_entries RB {}
625645f5050Syouri		;
626645f5050Syouri
627645f5050Syouripixmap_entries	: /* Empty */
628645f5050Syouri		| pixmap_entries pixmap_entry
629645f5050Syouri		;
630645f5050Syouri
6310bbfda8aSniapixmap_entry	: TITLE_HILITE string { Scr->HighlightPixmapName = strdup($2); }
632645f5050Syouri		;
633645f5050Syouri
634645f5050Syouri
635645f5050Syouricursor_list	: LB cursor_entries RB {}
636645f5050Syouri		;
637645f5050Syouri
638645f5050Syouricursor_entries	: /* Empty */
639645f5050Syouri		| cursor_entries cursor_entry
640645f5050Syouri		;
641645f5050Syouri
642645f5050Syouricursor_entry	: FRAME string string {
643645f5050Syouri			NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
644645f5050Syouri		| FRAME string	{
645645f5050Syouri			NewFontCursor(&Scr->FrameCursor, $2); }
646645f5050Syouri		| TITLE string string {
647645f5050Syouri			NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
648645f5050Syouri		| TITLE string {
649645f5050Syouri			NewFontCursor(&Scr->TitleCursor, $2); }
650645f5050Syouri		| ICON string string {
651645f5050Syouri			NewBitmapCursor(&Scr->IconCursor, $2, $3); }
652645f5050Syouri		| ICON string {
653645f5050Syouri			NewFontCursor(&Scr->IconCursor, $2); }
654645f5050Syouri		| ICONMGR string string {
655645f5050Syouri			NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
656645f5050Syouri		| ICONMGR string {
657645f5050Syouri			NewFontCursor(&Scr->IconMgrCursor, $2); }
658645f5050Syouri		| BUTTON string string {
659645f5050Syouri			NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
660645f5050Syouri		| BUTTON string {
661645f5050Syouri			NewFontCursor(&Scr->ButtonCursor, $2); }
662645f5050Syouri		| MOVE string string {
663645f5050Syouri			NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
664645f5050Syouri		| MOVE string {
665645f5050Syouri			NewFontCursor(&Scr->MoveCursor, $2); }
666645f5050Syouri		| RESIZE string string {
667645f5050Syouri			NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
668645f5050Syouri		| RESIZE string {
669645f5050Syouri			NewFontCursor(&Scr->ResizeCursor, $2); }
670645f5050Syouri		| WAITC string string {
671645f5050Syouri			NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
672645f5050Syouri		| WAITC string {
673645f5050Syouri			NewFontCursor(&Scr->WaitCursor, $2); }
674645f5050Syouri		| MENU string string {
675645f5050Syouri			NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
676645f5050Syouri		| MENU string {
677645f5050Syouri			NewFontCursor(&Scr->MenuCursor, $2); }
678645f5050Syouri		| SELECT string string {
679645f5050Syouri			NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
680645f5050Syouri		| SELECT string {
681645f5050Syouri			NewFontCursor(&Scr->SelectCursor, $2); }
682645f5050Syouri		| KILL string string {
683645f5050Syouri			NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
684645f5050Syouri		| KILL string {
685645f5050Syouri			NewFontCursor(&Scr->DestroyCursor, $2); }
686645f5050Syouri		;
687645f5050Syouri
688645f5050Syouricolor_list	: LB color_entries RB {}
689645f5050Syouri		;
690645f5050Syouri
691645f5050Syouri
692645f5050Syouricolor_entries	: /* Empty */
693645f5050Syouri		| color_entries color_entry
694645f5050Syouri		;
695645f5050Syouri
696645f5050Syouricolor_entry	: CLKEYWORD string	{ if (!do_colorlist_keyword ($1, color,
697645f5050Syouri								     $2)) {
698645f5050Syouri					    twmrc_error_prefix();
699645f5050Syouri					    fprintf (stderr,
700645f5050Syouri			"unhandled list color keyword %d (string \"%s\")\n",
701645f5050Syouri						     $1, $2);
7020bbfda8aSnia					    ParseError = true;
703645f5050Syouri					  }
704645f5050Syouri					}
7050bbfda8aSnia		| CLKEYWORD string	{ curplist = do_colorlist_keyword($1,color,
706645f5050Syouri								      $2);
7070bbfda8aSnia					  if (!curplist) {
708645f5050Syouri					    twmrc_error_prefix();
709645f5050Syouri					    fprintf (stderr,
710645f5050Syouri			"unhandled color list keyword %d (string \"%s\")\n",
711645f5050Syouri						     $1, $2);
7120bbfda8aSnia					    ParseError = true;
713645f5050Syouri					  }
714645f5050Syouri					}
715645f5050Syouri		  win_color_list
716645f5050Syouri		| CKEYWORD string	{ if (!do_color_keyword ($1, color,
717645f5050Syouri								 $2)) {
718645f5050Syouri					    twmrc_error_prefix();
719645f5050Syouri					    fprintf (stderr,
720645f5050Syouri			"unhandled color keyword %d (string \"%s\")\n",
721645f5050Syouri						     $1, $2);
7220bbfda8aSnia					    ParseError = true;
723645f5050Syouri					  }
724645f5050Syouri					}
725645f5050Syouri		;
726645f5050Syouri
727645f5050Syourisave_color_list : LB s_color_entries RB {}
728645f5050Syouri		;
729645f5050Syouri
730645f5050Syouris_color_entries : /* Empty */
731645f5050Syouri		| s_color_entries s_color_entry
732645f5050Syouri		;
733645f5050Syouri
734645f5050Syouris_color_entry   : string		{ do_string_savecolor(color, $1); }
735645f5050Syouri		| CLKEYWORD		{ do_var_savecolor($1); }
736645f5050Syouri		;
737645f5050Syouri
738645f5050Syouriwin_color_list	: LB win_color_entries RB {}
739645f5050Syouri		;
740645f5050Syouri
741645f5050Syouriwin_color_entries	: /* Empty */
742645f5050Syouri		| win_color_entries win_color_entry
743645f5050Syouri		;
744645f5050Syouri
745645f5050Syouriwin_color_entry	: string string		{ if (Scr->FirstTime &&
746645f5050Syouri					      color == Scr->Monochrome)
7470bbfda8aSnia					    AddToList(curplist, $1, $2); }
748645f5050Syouri		;
749645f5050Syouri
750645f5050Syouriwingeom_list	: LB wingeom_entries RB {}
751645f5050Syouri		;
752645f5050Syouri
753645f5050Syouriwingeom_entries	: /* Empty */
754645f5050Syouri		| wingeom_entries wingeom_entry
755645f5050Syouri		;
756645f5050Syouri/* added a ';' after call to AddToList */
757645f5050Syouriwingeom_entry	: string string	{ AddToList (&Scr->WindowGeometries, $1, $2); }
758645f5050Syouri		;
759645f5050Syouri
760645f5050Syourigeom_list	: LB geom_entries RB {}
761645f5050Syouri		;
762645f5050Syouri
763645f5050Syourigeom_entries	: /* Empty */
764645f5050Syouri		| geom_entries geom_entry
765645f5050Syouri		;
766645f5050Syouri
767645f5050Syourigeom_entry	: string { AddToList (&Scr->VirtualScreens, $1, ""); }
768645f5050Syouri		;
769645f5050Syouri
7700bbfda8aSnia
7710bbfda8aSniaewmh_ignore_list	: LB ewmh_ignore_entries RB { proc_ewmh_ignore(); }
7720bbfda8aSnia		;
7730bbfda8aSnia
7740bbfda8aSniaewmh_ignore_entries	: /* Empty */
7750bbfda8aSnia		| ewmh_ignore_entries ewmh_ignore_entry
7760bbfda8aSnia		;
7770bbfda8aSnia
7780bbfda8aSniaewmh_ignore_entry	: string { add_ewmh_ignore($1); }
7790bbfda8aSnia		;
7800bbfda8aSnia
7810bbfda8aSnia
7820bbfda8aSniamwm_ignore_list	: LB mwm_ignore_entries RB { proc_mwm_ignore(); }
7830bbfda8aSnia		;
7840bbfda8aSnia
7850bbfda8aSniamwm_ignore_entries	: /* Empty */
7860bbfda8aSnia		| mwm_ignore_entries mwm_ignore_entry
7870bbfda8aSnia		;
7880bbfda8aSnia
7890bbfda8aSniamwm_ignore_entry	: string { add_mwm_ignore($1); }
7900bbfda8aSnia		;
7910bbfda8aSnia
7920bbfda8aSnia
793645f5050Syourisqueeze		: SQUEEZE_TITLE {
7940bbfda8aSnia				    if (HasShape) Scr->SqueezeTitle = true;
795645f5050Syouri				}
7960bbfda8aSnia		| SQUEEZE_TITLE { curplist = &Scr->SqueezeTitleL;
7970bbfda8aSnia				  if (HasShape)
7980bbfda8aSnia				    Scr->SqueezeTitle = true;
799645f5050Syouri				}
800645f5050Syouri		  LB win_sqz_entries RB
8010bbfda8aSnia		| DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = false; }
8020bbfda8aSnia		| DONT_SQUEEZE_TITLE { curplist = &Scr->DontSqueezeTitleL; }
803645f5050Syouri		  win_list
804645f5050Syouri		;
805645f5050Syouri
806645f5050Syouriwin_sqz_entries	: /* Empty */
8070bbfda8aSnia		| win_sqz_entries string SIJENUM signed_number number	{
808645f5050Syouri				if (Scr->FirstTime) {
8090bbfda8aSnia				   do_squeeze_entry (curplist, $2, $3, $4, $5);
810645f5050Syouri				}
811645f5050Syouri			}
812645f5050Syouri		;
813645f5050Syouri
814645f5050Syouri
815645f5050Syouriiconm_list	: LB iconm_entries RB {}
816645f5050Syouri		;
817645f5050Syouri
818645f5050Syouriiconm_entries	: /* Empty */
819645f5050Syouri		| iconm_entries iconm_entry
820645f5050Syouri		;
821645f5050Syouri
822645f5050Syouriiconm_entry	: string string number	{ if (Scr->FirstTime)
8230bbfda8aSnia					    AddToList(curplist, $1,
8240bbfda8aSnia						AllocateIconManager($1, NULL,
825645f5050Syouri							$2,$3));
826645f5050Syouri					}
827645f5050Syouri		| string string string number
828645f5050Syouri					{ if (Scr->FirstTime)
8290bbfda8aSnia					    AddToList(curplist, $1,
830645f5050Syouri						AllocateIconManager($1,$2,
831645f5050Syouri						$3, $4));
832645f5050Syouri					}
833645f5050Syouri		;
834645f5050Syouri
835645f5050Syouriworkspc_list	: LB workspc_entries RB {}
836645f5050Syouri		;
837645f5050Syouri
838645f5050Syouriworkspc_entries	: /* Empty */
839645f5050Syouri		| workspc_entries workspc_entry
840645f5050Syouri		;
841645f5050Syouri
842645f5050Syouriworkspc_entry	: string	{
8430bbfda8aSnia			AddWorkSpace ($1, NULL, NULL, NULL, NULL, NULL);
844645f5050Syouri		}
845645f5050Syouri		| string	{
846645f5050Syouri			curWorkSpc = (char*)$1;
847645f5050Syouri		}
848645f5050Syouri		workapp_list
849645f5050Syouri		;
850645f5050Syouri
851645f5050Syouriworkapp_list	: LB workapp_entries RB {}
852645f5050Syouri		;
853645f5050Syouri
854645f5050Syouriworkapp_entries	: /* Empty */
855645f5050Syouri		| workapp_entries workapp_entry
856645f5050Syouri		;
857645f5050Syouri
858645f5050Syouriworkapp_entry	: string		{
8590bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, NULL, NULL, NULL, NULL);
860645f5050Syouri		}
861645f5050Syouri		| string string		{
8620bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, $2, NULL, NULL, NULL);
863645f5050Syouri		}
864645f5050Syouri		| string string string	{
8650bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, $2, $3, NULL, NULL);
866645f5050Syouri		}
867645f5050Syouri		| string string string string	{
8680bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, $2, $3, $4, NULL);
869645f5050Syouri		}
870645f5050Syouri		| string string string string string	{
871645f5050Syouri			AddWorkSpace (curWorkSpc, $1, $2, $3, $4, $5);
872645f5050Syouri		}
873645f5050Syouri		;
874645f5050Syouri
875645f5050Syouricurwork		: LB string RB {
876645f5050Syouri		    WMapCreateCurrentBackGround ($2, NULL, NULL, NULL);
877645f5050Syouri		}
878645f5050Syouri		| LB string string RB {
879645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, NULL, NULL);
880645f5050Syouri		}
881645f5050Syouri		| LB string string string RB {
882645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, $4, NULL);
883645f5050Syouri		}
884645f5050Syouri		| LB string string string string RB {
885645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, $4, $5);
886645f5050Syouri		}
887645f5050Syouri		;
888645f5050Syouri
889645f5050Syouridefwork		: LB string RB {
890645f5050Syouri		    WMapCreateDefaultBackGround ($2, NULL, NULL, NULL);
891645f5050Syouri		}
892645f5050Syouri		| LB string string RB {
893645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, NULL, NULL);
894645f5050Syouri		}
895645f5050Syouri		| LB string string string RB {
896645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, $4, NULL);
897645f5050Syouri		}
898645f5050Syouri		| LB string string string string RB {
899645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, $4, $5);
900645f5050Syouri		}
901645f5050Syouri		;
902645f5050Syouri
903645f5050Syouriwin_list	: LB win_entries RB {}
904645f5050Syouri		;
905645f5050Syouri
906645f5050Syouriwin_entries	: /* Empty */
907645f5050Syouri		| win_entries win_entry
908645f5050Syouri		;
909645f5050Syouri
910645f5050Syouriwin_entry	: string		{ if (Scr->FirstTime)
9110bbfda8aSnia					    AddToList(curplist, $1, 0);
912645f5050Syouri					}
913645f5050Syouri		;
914645f5050Syouri
915645f5050Syourioccupy_list	: LB occupy_entries RB {}
916645f5050Syouri		;
917645f5050Syouri
918645f5050Syourioccupy_entries	:  /* Empty */
919645f5050Syouri		| occupy_entries occupy_entry
920645f5050Syouri		;
921645f5050Syouri
922645f5050Syourioccupy_entry	: string {client = (char*)$1;}
923645f5050Syouri		  occupy_workspc_list
924645f5050Syouri		| WINDOW    string {client = (char*)$2;}
925645f5050Syouri		  occupy_workspc_list
926645f5050Syouri		| WORKSPACE string {workspace = (char*)$2;}
927645f5050Syouri		  occupy_window_list
928645f5050Syouri		;
929645f5050Syouri
930645f5050Syourioccupy_workspc_list	: LB occupy_workspc_entries RB {}
931645f5050Syouri			;
932645f5050Syouri
933645f5050Syourioccupy_workspc_entries	:   /* Empty */
934645f5050Syouri			| occupy_workspc_entries occupy_workspc_entry
935645f5050Syouri			;
936645f5050Syouri
937645f5050Syourioccupy_workspc_entry	: string {
9380bbfda8aSnia				if(!AddToClientsList ($1, client)) {
9390bbfda8aSnia					twmrc_error_prefix();
9400bbfda8aSnia					fprintf(stderr, "unknown workspace '%s'\n", $1);
9410bbfda8aSnia				}
942645f5050Syouri			  }
943645f5050Syouri			;
944645f5050Syouri
945645f5050Syourioccupy_window_list	: LB occupy_window_entries RB {}
946645f5050Syouri			;
947645f5050Syouri
948645f5050Syourioccupy_window_entries	:   /* Empty */
949645f5050Syouri			| occupy_window_entries occupy_window_entry
950645f5050Syouri			;
951645f5050Syouri
952645f5050Syourioccupy_window_entry	: string {
9530bbfda8aSnia				if(!AddToClientsList (workspace, $1)) {
9540bbfda8aSnia					twmrc_error_prefix();
9550bbfda8aSnia					fprintf(stderr, "unknown workspace '%s'\n", workspace);
9560bbfda8aSnia				}
957645f5050Syouri			  }
958645f5050Syouri			;
959645f5050Syouri
960645f5050Syouriicon_list	: LB icon_entries RB {}
961645f5050Syouri		;
962645f5050Syouri
963645f5050Syouriicon_entries	: /* Empty */
964645f5050Syouri		| icon_entries icon_entry
965645f5050Syouri		;
966645f5050Syouri
9670bbfda8aSniaicon_entry	: string string		{ if (Scr->FirstTime) AddToList(curplist, $1, $2); }
9680bbfda8aSnia		;
9690bbfda8aSnia
9700bbfda8aSniarplay_sounds_list	: LB rplay_sounds_entries RB {
9710bbfda8aSnia#ifndef SOUNDS
9720bbfda8aSnia			twmrc_error_prefix();
9730bbfda8aSnia			fprintf(stderr, "RplaySounds ignored; rplay support "
9740bbfda8aSnia					"not configured.\n");
9750bbfda8aSnia#else
9760bbfda8aSnia			sound_set_from_config();
9770bbfda8aSnia#endif
9780bbfda8aSnia		}
9790bbfda8aSnia		;
9800bbfda8aSnia
9810bbfda8aSniarplay_sounds_entries	: /* Empty */
9820bbfda8aSnia		| rplay_sounds_entries rplay_sounds_entry
9830bbfda8aSnia		;
9840bbfda8aSnia
9850bbfda8aSniarplay_sounds_entry	: string string {
9860bbfda8aSnia#ifdef SOUNDS
9870bbfda8aSnia			if(set_sound_event_name($1, $2) != 0) {
9880bbfda8aSnia				twmrc_error_prefix();
9890bbfda8aSnia				fprintf(stderr, "Failed adding sound for %s; "
9900bbfda8aSnia						"maybe event name is invalid?\n", $1);
9910bbfda8aSnia			}
9920bbfda8aSnia#endif
9930bbfda8aSnia		}
994645f5050Syouri		;
995645f5050Syouri
996645f5050Syourifunction	: LB function_entries RB {}
997645f5050Syouri		;
998645f5050Syouri
999645f5050Syourifunction_entries: /* Empty */
1000645f5050Syouri		| function_entries function_entry
1001645f5050Syouri		;
1002645f5050Syouri
1003645f5050Syourifunction_entry	: action		{ AddToMenu(root, "", Action, NULL, $1,
10040bbfda8aSnia						    NULL, NULL);
1005645f5050Syouri					  Action = "";
1006645f5050Syouri					}
1007645f5050Syouri		;
1008645f5050Syouri
10090bbfda8aSniamenu		: LB menu_entries RB {lastmenuitem = NULL;}
1010645f5050Syouri		;
1011645f5050Syouri
1012645f5050Syourimenu_entries	: /* Empty */
1013645f5050Syouri		| menu_entries menu_entry
1014645f5050Syouri		;
1015645f5050Syouri
1016645f5050Syourimenu_entry	: string action		{
1017645f5050Syouri			if ($2 == F_SEPARATOR) {
10180bbfda8aSnia			    if (lastmenuitem) lastmenuitem->separated = true;
1019645f5050Syouri			}
1020645f5050Syouri			else {
10210bbfda8aSnia			    lastmenuitem = AddToMenu(root, $1, Action, pull, $2, NULL, NULL);
1022645f5050Syouri			    Action = "";
1023645f5050Syouri			    pull = NULL;
1024645f5050Syouri			}
1025645f5050Syouri		}
1026645f5050Syouri		| string LP string COLON string RP action {
1027645f5050Syouri			if ($7 == F_SEPARATOR) {
10280bbfda8aSnia			    if (lastmenuitem) lastmenuitem->separated = true;
1029645f5050Syouri			}
1030645f5050Syouri			else {
1031645f5050Syouri			    lastmenuitem = AddToMenu(root, $1, Action, pull, $7, $3, $5);
1032645f5050Syouri			    Action = "";
1033645f5050Syouri			    pull = NULL;
1034645f5050Syouri			}
1035645f5050Syouri		}
1036645f5050Syouri		;
1037645f5050Syouri
1038645f5050Syouriaction		: FKEYWORD	{ $$ = $1; }
1039645f5050Syouri		| FSKEYWORD string {
1040645f5050Syouri				$$ = $1;
1041645f5050Syouri				Action = (char*)$2;
1042645f5050Syouri				switch ($1) {
1043645f5050Syouri				  case F_MENU:
10440bbfda8aSnia				    pull = GetRoot ($2, NULL,NULL);
1045645f5050Syouri				    pull->prev = root;
1046645f5050Syouri				    break;
1047645f5050Syouri				  case F_WARPRING:
1048645f5050Syouri				    if (!CheckWarpRingArg (Action)) {
1049645f5050Syouri					twmrc_error_prefix();
1050645f5050Syouri					fprintf (stderr,
1051645f5050Syouri			"ignoring invalid f.warptoring argument \"%s\"\n",
1052645f5050Syouri						 Action);
1053645f5050Syouri					$$ = F_NOP;
1054645f5050Syouri				    }
1055645f5050Syouri				  case F_WARPTOSCREEN:
1056645f5050Syouri				    if (!CheckWarpScreenArg (Action)) {
1057645f5050Syouri					twmrc_error_prefix();
1058645f5050Syouri					fprintf (stderr,
1059645f5050Syouri			"ignoring invalid f.warptoscreen argument \"%s\"\n",
1060645f5050Syouri						 Action);
1061645f5050Syouri					$$ = F_NOP;
1062645f5050Syouri				    }
1063645f5050Syouri				    break;
1064645f5050Syouri				  case F_COLORMAP:
1065645f5050Syouri				    if (CheckColormapArg (Action)) {
1066645f5050Syouri					$$ = F_COLORMAP;
1067645f5050Syouri				    } else {
1068645f5050Syouri					twmrc_error_prefix();
1069645f5050Syouri					fprintf (stderr,
1070645f5050Syouri			"ignoring invalid f.colormap argument \"%s\"\n",
1071645f5050Syouri						 Action);
1072645f5050Syouri					$$ = F_NOP;
1073645f5050Syouri				    }
1074645f5050Syouri				    break;
1075645f5050Syouri				} /* end switch */
1076645f5050Syouri				   }
1077645f5050Syouri		;
1078645f5050Syouri
1079645f5050Syouri
1080645f5050Syourisigned_number	: number		{ $$ = $1; }
1081645f5050Syouri		| PLUS number		{ $$ = $2; }
1082645f5050Syouri		| MINUS number		{ $$ = -($2); }
1083645f5050Syouri		;
1084645f5050Syouri
1085645f5050Syouributton		: BUTTON number		{ $$ = $2;
1086645f5050Syouri					  if ($2 == 0)
1087645f5050Syouri						yyerror("bad button 0");
1088645f5050Syouri
1089645f5050Syouri					  if ($2 > MAX_BUTTONS)
1090645f5050Syouri					  {
1091645f5050Syouri						$$ = 0;
1092645f5050Syouri						yyerror("button number too large");
1093645f5050Syouri					  }
1094645f5050Syouri					}
1095645f5050Syouri		;
1096645f5050Syouri
10970bbfda8aSniastring		: STRING		{ char *ptr = strdup($1);
1098645f5050Syouri					  RemoveDQuote(ptr);
1099645f5050Syouri					  $$ = ptr;
1100645f5050Syouri					}
1101645f5050Syouri		;
1102645f5050Syouri
1103645f5050Syourinumber		: NUMBER		{ $$ = $1; }
1104645f5050Syouri		;
1105645f5050Syouri
1106645f5050Syouri%%
1107