tlastran@esunix.UUCP (Tom LaStrange) (04/16/88)
Here is my window manager, "twm". I also posted it to comp.sources.unix.
That may take a week or two to get through, so I am posting it here
because I have had several requests for it.
--
Tom LaStrange
"if you don't like it, don't use it"
Evans & Sutherland Computer Corporation
UUCP Address: {ihnp4,seismo}!utah-cs!utah-gr!uplherc!esunix!tlastran
Alternate: {ihnp4,decvax}!decwrl!esunix!tlastran
---------------- cut here ------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting test in a file
# 3. Execute the file with /bin/sh (not csh) to create the files:
#
#Makefile
#README
#Sample.twmrc
#gram.y
#lex.l
#add_window.c
#gc.c
#list.c
#twm.c
#parse.c
#
# Created by tlastran (Tom LaStrange) on Fri Apr 15 07:22:56 MDT 1988
#
if test -f 'Makefile'
then
echo shar: will not over-write existing file "Makefile"
else
echo extracting "Makefile"
sed 's/^X//' >Makefile <<'SHAR_EOF'
X#**********************************************************************
X#
X# twm Makefile
X#
X#**********************************************************************
X
X.SUFFIXES: .y .o
X
X.y.o:
X yacc -d $*.y
X mv y.tab.c $*.c
X mv y.tab.h $*.h
X $(CC) -c $(CFLAGS) $*.c
X
X#
X# If you are running X11R1, then you must use the resource manager
X# library in addition to libX11.a
X#
X#LIBS= -lX11 -lXrm
XLIBS= -lX11
X
XCFLAGS= -O
XLDFLAGS=
X
XO_FILES=\
X gram.o\
X lex.o\
X add_window.o\
X gc.o\
X list.o\
X twm.o\
X parse.o\
X menus.o\
X events.o\
X resize.o\
X util.o\
X version.o
X
X
Xtwm: $(O_FILES)
X cc $(LDFLAGS) -o twm $(O_FILES) $(LIBS)
X
X#
X# Dependencies
X#
Xgram.o: \
X twm.h \
X menus.h \
X list.h
Xlex.o: \
X gram.h
Xutil.o: \
X twm.h \
X gram.h
Xresize.o: \
X twm.h \
X util.h \
X resize.h \
X resize.bm \
X focus.bm
Xevents.o: \
X twm.h \
X add_window.h \
X menus.h \
X events.h \
X resize.h \
X gram.h \
X twm.bm
Xmenus.o: \
X twm.h \
X gc.h \
X menus.h \
X events.h \
X util.h \
X gram.h \
X pull.bm
Xparse.o: \
X twm.h \
X menus.h \
X util.h
Xtwm.o: \
X twm.h \
X add_window.h \
X gc.h \
X parse.h \
X version.h \
X menus.h \
X events.h \
X util.h \
X twm.bm
Xlist.o: \
X twm.h \
X gram.h
Xgc.o: \
X twm.h
Xadd_window.o: \
X twm.h \
X util.h \
X resize.h \
X gram.h \
X list.h \
X iconify.bm \
X resize.bm \
X xterm.bm \
X focus.bm \
X hilite.bm
Xlex.o: \
X gram.h
Xgram.o: \
X twm.h \
X menus.h \
X list.h
SHAR_EOF
if test 1405 -ne "`wc -c < Makefile`"
then
echo shar: error transmitting "Makefile" '(should have been 1405 characters)'
fi
fi
if test -f 'README'
then
echo shar: will not over-write existing file "README"
else
echo extracting "README"
sed 's/^X//' >README <<'SHAR_EOF'
XApril 15, 1988
X
XHere you go, here are some things I can think of.
X
XTwm has never been compiled or run on a System V machine. All
Xdevelopment was done on a Sun 3 running Release 3.4 of the operating system.
XIt has also been run on a VaxStation II and a VaxStation 8000.
X
XNothing real special you should have to do to compile it. If you are
Xrunning X11R1, you will have to link in the resource manager library
Xin addition to libX11.a.
X
XWe here at E&S have been using twm for almost 6 months now in various
Xstates of development. I hope you find it to be useful tool.
XTwm is my first, and so far, only X program. If I'm doing anything
Xblatently wrong, forgive me.
X
XI would appreciate hearing from those who like it as well as those who
Xdislike it.
X
X--
XTom LaStrange
X"if you don't like it, don't use it"
X
XEvans & Sutherland Computer Corporation
X
XUUCP Address: {ihnp4,seismo}!utah-cs!utah-gr!uplherc!esunix!tlastran
XAlternate: {ihnp4,decvax}!decwrl!esunix!tlastran
SHAR_EOF
if test 972 -ne "`wc -c < README`"
then
echo shar: error transmitting "README" '(should have been 972 characters)'
fi
fi
if test -f 'Sample.twmrc'
then
echo shar: will not over-write existing file "Sample.twmrc"
else
echo extracting "Sample.twmrc"
sed 's/^X//' >Sample.twmrc <<'SHAR_EOF'
X#**********************************************************************
X#
X# .twmrc
X#
X#**********************************************************************
X
X# ReverseVideo
XWarpCursor
XUnknownIcon "/usr/ias_soft/tlastrange/.icon"
XBorderWidth 2
XTitleFont "8x13"
XMenuFont "8x13"
XIconFont "8x13"
XResizeFont "fg-22"
X
XButton1 f.menu "button1"
XButton2 f.menu "button2"
XButton3 f.menu "button3"
XButton4 f.nop
XButton5 f.nop
X
XTitleButton1 t.raise
XTitleButton2 t.move
XTitleButton3 t.lower
XTitleButton4 t.nop
XTitleButton5 t.nop
X
XNoTitle
X{
X "xclock"
X "xckmail"
X}
X
XAutoRaise
X{
X "xterm" # auto-raise all my xterm windows
X}
X
Xmenu "button1"
X{
X"Other Logins" f.title
X"iguana 24" !"xterm -T xterm_iguana_24 =80x24+100+100 -e rlogin iguana &"
X"iguana 48" !"xterm -T xterm_iguana_48 =80x48+50+50 -e rlogin iguana &"
X"worm 24" !"xterm -T xterm_worm_24 =80x24+100+100 &"
X"worm 48" !"xterm -T xterm_worm_48 =80x48+50+50 &"
X"shiva" !"xterm -T xterm_shiva =80x24+200+200 -e rlogin shiva &"
X"tegus" !"xterm -T xterm_tegus =80x24+200+200 -e rlogin tegus &"
X"shade" !"xterm -T xterm_shade =80x24+200+200 -e rlogin shade &"
X"bilbo" !"xterm -T xterm_bilbo =80x24+250+250 -e rlogin bilbo &"
X"frodo" !"xterm -T xterm_frodo =80x24+300+300 -e rlogin frodo &"
X"esunix" !"xterm -T xterm_esunix =80x24+350+350 -e rlogin esunix &"
X"lynx8" !"xterm -T xterm_lynx8 =80x24+370+370 -e rlogin lynx8 &"
X"lynx13" !"xterm -T xterm_lynx13 =80x24+390+390 -e rlogin lynx13 &"
X"zephyr" !"xterm -T xterm_zephyr =80x24+390+390 -e rlogin zephyr &"
X}
X
Xmenu "button2"
X{
X"Window Ops" f.title
X"Refresh" f.refresh
X"Focus on Root" f.focus
X"Source .twmrc" f.twmrc
X"Source blob" f.source "blob"
X"Cut File" f.cutfile
X"twm Version" f.version
X"Kill twm" f.quit
X}
X
Xmenu "button3"
X{
X"Cut Buffer" f.title
X"Procedure Header" f.file "/usr/ias_soft/tlastrange/src/proc.twm"
X"File Header" f.file "/usr/ias_soft/tlastrange/src/file.twm"
X"pull right" f.menu "blob"
X}
X
Xmenu "blob"
X{
X"pull right" f.menu "final"
X"another" ^"some text"
X}
X
Xmenu "final"
X{
X"Cut Buffer" f.title
X"Procedure Header" f.file "/usr/ias_soft/tlastrange/src/proc.twm"
X"File Header" f.file "/usr/ias_soft/tlastrange/src/file.twm"
X}
X
Xmenu "one"
X{
X"refresh" f.refresh
X}
SHAR_EOF
if test 2194 -ne "`wc -c < Sample.twmrc`"
then
echo shar: error transmitting "Sample.twmrc" '(should have been 2194 characters)'
fi
fi
if test -f 'gram.y'
then
echo shar: will not over-write existing file "gram.y"
else
echo extracting "gram.y"
sed 's/^X//' >gram.y <<'SHAR_EOF'
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: gram.y,v 1.15 88/04/15 07:09:34 tlastran Exp $
X *
X * .twmrc command grammer
X *
X * 07-Jan-86 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
X%{
Xstatic char RCSinfo[]=
X"$Header: gram.y,v 1.15 88/04/15 07:09:34 tlastran Exp $";
X
X#include <stdio.h>
X#include "twm.h"
X#include "menus.h"
X#include "list.h"
X
Xstatic char *Action = "";
Xstatic MenuRoot *root,
X *pull = NULL;
X
XMenuRoot *GetRoot();
X
Xstatic char *ptr;
Xstatic int Button;
Xstatic int list;
X
Xextern int yylineno;
X%}
X
X%union
X{
X int num;
X char *ptr;
X};
X
X%token <num> LB RB MENUS MENU BUTTON TBUTTON
X%token <num> F_MENU F_FOCUS F_REFRESH F_FILE F_TWMRC F_CIRCLEUP F_QUIT
X%token <num> F_NOP F_TITLE F_VERSION F_EXEC F_CUT F_CIRCLEDOWN F_SOURCE
X%token <num> F_CUTFILE
X%token <num> T_NOP T_RAISE T_LOWER T_MOVE
X%token <num> WARPCURSOR NUMBER BORDERWIDTH TITLE_FONT REVERSE_VIDEO
X%token <num> RESIZE_FONT NO_TITLE AUTO_RAISE
X%token <num> MENU_FONT ICON_FONT UNKNOWN_ICON
X%token <ptr> STRING
X
X%type <ptr> string
X%type <num> action button number tbutton taction
X
X%start twmrc
X
X%%
Xtwmrc : stmts
X ;
X
Xstmts : /* Empty */
X | stmts stmt
X ;
X
Xstmt : error
X | REVERSE_VIDEO { if (FirstTime) ReverseVideo = TRUE; }
X | ICON_FONT string { if (FirstTime) IconFontName = $2; }
X | RESIZE_FONT string { if (FirstTime) SizeFontName = $2; }
X | MENU_FONT string { if (FirstTime) MenuFontName = $2; }
X | TITLE_FONT string { if (FirstTime) TitleBarFontName=$2; }
X | UNKNOWN_ICON string { if (FirstTime) GetUnknownIcon($2); }
X | WARPCURSOR { if (FirstTime) WarpCursor = TRUE; }
X | BORDERWIDTH number { if (FirstTime) BorderWidth = $2; }
X | button string { root = GetRoot($2);
X Menu[$1] = root;
X Item[$1] = NULL;
X }
X | button action { if ($2 == F_MENU)
X {
X pull->prev = NULL;
X Menu[$1] = pull;
X Item[$1] = NULL;
X }
X else
X {
X root = GetRoot(TWM_ROOT);
X Item[$1] =
X AddToMenu(root,"x",Action,0,$2);
X Menu[$1] = NULL;
X }
X Action = "";
X pull = NULL;
X }
X | tbutton taction { TitleButton[$1] = $2; }
X | NO_TITLE { list = NO_TITLE; }
X win_list
X | AUTO_RAISE { list = AUTO_RAISE; }
X win_list
X | MENU string { root = GetRoot($2); }
X menu
X ;
X
X
Xwin_list : LB win_entries RB
X ;
X
Xwin_entries : /* Empty */
X | win_entries win_entry
X ;
X
Xwin_entry : string { if (FirstTime) AddToList(list, $1); }
X ;
X
Xmenu : LB menu_entries RB
X ;
X
Xmenu_entries : /* Empty */
X | menu_entries menu_entry
X ;
X
Xmenu_entry : string action { AddToMenu(root, $1, Action, pull, $2);
X Action = "";
X pull = NULL;
X }
X ;
X
Xaction : F_NOP { $$ = F_NOP; }
X | F_QUIT { $$ = F_QUIT; }
X | F_FOCUS { $$ = F_FOCUS; }
X | F_REFRESH { $$ = F_REFRESH; }
X | F_SOURCE string { Action = $2; $$ = F_TWMRC; }
X | F_TWMRC { $$ = F_TWMRC; }
X | F_VERSION { $$ = F_VERSION; }
X | F_TITLE { $$ = F_TITLE; }
X | F_CIRCLEUP { $$ = F_CIRCLEUP; }
X | F_CIRCLEDOWN { $$ = F_CIRCLEDOWN; }
X | F_CUTFILE { $$ = F_CUTFILE; }
X | F_MENU string { pull = GetRoot($2);
X pull->prev = root;
X $$ = F_MENU;
X }
X | F_FILE string { Action = $2; $$ = F_FILE; }
X | F_EXEC string { Action = $2; $$ = F_EXEC; }
X | F_CUT string { Action = $2; $$ = F_CUT; }
X ;
X
Xtaction : T_RAISE { $$ = T_RAISE; }
X | T_LOWER { $$ = T_LOWER; }
X | T_MOVE { $$ = T_MOVE; }
X | T_NOP { $$ = T_NOP; }
X ;
X
Xbutton : BUTTON { $$ = $1;
X if ($1 == 0)
X yyerror();
X
X if ($1 > MAX_BUTTONS)
X {
X $$ = 0;
X yyerror();
X }
X }
X ;
Xtbutton : TBUTTON { $$ = $1;
X if ($1 == 0)
X yyerror();
X
X if ($1 > MAX_BUTTONS)
X {
X $$ = 0;
X yyerror();
X }
X }
X ;
X
Xstring : STRING { ptr = (char *)malloc(strlen($1)+1);
X strcpy(ptr, $1);
X RemoveDQuote(ptr);
X $$ = ptr;
X }
Xnumber : NUMBER { $$ = $1; }
X ;
X
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
SHAR_EOF
if test 6242 -ne "`wc -c < gram.y`"
then
echo shar: error transmitting "gram.y" '(should have been 6242 characters)'
fi
fi
if test -f 'lex.l'
then
echo shar: will not over-write existing file "lex.l"
else
echo extracting "lex.l"
sed 's/^X//' >lex.l <<'SHAR_EOF'
X%{
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: lex.l,v 1.19 88/04/15 07:09:32 tlastran Exp $
X *
X * .twmrc lex file
X *
X * 12-Nov-87 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
Xstatic char RCSinfo[]=
X"$Header: lex.l,v 1.19 88/04/15 07:09:32 tlastran Exp $";
X
X#include <stdio.h>
X#include "gram.h"
X
Xextern int ParseError;
X
X%}
Xqstring \"[^"]*\"
Xnumber [0-9]+
Xbutton [Bb][Uu][Tt][Tt][Oo][Nn]
Xtbutton [Tt][Ii][Tt][Ll][Ee][Bb][Uu][Tt][Tt][Oo][Nn]
X%%
X"{" { return LB; }
X"}" { return RB; }
X
X{button}{number} { (void)sscanf(&yytext[6], "%d", &yylval.num);
X return (BUTTON);
X }
X{tbutton}{number} { (void)sscanf(&yytext[11], "%d", &yylval.num);
X return (TBUTTON);
X }
X[Mm][Ee][Nn][Uu] { return MENU; }
X
Xf.nop { return F_NOP; }
Xf.quit { return F_QUIT; }
Xf.title { return F_TITLE ; }
Xf.menu { return F_MENU; }
Xf.focus { return F_FOCUS; }
Xf.refresh { return F_REFRESH; }
Xf.file { return F_FILE; }
Xf.twmrc { return F_TWMRC; }
Xf.version { return F_VERSION; }
Xf.circleup { return F_CIRCLEUP; }
Xf.circledown { return F_CIRCLEDOWN; }
Xf.source { return F_SOURCE; }
Xf.cutfile { return F_CUTFILE; }
X"!" { return F_EXEC; }
X"^" { return F_CUT; }
X
Xt.nop { return T_NOP; }
Xt.raise { return T_RAISE; }
Xt.lower { return T_LOWER; }
Xt.move { return T_MOVE; }
X
X[Uu][Nn][Kk][Nn][Oo][Ww][Nn][Ii][Cc][Oo][Nn] { return UNKNOWN_ICON; }
X[Ww][Aa][Rr][Pp][Cc][Uu][Rr][Ss][Oo][Rr] { return WARPCURSOR; }
X[Bb][Oo][Rr][Dd][Ee][Rr][Ww][Ii][Dd][Tt][Hh] { return BORDERWIDTH; }
X[Tt][Ii][Tt][Ll][Ee][Ff][Oo][Nn][Tt] { return (TITLE_FONT); }
X[Mm][Ee][Nn][Uu][Ff][Oo][Nn][Tt] { return (MENU_FONT); }
X[Ii][Cc][Oo][Nn][Ff][Oo][Nn][Tt] { return (ICON_FONT); }
X[Rr][Ee][Ss][Ii][Zz][Ee][Ff][Oo][Nn][Tt] { return (RESIZE_FONT); }
X[Rr][Ee][Vv][Ee][Rr][Ss][Ee][Vv][Ii][Dd][Ee][Oo] { return (REVERSE_VIDEO); }
X[Nn][Oo][Tt][Ii][Tt][Ll][Ee] { return (NO_TITLE); }
X[Aa][Uu][Tt][Oo][Rr][Aa][Ii][Ss][Ee] { return (AUTO_RAISE); }
X
X{qstring} { yylval.ptr = yytext; return STRING; }
X{number} { (void)sscanf(yytext, "%d", &yylval.num);
X return (NUMBER);
X }
X\#[^\n]*\n {;}
X[\n\t ] {;}
X. {
X fprintf(stderr,
X "twm: bad character `%s', line %d\n",
X yytext, yylineno);
X ParseError = 1;
X }
X%%
Xyywrap() { return(1);}
X
X#define unput(c) TwmUnput(c)
X#define input() TwmInput()
X#define output(c) TwmOutput(c)
SHAR_EOF
if test 4392 -ne "`wc -c < lex.l`"
then
echo shar: error transmitting "lex.l" '(should have been 4392 characters)'
fi
fi
if test -f 'add_window.c'
then
echo shar: will not over-write existing file "add_window.c"
else
echo extracting "add_window.c"
sed 's/^X//' >add_window.c <<'SHAR_EOF'
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: add_window.c,v 1.7 88/04/15 07:10:05 tlastran Exp $
X *
X * Add a new window, put the titlbar and other stuff around
X * the window
X *
X * 31-Mar-88 Tom LaStrange Initial Version.
X *
X **********************************************************************/
X
X#ifndef lint
Xstatic char RCSinfo[]=
X"$Header: add_window.c,v 1.7 88/04/15 07:10:05 tlastran Exp $";
X#endif lint
X
X#include <stdio.h>
X#include "twm.h"
X#include "util.h"
X#include "resize.h"
X#include "gram.h"
X#include "list.h"
X
X#include "iconify.bm"
X#include "resize.bm"
X#include "xterm.bm"
X#include "focus.bm"
X#include "hilite.bm"
X
Xstatic char NoName[] = "No Name"; /* name if no name is specified */
X
X/***********************************************************************
X *
X * Procedure:
X * AddWindow - add a new window to the twm list
X *
X * Returned Value:
X * (TwmWindow *) - pointer to the TwmWindow structure
X *
X * Inputs:
X * w - the window id of the window to add
X *
X ***********************************************************************
X */
X
XTwmWindow *
XAddWindow(w)
XWindow w;
X{
X TwmWindow *tmp_win; /* new twm window structure */
X unsigned long valuemask; /* mask for create windows */
X XSetWindowAttributes attributes; /* attributes for create windows */
X int icon_width; /* width of the icon pixmap */
X int icon_height; /* height of the icon pixmap */
X int width; /* tmp variable */
X int x;
X Pixmap pm; /* tmp pixmap variable */
X XWindowChanges xwc; /* change window structure */
X unsigned int xwcm; /* change window mask */
X
X#ifdef DEBUG
X fprintf(stderr, "AddWindow: w = 0x%x\n", w);
X#endif
X
X /* allocate space for the twm window */
X tmp_win = (TwmWindow *)malloc(sizeof(TwmWindow));
X tmp_win->w = w;
X
X XGetWindowAttributes(dpy, tmp_win->w, &tmp_win->attr);
X XFetchName(dpy, tmp_win->w, &tmp_win->name);
X#ifdef DEBUG
X fprintf(stderr, " name = \"%s\"\n", tmp_win->name);
X#endif
X tmp_win->wmhints = XGetWMHints(dpy, tmp_win->w);
X if (XGetNormalHints(dpy, tmp_win->w, &tmp_win->hints) == 0)
X tmp_win->hints.flags = 0;
X
X if (tmp_win->hints.flags & PSize)
X {
X#ifdef DEBUG
X fprintf(stderr, " program specified hints\n");
X#endif
X tmp_win->attr.x = tmp_win->hints.x;
X tmp_win->attr.y = tmp_win->hints.y;
X tmp_win->attr.width = tmp_win->hints.width;
X tmp_win->attr.height = tmp_win->hints.height;
X }
X if (tmp_win->hints.flags & USSize)
X {
X#ifdef DEBUG
X fprintf(stderr, " user specified hints\n");
X#endif
X tmp_win->attr.x = tmp_win->hints.x;
X tmp_win->attr.y = tmp_win->hints.y;
X tmp_win->attr.width = tmp_win->hints.width;
X tmp_win->attr.height = tmp_win->hints.height;
X }
X
X if (tmp_win->name == NULL)
X tmp_win->name = NoName;
X
X tmp_win->auto_raise = LookInList(AUTO_RAISE, tmp_win->name);
X if (LookInList(NO_TITLE, tmp_win->name))
X {
X tmp_win->title_height = 0;
X }
X else
X {
X tmp_win->title_height = TITLE_BAR_HEIGHT + BorderWidth;
X }
X
X if (tmp_win->attr.y < tmp_win->title_height)
X tmp_win->attr.y = tmp_win->title_height;
X
X xwcm = CWX | CWY | CWWidth | CWHeight | CWBorderWidth;
X
X#ifdef DEBUG
X fprintf(stderr, " position window %d, %d %dx%d\n",
X tmp_win->attr.x,
X tmp_win->attr.y,
X tmp_win->attr.width,
X tmp_win->attr.height);
X#endif
X xwc.x = tmp_win->attr.x + tmp_win->attr.border_width;
X xwc.y = tmp_win->attr.y + tmp_win->attr.border_width;
X xwc.width = tmp_win->attr.width;
X xwc.height = tmp_win->attr.height;
X xwc.border_width = 0;
X
X XConfigureWindow(dpy, tmp_win->w, xwcm, &xwc);
X
X
X tmp_win->full_name = tmp_win->name;
X
X if (strncmp("xterm", tmp_win->name, 5) == 0 ||
X strncmp("yterm", tmp_win->name, 5) == 0 ||
X strncmp("console", tmp_win->name, 7) == 0 ||
X strncmp("login", tmp_win->name, 5) == 0)
X tmp_win->xterm = TRUE;
X else
X tmp_win->xterm = FALSE;
X
X if (strncmp("xterm_", tmp_win->name, 6) == 0)
X tmp_win->name = &tmp_win->name[6];
X
X tmp_win->name_width = XTextWidth(TitleBarFont, tmp_win->name,
X strlen(tmp_win->name));
X tmp_win->icon_name = tmp_win->name;
X
X tmp_win->iconified = FALSE;
X tmp_win->icon = FALSE;
X
X /* add the window into the twm list */
X tmp_win->next = TwmRoot.next;
X if (TwmRoot.next != NULL)
X TwmRoot.next->prev = tmp_win;
X tmp_win->prev = &TwmRoot;
X TwmRoot.next = tmp_win;
X
X /* create windows */
X
X tmp_win->frame_x = tmp_win->attr.x;
X tmp_win->frame_y = tmp_win->attr.y - tmp_win->title_height;
X
X tmp_win->frame = XCreateSimpleWindow(dpy, Root,
X tmp_win->frame_x,
X tmp_win->frame_y,
X tmp_win->attr.width,
X tmp_win->attr.height + tmp_win->title_height,
X BorderWidth,
X Foreground, Background);
X
X tmp_win->title_w = XCreateSimpleWindow(dpy, tmp_win->frame,
X -BorderWidth, -BorderWidth,
X tmp_win->attr.width, TITLE_BAR_HEIGHT,
X BorderWidth,
X Foreground, Background);
X
X /* the three buttons have the pixmap as the background of the
X * window, that way I don't have to worry about repainting them
X * on expose events.
X */
X
X valuemask = CWEventMask | CWBackPixmap;
X attributes.event_mask = ButtonPressMask;
X attributes.background_pixmap = MakePixmap(tmp_win->title_w, TitleNormalGC,
X iconify_bits, iconify_width, iconify_height);
X
X tmp_win->iconify_w = XCreateWindow(dpy, tmp_win->title_w,
X TITLE_BAR_SPACE, TITLE_BAR_SPACE,
X iconify_width, iconify_height,
X 0, DefaultDepth(dpy, 0), CopyFromParent, DefaultVisual(dpy,0),
X valuemask, &attributes);
X
X attributes.background_pixmap = MakePixmap(tmp_win->title_w, TitleNormalGC,
X focus_bits, focus_width, focus_height);
X
X tmp_win->focus_w = XCreateWindow(dpy, tmp_win->title_w,
X tmp_win->attr.width - resize_width -3 - focus_width, TITLE_BAR_SPACE,
X iconify_width, iconify_height,
X 0, DefaultDepth(dpy, 0), CopyFromParent, DefaultVisual(dpy,0),
X valuemask, &attributes);
X
X attributes.background_pixmap = MakePixmap(tmp_win->title_w, TitleNormalGC,
X resize_bits, resize_width, resize_height);
X
X tmp_win->resize_w = XCreateWindow(dpy, tmp_win->title_w,
X tmp_win->attr.width - resize_width - 1,
X TITLE_BAR_SPACE,
X resize_width, resize_height,
X 0, DefaultDepth(dpy, 0), CopyFromParent, DefaultVisual(dpy,0),
X valuemask, &attributes);
X
X valuemask = CWBackPixmap;
X attributes.background_pixmap = MakePixmap(tmp_win->title_w, TitleNormalGC,
X hilite_bits, hilite_width, hilite_height);
X
X tmp_win->hilite_w = XCreateWindow(dpy, tmp_win->title_w,
X TitleBarX, 1,
X 10, hilite_height,
X 0, DefaultDepth(dpy, 0), CopyFromParent, DefaultVisual(dpy,0),
X valuemask, &attributes);
X
X XDefineCursor(dpy, tmp_win->title_w, ArrowCursor);
X XDefineCursor(dpy, tmp_win->iconify_w, ButtonCursor);
X XDefineCursor(dpy, tmp_win->focus_w, ButtonCursor);
X XDefineCursor(dpy, tmp_win->resize_w, ButtonCursor);
X
X XSelectInput(dpy, tmp_win->w, StructureNotifyMask);
X XSelectInput(dpy, tmp_win->frame,
X ButtonPressMask | EnterWindowMask | LeaveWindowMask);
X
X XSelectInput(dpy, tmp_win->title_w,
X ButtonPressMask | ButtonReleaseMask |
X ExposureMask | ButtonMotionMask);
X
X XAddToSaveSet(dpy, tmp_win->w);
X XReparentWindow(dpy, tmp_win->w, tmp_win->frame, 0, tmp_win->title_height);
X
X SetupWindow(tmp_win,
X tmp_win->frame_x,
X tmp_win->frame_y,
X tmp_win->attr.width,
X tmp_win->attr.height + tmp_win->title_height);
X
X pm = NULL;
X if (tmp_win->wmhints && tmp_win->wmhints->flags & IconPixmapHint)
X {
X XGetGeometry(dpy, tmp_win->wmhints->icon_pixmap,
X &JunkRoot, &JunkX, &JunkY,
X &icon_width, &icon_height, &JunkBW,
X &JunkDepth);
X
X pm = XCreatePixmap(dpy, Root, icon_width, icon_height,
X DefaultDepth(dpy, 0));
X
X XCopyPlane(dpy, tmp_win->wmhints->icon_pixmap, pm, MenuNormalGC,
X 0,0, icon_width, icon_height, 0, 0, 1 );
X }
X else
X {
X if (tmp_win->xterm)
X {
X pm = MakePixmap(Root, MenuNormalGC,
X xterm_bits, xterm_width, xterm_height);
X icon_width = xterm_width;
X icon_height = xterm_height;
X }
X else if (UnknownPm != NULL)
X {
X XImage *image;
X unsigned mask;
X
X icon_width = UnknownWidth;
X icon_height = UnknownHeight;
X mask = Foreground ^ Background;
X image = XGetImage(dpy, UnknownPm, 0, 0, icon_width, icon_height,
X mask, XYPixmap);
X
X pm = XCreatePixmap(dpy, Root, icon_width, icon_height,
X DefaultDepth(dpy, 0));
X
X XPutImage(dpy, pm, TitleNormalGC,
X image, 0, 0, 0, 0, icon_width, icon_height);
X }
X }
X
X if (pm == NULL)
X {
X icon_height = 0;
X icon_width = 0;
X valuemask = 0;
X }
X else
X {
X valuemask = CWBackPixmap;
X attributes.background_pixmap = pm;
X }
X
X width = XTextWidth(IconFont,
X tmp_win->icon_name, strlen(tmp_win->icon_name));
X
X width += 6;
X if (width < icon_width)
X {
X tmp_win->icon_x = (icon_width - width)/2;
X tmp_win->icon_x += 3;
X width = icon_width;
X }
X else
X {
X tmp_win->icon_x = 3;
X }
X tmp_win->icon_y = icon_height + IconFontHeight;
X
X if (tmp_win->wmhints && tmp_win->wmhints->flags & IconWindowHint)
X {
X tmp_win->icon_w = tmp_win->wmhints->icon_window;
X }
X else
X {
X tmp_win->icon_w = XCreateSimpleWindow(dpy, Root,
X 0,0,
X width,
X icon_height + IconFontHeight + 4,
X 2, Foreground, Background);
X }
X
X XSelectInput(dpy, tmp_win->icon_w,
X ButtonPressMask | ExposureMask);
X
X if (pm != NULL)
X {
X if (width == icon_width)
X x = 0;
X else
X x = (width - icon_width)/2;
X
X XCreateWindow(dpy, tmp_win->icon_w,
X x, 0,
X icon_width, icon_height,
X 0, DefaultDepth(dpy, 0), CopyFromParent,
X DefaultVisual(dpy,0),
X valuemask, &attributes);
X }
X
X XDefineCursor(dpy, tmp_win->icon_w, ArrowCursor);
X
X XSaveContext(dpy, tmp_win->w, TwmContext, tmp_win);
X XSaveContext(dpy, tmp_win->frame, TwmContext, tmp_win);
X XSaveContext(dpy, tmp_win->title_w, TwmContext, tmp_win);
X XSaveContext(dpy, tmp_win->iconify_w, TwmContext, tmp_win);
X XSaveContext(dpy, tmp_win->resize_w, TwmContext, tmp_win);
X XSaveContext(dpy, tmp_win->icon_w, TwmContext, tmp_win);
X XSaveContext(dpy, tmp_win->focus_w, TwmContext, tmp_win);
X XSaveContext(dpy, tmp_win->hilite_w, TwmContext, tmp_win);
X
X return (tmp_win);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * MappedNotOverride - checks to see if we should really
X * put a twm frame on the window
X *
X * Returned Value:
X * TRUE - go ahead and frame the window
X * FALSE - don't frame the window
X *
X * Inputs:
X * w - the window to check
X *
X ***********************************************************************
X */
X
Xint
XMappedNotOverride(w)
X Window w;
X{
X XWindowAttributes wa;
X
X XGetWindowAttributes(dpy, w, &wa);
X return ((wa.map_state != IsUnmapped) && (wa.override_redirect != True));
X}
SHAR_EOF
if test 12604 -ne "`wc -c < add_window.c`"
then
echo shar: error transmitting "add_window.c" '(should have been 12604 characters)'
fi
fi
if test -f 'gc.c'
then
echo shar: will not over-write existing file "gc.c"
else
echo extracting "gc.c"
sed 's/^X//' >gc.c <<'SHAR_EOF'
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: gc.c,v 1.3 88/04/15 07:09:38 tlastran Exp $
X *
X * Open the fonts and create the GCs
X *
X * 31-Mar-88 Tom LaStrange Initial Version.
X *
X **********************************************************************/
X
X#ifndef lint
Xstatic char RCSinfo[]=
X"$Header: gc.c,v 1.3 88/04/15 07:09:38 tlastran Exp $";
X#endif lint
X
X#include <stdio.h>
X#include "twm.h"
X
X/***********************************************************************
X *
X * Procedure:
X * CreateGCs - open fonts and create all the needed GC's. I only
X * want to do this once, hence the first_time flag.
X *
X ***********************************************************************
X */
X
Xvoid
XCreateGCs()
X{
X static int first_time = TRUE;
X XGCValues gcv;
X unsigned long gcm, mask;
X
X if (!first_time)
X return;
X
X first_time = FALSE;
X
X /* open fonts */
X
X TitleBarFont = XLoadQueryFont(dpy, TitleBarFontName);
X TitleBarFontHeight = TitleBarFont->ascent + TitleBarFont->descent;
X if (TitleBarFontHeight < TITLE_BAR_FONT_HEIGHT)
X {
X TitleBarY = (TITLE_BAR_FONT_HEIGHT - TitleBarFontHeight)/2 +
X TITLE_BAR_SPACE + TitleBarFont->ascent;
X }
X else
X {
X TitleBarY = TITLE_BAR_SPACE + TitleBarFont->ascent;
X }
X
X MenuFont = XLoadQueryFont(dpy, MenuFontName);
X MenuFontHeight = MenuFont->ascent + MenuFont->descent;
X MenuY = MenuFont->ascent + 1;
X
X IconFont = XLoadQueryFont(dpy, IconFontName);
X IconFontHeight = IconFont->ascent + IconFont->descent;
X
X VersionFont = XLoadQueryFont(dpy, VersionFontName);
X VersionFontHeight = VersionFont->ascent + VersionFont->descent;
X
X SizeFont = XLoadQueryFont(dpy, SizeFontName);
X SizeFontHeight = SizeFont->ascent + SizeFont->descent;
X
X /* create GC's */
X
X if (ReverseVideo)
X {
X Background = BlackPixel(dpy, DefaultScreen(dpy));
X Foreground = WhitePixel(dpy, DefaultScreen(dpy));
X }
X else
X {
X Foreground = BlackPixel(dpy, DefaultScreen(dpy));
X Background = WhitePixel(dpy, DefaultScreen(dpy));
X }
X mask = Foreground ^ Background;
X
X gcm = 0;
X gcm |= GCFont; gcv.font = TitleBarFont->fid;
X gcm |= GCPlaneMask; gcv.plane_mask = mask;
X gcm |= GCForeground; gcv.foreground = Foreground;
X gcm |= GCBackground; gcv.background = Background;
X
X TitleNormalGC = XCreateGC(dpy, Root, gcm, &gcv);
X
X gcm = 0;
X gcm |= GCFont; gcv.font = MenuFont->fid;
X gcm |= GCPlaneMask; gcv.plane_mask = mask;
X gcm |= GCForeground; gcv.foreground = Foreground;
X gcm |= GCBackground; gcv.background = Background;
X
X MenuNormalGC = XCreateGC(dpy, Root, gcm, &gcv);
X
X gcv.foreground = Background;
X gcv.background = Foreground;
X
X MenuReverseGC = XCreateGC(dpy, Root, gcm, &gcv);
X
X gcm = 0;
X gcm |= GCFunction; gcv.function = GXxor;
X gcm |= GCFont; gcv.font = MenuFont->fid;
X gcm |= GCPlaneMask; gcv.plane_mask = mask;
X gcm |= GCForeground; gcv.foreground = mask;
X gcm |= GCBackground; gcv.background = Background;
X
X MenuXorGC = XCreateGC(dpy, Root, gcm, &gcv);
X
X gcm = 0;
X gcm |= GCFunction; gcv.function = GXxor;
X gcm |= GCLineWidth; gcv.line_width = 0;
X gcm |= GCForeground; gcv.foreground = mask;
X gcm |= GCPlaneMask; gcv.plane_mask = mask;
X gcm |= GCSubwindowMode; gcv.subwindow_mode = IncludeInferiors;
X
X DrawGC = XCreateGC(dpy, Root, gcm, &gcv);
X
X gcm = 0;
X gcm |= GCFont; gcv.font = IconFont->fid;
X gcm |= GCPlaneMask; gcv.plane_mask = mask;
X gcm |= GCForeground; gcv.foreground = Foreground;
X gcm |= GCBackground; gcv.background = Background;
X
X IconNormalGC = XCreateGC(dpy, Root, gcm, &gcv);
X
X gcm = 0;
X gcm |= GCFont; gcv.font = VersionFont->fid;
X gcm |= GCPlaneMask; gcv.plane_mask = mask;
X gcm |= GCForeground; gcv.foreground = Foreground;
X gcm |= GCBackground; gcv.background = Background;
X
X VersionNormalGC = XCreateGC(dpy, Root, gcm, &gcv);
X
X gcm = 0;
X gcm |= GCFont; gcv.font = SizeFont->fid;
X gcm |= GCPlaneMask; gcv.plane_mask = mask;
X gcm |= GCForeground; gcv.foreground = Foreground;
X gcm |= GCBackground; gcv.background = Background;
X
X SizeNormalGC = XCreateGC(dpy, Root, gcm, &gcv);
X}
SHAR_EOF
if test 6215 -ne "`wc -c < gc.c`"
then
echo shar: error transmitting "gc.c" '(should have been 6215 characters)'
fi
fi
if test -f 'list.c'
then
echo shar: will not over-write existing file "list.c"
else
echo extracting "list.c"
sed 's/^X//' >list.c <<'SHAR_EOF'
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: list.c,v 1.2 88/04/15 07:09:53 tlastran Exp $
X *
X * TWM code to deal with the name lists for the NoTitle list and
X * the AutoRaise list
X *
X * 11-Apr-88 Tom LaStrange Initial Version.
X *
X **********************************************************************/
X
X#ifndef lint
Xstatic char RCSinfo[]=
X"$Header: list.c,v 1.2 88/04/15 07:09:53 tlastran Exp $";
X#endif lint
X
X#include <stdio.h>
X#include "twm.h"
X#include "gram.h"
X
Xtypedef struct name_list name_list;
X
Xstruct name_list
X{
X name_list *next; /* pointer to the next name */
X char *name; /* the name of the window */
X};
X
Xname_list *NoTitle = NULL; /* list of window names with no title bar */
Xname_list *AutoRaise = NULL; /* list of window names to auto-raise */
X
X/***********************************************************************
X *
X * Procedure:
X * AddToList - add a window name to the appropriate list
X *
X * Inputs:
X * list - a #define to identify the list
X * name - a pointer to the name of the window
X *
X ***********************************************************************
X */
X
Xvoid
XAddToList(list, name)
Xint list;
Xchar *name;
X{
X name_list *ptr;
X
X ptr = (name_list *)malloc(sizeof(name_list));
X if (ptr == NULL)
X {
X fprintf(stderr, "twm: out of memory\n");
X exit(1);
X }
X
X ptr->name = name;
X
X switch (list)
X {
X case AUTO_RAISE:
X ptr->next = AutoRaise;
X AutoRaise = ptr;
X break;
X
X case NO_TITLE:
X ptr->next = NoTitle;
X NoTitle = ptr;
X break;
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * LookInList - look through a list for a window name
X *
X * Returned Value:
X * TRUE - the window was found in the list
X * FALSE - the window was not found in the list
X *
X * Inputs:
X * list - a #define to identify the list
X * name - a pointer to the name to look for
X *
X ***********************************************************************
X */
X
Xint
XLookInList(list, name)
Xint list;
Xchar *name;
X{
X name_list *l;
X name_list *ptr;
X
X switch (list)
X {
X case AUTO_RAISE:
X l = AutoRaise;
X break;
X
X case NO_TITLE:
X l = NoTitle;
X break;
X }
X
X for (ptr = l; ptr != NULL; ptr = ptr->next)
X {
X int len;
X
X len = strlen(ptr->name);
X if (strncmp(name, ptr->name, len) == 0)
X return (TRUE);
X }
X return (FALSE);
X}
SHAR_EOF
if test 4301 -ne "`wc -c < list.c`"
then
echo shar: error transmitting "list.c" '(should have been 4301 characters)'
fi
fi
if test -f 'twm.c'
then
echo shar: will not over-write existing file "twm.c"
else
echo extracting "twm.c"
sed 's/^X//' >twm.c <<'SHAR_EOF'
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.23 88/04/15 07:09:30 tlastran 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.23 88/04/15 07:09:30 tlastran 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
X#include "twm.bm"
X
XTwmWindow TwmRoot; /* the head of the twm window list */
X
XDisplay *dpy; /* which display are we talking to */
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 */
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 */
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 */
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 */
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 RightArrowCursor; /* menu cursor */
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 IconNormalGC; /* GC for icons */
XGC VersionNormalGC; /* GC for the version window */
XGC SizeNormalGC; /* GC for the resize window */
XGC DrawGC; /* GC to draw lines for move and resize */
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 for all windows */
Xunsigned long Background; /* background color for all windows */
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 ParseError; /* error parsing the .twmrc file */
X
Xint TitleButton[MAX_BUTTONS + 1]; /* title button functions */
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 */
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
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 signal(SIGINT, Done);
X signal(SIGQUIT, Done);
X signal(SIGHUP, Done);
X signal(SIGTERM, Done);
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 Root = RootWindow(dpy, DefaultScreen(dpy));
X
X XSetErrorHandler(Other);
X XSelectInput(dpy, Root,
X SubstructureRedirectMask |
X ButtonPressMask | ButtonReleaseMask |
X ExposureMask | ButtonMotionMask);
X XSync(dpy, 0);
X
X XSetErrorHandler(Error);
X XSetInputFocus(dpy, Root, 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 RightArrowCursor = XCreateFontCursor(dpy, XC_sb_right_arrow);
X ButtonCursor = XCreateFontCursor(dpy, XC_center_ptr);
X ClockCursor = XCreateFontCursor(dpy, XC_watch);
X
X XGrabServer(dpy);
X XSync(dpy, 0);
X XQueryTree(dpy, Root, &root, &parent, &children, &nchildren);
X
X ParseTwmrc(NULL);
X FirstTime = FALSE;
X CreateGCs();
X
X for (i = 0; i < nchildren; i++)
X {
X if (MappedNotOverride(children[i]))
X {
X AddWindow(children[i]);
X }
X }
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, TitleNormalGC,
X twm_bits, twm_width, twm_height);
X
X XCreateWindow(dpy, VersionWindow,
X 4, 1,
X twm_width, twm_height,
X 0, DefaultDepth(dpy, 0), CopyFromParent, DefaultVisual(dpy, 0),
X 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 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, Root, RevertToPointerRoot, CurrentTime);
X XCloseDisplay(dpy);
X exit(0);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * Error - X error handler. Print the error and exit.
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 char buffer[BUFSIZ];
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 * 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}
SHAR_EOF
if test 11469 -ne "`wc -c < twm.c`"
then
echo shar: error transmitting "twm.c" '(should have been 11469 characters)'
fi
fi
if test -f 'parse.c'
then
echo shar: will not over-write existing file "parse.c"
else
echo extracting "parse.c"
sed 's/^X//' >parse.c <<'SHAR_EOF'
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: parse.c,v 1.13 88/04/15 07:09:29 tlastran Exp $
X *
X * parse the .twmrc file
X *
X * 17-Nov-87 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
X#ifndef lint
Xstatic char RCSinfo[]=
X"$Header: parse.c,v 1.13 88/04/15 07:09:29 tlastran Exp $";
X#endif
X
X#include <stdio.h>
X#include "twm.h"
X#include "menus.h"
X#include "util.h"
X
X#define BUF_LEN 300
X
Xstatic FILE *twmrc;
Xstatic int ptr = 0;
Xstatic int len = 0;
Xstatic char buff[BUF_LEN+1];
Xextern int yylineno;
X
X/***********************************************************************
X *
X * Procedure:
X * ParseTwmrc - parse the .twmrc file
X *
X * Inputs:
X * filename - the filename to parse. A NULL indicates $HOME/.twmrc
X *
X ***********************************************************************
X */
X
Xvoid
XParseTwmrc(filename)
Xchar *filename;
X{
X char *home;
X char init_file[200];
X
X InitMenus();
X InitButtons();
X
X if (filename == NULL)
X {
X home = (char *)getenv("HOME");
X strcpy(init_file, home);
X strcat(init_file, "/.twmrc");
X }
X else
X strcpy(init_file, filename);
X
X if ((twmrc = fopen(init_file, "r")) == NULL)
X {
X fprintf(stderr, "twm: couldn't open \"%s\"\n", init_file);
X return;
X }
X
X ptr = 0;
X len = 0;
X yylineno = 0;
X ParseError = FALSE;
X
X yyparse();
X
X fclose(twmrc);
X
X if (ParseError)
X {
X fprintf(stderr, "twm: errors found in \"%s\", twm aborting\n",
X init_file);
X Done();
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * TwmInput - redefinition of the lex input routine
X *
X * Returned Value:
X * the next input character
X *
X ***********************************************************************
X */
X
Xchar
XTwmInput()
X{
X while (ptr == len)
X {
X if (fgets(buff, BUF_LEN, twmrc) == NULL)
X return NULL;
X
X yylineno++;
X
X ptr = 0;
X len = strlen(buff);
X }
X return (buff[ptr++]);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * TwmUnput - redefinition of the lex unput routine
X *
X * Inputs:
X * c - the character to push back onto the input stream
X *
X ***********************************************************************
X */
X
Xvoid
XTwmUnput(c)
X{
X buff[--ptr] = c;
X}
X
X/***********************************************************************
X *
X * Procedure:
X * TwmOutput - redefinition of the lex output routine
X *
X * Inputs:
X * c - the character to print
X *
X ***********************************************************************
X */
X
Xvoid
XTwmOutput(c)
X{
X putchar(c);
X}
SHAR_EOF
if test 4582 -ne "`wc -c < parse.c`"
then
echo shar: error transmitting "parse.c" '(should have been 4582 characters)'
fi
fi
# end of shell archive
exit 0