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