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