gram.y revision f66df612
13e747e6dSmrg/*****************************************************************************/ 23e747e6dSmrg/* 33e747e6dSmrg 43e747e6dSmrgCopyright 1989, 1998 The Open Group 53e747e6dSmrg 63e747e6dSmrgPermission to use, copy, modify, distribute, and sell this software and its 73e747e6dSmrgdocumentation for any purpose is hereby granted without fee, provided that 83e747e6dSmrgthe above copyright notice appear in all copies and that both that 93e747e6dSmrgcopyright notice and this permission notice appear in supporting 103e747e6dSmrgdocumentation. 113e747e6dSmrg 123e747e6dSmrgThe above copyright notice and this permission notice shall be included in 133e747e6dSmrgall copies or substantial portions of the Software. 143e747e6dSmrg 153e747e6dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 163e747e6dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 173e747e6dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 183e747e6dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 193e747e6dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 203e747e6dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 213e747e6dSmrg 223e747e6dSmrgExcept as contained in this notice, the name of The Open Group shall not be 233e747e6dSmrgused in advertising or otherwise to promote the sale, use or other dealings 243e747e6dSmrgin this Software without prior written authorization from The Open Group. 253e747e6dSmrg 263e747e6dSmrg*/ 273e747e6dSmrg/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ 283e747e6dSmrg/** Salt Lake City, Utah **/ 293e747e6dSmrg/** Cambridge, Massachusetts **/ 303e747e6dSmrg/** **/ 313e747e6dSmrg/** All Rights Reserved **/ 323e747e6dSmrg/** **/ 333e747e6dSmrg/** Permission to use, copy, modify, and distribute this software and **/ 343e747e6dSmrg/** its documentation for any purpose and without fee is hereby **/ 353e747e6dSmrg/** granted, provided that the above copyright notice appear in all **/ 363e747e6dSmrg/** copies and that both that copyright notice and this permis- **/ 373e747e6dSmrg/** sion notice appear in supporting documentation, and that the **/ 383e747e6dSmrg/** name of Evans & Sutherland not be used in advertising **/ 393e747e6dSmrg/** in publicity pertaining to distribution of the software without **/ 403e747e6dSmrg/** specific, written prior permission. **/ 413e747e6dSmrg/** **/ 423e747e6dSmrg/** EVANS & SUTHERLAND DISCLAIMs ALL WARRANTIES WITH REGARD **/ 433e747e6dSmrg/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ 443e747e6dSmrg/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND **/ 453e747e6dSmrg/** BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ 463e747e6dSmrg/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ 473e747e6dSmrg/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ 483e747e6dSmrg/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ 493e747e6dSmrg/** OR PERFORMANCE OF THIS SOFTWARE. **/ 503e747e6dSmrg/*****************************************************************************/ 513e747e6dSmrg 523e747e6dSmrg 533e747e6dSmrg/*********************************************************************** 543e747e6dSmrg * 553e747e6dSmrg * $Xorg: gram.y,v 1.4 2001/02/09 02:05:36 xorgcvs Exp $ 563e747e6dSmrg * 57f66df612Smrg * .twmrc command grammar 583e747e6dSmrg * 59f66df612Smrg * 07-Jan-86 Thomas E. LaStrange File created 603e747e6dSmrg * 11-Nov-90 Dave Sternlicht Adding SaveColors 613e747e6dSmrg * 10-Oct-90 David M. Sternlicht Storing saved colors on root 623e747e6dSmrg * 633e747e6dSmrg * $XFree86: xc/programs/twm/gram.y,v 3.8 2002/10/16 21:33:03 tsi Exp $ 643e747e6dSmrg * 653e747e6dSmrg ***********************************************************************/ 663e747e6dSmrg 673e747e6dSmrg%{ 68f66df612Smrg 693e747e6dSmrg#include <stdio.h> 703e747e6dSmrg#include <ctype.h> 713e747e6dSmrg#include "twm.h" 723e747e6dSmrg#include "menus.h" 733e747e6dSmrg#include "list.h" 743e747e6dSmrg#include "util.h" 753e747e6dSmrg#include "screen.h" 763e747e6dSmrg#include "parse.h" 773e747e6dSmrg#include "add_window.h" 783e747e6dSmrg#include "icons.h" 793e747e6dSmrg#include <X11/Xos.h> 803e747e6dSmrg#include <X11/Xmu/CharSet.h> 813e747e6dSmrg 82f66df612Smrgstatic char empty[1]; 83f66df612Smrgstatic char *Action = empty; 84f66df612Smrgstatic char *Name = empty; 85f66df612Smrgstatic MenuRoot *root, *pull = NULL; 863e747e6dSmrg 87f66df612Smrgstatic MenuRoot *GetRoot(const char *name, const char *fore, const char *back); 88f66df612Smrgstatic void GotButton(int butt, int func); 89f66df612Smrgstatic void GotKey(char *key, int func); 90f66df612Smrgstatic void GotTitleButton(char *bitmapname, int func, Bool rightside); 91f66df612Smrgstatic Bool CheckWarpScreenArg(char *s); 92f66df612Smrgstatic Bool CheckWarpRingArg(char *s); 93f66df612Smrgstatic Bool CheckColormapArg(char *s); 94f66df612Smrgstatic void RemoveDQuote(char *str); 953e747e6dSmrg 963e747e6dSmrgstatic char *ptr; 973e747e6dSmrgstatic name_list **list; 983e747e6dSmrgstatic int cont = 0; 993e747e6dSmrgstatic int color; 1003e747e6dSmrgint mods = 0; 1013e747e6dSmrgunsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask); 1023e747e6dSmrg 1033e747e6dSmrgextern int yylineno; 104f66df612Smrgstatic void yyerror(const char *s); 105c2535118Smrg 1063e747e6dSmrg%} 1073e747e6dSmrg 1083e747e6dSmrg%union 1093e747e6dSmrg{ 1103e747e6dSmrg int num; 1113e747e6dSmrg char *ptr; 1123e747e6dSmrg}; 1133e747e6dSmrg 1143e747e6dSmrg%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS 115c2535118Smrg%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION 1163e747e6dSmrg%token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS 1173e747e6dSmrg%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE GRAYSCALE 118c2535118Smrg%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING 119c2535118Smrg%token <num> NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION 120c2535118Smrg%token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME 1213e747e6dSmrg%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE 1223e747e6dSmrg%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE 123c2535118Smrg%token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON 124c2535118Smrg%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD 1253e747e6dSmrg%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN 1263e747e6dSmrg%token <num> NO_STACKMODE 127c2535118Smrg%token <ptr> STRING 128f66df612Smrg%token <num> error 1293e747e6dSmrg 1303e747e6dSmrg%type <ptr> string 1313e747e6dSmrg%type <num> pixmap_list cursor_list color_list save_color_list stmt 1323e747e6dSmrg%type <num> win_color_list iconm_list win_list icon_list function menu 133f66df612Smrg%type <num> noarg sarg narg squeeze color_entry 1343e747e6dSmrg%type <num> action button number signed_number full fullkey 1353e747e6dSmrg 136c2535118Smrg%start twmrc 1373e747e6dSmrg 1383e747e6dSmrg%% 139f66df612Smrgtwmrc : stmts 140f66df612Smrg ; 141f66df612Smrg 142f66df612Smrgstmts : /* Empty */ 143f66df612Smrg | stmts stmt 144f66df612Smrg ; 145f66df612Smrg 146f66df612Smrgstmt : error 147f66df612Smrg | noarg 148f66df612Smrg | sarg 149f66df612Smrg | narg 150f66df612Smrg | squeeze 151f66df612Smrg | ICON_REGION string DKEYWORD DKEYWORD number number 152f66df612Smrg { AddIconRegion($2, $3, $4, $5, $6); } 153f66df612Smrg | ICONMGR_GEOMETRY string number { if (Scr->FirstTime) 154f66df612Smrg { 155f66df612Smrg Scr->iconmgr.geometry=$2; 156f66df612Smrg Scr->iconmgr.columns=$3; 157f66df612Smrg } 158f66df612Smrg } 159f66df612Smrg | ICONMGR_GEOMETRY string { if (Scr->FirstTime) 160f66df612Smrg Scr->iconmgr.geometry = $2; 161f66df612Smrg } 162f66df612Smrg | ZOOM number { if (Scr->FirstTime) 163f66df612Smrg { 164f66df612Smrg Scr->DoZoom = TRUE; 165f66df612Smrg Scr->ZoomCount = (short)$2; 166f66df612Smrg } 167f66df612Smrg } 168f66df612Smrg | ZOOM { if (Scr->FirstTime) 169f66df612Smrg Scr->DoZoom = TRUE; } 170f66df612Smrg | PIXMAPS pixmap_list {} 171f66df612Smrg | CURSORS cursor_list {} 172f66df612Smrg | ICONIFY_BY_UNMAPPING { list = &Scr->IconifyByUn; } 173f66df612Smrg win_list 174f66df612Smrg | ICONIFY_BY_UNMAPPING { if (Scr->FirstTime) 175f66df612Smrg Scr->IconifyByUnmapping = TRUE; } 176f66df612Smrg | LEFT_TITLEBUTTON string EQUALS action { 177f66df612Smrg GotTitleButton ($2, $4, False); 178f66df612Smrg } 179f66df612Smrg | RIGHT_TITLEBUTTON string EQUALS action { 180f66df612Smrg GotTitleButton ($2, $4, True); 181f66df612Smrg } 182f66df612Smrg | button string { root = GetRoot($2, NULLSTR, NULLSTR); 183f66df612Smrg Scr->Mouse[$1][C_ROOT][0].func = F_MENU; 184f66df612Smrg Scr->Mouse[$1][C_ROOT][0].menu = root; 185f66df612Smrg } 186f66df612Smrg | button action { Scr->Mouse[$1][C_ROOT][0].func = $2; 187f66df612Smrg if ($2 == F_MENU) 188f66df612Smrg { 189f66df612Smrg pull->prev = NULL; 190f66df612Smrg Scr->Mouse[$1][C_ROOT][0].menu = pull; 191f66df612Smrg } 192f66df612Smrg else 193f66df612Smrg { 194f66df612Smrg root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); 195f66df612Smrg Scr->Mouse[$1][C_ROOT][0].item = 196f66df612Smrg AddToMenu(root,"x",Action, 197f66df612Smrg NULL,$2,NULLSTR,NULLSTR); 198f66df612Smrg } 199f66df612Smrg Action = empty; 200f66df612Smrg pull = NULL; 201f66df612Smrg } 202f66df612Smrg | string fullkey { GotKey($1, $2); } 203f66df612Smrg | button full { GotButton($1, $2); } 204f66df612Smrg | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; } 205f66df612Smrg win_list 206f66df612Smrg | ICONMGR_NOSHOW { list = &Scr->IconMgrNoShow; } 207f66df612Smrg win_list 208f66df612Smrg | ICONMGR_NOSHOW { Scr->IconManagerDontShow = TRUE; } 209f66df612Smrg | ICONMGRS { list = &Scr->IconMgrs; } 210f66df612Smrg iconm_list 211f66df612Smrg | ICONMGR_SHOW { list = &Scr->IconMgrShow; } 212f66df612Smrg win_list 213f66df612Smrg | NO_TITLE_HILITE { list = &Scr->NoTitleHighlight; } 214f66df612Smrg win_list 215f66df612Smrg | NO_TITLE_HILITE { if (Scr->FirstTime) 216f66df612Smrg Scr->TitleHighlight = FALSE; } 217f66df612Smrg | NO_HILITE { list = &Scr->NoHighlight; } 218f66df612Smrg win_list 219f66df612Smrg | NO_HILITE { if (Scr->FirstTime) 220f66df612Smrg Scr->Highlight = FALSE; } 221f66df612Smrg | NO_STACKMODE { list = &Scr->NoStackModeL; } 222f66df612Smrg win_list 223f66df612Smrg | NO_STACKMODE { if (Scr->FirstTime) 224f66df612Smrg Scr->StackMode = FALSE; } 225f66df612Smrg | NO_TITLE { list = &Scr->NoTitle; } 226f66df612Smrg win_list 227f66df612Smrg | NO_TITLE { if (Scr->FirstTime) 228f66df612Smrg Scr->NoTitlebar = TRUE; } 229f66df612Smrg | MAKE_TITLE { list = &Scr->MakeTitle; } 230f66df612Smrg win_list 231f66df612Smrg | START_ICONIFIED { list = &Scr->StartIconified; } 232f66df612Smrg win_list 233f66df612Smrg | AUTO_RAISE { list = &Scr->AutoRaise; } 234f66df612Smrg win_list 235f66df612Smrg | MENU string LP string COLON string RP { 236f66df612Smrg root = GetRoot($2, $4, $6); } 237f66df612Smrg menu { root->real_menu = TRUE;} 238f66df612Smrg | MENU string { root = GetRoot($2, NULLSTR, NULLSTR); } 239f66df612Smrg menu { root->real_menu = TRUE; } 240f66df612Smrg | FUNCTION string { root = GetRoot($2, NULLSTR, NULLSTR); } 241f66df612Smrg function 242f66df612Smrg | ICONS { list = &Scr->IconNames; } 243f66df612Smrg icon_list 244f66df612Smrg | COLOR { color = COLOR; } 245f66df612Smrg color_list 246f66df612Smrg | GRAYSCALE { color = GRAYSCALE; } 247f66df612Smrg color_list 248f66df612Smrg | SAVECOLOR 2493e747e6dSmrg save_color_list 250f66df612Smrg | MONOCHROME { color = MONOCHROME; } 251f66df612Smrg color_list 252f66df612Smrg | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2; 253f66df612Smrg if ($2 == F_MENU) 254f66df612Smrg { 255f66df612Smrg pull->prev = NULL; 256f66df612Smrg Scr->DefaultFunction.menu = pull; 257f66df612Smrg } 258f66df612Smrg else 259f66df612Smrg { 260f66df612Smrg root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); 261f66df612Smrg Scr->DefaultFunction.item = 262f66df612Smrg AddToMenu(root,"x",Action, 263f66df612Smrg NULL,$2, NULLSTR, NULLSTR); 264f66df612Smrg } 265f66df612Smrg Action = empty; 266f66df612Smrg pull = NULL; 267f66df612Smrg } 268f66df612Smrg | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2; 269f66df612Smrg root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); 270f66df612Smrg Scr->WindowFunction.item = 271f66df612Smrg AddToMenu(root,"x",Action, 272f66df612Smrg NULL,$2, NULLSTR, NULLSTR); 273f66df612Smrg Action = empty; 274f66df612Smrg pull = NULL; 275f66df612Smrg } 276f66df612Smrg | WARP_CURSOR { list = &Scr->WarpCursorL; } 277f66df612Smrg win_list 278f66df612Smrg | WARP_CURSOR { if (Scr->FirstTime) 279f66df612Smrg Scr->WarpCursor = TRUE; } 280f66df612Smrg | WINDOW_RING { list = &Scr->WindowRingL; } 281f66df612Smrg win_list 282f66df612Smrg ; 283f66df612Smrg 284f66df612Smrg 285f66df612Smrgnoarg : KEYWORD { if (!do_single_keyword ($1)) { 286f66df612Smrg parseWarning ( 287f66df612Smrg "unknown singleton keyword %d", 288f66df612Smrg $1); 289f66df612Smrg ParseError = 1; 290f66df612Smrg } 291f66df612Smrg } 292f66df612Smrg ; 293f66df612Smrg 294f66df612Smrgsarg : SKEYWORD string { if (!do_string_keyword ($1, $2)) { 295f66df612Smrg parseWarning ( 296f66df612Smrg "unknown string keyword %d (value \"%s\")", 297f66df612Smrg $1, $2); 298f66df612Smrg ParseError = 1; 299f66df612Smrg } 300f66df612Smrg } 301f66df612Smrg ; 302f66df612Smrg 303f66df612Smrgnarg : NKEYWORD number { if (!do_number_keyword ($1, $2)) { 304f66df612Smrg parseWarning ( 305f66df612Smrg "unknown numeric keyword %d (value %d)", 306f66df612Smrg $1, $2); 307f66df612Smrg ParseError = 1; 308f66df612Smrg } 309f66df612Smrg } 310f66df612Smrg ; 311f66df612Smrg 312f66df612Smrg 313f66df612Smrg 314f66df612Smrgfull : EQUALS keys COLON contexts COLON action { $$ = $6; } 315f66df612Smrg ; 316f66df612Smrg 317f66df612Smrgfullkey : EQUALS keys COLON contextkeys COLON action { $$ = $6; } 318f66df612Smrg ; 319f66df612Smrg 320f66df612Smrgkeys : /* Empty */ 321f66df612Smrg | keys key 322f66df612Smrg ; 323f66df612Smrg 324f66df612Smrgkey : META { mods |= Mod1Mask; } 325f66df612Smrg | SHIFT { mods |= ShiftMask; } 326f66df612Smrg | LOCK { mods |= LockMask; } 327f66df612Smrg | CONTROL { mods |= ControlMask; } 328f66df612Smrg | META number { if ($2 < 1 || $2 > 5) { 329f66df612Smrg parseWarning ( 330f66df612Smrg "bad modifier number (%d), must be 1-5", 331f66df612Smrg $2); 332f66df612Smrg ParseError = 1; 333f66df612Smrg } else { 334f66df612Smrg mods |= (Mod1Mask << ($2 - 1)); 335f66df612Smrg } 336f66df612Smrg } 337f66df612Smrg | OR { } 338f66df612Smrg ; 339f66df612Smrg 340f66df612Smrgcontexts : /* Empty */ 341f66df612Smrg | contexts context 342f66df612Smrg ; 343f66df612Smrg 344f66df612Smrgcontext : WINDOW { cont |= C_WINDOW_BIT; } 345f66df612Smrg | TITLE { cont |= C_TITLE_BIT; } 346f66df612Smrg | ICON { cont |= C_ICON_BIT; } 347f66df612Smrg | ROOT { cont |= C_ROOT_BIT; } 348f66df612Smrg | FRAME { cont |= C_FRAME_BIT; } 349f66df612Smrg | ICONMGR { cont |= C_ICONMGR_BIT; } 350f66df612Smrg | META { cont |= C_ICONMGR_BIT; } 351f66df612Smrg | ALL { cont |= C_ALL_BITS; } 352f66df612Smrg | OR { } 353f66df612Smrg ; 354f66df612Smrg 355f66df612Smrgcontextkeys : /* Empty */ 356f66df612Smrg | contextkeys contextkey 357f66df612Smrg ; 358f66df612Smrg 359f66df612Smrgcontextkey : WINDOW { cont |= C_WINDOW_BIT; } 360f66df612Smrg | TITLE { cont |= C_TITLE_BIT; } 361f66df612Smrg | ICON { cont |= C_ICON_BIT; } 362f66df612Smrg | ROOT { cont |= C_ROOT_BIT; } 363f66df612Smrg | FRAME { cont |= C_FRAME_BIT; } 364f66df612Smrg | ICONMGR { cont |= C_ICONMGR_BIT; } 365f66df612Smrg | META { cont |= C_ICONMGR_BIT; } 366f66df612Smrg | ALL { cont |= C_ALL_BITS; } 367f66df612Smrg | OR { } 368f66df612Smrg | string { Name = $1; cont |= C_NAME_BIT; } 369f66df612Smrg ; 370f66df612Smrg 371f66df612Smrg 372f66df612Smrgpixmap_list : LB pixmap_entries RB 373f66df612Smrg ; 374f66df612Smrg 375f66df612Smrgpixmap_entries : /* Empty */ 376f66df612Smrg | pixmap_entries pixmap_entry 377f66df612Smrg ; 378f66df612Smrg 379f66df612Smrgpixmap_entry : TITLE_HILITE string { SetHighlightPixmap ($2); } 380f66df612Smrg ; 381f66df612Smrg 382f66df612Smrg 383f66df612Smrgcursor_list : LB cursor_entries RB 384f66df612Smrg ; 385f66df612Smrg 386f66df612Smrgcursor_entries : /* Empty */ 387f66df612Smrg | cursor_entries cursor_entry 388f66df612Smrg ; 389f66df612Smrg 390f66df612Smrgcursor_entry : FRAME string string { 391f66df612Smrg NewBitmapCursor(&Scr->FrameCursor, $2, $3); } 392f66df612Smrg | FRAME string { 393f66df612Smrg NewFontCursor(&Scr->FrameCursor, $2); } 394f66df612Smrg | TITLE string string { 395f66df612Smrg NewBitmapCursor(&Scr->TitleCursor, $2, $3); } 396f66df612Smrg | TITLE string { 397f66df612Smrg NewFontCursor(&Scr->TitleCursor, $2); } 398f66df612Smrg | ICON string string { 399f66df612Smrg NewBitmapCursor(&Scr->IconCursor, $2, $3); } 400f66df612Smrg | ICON string { 401f66df612Smrg NewFontCursor(&Scr->IconCursor, $2); } 402f66df612Smrg | ICONMGR string string { 403f66df612Smrg NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); } 404f66df612Smrg | ICONMGR string { 405f66df612Smrg NewFontCursor(&Scr->IconMgrCursor, $2); } 406f66df612Smrg | BUTTON string string { 407f66df612Smrg NewBitmapCursor(&Scr->ButtonCursor, $2, $3); } 408f66df612Smrg | BUTTON string { 409f66df612Smrg NewFontCursor(&Scr->ButtonCursor, $2); } 410f66df612Smrg | MOVE string string { 411f66df612Smrg NewBitmapCursor(&Scr->MoveCursor, $2, $3); } 412f66df612Smrg | MOVE string { 413f66df612Smrg NewFontCursor(&Scr->MoveCursor, $2); } 414f66df612Smrg | RESIZE string string { 415f66df612Smrg NewBitmapCursor(&Scr->ResizeCursor, $2, $3); } 416f66df612Smrg | RESIZE string { 417f66df612Smrg NewFontCursor(&Scr->ResizeCursor, $2); } 418f66df612Smrg | WAIT string string { 419f66df612Smrg NewBitmapCursor(&Scr->WaitCursor, $2, $3); } 420f66df612Smrg | WAIT string { 421f66df612Smrg NewFontCursor(&Scr->WaitCursor, $2); } 422f66df612Smrg | MENU string string { 423f66df612Smrg NewBitmapCursor(&Scr->MenuCursor, $2, $3); } 424f66df612Smrg | MENU string { 425f66df612Smrg NewFontCursor(&Scr->MenuCursor, $2); } 426f66df612Smrg | SELECT string string { 427f66df612Smrg NewBitmapCursor(&Scr->SelectCursor, $2, $3); } 428f66df612Smrg | SELECT string { 429f66df612Smrg NewFontCursor(&Scr->SelectCursor, $2); } 430f66df612Smrg | KILL string string { 431f66df612Smrg NewBitmapCursor(&Scr->DestroyCursor, $2, $3); } 432f66df612Smrg | KILL string { 433f66df612Smrg NewFontCursor(&Scr->DestroyCursor, $2); } 434f66df612Smrg ; 435f66df612Smrg 436f66df612Smrgcolor_list : LB color_entries RB 437f66df612Smrg ; 438f66df612Smrg 439f66df612Smrg 440f66df612Smrgcolor_entries : /* Empty */ 441f66df612Smrg | color_entries color_entry 442f66df612Smrg ; 443f66df612Smrg 444f66df612Smrgcolor_entry : CLKEYWORD string { if (!do_colorlist_keyword ($1, color, 445f66df612Smrg $2)) { 446f66df612Smrg parseWarning ( 447f66df612Smrg "unhandled list color keyword %d (string \"%s\")", 448f66df612Smrg $1, $2); 449f66df612Smrg ParseError = 1; 450f66df612Smrg } 451f66df612Smrg } 452f66df612Smrg | CLKEYWORD string { list = do_colorlist_keyword($1,color, 453f66df612Smrg $2); 454f66df612Smrg if (!list) { 455f66df612Smrg parseWarning ( 456f66df612Smrg "unhandled color list keyword %d (string \"%s\")", 457f66df612Smrg $1, $2); 458f66df612Smrg ParseError = 1; 459f66df612Smrg } 460f66df612Smrg } 461f66df612Smrg win_color_list { /* No action */; } 462f66df612Smrg | CKEYWORD string { if (!do_color_keyword ($1, color, 463f66df612Smrg $2)) { 464f66df612Smrg parseWarning ( 465f66df612Smrg "unhandled color keyword %d (string \"%s\")", 466f66df612Smrg $1, $2); 467f66df612Smrg ParseError = 1; 468f66df612Smrg } 469f66df612Smrg } 470f66df612Smrg ; 4713e747e6dSmrg 472c2535118Smrgsave_color_list : LB s_color_entries RB 4733e747e6dSmrg ; 4743e747e6dSmrg 4753e747e6dSmrgs_color_entries : /* Empty */ 476c2535118Smrg | s_color_entries s_color_entry 4773e747e6dSmrg ; 4783e747e6dSmrg 4793e747e6dSmrgs_color_entry : string { do_string_savecolor(color, $1); } 4803e747e6dSmrg | CLKEYWORD { do_var_savecolor($1); } 4813e747e6dSmrg ; 4823e747e6dSmrg 483f66df612Smrgwin_color_list : LB win_color_entries RB 484f66df612Smrg ; 485f66df612Smrg 486f66df612Smrgwin_color_entries : /* Empty */ 487f66df612Smrg | win_color_entries win_color_entry 488f66df612Smrg ; 489f66df612Smrg 490f66df612Smrgwin_color_entry : string string { if (Scr->FirstTime && 491f66df612Smrg color == Scr->Monochrome) 492f66df612Smrg AddToList(list, $1, $2); } 493f66df612Smrg ; 494f66df612Smrg 495f66df612Smrgsqueeze : SQUEEZE_TITLE { 496f66df612Smrg if (HasShape) Scr->SqueezeTitle = TRUE; 497f66df612Smrg } 498f66df612Smrg | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL; 499f66df612Smrg if (HasShape && Scr->SqueezeTitle == -1) 500f66df612Smrg Scr->SqueezeTitle = TRUE; 501f66df612Smrg } 502f66df612Smrg LB win_sqz_entries RB 503f66df612Smrg | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; } 504f66df612Smrg | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; } 505f66df612Smrg win_list 506f66df612Smrg ; 507f66df612Smrg 508f66df612Smrgwin_sqz_entries : /* Empty */ 509f66df612Smrg | win_sqz_entries string JKEYWORD signed_number number { 510f66df612Smrg if (Scr->FirstTime) { 511f66df612Smrg do_squeeze_entry (list, $2, $3, $4, $5); 512f66df612Smrg } 513f66df612Smrg } 514f66df612Smrg ; 515f66df612Smrg 516f66df612Smrg 517f66df612Smrgiconm_list : LB iconm_entries RB 518f66df612Smrg ; 519f66df612Smrg 520f66df612Smrgiconm_entries : /* Empty */ 521f66df612Smrg | iconm_entries iconm_entry 522f66df612Smrg ; 523f66df612Smrg 524f66df612Smrgiconm_entry : string string number { if (Scr->FirstTime) 525f66df612Smrg AddToList(list, $1, (char *) 526f66df612Smrg AllocateIconManager($1, NULLSTR, 527f66df612Smrg $2,$3)); 528f66df612Smrg } 529f66df612Smrg | string string string number 530f66df612Smrg { if (Scr->FirstTime) 531f66df612Smrg AddToList(list, $1, (char *) 532f66df612Smrg AllocateIconManager($1,$2, 533f66df612Smrg $3, $4)); 534f66df612Smrg } 535f66df612Smrg ; 536f66df612Smrg 537f66df612Smrgwin_list : LB win_entries RB 538f66df612Smrg ; 539f66df612Smrg 540f66df612Smrgwin_entries : /* Empty */ 541f66df612Smrg | win_entries win_entry 542f66df612Smrg ; 543f66df612Smrg 544f66df612Smrgwin_entry : string { if (Scr->FirstTime) 545f66df612Smrg AddToList(list, $1, 0); 546f66df612Smrg } 547f66df612Smrg ; 548f66df612Smrg 549f66df612Smrgicon_list : LB icon_entries RB 550f66df612Smrg ; 551f66df612Smrg 552f66df612Smrgicon_entries : /* Empty */ 553f66df612Smrg | icon_entries icon_entry 554f66df612Smrg ; 555f66df612Smrg 556f66df612Smrgicon_entry : string string { if (Scr->FirstTime) AddToList(list, $1, $2); } 557f66df612Smrg ; 558f66df612Smrg 559f66df612Smrgfunction : LB function_entries RB 560f66df612Smrg ; 5613e747e6dSmrg 5623e747e6dSmrgfunction_entries: /* Empty */ 563f66df612Smrg | function_entries function_entry 564f66df612Smrg ; 565f66df612Smrg 566f66df612Smrgfunction_entry : action { AddToMenu(root, empty, Action, NULL, $1, 567f66df612Smrg NULLSTR, NULLSTR); 568f66df612Smrg Action = empty; 569f66df612Smrg } 570f66df612Smrg ; 571f66df612Smrg 572f66df612Smrgmenu : LB menu_entries RB 573f66df612Smrg ; 574f66df612Smrg 575f66df612Smrgmenu_entries : /* Empty */ 576f66df612Smrg | menu_entries menu_entry 577f66df612Smrg ; 578f66df612Smrg 579f66df612Smrgmenu_entry : string action { AddToMenu(root, $1, Action, pull, $2, 580f66df612Smrg NULLSTR, NULLSTR); 581f66df612Smrg Action = empty; 582f66df612Smrg pull = NULL; 583f66df612Smrg } 584f66df612Smrg | string LP string COLON string RP action { 585f66df612Smrg AddToMenu(root, $1, Action, pull, $7, 586f66df612Smrg $3, $5); 587f66df612Smrg Action = empty; 588f66df612Smrg pull = NULL; 589f66df612Smrg } 590f66df612Smrg ; 591f66df612Smrg 592f66df612Smrgaction : FKEYWORD { $$ = $1; } 593f66df612Smrg | FSKEYWORD string { 594f66df612Smrg $$ = $1; 595f66df612Smrg Action = $2; 596f66df612Smrg switch ($1) { 597f66df612Smrg case F_MENU: 598f66df612Smrg pull = GetRoot ($2, NULLSTR,NULLSTR); 599f66df612Smrg pull->prev = root; 600f66df612Smrg break; 601f66df612Smrg case F_WARPRING: 602f66df612Smrg if (!CheckWarpRingArg (Action)) { 603f66df612Smrg parseWarning ( 604f66df612Smrg "ignoring invalid f.warptoring argument \"%s\"", 605f66df612Smrg Action); 606f66df612Smrg $$ = F_NOP; 607f66df612Smrg } 608f66df612Smrg break; 609f66df612Smrg case F_WARPTOSCREEN: 610f66df612Smrg if (!CheckWarpScreenArg (Action)) { 611f66df612Smrg parseWarning ( 612f66df612Smrg "ignoring invalid f.warptoscreen argument \"%s\"", 613f66df612Smrg Action); 614f66df612Smrg $$ = F_NOP; 615f66df612Smrg } 616f66df612Smrg break; 617f66df612Smrg case F_COLORMAP: 618f66df612Smrg if (CheckColormapArg (Action)) { 619f66df612Smrg $$ = F_COLORMAP; 620f66df612Smrg } else { 621f66df612Smrg parseWarning ( 622f66df612Smrg "ignoring invalid f.colormap argument \"%s\"", 623f66df612Smrg Action); 624f66df612Smrg $$ = F_NOP; 625f66df612Smrg } 626f66df612Smrg break; 627f66df612Smrg } /* end switch */ 628f66df612Smrg } 629f66df612Smrg ; 630f66df612Smrg 631f66df612Smrg 632f66df612Smrgsigned_number : number { $$ = $1; } 633f66df612Smrg | PLUS number { $$ = $2; } 634f66df612Smrg | MINUS number { $$ = -($2); } 635f66df612Smrg ; 636f66df612Smrg 637f66df612Smrgbutton : BUTTON number { $$ = $2; 638f66df612Smrg if ($2 == 0) 639f66df612Smrg yyerror("bad button 0"); 640f66df612Smrg 641f66df612Smrg if ($2 > MAX_BUTTONS) 642f66df612Smrg { 643f66df612Smrg $$ = 0; 644f66df612Smrg yyerror("button number too large"); 645f66df612Smrg } 646f66df612Smrg } 647f66df612Smrg ; 648f66df612Smrg 649f66df612Smrgstring : STRING { ptr = strdup($1); 650f66df612Smrg RemoveDQuote(ptr); 651f66df612Smrg $$ = ptr; 652f66df612Smrg } 653f66df612Smrg ; 654f66df612Smrgnumber : NUMBER { $$ = $1; } 655f66df612Smrg ; 6563e747e6dSmrg 6573e747e6dSmrg%% 658f66df612Smrg 659c2535118Smrgstatic void 660c2535118Smrgyyerror(const char *s) 6613e747e6dSmrg{ 662f66df612Smrg parseWarning("error in input file: %s", s ? s : ""); 6633e747e6dSmrg ParseError = 1; 6643e747e6dSmrg} 6653e747e6dSmrg 666c2535118Smrgstatic void 6673e747e6dSmrgRemoveDQuote(char *str) 6683e747e6dSmrg{ 6693e747e6dSmrg register char *i, *o; 6703e747e6dSmrg register int n; 6713e747e6dSmrg register int count; 6723e747e6dSmrg 673f66df612Smrg for (i = str + 1, o = str; *i && *i != '\"'; o++) { 674f66df612Smrg if (*i == '\\') { 675f66df612Smrg switch (*++i) { 676f66df612Smrg case 'n': 677f66df612Smrg *o = '\n'; 678f66df612Smrg i++; 679f66df612Smrg break; 680f66df612Smrg case 'b': 681f66df612Smrg *o = '\b'; 682f66df612Smrg i++; 683f66df612Smrg break; 684f66df612Smrg case 'r': 685f66df612Smrg *o = '\r'; 686f66df612Smrg i++; 687f66df612Smrg break; 688f66df612Smrg case 't': 689f66df612Smrg *o = '\t'; 690f66df612Smrg i++; 691f66df612Smrg break; 692f66df612Smrg case 'f': 693f66df612Smrg *o = '\f'; 694f66df612Smrg i++; 695f66df612Smrg break; 696f66df612Smrg case '0': 697f66df612Smrg if (*++i == 'x') 698f66df612Smrg goto hex; 699f66df612Smrg else 700f66df612Smrg --i; 701f66df612Smrg /* FALLTHRU */ 702f66df612Smrg case '1': 703f66df612Smrg case '2': 704f66df612Smrg case '3': 705f66df612Smrg case '4': 706f66df612Smrg case '5': 707f66df612Smrg case '6': 708f66df612Smrg case '7': 709f66df612Smrg n = 0; 710f66df612Smrg count = 0; 711f66df612Smrg while (*i >= '0' && *i <= '7' && count < 3) { 712f66df612Smrg n = (n << 3) + (*i++ - '0'); 713f66df612Smrg count++; 714f66df612Smrg } 715f66df612Smrg *o = (char) n; 716f66df612Smrg break; 717f66df612Smrg hex: 718f66df612Smrg case 'x': 719f66df612Smrg n = 0; 720f66df612Smrg count = 0; 721f66df612Smrg while (i++, count++ < 2) { 722f66df612Smrg if (*i >= '0' && *i <= '9') 723f66df612Smrg n = (n << 4) + (*i - '0'); 724f66df612Smrg else if (*i >= 'a' && *i <= 'f') 725f66df612Smrg n = (n << 4) + (*i - 'a') + 10; 726f66df612Smrg else if (*i >= 'A' && *i <= 'F') 727f66df612Smrg n = (n << 4) + (*i - 'A') + 10; 728f66df612Smrg else 729f66df612Smrg break; 730f66df612Smrg } 731f66df612Smrg *o = (char) n; 732f66df612Smrg break; 733f66df612Smrg case '\n': 734f66df612Smrg i++; /* punt */ 735f66df612Smrg o--; /* to account for o++ at end of loop */ 736f66df612Smrg break; 737f66df612Smrg case '\"': 738f66df612Smrg case '\'': 739f66df612Smrg case '\\': 740f66df612Smrg default: 741f66df612Smrg *o = *i++; 742f66df612Smrg break; 743f66df612Smrg } 744f66df612Smrg } 745f66df612Smrg else 746f66df612Smrg *o = *i++; 7473e747e6dSmrg } 7483e747e6dSmrg *o = '\0'; 7493e747e6dSmrg} 7503e747e6dSmrg 751f66df612Smrgstatic MenuRoot * 752f66df612SmrgGetRoot(const char *name, const char *fore, const char *back) 7533e747e6dSmrg{ 7543e747e6dSmrg MenuRoot *tmp; 7553e747e6dSmrg 7563e747e6dSmrg tmp = FindMenuRoot(name); 7573e747e6dSmrg if (tmp == NULL) 758f66df612Smrg tmp = NewMenuRoot(name); 7593e747e6dSmrg 760f66df612Smrg if (fore) { 761f66df612Smrg int save; 7623e747e6dSmrg 763f66df612Smrg save = Scr->FirstTime; 764f66df612Smrg Scr->FirstTime = TRUE; 765f66df612Smrg GetColor(COLOR, &tmp->hi_fore, fore); 766f66df612Smrg GetColor(COLOR, &tmp->hi_back, back); 767f66df612Smrg Scr->FirstTime = (short) save; 7683e747e6dSmrg } 7693e747e6dSmrg 7703e747e6dSmrg return tmp; 7713e747e6dSmrg} 7723e747e6dSmrg 773f66df612Smrgstatic void 774f66df612SmrgGotButton(int butt, int func) 7753e747e6dSmrg{ 7763e747e6dSmrg int i; 7773e747e6dSmrg 778f66df612Smrg for (i = 0; i < NUM_CONTEXTS; i++) { 779f66df612Smrg if ((cont & (1 << i)) == 0) 780f66df612Smrg continue; 781f66df612Smrg 782f66df612Smrg Scr->Mouse[butt][i][mods].func = func; 783f66df612Smrg if (func == F_MENU) { 784f66df612Smrg pull->prev = NULL; 785f66df612Smrg Scr->Mouse[butt][i][mods].menu = pull; 786f66df612Smrg } 787f66df612Smrg else { 788f66df612Smrg root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR); 789f66df612Smrg Scr->Mouse[butt][i][mods].item = AddToMenu(root, "x", Action, 790f66df612Smrg NULL, func, NULLSTR, NULLSTR); 791f66df612Smrg } 7923e747e6dSmrg } 793f66df612Smrg Action = empty; 7943e747e6dSmrg pull = NULL; 7953e747e6dSmrg cont = 0; 796f66df612Smrg mods_used |= (unsigned) mods; 7973e747e6dSmrg mods = 0; 7983e747e6dSmrg} 7993e747e6dSmrg 800f66df612Smrgstatic void 801f66df612SmrgGotKey(char *key, int func) 8023e747e6dSmrg{ 8033e747e6dSmrg int i; 8043e747e6dSmrg 805f66df612Smrg for (i = 0; i < NUM_CONTEXTS; i++) { 806f66df612Smrg if ((cont & (1 << i)) == 0) 807f66df612Smrg continue; 808f66df612Smrg if (!AddFuncKey(key, i, mods, func, Name, Action)) 809f66df612Smrg break; 8103e747e6dSmrg } 8113e747e6dSmrg 812f66df612Smrg Action = empty; 8133e747e6dSmrg pull = NULL; 8143e747e6dSmrg cont = 0; 815f66df612Smrg mods_used |= (unsigned) mods; 8163e747e6dSmrg mods = 0; 8173e747e6dSmrg} 8183e747e6dSmrg 819f66df612Smrgstatic void 820f66df612SmrgGotTitleButton(char *bitmapname, int func, Bool rightside) 8213e747e6dSmrg{ 822f66df612Smrg if (!CreateTitleButton(bitmapname, func, Action, pull, rightside, True)) { 823f66df612Smrg parseWarning("unable to create %s titlebutton \"%s\"", 824f66df612Smrg rightside ? "right" : "left", bitmapname); 8253e747e6dSmrg } 826f66df612Smrg Action = empty; 8273e747e6dSmrg pull = NULL; 8283e747e6dSmrg} 8293e747e6dSmrg 830f66df612Smrgstatic Bool 831f66df612SmrgCheckWarpScreenArg(char *s) 8323e747e6dSmrg{ 833f66df612Smrg XmuCopyISOLatin1Lowered(s, s); 8343e747e6dSmrg 835f66df612Smrg if (strcmp(s, WARPSCREEN_NEXT) == 0 || 836f66df612Smrg strcmp(s, WARPSCREEN_PREV) == 0 || 837f66df612Smrg strcmp(s, WARPSCREEN_BACK) == 0) 838f66df612Smrg return True; 8393e747e6dSmrg 840f66df612Smrg for (; *s && isascii(*s) && isdigit(*s); s++); /* SUPPRESS 530 */ 8413e747e6dSmrg return (*s ? False : True); 8423e747e6dSmrg} 8433e747e6dSmrg 844f66df612Smrgstatic Bool 845f66df612SmrgCheckWarpRingArg(char *s) 8463e747e6dSmrg{ 847f66df612Smrg XmuCopyISOLatin1Lowered(s, s); 8483e747e6dSmrg 849f66df612Smrg if (strcmp(s, WARPSCREEN_NEXT) == 0 || 850f66df612Smrg strcmp(s, WARPSCREEN_PREV) == 0) 851f66df612Smrg return True; 8523e747e6dSmrg 8533e747e6dSmrg return False; 8543e747e6dSmrg} 8553e747e6dSmrg 856f66df612Smrgstatic Bool 857f66df612SmrgCheckColormapArg(char *s) 8583e747e6dSmrg{ 859f66df612Smrg XmuCopyISOLatin1Lowered(s, s); 8603e747e6dSmrg 861f66df612Smrg if (strcmp(s, COLORMAP_NEXT) == 0 || 862f66df612Smrg strcmp(s, COLORMAP_PREV) == 0 || 863f66df612Smrg strcmp(s, COLORMAP_DEFAULT) == 0) 864f66df612Smrg return True; 8653e747e6dSmrg 8663e747e6dSmrg return False; 8673e747e6dSmrg} 868