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 103f66df612Smrgstatic void yyerror(const char *s); 104c2535118Smrg 1053e747e6dSmrg%} 1063e747e6dSmrg 1073e747e6dSmrg%union 1083e747e6dSmrg{ 1093e747e6dSmrg int num; 1103e747e6dSmrg char *ptr; 1113e747e6dSmrg}; 1123e747e6dSmrg 1133e747e6dSmrg%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS 114c2535118Smrg%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION 1153e747e6dSmrg%token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS 1163e747e6dSmrg%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE GRAYSCALE 117c2535118Smrg%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING 118c2535118Smrg%token <num> NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION 119c2535118Smrg%token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME 1203e747e6dSmrg%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE 1213e747e6dSmrg%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE 122c2535118Smrg%token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON 123c2535118Smrg%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD 1243e747e6dSmrg%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN 1253e747e6dSmrg%token <num> NO_STACKMODE 126c2535118Smrg%token <ptr> STRING 127f66df612Smrg%token <num> error 1283e747e6dSmrg 1293e747e6dSmrg%type <ptr> string 1303e747e6dSmrg%type <num> pixmap_list cursor_list color_list save_color_list stmt 1313e747e6dSmrg%type <num> win_color_list iconm_list win_list icon_list function menu 132f66df612Smrg%type <num> noarg sarg narg squeeze color_entry 1333e747e6dSmrg%type <num> action button number signed_number full fullkey 1343e747e6dSmrg 135c2535118Smrg%start twmrc 1363e747e6dSmrg 1373e747e6dSmrg%% 138f66df612Smrgtwmrc : stmts 139f66df612Smrg ; 140f66df612Smrg 141f66df612Smrgstmts : /* Empty */ 142f66df612Smrg | stmts stmt 143f66df612Smrg ; 144f66df612Smrg 145f66df612Smrgstmt : error 146f66df612Smrg | noarg 147f66df612Smrg | sarg 148f66df612Smrg | narg 149f66df612Smrg | squeeze 150f66df612Smrg | ICON_REGION string DKEYWORD DKEYWORD number number 151f66df612Smrg { AddIconRegion($2, $3, $4, $5, $6); } 152f66df612Smrg | ICONMGR_GEOMETRY string number { if (Scr->FirstTime) 153f66df612Smrg { 154f66df612Smrg Scr->iconmgr.geometry=$2; 155f66df612Smrg Scr->iconmgr.columns=$3; 156f66df612Smrg } 157f66df612Smrg } 158f66df612Smrg | ICONMGR_GEOMETRY string { if (Scr->FirstTime) 159f66df612Smrg Scr->iconmgr.geometry = $2; 160f66df612Smrg } 161f66df612Smrg | ZOOM number { if (Scr->FirstTime) 162f66df612Smrg { 163f66df612Smrg Scr->DoZoom = TRUE; 164f66df612Smrg Scr->ZoomCount = (short)$2; 165f66df612Smrg } 166f66df612Smrg } 167f66df612Smrg | ZOOM { if (Scr->FirstTime) 168f66df612Smrg Scr->DoZoom = TRUE; } 169f66df612Smrg | PIXMAPS pixmap_list {} 170f66df612Smrg | CURSORS cursor_list {} 171f66df612Smrg | ICONIFY_BY_UNMAPPING { list = &Scr->IconifyByUn; } 172f66df612Smrg win_list 173f66df612Smrg | ICONIFY_BY_UNMAPPING { if (Scr->FirstTime) 174f66df612Smrg Scr->IconifyByUnmapping = TRUE; } 175f66df612Smrg | LEFT_TITLEBUTTON string EQUALS action { 176f66df612Smrg GotTitleButton ($2, $4, False); 177f66df612Smrg } 178f66df612Smrg | RIGHT_TITLEBUTTON string EQUALS action { 179f66df612Smrg GotTitleButton ($2, $4, True); 180f66df612Smrg } 181f66df612Smrg | button string { root = GetRoot($2, NULLSTR, NULLSTR); 182f66df612Smrg Scr->Mouse[$1][C_ROOT][0].func = F_MENU; 183f66df612Smrg Scr->Mouse[$1][C_ROOT][0].menu = root; 184f66df612Smrg } 185f66df612Smrg | button action { Scr->Mouse[$1][C_ROOT][0].func = $2; 186f66df612Smrg if ($2 == F_MENU) 187f66df612Smrg { 188f66df612Smrg pull->prev = NULL; 189f66df612Smrg Scr->Mouse[$1][C_ROOT][0].menu = pull; 190f66df612Smrg } 191f66df612Smrg else 192f66df612Smrg { 193f66df612Smrg root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); 194f66df612Smrg Scr->Mouse[$1][C_ROOT][0].item = 195f66df612Smrg AddToMenu(root,"x",Action, 196f66df612Smrg NULL,$2,NULLSTR,NULLSTR); 197f66df612Smrg } 198f66df612Smrg Action = empty; 199f66df612Smrg pull = NULL; 200f66df612Smrg } 201f66df612Smrg | string fullkey { GotKey($1, $2); } 202f66df612Smrg | button full { GotButton($1, $2); } 203f66df612Smrg | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; } 204f66df612Smrg win_list 205f66df612Smrg | ICONMGR_NOSHOW { list = &Scr->IconMgrNoShow; } 206f66df612Smrg win_list 207f66df612Smrg | ICONMGR_NOSHOW { Scr->IconManagerDontShow = TRUE; } 208f66df612Smrg | ICONMGRS { list = &Scr->IconMgrs; } 209f66df612Smrg iconm_list 210f66df612Smrg | ICONMGR_SHOW { list = &Scr->IconMgrShow; } 211f66df612Smrg win_list 212f66df612Smrg | NO_TITLE_HILITE { list = &Scr->NoTitleHighlight; } 213f66df612Smrg win_list 214f66df612Smrg | NO_TITLE_HILITE { if (Scr->FirstTime) 215f66df612Smrg Scr->TitleHighlight = FALSE; } 216f66df612Smrg | NO_HILITE { list = &Scr->NoHighlight; } 217f66df612Smrg win_list 218f66df612Smrg | NO_HILITE { if (Scr->FirstTime) 219f66df612Smrg Scr->Highlight = FALSE; } 220f66df612Smrg | NO_STACKMODE { list = &Scr->NoStackModeL; } 221f66df612Smrg win_list 222f66df612Smrg | NO_STACKMODE { if (Scr->FirstTime) 223f66df612Smrg Scr->StackMode = FALSE; } 224f66df612Smrg | NO_TITLE { list = &Scr->NoTitle; } 225f66df612Smrg win_list 226f66df612Smrg | NO_TITLE { if (Scr->FirstTime) 227f66df612Smrg Scr->NoTitlebar = TRUE; } 228f66df612Smrg | MAKE_TITLE { list = &Scr->MakeTitle; } 229f66df612Smrg win_list 230f66df612Smrg | START_ICONIFIED { list = &Scr->StartIconified; } 231f66df612Smrg win_list 232f66df612Smrg | AUTO_RAISE { list = &Scr->AutoRaise; } 233f66df612Smrg win_list 234f66df612Smrg | MENU string LP string COLON string RP { 235f66df612Smrg root = GetRoot($2, $4, $6); } 236f66df612Smrg menu { root->real_menu = TRUE;} 237f66df612Smrg | MENU string { root = GetRoot($2, NULLSTR, NULLSTR); } 238f66df612Smrg menu { root->real_menu = TRUE; } 239f66df612Smrg | FUNCTION string { root = GetRoot($2, NULLSTR, NULLSTR); } 240f66df612Smrg function 241f66df612Smrg | ICONS { list = &Scr->IconNames; } 242f66df612Smrg icon_list 243f66df612Smrg | COLOR { color = COLOR; } 244f66df612Smrg color_list 245f66df612Smrg | GRAYSCALE { color = GRAYSCALE; } 246f66df612Smrg color_list 247f66df612Smrg | SAVECOLOR 2483e747e6dSmrg save_color_list 249f66df612Smrg | MONOCHROME { color = MONOCHROME; } 250f66df612Smrg color_list 251f66df612Smrg | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2; 252f66df612Smrg if ($2 == F_MENU) 253f66df612Smrg { 254f66df612Smrg pull->prev = NULL; 255f66df612Smrg Scr->DefaultFunction.menu = pull; 256f66df612Smrg } 257f66df612Smrg else 258f66df612Smrg { 259f66df612Smrg root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); 260f66df612Smrg Scr->DefaultFunction.item = 261f66df612Smrg AddToMenu(root,"x",Action, 262f66df612Smrg NULL,$2, NULLSTR, NULLSTR); 263f66df612Smrg } 264f66df612Smrg Action = empty; 265f66df612Smrg pull = NULL; 266f66df612Smrg } 267f66df612Smrg | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2; 268f66df612Smrg root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); 269f66df612Smrg Scr->WindowFunction.item = 270f66df612Smrg AddToMenu(root,"x",Action, 271f66df612Smrg NULL,$2, NULLSTR, NULLSTR); 272f66df612Smrg Action = empty; 273f66df612Smrg pull = NULL; 274f66df612Smrg } 275f66df612Smrg | WARP_CURSOR { list = &Scr->WarpCursorL; } 276f66df612Smrg win_list 277f66df612Smrg | WARP_CURSOR { if (Scr->FirstTime) 278f66df612Smrg Scr->WarpCursor = TRUE; } 279f66df612Smrg | WINDOW_RING { list = &Scr->WindowRingL; } 280f66df612Smrg win_list 281f66df612Smrg ; 282f66df612Smrg 283f66df612Smrg 284f66df612Smrgnoarg : KEYWORD { if (!do_single_keyword ($1)) { 285f66df612Smrg parseWarning ( 286f66df612Smrg "unknown singleton keyword %d", 287f66df612Smrg $1); 288f66df612Smrg ParseError = 1; 289f66df612Smrg } 290f66df612Smrg } 291f66df612Smrg ; 292f66df612Smrg 293f66df612Smrgsarg : SKEYWORD string { if (!do_string_keyword ($1, $2)) { 294f66df612Smrg parseWarning ( 295f66df612Smrg "unknown string keyword %d (value \"%s\")", 296f66df612Smrg $1, $2); 297f66df612Smrg ParseError = 1; 298f66df612Smrg } 299f66df612Smrg } 300f66df612Smrg ; 301f66df612Smrg 302f66df612Smrgnarg : NKEYWORD number { if (!do_number_keyword ($1, $2)) { 303f66df612Smrg parseWarning ( 304f66df612Smrg "unknown numeric keyword %d (value %d)", 305f66df612Smrg $1, $2); 306f66df612Smrg ParseError = 1; 307f66df612Smrg } 308f66df612Smrg } 309f66df612Smrg ; 310f66df612Smrg 311f66df612Smrg 312f66df612Smrg 313f66df612Smrgfull : EQUALS keys COLON contexts COLON action { $$ = $6; } 314f66df612Smrg ; 315f66df612Smrg 316f66df612Smrgfullkey : EQUALS keys COLON contextkeys COLON action { $$ = $6; } 317f66df612Smrg ; 318f66df612Smrg 319f66df612Smrgkeys : /* Empty */ 320f66df612Smrg | keys key 321f66df612Smrg ; 322f66df612Smrg 323f66df612Smrgkey : META { mods |= Mod1Mask; } 324f66df612Smrg | SHIFT { mods |= ShiftMask; } 325f66df612Smrg | LOCK { mods |= LockMask; } 326f66df612Smrg | CONTROL { mods |= ControlMask; } 327f66df612Smrg | META number { if ($2 < 1 || $2 > 5) { 328f66df612Smrg parseWarning ( 329f66df612Smrg "bad modifier number (%d), must be 1-5", 330f66df612Smrg $2); 331f66df612Smrg ParseError = 1; 332f66df612Smrg } else { 333f66df612Smrg mods |= (Mod1Mask << ($2 - 1)); 334f66df612Smrg } 335f66df612Smrg } 336f66df612Smrg | OR { } 337f66df612Smrg ; 338f66df612Smrg 339f66df612Smrgcontexts : /* Empty */ 340f66df612Smrg | contexts context 341f66df612Smrg ; 342f66df612Smrg 343f66df612Smrgcontext : WINDOW { cont |= C_WINDOW_BIT; } 344f66df612Smrg | TITLE { cont |= C_TITLE_BIT; } 345f66df612Smrg | ICON { cont |= C_ICON_BIT; } 346f66df612Smrg | ROOT { cont |= C_ROOT_BIT; } 347f66df612Smrg | FRAME { cont |= C_FRAME_BIT; } 348f66df612Smrg | ICONMGR { cont |= C_ICONMGR_BIT; } 349f66df612Smrg | META { cont |= C_ICONMGR_BIT; } 350f66df612Smrg | ALL { cont |= C_ALL_BITS; } 351f66df612Smrg | OR { } 352f66df612Smrg ; 353f66df612Smrg 354f66df612Smrgcontextkeys : /* Empty */ 355f66df612Smrg | contextkeys contextkey 356f66df612Smrg ; 357f66df612Smrg 358f66df612Smrgcontextkey : WINDOW { cont |= C_WINDOW_BIT; } 359f66df612Smrg | TITLE { cont |= C_TITLE_BIT; } 360f66df612Smrg | ICON { cont |= C_ICON_BIT; } 361f66df612Smrg | ROOT { cont |= C_ROOT_BIT; } 362f66df612Smrg | FRAME { cont |= C_FRAME_BIT; } 363f66df612Smrg | ICONMGR { cont |= C_ICONMGR_BIT; } 364f66df612Smrg | META { cont |= C_ICONMGR_BIT; } 365f66df612Smrg | ALL { cont |= C_ALL_BITS; } 366f66df612Smrg | OR { } 367f66df612Smrg | string { Name = $1; cont |= C_NAME_BIT; } 368f66df612Smrg ; 369f66df612Smrg 370f66df612Smrg 371f66df612Smrgpixmap_list : LB pixmap_entries RB 372f66df612Smrg ; 373f66df612Smrg 374f66df612Smrgpixmap_entries : /* Empty */ 375f66df612Smrg | pixmap_entries pixmap_entry 376f66df612Smrg ; 377f66df612Smrg 378f66df612Smrgpixmap_entry : TITLE_HILITE string { SetHighlightPixmap ($2); } 379f66df612Smrg ; 380f66df612Smrg 381f66df612Smrg 382f66df612Smrgcursor_list : LB cursor_entries RB 383f66df612Smrg ; 384f66df612Smrg 385f66df612Smrgcursor_entries : /* Empty */ 386f66df612Smrg | cursor_entries cursor_entry 387f66df612Smrg ; 388f66df612Smrg 389f66df612Smrgcursor_entry : FRAME string string { 390f66df612Smrg NewBitmapCursor(&Scr->FrameCursor, $2, $3); } 391f66df612Smrg | FRAME string { 392f66df612Smrg NewFontCursor(&Scr->FrameCursor, $2); } 393f66df612Smrg | TITLE string string { 394f66df612Smrg NewBitmapCursor(&Scr->TitleCursor, $2, $3); } 395f66df612Smrg | TITLE string { 396f66df612Smrg NewFontCursor(&Scr->TitleCursor, $2); } 397f66df612Smrg | ICON string string { 398f66df612Smrg NewBitmapCursor(&Scr->IconCursor, $2, $3); } 399f66df612Smrg | ICON string { 400f66df612Smrg NewFontCursor(&Scr->IconCursor, $2); } 401f66df612Smrg | ICONMGR string string { 402f66df612Smrg NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); } 403f66df612Smrg | ICONMGR string { 404f66df612Smrg NewFontCursor(&Scr->IconMgrCursor, $2); } 405f66df612Smrg | BUTTON string string { 406f66df612Smrg NewBitmapCursor(&Scr->ButtonCursor, $2, $3); } 407f66df612Smrg | BUTTON string { 408f66df612Smrg NewFontCursor(&Scr->ButtonCursor, $2); } 409f66df612Smrg | MOVE string string { 410f66df612Smrg NewBitmapCursor(&Scr->MoveCursor, $2, $3); } 411f66df612Smrg | MOVE string { 412f66df612Smrg NewFontCursor(&Scr->MoveCursor, $2); } 413f66df612Smrg | RESIZE string string { 414f66df612Smrg NewBitmapCursor(&Scr->ResizeCursor, $2, $3); } 415f66df612Smrg | RESIZE string { 416f66df612Smrg NewFontCursor(&Scr->ResizeCursor, $2); } 417f66df612Smrg | WAIT string string { 418f66df612Smrg NewBitmapCursor(&Scr->WaitCursor, $2, $3); } 419f66df612Smrg | WAIT string { 420f66df612Smrg NewFontCursor(&Scr->WaitCursor, $2); } 421f66df612Smrg | MENU string string { 422f66df612Smrg NewBitmapCursor(&Scr->MenuCursor, $2, $3); } 423f66df612Smrg | MENU string { 424f66df612Smrg NewFontCursor(&Scr->MenuCursor, $2); } 425f66df612Smrg | SELECT string string { 426f66df612Smrg NewBitmapCursor(&Scr->SelectCursor, $2, $3); } 427f66df612Smrg | SELECT string { 428f66df612Smrg NewFontCursor(&Scr->SelectCursor, $2); } 429f66df612Smrg | KILL string string { 430f66df612Smrg NewBitmapCursor(&Scr->DestroyCursor, $2, $3); } 431f66df612Smrg | KILL string { 432f66df612Smrg NewFontCursor(&Scr->DestroyCursor, $2); } 433f66df612Smrg ; 434f66df612Smrg 435f66df612Smrgcolor_list : LB color_entries RB 436f66df612Smrg ; 437f66df612Smrg 438f66df612Smrg 439f66df612Smrgcolor_entries : /* Empty */ 440f66df612Smrg | color_entries color_entry 441f66df612Smrg ; 442f66df612Smrg 443f66df612Smrgcolor_entry : CLKEYWORD string { if (!do_colorlist_keyword ($1, color, 444f66df612Smrg $2)) { 445f66df612Smrg parseWarning ( 446f66df612Smrg "unhandled list color keyword %d (string \"%s\")", 447f66df612Smrg $1, $2); 448f66df612Smrg ParseError = 1; 449f66df612Smrg } 450f66df612Smrg } 451f66df612Smrg | CLKEYWORD string { list = do_colorlist_keyword($1,color, 452f66df612Smrg $2); 453f66df612Smrg if (!list) { 454f66df612Smrg parseWarning ( 455f66df612Smrg "unhandled color list keyword %d (string \"%s\")", 456f66df612Smrg $1, $2); 457f66df612Smrg ParseError = 1; 458f66df612Smrg } 459f66df612Smrg } 460f66df612Smrg win_color_list { /* No action */; } 461f66df612Smrg | CKEYWORD string { if (!do_color_keyword ($1, color, 462f66df612Smrg $2)) { 463f66df612Smrg parseWarning ( 464f66df612Smrg "unhandled color keyword %d (string \"%s\")", 465f66df612Smrg $1, $2); 466f66df612Smrg ParseError = 1; 467f66df612Smrg } 468f66df612Smrg } 469f66df612Smrg ; 4703e747e6dSmrg 471c2535118Smrgsave_color_list : LB s_color_entries RB 4723e747e6dSmrg ; 4733e747e6dSmrg 4743e747e6dSmrgs_color_entries : /* Empty */ 475c2535118Smrg | s_color_entries s_color_entry 4763e747e6dSmrg ; 4773e747e6dSmrg 4783e747e6dSmrgs_color_entry : string { do_string_savecolor(color, $1); } 4793e747e6dSmrg | CLKEYWORD { do_var_savecolor($1); } 4803e747e6dSmrg ; 4813e747e6dSmrg 482f66df612Smrgwin_color_list : LB win_color_entries RB 483f66df612Smrg ; 484f66df612Smrg 485f66df612Smrgwin_color_entries : /* Empty */ 486f66df612Smrg | win_color_entries win_color_entry 487f66df612Smrg ; 488f66df612Smrg 489f66df612Smrgwin_color_entry : string string { if (Scr->FirstTime && 490f66df612Smrg color == Scr->Monochrome) 491f66df612Smrg AddToList(list, $1, $2); } 492f66df612Smrg ; 493f66df612Smrg 494f66df612Smrgsqueeze : SQUEEZE_TITLE { 495f66df612Smrg if (HasShape) Scr->SqueezeTitle = TRUE; 496f66df612Smrg } 497f66df612Smrg | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL; 498f66df612Smrg if (HasShape && Scr->SqueezeTitle == -1) 499f66df612Smrg Scr->SqueezeTitle = TRUE; 500f66df612Smrg } 501f66df612Smrg LB win_sqz_entries RB 502f66df612Smrg | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; } 503f66df612Smrg | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; } 504f66df612Smrg win_list 505f66df612Smrg ; 506f66df612Smrg 507f66df612Smrgwin_sqz_entries : /* Empty */ 508f66df612Smrg | win_sqz_entries string JKEYWORD signed_number number { 509f66df612Smrg if (Scr->FirstTime) { 510f66df612Smrg do_squeeze_entry (list, $2, $3, $4, $5); 511f66df612Smrg } 512f66df612Smrg } 513f66df612Smrg ; 514f66df612Smrg 515f66df612Smrg 516f66df612Smrgiconm_list : LB iconm_entries RB 517f66df612Smrg ; 518f66df612Smrg 519f66df612Smrgiconm_entries : /* Empty */ 520f66df612Smrg | iconm_entries iconm_entry 521f66df612Smrg ; 522f66df612Smrg 523f66df612Smrgiconm_entry : string string number { if (Scr->FirstTime) 524f66df612Smrg AddToList(list, $1, (char *) 525f66df612Smrg AllocateIconManager($1, NULLSTR, 526f66df612Smrg $2,$3)); 527f66df612Smrg } 528f66df612Smrg | string string string number 529f66df612Smrg { if (Scr->FirstTime) 530f66df612Smrg AddToList(list, $1, (char *) 531f66df612Smrg AllocateIconManager($1,$2, 532f66df612Smrg $3, $4)); 533f66df612Smrg } 534f66df612Smrg ; 535f66df612Smrg 536f66df612Smrgwin_list : LB win_entries RB 537f66df612Smrg ; 538f66df612Smrg 539f66df612Smrgwin_entries : /* Empty */ 540f66df612Smrg | win_entries win_entry 541f66df612Smrg ; 542f66df612Smrg 543f66df612Smrgwin_entry : string { if (Scr->FirstTime) 5446d8e82c3Smrg AddToList(list, $1, NULL); 545f66df612Smrg } 546f66df612Smrg ; 547f66df612Smrg 548f66df612Smrgicon_list : LB icon_entries RB 549f66df612Smrg ; 550f66df612Smrg 551f66df612Smrgicon_entries : /* Empty */ 552f66df612Smrg | icon_entries icon_entry 553f66df612Smrg ; 554f66df612Smrg 555f66df612Smrgicon_entry : string string { if (Scr->FirstTime) AddToList(list, $1, $2); } 556f66df612Smrg ; 557f66df612Smrg 558f66df612Smrgfunction : LB function_entries RB 559f66df612Smrg ; 5603e747e6dSmrg 5613e747e6dSmrgfunction_entries: /* Empty */ 562f66df612Smrg | function_entries function_entry 563f66df612Smrg ; 564f66df612Smrg 565f66df612Smrgfunction_entry : action { AddToMenu(root, empty, Action, NULL, $1, 566f66df612Smrg NULLSTR, NULLSTR); 567f66df612Smrg Action = empty; 568f66df612Smrg } 569f66df612Smrg ; 570f66df612Smrg 571f66df612Smrgmenu : LB menu_entries RB 572f66df612Smrg ; 573f66df612Smrg 574f66df612Smrgmenu_entries : /* Empty */ 575f66df612Smrg | menu_entries menu_entry 576f66df612Smrg ; 577f66df612Smrg 578f66df612Smrgmenu_entry : string action { AddToMenu(root, $1, Action, pull, $2, 579f66df612Smrg NULLSTR, NULLSTR); 580f66df612Smrg Action = empty; 581f66df612Smrg pull = NULL; 582f66df612Smrg } 583f66df612Smrg | string LP string COLON string RP action { 584f66df612Smrg AddToMenu(root, $1, Action, pull, $7, 585f66df612Smrg $3, $5); 586f66df612Smrg Action = empty; 587f66df612Smrg pull = NULL; 588f66df612Smrg } 589f66df612Smrg ; 590f66df612Smrg 591f66df612Smrgaction : FKEYWORD { $$ = $1; } 592f66df612Smrg | FSKEYWORD string { 593f66df612Smrg $$ = $1; 594f66df612Smrg Action = $2; 595f66df612Smrg switch ($1) { 596f66df612Smrg case F_MENU: 597f66df612Smrg pull = GetRoot ($2, NULLSTR,NULLSTR); 598f66df612Smrg pull->prev = root; 599f66df612Smrg break; 600f66df612Smrg case F_WARPRING: 601f66df612Smrg if (!CheckWarpRingArg (Action)) { 602f66df612Smrg parseWarning ( 603f66df612Smrg "ignoring invalid f.warptoring argument \"%s\"", 604f66df612Smrg Action); 605f66df612Smrg $$ = F_NOP; 606f66df612Smrg } 607f66df612Smrg break; 608f66df612Smrg case F_WARPTOSCREEN: 609f66df612Smrg if (!CheckWarpScreenArg (Action)) { 610f66df612Smrg parseWarning ( 611f66df612Smrg "ignoring invalid f.warptoscreen argument \"%s\"", 612f66df612Smrg Action); 613f66df612Smrg $$ = F_NOP; 614f66df612Smrg } 615f66df612Smrg break; 616f66df612Smrg case F_COLORMAP: 617f66df612Smrg if (CheckColormapArg (Action)) { 618f66df612Smrg $$ = F_COLORMAP; 619f66df612Smrg } else { 620f66df612Smrg parseWarning ( 621f66df612Smrg "ignoring invalid f.colormap argument \"%s\"", 622f66df612Smrg Action); 623f66df612Smrg $$ = F_NOP; 624f66df612Smrg } 625f66df612Smrg break; 626f66df612Smrg } /* end switch */ 627f66df612Smrg } 628f66df612Smrg ; 629f66df612Smrg 630f66df612Smrg 631f66df612Smrgsigned_number : number { $$ = $1; } 632f66df612Smrg | PLUS number { $$ = $2; } 633f66df612Smrg | MINUS number { $$ = -($2); } 634f66df612Smrg ; 635f66df612Smrg 636f66df612Smrgbutton : BUTTON number { $$ = $2; 637f66df612Smrg if ($2 == 0) 638f66df612Smrg yyerror("bad button 0"); 639f66df612Smrg 640f66df612Smrg if ($2 > MAX_BUTTONS) 641f66df612Smrg { 642f66df612Smrg $$ = 0; 643f66df612Smrg yyerror("button number too large"); 644f66df612Smrg } 645f66df612Smrg } 646f66df612Smrg ; 647f66df612Smrg 648f66df612Smrgstring : STRING { ptr = strdup($1); 649f66df612Smrg RemoveDQuote(ptr); 650f66df612Smrg $$ = ptr; 651f66df612Smrg } 652f66df612Smrg ; 653f66df612Smrgnumber : NUMBER { $$ = $1; } 654f66df612Smrg ; 6553e747e6dSmrg 6563e747e6dSmrg%% 657f66df612Smrg 658c2535118Smrgstatic void 659c2535118Smrgyyerror(const char *s) 6603e747e6dSmrg{ 661f66df612Smrg parseWarning("error in input file: %s", s ? s : ""); 6623e747e6dSmrg ParseError = 1; 6633e747e6dSmrg} 6643e747e6dSmrg 665c2535118Smrgstatic void 6663e747e6dSmrgRemoveDQuote(char *str) 6673e747e6dSmrg{ 6686d8e82c3Smrg char *i, *o; 6696d8e82c3Smrg int n; 6706d8e82c3Smrg int count; 6713e747e6dSmrg 672f66df612Smrg for (i = str + 1, o = str; *i && *i != '\"'; o++) { 673f66df612Smrg if (*i == '\\') { 674f66df612Smrg switch (*++i) { 675f66df612Smrg case 'n': 676f66df612Smrg *o = '\n'; 677f66df612Smrg i++; 678f66df612Smrg break; 679f66df612Smrg case 'b': 680f66df612Smrg *o = '\b'; 681f66df612Smrg i++; 682f66df612Smrg break; 683f66df612Smrg case 'r': 684f66df612Smrg *o = '\r'; 685f66df612Smrg i++; 686f66df612Smrg break; 687f66df612Smrg case 't': 688f66df612Smrg *o = '\t'; 689f66df612Smrg i++; 690f66df612Smrg break; 691f66df612Smrg case 'f': 692f66df612Smrg *o = '\f'; 693f66df612Smrg i++; 694f66df612Smrg break; 695f66df612Smrg case '0': 696f66df612Smrg if (*++i == 'x') 697f66df612Smrg goto hex; 698f66df612Smrg else 699f66df612Smrg --i; 700f66df612Smrg /* FALLTHRU */ 701f66df612Smrg case '1': 702f66df612Smrg case '2': 703f66df612Smrg case '3': 704f66df612Smrg case '4': 705f66df612Smrg case '5': 706f66df612Smrg case '6': 707f66df612Smrg case '7': 708f66df612Smrg n = 0; 709f66df612Smrg count = 0; 710f66df612Smrg while (*i >= '0' && *i <= '7' && count < 3) { 711f66df612Smrg n = (n << 3) + (*i++ - '0'); 712f66df612Smrg count++; 713f66df612Smrg } 714f66df612Smrg *o = (char) n; 715f66df612Smrg break; 716f66df612Smrg hex: 717f66df612Smrg case 'x': 718f66df612Smrg n = 0; 719f66df612Smrg count = 0; 720f66df612Smrg while (i++, count++ < 2) { 721f66df612Smrg if (*i >= '0' && *i <= '9') 722f66df612Smrg n = (n << 4) + (*i - '0'); 723f66df612Smrg else if (*i >= 'a' && *i <= 'f') 724f66df612Smrg n = (n << 4) + (*i - 'a') + 10; 725f66df612Smrg else if (*i >= 'A' && *i <= 'F') 726f66df612Smrg n = (n << 4) + (*i - 'A') + 10; 727f66df612Smrg else 728f66df612Smrg break; 729f66df612Smrg } 730f66df612Smrg *o = (char) n; 731f66df612Smrg break; 732f66df612Smrg case '\n': 733f66df612Smrg i++; /* punt */ 734f66df612Smrg o--; /* to account for o++ at end of loop */ 735f66df612Smrg break; 736f66df612Smrg case '\"': 737f66df612Smrg case '\'': 738f66df612Smrg case '\\': 739f66df612Smrg default: 740f66df612Smrg *o = *i++; 741f66df612Smrg break; 742f66df612Smrg } 743f66df612Smrg } 744f66df612Smrg else 745f66df612Smrg *o = *i++; 7463e747e6dSmrg } 7473e747e6dSmrg *o = '\0'; 7483e747e6dSmrg} 7493e747e6dSmrg 750f66df612Smrgstatic MenuRoot * 751f66df612SmrgGetRoot(const char *name, const char *fore, const char *back) 7523e747e6dSmrg{ 7533e747e6dSmrg MenuRoot *tmp; 7543e747e6dSmrg 7553e747e6dSmrg tmp = FindMenuRoot(name); 7563e747e6dSmrg if (tmp == NULL) 757f66df612Smrg tmp = NewMenuRoot(name); 7583e747e6dSmrg 759f66df612Smrg if (fore) { 760f66df612Smrg int save; 7613e747e6dSmrg 762f66df612Smrg save = Scr->FirstTime; 763f66df612Smrg Scr->FirstTime = TRUE; 764f66df612Smrg GetColor(COLOR, &tmp->hi_fore, fore); 765f66df612Smrg GetColor(COLOR, &tmp->hi_back, back); 766f66df612Smrg Scr->FirstTime = (short) save; 7673e747e6dSmrg } 7683e747e6dSmrg 7693e747e6dSmrg return tmp; 7703e747e6dSmrg} 7713e747e6dSmrg 772f66df612Smrgstatic void 773f66df612SmrgGotButton(int butt, int func) 7743e747e6dSmrg{ 7753e747e6dSmrg int i; 7763e747e6dSmrg 777f66df612Smrg for (i = 0; i < NUM_CONTEXTS; i++) { 778f66df612Smrg if ((cont & (1 << i)) == 0) 779f66df612Smrg continue; 780f66df612Smrg 781f66df612Smrg Scr->Mouse[butt][i][mods].func = func; 782f66df612Smrg if (func == F_MENU) { 783f66df612Smrg pull->prev = NULL; 784f66df612Smrg Scr->Mouse[butt][i][mods].menu = pull; 785f66df612Smrg } 786f66df612Smrg else { 787f66df612Smrg root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR); 788f66df612Smrg Scr->Mouse[butt][i][mods].item = AddToMenu(root, "x", Action, 789f66df612Smrg NULL, func, NULLSTR, NULLSTR); 790f66df612Smrg } 7913e747e6dSmrg } 792f66df612Smrg Action = empty; 7933e747e6dSmrg pull = NULL; 7943e747e6dSmrg cont = 0; 795f66df612Smrg mods_used |= (unsigned) mods; 7963e747e6dSmrg mods = 0; 7973e747e6dSmrg} 7983e747e6dSmrg 799f66df612Smrgstatic void 800f66df612SmrgGotKey(char *key, int func) 8013e747e6dSmrg{ 8023e747e6dSmrg int i; 8033e747e6dSmrg 804f66df612Smrg for (i = 0; i < NUM_CONTEXTS; i++) { 805f66df612Smrg if ((cont & (1 << i)) == 0) 806f66df612Smrg continue; 807f66df612Smrg if (!AddFuncKey(key, i, mods, func, Name, Action)) 808f66df612Smrg break; 8093e747e6dSmrg } 8103e747e6dSmrg 811f66df612Smrg Action = empty; 8123e747e6dSmrg pull = NULL; 8133e747e6dSmrg cont = 0; 814f66df612Smrg mods_used |= (unsigned) mods; 8153e747e6dSmrg mods = 0; 8163e747e6dSmrg} 8173e747e6dSmrg 818f66df612Smrgstatic void 819f66df612SmrgGotTitleButton(char *bitmapname, int func, Bool rightside) 8203e747e6dSmrg{ 821f66df612Smrg if (!CreateTitleButton(bitmapname, func, Action, pull, rightside, True)) { 822f66df612Smrg parseWarning("unable to create %s titlebutton \"%s\"", 823f66df612Smrg rightside ? "right" : "left", bitmapname); 8243e747e6dSmrg } 825f66df612Smrg Action = empty; 8263e747e6dSmrg pull = NULL; 8273e747e6dSmrg} 8283e747e6dSmrg 829f66df612Smrgstatic Bool 830f66df612SmrgCheckWarpScreenArg(char *s) 8313e747e6dSmrg{ 832f66df612Smrg XmuCopyISOLatin1Lowered(s, s); 8333e747e6dSmrg 834f66df612Smrg if (strcmp(s, WARPSCREEN_NEXT) == 0 || 835f66df612Smrg strcmp(s, WARPSCREEN_PREV) == 0 || 836f66df612Smrg strcmp(s, WARPSCREEN_BACK) == 0) 837f66df612Smrg return True; 8383e747e6dSmrg 839f66df612Smrg for (; *s && isascii(*s) && isdigit(*s); s++); /* SUPPRESS 530 */ 8403e747e6dSmrg return (*s ? False : True); 8413e747e6dSmrg} 8423e747e6dSmrg 843f66df612Smrgstatic Bool 844f66df612SmrgCheckWarpRingArg(char *s) 8453e747e6dSmrg{ 846f66df612Smrg XmuCopyISOLatin1Lowered(s, s); 8473e747e6dSmrg 848f66df612Smrg if (strcmp(s, WARPSCREEN_NEXT) == 0 || 849f66df612Smrg strcmp(s, WARPSCREEN_PREV) == 0) 850f66df612Smrg return True; 8513e747e6dSmrg 8523e747e6dSmrg return False; 8533e747e6dSmrg} 8543e747e6dSmrg 855f66df612Smrgstatic Bool 856f66df612SmrgCheckColormapArg(char *s) 8573e747e6dSmrg{ 858f66df612Smrg XmuCopyISOLatin1Lowered(s, s); 8593e747e6dSmrg 860f66df612Smrg if (strcmp(s, COLORMAP_NEXT) == 0 || 861f66df612Smrg strcmp(s, COLORMAP_PREV) == 0 || 862f66df612Smrg strcmp(s, COLORMAP_DEFAULT) == 0) 863f66df612Smrg return True; 8643e747e6dSmrg 8653e747e6dSmrg return False; 8663e747e6dSmrg} 867