v01i049: twm: Tom's Window Manager, Part04/07
Mike Wexler
mikew at wyse.wyse.com
Fri Sep 23 09:27:22 AEST 1988
Submitted-by: toml%hpfctel at sde.hp.com (Tom LaStrange)
Posting-number: Volume 1, Issue 49
Archive-name: twm/part04
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 4 (of 7)."
# Contents: gram.c twm.c
# Wrapped by mikew at wyse on Thu Sep 22 16:21:23 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'gram.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'gram.c'\"
else
echo shar: Extracting \"'gram.c'\" \(21407 characters\)
sed "s/^X//" >'gram.c' <<'END_OF_FILE'
X
X# line 37 "gram.y"
Xstatic char RCSinfo[]=
X"$Header: gram.y,v 1.32 88/09/08 15:33:52 toml Exp $";
X
X#include <stdio.h>
X#include "twm.h"
X#include "menus.h"
X#include "list.h"
X#include "util.h"
X
Xstatic char *Action = "";
Xstatic MenuRoot *root,
X *pull = NULL;
X
X
XMenuRoot *GetRoot();
X
Xstatic char *ptr;
Xstatic int Button;
Xstatic int list;
Xstatic int mods = 0, cont = 0;
Xstatic int color;
X
Xextern int yylineno;
X
X# line 62 "gram.y"
Xtypedef union
X{
X int num;
X char *ptr;
X} YYSTYPE;
X# define LB 257
X# define RB 258
X# define MENUS 259
X# define MENU 260
X# define BUTTON 261
X# define TBUTTON 262
X# define DEFAULT_FUNCTION 263
X# define F_MENU 264
X# define F_UNFOCUS 265
X# define F_REFRESH 266
X# define F_FILE 267
X# define F_TWMRC 268
X# define F_CIRCLEUP 269
X# define F_QUIT 270
X# define F_NOP 271
X# define F_TITLE 272
X# define F_VERSION 273
X# define F_EXEC 274
X# define F_CUT 275
X# define F_CIRCLEDOWN 276
X# define F_SOURCE 277
X# define F_CUTFILE 278
X# define F_MOVE 279
X# define F_ICONIFY 280
X# define F_FOCUS 281
X# define F_RESIZE 282
X# define F_RAISE 283
X# define F_LOWER 284
X# define F_DESTROY 285
X# define F_WINREFRESH 286
X# define F_BEEP 287
X# define DONT_MOVE_OFF 288
X# define ZOOM 289
X# define WARPCURSOR 290
X# define NUMBER 291
X# define BORDERWIDTH 292
X# define TITLE_FONT 293
X# define REVERSE_VIDEO 294
X# define RESIZE_FONT 295
X# define NO_TITLE 296
X# define AUTO_RAISE 297
X# define FORCE_ICON 298
X# define NO_HILITE 299
X# define MENU_FONT 300
X# define ICON_FONT 301
X# define UNKNOWN_ICON 302
X# define ICONS 303
X# define ICON_DIRECTORY 304
X# define META 305
X# define SHIFT 306
X# define CONTROL 307
X# define WINDOW 308
X# define TITLE 309
X# define ICON 310
X# define ROOT 311
X# define FRAME 312
X# define COLON 313
X# define EQUALS 314
X# define BORDER_COLOR 315
X# define TITLE_FOREGROUND 316
X# define TITLE_BACKGROUND 317
X# define MENU_FOREGROUND 318
X# define MENU_BACKGROUND 319
X# define MENU_SHADOW_COLOR 320
X# define MENU_TITLE_FOREGROUND 321
X# define MENU_TITLE_BACKGROUND 322
X# define ICON_FOREGROUND 323
X# define ICON_BACKGROUND 324
X# define ICON_BORDER_COLOR 325
X# define NO_RAISE_ON_MOVE 326
X# define NO_RAISE_ON_DEICONIFY 327
X# define NO_RAISE_ON_RESIZE 328
X# define COLOR 329
X# define MONOCHROME 330
X# define NO_TITLE_FOCUS 331
X# define FUNCTION 332
X# define F_FUNCTION 333
X# define BORDER_TILE_FOREGROUND 334
X# define BORDER_TILE_BACKGROUND 335
X# define STRING 336
X#define yyclearin yychar = -1
X#define yyerrok yyerrflag = 0
Xextern int yychar;
Xextern short yyerrflag;
X#ifndef YYMAXDEPTH
X#define YYMAXDEPTH 150
X#endif
XYYSTYPE yylval, yyval;
X# define YYERRCODE 256
X
X# line 381 "gram.y"
X
Xyyerror(s) char *s;
X{
X fprintf(stderr, "twm: syntax error, line %d\n", yylineno);
X ParseError = 1;
X}
XRemoveDQuote(str)
Xchar *str;
X{
X strcpy(str, &str[1]);
X str[strlen(str)-1] = '\0';
X}
X
XMenuRoot *
XGetRoot(name)
Xchar *name;
X{
X MenuRoot *tmp;
X
X tmp = FindMenuRoot(name);
X if (tmp == NULL)
X tmp = NewMenuRoot(name);
X
X return tmp;
X}
X
Xshort yyexca[] ={
X-1, 1,
X 0, -1,
X -2, 0,
X-1, 24,
X 257, 26,
X -2, 28,
X };
X# define YYNPROD 116
X# define YYLAST 346
Xshort yyact[]={
X
X 4, 128, 34, 72, 27, 33, 35, 32, 115, 116,
X 117, 118, 119, 104, 105, 106, 143, 43, 111, 109,
X 100, 102, 98, 92, 145, 123, 99, 144, 125, 120,
X 46, 148, 17, 18, 13, 91, 19, 10, 6, 8,
X 25, 26, 5, 24, 9, 7, 11, 29, 12, 124,
X 126, 112, 121, 73, 107, 129, 113, 103, 130, 133,
X 134, 135, 136, 139, 137, 138, 140, 141, 142, 114,
X 14, 16, 15, 30, 31, 20, 28, 131, 132, 90,
X 34, 67, 56, 51, 68, 61, 64, 49, 47, 63,
X 62, 69, 70, 65, 53, 66, 54, 55, 50, 57,
X 58, 59, 60, 52, 48, 34, 34, 34, 45, 101,
X 82, 81, 93, 94, 97, 80, 110, 96, 108, 95,
X 77, 76, 75, 3, 2, 1, 23, 42, 21, 0,
X 0, 72, 74, 0, 0, 0, 0, 0, 0, 0,
X 0, 83, 0, 0, 0, 0, 0, 0, 147, 0,
X 71, 0, 0, 34, 67, 56, 51, 68, 61, 64,
X 49, 47, 63, 62, 69, 70, 65, 53, 66, 54,
X 55, 50, 57, 58, 59, 60, 52, 48, 67, 56,
X 51, 68, 61, 64, 49, 47, 63, 62, 69, 70,
X 65, 53, 66, 54, 55, 50, 57, 58, 59, 60,
X 52, 48, 22, 0, 0, 0, 0, 0, 0, 0,
X 36, 37, 38, 39, 40, 41, 0, 0, 0, 0,
X 0, 0, 0, 71, 44, 0, 0, 0, 0, 0,
X 78, 79, 0, 149, 0, 0, 0, 0, 0, 0,
X 0, 0, 0, 0, 0, 0, 0, 71, 0, 0,
X 0, 0, 164, 0, 0, 165, 84, 0, 0, 0,
X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X 85, 86, 87, 88, 89, 0, 0, 0, 0, 0,
X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X 122, 0, 0, 0, 0, 127, 0, 0, 0, 0,
X 0, 0, 0, 0, 0, 0, 146, 0, 0, 0,
X 150, 0, 0, 151, 152, 153, 154, 155, 156, 157,
X 158, 159, 160, 161, 162, 163 };
Xshort yypact[]={
X
X-1000,-1000,-256,-1000,-1000,-1000,-1000,-334,-334,-334,
X-334,-334,-334,-1000,-1000,-1000,-1000,-1000,-1000,-274,
X-1000,-183,-311, -86,-1000,-1000,-1000,-334,-334,-1000,
X-1000,-1000, -86,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
X-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
X-1000,-1000,-1000,-334,-1000,-1000,-1000,-1000,-1000,-1000,
X-1000,-1000,-1000,-1000,-1000,-1000,-1000,-334,-334,-334,
X-334,-334,-1000,-1000,-1000,-234,-234,-234,-1000,-1000,
X-235,-237,-237,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
X-292,-1000,-1000,-1000,-1000,-238,-239,-1000,-1000,-1000,
X-1000,-1000,-300,-1000,-1000,-1000,-1000,-229,-1000,-1000,
X-1000,-1000,-230,-257,-297,-1000,-1000,-1000,-1000,-1000,
X-1000,-1000,-1000,-231,-110,-1000,-1000,-334,-1000,-1000,
X-334,-334,-334,-334,-334,-334,-334,-334,-334,-334,
X-334,-334,-334, -86,-1000,-1000, -86,-1000,-1000,-1000,
X-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
X-1000,-1000,-1000,-1000,-1000,-1000 };
Xshort yypgo[]={
X
X 0, 202, 108, 128, 127, 126, 30, 125, 124, 123,
X 122, 35, 121, 120, 119, 118, 117, 116, 115, 114,
X 111, 26, 110, 79, 69, 57, 56, 55, 54, 52,
X 51, 50, 49, 31, 25, 24 };
Xshort yyr1[]={
X
X 0, 7, 8, 8, 9, 9, 9, 9, 9, 9,
X 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
X 9, 9, 9, 9, 9, 9, 10, 9, 9, 12,
X 9, 13, 9, 14, 9, 16, 9, 18, 9, 20,
X 9, 22, 9, 9, 6, 23, 23, 25, 25, 25,
X 24, 24, 24, 24, 24, 21, 26, 26, 27, 27,
X 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
X 27, 11, 28, 28, 29, 19, 30, 30, 31, 17,
X 32, 32, 33, 15, 34, 34, 35, 2, 2, 2,
X 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
X 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
X 2, 2, 3, 5, 1, 4 };
Xshort yyr2[]={
X
X 0, 1, 0, 2, 1, 1, 1, 2, 2, 2,
X 2, 2, 2, 1, 1, 1, 1, 1, 1, 2,
X 1, 2, 2, 2, 2, 2, 0, 3, 1, 0,
X 3, 0, 3, 0, 4, 0, 4, 0, 3, 0,
X 3, 0, 3, 2, 6, 0, 2, 1, 1, 1,
X 1, 1, 1, 1, 1, 3, 0, 2, 2, 2,
X 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
X 2, 3, 0, 2, 1, 3, 0, 2, 2, 3,
X 0, 2, 1, 3, 0, 2, 2, 1, 1, 1,
X 1, 1, 1, 2, 1, 1, 1, 1, 1, 1,
X 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
X 2, 2, 1, 1, 1, 1 };
Xshort yychk[]={
X
X-1000, -7, -8, -9, 256, 298, 294, 301, 295, 300,
X 293, 302, 304, 290, 326, 328, 327, 288, 289, 292,
X 331, -3, -1, -5, 299, 296, 297, 260, 332, 303,
X 329, 330, 263, 261, 336, 262, -1, -1, -1, -1,
X -1, -1, -4, 291, -1, -2, -6, 271, 287, 270,
X 281, 266, 286, 277, 279, 280, 265, 282, 283, 284,
X 285, 268, 273, 272, 269, 276, 278, 264, 267, 274,
X 275, 333, 314, -6, -2, -10, -12, -13, -1, -1,
X -18, -20, -22, -2, -1, -1, -1, -1, -1, -1,
X -23, -11, 257, -11, -11, -14, -16, -19, 257, -21,
X 257, -21, 313, -25, 305, 306, 307, -28, -15, 257,
X -17, 257, -30, -26, -24, 308, 309, 310, 311, 312,
X 258, -29, -1, -34, -32, 258, -31, -1, 258, -27,
X 315, 334, 335, 316, 317, 318, 319, 321, 322, 320,
X 323, 324, 325, 313, 258, -35, -1, 258, -33, -2,
X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
X -1, -1, -1, -1, -2, -2 };
Xshort yydef[]={
X
X 2, -2, 1, 3, 4, 5, 6, 0, 0, 0,
X 0, 0, 0, 13, 14, 15, 16, 17, 18, 0,
X 20, 0, 0, 0, -2, 29, 31, 0, 0, 37,
X 39, 41, 0, 112, 114, 113, 7, 8, 9, 10,
X 11, 12, 19, 115, 21, 22, 24, 87, 88, 89,
X 90, 91, 92, 0, 94, 95, 96, 97, 98, 99,
X 100, 101, 102, 103, 104, 105, 106, 0, 0, 0,
X 0, 0, 45, 23, 25, 0, 0, 0, 33, 35,
X 0, 0, 0, 43, 93, 107, 108, 109, 110, 111,
X 0, 27, 72, 30, 32, 0, 0, 38, 76, 40,
X 56, 42, 0, 46, 47, 48, 49, 0, 34, 84,
X 36, 80, 0, 0, 0, 50, 51, 52, 53, 54,
X 71, 73, 74, 0, 0, 75, 77, 0, 55, 57,
X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X 0, 0, 0, 0, 83, 85, 0, 79, 81, 82,
X 78, 58, 59, 60, 61, 62, 63, 64, 65, 66,
X 67, 68, 69, 70, 44, 86 };
X#ifndef lint
Xstatic char yaccpar_sccsid[] = "@(#)yaccpar 1.6 88/02/08 SMI"; /* from UCB 4.1 83/02/11 */
X#endif
X
X#
X# define YYFLAG -1000
X# define YYERROR goto yyerrlab
X# define YYACCEPT return(0)
X# define YYABORT return(1)
X
X/* parser for yacc output */
X
X#ifdef YYDEBUG
Xint yydebug = 0; /* 1 for debugging */
X#endif
XYYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
Xint yychar = -1; /* current input token number */
Xint yynerrs = 0; /* number of errors */
Xshort yyerrflag = 0; /* error recovery flag */
X
Xyyparse() {
X
X short yys[YYMAXDEPTH];
X short yyj, yym;
X register YYSTYPE *yypvt;
X register short yystate, *yyps, yyn;
X register YYSTYPE *yypv;
X register short *yyxi;
X
X yystate = 0;
X yychar = -1;
X yynerrs = 0;
X yyerrflag = 0;
X yyps= &yys[-1];
X yypv= &yyv[-1];
X
X yystack: /* put a state and value onto the stack */
X
X#ifdef YYDEBUG
X if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
X#endif
X if( ++yyps>= &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
X *yyps = yystate;
X ++yypv;
X *yypv = yyval;
X
X yynewstate:
X
X yyn = yypact[yystate];
X
X if( yyn<= YYFLAG ) goto yydefault; /* simple state */
X
X if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
X if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
X
X if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
X yychar = -1;
X yyval = yylval;
X yystate = yyn;
X if( yyerrflag > 0 ) --yyerrflag;
X goto yystack;
X }
X
X yydefault:
X /* default state action */
X
X if( (yyn=yydef[yystate]) == -2 ) {
X if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
X /* look through exception table */
X
X for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
X
X while( *(yyxi+=2) >= 0 ){
X if( *yyxi == yychar ) break;
X }
X if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
X }
X
X if( yyn == 0 ){ /* error */
X /* error ... attempt to resume parsing */
X
X switch( yyerrflag ){
X
X case 0: /* brand new error */
X
X yyerror( "syntax error" );
X yyerrlab:
X ++yynerrs;
X
X case 1:
X case 2: /* incompletely recovered error ... try again */
X
X yyerrflag = 3;
X
X /* find a state where "error" is a legal shift action */
X
X while ( yyps >= yys ) {
X yyn = yypact[*yyps] + YYERRCODE;
X if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
X yystate = yyact[yyn]; /* simulate a shift of "error" */
X goto yystack;
X }
X yyn = yypact[*yyps];
X
X /* the current yyps has no shift onn "error", pop stack */
X
X#ifdef YYDEBUG
X if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
X#endif
X --yyps;
X --yypv;
X }
X
X /* there is no state on the stack with an error shift ... abort */
X
X yyabort:
X return(1);
X
X
X case 3: /* no shift yet; clobber input char */
X
X#ifdef YYDEBUG
X if( yydebug ) printf( "error recovery discards char %d\n", yychar );
X#endif
X
X if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
X yychar = -1;
X goto yynewstate; /* try again in the same state */
X
X }
X
X }
X
X /* reduction by production yyn */
X
X#ifdef YYDEBUG
X if( yydebug ) printf("reduce %d\n",yyn);
X#endif
X yyps -= yyr2[yyn];
X yypvt = yypv;
X yypv -= yyr2[yyn];
X yyval = yypv[1];
X yym=yyn;
X /* consult goto table to find next state */
X yyn = yyr1[yyn];
X yyj = yypgo[yyn] + *yyps + 1;
X if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
X switch(yym){
X
Xcase 5:
X# line 100 "gram.y"
X{ if (FirstTime) ForceIcon = TRUE; } break;
Xcase 6:
X# line 101 "gram.y"
X{ if (FirstTime) ReverseVideo = TRUE; } break;
Xcase 7:
X# line 102 "gram.y"
X{ if (FirstTime) IconFontName = yypvt[-0].ptr; } break;
Xcase 8:
X# line 103 "gram.y"
X{ if (FirstTime) SizeFontName = yypvt[-0].ptr; } break;
Xcase 9:
X# line 104 "gram.y"
X{ if (FirstTime) MenuFontName = yypvt[-0].ptr; } break;
Xcase 10:
X# line 105 "gram.y"
X{ if (FirstTime) TitleBarFontName=yypvt[-0].ptr; } break;
Xcase 11:
X# line 106 "gram.y"
X{ if (FirstTime) GetUnknownIcon(yypvt[-0].ptr); } break;
Xcase 12:
X# line 107 "gram.y"
X{ if (FirstTime)
X IconDirectory = ExpandFilename(yypvt[-0].ptr);
X } break;
Xcase 13:
X# line 110 "gram.y"
X{ if (FirstTime) WarpCursor = TRUE; } break;
Xcase 14:
X# line 111 "gram.y"
X{ if (FirstTime) NoRaiseMove = TRUE; } break;
Xcase 15:
X# line 112 "gram.y"
X{ if (FirstTime) NoRaiseResize = TRUE; } break;
Xcase 16:
X# line 113 "gram.y"
X{ if (FirstTime) NoRaiseDeicon = TRUE; } break;
Xcase 17:
X# line 114 "gram.y"
X{ if (FirstTime) DontMoveOff = TRUE; } break;
Xcase 18:
X# line 115 "gram.y"
X{ if (FirstTime) DoZoom = TRUE; } break;
Xcase 19:
X# line 116 "gram.y"
X{ if (FirstTime) BorderWidth = yypvt[-0].num; } break;
Xcase 20:
X# line 117 "gram.y"
X{ if (FirstTime) TitleFocus = FALSE; } break;
Xcase 21:
X# line 118 "gram.y"
X{ root = GetRoot(yypvt[-0].ptr);
X Mouse[yypvt[-1].num][C_ROOT][0].func = F_MENU;
X Mouse[yypvt[-1].num][C_ROOT][0].menu = root;
X } break;
Xcase 22:
X# line 122 "gram.y"
X{ Mouse[yypvt[-1].num][C_ROOT][0].func = yypvt[-0].num;
X if (yypvt[-0].num == F_MENU)
X {
X pull->prev = NULL;
X Mouse[yypvt[-1].num][C_ROOT][0].menu = pull;
X }
X else
X {
X root = GetRoot(TWM_ROOT);
X Mouse[yypvt[-1].num][C_ROOT][0].item =
X AddToMenu(root,"x",Action,0,yypvt[-0].num);
X }
X Action = "";
X pull = NULL;
X } break;
Xcase 23:
X# line 137 "gram.y"
X{ AddFuncKey(yypvt[-1].ptr, cont, mods,
X yypvt[-0].num, Action);
X Action = "";
X pull = NULL;
X cont = 0;
X mods = 0;
X } break;
Xcase 24:
X# line 144 "gram.y"
X{ Mouse[yypvt[-1].num][cont][mods].func = yypvt[-0].num;
X if (yypvt[-0].num == F_MENU)
X {
X pull->prev = NULL;
X Mouse[yypvt[-1].num][cont][mods].menu = pull;
X }
X else
X {
X root = GetRoot(TWM_ROOT);
X Mouse[yypvt[-1].num][cont][mods].item =
X AddToMenu(root,"x",Action,0,yypvt[-0].num);
X }
X Action = "";
X pull = NULL;
X cont = 0;
X mods = 0;
X } break;
Xcase 25:
X# line 161 "gram.y"
X{ Mouse[yypvt[-1].num][C_TITLE][0].func = yypvt[-0].num;
X Mouse[yypvt[-1].num][C_ICON][0].func = yypvt[-0].num;
X if (yypvt[-0].num == F_MENU)
X {
X pull->prev = NULL;
X Mouse[yypvt[-1].num][C_TITLE][0].menu = pull;
X Mouse[yypvt[-1].num][C_ICON][0].menu = pull;
X }
X else
X {
X root = GetRoot(TWM_ROOT);
X Mouse[yypvt[-1].num][C_TITLE][0].item =
X AddToMenu(root,"x",Action,0,yypvt[-0].num);
X Mouse[yypvt[-1].num][C_ICON][0].item =
X Mouse[yypvt[-1].num][C_TITLE][0].item;
X }
X Action = "";
X pull = NULL;
X } break;
Xcase 26:
X# line 180 "gram.y"
X{ list = NO_HILITE; } break;
Xcase 28:
X# line 182 "gram.y"
X{ Highlight = FALSE; } break;
Xcase 29:
X# line 183 "gram.y"
X{ list = NO_TITLE; } break;
Xcase 31:
X# line 185 "gram.y"
X{ list = AUTO_RAISE; } break;
Xcase 33:
X# line 187 "gram.y"
X{ root = GetRoot(yypvt[-0].ptr); } break;
Xcase 35:
X# line 189 "gram.y"
X{ root = GetRoot(yypvt[-0].ptr); } break;
Xcase 37:
X# line 191 "gram.y"
X{ list = ICONS; } break;
Xcase 39:
X# line 193 "gram.y"
X{ color = COLOR; } break;
Xcase 41:
X# line 195 "gram.y"
X{ color = MONOCHROME; } break;
Xcase 43:
X# line 197 "gram.y"
X{ DefaultFunction.func = yypvt[-0].num;
X if (yypvt[-0].num == F_MENU)
X {
X pull->prev = NULL;
X DefaultFunction.menu = pull;
X }
X else
X {
X root = GetRoot(TWM_ROOT);
X DefaultFunction.item =
X AddToMenu(root,"x",Action,0,yypvt[-0].num);
X }
X Action = "";
X pull = NULL;
X } break;
Xcase 44:
X# line 215 "gram.y"
X{ yyval.num = yypvt[-0].num; } break;
Xcase 47:
X# line 222 "gram.y"
X{ mods |= Mod1Mask; } break;
Xcase 48:
X# line 223 "gram.y"
X{ mods |= ShiftMask; } break;
Xcase 49:
X# line 224 "gram.y"
X{ mods |= ControlMask; } break;
Xcase 50:
X# line 227 "gram.y"
X{ cont = C_WINDOW; } break;
Xcase 51:
X# line 228 "gram.y"
X{ cont = C_TITLE; } break;
Xcase 52:
X# line 229 "gram.y"
X{ cont = C_ICON; } break;
Xcase 53:
X# line 230 "gram.y"
X{ cont = C_ROOT; } break;
Xcase 54:
X# line 231 "gram.y"
X{ cont = C_FRAME; } break;
Xcase 58:
X# line 241 "gram.y"
X{ GetColor(color, &BorderColor, yypvt[-0].ptr); } break;
Xcase 59:
X# line 242 "gram.y"
X{ GetColor(color,
X &BorderTileForeground, yypvt[-0].ptr); } break;
Xcase 60:
X# line 244 "gram.y"
X{ GetColor(color,
X &BorderTileBackground, yypvt[-0].ptr); } break;
Xcase 61:
X# line 246 "gram.y"
X{ GetColor(color,
X &TitleForeground, yypvt[-0].ptr); } break;
Xcase 62:
X# line 248 "gram.y"
X{ GetColor(color,
X &TitleBackground, yypvt[-0].ptr); } break;
Xcase 63:
X# line 250 "gram.y"
X{ GetColor(color,
X &MenuForeground, yypvt[-0].ptr); } break;
Xcase 64:
X# line 252 "gram.y"
X{ GetColor(color,
X &MenuBackground, yypvt[-0].ptr); } break;
Xcase 65:
X# line 254 "gram.y"
X{ GetColor(color,
X &MenuTitleForeground, yypvt[-0].ptr); } break;
Xcase 66:
X# line 256 "gram.y"
X{ GetColor(color,
X &MenuTitleBackground, yypvt[-0].ptr); } break;
Xcase 67:
X# line 258 "gram.y"
X{ GetColor(color,
X &MenuShadowColor, yypvt[-0].ptr); } break;
Xcase 68:
X# line 260 "gram.y"
X{ GetColor(color,
X &IconForeground, yypvt[-0].ptr); } break;
Xcase 69:
X# line 262 "gram.y"
X{ GetColor(color,
X &IconBackground, yypvt[-0].ptr); } break;
Xcase 70:
X# line 264 "gram.y"
X{ GetColor(color,
X &IconBorderColor, yypvt[-0].ptr); } break;
Xcase 74:
X# line 274 "gram.y"
X{ if (FirstTime) AddToList(list, yypvt[-0].ptr, 0); } break;
Xcase 78:
X# line 284 "gram.y"
X{ if (FirstTime)
X {
X Pixmap pm;
X
X pm = GetBitmap(yypvt[-0].ptr);
X if (pm != NULL)
X AddToList(list, yypvt[-1].ptr, pm);
X }
X } break;
Xcase 82:
X# line 302 "gram.y"
X{ AddToMenu(root, "", Action, NULL, yypvt[-0].num);
X Action = "";
X } break;
Xcase 86:
X# line 314 "gram.y"
X{ AddToMenu(root, yypvt[-1].ptr, Action, pull, yypvt[-0].num);
X Action = "";
X pull = NULL;
X } break;
Xcase 87:
X# line 320 "gram.y"
X{ yyval.num = F_NOP; } break;
Xcase 88:
X# line 321 "gram.y"
X{ yyval.num = F_BEEP; } break;
Xcase 89:
X# line 322 "gram.y"
X{ yyval.num = F_QUIT; } break;
Xcase 90:
X# line 323 "gram.y"
X{ yyval.num = F_FOCUS; } break;
Xcase 91:
X# line 324 "gram.y"
X{ yyval.num = F_REFRESH; } break;
Xcase 92:
X# line 325 "gram.y"
X{ yyval.num = F_WINREFRESH; } break;
Xcase 93:
X# line 326 "gram.y"
X{ Action = yypvt[-0].ptr; yyval.num = F_TWMRC; } break;
Xcase 94:
X# line 327 "gram.y"
X{ yyval.num = F_MOVE; } break;
Xcase 95:
X# line 328 "gram.y"
X{ yyval.num = F_ICONIFY; } break;
Xcase 96:
X# line 329 "gram.y"
X{ yyval.num = F_UNFOCUS; } break;
Xcase 97:
X# line 330 "gram.y"
X{ yyval.num = F_RESIZE; } break;
Xcase 98:
X# line 331 "gram.y"
X{ yyval.num = F_RAISE; } break;
Xcase 99:
X# line 332 "gram.y"
X{ yyval.num = F_LOWER; } break;
Xcase 100:
X# line 333 "gram.y"
X{ yyval.num = F_DESTROY; } break;
Xcase 101:
X# line 334 "gram.y"
X{ yyval.num = F_TWMRC; } break;
Xcase 102:
X# line 335 "gram.y"
X{ yyval.num = F_VERSION; } break;
Xcase 103:
X# line 336 "gram.y"
X{ yyval.num = F_TITLE; } break;
Xcase 104:
X# line 337 "gram.y"
X{ yyval.num = F_CIRCLEUP; } break;
Xcase 105:
X# line 338 "gram.y"
X{ yyval.num = F_CIRCLEDOWN; } break;
Xcase 106:
X# line 339 "gram.y"
X{ yyval.num = F_CUTFILE; } break;
Xcase 107:
X# line 340 "gram.y"
X{ pull = GetRoot(yypvt[-0].ptr);
X pull->prev = root;
X yyval.num = F_MENU;
X } break;
Xcase 108:
X# line 344 "gram.y"
X{ Action = yypvt[-0].ptr; yyval.num = F_FILE; } break;
Xcase 109:
X# line 345 "gram.y"
X{ Action = yypvt[-0].ptr; yyval.num = F_EXEC; } break;
Xcase 110:
X# line 346 "gram.y"
X{ Action = yypvt[-0].ptr; yyval.num = F_CUT; } break;
Xcase 111:
X# line 347 "gram.y"
X{ Action = yypvt[-0].ptr; yyval.num = F_FUNCTION; } break;
Xcase 112:
X# line 350 "gram.y"
X{ yyval.num = yypvt[-0].num;
X if (yypvt[-0].num == 0)
X yyerror();
X
X if (yypvt[-0].num > MAX_BUTTONS)
X {
X yyval.num = 0;
X yyerror();
X }
X } break;
Xcase 113:
X# line 361 "gram.y"
X{ yyval.num = yypvt[-0].num;
X if (yypvt[-0].num == 0)
X yyerror();
X
X if (yypvt[-0].num > MAX_BUTTONS)
X {
X yyval.num = 0;
X yyerror();
X }
X } break;
Xcase 114:
X# line 373 "gram.y"
X{ ptr = (char *)malloc(strlen(yypvt[-0].ptr)+1);
X strcpy(ptr, yypvt[-0].ptr);
X RemoveDQuote(ptr);
X yyval.ptr = ptr;
X } break;
Xcase 115:
X# line 378 "gram.y"
X{ yyval.num = yypvt[-0].num; } break;
X }
X goto yystack; /* stack new state and value */
X
X }
END_OF_FILE
if test 21407 -ne `wc -c <'gram.c'`; then
echo shar: \"'gram.c'\" unpacked with wrong size!
fi
# end of 'gram.c'
fi
if test -f 'twm.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'twm.c'\"
else
echo shar: Extracting \"'twm.c'\" \(16649 characters\)
sed "s/^X//" >'twm.c' <<'END_OF_FILE'
X/*****************************************************************************/
X/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/
X/** Salt Lake City, Utah **/
X/** **/
X/** All Rights Reserved **/
X/** **/
X/** Permission to use, copy, modify, and distribute this software and **/
X/** its documentation for any purpose and without fee is hereby **/
X/** granted, provided that the above copyright notice appear in all **/
X/** copies and that both that copyright notice and this permis- **/
X/** sion notice appear in supporting documentation, and that the **/
X/** name of Evans & Sutherland not be used in advertising or publi- **/
X/** city pertaining to distribution of the software without specif- **/
X/** ic, written prior permission. **/
X/** **/
X/** EVANS & SUTHERLAND DISCLAIMS ALL WARRANTIES WITH REGARD TO **/
X/** THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILI- **/
X/** TY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND BE LIABLE **/
X/** FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAM- **/
X/** AGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, **/
X/** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS **/
X/** ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PER- **/
X/** FORMANCE OF THIS SOFTWARE. **/
X/*****************************************************************************/
X
X/***********************************************************************
X *
X * $Header: twm.c,v 1.50 88/09/08 15:33:28 toml Exp $
X *
X * twm - "Tom's Window Manager"
X *
X * 27-Oct-87 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
X#ifndef lint
Xstatic char RCSinfo[] =
X"$Header: twm.c,v 1.50 88/09/08 15:33:28 toml Exp $";
X#endif
X
X#include <stdio.h>
X#include <signal.h>
X#include <fcntl.h>
X#include "twm.h"
X#include "add_window.h"
X#include "gc.h"
X#include "parse.h"
X#include "version.h"
X#include "menus.h"
X#include "events.h"
X#include "util.h"
X#include "gram.h"
X
X#include "twm.bm"
X#include "gray.bm"
X
XTwmWindow TwmRoot; /* the head of the twm window list */
X
XDisplay *dpy; /* which display are we talking to */
Xint screen; /* the default screen */
Xint d_depth; /* copy of DefaultDepth(dpy, screen) */
XVisual *d_visual; /* copy of DefaultVisual(dpy, screen) */
X
XWindow Root; /* the root window */
XWindow VersionWindow; /* the twm version window */
XWindow SizeWindow; /* the resize dimensions window */
XWindow ResizeWindow; /* the window we are resizing */
XWindow InitialWindow; /* the window name we are creating */
XColormap CMap; /* default color map */
X
XXFontStruct *TitleBarFont; /* title bar font structure */
XXFontStruct *MenuFont; /* menu font structure */
XXFontStruct *IconFont; /* icon font structure */
XXFontStruct *SizeFont; /* resize font structure */
XXFontStruct *VersionFont; /* version font structure */
XXFontStruct *InitialFont; /* window creation font structure */
X
Xchar *TitleBarFontName = "8x13";/* default title bar font */
Xchar *MenuFontName = "8x13"; /* default menu font */
Xchar *IconFontName = "8x13"; /* default icon font */
Xchar *SizeFontName = "fg-22"; /* default resize font */
Xchar *VersionFontName = "8x13"; /* default version font */
Xchar *InitialFontName = "9x15"; /* default window creation font */
Xchar *IconDirectory = NULL; /* icon directory to search */
X
Xint TitleBarFontHeight; /* height of title bar font */
Xint MenuFontHeight; /* height of menu font */
Xint IconFontHeight; /* height of icon font */
Xint SizeFontHeight; /* height of resize font */
Xint VersionFontHeight; /* height of version font */
Xint InitialFontHeight; /* height of window creation font */
X
Xint BorderColor; /* color of window borders */
Xint BorderTileForeground; /* border tile foreground */
Xint BorderTileBackground; /* border tile background */
Xint TitleForeground; /* foreground color of titlebar */
Xint TitleBackground; /* background color of titlebar */
Xint MenuForeground; /* menu foreground color */
Xint MenuBackground; /* menu background color */
Xint MenuTitleForeground; /* menu title foreground color */
Xint MenuTitleBackground; /* menu title background color */
Xint MenuShadowColor; /* menu shadow color */
Xint IconForeground; /* icon foreground color */
Xint IconBackground; /* icon background color */
Xint IconBorderColor; /* icon border color */
X
XCursor ArrowCursor; /* title bar cursor */
XCursor ButtonCursor; /* title bar button cursor */
XCursor MoveCursor; /* move and resize cursor */
XCursor ClockCursor; /* wait a while cursor */
XCursor LeftArrowCursor; /* menu cursor */
XCursor UpperLeftCursor; /* upper Left corner cursor */
XCursor DotCursor; /* dot cursor for f.move, etc. from menus */
XCursor SkullCursor; /* skull and cross bones, f.destroy */
X
XGC TitleNormalGC; /* GC for title bar */
XGC MenuNormalGC; /* normal GC for menus */
XGC MenuReverseGC; /* reverse video GC for menus */
XGC MenuXorGC; /* XOR GC for menus */
XGC MenuTitleGC; /* normal GC for menu titles */
XGC IconNormalGC; /* GC for icons */
XGC VersionNormalGC; /* GC for the version window */
XGC SizeNormalGC; /* GC for the resize window */
XGC InitialNormalGC; /* GC for the initial creation window */
XGC DrawGC; /* GC to draw lines for move and resize */
XGC BorderGC; /* GC to create the "gray" pixmap */
X
XXClassHint NoClass; /* for applications with no class */
X
XXContext TwmContext; /* context for twm windows */
XXContext MenuContext; /* context for all menu windows */
X
Xint BorderWidth = BW; /* border width of twm windows */
Xunsigned long Foreground; /* foreground color of twm windows */
Xunsigned long Background; /* background color of twm windows */
Xunsigned long Black;
Xunsigned long White;
XPixmap GrayTile;
X
Xchar Version[100]; /* place to build the version string */
XPixmap UnknownPm = NULL; /* the unknown icon pixmap */
Xint UnknownWidth = 0; /* width of the unknown icon */
Xint UnknownHeight = 0; /* height of the unknown icon */
Xint FirstTime = TRUE; /* first time we've read .twmrc */
Xint ReverseVideo = FALSE; /* flag to do reverse video */
Xint FocusRoot = TRUE; /* is the input focus on the root ? */
XTwmWindow *Focus = NULL; /* the twm window that has focus */
Xint WarpCursor = FALSE; /* warp cursor on de-iconify ? */
Xint ForceIcon = FALSE; /* force the icon to the user specified */
Xint NoRaiseMove = FALSE; /* don't raise window following move */
Xint NoRaiseResize = FALSE; /* don't raise window following resize */
Xint NoRaiseDeicon = FALSE; /* don't raise window on deiconify */
Xint DontMoveOff = FALSE; /* don't allow windows to be moved off */
Xint DoZoom = FALSE; /* zoom in and out of icons */
Xint Monochrome = COLOR; /* is the display monochrome ? */
Xint TitleFocus = TRUE; /* focus on window in title bar ? */
Xchar *Home; /* the HOME environment variable */
Xint HomeLen; /* length of Home */
Xint ParseError; /* error parsing the .twmrc file */
Xint Highlight = TRUE; /* we should highlight the window borders */
Xint MyDisplayWidth; /* my copy of DisplayWidth(dpy, screen) */
Xint MyDisplayHeight; /* my copy of DisplayHeight(dpy, screen) */
X
Xint TitleBarY; /* y coordinate to start text in the title */
Xint TitleBarX = TITLE_BAR_HEIGHT + 4; /* x coordinate ditto */
Xint MenuY; /* y coordiante for text in menus */
Xint HandlingEvents = FALSE; /* are we handling events yet? */
X
XWindow JunkRoot; /* junk window */
XWindow JunkChild; /* junk window */
Xint JunkX; /* junk variable */
Xint JunkY; /* junk variable */
Xint JunkWidth; /* junk variable */
Xint JunkHeight; /* junk variable */
Xint JunkDepth; /* junk variable */
Xint JunkBW; /* junk variable */
Xint JunkMask; /* junk variable */
X
X/***********************************************************************
X *
X * Procedure:
X * main - start of twm
X *
X ***********************************************************************
X */
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X Window root, parent, *children;
X int nchildren, i;
X int m, d, y;
X char *display_name;
X unsigned long valuemask; /* mask for create windows */
X XSetWindowAttributes attributes; /* attributes for create windows */
X int (*old_handler) ();
X
X display_name = NULL;
X
X if (argc != 1 && argc != 3)
X {
X fprintf(stderr, "Usage: twm [-display display]\n");
X exit(1);
X }
X
X if (argc == 3)
X {
X if (strncmp(argv[1], "-d", 2) == 0)
X display_name = argv[2];
X else
X {
X fprintf(stderr, "Usage: twm [-display display]\n");
X exit(1);
X }
X }
X
X old_handler = signal(SIGINT, SIG_IGN);
X if (old_handler != SIG_IGN)
X signal(SIGINT, Done);
X
X old_handler = signal(SIGHUP, SIG_IGN);
X if (old_handler != SIG_IGN)
X signal(SIGHUP, Done);
X
X signal(SIGQUIT, Done);
X signal(SIGTERM, Done);
X
X Home = (char *)getenv("HOME");
X if (Home == NULL)
X Home = "./";
X
X HomeLen = strlen(Home);
X
X NoClass.res_name = NoName;
X NoClass.res_class = NoName;
X
X TwmRoot.next = NULL;
X TwmRoot.prev = NULL;
X TwmRoot.w = NULL;
X TwmRoot.title_w = NULL;
X TwmRoot.iconify_w = NULL;
X TwmRoot.resize_w = NULL;
X
X if ((dpy = XOpenDisplay(display_name)) == NULL)
X {
X fprintf(stderr, "twm: can't open the display\n");
X exit(1);
X }
X
X
X if (fcntl(ConnectionNumber(dpy), F_SETFD, 1) == -1)
X {
X fprintf(stderr, "twm: child cannot disinherit TCP fd\n");
X exit(1);
X }
X
X screen = DefaultScreen(dpy);
X d_depth = DefaultDepth(dpy, screen);
X d_visual = DefaultVisual(dpy, screen);
X Root = RootWindow(dpy, screen);
X CMap = DefaultColormap(dpy, screen);
X MyDisplayWidth = DisplayWidth(dpy, screen);
X MyDisplayHeight = DisplayHeight(dpy, screen);
X
X XSetErrorHandler(Other);
X XSelectInput(dpy, Root,
X SubstructureRedirectMask | KeyPressMask |
X ButtonPressMask | ButtonReleaseMask | ExposureMask);
X XSync(dpy, screen);
X
X XSetErrorHandler(Error);
X XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
X
X TwmContext = XUniqueContext();
X MenuContext = XUniqueContext();
X
X /* define cursors */
X
X ArrowCursor = XCreateFontCursor(dpy, XC_top_left_arrow);
X MoveCursor = XCreateFontCursor(dpy, XC_fleur);
X LeftArrowCursor = XCreateFontCursor(dpy, XC_sb_left_arrow);
X ButtonCursor = XCreateFontCursor(dpy, XC_center_ptr);
X ClockCursor = XCreateFontCursor(dpy, XC_watch);
X UpperLeftCursor = XCreateFontCursor(dpy, XC_top_left_corner);
X DotCursor = XCreateFontCursor(dpy, XC_dot);
X SkullCursor = XCreateFontCursor(dpy, XC_pirate);
X
X XGrabServer(dpy);
X XSync(dpy, screen);
X XQueryTree(dpy, Root, &root, &parent, &children, &nchildren);
X
X /* setup default colors */
X
X Black = BlackPixel(dpy, screen);
X White = WhitePixel(dpy, screen);
X
X BorderColor = Black;
X BorderTileForeground = Black;
X BorderTileBackground = White;
X TitleForeground = Black;
X TitleBackground = White;
X MenuForeground = Black;
X MenuBackground = White;
X MenuTitleForeground = Black;
X MenuTitleBackground = White;
X MenuShadowColor = Black;
X IconForeground = Black;
X IconBackground = White;
X IconBorderColor = Black;
X
X if (DisplayCells(dpy, screen) < 3)
X Monochrome = MONOCHROME;
X
X ParseTwmrc(NULL);
X FirstTime = FALSE;
X CreateGCs();
X
X GrayTile = MakePixmap(Root, BorderGC, gray_bits,
X gray_width, gray_height);
X
X for (i = 0; i < nchildren; i++)
X {
X if (MappedNotOverride(children[i]))
X {
X AddWindow(children[i]);
X }
X }
X
X InitialWindow = XCreateSimpleWindow(dpy, Root,
X 0, 0, 5, InitialFontHeight + 4, BW, Foreground, Background);
X
X /* contruct the version string */
X sprintf(Version, "%s", &Revision[1]);
X Version[strlen(Version) - 1] = '\0';
X sscanf(&Date[7], "%d/%d/%d", &y, &m, &d);
X sprintf(Version, "%s Date: %d/%d/%d %s", Version, m, d, y, &Date[16]);
X Version[strlen(Version) - 2] = '\0';
X
X VersionWindow = XCreateSimpleWindow(dpy, Root,
X 0, 0,
X twm_width + XTextWidth(VersionFont, Version, strlen(Version)) + 20,
X VersionFontHeight + 4,
X BW,
X Foreground, Background);
X
X valuemask = CWBackPixmap;
X attributes.background_pixmap = MakePixmap(VersionWindow, VersionNormalGC,
X twm_bits, twm_width, twm_height);
X
X XCreateWindow(dpy, VersionWindow,
X 4, 1,
X twm_width, twm_height,
X 0, d_depth, CopyFromParent,
X d_visual, valuemask, &attributes);
X
X XSelectInput(dpy, VersionWindow, ExposureMask);
X XMapSubwindows(dpy, VersionWindow);
X XMapWindow(dpy, VersionWindow);
X
X SizeWindow = XCreateSimpleWindow(dpy, Root,
X 0, 0,
X 100,
X SizeFontHeight + 4,
X BW,
X Foreground, Background);
X
X
X XUngrabServer(dpy);
X
X HandlingEvents = TRUE;
X InitEvents();
X HandleEvents();
X}
X
X/***********************************************************************
X *
X * Procedure:
X * Done - cleanup and exit twm
X *
X * Returned Value:
X * none
X *
X * Inputs:
X * none
X *
X * Outputs:
X * none
X *
X * Special Considerations:
X * none
X *
X ***********************************************************************
X */
X
Xvoid
XDone()
X{
X TwmWindow *tmp; /* temp twm window structure */
X unsigned x, y;
X XWindowChanges xwc; /* change window structure */
X unsigned int xwcm; /* change window mask */
X
X /* put a border back around all windows */
X
X for (tmp = TwmRoot.next; tmp != NULL; tmp = tmp->next)
X {
X XGetGeometry(dpy, tmp->w, &JunkRoot, &x, &y, &JunkWidth, &JunkHeight,
X &JunkBW, &JunkDepth);
X
X xwcm = CWX | CWY | CWBorderWidth;
X
X xwc.x = x - (2 * BorderWidth);
X xwc.y = y - (2 * BorderWidth);
X xwc.border_width = BorderWidth;
X
X XConfigureWindow(dpy, tmp->w, xwcm, &xwc);
X }
X
X XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
X XCloseDisplay(dpy);
X exit(0);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * Error - X error handler. If we got here it is probably,
X * because the client window went away and we haven't
X * got the DestroyNotify yet.
X *
X * Inputs:
X * dpy - the connection to the X server
X * event - the error event structure
X *
X ***********************************************************************
X */
X
Xvoid
XError(dpy, event)
XDisplay *dpy;
XXErrorEvent *event;
X{
X TwmWindow *tmp; /* temp twm window structure */
X char buffer[BUFSIZ];
X
X /* Look for the window in the list, if it's there, remove it
X * from the list, and continue on, else ignore the error.
X * This is assumes that twm makes no errors. HaHa
X for (tmp = TwmRoot.next; tmp != NULL; tmp = tmp->next)
X {
X if (tmp->w == event->resourceid)
X {
X if (tmp == Focus)
X {
X FocusOnRoot();
X }
X XDeleteContext(dpy, tmp->w, TwmContext);
X XDeleteContext(dpy, tmp->frame, TwmContext);
X XDeleteContext(dpy, tmp->title_w, TwmContext);
X XDeleteContext(dpy, tmp->iconify_w, TwmContext);
X XDeleteContext(dpy, tmp->resize_w, TwmContext);
X XDeleteContext(dpy, tmp->icon_w, TwmContext);
X#ifndef NOFOCUS
X XDeleteContext(dpy, tmp->focus_w, TwmContext);
X#endif
X XDeleteContext(dpy, tmp->hilite_w, TwmContext);
X
X XDestroyWindow(dpy, tmp->frame);
X XDestroyWindow(dpy, tmp->icon_w);
X tmp->prev->next = tmp->next;
X if (tmp->next != NULL)
X tmp->next->prev = tmp->prev;
X
X free((char *)tmp);
X return;
X }
X }
X */
X
X return;
X
X /*
X XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
X (void) fprintf(stderr, "X Error: %s\n", buffer);
X (void) fprintf(stderr, " Request Major code: %d\n", event->request_code);
X (void) fprintf(stderr, " Request Minor code: %d\n", event->minor_code);
X (void) fprintf(stderr, " ResourceId 0x%x\n", event->resourceid);
X (void) fprintf(stderr, " Error Serial #%d\n", event->serial);
X (void) fprintf(stderr, " Current Serial #%d\n", dpy->request);
X
X Done();
X */
X}
X
X/***********************************************************************
X *
X * Procedure:
X * Other - error handler called if something else has set
X * the attributes on the root window. Typically
X * another window manager.
X *
X ***********************************************************************
X */
X
Xvoid
XOther(dpy, event)
XDisplay *dpy;
XXErrorEvent *event;
X{
X fprintf(stderr, "twm: Are you running another window manager?\n");
X exit(1);
X}
END_OF_FILE
if test 16649 -ne `wc -c <'twm.c'`; then
echo shar: \"'twm.c'\" unpacked with wrong size!
fi
# end of 'twm.c'
fi
echo shar: End of archive 4 \(of 7\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 7 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330
More information about the Comp.sources.x
mailing list