winprefsyacc.y revision 706f2543
1706f2543Smrg%{
2706f2543Smrg/*
3706f2543Smrg * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
4706f2543Smrg * Copyright (C) Colin Harrison 2005-2008
5706f2543Smrg *
6706f2543Smrg * Permission is hereby granted, free of charge, to any person obtaining
7706f2543Smrg * a copy of this software and associated documentation files (the
8706f2543Smrg * "Software"), to deal in the Software without restriction, including
9706f2543Smrg * without limitation the rights to use, copy, modify, merge, publish,
10706f2543Smrg * distribute, sublicense, and/or sell copies of the Software, and to
11706f2543Smrg * permit persons to whom the Software is furnished to do so, subject to
12706f2543Smrg * the following conditions:
13706f2543Smrg *
14706f2543Smrg * The above copyright notice and this permission notice shall be
15706f2543Smrg * included in all copies or substantial portions of the Software.
16706f2543Smrg *
17706f2543Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18706f2543Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19706f2543Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20706f2543Smrg * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
21706f2543Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
22706f2543Smrg * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23706f2543Smrg * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24706f2543Smrg *
25706f2543Smrg * Except as contained in this notice, the name of the XFree86 Project
26706f2543Smrg * shall not be used in advertising or otherwise to promote the sale, use
27706f2543Smrg * or other dealings in this Software without prior written authorization
28706f2543Smrg * from the XFree86 Project.
29706f2543Smrg *
30706f2543Smrg * Authors:     Earle F. Philhower, III
31706f2543Smrg *              Colin Harrison
32706f2543Smrg */
33706f2543Smrg/* $XFree86: $ */
34706f2543Smrg
35706f2543Smrg#ifdef HAVE_XWIN_CONFIG_H
36706f2543Smrg#include <xwin-config.h>
37706f2543Smrg#endif
38706f2543Smrg#include <stdio.h>
39706f2543Smrg#include <stdlib.h>
40706f2543Smrg#include <string.h>
41706f2543Smrg#include "winprefs.h"
42706f2543Smrg
43706f2543Smrg/* The following give better error messages in bison at the cost of a few KB */
44706f2543Smrg#define YYERROR_VERBOSE 1
45706f2543Smrg
46706f2543Smrg/* YYLTYPE_IS_TRIVIAL and YYENABLE_NLS defined to suppress warnings */
47706f2543Smrg#define YYLTYPE_IS_TRIVIAL 1
48706f2543Smrg#define YYENABLE_NLS 0
49706f2543Smrg
50706f2543Smrg/* The global pref settings */
51706f2543SmrgWINPREFS pref;
52706f2543Smrg
53706f2543Smrg/* The working menu */
54706f2543Smrgstatic MENUPARSED menu;
55706f2543Smrg
56706f2543Smrg/* Functions for parsing the tokens into out structure */
57706f2543Smrg/* Defined at the end section of this file */
58706f2543Smrg
59706f2543Smrgstatic void SetIconDirectory (char *path);
60706f2543Smrgstatic void SetDefaultIcon (char *fname);
61706f2543Smrgstatic void SetRootMenu (char *menu);
62706f2543Smrgstatic void SetDefaultSysMenu (char *menu, int pos);
63706f2543Smrgstatic void SetTrayIcon (char *fname);
64706f2543Smrg
65706f2543Smrgstatic void OpenMenu(char *menuname);
66706f2543Smrgstatic void AddMenuLine(char *name, MENUCOMMANDTYPE cmd, char *param);
67706f2543Smrgstatic void CloseMenu(void);
68706f2543Smrg
69706f2543Smrgstatic void OpenIcons(void);
70706f2543Smrgstatic void AddIconLine(char *matchstr, char *iconfile);
71706f2543Smrgstatic void CloseIcons(void);
72706f2543Smrg
73706f2543Smrgstatic void OpenStyles(void);
74706f2543Smrgstatic void AddStyleLine(char *matchstr, unsigned long style);
75706f2543Smrgstatic void CloseStyles(void);
76706f2543Smrg
77706f2543Smrgstatic void OpenSysMenu(void);
78706f2543Smrgstatic void AddSysMenuLine(char *matchstr, char *menuname, int pos);
79706f2543Smrgstatic void CloseSysMenu(void);
80706f2543Smrg
81706f2543Smrgstatic int yyerror (char *s);
82706f2543Smrg
83706f2543Smrgextern void ErrorF (const char* /*f*/, ...);
84706f2543Smrgextern char *yytext;
85706f2543Smrgextern int yylex(void);
86706f2543Smrg
87706f2543Smrg%}
88706f2543Smrg
89706f2543Smrg%union {
90706f2543Smrg  char *sVal;
91706f2543Smrg  unsigned long uVal;
92706f2543Smrg  int iVal;
93706f2543Smrg}
94706f2543Smrg
95706f2543Smrg%token NEWLINE
96706f2543Smrg%token MENU
97706f2543Smrg%token LB
98706f2543Smrg%token RB
99706f2543Smrg%token ICONDIRECTORY
100706f2543Smrg%token DEFAULTICON
101706f2543Smrg%token ICONS
102706f2543Smrg%token STYLES
103706f2543Smrg%token TOPMOST
104706f2543Smrg%token MAXIMIZE
105706f2543Smrg%token MINIMIZE
106706f2543Smrg%token BOTTOM
107706f2543Smrg%token NOTITLE
108706f2543Smrg%token OUTLINE
109706f2543Smrg%token NOFRAME
110706f2543Smrg%token DEFAULTSYSMENU
111706f2543Smrg%token SYSMENU
112706f2543Smrg%token ROOTMENU
113706f2543Smrg%token SEPARATOR
114706f2543Smrg%token ATSTART
115706f2543Smrg%token ATEND
116706f2543Smrg%token EXEC
117706f2543Smrg%token ALWAYSONTOP
118706f2543Smrg%token DEBUGOUTPUT "DEBUG"
119706f2543Smrg%token RELOAD
120706f2543Smrg%token TRAYICON
121706f2543Smrg%token FORCEEXIT
122706f2543Smrg%token SILENTEXIT
123706f2543Smrg
124706f2543Smrg%token <sVal> STRING
125706f2543Smrg%type <uVal>  group1
126706f2543Smrg%type <uVal>  group2
127706f2543Smrg%type <uVal>  stylecombo
128706f2543Smrg%type <iVal>  atspot
129706f2543Smrg
130706f2543Smrg%%
131706f2543Smrg
132706f2543Smrginput:	/* empty */
133706f2543Smrg	| input line
134706f2543Smrg	;
135706f2543Smrg
136706f2543Smrgline:	NEWLINE
137706f2543Smrg	| command
138706f2543Smrg	;
139706f2543Smrg
140706f2543Smrg
141706f2543Smrgnewline_or_nada:
142706f2543Smrg	| NEWLINE newline_or_nada
143706f2543Smrg	;
144706f2543Smrg
145706f2543Smrgcommand:	defaulticon
146706f2543Smrg	| icondirectory
147706f2543Smrg	| menu
148706f2543Smrg	| icons
149706f2543Smrg	| styles
150706f2543Smrg	| sysmenu
151706f2543Smrg	| rootmenu
152706f2543Smrg	| defaultsysmenu
153706f2543Smrg	| debug
154706f2543Smrg	| trayicon
155706f2543Smrg	| forceexit
156706f2543Smrg	| silentexit
157706f2543Smrg	;
158706f2543Smrg
159706f2543Smrgtrayicon:	TRAYICON STRING NEWLINE { SetTrayIcon($2); free($2); }
160706f2543Smrg	;
161706f2543Smrg
162706f2543Smrgrootmenu:	ROOTMENU STRING NEWLINE { SetRootMenu($2); free($2); }
163706f2543Smrg	;
164706f2543Smrg
165706f2543Smrgdefaultsysmenu:	DEFAULTSYSMENU STRING atspot NEWLINE { SetDefaultSysMenu($2, $3); free($2); }
166706f2543Smrg	;
167706f2543Smrg
168706f2543Smrgdefaulticon:	DEFAULTICON STRING NEWLINE { SetDefaultIcon($2); free($2); }
169706f2543Smrg	;
170706f2543Smrg
171706f2543Smrgicondirectory:	ICONDIRECTORY STRING NEWLINE { SetIconDirectory($2); free($2); }
172706f2543Smrg	;
173706f2543Smrg
174706f2543Smrgmenuline:	SEPARATOR NEWLINE newline_or_nada  { AddMenuLine("-", CMD_SEPARATOR, ""); }
175706f2543Smrg	| STRING ALWAYSONTOP NEWLINE newline_or_nada  { AddMenuLine($1, CMD_ALWAYSONTOP, ""); free($1); }
176706f2543Smrg	| STRING EXEC STRING NEWLINE newline_or_nada  { AddMenuLine($1, CMD_EXEC, $3); free($1); free($3); }
177706f2543Smrg	| STRING MENU STRING NEWLINE newline_or_nada  { AddMenuLine($1, CMD_MENU, $3); free($1); free($3); }
178706f2543Smrg	| STRING RELOAD NEWLINE newline_or_nada  { AddMenuLine($1, CMD_RELOAD, ""); free($1); }
179706f2543Smrg	;
180706f2543Smrg
181706f2543Smrgmenulist:	menuline
182706f2543Smrg	| menuline menulist
183706f2543Smrg	;
184706f2543Smrg
185706f2543Smrgmenu:	MENU STRING LB { OpenMenu($2); free($2); } newline_or_nada menulist RB {CloseMenu();}
186706f2543Smrg	;
187706f2543Smrg
188706f2543Smrgiconline:	STRING STRING NEWLINE newline_or_nada { AddIconLine($1, $2); free($1); free($2); }
189706f2543Smrg	;
190706f2543Smrg
191706f2543Smrgiconlist:	iconline
192706f2543Smrg	| iconline iconlist
193706f2543Smrg	;
194706f2543Smrg
195706f2543Smrgicons:	ICONS LB {OpenIcons();} newline_or_nada iconlist RB {CloseIcons();}
196706f2543Smrg	;
197706f2543Smrg
198706f2543Smrggroup1:	TOPMOST { $$=STYLE_TOPMOST; }
199706f2543Smrg	| MAXIMIZE { $$=STYLE_MAXIMIZE; }
200706f2543Smrg	| MINIMIZE { $$=STYLE_MINIMIZE; }
201706f2543Smrg	| BOTTOM { $$=STYLE_BOTTOM; }
202706f2543Smrg	;
203706f2543Smrg
204706f2543Smrggroup2:	NOTITLE { $$=STYLE_NOTITLE; }
205706f2543Smrg	| OUTLINE { $$=STYLE_OUTLINE; }
206706f2543Smrg	| NOFRAME { $$=STYLE_NOFRAME; }
207706f2543Smrg	;
208706f2543Smrg
209706f2543Smrgstylecombo:	group1 { $$=$1; }
210706f2543Smrg	| group2 { $$=$1; }
211706f2543Smrg	| group1 group2 { $$=$1|$2; }
212706f2543Smrg	| group2 group1 { $$=$1|$2; }
213706f2543Smrg	;
214706f2543Smrg
215706f2543Smrgstyleline:	STRING stylecombo NEWLINE newline_or_nada { AddStyleLine($1, $2); free($1); }
216706f2543Smrg	;
217706f2543Smrg
218706f2543Smrgstylelist:	styleline
219706f2543Smrg	| styleline stylelist
220706f2543Smrg	;
221706f2543Smrg
222706f2543Smrgstyles:	STYLES LB {OpenStyles();} newline_or_nada stylelist RB {CloseStyles();}
223706f2543Smrg	;
224706f2543Smrg
225706f2543Smrgatspot:	{ $$=AT_END; }
226706f2543Smrg	| ATSTART { $$=AT_START; }
227706f2543Smrg	| ATEND { $$=AT_END; }
228706f2543Smrg	;
229706f2543Smrg
230706f2543Smrgsysmenuline:	STRING STRING atspot NEWLINE newline_or_nada { AddSysMenuLine($1, $2, $3); free($1); free($2); }
231706f2543Smrg	;
232706f2543Smrg
233706f2543Smrgsysmenulist:	sysmenuline
234706f2543Smrg	| sysmenuline sysmenulist
235706f2543Smrg	;
236706f2543Smrg
237706f2543Smrgsysmenu:	SYSMENU LB NEWLINE {OpenSysMenu();} newline_or_nada sysmenulist RB {CloseSysMenu();}
238706f2543Smrg	;
239706f2543Smrg
240706f2543Smrgforceexit:	FORCEEXIT NEWLINE { pref.fForceExit = TRUE; }
241706f2543Smrg	;
242706f2543Smrg
243706f2543Smrgsilentexit:	SILENTEXIT NEWLINE { pref.fSilentExit = TRUE; }
244706f2543Smrg	;
245706f2543Smrg
246706f2543Smrgdebug: 	DEBUGOUTPUT STRING NEWLINE { ErrorF("LoadPreferences: %s\n", $2); free($2); }
247706f2543Smrg	;
248706f2543Smrg
249706f2543Smrg
250706f2543Smrg%%
251706f2543Smrg/*
252706f2543Smrg * Errors in parsing abort and print log messages
253706f2543Smrg */
254706f2543Smrgstatic int
255706f2543Smrgyyerror (char *s)
256706f2543Smrg{
257706f2543Smrg  extern int yylineno; /* Handled by flex internally */
258706f2543Smrg
259706f2543Smrg  ErrorF("LoadPreferences: %s line %d\n", s, yylineno);
260706f2543Smrg  return 1;
261706f2543Smrg}
262706f2543Smrg
263706f2543Smrg/* Miscellaneous functions to store TOKENs into the structure */
264706f2543Smrgstatic void
265706f2543SmrgSetIconDirectory (char *path)
266706f2543Smrg{
267706f2543Smrg  strncpy (pref.iconDirectory, path, PATH_MAX);
268706f2543Smrg  pref.iconDirectory[PATH_MAX] = 0;
269706f2543Smrg}
270706f2543Smrg
271706f2543Smrgstatic void
272706f2543SmrgSetDefaultIcon (char *fname)
273706f2543Smrg{
274706f2543Smrg  strncpy (pref.defaultIconName, fname, NAME_MAX);
275706f2543Smrg  pref.defaultIconName[NAME_MAX] = 0;
276706f2543Smrg}
277706f2543Smrg
278706f2543Smrgstatic void
279706f2543SmrgSetTrayIcon (char *fname)
280706f2543Smrg{
281706f2543Smrg  strncpy (pref.trayIconName, fname, NAME_MAX);
282706f2543Smrg  pref.trayIconName[NAME_MAX] = 0;
283706f2543Smrg}
284706f2543Smrg
285706f2543Smrgstatic void
286706f2543SmrgSetRootMenu (char *menu)
287706f2543Smrg{
288706f2543Smrg  strncpy (pref.rootMenuName, menu, MENU_MAX);
289706f2543Smrg  pref.rootMenuName[MENU_MAX] = 0;
290706f2543Smrg}
291706f2543Smrg
292706f2543Smrgstatic void
293706f2543SmrgSetDefaultSysMenu (char *menu, int pos)
294706f2543Smrg{
295706f2543Smrg  strncpy (pref.defaultSysMenuName, menu, MENU_MAX);
296706f2543Smrg  pref.defaultSysMenuName[MENU_MAX] = 0;
297706f2543Smrg  pref.defaultSysMenuPos = pos;
298706f2543Smrg}
299706f2543Smrg
300706f2543Smrgstatic void
301706f2543SmrgOpenMenu (char *menuname)
302706f2543Smrg{
303706f2543Smrg  if (menu.menuItem) free(menu.menuItem);
304706f2543Smrg  menu.menuItem = NULL;
305706f2543Smrg  strncpy(menu.menuName, menuname, MENU_MAX);
306706f2543Smrg  menu.menuName[MENU_MAX] = 0;
307706f2543Smrg  menu.menuItems = 0;
308706f2543Smrg}
309706f2543Smrg
310706f2543Smrgstatic void
311706f2543SmrgAddMenuLine (char *text, MENUCOMMANDTYPE cmd, char *param)
312706f2543Smrg{
313706f2543Smrg  if (menu.menuItem==NULL)
314706f2543Smrg    menu.menuItem = (MENUITEM*)malloc(sizeof(MENUITEM));
315706f2543Smrg  else
316706f2543Smrg    menu.menuItem = (MENUITEM*)
317706f2543Smrg      realloc(menu.menuItem, sizeof(MENUITEM)*(menu.menuItems+1));
318706f2543Smrg
319706f2543Smrg  strncpy (menu.menuItem[menu.menuItems].text, text, MENU_MAX);
320706f2543Smrg  menu.menuItem[menu.menuItems].text[MENU_MAX] = 0;
321706f2543Smrg
322706f2543Smrg  menu.menuItem[menu.menuItems].cmd = cmd;
323706f2543Smrg
324706f2543Smrg  strncpy(menu.menuItem[menu.menuItems].param, param, PARAM_MAX);
325706f2543Smrg  menu.menuItem[menu.menuItems].param[PARAM_MAX] = 0;
326706f2543Smrg
327706f2543Smrg  menu.menuItem[menu.menuItems].commandID = 0;
328706f2543Smrg
329706f2543Smrg  menu.menuItems++;
330706f2543Smrg}
331706f2543Smrg
332706f2543Smrgstatic void
333706f2543SmrgCloseMenu (void)
334706f2543Smrg{
335706f2543Smrg  if (menu.menuItem==NULL || menu.menuItems==0)
336706f2543Smrg    {
337706f2543Smrg      ErrorF("LoadPreferences: Empty menu detected\n");
338706f2543Smrg      return;
339706f2543Smrg    }
340706f2543Smrg
341706f2543Smrg  if (pref.menuItems)
342706f2543Smrg    pref.menu = (MENUPARSED*)
343706f2543Smrg      realloc (pref.menu, (pref.menuItems+1)*sizeof(MENUPARSED));
344706f2543Smrg  else
345706f2543Smrg    pref.menu = (MENUPARSED*)malloc (sizeof(MENUPARSED));
346706f2543Smrg
347706f2543Smrg  memcpy (pref.menu+pref.menuItems, &menu, sizeof(MENUPARSED));
348706f2543Smrg  pref.menuItems++;
349706f2543Smrg
350706f2543Smrg  memset (&menu, 0, sizeof(MENUPARSED));
351706f2543Smrg}
352706f2543Smrg
353706f2543Smrgstatic void
354706f2543SmrgOpenIcons (void)
355706f2543Smrg{
356706f2543Smrg  if (pref.icon != NULL) {
357706f2543Smrg    ErrorF("LoadPreferences: Redefining icon mappings\n");
358706f2543Smrg    free(pref.icon);
359706f2543Smrg    pref.icon = NULL;
360706f2543Smrg  }
361706f2543Smrg  pref.iconItems = 0;
362706f2543Smrg}
363706f2543Smrg
364706f2543Smrgstatic void
365706f2543SmrgAddIconLine (char *matchstr, char *iconfile)
366706f2543Smrg{
367706f2543Smrg  if (pref.icon==NULL)
368706f2543Smrg    pref.icon = (ICONITEM*)malloc(sizeof(ICONITEM));
369706f2543Smrg  else
370706f2543Smrg    pref.icon = (ICONITEM*)
371706f2543Smrg      realloc(pref.icon, sizeof(ICONITEM)*(pref.iconItems+1));
372706f2543Smrg
373706f2543Smrg  strncpy(pref.icon[pref.iconItems].match, matchstr, MENU_MAX);
374706f2543Smrg  pref.icon[pref.iconItems].match[MENU_MAX] = 0;
375706f2543Smrg
376706f2543Smrg  strncpy(pref.icon[pref.iconItems].iconFile, iconfile, PATH_MAX+NAME_MAX+1);
377706f2543Smrg  pref.icon[pref.iconItems].iconFile[PATH_MAX+NAME_MAX+1] = 0;
378706f2543Smrg
379706f2543Smrg  pref.icon[pref.iconItems].hicon = 0;
380706f2543Smrg
381706f2543Smrg  pref.iconItems++;
382706f2543Smrg}
383706f2543Smrg
384706f2543Smrgstatic void
385706f2543SmrgCloseIcons (void)
386706f2543Smrg{
387706f2543Smrg}
388706f2543Smrg
389706f2543Smrgstatic void
390706f2543SmrgOpenStyles (void)
391706f2543Smrg{
392706f2543Smrg  if (pref.style != NULL) {
393706f2543Smrg    ErrorF("LoadPreferences: Redefining window style\n");
394706f2543Smrg    free(pref.style);
395706f2543Smrg    pref.style = NULL;
396706f2543Smrg  }
397706f2543Smrg  pref.styleItems = 0;
398706f2543Smrg}
399706f2543Smrg
400706f2543Smrgstatic void
401706f2543SmrgAddStyleLine (char *matchstr, unsigned long style)
402706f2543Smrg{
403706f2543Smrg  if (pref.style==NULL)
404706f2543Smrg    pref.style = (STYLEITEM*)malloc(sizeof(STYLEITEM));
405706f2543Smrg  else
406706f2543Smrg    pref.style = (STYLEITEM*)
407706f2543Smrg      realloc(pref.style, sizeof(STYLEITEM)*(pref.styleItems+1));
408706f2543Smrg
409706f2543Smrg  strncpy(pref.style[pref.styleItems].match, matchstr, MENU_MAX);
410706f2543Smrg  pref.style[pref.styleItems].match[MENU_MAX] = 0;
411706f2543Smrg
412706f2543Smrg  pref.style[pref.styleItems].type = style;
413706f2543Smrg
414706f2543Smrg  pref.styleItems++;
415706f2543Smrg}
416706f2543Smrg
417706f2543Smrgstatic void
418706f2543SmrgCloseStyles (void)
419706f2543Smrg{
420706f2543Smrg}
421706f2543Smrg
422706f2543Smrgstatic void
423706f2543SmrgOpenSysMenu (void)
424706f2543Smrg{
425706f2543Smrg  if (pref.sysMenu != NULL) {
426706f2543Smrg    ErrorF("LoadPreferences: Redefining system menu\n");
427706f2543Smrg    free(pref.sysMenu);
428706f2543Smrg    pref.sysMenu = NULL;
429706f2543Smrg  }
430706f2543Smrg  pref.sysMenuItems = 0;
431706f2543Smrg}
432706f2543Smrg
433706f2543Smrgstatic void
434706f2543SmrgAddSysMenuLine (char *matchstr, char *menuname, int pos)
435706f2543Smrg{
436706f2543Smrg  if (pref.sysMenu==NULL)
437706f2543Smrg    pref.sysMenu = (SYSMENUITEM*)malloc(sizeof(SYSMENUITEM));
438706f2543Smrg  else
439706f2543Smrg    pref.sysMenu = (SYSMENUITEM*)
440706f2543Smrg      realloc(pref.sysMenu, sizeof(SYSMENUITEM)*(pref.sysMenuItems+1));
441706f2543Smrg
442706f2543Smrg  strncpy (pref.sysMenu[pref.sysMenuItems].match, matchstr, MENU_MAX);
443706f2543Smrg  pref.sysMenu[pref.sysMenuItems].match[MENU_MAX] = 0;
444706f2543Smrg
445706f2543Smrg  strncpy (pref.sysMenu[pref.sysMenuItems].menuName, menuname, MENU_MAX);
446706f2543Smrg  pref.sysMenu[pref.sysMenuItems].menuName[MENU_MAX] = 0;
447706f2543Smrg
448706f2543Smrg  pref.sysMenu[pref.sysMenuItems].menuPos = pos;
449706f2543Smrg
450706f2543Smrg  pref.sysMenuItems++;
451706f2543Smrg}
452706f2543Smrg
453706f2543Smrgstatic void
454706f2543SmrgCloseSysMenu (void)
455706f2543Smrg{
456706f2543Smrg}
457706f2543Smrg
458