2017-09-15 23:01:49 -04:00
|
|
|
/*****************************************************************************/
|
|
|
|
/*
|
|
|
|
|
|
|
|
Copyright 1989, 1998 The Open Group
|
|
|
|
|
|
|
|
Permission to use, copy, modify, distribute, and sell this software and its
|
|
|
|
documentation for any purpose is hereby granted without fee, provided that
|
|
|
|
the above copyright notice appear in all copies and that both that
|
|
|
|
copyright notice and this permission notice appear in supporting
|
|
|
|
documentation.
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
|
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
Except as contained in this notice, the name of The Open Group shall not be
|
|
|
|
used in advertising or otherwise to promote the sale, use or other dealings
|
|
|
|
in this Software without prior written authorization from The Open Group.
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/
|
|
|
|
/** Salt Lake City, Utah **/
|
|
|
|
/** Cambridge, Massachusetts **/
|
|
|
|
/** **/
|
|
|
|
/** All Rights Reserved **/
|
|
|
|
/** **/
|
|
|
|
/** Permission to use, copy, modify, and distribute this software and **/
|
|
|
|
/** its documentation for any purpose and without fee is hereby **/
|
|
|
|
/** granted, provided that the above copyright notice appear in all **/
|
|
|
|
/** copies and that both that copyright notice and this permis- **/
|
|
|
|
/** sion notice appear in supporting documentation, and that the **/
|
|
|
|
/** name of Evans & Sutherland not be used in advertising **/
|
|
|
|
/** in publicity pertaining to distribution of the software without **/
|
|
|
|
/** specific, written prior permission. **/
|
|
|
|
/** **/
|
|
|
|
/** EVANS & SUTHERLAND DISCLAIMs ALL WARRANTIES WITH REGARD **/
|
|
|
|
/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
|
|
|
|
/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND **/
|
|
|
|
/** BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/
|
|
|
|
/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
|
|
|
|
/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
|
|
|
|
/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
|
|
|
|
/** OR PERFORMANCE OF THIS SOFTWARE. **/
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
*
|
|
|
|
* $Xorg: gram.y,v 1.4 2001/02/09 02:05:36 xorgcvs Exp $
|
|
|
|
*
|
|
|
|
* .twmrc command grammer
|
|
|
|
*
|
|
|
|
* 07-Jan-86 Thomas E. LaStrange File created
|
|
|
|
* 11-Nov-90 Dave Sternlicht Adding SaveColors
|
|
|
|
* 10-Oct-90 David M. Sternlicht Storing saved colors on root
|
|
|
|
*
|
|
|
|
* $XFree86: xc/programs/twm/gram.y,v 3.8 2002/10/16 21:33:03 tsi Exp $
|
|
|
|
*
|
|
|
|
***********************************************************************/
|
|
|
|
|
|
|
|
%{
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include "twm.h"
|
|
|
|
#include "menus.h"
|
|
|
|
#include "list.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "screen.h"
|
|
|
|
#include "parse.h"
|
|
|
|
#include "add_window.h"
|
|
|
|
#include <X11/Xos.h>
|
|
|
|
#include <X11/Xmu/CharSet.h>
|
|
|
|
|
|
|
|
static char *Action = "";
|
|
|
|
static char *Name = "";
|
|
|
|
static MenuRoot *root, *pull = NULL;
|
|
|
|
|
|
|
|
static MenuRoot *GetRoot ( const char *name, const char *fore, const char *back );
|
|
|
|
static void GotButton ( int butt, int func );
|
|
|
|
static void GotKey ( char *key, int func );
|
|
|
|
static void GotTitleButton ( char *bitmapname, int func, Bool rightside );
|
|
|
|
static Bool CheckWarpScreenArg ( char *s );
|
|
|
|
static Bool CheckWarpRingArg ( char *s );
|
|
|
|
static Bool CheckColormapArg ( char *s );
|
|
|
|
static void RemoveDQuote ( char *str );
|
|
|
|
|
|
|
|
static char *ptr;
|
|
|
|
static name_list **list;
|
|
|
|
static int cont = 0;
|
|
|
|
static int color;
|
|
|
|
int mods = 0;
|
|
|
|
unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask);
|
|
|
|
|
|
|
|
extern int yylineno;
|
|
|
|
static void yyerror ( const char *s );
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
%union
|
|
|
|
{
|
|
|
|
int num;
|
|
|
|
char *ptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
|
2018-08-14 00:38:38 -04:00
|
|
|
%token <num> ALL OR CURSORS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
|
2017-12-16 21:42:55 -05:00
|
|
|
%token <num> WINDOW_FUNCTION ZOOM
|
|
|
|
%token <num> MAKE_TITLE GRAYSCALE
|
2018-08-14 00:38:38 -04:00
|
|
|
%token <num> NO_TITLE AUTO_RAISE ICON_REGION
|
2017-09-15 23:01:49 -04:00
|
|
|
%token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
|
2018-08-14 00:38:38 -04:00
|
|
|
%token <num> COLON EQUALS START_ICONIFIED
|
2017-09-15 23:01:49 -04:00
|
|
|
%token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
|
|
|
|
%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
|
|
|
|
%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
|
|
|
|
%token <num> NO_STACKMODE
|
|
|
|
%token <ptr> STRING
|
|
|
|
|
|
|
|
%type <ptr> string
|
2018-08-14 00:38:38 -04:00
|
|
|
%type <num> cursor_list color_list save_color_list stmt
|
2017-12-16 21:42:55 -05:00
|
|
|
%type <num> win_color_list win_list function menu
|
2018-08-14 00:38:38 -04:00
|
|
|
%type <num> noarg sarg error narg color_entry
|
2017-09-15 23:01:49 -04:00
|
|
|
%type <num> action button number signed_number full fullkey
|
|
|
|
|
|
|
|
%start twmrc
|
|
|
|
|
|
|
|
%%
|
|
|
|
twmrc : stmts
|
|
|
|
;
|
|
|
|
|
|
|
|
stmts : /* Empty */
|
|
|
|
| stmts stmt
|
|
|
|
;
|
|
|
|
|
|
|
|
stmt : error
|
|
|
|
| noarg
|
|
|
|
| sarg
|
|
|
|
| narg
|
|
|
|
| ZOOM number { if (Scr->FirstTime)
|
|
|
|
{
|
|
|
|
Scr->DoZoom = TRUE;
|
|
|
|
Scr->ZoomCount = $2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
| ZOOM { if (Scr->FirstTime)
|
|
|
|
Scr->DoZoom = TRUE; }
|
|
|
|
| CURSORS cursor_list {}
|
|
|
|
| LEFT_TITLEBUTTON string EQUALS action {
|
|
|
|
GotTitleButton ($2, $4, False);
|
|
|
|
}
|
|
|
|
| RIGHT_TITLEBUTTON string EQUALS action {
|
|
|
|
GotTitleButton ($2, $4, True);
|
|
|
|
}
|
|
|
|
| button string { root = GetRoot($2, NULLSTR, NULLSTR);
|
|
|
|
Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
|
|
|
|
Scr->Mouse[$1][C_ROOT][0].menu = root;
|
|
|
|
}
|
|
|
|
| button action { Scr->Mouse[$1][C_ROOT][0].func = $2;
|
|
|
|
if ($2 == F_MENU)
|
|
|
|
{
|
|
|
|
pull->prev = NULL;
|
|
|
|
Scr->Mouse[$1][C_ROOT][0].menu = pull;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
|
|
|
|
Scr->Mouse[$1][C_ROOT][0].item =
|
|
|
|
AddToMenu(root,"x",Action,
|
|
|
|
NULL,$2,NULLSTR,NULLSTR);
|
|
|
|
}
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
}
|
|
|
|
| string fullkey { GotKey($1, $2); }
|
|
|
|
| button full { GotButton($1, $2); }
|
|
|
|
| NO_STACKMODE { list = &Scr->NoStackModeL; }
|
|
|
|
win_list
|
|
|
|
| NO_STACKMODE { if (Scr->FirstTime)
|
|
|
|
Scr->StackMode = FALSE; }
|
|
|
|
| NO_TITLE { list = &Scr->NoTitle; }
|
|
|
|
win_list
|
|
|
|
| NO_TITLE { if (Scr->FirstTime)
|
|
|
|
Scr->NoTitlebar = TRUE; }
|
|
|
|
| MAKE_TITLE { list = &Scr->MakeTitle; }
|
|
|
|
win_list
|
|
|
|
| START_ICONIFIED { list = &Scr->StartIconified; }
|
|
|
|
win_list
|
|
|
|
| AUTO_RAISE { list = &Scr->AutoRaise; }
|
|
|
|
win_list
|
|
|
|
| MENU string LP string COLON string RP {
|
|
|
|
root = GetRoot($2, $4, $6); }
|
|
|
|
menu { root->real_menu = TRUE;}
|
|
|
|
| MENU string { root = GetRoot($2, NULLSTR, NULLSTR); }
|
|
|
|
menu { root->real_menu = TRUE; }
|
|
|
|
| FUNCTION string { root = GetRoot($2, NULLSTR, NULLSTR); }
|
|
|
|
function
|
|
|
|
| ICONS { list = &Scr->IconNames; }
|
|
|
|
icon_list
|
|
|
|
| COLOR { color = COLOR; }
|
|
|
|
color_list
|
|
|
|
| GRAYSCALE { color = GRAYSCALE; }
|
|
|
|
color_list
|
|
|
|
| SAVECOLOR
|
|
|
|
save_color_list
|
|
|
|
| MONOCHROME { color = MONOCHROME; }
|
|
|
|
color_list
|
|
|
|
| DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
|
|
|
|
if ($2 == F_MENU)
|
|
|
|
{
|
|
|
|
pull->prev = NULL;
|
|
|
|
Scr->DefaultFunction.menu = pull;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
|
|
|
|
Scr->DefaultFunction.item =
|
|
|
|
AddToMenu(root,"x",Action,
|
|
|
|
NULL,$2, NULLSTR, NULLSTR);
|
|
|
|
}
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
}
|
|
|
|
| WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
|
|
|
|
root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
|
|
|
|
Scr->WindowFunction.item =
|
|
|
|
AddToMenu(root,"x",Action,
|
|
|
|
NULL,$2, NULLSTR, NULLSTR);
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
}
|
|
|
|
| WARP_CURSOR { list = &Scr->WarpCursorL; }
|
|
|
|
win_list
|
|
|
|
| WARP_CURSOR { if (Scr->FirstTime)
|
|
|
|
Scr->WarpCursor = TRUE; }
|
|
|
|
| WINDOW_RING { list = &Scr->WindowRingL; }
|
|
|
|
win_list
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
noarg : KEYWORD { if (!do_single_keyword ($1)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"unknown singleton keyword %d\n",
|
|
|
|
$1);
|
|
|
|
ParseError = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
sarg : SKEYWORD string { if (!do_string_keyword ($1, $2)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"unknown string keyword %d (value \"%s\")\n",
|
|
|
|
$1, $2);
|
|
|
|
ParseError = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
narg : NKEYWORD number { if (!do_number_keyword ($1, $2)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"unknown numeric keyword %d (value %d)\n",
|
|
|
|
$1, $2);
|
|
|
|
ParseError = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
full : EQUALS keys COLON contexts COLON action { $$ = $6; }
|
|
|
|
;
|
|
|
|
|
|
|
|
fullkey : EQUALS keys COLON contextkeys COLON action { $$ = $6; }
|
|
|
|
;
|
|
|
|
|
|
|
|
keys : /* Empty */
|
|
|
|
| keys key
|
|
|
|
;
|
|
|
|
|
|
|
|
key : META { mods |= Mod1Mask; }
|
|
|
|
| SHIFT { mods |= ShiftMask; }
|
|
|
|
| LOCK { mods |= LockMask; }
|
|
|
|
| CONTROL { mods |= ControlMask; }
|
|
|
|
| META number { if ($2 < 1 || $2 > 5) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"bad modifier number (%d), must be 1-5\n",
|
|
|
|
$2);
|
|
|
|
ParseError = 1;
|
|
|
|
} else {
|
|
|
|
mods |= (Mod1Mask << ($2 - 1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
| OR { }
|
|
|
|
;
|
|
|
|
|
|
|
|
contexts : /* Empty */
|
|
|
|
| contexts context
|
|
|
|
;
|
|
|
|
|
|
|
|
context : WINDOW { cont |= C_WINDOW_BIT; }
|
|
|
|
| TITLE { cont |= C_TITLE_BIT; }
|
|
|
|
| ICON { cont |= C_ICON_BIT; }
|
|
|
|
| ROOT { cont |= C_ROOT_BIT; }
|
|
|
|
| FRAME { cont |= C_FRAME_BIT; }
|
|
|
|
| ALL { cont |= C_ALL_BITS; }
|
|
|
|
| OR { }
|
|
|
|
;
|
|
|
|
|
|
|
|
contextkeys : /* Empty */
|
|
|
|
| contextkeys contextkey
|
|
|
|
;
|
|
|
|
|
|
|
|
contextkey : WINDOW { cont |= C_WINDOW_BIT; }
|
|
|
|
| TITLE { cont |= C_TITLE_BIT; }
|
|
|
|
| ICON { cont |= C_ICON_BIT; }
|
|
|
|
| ROOT { cont |= C_ROOT_BIT; }
|
|
|
|
| FRAME { cont |= C_FRAME_BIT; }
|
|
|
|
| ALL { cont |= C_ALL_BITS; }
|
|
|
|
| OR { }
|
|
|
|
| string { Name = $1; cont |= C_NAME_BIT; }
|
|
|
|
;
|
|
|
|
|
|
|
|
cursor_list : LB cursor_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
cursor_entries : /* Empty */
|
|
|
|
| cursor_entries cursor_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
cursor_entry : FRAME string string {
|
|
|
|
NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
|
|
|
|
| FRAME string {
|
|
|
|
NewFontCursor(&Scr->FrameCursor, $2); }
|
|
|
|
| TITLE string string {
|
|
|
|
NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
|
|
|
|
| TITLE string {
|
|
|
|
NewFontCursor(&Scr->TitleCursor, $2); }
|
|
|
|
| ICON string string {
|
|
|
|
NewBitmapCursor(&Scr->IconCursor, $2, $3); }
|
|
|
|
| ICON string {
|
|
|
|
NewFontCursor(&Scr->IconCursor, $2); }
|
|
|
|
| BUTTON string string {
|
|
|
|
NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
|
|
|
|
| BUTTON string {
|
|
|
|
NewFontCursor(&Scr->ButtonCursor, $2); }
|
|
|
|
| MOVE string string {
|
|
|
|
NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
|
|
|
|
| MOVE string {
|
|
|
|
NewFontCursor(&Scr->MoveCursor, $2); }
|
|
|
|
| RESIZE string string {
|
|
|
|
NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
|
|
|
|
| RESIZE string {
|
|
|
|
NewFontCursor(&Scr->ResizeCursor, $2); }
|
|
|
|
| WAIT string string {
|
|
|
|
NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
|
|
|
|
| WAIT string {
|
|
|
|
NewFontCursor(&Scr->WaitCursor, $2); }
|
|
|
|
| MENU string string {
|
|
|
|
NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
|
|
|
|
| MENU string {
|
|
|
|
NewFontCursor(&Scr->MenuCursor, $2); }
|
|
|
|
| SELECT string string {
|
|
|
|
NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
|
|
|
|
| SELECT string {
|
|
|
|
NewFontCursor(&Scr->SelectCursor, $2); }
|
|
|
|
| KILL string string {
|
|
|
|
NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
|
|
|
|
| KILL string {
|
|
|
|
NewFontCursor(&Scr->DestroyCursor, $2); }
|
|
|
|
;
|
|
|
|
|
|
|
|
color_list : LB color_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
color_entries : /* Empty */
|
|
|
|
| color_entries color_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
color_entry : CLKEYWORD string { if (!do_colorlist_keyword ($1, color,
|
|
|
|
$2)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"unhandled list color keyword %d (string \"%s\")\n",
|
|
|
|
$1, $2);
|
|
|
|
ParseError = 1;
|
|
|
|
}
|
|
|
|
}
|
2018-08-14 00:38:38 -04:00
|
|
|
| CLKEYWORD string { list = do_colorlist_keyword($1, color,
|
2017-09-15 23:01:49 -04:00
|
|
|
$2);
|
|
|
|
if (!list) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"unhandled color list keyword %d (string \"%s\")\n",
|
|
|
|
$1, $2);
|
|
|
|
ParseError = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
win_color_list { /* No action */; }
|
|
|
|
| CKEYWORD string { if (!do_color_keyword ($1, color,
|
|
|
|
$2)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"unhandled color keyword %d (string \"%s\")\n",
|
|
|
|
$1, $2);
|
|
|
|
ParseError = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
save_color_list : LB s_color_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
s_color_entries : /* Empty */
|
|
|
|
| s_color_entries s_color_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
s_color_entry : string { do_string_savecolor(color, $1); }
|
|
|
|
| CLKEYWORD { do_var_savecolor($1); }
|
|
|
|
;
|
|
|
|
|
|
|
|
win_color_list : LB win_color_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
win_color_entries : /* Empty */
|
|
|
|
| win_color_entries win_color_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
win_color_entry : string string { if (Scr->FirstTime &&
|
|
|
|
color == Scr->Monochrome)
|
|
|
|
AddToList(list, $1, $2); }
|
|
|
|
;
|
|
|
|
|
|
|
|
win_list : LB win_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
win_entries : /* Empty */
|
|
|
|
| win_entries win_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
win_entry : string { if (Scr->FirstTime)
|
|
|
|
AddToList(list, $1, 0);
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
icon_list : LB icon_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
icon_entries : /* Empty */
|
|
|
|
| icon_entries icon_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
icon_entry : string string { if (Scr->FirstTime) AddToList(list, $1, $2); }
|
|
|
|
;
|
|
|
|
|
|
|
|
function : LB function_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
function_entries: /* Empty */
|
|
|
|
| function_entries function_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
function_entry : action { AddToMenu(root, "", Action, NULL, $1,
|
|
|
|
NULLSTR, NULLSTR);
|
|
|
|
Action = "";
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
menu : LB menu_entries RB
|
|
|
|
;
|
|
|
|
|
|
|
|
menu_entries : /* Empty */
|
|
|
|
| menu_entries menu_entry
|
|
|
|
;
|
|
|
|
|
|
|
|
menu_entry : string action { AddToMenu(root, $1, Action, pull, $2,
|
|
|
|
NULLSTR, NULLSTR);
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
}
|
|
|
|
| string LP string COLON string RP action {
|
|
|
|
AddToMenu(root, $1, Action, pull, $7,
|
|
|
|
$3, $5);
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
action : FKEYWORD { $$ = $1; }
|
|
|
|
| FSKEYWORD string {
|
|
|
|
$$ = $1;
|
|
|
|
Action = $2;
|
|
|
|
switch ($1) {
|
|
|
|
case F_MENU:
|
|
|
|
pull = GetRoot ($2, NULLSTR,NULLSTR);
|
|
|
|
pull->prev = root;
|
|
|
|
break;
|
|
|
|
case F_WARPRING:
|
|
|
|
if (!CheckWarpRingArg (Action)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"ignoring invalid f.warptoring argument \"%s\"\n",
|
|
|
|
Action);
|
|
|
|
$$ = F_NOP;
|
|
|
|
}
|
|
|
|
case F_WARPTOSCREEN:
|
|
|
|
if (!CheckWarpScreenArg (Action)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"ignoring invalid f.warptoscreen argument \"%s\"\n",
|
|
|
|
Action);
|
|
|
|
$$ = F_NOP;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case F_COLORMAP:
|
|
|
|
if (CheckColormapArg (Action)) {
|
|
|
|
$$ = F_COLORMAP;
|
|
|
|
} else {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"ignoring invalid f.colormap argument \"%s\"\n",
|
|
|
|
Action);
|
|
|
|
$$ = F_NOP;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
} /* end switch */
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
signed_number : number { $$ = $1; }
|
|
|
|
| PLUS number { $$ = $2; }
|
|
|
|
| MINUS number { $$ = -($2); }
|
|
|
|
;
|
|
|
|
|
|
|
|
button : BUTTON number { $$ = $2;
|
|
|
|
if ($2 == 0)
|
|
|
|
yyerror("bad button 0");
|
|
|
|
|
|
|
|
if ($2 > MAX_BUTTONS)
|
|
|
|
{
|
|
|
|
$$ = 0;
|
|
|
|
yyerror("button number too large");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
string : STRING { ptr = strdup($1);
|
|
|
|
RemoveDQuote(ptr);
|
|
|
|
$$ = ptr;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
number : NUMBER { $$ = $1; }
|
|
|
|
;
|
|
|
|
|
|
|
|
%%
|
|
|
|
static void
|
|
|
|
yyerror(const char *s)
|
|
|
|
{
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr, "error in input file: %s\n", s ? s : "");
|
|
|
|
ParseError = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
RemoveDQuote(char *str)
|
|
|
|
{
|
|
|
|
register char *i, *o;
|
|
|
|
register int n;
|
|
|
|
register int count;
|
|
|
|
|
|
|
|
for (i=str+1, o=str; *i && *i != '\"'; o++)
|
|
|
|
{
|
|
|
|
if (*i == '\\')
|
|
|
|
{
|
|
|
|
switch (*++i)
|
|
|
|
{
|
|
|
|
case 'n':
|
|
|
|
*o = '\n';
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
case 'b':
|
|
|
|
*o = '\b';
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
case 'r':
|
|
|
|
*o = '\r';
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
case 't':
|
|
|
|
*o = '\t';
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
case 'f':
|
|
|
|
*o = '\f';
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
case '0':
|
|
|
|
if (*++i == 'x')
|
|
|
|
goto hex;
|
|
|
|
else
|
|
|
|
--i;
|
|
|
|
case '1': case '2': case '3':
|
|
|
|
case '4': case '5': case '6': case '7':
|
|
|
|
n = 0;
|
|
|
|
count = 0;
|
|
|
|
while (*i >= '0' && *i <= '7' && count < 3)
|
|
|
|
{
|
|
|
|
n = (n<<3) + (*i++ - '0');
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
*o = n;
|
|
|
|
break;
|
|
|
|
hex:
|
|
|
|
case 'x':
|
|
|
|
n = 0;
|
|
|
|
count = 0;
|
|
|
|
while (i++, count++ < 2)
|
|
|
|
{
|
|
|
|
if (*i >= '0' && *i <= '9')
|
|
|
|
n = (n<<4) + (*i - '0');
|
|
|
|
else if (*i >= 'a' && *i <= 'f')
|
|
|
|
n = (n<<4) + (*i - 'a') + 10;
|
|
|
|
else if (*i >= 'A' && *i <= 'F')
|
|
|
|
n = (n<<4) + (*i - 'A') + 10;
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
*o = n;
|
|
|
|
break;
|
|
|
|
case '\n':
|
|
|
|
i++; /* punt */
|
|
|
|
o--; /* to account for o++ at end of loop */
|
|
|
|
break;
|
|
|
|
case '\"':
|
|
|
|
case '\'':
|
|
|
|
case '\\':
|
|
|
|
default:
|
|
|
|
*o = *i++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*o = *i++;
|
|
|
|
}
|
|
|
|
*o = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
static MenuRoot *GetRoot(const char *name, const char* fore, const char *back)
|
|
|
|
{
|
|
|
|
MenuRoot *tmp;
|
|
|
|
|
|
|
|
tmp = FindMenuRoot(name);
|
|
|
|
if (tmp == NULL)
|
|
|
|
tmp = NewMenuRoot(name);
|
|
|
|
|
|
|
|
if (fore)
|
|
|
|
{
|
|
|
|
int save;
|
|
|
|
|
|
|
|
save = Scr->FirstTime;
|
|
|
|
Scr->FirstTime = TRUE;
|
|
|
|
GetColor(COLOR, &tmp->hi_fore, fore);
|
|
|
|
GetColor(COLOR, &tmp->hi_back, back);
|
|
|
|
Scr->FirstTime = save;
|
|
|
|
}
|
|
|
|
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void GotButton(int butt, int func)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_CONTEXTS; i++)
|
|
|
|
{
|
|
|
|
if ((cont & (1 << i)) == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
Scr->Mouse[butt][i][mods].func = func;
|
|
|
|
if (func == F_MENU)
|
|
|
|
{
|
|
|
|
pull->prev = NULL;
|
|
|
|
Scr->Mouse[butt][i][mods].menu = pull;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
|
|
|
|
Scr->Mouse[butt][i][mods].item = AddToMenu(root,"x",Action,
|
|
|
|
NULL, func, NULLSTR, NULLSTR);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
cont = 0;
|
|
|
|
mods_used |= mods;
|
|
|
|
mods = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void GotKey(char *key, int func)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_CONTEXTS; i++)
|
|
|
|
{
|
|
|
|
if ((cont & (1 << i)) == 0)
|
|
|
|
continue;
|
|
|
|
if (!AddFuncKey(key, i, mods, func, Name, Action))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
cont = 0;
|
|
|
|
mods_used |= mods;
|
|
|
|
mods = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void GotTitleButton (char *bitmapname, int func, Bool rightside)
|
|
|
|
{
|
|
|
|
if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) {
|
|
|
|
twmrc_error_prefix();
|
|
|
|
fprintf (stderr,
|
|
|
|
"unable to create %s titlebutton \"%s\"\n",
|
|
|
|
rightside ? "right" : "left", bitmapname);
|
|
|
|
}
|
|
|
|
Action = "";
|
|
|
|
pull = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Bool CheckWarpScreenArg (char *s)
|
|
|
|
{
|
|
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
|
|
|
|
if (strcmp (s, WARPSCREEN_NEXT) == 0 ||
|
|
|
|
strcmp (s, WARPSCREEN_PREV) == 0 ||
|
|
|
|
strcmp (s, WARPSCREEN_BACK) == 0)
|
|
|
|
return True;
|
|
|
|
|
|
|
|
for (; *s && isascii(*s) && isdigit(*s); s++) ; /* SUPPRESS 530 */
|
|
|
|
return (*s ? False : True);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static Bool CheckWarpRingArg (char *s)
|
|
|
|
{
|
|
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
|
|
|
|
if (strcmp (s, WARPSCREEN_NEXT) == 0 ||
|
|
|
|
strcmp (s, WARPSCREEN_PREV) == 0)
|
|
|
|
return True;
|
|
|
|
|
|
|
|
return False;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static Bool CheckColormapArg (char *s)
|
|
|
|
{
|
|
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
|
|
|
|
if (strcmp (s, COLORMAP_NEXT) == 0 ||
|
|
|
|
strcmp (s, COLORMAP_PREV) == 0 ||
|
|
|
|
strcmp (s, COLORMAP_DEFAULT) == 0)
|
|
|
|
return True;
|
|
|
|
|
|
|
|
return False;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
twmrc_error_prefix (void)
|
|
|
|
{
|
|
|
|
fprintf (stderr, "%s: line %d: ", ProgramName, yylineno);
|
|
|
|
}
|