xref: /OK3568_Linux_fs/external/xserver/hw/xwin/winprefsyacc.y (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 %{
2 /*
3  * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
4  * Copyright (C) Colin Harrison 2005-2008
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be
15  * included in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
22  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  *
25  * Except as contained in this notice, the name of the XFree86 Project
26  * shall not be used in advertising or otherwise to promote the sale, use
27  * or other dealings in this Software without prior written authorization
28  * from the XFree86 Project.
29  *
30  * Authors:     Earle F. Philhower, III
31  *              Colin Harrison
32  */
33 /* $XFree86: $ */
34 
35 #ifdef HAVE_XWIN_CONFIG_H
36 #include <xwin-config.h>
37 #endif
38 #include <stdio.h>
39 #include <stdlib.h>
40 #define _STDLIB_H 1 /* bison checks this to know if stdlib has been included */
41 #include <string.h>
42 #include "winprefs.h"
43 
44 /* The following give better error messages in bison at the cost of a few KB */
45 #define YYERROR_VERBOSE 1
46 
47 /* YYLTYPE_IS_TRIVIAL and YYENABLE_NLS defined to suppress warnings */
48 #define YYLTYPE_IS_TRIVIAL 1
49 #define YYENABLE_NLS 0
50 
51 /* The global pref settings */
52 WINPREFS pref;
53 
54 /* The working menu */
55 static MENUPARSED menu;
56 
57 /* Functions for parsing the tokens into out structure */
58 /* Defined at the end section of this file */
59 
60 static void SetIconDirectory (char *path);
61 static void SetDefaultIcon (char *fname);
62 static void SetRootMenu (char *menu);
63 static void SetDefaultSysMenu (char *menu, int pos);
64 static void SetTrayIcon (char *fname);
65 
66 static void OpenMenu(char *menuname);
67 static void AddMenuLine(const char *name, MENUCOMMANDTYPE cmd, const char *param);
68 static void CloseMenu(void);
69 
70 static void OpenIcons(void);
71 static void AddIconLine(char *matchstr, char *iconfile);
72 static void CloseIcons(void);
73 
74 static void OpenStyles(void);
75 static void AddStyleLine(char *matchstr, unsigned long style);
76 static void CloseStyles(void);
77 
78 static void OpenSysMenu(void);
79 static void AddSysMenuLine(char *matchstr, char *menuname, int pos);
80 static void CloseSysMenu(void);
81 
82 static int yyerror (const char *s);
83 
84 extern char *yytext;
85 extern int yylineno;
86 extern int yylex(void);
87 
88 %}
89 
90 %union {
91   char *sVal;
92   unsigned long uVal;
93   int iVal;
94 }
95 
96 %token NEWLINE
97 %token MENU
98 %token LB
99 %token RB
100 %token ICONDIRECTORY
101 %token DEFAULTICON
102 %token ICONS
103 %token STYLES
104 %token TOPMOST
105 %token MAXIMIZE
106 %token MINIMIZE
107 %token BOTTOM
108 %token NOTITLE
109 %token OUTLINE
110 %token NOFRAME
111 %token DEFAULTSYSMENU
112 %token SYSMENU
113 %token ROOTMENU
114 %token SEPARATOR
115 %token ATSTART
116 %token ATEND
117 %token EXEC
118 %token ALWAYSONTOP
119 %token DEBUGOUTPUT "DEBUG"
120 %token RELOAD
121 %token TRAYICON
122 %token FORCEEXIT
123 %token SILENTEXIT
124 
125 %token <sVal> STRING
126 %type <uVal>  group1
127 %type <uVal>  group2
128 %type <uVal>  stylecombo
129 %type <iVal>  atspot
130 
131 %%
132 
133 input:	/* empty */
134 	| input line
135 	;
136 
137 line:	NEWLINE
138 	| command
139 	;
140 
141 
142 newline_or_nada:
143 	| NEWLINE newline_or_nada
144 	;
145 
146 command:	defaulticon
147 	| icondirectory
148 	| menu
149 	| icons
150 	| styles
151 	| sysmenu
152 	| rootmenu
153 	| defaultsysmenu
154 	| debug
155 	| trayicon
156 	| forceexit
157 	| silentexit
158 	;
159 
160 trayicon:	TRAYICON STRING NEWLINE { SetTrayIcon($2); free($2); }
161 	;
162 
163 rootmenu:	ROOTMENU STRING NEWLINE { SetRootMenu($2); free($2); }
164 	;
165 
166 defaultsysmenu:	DEFAULTSYSMENU STRING atspot NEWLINE { SetDefaultSysMenu($2, $3); free($2); }
167 	;
168 
169 defaulticon:	DEFAULTICON STRING NEWLINE { SetDefaultIcon($2); free($2); }
170 	;
171 
172 icondirectory:	ICONDIRECTORY STRING NEWLINE { SetIconDirectory($2); free($2); }
173 	;
174 
175 menuline:	SEPARATOR NEWLINE newline_or_nada  { AddMenuLine("-", CMD_SEPARATOR, ""); }
176 	| STRING ALWAYSONTOP NEWLINE newline_or_nada  { AddMenuLine($1, CMD_ALWAYSONTOP, ""); free($1); }
177 	| STRING EXEC STRING NEWLINE newline_or_nada  { AddMenuLine($1, CMD_EXEC, $3); free($1); free($3); }
178 	| STRING MENU STRING NEWLINE newline_or_nada  { AddMenuLine($1, CMD_MENU, $3); free($1); free($3); }
179 	| STRING RELOAD NEWLINE newline_or_nada  { AddMenuLine($1, CMD_RELOAD, ""); free($1); }
180 	;
181 
182 menulist:	menuline
183 	| menuline menulist
184 	;
185 
186 menu:	MENU STRING LB { OpenMenu($2); free($2); } newline_or_nada menulist RB {CloseMenu();}
187 	;
188 
189 iconline:	STRING STRING NEWLINE newline_or_nada { AddIconLine($1, $2); free($1); free($2); }
190 	;
191 
192 iconlist:	iconline
193 	| iconline iconlist
194 	;
195 
196 icons:	ICONS LB {OpenIcons();} newline_or_nada iconlist RB {CloseIcons();}
197 	;
198 
199 group1:	TOPMOST { $$=STYLE_TOPMOST; }
200 	| MAXIMIZE { $$=STYLE_MAXIMIZE; }
201 	| MINIMIZE { $$=STYLE_MINIMIZE; }
202 	| BOTTOM { $$=STYLE_BOTTOM; }
203 	;
204 
205 group2:	NOTITLE { $$=STYLE_NOTITLE; }
206 	| OUTLINE { $$=STYLE_OUTLINE; }
207 	| NOFRAME { $$=STYLE_NOFRAME; }
208 	;
209 
210 stylecombo:	group1 { $$=$1; }
211 	| group2 { $$=$1; }
212 	| group1 group2 { $$=$1|$2; }
213 	| group2 group1 { $$=$1|$2; }
214 	;
215 
216 styleline:	STRING stylecombo NEWLINE newline_or_nada { AddStyleLine($1, $2); free($1); }
217 	;
218 
219 stylelist:	styleline
220 	| styleline stylelist
221 	;
222 
223 styles:	STYLES LB {OpenStyles();} newline_or_nada stylelist RB {CloseStyles();}
224 	;
225 
226 atspot:	{ $$=AT_END; }
227 	| ATSTART { $$=AT_START; }
228 	| ATEND { $$=AT_END; }
229 	;
230 
231 sysmenuline:	STRING STRING atspot NEWLINE newline_or_nada { AddSysMenuLine($1, $2, $3); free($1); free($2); }
232 	;
233 
234 sysmenulist:	sysmenuline
235 	| sysmenuline sysmenulist
236 	;
237 
238 sysmenu:	SYSMENU LB NEWLINE {OpenSysMenu();} newline_or_nada sysmenulist RB {CloseSysMenu();}
239 	;
240 
241 forceexit:	FORCEEXIT NEWLINE { pref.fForceExit = TRUE; }
242 	;
243 
244 silentexit:	SILENTEXIT NEWLINE { pref.fSilentExit = TRUE; }
245 	;
246 
247 debug: 	DEBUGOUTPUT STRING NEWLINE { ErrorF("LoadPreferences: %s\n", $2); free($2); }
248 	;
249 
250 
251 %%
252 /*
253  * Errors in parsing abort and print log messages
254  */
255 static int
256 yyerror (const char *s)
257 {
258   ErrorF("LoadPreferences: %s line %d\n", s, yylineno);
259   return 1;
260 }
261 
262 /* Miscellaneous functions to store TOKENs into the structure */
263 static void
SetIconDirectory(char * path)264 SetIconDirectory (char *path)
265 {
266   strncpy (pref.iconDirectory, path, PATH_MAX);
267   pref.iconDirectory[PATH_MAX] = 0;
268 }
269 
270 static void
SetDefaultIcon(char * fname)271 SetDefaultIcon (char *fname)
272 {
273   strncpy (pref.defaultIconName, fname, NAME_MAX);
274   pref.defaultIconName[NAME_MAX] = 0;
275 }
276 
277 static void
SetTrayIcon(char * fname)278 SetTrayIcon (char *fname)
279 {
280   strncpy (pref.trayIconName, fname, NAME_MAX);
281   pref.trayIconName[NAME_MAX] = 0;
282 }
283 
284 static void
SetRootMenu(char * menuname)285 SetRootMenu (char *menuname)
286 {
287   strncpy (pref.rootMenuName, menuname, MENU_MAX);
288   pref.rootMenuName[MENU_MAX] = 0;
289 }
290 
291 static void
SetDefaultSysMenu(char * menuname,int pos)292 SetDefaultSysMenu (char *menuname, int pos)
293 {
294   strncpy (pref.defaultSysMenuName, menuname, MENU_MAX);
295   pref.defaultSysMenuName[MENU_MAX] = 0;
296   pref.defaultSysMenuPos = pos;
297 }
298 
299 static void
OpenMenu(char * menuname)300 OpenMenu (char *menuname)
301 {
302   if (menu.menuItem) free(menu.menuItem);
303   menu.menuItem = NULL;
304   strncpy(menu.menuName, menuname, MENU_MAX);
305   menu.menuName[MENU_MAX] = 0;
306   menu.menuItems = 0;
307 }
308 
309 static void
AddMenuLine(const char * text,MENUCOMMANDTYPE cmd,const char * param)310 AddMenuLine (const char *text, MENUCOMMANDTYPE cmd, const char *param)
311 {
312   if (menu.menuItem==NULL)
313     menu.menuItem = malloc(sizeof(MENUITEM));
314   else
315     menu.menuItem = realloc(menu.menuItem, sizeof(MENUITEM)*(menu.menuItems+1));
316 
317   strncpy (menu.menuItem[menu.menuItems].text, text, MENU_MAX);
318   menu.menuItem[menu.menuItems].text[MENU_MAX] = 0;
319 
320   menu.menuItem[menu.menuItems].cmd = cmd;
321 
322   strncpy(menu.menuItem[menu.menuItems].param, param, PARAM_MAX);
323   menu.menuItem[menu.menuItems].param[PARAM_MAX] = 0;
324 
325   menu.menuItem[menu.menuItems].commandID = 0;
326 
327   menu.menuItems++;
328 }
329 
330 static void
CloseMenu(void)331 CloseMenu (void)
332 {
333   if (menu.menuItem==NULL || menu.menuItems==0)
334     {
335       ErrorF("LoadPreferences: Empty menu detected\n");
336       return;
337     }
338 
339   if (pref.menuItems)
340     pref.menu = realloc (pref.menu, (pref.menuItems+1)*sizeof(MENUPARSED));
341   else
342     pref.menu = malloc (sizeof(MENUPARSED));
343 
344   memcpy (pref.menu+pref.menuItems, &menu, sizeof(MENUPARSED));
345   pref.menuItems++;
346 
347   memset (&menu, 0, sizeof(MENUPARSED));
348 }
349 
350 static void
OpenIcons(void)351 OpenIcons (void)
352 {
353   if (pref.icon != NULL) {
354     ErrorF("LoadPreferences: Redefining icon mappings\n");
355     free(pref.icon);
356     pref.icon = NULL;
357   }
358   pref.iconItems = 0;
359 }
360 
361 static void
AddIconLine(char * matchstr,char * iconfile)362 AddIconLine (char *matchstr, char *iconfile)
363 {
364   if (pref.icon==NULL)
365     pref.icon = malloc(sizeof(ICONITEM));
366   else
367     pref.icon = realloc(pref.icon, sizeof(ICONITEM)*(pref.iconItems+1));
368 
369   strncpy(pref.icon[pref.iconItems].match, matchstr, MENU_MAX);
370   pref.icon[pref.iconItems].match[MENU_MAX] = 0;
371 
372   strncpy(pref.icon[pref.iconItems].iconFile, iconfile, PATH_MAX+NAME_MAX+1);
373   pref.icon[pref.iconItems].iconFile[PATH_MAX+NAME_MAX+1] = 0;
374 
375   pref.icon[pref.iconItems].hicon = 0;
376 
377   pref.iconItems++;
378 }
379 
380 static void
CloseIcons(void)381 CloseIcons (void)
382 {
383 }
384 
385 static void
OpenStyles(void)386 OpenStyles (void)
387 {
388   if (pref.style != NULL) {
389     ErrorF("LoadPreferences: Redefining window style\n");
390     free(pref.style);
391     pref.style = NULL;
392   }
393   pref.styleItems = 0;
394 }
395 
396 static void
AddStyleLine(char * matchstr,unsigned long style)397 AddStyleLine (char *matchstr, unsigned long style)
398 {
399   if (pref.style==NULL)
400     pref.style = malloc(sizeof(STYLEITEM));
401   else
402     pref.style = realloc(pref.style, sizeof(STYLEITEM)*(pref.styleItems+1));
403 
404   strncpy(pref.style[pref.styleItems].match, matchstr, MENU_MAX);
405   pref.style[pref.styleItems].match[MENU_MAX] = 0;
406 
407   pref.style[pref.styleItems].type = style;
408 
409   pref.styleItems++;
410 }
411 
412 static void
CloseStyles(void)413 CloseStyles (void)
414 {
415 }
416 
417 static void
OpenSysMenu(void)418 OpenSysMenu (void)
419 {
420   if (pref.sysMenu != NULL) {
421     ErrorF("LoadPreferences: Redefining system menu\n");
422     free(pref.sysMenu);
423     pref.sysMenu = NULL;
424   }
425   pref.sysMenuItems = 0;
426 }
427 
428 static void
AddSysMenuLine(char * matchstr,char * menuname,int pos)429 AddSysMenuLine (char *matchstr, char *menuname, int pos)
430 {
431   if (pref.sysMenu==NULL)
432     pref.sysMenu = malloc(sizeof(SYSMENUITEM));
433   else
434     pref.sysMenu = realloc(pref.sysMenu, sizeof(SYSMENUITEM)*(pref.sysMenuItems+1));
435 
436   strncpy (pref.sysMenu[pref.sysMenuItems].match, matchstr, MENU_MAX);
437   pref.sysMenu[pref.sysMenuItems].match[MENU_MAX] = 0;
438 
439   strncpy (pref.sysMenu[pref.sysMenuItems].menuName, menuname, MENU_MAX);
440   pref.sysMenu[pref.sysMenuItems].menuName[MENU_MAX] = 0;
441 
442   pref.sysMenu[pref.sysMenuItems].menuPos = pos;
443 
444   pref.sysMenuItems++;
445 }
446 
447 static void
CloseSysMenu(void)448 CloseSysMenu (void)
449 {
450 }
451 
452