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"
33df1c27a6Snia#ifdef WINBOX
34645f5050Syouri#include "windowbox.h"
35df1c27a6Snia#endif
360bbfda8aSnia#include "functions_defs.h"
37645f5050Syouri#include "list.h"
38645f5050Syouri#include "util.h"
390bbfda8aSnia#include "occupation.h"
40645f5050Syouri#include "screen.h"
41645f5050Syouri#include "parse.h"
420bbfda8aSnia#include "parse_be.h"
430bbfda8aSnia#include "parse_yacc.h"
44645f5050Syouri#include "cursor.h"
450bbfda8aSnia#include "win_decorations_init.h"
460bbfda8aSnia#include "win_regions.h"
470bbfda8aSnia#include "workspace_config.h"
480bbfda8aSnia#ifdef SOUNDS
490bbfda8aSnia#	include "sound.h"
50645f5050Syouri#endif
51645f5050Syouri
520bbfda8aSniastatic char *curWorkSpc = NULL;
530bbfda8aSniastatic char *client = NULL;
540bbfda8aSniastatic char *workspace = NULL;
550bbfda8aSniastatic MenuItem *lastmenuitem = NULL;
560bbfda8aSniastatic name_list **curplist = NULL;
570bbfda8aSniastatic int color = 0;
580bbfda8aSniaextern char *yytext; // Have to manually pull this in
590bbfda8aSnia
600bbfda8aSniaint yylex(void);
61645f5050Syouri%}
62645f5050Syouri
63645f5050Syouri%union
64645f5050Syouri{
65645f5050Syouri    int num;
66645f5050Syouri    char *ptr;
67645f5050Syouri};
68645f5050Syouri
69645f5050Syouri
70645f5050Syouri%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
71645f5050Syouri%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
72645f5050Syouri%token <num> ICONMGR_SHOW ICONMGR ALTER WINDOW_FUNCTION ZOOM ICONMGRS
73645f5050Syouri%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE
74645f5050Syouri%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING
750bbfda8aSnia%token <num> AUTO_POPUP
76645f5050Syouri%token <num> NO_BORDER NO_ICON_TITLE NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION
77645f5050Syouri%token <num> WINDOW_REGION META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
78645f5050Syouri%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
790bbfda8aSnia%token <num> WARP_ON_DEICONIFY
80645f5050Syouri%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
81645f5050Syouri%token <num> MOVE RESIZE WAITC SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
82645f5050Syouri%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
830bbfda8aSnia%token <num> FNKEYWORD PRIORITY_SWITCHING PRIORITY_NOT_SWITCHING
840bbfda8aSnia%token <num> SKEYWORD SSKEYWORD WINDOW_RING WINDOW_RING_EXCLUDE WARP_CURSOR ERRORTOKEN
850bbfda8aSnia%token <num> GRAVITY /* N/S/E/W */
860bbfda8aSnia%token <num> SIJENUM /* SqueezeTitle justifications, SIJust enum */
87645f5050Syouri%token <num> NO_STACKMODE ALWAYS_ON_TOP WORKSPACE WORKSPACES WORKSPCMGR_GEOMETRY
88645f5050Syouri%token <num> OCCUPYALL OCCUPYLIST MAPWINDOWCURRENTWORKSPACE MAPWINDOWDEFAULTWORKSPACE
890bbfda8aSnia%token <num> ON_TOP_PRIORITY
90645f5050Syouri%token <num> UNMAPBYMOVINGFARAWAY OPAQUEMOVE NOOPAQUEMOVE OPAQUERESIZE NOOPAQUERESIZE
91645f5050Syouri%token <num> DONTSETINACTIVE CHANGE_WORKSPACE_FUNCTION DEICONIFY_FUNCTION ICONIFY_FUNCTION
92645f5050Syouri%token <num> AUTOSQUEEZE STARTSQUEEZED DONT_SAVE AUTO_LOWER ICONMENU_DONTSHOW WINDOW_BOX
93645f5050Syouri%token <num> IGNOREMODIFIER WINDOW_GEOMETRIES ALWAYSSQUEEZETOGRAVITY VIRTUAL_SCREENS
940bbfda8aSnia%token <num> IGNORE_TRANSIENT
950bbfda8aSnia%token <num> EWMH_IGNORE
960bbfda8aSnia%token <num> MWM_IGNORE
97df1c27a6Snia%token <num> MONITOR_LAYOUT
980bbfda8aSnia%token <num> RPLAY_SOUNDS
990bbfda8aSnia%token <num> FORCE_FOCUS
100645f5050Syouri%token <ptr> STRING
101645f5050Syouri
102645f5050Syouri%type <ptr> string
103645f5050Syouri%type <num> action button number signed_number keyaction full fullkey
1040bbfda8aSnia%type <num> vgrav hgrav
105645f5050Syouri
106645f5050Syouri%start twmrc
107645f5050Syouri
108645f5050Syouri%%
1090bbfda8aSniatwmrc		: { InitGramVariables(); }
1100bbfda8aSnia                  stmts
111645f5050Syouri		;
112645f5050Syouri
113645f5050Syouristmts		: /* Empty */
114645f5050Syouri		| stmts stmt
115645f5050Syouri		;
116645f5050Syouri
117645f5050Syouristmt		: error
118645f5050Syouri		| noarg
119645f5050Syouri		| sarg
120645f5050Syouri		| narg
121645f5050Syouri		| squeeze
1220bbfda8aSnia		| ICON_REGION string vgrav hgrav number number {
1230bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef");
124645f5050Syouri		  }
1250bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string {
1260bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef");
127645f5050Syouri		  }
1280bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string {
1290bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef");
130645f5050Syouri		  }
1310bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string string {
1320bbfda8aSnia		      AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9);
133645f5050Syouri		  }
1340bbfda8aSnia		| ICON_REGION string vgrav hgrav number number {
1350bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef");
136645f5050Syouri		  }
137645f5050Syouri		  win_list
1380bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string {
1390bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef");
140645f5050Syouri		  }
141645f5050Syouri		  win_list
1420bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string {
1430bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef");
144645f5050Syouri		  }
145645f5050Syouri		  win_list
1460bbfda8aSnia		| ICON_REGION string vgrav hgrav number number string string string {
1470bbfda8aSnia		      curplist = AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9);
148645f5050Syouri		  }
149645f5050Syouri		  win_list
150645f5050Syouri
1510bbfda8aSnia		| WINDOW_REGION string vgrav hgrav {
1520bbfda8aSnia		      curplist = AddWindowRegion ($2, $3, $4);
153645f5050Syouri		  }
154645f5050Syouri		  win_list
155645f5050Syouri
156645f5050Syouri		| WINDOW_BOX string string {
157df1c27a6Snia#ifdef WINBOX
1580bbfda8aSnia		      curplist = addWindowBox ($2, $3);
159df1c27a6Snia#endif
160645f5050Syouri		  }
161645f5050Syouri		  win_list
162645f5050Syouri
163645f5050Syouri		| ICONMGR_GEOMETRY string number	{ if (Scr->FirstTime)
164645f5050Syouri						  {
165645f5050Syouri						    Scr->iconmgr->geometry= (char*)$2;
166645f5050Syouri						    Scr->iconmgr->columns=$3;
167645f5050Syouri						  }
168645f5050Syouri						}
169645f5050Syouri		| ICONMGR_GEOMETRY string	{ if (Scr->FirstTime)
170645f5050Syouri						    Scr->iconmgr->geometry = (char*)$2;
171645f5050Syouri						}
172645f5050Syouri		| WORKSPCMGR_GEOMETRY string number	{ if (Scr->FirstTime)
173645f5050Syouri				{
174645f5050Syouri				    Scr->workSpaceMgr.geometry= (char*)$2;
175645f5050Syouri				    Scr->workSpaceMgr.columns=$3;
176645f5050Syouri				}
177645f5050Syouri						}
178645f5050Syouri		| WORKSPCMGR_GEOMETRY string	{ if (Scr->FirstTime)
179645f5050Syouri				    Scr->workSpaceMgr.geometry = (char*)$2;
180645f5050Syouri						}
181645f5050Syouri		| MAPWINDOWCURRENTWORKSPACE {}
182645f5050Syouri		  curwork
183645f5050Syouri
184645f5050Syouri		| MAPWINDOWDEFAULTWORKSPACE {}
185645f5050Syouri		  defwork
186645f5050Syouri
187645f5050Syouri		| ZOOM number		{ if (Scr->FirstTime)
188645f5050Syouri					  {
1890bbfda8aSnia						Scr->DoZoom = true;
190645f5050Syouri						Scr->ZoomCount = $2;
191645f5050Syouri					  }
192645f5050Syouri					}
193645f5050Syouri		| ZOOM			{ if (Scr->FirstTime)
1940bbfda8aSnia						Scr->DoZoom = true; }
195645f5050Syouri		| PIXMAPS pixmap_list	{}
196645f5050Syouri		| CURSORS cursor_list	{}
1970bbfda8aSnia		| ICONIFY_BY_UNMAPPING	{ curplist = &Scr->IconifyByUn; }
198645f5050Syouri		  win_list
199645f5050Syouri		| ICONIFY_BY_UNMAPPING	{ if (Scr->FirstTime)
2000bbfda8aSnia		    Scr->IconifyByUnmapping = true; }
201645f5050Syouri
2020bbfda8aSnia		| OPAQUEMOVE	{ curplist = &Scr->OpaqueMoveList; }
203645f5050Syouri		  win_list
2040bbfda8aSnia		| OPAQUEMOVE	{ if (Scr->FirstTime) Scr->DoOpaqueMove = true; }
2050bbfda8aSnia		| NOOPAQUEMOVE	{ curplist = &Scr->NoOpaqueMoveList; }
206645f5050Syouri		  win_list
2070bbfda8aSnia		| NOOPAQUEMOVE	{ if (Scr->FirstTime) Scr->DoOpaqueMove = false; }
2080bbfda8aSnia		| OPAQUERESIZE	{ curplist = &Scr->OpaqueMoveList; }
209645f5050Syouri		  win_list
2100bbfda8aSnia		| OPAQUERESIZE	{ if (Scr->FirstTime) Scr->DoOpaqueResize = true; }
2110bbfda8aSnia		| NOOPAQUERESIZE	{ curplist = &Scr->NoOpaqueResizeList; }
212645f5050Syouri		  win_list
2130bbfda8aSnia		| NOOPAQUERESIZE	{ if (Scr->FirstTime) Scr->DoOpaqueResize = false; }
214645f5050Syouri
215645f5050Syouri		| LEFT_TITLEBUTTON string EQUALS action {
2160bbfda8aSnia					  GotTitleButton ($2, $4, false);
217645f5050Syouri					}
218645f5050Syouri		| RIGHT_TITLEBUTTON string EQUALS action {
2190bbfda8aSnia					  GotTitleButton ($2, $4, true);
220645f5050Syouri					}
2210bbfda8aSnia		| LEFT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, false, true); }
222645f5050Syouri		  binding_list
2230bbfda8aSnia		| RIGHT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, true, true); }
224645f5050Syouri		  binding_list
225645f5050Syouri		| button string		{
2260bbfda8aSnia		    root = GetRoot($2, NULL, NULL);
2270bbfda8aSnia		    AddFuncButton ($1, C_ROOT, 0, F_MENU, root, NULL);
228645f5050Syouri		}
229645f5050Syouri		| button action		{
230645f5050Syouri			if ($2 == F_MENU) {
231645f5050Syouri			    pull->prev = NULL;
2320bbfda8aSnia			    AddFuncButton ($1, C_ROOT, 0, $2, pull, NULL);
233645f5050Syouri			}
234645f5050Syouri			else {
235645f5050Syouri			    MenuItem *item;
236645f5050Syouri
2370bbfda8aSnia			    root = GetRoot(TWM_ROOT,NULL,NULL);
238645f5050Syouri			    item = AddToMenu (root, "x", Action,
2390bbfda8aSnia					NULL, $2, NULL, NULL);
2400bbfda8aSnia			    AddFuncButton ($1, C_ROOT, 0, $2, NULL, item);
241645f5050Syouri			}
242645f5050Syouri			Action = "";
243645f5050Syouri			pull = NULL;
244645f5050Syouri		}
245645f5050Syouri		| string fullkey	{ GotKey($1, $2); }
246645f5050Syouri		| button full		{ GotButton($1, $2); }
247645f5050Syouri
2480bbfda8aSnia		| DONT_ICONIFY_BY_UNMAPPING { curplist = &Scr->DontIconify; }
249645f5050Syouri		  win_list
250645f5050Syouri		| WORKSPACES {}
251645f5050Syouri		  workspc_list
2520bbfda8aSnia		| IGNOREMODIFIER
2530bbfda8aSnia			{ mods = 0; }
2540bbfda8aSnia			LB keys
2550bbfda8aSnia			{ Scr->IgnoreModifier |= mods; mods = 0; }
2560bbfda8aSnia			RB
2570bbfda8aSnia		| OCCUPYALL		{ curplist = &Scr->OccupyAll; }
258645f5050Syouri		  win_list
2590bbfda8aSnia		| ICONMENU_DONTSHOW	{ curplist = &Scr->IconMenuDontShow; }
260645f5050Syouri		  win_list
261645f5050Syouri		| OCCUPYLIST {}
262645f5050Syouri		  occupy_list
2630bbfda8aSnia		| UNMAPBYMOVINGFARAWAY	{ curplist = &Scr->UnmapByMovingFarAway; }
264645f5050Syouri		  win_list
2650bbfda8aSnia		| AUTOSQUEEZE		{ curplist = &Scr->AutoSqueeze; }
266645f5050Syouri		  win_list
2670bbfda8aSnia		| STARTSQUEEZED		{ curplist = &Scr->StartSqueezed; }
268645f5050Syouri		  win_list
2690bbfda8aSnia		| ALWAYSSQUEEZETOGRAVITY	{ Scr->AlwaysSqueezeToGravity = true; }
2700bbfda8aSnia		| ALWAYSSQUEEZETOGRAVITY	{ curplist = &Scr->AlwaysSqueezeToGravityL; }
271645f5050Syouri		  win_list
2720bbfda8aSnia		| DONTSETINACTIVE	{ curplist = &Scr->DontSetInactive; }
273645f5050Syouri		  win_list
2740bbfda8aSnia		| ICONMGR_NOSHOW	{ curplist = &Scr->IconMgrNoShow; }
275645f5050Syouri		  win_list
2760bbfda8aSnia		| ICONMGR_NOSHOW	{ Scr->IconManagerDontShow = true; }
2770bbfda8aSnia		| ICONMGRS		{ curplist = &Scr->IconMgrs; }
278645f5050Syouri		  iconm_list
2790bbfda8aSnia		| ICONMGR_SHOW		{ curplist = &Scr->IconMgrShow; }
280645f5050Syouri		  win_list
2810bbfda8aSnia		| NO_TITLE_HILITE	{ curplist = &Scr->NoTitleHighlight; }
282645f5050Syouri		  win_list
283645f5050Syouri		| NO_TITLE_HILITE	{ if (Scr->FirstTime)
2840bbfda8aSnia						Scr->TitleHighlight = false; }
2850bbfda8aSnia		| NO_HILITE		{ curplist = &Scr->NoHighlight; }
286645f5050Syouri		  win_list
287645f5050Syouri		| NO_HILITE		{ if (Scr->FirstTime)
2880bbfda8aSnia						Scr->Highlight = false; }
2890bbfda8aSnia                | ON_TOP_PRIORITY signed_number
2900bbfda8aSnia                                        { OtpScrSetZero(Scr, WinWin, $2); }
2910bbfda8aSnia		| ON_TOP_PRIORITY ICONS signed_number
2920bbfda8aSnia                                        { OtpScrSetZero(Scr, IconWin, $3); }
2930bbfda8aSnia		| ON_TOP_PRIORITY signed_number
2940bbfda8aSnia                                        { curplist = OtpScrPriorityL(Scr, WinWin, $2); }
2950bbfda8aSnia		  win_list
2960bbfda8aSnia		| ON_TOP_PRIORITY ICONS signed_number
2970bbfda8aSnia                                        { curplist = OtpScrPriorityL(Scr, IconWin, $3); }
2980bbfda8aSnia		  win_list
2990bbfda8aSnia		| ALWAYS_ON_TOP		{ curplist = OtpScrPriorityL(Scr, WinWin, 8); }
3000bbfda8aSnia		  win_list
3010bbfda8aSnia		| PRIORITY_SWITCHING	{ OtpScrSetSwitching(Scr, WinWin, false);
3020bbfda8aSnia		                          curplist = OtpScrSwitchingL(Scr, WinWin); }
3030bbfda8aSnia		  win_list
3040bbfda8aSnia		| PRIORITY_NOT_SWITCHING { OtpScrSetSwitching(Scr, WinWin, true);
3050bbfda8aSnia		                          curplist = OtpScrSwitchingL(Scr, WinWin); }
306645f5050Syouri		  win_list
3070bbfda8aSnia		| PRIORITY_SWITCHING ICONS
3080bbfda8aSnia                                        { OtpScrSetSwitching(Scr, IconWin, false);
3090bbfda8aSnia                                        curplist = OtpScrSwitchingL(Scr, IconWin); }
3100bbfda8aSnia		  win_list
3110bbfda8aSnia		| PRIORITY_NOT_SWITCHING ICONS
3120bbfda8aSnia                                        { OtpScrSetSwitching(Scr, IconWin, true);
3130bbfda8aSnia		                          curplist = OtpScrSwitchingL(Scr, IconWin); }
3140bbfda8aSnia		  win_list
3150bbfda8aSnia
3160bbfda8aSnia		  win_list
3170bbfda8aSnia		| NO_STACKMODE		{ curplist = &Scr->NoStackModeL; }
318645f5050Syouri		  win_list
319645f5050Syouri		| NO_STACKMODE		{ if (Scr->FirstTime)
3200bbfda8aSnia						Scr->StackMode = false; }
3210bbfda8aSnia		| NO_BORDER		{ curplist = &Scr->NoBorder; }
3220bbfda8aSnia		  win_list
3230bbfda8aSnia		| AUTO_POPUP		{ Scr->AutoPopup = true; }
3240bbfda8aSnia		| AUTO_POPUP		{ curplist = &Scr->AutoPopupL; }
325645f5050Syouri		  win_list
326df1c27a6Snia		| DONT_SAVE		{
327df1c27a6Snia#ifndef SESSION
328df1c27a6Snia			twmrc_error_prefix();
329df1c27a6Snia			fprintf(stderr, "DontSave ignored; session support "
330df1c27a6Snia					"disabled.\n");
331df1c27a6Snia#endif
332df1c27a6Snia				curplist = &Scr->DontSave;
333df1c27a6Snia			}
334645f5050Syouri		  win_list
3350bbfda8aSnia		| NO_ICON_TITLE		{ curplist = &Scr->NoIconTitle; }
336645f5050Syouri		  win_list
337645f5050Syouri		| NO_ICON_TITLE		{ if (Scr->FirstTime)
3380bbfda8aSnia						Scr->NoIconTitlebar = true; }
3390bbfda8aSnia		| NO_TITLE		{ curplist = &Scr->NoTitle; }
340645f5050Syouri		  win_list
341645f5050Syouri		| NO_TITLE		{ if (Scr->FirstTime)
3420bbfda8aSnia						Scr->NoTitlebar = true; }
3430bbfda8aSnia		| IGNORE_TRANSIENT	{ curplist = &Scr->IgnoreTransientL; }
3440bbfda8aSnia		  win_list
3450bbfda8aSnia		| MAKE_TITLE		{ curplist = &Scr->MakeTitle; }
346645f5050Syouri		  win_list
3470bbfda8aSnia		| START_ICONIFIED	{ curplist = &Scr->StartIconified; }
348645f5050Syouri		  win_list
3490bbfda8aSnia		| AUTO_RAISE		{ curplist = &Scr->AutoRaise; }
350645f5050Syouri		  win_list
3510bbfda8aSnia		| AUTO_RAISE		{ Scr->AutoRaiseDefault = true; }
3520bbfda8aSnia		| WARP_ON_DEICONIFY	{ curplist = &Scr->WarpOnDeIconify; }
353645f5050Syouri		  win_list
3540bbfda8aSnia		| AUTO_LOWER		{ curplist = &Scr->AutoLower; }
355645f5050Syouri		  win_list
3560bbfda8aSnia		| AUTO_LOWER		{ Scr->AutoLowerDefault = true; }
357645f5050Syouri		| MENU string LP string COLON string RP	{
358645f5050Syouri					root = GetRoot($2, $4, $6); }
3590bbfda8aSnia		  menu			{ root->real_menu = true;}
3600bbfda8aSnia		| MENU string		{ root = GetRoot($2, NULL, NULL); }
3610bbfda8aSnia		  menu			{ root->real_menu = true; }
3620bbfda8aSnia		| FUNCTION string	{ root = GetRoot($2, NULL, NULL); }
363645f5050Syouri		  function
3640bbfda8aSnia		| ICONS			{ curplist = &Scr->IconNames; }
365645f5050Syouri		  icon_list
366645f5050Syouri		| COLOR			{ color = COLOR; }
367645f5050Syouri		  color_list
368645f5050Syouri		| SAVECOLOR		{}
369645f5050Syouri		  save_color_list
370645f5050Syouri		| MONOCHROME		{ color = MONOCHROME; }
371645f5050Syouri		  color_list
372645f5050Syouri		| DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
373645f5050Syouri					  if ($2 == F_MENU)
374645f5050Syouri					  {
375645f5050Syouri					    pull->prev = NULL;
376645f5050Syouri					    Scr->DefaultFunction.menu = pull;
377645f5050Syouri					  }
378645f5050Syouri					  else
379645f5050Syouri					  {
3800bbfda8aSnia					    root = GetRoot(TWM_ROOT,NULL,NULL);
381645f5050Syouri					    Scr->DefaultFunction.item =
382645f5050Syouri						AddToMenu(root,"x",Action,
3830bbfda8aSnia							  NULL,$2, NULL, NULL);
384645f5050Syouri					  }
385645f5050Syouri					  Action = "";
386645f5050Syouri					  pull = NULL;
387645f5050Syouri					}
388645f5050Syouri		| WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
3890bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
390645f5050Syouri					   Scr->WindowFunction.item =
391645f5050Syouri						AddToMenu(root,"x",Action,
3920bbfda8aSnia							  NULL,$2, NULL, NULL);
393645f5050Syouri					   Action = "";
394645f5050Syouri					   pull = NULL;
395645f5050Syouri					}
396645f5050Syouri		| CHANGE_WORKSPACE_FUNCTION action { Scr->ChangeWorkspaceFunction.func = $2;
3970bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
398645f5050Syouri					   Scr->ChangeWorkspaceFunction.item =
399645f5050Syouri						AddToMenu(root,"x",Action,
4000bbfda8aSnia							  NULL,$2, NULL, NULL);
401645f5050Syouri					   Action = "";
402645f5050Syouri					   pull = NULL;
403645f5050Syouri					}
404645f5050Syouri		| DEICONIFY_FUNCTION action { Scr->DeIconifyFunction.func = $2;
4050bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
406645f5050Syouri					   Scr->DeIconifyFunction.item =
407645f5050Syouri						AddToMenu(root,"x",Action,
4080bbfda8aSnia							  NULL,$2, NULL, NULL);
409645f5050Syouri					   Action = "";
410645f5050Syouri					   pull = NULL;
411645f5050Syouri					}
412645f5050Syouri		| ICONIFY_FUNCTION action { Scr->IconifyFunction.func = $2;
4130bbfda8aSnia					   root = GetRoot(TWM_ROOT,NULL,NULL);
414645f5050Syouri					   Scr->IconifyFunction.item =
415645f5050Syouri						AddToMenu(root,"x",Action,
4160bbfda8aSnia							  NULL,$2, NULL, NULL);
417645f5050Syouri					   Action = "";
418645f5050Syouri					   pull = NULL;
419645f5050Syouri					}
4200bbfda8aSnia		| WARP_CURSOR		{ curplist = &Scr->WarpCursorL; }
421645f5050Syouri		  win_list
422645f5050Syouri		| WARP_CURSOR		{ if (Scr->FirstTime)
4230bbfda8aSnia					    Scr->WarpCursor = true; }
4240bbfda8aSnia		| WINDOW_RING		{ curplist = &Scr->WindowRingL; }
425645f5050Syouri		  win_list
4260bbfda8aSnia		| WINDOW_RING		{ Scr->WindowRingAll = true; }
427645f5050Syouri		| WINDOW_RING_EXCLUDE	{ if (!Scr->WindowRingL)
4280bbfda8aSnia					    Scr->WindowRingAll = true;
4290bbfda8aSnia					  curplist = &Scr->WindowRingExcludeL; }
430645f5050Syouri		  win_list
431645f5050Syouri		| WINDOW_GEOMETRIES	{  }
432645f5050Syouri		  wingeom_list
433645f5050Syouri		| VIRTUAL_SCREENS	{ }
434df1c27a6Snia		  vscreen_geom_list
4350bbfda8aSnia		| EWMH_IGNORE		{ }
4360bbfda8aSnia		  ewmh_ignore_list
4370bbfda8aSnia		| MWM_IGNORE		{ }
4380bbfda8aSnia		  mwm_ignore_list
439df1c27a6Snia		| MONITOR_LAYOUT { init_layout_override(); }
440df1c27a6Snia			layout_geom_list
4410bbfda8aSnia		| RPLAY_SOUNDS { }
4420bbfda8aSnia		  rplay_sounds_list
4430bbfda8aSnia		| FORCE_FOCUS { Scr->ForceFocus = true; }
4440bbfda8aSnia		| FORCE_FOCUS { curplist = &Scr->ForceFocusL; }
4450bbfda8aSnia		  win_list
446645f5050Syouri		;
447645f5050Syouri
448645f5050Syourinoarg		: KEYWORD		{ if (!do_single_keyword ($1)) {
449645f5050Syouri					    twmrc_error_prefix();
450645f5050Syouri					    fprintf (stderr,
451645f5050Syouri					"unknown singleton keyword %d\n",
452645f5050Syouri						     $1);
4530bbfda8aSnia					    ParseError = true;
454645f5050Syouri					  }
455645f5050Syouri					}
456645f5050Syouri		;
457645f5050Syouri
458645f5050Syourisarg		: SKEYWORD string	{ if (!do_string_keyword ($1, $2)) {
459645f5050Syouri					    twmrc_error_prefix();
460645f5050Syouri					    fprintf (stderr,
461645f5050Syouri				"unknown string keyword %d (value \"%s\")\n",
462645f5050Syouri						     $1, $2);
4630bbfda8aSnia					    ParseError = true;
464645f5050Syouri					  }
465645f5050Syouri					}
4660bbfda8aSnia		| SKEYWORD		{ if (!do_string_keyword ($1, DEFSTRING)) {
467645f5050Syouri					    twmrc_error_prefix();
468645f5050Syouri					    fprintf (stderr,
469645f5050Syouri				"unknown string keyword %d (no value)\n",
470645f5050Syouri						     $1);
4710bbfda8aSnia					    ParseError = true;
472645f5050Syouri					  }
473645f5050Syouri					}
474645f5050Syouri		;
475645f5050Syouri
476645f5050Syourisarg		: SSKEYWORD string string
477645f5050Syouri					{ if (!do_string_string_keyword ($1, $2, $3)) {
478645f5050Syouri					    twmrc_error_prefix();
479645f5050Syouri					    fprintf (stderr,
480645f5050Syouri				"unknown strings keyword %d (value \"%s\" and \"%s\")\n",
481645f5050Syouri						     $1, $2, $3);
4820bbfda8aSnia					    ParseError = true;
483645f5050Syouri					  }
484645f5050Syouri					}
4850bbfda8aSnia		| SSKEYWORD string	{ if (!do_string_string_keyword ($1, $2, NULL)) {
486645f5050Syouri					    twmrc_error_prefix();
487645f5050Syouri					    fprintf (stderr,
488645f5050Syouri				"unknown string keyword %d (value \"%s\")\n",
489645f5050Syouri						     $1, $2);
4900bbfda8aSnia					    ParseError = true;
491645f5050Syouri					  }
492645f5050Syouri					}
4930bbfda8aSnia		| SSKEYWORD		{ if (!do_string_string_keyword ($1, NULL, NULL)) {
494645f5050Syouri					    twmrc_error_prefix();
495645f5050Syouri					    fprintf (stderr,
496645f5050Syouri				"unknown string keyword %d (no value)\n",
497645f5050Syouri						     $1);
4980bbfda8aSnia					    ParseError = true;
499645f5050Syouri					  }
500645f5050Syouri					}
501645f5050Syouri		;
502645f5050Syouri
503645f5050Syourinarg		: NKEYWORD number	{ if (!do_number_keyword ($1, $2)) {
504645f5050Syouri					    twmrc_error_prefix();
505645f5050Syouri					    fprintf (stderr,
506645f5050Syouri				"unknown numeric keyword %d (value %d)\n",
507645f5050Syouri						     $1, $2);
5080bbfda8aSnia					    ParseError = true;
509645f5050Syouri					  }
510645f5050Syouri					}
511645f5050Syouri		;
512645f5050Syouri
513645f5050Syouri
514645f5050Syouri
515645f5050Syourikeyaction	: EQUALS keys COLON action  { $$ = $4; }
516645f5050Syouri		;
517645f5050Syouri
518645f5050Syourifull		: EQUALS keys COLON contexts COLON action  { $$ = $6; }
519645f5050Syouri		;
520645f5050Syouri
521645f5050Syourifullkey		: EQUALS keys COLON contextkeys COLON action  { $$ = $6; }
522645f5050Syouri		;
523645f5050Syouri
524645f5050Syourikeys		: /* Empty */
525645f5050Syouri		| keys key
526645f5050Syouri		;
527645f5050Syouri
528645f5050Syourikey		: META			{ mods |= Mod1Mask; }
529645f5050Syouri		| SHIFT			{ mods |= ShiftMask; }
530645f5050Syouri		| LOCK			{ mods |= LockMask; }
531645f5050Syouri		| CONTROL		{ mods |= ControlMask; }
532645f5050Syouri		| ALTER number		{ if ($2 < 1 || $2 > 5) {
533645f5050Syouri					     twmrc_error_prefix();
534645f5050Syouri					     fprintf (stderr,
5350bbfda8aSnia				"bad altkeymap number (%d), must be 1-5\n",
536645f5050Syouri						      $2);
5370bbfda8aSnia					     ParseError = true;
538645f5050Syouri					  } else {
539645f5050Syouri					     mods |= (Alt1Mask << ($2 - 1));
540645f5050Syouri					  }
541645f5050Syouri					}
542645f5050Syouri		| META number		{ if ($2 < 1 || $2 > 5) {
543645f5050Syouri					     twmrc_error_prefix();
544645f5050Syouri					     fprintf (stderr,
545645f5050Syouri				"bad modifier number (%d), must be 1-5\n",
546645f5050Syouri						      $2);
5470bbfda8aSnia					     ParseError = true;
548645f5050Syouri					  } else {
549645f5050Syouri					     mods |= (Mod1Mask << ($2 - 1));
550645f5050Syouri					  }
551645f5050Syouri					}
552645f5050Syouri		| OR			{ }
553645f5050Syouri		;
554645f5050Syouri
5550bbfda8aSniavgrav	: GRAVITY {
5560bbfda8aSnia			switch($1) {
5570bbfda8aSnia				case GRAV_NORTH:
5580bbfda8aSnia				case GRAV_SOUTH:
5590bbfda8aSnia					/* OK */
5600bbfda8aSnia					$$ = $1;
5610bbfda8aSnia					break;
5620bbfda8aSnia				default:
5630bbfda8aSnia					twmrc_error_prefix();
5640bbfda8aSnia					fprintf(stderr, "Bad vertical gravity '%s'\n", yytext);
5650bbfda8aSnia					ParseError = true;
5660bbfda8aSnia					YYERROR;
5670bbfda8aSnia			}
5680bbfda8aSnia		}
5690bbfda8aSnia
5700bbfda8aSniahgrav	: GRAVITY {
5710bbfda8aSnia			switch($1) {
5720bbfda8aSnia				case GRAV_EAST:
5730bbfda8aSnia				case GRAV_WEST:
5740bbfda8aSnia					/* OK */
5750bbfda8aSnia					$$ = $1;
5760bbfda8aSnia					break;
5770bbfda8aSnia				default:
5780bbfda8aSnia					twmrc_error_prefix();
5790bbfda8aSnia					fprintf(stderr, "Bad horiz gravity '%s'\n", yytext);
5800bbfda8aSnia					ParseError = true;
5810bbfda8aSnia					YYERROR;
5820bbfda8aSnia			}
5830bbfda8aSnia		}
5840bbfda8aSnia
585645f5050Syouricontexts	: /* Empty */
586645f5050Syouri		| contexts context
587645f5050Syouri		;
588645f5050Syouri
589645f5050Syouricontext		: WINDOW		{ cont |= C_WINDOW_BIT; }
590645f5050Syouri		| TITLE			{ cont |= C_TITLE_BIT; }
591645f5050Syouri		| ICON			{ cont |= C_ICON_BIT; }
592645f5050Syouri		| ROOT			{ cont |= C_ROOT_BIT; }
593645f5050Syouri		| FRAME			{ cont |= C_FRAME_BIT; }
594645f5050Syouri		| WORKSPACE		{ cont |= C_WORKSPACE_BIT; }
595645f5050Syouri		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
596645f5050Syouri		| META			{ cont |= C_ICONMGR_BIT; }
597645f5050Syouri		| ALTER			{ cont |= C_ALTER_BIT; }
598645f5050Syouri		| ALL			{ cont |= C_ALL_BITS; }
5990bbfda8aSnia		| OR			{ }
600645f5050Syouri		;
601645f5050Syouri
602645f5050Syouricontextkeys	: /* Empty */
603645f5050Syouri		| contextkeys contextkey
604645f5050Syouri		;
605645f5050Syouri
606645f5050Syouricontextkey	: WINDOW		{ cont |= C_WINDOW_BIT; }
607645f5050Syouri		| TITLE			{ cont |= C_TITLE_BIT; }
608645f5050Syouri		| ICON			{ cont |= C_ICON_BIT; }
609645f5050Syouri		| ROOT			{ cont |= C_ROOT_BIT; }
610645f5050Syouri		| FRAME			{ cont |= C_FRAME_BIT; }
611645f5050Syouri		| WORKSPACE		{ cont |= C_WORKSPACE_BIT; }
612645f5050Syouri		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
613645f5050Syouri		| META			{ cont |= C_ICONMGR_BIT; }
614645f5050Syouri		| ALTER			{ cont |= C_ALTER_BIT; }
6150bbfda8aSnia		| ALL			{ cont |= C_ALL_BITS; }
616645f5050Syouri		| OR			{ }
617645f5050Syouri		| string		{ Name = (char*)$1; cont |= C_NAME_BIT; }
618645f5050Syouri		;
619645f5050Syouri
620645f5050Syouri
621645f5050Syouribinding_list    : LB binding_entries RB {}
622645f5050Syouri		;
623645f5050Syouri
624645f5050Syouribinding_entries : /* Empty */
625645f5050Syouri		| binding_entries binding_entry
626645f5050Syouri		;
627645f5050Syouri
6280bbfda8aSniabinding_entry   : button keyaction { SetCurrentTBAction($1, mods, $2, Action, pull); mods = 0;}
6290bbfda8aSnia		| button EQUALS action { SetCurrentTBAction($1, 0, $3, Action, pull);}
6300bbfda8aSnia		| button COLON action {
6310bbfda8aSnia			/* Deprecated since 3.8, no longer supported */
6320bbfda8aSnia			yyerror("Title buttons specifications without = are no "
6330bbfda8aSnia			        "longer supported.");
6340bbfda8aSnia		}
635645f5050Syouri		;
636645f5050Syouri
637645f5050Syouri
638645f5050Syouripixmap_list	: LB pixmap_entries RB {}
639645f5050Syouri		;
640645f5050Syouri
641645f5050Syouripixmap_entries	: /* Empty */
642645f5050Syouri		| pixmap_entries pixmap_entry
643645f5050Syouri		;
644645f5050Syouri
6450bbfda8aSniapixmap_entry	: TITLE_HILITE string { Scr->HighlightPixmapName = strdup($2); }
646645f5050Syouri		;
647645f5050Syouri
648645f5050Syouri
649645f5050Syouricursor_list	: LB cursor_entries RB {}
650645f5050Syouri		;
651645f5050Syouri
652645f5050Syouricursor_entries	: /* Empty */
653645f5050Syouri		| cursor_entries cursor_entry
654645f5050Syouri		;
655645f5050Syouri
656645f5050Syouricursor_entry	: FRAME string string {
657645f5050Syouri			NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
658645f5050Syouri		| FRAME string	{
659645f5050Syouri			NewFontCursor(&Scr->FrameCursor, $2); }
660645f5050Syouri		| TITLE string string {
661645f5050Syouri			NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
662645f5050Syouri		| TITLE string {
663645f5050Syouri			NewFontCursor(&Scr->TitleCursor, $2); }
664645f5050Syouri		| ICON string string {
665645f5050Syouri			NewBitmapCursor(&Scr->IconCursor, $2, $3); }
666645f5050Syouri		| ICON string {
667645f5050Syouri			NewFontCursor(&Scr->IconCursor, $2); }
668645f5050Syouri		| ICONMGR string string {
669645f5050Syouri			NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
670645f5050Syouri		| ICONMGR string {
671645f5050Syouri			NewFontCursor(&Scr->IconMgrCursor, $2); }
672645f5050Syouri		| BUTTON string string {
673645f5050Syouri			NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
674645f5050Syouri		| BUTTON string {
675645f5050Syouri			NewFontCursor(&Scr->ButtonCursor, $2); }
676645f5050Syouri		| MOVE string string {
677645f5050Syouri			NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
678645f5050Syouri		| MOVE string {
679645f5050Syouri			NewFontCursor(&Scr->MoveCursor, $2); }
680645f5050Syouri		| RESIZE string string {
681645f5050Syouri			NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
682645f5050Syouri		| RESIZE string {
683645f5050Syouri			NewFontCursor(&Scr->ResizeCursor, $2); }
684645f5050Syouri		| WAITC string string {
685645f5050Syouri			NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
686645f5050Syouri		| WAITC string {
687645f5050Syouri			NewFontCursor(&Scr->WaitCursor, $2); }
688645f5050Syouri		| MENU string string {
689645f5050Syouri			NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
690645f5050Syouri		| MENU string {
691645f5050Syouri			NewFontCursor(&Scr->MenuCursor, $2); }
692645f5050Syouri		| SELECT string string {
693645f5050Syouri			NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
694645f5050Syouri		| SELECT string {
695645f5050Syouri			NewFontCursor(&Scr->SelectCursor, $2); }
696645f5050Syouri		| KILL string string {
697645f5050Syouri			NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
698645f5050Syouri		| KILL string {
699645f5050Syouri			NewFontCursor(&Scr->DestroyCursor, $2); }
700645f5050Syouri		;
701645f5050Syouri
702645f5050Syouricolor_list	: LB color_entries RB {}
703645f5050Syouri		;
704645f5050Syouri
705645f5050Syouri
706645f5050Syouricolor_entries	: /* Empty */
707645f5050Syouri		| color_entries color_entry
708645f5050Syouri		;
709645f5050Syouri
710645f5050Syouricolor_entry	: CLKEYWORD string	{ if (!do_colorlist_keyword ($1, color,
711645f5050Syouri								     $2)) {
712645f5050Syouri					    twmrc_error_prefix();
713645f5050Syouri					    fprintf (stderr,
714645f5050Syouri			"unhandled list color keyword %d (string \"%s\")\n",
715645f5050Syouri						     $1, $2);
7160bbfda8aSnia					    ParseError = true;
717645f5050Syouri					  }
718645f5050Syouri					}
7190bbfda8aSnia		| CLKEYWORD string	{ curplist = do_colorlist_keyword($1,color,
720645f5050Syouri								      $2);
7210bbfda8aSnia					  if (!curplist) {
722645f5050Syouri					    twmrc_error_prefix();
723645f5050Syouri					    fprintf (stderr,
724645f5050Syouri			"unhandled color list keyword %d (string \"%s\")\n",
725645f5050Syouri						     $1, $2);
7260bbfda8aSnia					    ParseError = true;
727645f5050Syouri					  }
728645f5050Syouri					}
729645f5050Syouri		  win_color_list
730645f5050Syouri		| CKEYWORD string	{ if (!do_color_keyword ($1, color,
731645f5050Syouri								 $2)) {
732645f5050Syouri					    twmrc_error_prefix();
733645f5050Syouri					    fprintf (stderr,
734645f5050Syouri			"unhandled color keyword %d (string \"%s\")\n",
735645f5050Syouri						     $1, $2);
7360bbfda8aSnia					    ParseError = true;
737645f5050Syouri					  }
738645f5050Syouri					}
739645f5050Syouri		;
740645f5050Syouri
741645f5050Syourisave_color_list : LB s_color_entries RB {}
742645f5050Syouri		;
743645f5050Syouri
744645f5050Syouris_color_entries : /* Empty */
745645f5050Syouri		| s_color_entries s_color_entry
746645f5050Syouri		;
747645f5050Syouri
748645f5050Syouris_color_entry   : string		{ do_string_savecolor(color, $1); }
749645f5050Syouri		| CLKEYWORD		{ do_var_savecolor($1); }
750645f5050Syouri		;
751645f5050Syouri
752645f5050Syouriwin_color_list	: LB win_color_entries RB {}
753645f5050Syouri		;
754645f5050Syouri
755645f5050Syouriwin_color_entries	: /* Empty */
756645f5050Syouri		| win_color_entries win_color_entry
757645f5050Syouri		;
758645f5050Syouri
759645f5050Syouriwin_color_entry	: string string		{ if (Scr->FirstTime &&
760645f5050Syouri					      color == Scr->Monochrome)
7610bbfda8aSnia					    AddToList(curplist, $1, $2); }
762645f5050Syouri		;
763645f5050Syouri
764645f5050Syouriwingeom_list	: LB wingeom_entries RB {}
765645f5050Syouri		;
766645f5050Syouri
767645f5050Syouriwingeom_entries	: /* Empty */
768645f5050Syouri		| wingeom_entries wingeom_entry
769645f5050Syouri		;
770645f5050Syouri/* added a ';' after call to AddToList */
771645f5050Syouriwingeom_entry	: string string	{ AddToList (&Scr->WindowGeometries, $1, $2); }
772645f5050Syouri		;
773645f5050Syouri
774df1c27a6Sniavscreen_geom_list	: LB vscreen_geom_entries RB {}
775645f5050Syouri		;
776645f5050Syouri
777df1c27a6Sniavscreen_geom_entries	: /* Empty */
778df1c27a6Snia		| vscreen_geom_entries vscreen_geom_entry
779645f5050Syouri		;
780645f5050Syouri
781df1c27a6Sniavscreen_geom_entry	: string {
782df1c27a6Snia#ifdef VSCREEN
783df1c27a6Snia				   AddToList (&Scr->VirtualScreens, $1, "");
784df1c27a6Snia#endif
785df1c27a6Snia				   }
786645f5050Syouri		;
787645f5050Syouri
7880bbfda8aSnia
7890bbfda8aSniaewmh_ignore_list	: LB ewmh_ignore_entries RB { proc_ewmh_ignore(); }
7900bbfda8aSnia		;
7910bbfda8aSnia
7920bbfda8aSniaewmh_ignore_entries	: /* Empty */
7930bbfda8aSnia		| ewmh_ignore_entries ewmh_ignore_entry
7940bbfda8aSnia		;
7950bbfda8aSnia
7960bbfda8aSniaewmh_ignore_entry	: string { add_ewmh_ignore($1); }
7970bbfda8aSnia		;
7980bbfda8aSnia
7990bbfda8aSnia
8000bbfda8aSniamwm_ignore_list	: LB mwm_ignore_entries RB { proc_mwm_ignore(); }
8010bbfda8aSnia		;
8020bbfda8aSnia
8030bbfda8aSniamwm_ignore_entries	: /* Empty */
8040bbfda8aSnia		| mwm_ignore_entries mwm_ignore_entry
8050bbfda8aSnia		;
8060bbfda8aSnia
8070bbfda8aSniamwm_ignore_entry	: string { add_mwm_ignore($1); }
8080bbfda8aSnia		;
8090bbfda8aSnia
8100bbfda8aSnia
811df1c27a6Snialayout_geom_list	: LB layout_geom_entries RB { proc_layout_override(); }
812df1c27a6Snia		;
813df1c27a6Snia
814df1c27a6Snialayout_geom_entries	: /* Empty */
815df1c27a6Snia		| layout_geom_entries layout_geom_entry
816df1c27a6Snia		;
817df1c27a6Snia
818df1c27a6Snialayout_geom_entry	: string { add_layout_override_entry($1); }
819df1c27a6Snia		;
820df1c27a6Snia
821df1c27a6Snia
822645f5050Syourisqueeze		: SQUEEZE_TITLE {
8230bbfda8aSnia				    if (HasShape) Scr->SqueezeTitle = true;
824645f5050Syouri				}
8250bbfda8aSnia		| SQUEEZE_TITLE { curplist = &Scr->SqueezeTitleL;
8260bbfda8aSnia				  if (HasShape)
8270bbfda8aSnia				    Scr->SqueezeTitle = true;
828645f5050Syouri				}
829645f5050Syouri		  LB win_sqz_entries RB
8300bbfda8aSnia		| DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = false; }
8310bbfda8aSnia		| DONT_SQUEEZE_TITLE { curplist = &Scr->DontSqueezeTitleL; }
832645f5050Syouri		  win_list
833645f5050Syouri		;
834645f5050Syouri
835645f5050Syouriwin_sqz_entries	: /* Empty */
8360bbfda8aSnia		| win_sqz_entries string SIJENUM signed_number number	{
837645f5050Syouri				if (Scr->FirstTime) {
8380bbfda8aSnia				   do_squeeze_entry (curplist, $2, $3, $4, $5);
839645f5050Syouri				}
840645f5050Syouri			}
841645f5050Syouri		;
842645f5050Syouri
843645f5050Syouri
844645f5050Syouriiconm_list	: LB iconm_entries RB {}
845645f5050Syouri		;
846645f5050Syouri
847645f5050Syouriiconm_entries	: /* Empty */
848645f5050Syouri		| iconm_entries iconm_entry
849645f5050Syouri		;
850645f5050Syouri
851645f5050Syouriiconm_entry	: string string number	{ if (Scr->FirstTime)
8520bbfda8aSnia					    AddToList(curplist, $1,
8530bbfda8aSnia						AllocateIconManager($1, NULL,
854645f5050Syouri							$2,$3));
855645f5050Syouri					}
856645f5050Syouri		| string string string number
857645f5050Syouri					{ if (Scr->FirstTime)
8580bbfda8aSnia					    AddToList(curplist, $1,
859645f5050Syouri						AllocateIconManager($1,$2,
860645f5050Syouri						$3, $4));
861645f5050Syouri					}
862645f5050Syouri		;
863645f5050Syouri
864645f5050Syouriworkspc_list	: LB workspc_entries RB {}
865645f5050Syouri		;
866645f5050Syouri
867645f5050Syouriworkspc_entries	: /* Empty */
868645f5050Syouri		| workspc_entries workspc_entry
869645f5050Syouri		;
870645f5050Syouri
871645f5050Syouriworkspc_entry	: string	{
8720bbfda8aSnia			AddWorkSpace ($1, NULL, NULL, NULL, NULL, NULL);
873645f5050Syouri		}
874645f5050Syouri		| string	{
875645f5050Syouri			curWorkSpc = (char*)$1;
876645f5050Syouri		}
877645f5050Syouri		workapp_list
878645f5050Syouri		;
879645f5050Syouri
880645f5050Syouriworkapp_list	: LB workapp_entries RB {}
881645f5050Syouri		;
882645f5050Syouri
883645f5050Syouriworkapp_entries	: /* Empty */
884645f5050Syouri		| workapp_entries workapp_entry
885645f5050Syouri		;
886645f5050Syouri
887645f5050Syouriworkapp_entry	: string		{
8880bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, NULL, NULL, NULL, NULL);
889645f5050Syouri		}
890645f5050Syouri		| string string		{
8910bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, $2, NULL, NULL, NULL);
892645f5050Syouri		}
893645f5050Syouri		| string string string	{
8940bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, $2, $3, NULL, NULL);
895645f5050Syouri		}
896645f5050Syouri		| string string string string	{
8970bbfda8aSnia			AddWorkSpace (curWorkSpc, $1, $2, $3, $4, NULL);
898645f5050Syouri		}
899645f5050Syouri		| string string string string string	{
900645f5050Syouri			AddWorkSpace (curWorkSpc, $1, $2, $3, $4, $5);
901645f5050Syouri		}
902645f5050Syouri		;
903645f5050Syouri
904645f5050Syouricurwork		: LB string RB {
905645f5050Syouri		    WMapCreateCurrentBackGround ($2, NULL, NULL, NULL);
906645f5050Syouri		}
907645f5050Syouri		| LB string string RB {
908645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, NULL, NULL);
909645f5050Syouri		}
910645f5050Syouri		| LB string string string RB {
911645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, $4, NULL);
912645f5050Syouri		}
913645f5050Syouri		| LB string string string string RB {
914645f5050Syouri		    WMapCreateCurrentBackGround ($2, $3, $4, $5);
915645f5050Syouri		}
916645f5050Syouri		;
917645f5050Syouri
918645f5050Syouridefwork		: LB string RB {
919645f5050Syouri		    WMapCreateDefaultBackGround ($2, NULL, NULL, NULL);
920645f5050Syouri		}
921645f5050Syouri		| LB string string RB {
922645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, NULL, NULL);
923645f5050Syouri		}
924645f5050Syouri		| LB string string string RB {
925645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, $4, NULL);
926645f5050Syouri		}
927645f5050Syouri		| LB string string string string RB {
928645f5050Syouri		    WMapCreateDefaultBackGround ($2, $3, $4, $5);
929645f5050Syouri		}
930645f5050Syouri		;
931645f5050Syouri
932645f5050Syouriwin_list	: LB win_entries RB {}
933645f5050Syouri		;
934645f5050Syouri
935645f5050Syouriwin_entries	: /* Empty */
936645f5050Syouri		| win_entries win_entry
937645f5050Syouri		;
938645f5050Syouri
939645f5050Syouriwin_entry	: string		{ if (Scr->FirstTime)
9400bbfda8aSnia					    AddToList(curplist, $1, 0);
941645f5050Syouri					}
942645f5050Syouri		;
943645f5050Syouri
944645f5050Syourioccupy_list	: LB occupy_entries RB {}
945645f5050Syouri		;
946645f5050Syouri
947645f5050Syourioccupy_entries	:  /* Empty */
948645f5050Syouri		| occupy_entries occupy_entry
949645f5050Syouri		;
950645f5050Syouri
951645f5050Syourioccupy_entry	: string {client = (char*)$1;}
952645f5050Syouri		  occupy_workspc_list
953645f5050Syouri		| WINDOW    string {client = (char*)$2;}
954645f5050Syouri		  occupy_workspc_list
955645f5050Syouri		| WORKSPACE string {workspace = (char*)$2;}
956645f5050Syouri		  occupy_window_list
957645f5050Syouri		;
958645f5050Syouri
959645f5050Syourioccupy_workspc_list	: LB occupy_workspc_entries RB {}
960645f5050Syouri			;
961645f5050Syouri
962645f5050Syourioccupy_workspc_entries	:   /* Empty */
963645f5050Syouri			| occupy_workspc_entries occupy_workspc_entry
964645f5050Syouri			;
965645f5050Syouri
966645f5050Syourioccupy_workspc_entry	: string {
9670bbfda8aSnia				if(!AddToClientsList ($1, client)) {
9680bbfda8aSnia					twmrc_error_prefix();
9690bbfda8aSnia					fprintf(stderr, "unknown workspace '%s'\n", $1);
9700bbfda8aSnia				}
971645f5050Syouri			  }
972645f5050Syouri			;
973645f5050Syouri
974645f5050Syourioccupy_window_list	: LB occupy_window_entries RB {}
975645f5050Syouri			;
976645f5050Syouri
977645f5050Syourioccupy_window_entries	:   /* Empty */
978645f5050Syouri			| occupy_window_entries occupy_window_entry
979645f5050Syouri			;
980645f5050Syouri
981645f5050Syourioccupy_window_entry	: string {
9820bbfda8aSnia				if(!AddToClientsList (workspace, $1)) {
9830bbfda8aSnia					twmrc_error_prefix();
9840bbfda8aSnia					fprintf(stderr, "unknown workspace '%s'\n", workspace);
9850bbfda8aSnia				}
986645f5050Syouri			  }
987645f5050Syouri			;
988645f5050Syouri
989645f5050Syouriicon_list	: LB icon_entries RB {}
990645f5050Syouri		;
991645f5050Syouri
992645f5050Syouriicon_entries	: /* Empty */
993645f5050Syouri		| icon_entries icon_entry
994645f5050Syouri		;
995645f5050Syouri
9960bbfda8aSniaicon_entry	: string string		{ if (Scr->FirstTime) AddToList(curplist, $1, $2); }
9970bbfda8aSnia		;
9980bbfda8aSnia
9990bbfda8aSniarplay_sounds_list	: LB rplay_sounds_entries RB {
10000bbfda8aSnia#ifndef SOUNDS
10010bbfda8aSnia			twmrc_error_prefix();
10020bbfda8aSnia			fprintf(stderr, "RplaySounds ignored; rplay support "
10030bbfda8aSnia					"not configured.\n");
10040bbfda8aSnia#else
10050bbfda8aSnia			sound_set_from_config();
10060bbfda8aSnia#endif
10070bbfda8aSnia		}
10080bbfda8aSnia		;
10090bbfda8aSnia
10100bbfda8aSniarplay_sounds_entries	: /* Empty */
10110bbfda8aSnia		| rplay_sounds_entries rplay_sounds_entry
10120bbfda8aSnia		;
10130bbfda8aSnia
10140bbfda8aSniarplay_sounds_entry	: string string {
10150bbfda8aSnia#ifdef SOUNDS
10160bbfda8aSnia			if(set_sound_event_name($1, $2) != 0) {
10170bbfda8aSnia				twmrc_error_prefix();
10180bbfda8aSnia				fprintf(stderr, "Failed adding sound for %s; "
10190bbfda8aSnia						"maybe event name is invalid?\n", $1);
10200bbfda8aSnia			}
10210bbfda8aSnia#endif
10220bbfda8aSnia		}
1023645f5050Syouri		;
1024645f5050Syouri
1025645f5050Syourifunction	: LB function_entries RB {}
1026645f5050Syouri		;
1027645f5050Syouri
1028645f5050Syourifunction_entries: /* Empty */
1029645f5050Syouri		| function_entries function_entry
1030645f5050Syouri		;
1031645f5050Syouri
1032645f5050Syourifunction_entry	: action		{ AddToMenu(root, "", Action, NULL, $1,
10330bbfda8aSnia						    NULL, NULL);
1034645f5050Syouri					  Action = "";
1035645f5050Syouri					}
1036645f5050Syouri		;
1037645f5050Syouri
10380bbfda8aSniamenu		: LB menu_entries RB {lastmenuitem = NULL;}
1039645f5050Syouri		;
1040645f5050Syouri
1041645f5050Syourimenu_entries	: /* Empty */
1042645f5050Syouri		| menu_entries menu_entry
1043645f5050Syouri		;
1044645f5050Syouri
1045645f5050Syourimenu_entry	: string action		{
1046645f5050Syouri			if ($2 == F_SEPARATOR) {
10470bbfda8aSnia			    if (lastmenuitem) lastmenuitem->separated = true;
1048645f5050Syouri			}
1049645f5050Syouri			else {
10500bbfda8aSnia			    lastmenuitem = AddToMenu(root, $1, Action, pull, $2, NULL, NULL);
1051645f5050Syouri			    Action = "";
1052645f5050Syouri			    pull = NULL;
1053645f5050Syouri			}
1054645f5050Syouri		}
1055645f5050Syouri		| string LP string COLON string RP action {
1056645f5050Syouri			if ($7 == F_SEPARATOR) {
10570bbfda8aSnia			    if (lastmenuitem) lastmenuitem->separated = true;
1058645f5050Syouri			}
1059645f5050Syouri			else {
1060645f5050Syouri			    lastmenuitem = AddToMenu(root, $1, Action, pull, $7, $3, $5);
1061645f5050Syouri			    Action = "";
1062645f5050Syouri			    pull = NULL;
1063645f5050Syouri			}
1064645f5050Syouri		}
1065645f5050Syouri		;
1066645f5050Syouri
1067645f5050Syouriaction		: FKEYWORD	{ $$ = $1; }
1068645f5050Syouri		| FSKEYWORD string {
1069645f5050Syouri				$$ = $1;
1070645f5050Syouri				Action = (char*)$2;
1071645f5050Syouri				switch ($1) {
1072645f5050Syouri				  case F_MENU:
10730bbfda8aSnia				    pull = GetRoot ($2, NULL,NULL);
1074645f5050Syouri				    pull->prev = root;
1075645f5050Syouri				    break;
1076645f5050Syouri				  case F_WARPRING:
1077645f5050Syouri				    if (!CheckWarpRingArg (Action)) {
1078645f5050Syouri					twmrc_error_prefix();
1079645f5050Syouri					fprintf (stderr,
1080645f5050Syouri			"ignoring invalid f.warptoring argument \"%s\"\n",
1081645f5050Syouri						 Action);
1082645f5050Syouri					$$ = F_NOP;
1083645f5050Syouri				    }
1084df1c27a6Snia				    break;
1085645f5050Syouri				  case F_WARPTOSCREEN:
1086645f5050Syouri				    if (!CheckWarpScreenArg (Action)) {
1087645f5050Syouri					twmrc_error_prefix();
1088645f5050Syouri					fprintf (stderr,
1089645f5050Syouri			"ignoring invalid f.warptoscreen argument \"%s\"\n",
1090645f5050Syouri						 Action);
1091645f5050Syouri					$$ = F_NOP;
1092645f5050Syouri				    }
1093645f5050Syouri				    break;
1094645f5050Syouri				  case F_COLORMAP:
1095645f5050Syouri				    if (CheckColormapArg (Action)) {
1096645f5050Syouri					$$ = F_COLORMAP;
1097645f5050Syouri				    } else {
1098645f5050Syouri					twmrc_error_prefix();
1099645f5050Syouri					fprintf (stderr,
1100645f5050Syouri			"ignoring invalid f.colormap argument \"%s\"\n",
1101645f5050Syouri						 Action);
1102645f5050Syouri					$$ = F_NOP;
1103645f5050Syouri				    }
1104645f5050Syouri				    break;
1105645f5050Syouri				} /* end switch */
1106645f5050Syouri				   }
1107645f5050Syouri		;
1108645f5050Syouri
1109645f5050Syouri
1110645f5050Syourisigned_number	: number		{ $$ = $1; }
1111645f5050Syouri		| PLUS number		{ $$ = $2; }
1112645f5050Syouri		| MINUS number		{ $$ = -($2); }
1113645f5050Syouri		;
1114645f5050Syouri
1115645f5050Syouributton		: BUTTON number		{ $$ = $2;
1116645f5050Syouri					  if ($2 == 0)
1117645f5050Syouri						yyerror("bad button 0");
1118645f5050Syouri
1119645f5050Syouri					  if ($2 > MAX_BUTTONS)
1120645f5050Syouri					  {
1121645f5050Syouri						$$ = 0;
1122645f5050Syouri						yyerror("button number too large");
1123645f5050Syouri					  }
1124645f5050Syouri					}
1125645f5050Syouri		;
1126645f5050Syouri
11270bbfda8aSniastring		: STRING		{ char *ptr = strdup($1);
1128645f5050Syouri					  RemoveDQuote(ptr);
1129645f5050Syouri					  $$ = ptr;
1130645f5050Syouri					}
1131645f5050Syouri		;
1132645f5050Syouri
1133645f5050Syourinumber		: NUMBER		{ $$ = $1; }
1134645f5050Syouri		;
1135645f5050Syouri
1136645f5050Syouri%%
1137