[comp.sources.games] v11i055: reve - an othello game, Part04/07

billr@saab.CNA.TEK.COM (Bill Randle) (11/02/90)

Submitted-by: Rich Burridge <rburridge@sun.COM>
Posting-number: Volume 11, Issue 55
Archive-name: reve/Part04
Environment: SunView, XView, X11, termcap


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 4 (of 7)."
# Contents:  images/reve.color.icon makemove.c patchlevel.h tty.c x11.c
# Wrapped by billr@saab on Thu Nov  1 14:02:51 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'images/reve.color.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'images/reve.color.icon'\"
else
echo shar: Extracting \"'images/reve.color.icon'\" \(14926 characters\)
sed "s/^X//" >'images/reve.color.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=8, Valid_bits_per_item=16
X */
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0501,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0105,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0500,0x0000,0x0002,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0505,0x0505,0x0505,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0205,
X	0x0502,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0205,0x0505,0x0505,0x0505,0x0505,0x0202,0x0201,
X	0x0202,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0205,
X	0x0502,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0205,0x0505,0x0505,0x0505,0x0505,0x0202,0x0201,
X	0x0202,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0205,
X	0x0502,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0505,0x0505,0x0505,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0205,
X	0x0502,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0501,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0105,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0505,0x0505,0x0505,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0205,0x0505,0x0505,0x0505,0x0505,0x0202,0x0201,
X	0x0202,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0505,0x0505,0x0505,0x0505,0x0505,0x0502,0x0201,
X	0x0202,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0205,0x0505,0x0505,0x0505,0x0505,0x0202,0x0201,
X	0x0202,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0505,0x0505,0x0505,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0501,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,
X	0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0101,0x0105,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0500,0x0000,0x0000,0x0000,0x0000,0x0502,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0205,0x0000,0x0000,0x0000,0x0005,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0500,0x0000,0x0000,0x0502,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0205,0x0505,0x0505,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0502,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0201,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0205,
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
X	0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,0x0505,
END_OF_FILE
if test 14926 -ne `wc -c <'images/reve.color.icon'`; then
    echo shar: \"'images/reve.color.icon'\" unpacked with wrong size!
fi
# end of 'images/reve.color.icon'
fi
if test -f 'makemove.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makemove.c'\"
else
echo shar: Extracting \"'makemove.c'\" \(3566 characters\)
sed "s/^X//" >'makemove.c' <<'END_OF_FILE'
X/*LINTLIBRARY*/
X
X/*  @(#)makemove.c 1.4 90/10/08
X *
X *  Interface to best computer strategy routines used by Reve.
X *
X *  Copyright (C) 1990 - Rich Burridge & Yves Gallot.
X *  All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  introductory messages are not removed, and no monies are exchanged.
X *
X *  You are forbidden from using Reve as is, or in a modified state, in
X *  any tournaments, without the permission of the authors.
X *
X *  No responsibility is taken for any errors on inaccuracies inherent
X *  either to the comments or the code of this program, but if reported
X *  (see README file), then an attempt will be made to fix them.
X */
X
X#include <stdio.h>
X#include "reve.h"
X#include "extern.h"
X
X
Xvalid_move(board, player)      /* Check if valid move for this player. */
XBOARD *board ;
Xint player ;
X{
X  int mv ;
X  int valid ;      /* Set if there is a valid move. */
X
X  for (mv = 0; mv < 64; mv++)
X    if (board->square[mv] == FREE)
X      {
X        valid = legal(mv, player, board) ;
X        if (valid == TRUE) return(TRUE) ;
X      }
X  return(FALSE) ;
X}
X
X
Xvoid
Xdomove(pos, mv, nextpos, player)
XBOARD *pos, *nextpos ;
Xint mv, player ;
X{
X  register int i ;
X  if (pos != nextpos) FOR_BOARD(i) nextpos->square[i] = pos->square[i] ;
X
X  s_move = mv ;
X  s_row = mv >> 3 ;
X  s_col = mv & 7 ;
X  s_player = player ;
X  s_opponent = -player ;
X  s_flip = TRUE ;
X  s_pos = nextpos ;
X
X  nextpos->square[s_move] = player ;
X
X  (void) sandwich(-9) ;
X  (void) sandwich(-8) ;
X  (void) sandwich(-7) ;
X  (void) sandwich(-1) ;
X  (void) sandwich(1) ;
X  (void) sandwich(7) ;
X  (void) sandwich(8) ;
X  (void) sandwich(9) ;
X
X  nextpos->moves_left = (pos->moves_left) - 1 ;
X}
X
X
Xlegal(mv, player, pos)
XBOARD *pos ;
Xint mv, player ;
X{
X  if (pos->square[mv]) return(FALSE) ;     /* Already occupied */
X
X  s_move = mv ;
X  s_row = mv >> 3 ;
X  s_col = mv & 7 ;
X  s_player = player ;
X  s_opponent = -player ;
X  s_flip = FALSE ;
X  s_pos = pos ;
X
X  return(sandwich(-9) || sandwich(-8) || sandwich(-7) || sandwich(-1) ||
X         sandwich(1)  || sandwich(7)  || sandwich(8)  || sandwich(9)) ;
X}
X
X
X/*  Test whether the square move sandwiches a line
X *  of enemy pieces in the direction [row_inc, col_inc];
X *  If (s_flip) then update position by capturing such pieces
X */
X
Xsandwich(increment)
Xregister int increment ;
X{
X  register int square,offset ;
X  int row_offset,col_offset,piece,piece_count ;
X
X  if (s_pos->square[s_move+increment] != s_opponent) return(FALSE) ;
X 
X/*  Quick test to catch most failures -
X *  note that the tested square may not even
X *  be on the board, but the condition is a
X *  sufficient one for failure.
X */
X 
X  row_offset = (increment < -1 ? s_row  :      /* inc -1: -9, -8, -7 */
X    increment >  1 ? 7-s_row : 8) ;            /* inc  1:  7,  8,  9 */
X  col_offset = (increment & 4 ? s_col   :      /* inc -1: -9, -1,  7 */
X    increment & 1 ? 7-s_col : 8) ;             /* inc  1: -7,  1,  9 */
X 
X  offset = (row_offset > col_offset ? col_offset : row_offset) ;
X
X/* offset = shortest distance to an edge in the direction of search */
X
X  if (2 > offset) return(FALSE) ;
X 
X  piece_count = 1 ;
X  square = s_move+increment ;
X 
X  while (--offset)
X    {
X      if (!(piece = s_pos->square[square += increment]))
X  return(FALSE) ;  /* If empty square, give up */
X 
X      if (piece == s_player) break ;
X      else piece_count++ ;      /* Count opponent's pieces encountered */
X    }
X
X  if (!offset) return(FALSE) ;
X
X  if (s_flip)
X    while (piece_count--)
X      s_pos->square[square -= increment] = s_player ;
X
X  return (TRUE) ;
X}
END_OF_FILE
if test 3566 -ne `wc -c <'makemove.c'`; then
    echo shar: \"'makemove.c'\" unpacked with wrong size!
fi
# end of 'makemove.c'
fi
if test -f 'patchlevel.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patchlevel.h'\"
else
echo shar: Extracting \"'patchlevel.h'\" \(698 characters\)
sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE'
X
X/*  @(#)patchlevel.h 1.9 90/10/20
X *
X *  This is the current patchlevel for this version of reve.
X *
X *  Copyright (C) 1990 - Rich Burridge & Yves Gallot.
X *  All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  introductory messages are not removed, and no monies are exchanged.
X *
X *  You are forbidden from using Reve as is, or in a modified state, in
X *  any tournaments, without the permission of the authors.
X *
X *  No responsibility is taken for any errors on inaccuracies inherent
X *  either to the comments or the code of this program, but if reported
X *  (see README file), then an attempt will be made to fix them.
X */
X
X#define  PATCHLEVEL  0
END_OF_FILE
if test 698 -ne `wc -c <'patchlevel.h'`; then
    echo shar: \"'patchlevel.h'\" unpacked with wrong size!
fi
# end of 'patchlevel.h'
fi
if test -f 'tty.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'tty.c'\"
else
echo shar: Extracting \"'tty.c'\" \(13742 characters\)
sed "s/^X//" >'tty.c' <<'END_OF_FILE'
X/*LINTLIBRARY*/
X
X/*  @(#)tty.c 1.6 90/10/20
X *
X *  These are the dumb tty dependent graphics routines used by reve.
X *
X *  Copyright (C) 1990 - Rich Burridge & Yves Gallot.
X *  All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  introductory messages are not removed, and no monies are exchanged.
X *
X *  You are forbidden from using Reve as is, or in a modified state, in
X *  any tournaments, without the permission of the authors.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if reported
X *  (see README file), then an attempt will be made to fix them.
X */
X
X#include <stdio.h>
X#include <strings.h>
X#include <sys/ioctl.h>
X#include <signal.h>
X
X#ifdef SYSV
X#include <sgtty.h>
X#endif /*SYSV*/
X
X#include "reve.h"
X#include "color.h"
X#include "extern.h"
X
X#define  DRAW_STRING(col, row, str, v)  draw_string(col, row, str, v), return
X
Xenum gr_type gtype = GTTY ;      /* Graphics type. */
X
X/* NOTE: This is a classic example of reverse engineering. These routines
X *       have been modified (read hacked), to use the same interface as
X *       the pixel graphics ones. Therefore they have to do some strange
X *       checking to make sure everything comes out correctly.
X */
X
Xchar *CE, *CL, *CM, *SE, *SO ;
X
Xchar *getenv(), *tgetstr(), *tgoto() ;
X
Xstruct sgttyb in_new, in_old ;
X
Xstatic void do_clr_eol(), do_standend(), do_standout(), draw_string() ;
Xstatic void get_event(),  outc(),        outstr(),      tc_move() ;
X
X/* Information for all the panel items. */
X
Xstruct tty_info {     /* Information for all the panel items. */
X  int column ;        /* Column number. */
X  int row ;           /* Row number. */
X  int x ;             /* Pseudo x mouse position. */
X  int y ;             /* Pseudo y mouse position. */
X} ;
X
Xstruct tty_info ttyvals[MAXITEMS] = {
X      {  1,  1,  33,  33, },      /* Last */
X      { 11,  1, 107,  33, },      /* Load */
X      { 22,  1, 167,  33, },      /* New game */
X      { 33,  1, 255,  33, },      /* Save */
X      { 44,  1, 318,  33, },      /* Suggest */
X      { 55,  1, 403,  33, },      /* Undo */
X      { -1, -1,  33,  75, },      /* Done   (not displayed). */
X      { -1, -1, 318,  75, },      /* Cancel (not displayed). */
X      { -1, -1, 403,  75, },      /* Quit   (not displayed). */
X      { 38,  5,  15, 114, },      /* Black: */
X      { 38,  7, 237, 114, },      /* White: */
X      { 38,  9,  15, 156, },      /* Difficuly: */
X      { 38, 11, 237, 156, },      /* Notes: */
X      { -1, -1,  -1,  -1, },      /* Panel message. */
X      { -1, -1,  -1,  -1, },      /* Notes message. */
X      { -1, -1,  -1,  -1, },      /* Score message. */
X      { -1, -1,  -1,  -1, },      /* Turn message. */
X} ;
X
Xstruct other_info {   /* Information needed to place other text values. */
X  int column ;        /* Column number. */
X  int row ;           /* Row number. */
X} ;
X
Xstruct other_info othervals[MAXITEMS] = {
X      { -1, -1, },       /* Last     (ignored). */
X      { -1, -1, },       /* Load     (ignored). */
X      { -1, -1, },       /* New game (ignored). */
X      { -1, -1, },       /* Save     (ignored). */
X      { -1, -1, },       /* Suggest  (ignored). */
X      { -1, -1, },       /* Undo     (ignored). */
X      { -1, -1, },       /* Done     (ignored). */
X      { -1, -1, },       /* Cancel   (ignored). */
X      { -1, -1, },       /* Quit     (ignored). */
X      { 60,  5, },       /* Black: */
X      { 60,  7, },       /* White: */
X      { 60,  9, },       /* Difficuly: */
X      { 60, 11, },       /* Notes: */
X      { 38, 13, },       /* Panel message. */
X      { 38, 15, },       /* Notes message. */
X      { 38, 17, },       /* Score message. */
X      { 38, 19, },       /* Turn message. */
X} ;
X
X
XSIGRET
Xcleanup()
X{
X  destroy_frame() ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xbatch(state)             /* Graphics batching - null routine. */
Xenum bltype state ;
X{}
X
X
Xvoid
Xclose_frame()           /* This option does nothing with termcap. */
X{}
X
X
X/*ARGSUSED*/
Xvoid
Xcolor_area(x, y, width, height, color)
Xint x, y, width, height, color ;
X{
X  char nextline[MAXLINE] ;
X
X/*  There are two cases we care about here:
X *
X *  (1) If the width is TOTAL_WIDTH and the height is TOTAL_HEIGHT, then
X *      we clear the whole of the screen. We also draw the board at this
X *      time. With the pixel based graphics versions, this is normally
X *      done by low-level graphics routines, but to fully emulate that is
X *      just too hard.
X *
X *  (2) When we are "undo"ing a piece. A check is made to if the width and
X *      the height of the area we are coloring is PSIZE. If so, then we
X *      display a space at the appropriately adjusted row/column.
X */
X
X  if (width == TOTAL_WIDTH && height == TOTAL_HEIGHT)
X    {
X      tputs(CL, 1, outc) ;
X      tc_move(4, 3) ;
X      outstr("a   b   c   d   e   f   g   h") ;
X      for (y = 4; y < 21; y++)
X        {
X          tc_move(1, y) ;
X          if (y % 2)
X            SPRINTF(nextline, "%c|   |   |   |   |   |   |   |   |%c",
X                              '1' + (y - 4) / 2, '1' + (y - 4) / 2) ;
X          else       SPRINTF(nextline, " +---+---+---+---+---+---+---+---+") ;
X          outstr(nextline) ;
X        }
X      tc_move(4, 21) ;
X      outstr("a   b   c   d   e   f   g   h") ;
X    }
X  else if (width == PSIZE && height == PSIZE)
X    {
X      tc_move(4 + 4 * (((x - BBORDER - PIECE_MARGIN) / CELL_SIZE) & 7),
X              5 + 2 * ((y - CY - BBORDER - PIECE_MARGIN) / CELL_SIZE)) ;
X      outc(' ') ;
X    }
X}
X
X
X/*ARGSUSED*/
Xvoid
Xcreate_menu(mtype, values)     /* Create popup menus - null routine. */
Xenum panel_type mtype ;
Xchar *values[] ;
X{}
X
X
Xvoid
Xdestroy_frame()       /* Destroy reve window. */
X{
X  tputs(CL, 1, outc) ;
X  SIGNAL(SIGINT, SIG_IGN) ;
X  IOCTL(0, TIOCSETP, &in_old) ;
X  exit(0) ;
X}
X
X
Xstatic void
Xdo_clr_eol()                  /* Clear to the end of the line. */
X{
X  tputs(CE, 1, outc) ;
X}
X
X
X/*ARGSUSED*/
Xdo_menu(mtype)                /* Popup appropriate menu - not used. */
Xenum panel_type mtype ;
X{
X  return 0 ;
X}
X
X
Xstatic void
Xdo_standend()                 /* Finish inverted area. */
X{
X  tputs(SE, 1, outc) ;
X}
X
X
Xstatic void
Xdo_standout()                 /* Start inverted area. */
X{
X  tputs(SO, 1, outc) ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xdraw_image(x, y, width, height, image)    /* Null routine. */
Xint x, y, width, height ;
Xenum image_type image ;
X{}
X
X
X/*ARGSUSED*/
Xvoid
Xdraw_line(x1, y1, x2, y2, op, color)
Xint x1, y1, x2, y2, color ;
Xenum optype op ;
X{
X  char ch ;
X
X/*  There is just one case we care about here; the "suggest" cross. To
X *  determine if this is such a case, we check if the two x values differ
X *  by 10, and the two y values differ by 10. If so, then a plus sign is
X *  output at the appropriate row/column, if the color is black, otherwise
X *  a space is output.
X */
X
X  if (abs(x1 - x2) == 10 && abs(y1 - y2) == 10)
X    {
X      ch = '+' ;
X      tc_move(4 + 4 * (((x1 - BBORDER - PIECE_MARGIN) / CELL_SIZE) & 7),
X              5 + 2 * ((y1 - CY - BBORDER - PIECE_MARGIN) / CELL_SIZE)) ;
X      if (color != C_BLACK) ch = ' ' ;
X      outc(ch) ;
X    }
X}
X
X
X/*ARGSUSED*/
Xvoid
Xdraw_stencil(x, y, width, height, op, color, stencil, image)
Xint x, y, width, height, color ;
Xenum optype op ;
Xenum image_type stencil, image ;
X{
X  int ch ;
X
X       if (image == P_BLACK) ch = 'X' ;
X  else if (image == P_WHITE) ch = 'O' ;
X  else return ;
X       if (op == RCLR) ch = ' ' ;
X  else if (op == RINV) return ;
X
X  tc_move(4 + 4 * (((x - BBORDER - PIECE_MARGIN) / CELL_SIZE) & 7),
X          5 + 2 * ((y - CY - BBORDER - PIECE_MARGIN) / CELL_SIZE)) ;
X  outc(ch) ;
X}
X
X
Xstatic void
Xdraw_string(x, y, str, flag)    /* Display str at x,y. */
Xint x,y, flag ;
Xchar *str ;
X{
X
X/*  If flag is set, then we clear to the end of line, otherwise we
X *  display the text str in reverse video.
X */
X
X  if (flag)
X    {
X      tc_move(x, y) ;
X      do_clr_eol() ;
X    }
X  else do_standout() ;
X
X  tc_move(x, y) ;
X  outstr(str) ;
X  if (!flag) do_standend() ;
X}
X
X
X/*  Text can be one of three things:
X *
X *  (1) Text for "panel" items.
X *  (2) Text for "cyclic" items.
X *  (3) Other text.
X *
X *  First we check to see if this is one of the panel message strings.
X *
X *  Next we check if this is a panel button or cycle types.
X *
X *  For all other text, we check where it is being displayed against
X *  a list of possible values. This is then remapped to the correct
X *  row/column number, and displayed.
X */
X
X/*ARGSUSED*/
Xvoid
Xdraw_text(x, y, ftype, color, str)
Xenum font_type ftype ;
Xint x, y, color ;
Xchar *str ;
X{
X  enum panel_type pt ;
X  int black, white ;
X  int i ;
X
X/* Check if we are inputting a load/save filename. */
X
X  if (x == 89  && y == 74)
X    {
X      draw_string(38, 3, str, TRUE) ;  /* File: */
X      return ;
X    }
X  else if (x == 136 && y == 74)
X    {
X      draw_string(45, 3, str, TRUE) ;  /* filename */
X      return ;
X    }
X
X/* Check for the four panel message types. */
X
X  else if (x == 15 && y == 195)        /* Panel message. */
X    {
X      if (EQUAL(str, "Use left"))
X        STRCPY(str, "Select a letter/number pair for a move") ;
X      draw_string(othervals[(int) PANEL_MES].column,
X                  othervals[(int) PANEL_MES].row, str, TRUE) ;
X      return ;
X    }
X  else if (x == 237 && y == 195)       /* Note message. */
X    {
X      draw_string(othervals[(int) NOTES_MES].column,
X                  othervals[(int) NOTES_MES].row, str, TRUE) ;
X      return ;
X    }
X  else if (x == 15 && y == 237)        /* Score message. */
X    {
X      if (sscanf(str, "Black: %d, White: %d", &black, &white) == 2)
X        SPRINTF(str, "Black (O): %d, White (X): %d", black, white) ;
X      draw_string(othervals[(int) SCORE_MES].column,
X                  othervals[(int) SCORE_MES].row, str, TRUE) ;
X      return ;
X    }
X  else if (x == 237 && y == 237)       /* Turn message. */
X    {
X      draw_string(othervals[(int) TURN_MES].column,
X                  othervals[(int) TURN_MES].row, str, TRUE) ;
X      return ;
X    }
X
X/* Check for panel and cyclic items. */
X
X  for (i = 0; i < MAXITEMS-4; i++)
X    if (EQUAL(str, items[i].text))
X      if (ttyvals[i].column != -1)
X        {
X               if (EQUAL(str, "load")) STRCPY(str, "Load") ;
X          else if (EQUAL(str, "save")) STRCPY(str, "Save") ;
X          draw_string(ttyvals[i].column, ttyvals[i].row, str, FALSE) ;
X          return ;
X        }
X      else return ;
X
X/* Other text. */
X
X  switch (y)
X    {
X      case 111  : if (x == 182) pt = BLACK_PLAYS ;      /* Black plays. */
X                  else          pt = WHITE_PLAYS ;      /* White plays. */
X                  break ;
X      case 153  : if (x == 182) pt = DIFFICULTY ;       /* Difficulty. */
X                  else          pt = NOTES ;            /* Notes. */
X                  break ;
X      default   : return ;   /* We're not interested in this piece of text. */
X    }
X  draw_string(othervals[(int) pt].column, othervals[(int) pt].row,
X              str, TRUE) ;
X}
X 
X 
Xstatic void
Xget_event()            /* Only events possible are keyboard ones. */
X{
X  char c ;
X
X  tc_move(0, 0) ;      /* Get that bloody cursor out of the way. */
X  READ(0, &c, 1) ;
X  cur_ch = c & 0177 ;
X}
X 
X 
X/*ARGSUSED*/
Xget_strwidth(ftype, str)    /* Get width in pixels of string value. */
Xenum font_type ftype ;
Xchar *str ;
X{
X  return(8) ;
X}
X
X
Xvoid
Xinit_fonts()             /* Open normal and bold fonts. */
X{
X  nfont_height = 12 ;    /* Fake the dimensions. */
X  bfont_height = 12 ;
X}
X
X
Xinit_ws_type()
X{
X  char bp[1024], termtype[MAXLINE] ;
X  static char buf[100] ;
X  char *area = buf ;
X
X  if (getenv("TERM") != NULL) STRCPY(termtype, getenv("TERM")) ;
X  if (tgetent(bp, termtype) != 1) return 1 ;
X  if ((CL = tgetstr("cl", &area)) == (char *) 0) return 1 ;
X  if ((CM = tgetstr("cm", &area)) == (char *) 0) return 1 ;
X  if ((CE = tgetstr("ce", &area)) == (char *) 0) return 1 ;
X  if ((SO = tgetstr("so", &area)) == (char *) 0) return 1 ;
X  if ((SE = tgetstr("se", &area)) == (char *) 0) return 1 ;
X  move_delta = 5 ;
X  cur_dpyno = DPY1 ;
X  return 0 ;
X}
X
X
Xstatic void
Xload_colors()     /* No colors in the termcap implementation. */
X{
X  iscolor[(int) cur_dpyno] = 0 ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xlock_screen(state)     /* Graphics locking - null routine. */
Xenum bltype state ;
X{}
X
X
Xvoid
Xmake_canvas()               /* Null routine, see the make_frame routine. */
X{}
X
X
X/*ARGSUSED*/
Xvoid
Xmake_frame(argc, argv)      /* Create reve window/icon. */
Xint argc ;
Xchar *argv[] ;
X{
X  SIGNAL(SIGINT, cleanup) ;
X  IOCTL(0, TIOCGETP, &in_old) ;        /* Setup standard input. */
X  in_new = in_old ;
X  in_new.sg_flags |= RAW ;
X  in_new.sg_flags &= ~(ECHO | CRMOD) ;
X  IOCTL(0, TIOCSETP, &in_new) ;
X  setbuf(stdout, (char *) NULL) ;
X}
X
X
Xvoid
Xmake_icon()             /* Null routine - no icon in termcap version. */
X{}
X
X
Xstatic void
Xoutc(c)                 /* Output the next character to the screen. */
Xregister int c ;
X{
X  PUTC(c, stdout) ;
X}
X
X
Xstatic void
Xoutstr(str)
Xchar *str ;
X{
X  register int i ;
X
X  for (i = 0; i < strlen(str); i++) PUTC(str[i], stdout) ;
X}
X
X
Xvoid
Xprocess_event()           /* Process the next user input. */
X{
X  if (cur_ch == 12) nextc = FRAME_REPAINT ;
X  else nextc = KEYBOARD ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xset_cursor(cursor)        /* No cursors in termcap version. */
Xenum curtype cursor ;
X{}
X
X
X/*ARGSUSED*/
Xvoid
Xstart_tool(dtype)            /* Display screen and start event dispatcher. */
Xenum disp_type dtype ;
X{
X  init_canvas() ;            /* Equivalent of a FRAME_REPAINT. */
X
X  for (;;)
X    {
X      get_event() ;          /* Get next canvas event. */
X      process_event() ;      /* Find out what kind it is. */
X      handle_event() ;       /* And do the apropriate action. */
X    }
X}
X
X
Xstatic void
Xtc_move(x, y)                 /* Move to character position (x, y). */
Xint x, y ;
X{
X  tputs(tgoto(CM, x, y), 1, outc) ;
X}
END_OF_FILE
if test 13742 -ne `wc -c <'tty.c'`; then
    echo shar: \"'tty.c'\" unpacked with wrong size!
fi
# end of 'tty.c'
fi
if test -f 'x11.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'x11.c'\"
else
echo shar: Extracting \"'x11.c'\" \(22002 characters\)
sed "s/^X//" >'x11.c' <<'END_OF_FILE'
X/*LINTLIBRARY*/
X
X/*  @(#)x11.c 1.7 90/10/18
X *
X *  X11 dependent graphics routines used by reve.
X *
X *  Copyright (c) 1990 - Rich Burridge & Yves Gallot.
X *  All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  introductory messages are not removed, and no monies are exchanged.
X *
X *  You are forbidden from using Reve as is, or in a modified state, in
X *  any tournaments, without the permission of the authors.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if reported
X *  (see README file), then an attempt will be made to fix them.
X */
X
X#include <stdio.h>
X#include <strings.h>
X#include <sys/time.h>
X#include "reve.h"
X#include "color.h"
X#include "extern.h"
X#include "images.h"
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <X11/Xatom.h>
X#include <X11/cursorfont.h>
X
X#define  BOLDFONT    "lucidasanstypewriter-bold-12"
X#define  DEFFONT     "fixed"
X#define  NORMALFONT  "lucidasanstypewriter-12"
X
X#define  FRAME_MASK  (ButtonPressMask | ButtonReleaseMask | ExposureMask    | \
X                      EnterWindowMask | KeyPressMask      | LeaveWindowMask | \
X                      PointerMotionMask)
X
X#define  OTHELLO_BORDER_WIDTH  2
X
Xenum gr_type gtype = GX11 ;        /* Graphics type. */
X
Xstatic void get_event(), init_X() ;
Xstatic int process_expose() ;
X
XAtom protocol_atom[MAXDPY], kill_atom[MAXDPY] ;
XCursor cursor[MAXCURSORS] ;
XDisplay *dpy[MAXDPY], *open_display() ;
XGC gc[MAXDPY] ;                 /* Graphics context for text and lines. */
XGC ropgc[MAXDPY] ;              /* Graphics context for rops. */
XGC stencilgc[MAXDPY] ;          /* Graphics context for stencils. */
XPixmap images[MAXIMAGES] ;
XPixmap no_pixmap ;
XPixmap load_color_icon(), load_image(), reve_icon ;
XWindow frame[MAXDPY], root[MAXDPY] ;
XXClassHint class_hint = { "reve", "Reve" } ;
XXColor BGcolor, FGcolor ;
XXEvent event ;
XXFontStruct *font[MAXFONTS] ;
XXSizeHints size ;
XXWMHints wm_hints ;
XXGCValues gc_val ;              /* Used to setup graphics context values. */
Xint cmap_loaded ;               /* Set if we've already loaded the colormap. */
Xint gc_flags ;                  /* Used to set up graphics context flags. */
Xint screen[MAXDPY] ;            /* Default graphics display screen. */
Xint xfd[MAXDPY] ;               /* Server connection file descriptors. */
Xunsigned long backgnd[MAXDPY] ; /* Default background color. */
Xunsigned long foregnd[MAXDPY] ; /* Default foreground color. */
Xunsigned long gc_mask ;         /* Mask for setting graphic context values. */
Xunsigned long palette[OTH_COLORSIZE] ;     /* Xlib color palette. */
X
X#ifndef NOSELECT
X#ifdef NO_43SELECT
Xint fullmask ;               /* Full mask of file descriptors to check on. */
Xint readmask ;               /* Readmask used in select call. */
X#else
Xfd_set fullmask ;            /* Full mask of file descriptors to check on. */
Xfd_set readmask ;            /* Readmask used in select call. */
X#endif /*NO_43SELECT*/
X#endif /*NOSELECT*/
X
X/*  256-byte table for quickly reversing the bits in an unsigned 8-bit char,
X *  used to convert between MSBFirst and LSBFirst image formats.
X */
X
Xchar revtable[256] = {
X        0, -128,   64,  -64,   32,  -96,   96,  -32,
X       16, -112,   80,  -48,   48,  -80,  112,  -16,
X        8, -120,   72,  -56,   40,  -88,  104,  -24,
X       24, -104,   88,  -40,   56,  -72,  120,   -8,
X        4, -124,   68,  -60,   36,  -92,  100,  -28,
X       20, -108,   84,  -44,   52,  -76,  116,  -12,
X       12, -116,   76,  -52,   44,  -84,  108,  -20,
X       28, -100,   92,  -36,   60,  -68,  124,   -4,
X        2, -126,   66,  -62,   34,  -94,   98,  -30,
X       18, -110,   82,  -46,   50,  -78,  114,  -14,
X       10, -118,   74,  -54,   42,  -86,  106,  -22,
X       26, -102,   90,  -38,   58,  -70,  122,   -6,
X        6, -122,   70,  -58,   38,  -90,  102,  -26,
X       22, -106,   86,  -42,   54,  -74,  118,  -10,
X       14, -114,   78,  -50,   46,  -82,  110,  -18,
X       30,  -98,   94,  -34,   62,  -66,  126,   -2,
X        1, -127,   65,  -63,   33,  -95,   97,  -31,
X       17, -111,   81,  -47,   49,  -79,  113,  -15,
X        9, -119,   73,  -55,   41,  -87,  105,  -23,
X       25, -103,   89,  -39,   57,  -71,  121,   -7,
X        5, -123,   69,  -59,   37,  -91,  101,  -27,
X       21, -107,   85,  -43,   53,  -75,  117,  -11,
X       13, -115,   77,  -51,   45,  -83,  109,  -19,
X       29,  -99,   93,  -35,   61,  -67,  125,   -3,
X        3, -125,   67,  -61,   35,  -93,   99,  -29,
X       19, -109,   83,  -45,   51,  -77,  115,  -13,
X       11, -117,   75,  -53,   43,  -85,  107,  -21,
X       27, -101,   91,  -37,   59,  -69,  123,   -5,
X        7, -121,   71,  -57,   39,  -89,  103,  -25,
X       23, -105,   87,  -41,   55,  -73,  119,   -9,
X       15, -113,   79,  -49,   47,  -81,  111,  -17,
X       31,  -97,   95,  -33,   63,  -65,  127,   -1,
X} ;
X
Xint opvals[3] ;              /* Pixrect rasterop values. */
Xunsigned int scr_depth[MAXDPY] ;
X
X
X/*ARGSUSED*/
Xvoid
Xbatch(state)     /* Turn graphics batching on or off. */
Xenum bltype state ;
X{
X  XFlush(dpy[(int) cur_dpyno]) ;
X}
X
X
Xvoid
Xclose_frame()            /* Iconise reve window. */
X{
X  int d ;
X  XEvent event ;
X
X  d = (int) cur_dpyno ;
X  iconic = 1 ;
X  event.xclient.type = ClientMessage ;
X  event.xclient.display = dpy[d] ;
X  event.xclient.window = frame[d] ;
X  event.xclient.message_type = XInternAtom(dpy[d], "WM_CHANGE_STATE", False) ;
X  event.xclient.format = 32 ;
X  event.xclient.data.l[0] = IconicState ;
X  XSendEvent(dpy[d], DefaultRootWindow(dpy[d]), False,
X              SubstructureRedirectMask | SubstructureNotifyMask, &event) ;
X}
X
X
Xvoid
Xcolor_area(x, y, width, height, color)
Xint x, y, width, height, color ;
X{
X  int d ;
X
X  d = (int) cur_dpyno ;
X  if (iscolor[d]) gc_val.foreground = palette[color] ;
X  else
X    { 
X      if (color == C_WHITE) gc_val.foreground = backgnd[d] ;
X      else                  gc_val.foreground = foregnd[d] ;
X    }
X  gc_val.function = GXcopy ;
X  XChangeGC(dpy[d], gc[d], GCForeground | GCFunction, &gc_val) ;
X  XFillRectangle(dpy[d], frame[d], gc[d], x, y,
X                 (unsigned int) width, (unsigned int) height) ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xcreate_menu(mtype, values)    /* Create the various popup menus. */
Xenum panel_type mtype ;
Xchar *values[] ;
X{}
X
X
Xvoid
Xdestroy_frame()          /* Destroy reve window. */
X{
X  XDestroyWindow(dpy[(int) cur_dpyno], frame[(int) cur_dpyno]) ;
X}
X
X
X/*ARGSUSED*/
Xdo_menu(mtype)          /* Display popup menu for cyclic item. */
Xenum item_type mtype ;
X{
X  return(0) ;
X}
X
X
Xvoid
Xdraw_image(x, y, width, height, image)
Xint x, y, width, height ;
Xenum image_type image ;
X{
X  int d ;
X
X  d = (int) cur_dpyno ;
X  gc_mask = GCStipple | GCTileStipXOrigin | GCTileStipYOrigin ;
X  gc_val.stipple = images[(int) image] ;
X  gc_val.ts_x_origin = x ;
X  gc_val.ts_y_origin = y ;
X  XChangeGC(dpy[d], ropgc[d], gc_mask, &gc_val) ;
X  XFillRectangle(dpy[d], frame[d], ropgc[d], x, y, width, height) ;
X}
X
X
Xvoid
Xdraw_line(x1, y1, x2, y2, op, color)
Xint x1, y1, x2, y2, color ;
Xenum optype op ;
X{
X  int d ;
X
X  d = (int) cur_dpyno ;
X  if (iscolor[d]) gc_val.foreground = palette[color] ;
X  else            gc_val.foreground = foregnd[d] ;
X  gc_val.function = opvals[(int) op] ;
X  XChangeGC(dpy[d], gc[d], GCForeground | GCFunction, &gc_val) ;
X  XDrawLine(dpy[d], frame[d], gc[d], x1, y1, x2, y2) ;
X}
X
X
Xvoid
Xdraw_stencil(x, y, width, height, op, color, stencil, image)
Xint x, y, width, height, color ;
Xenum optype op ;
Xenum image_type stencil, image ;
X{
X  int d ;
X
X  d = (int) cur_dpyno ;
X  if (iscolor[d]) gc_val.foreground = palette[color] ;
X  else            gc_val.foreground = foregnd[d] ;
X  gc_val.function = opvals[(int) op] ;
X  gc_val.clip_x_origin = x ;
X  gc_val.clip_y_origin = y ;
X  gc_val.clip_mask = images[(int) stencil] ;
X  gc_val.stipple = images[(int) image] ;
X  gc_val.ts_x_origin = x ;
X  gc_val.ts_y_origin = y ;
X  gc_mask = GCForeground | GCFunction | GCClipMask |
X            GCClipXOrigin | GCClipYOrigin |
X            GCStipple | GCTileStipXOrigin | GCTileStipYOrigin ;
X  XChangeGC(dpy[d], stencilgc[d], gc_mask, &gc_val) ;
X  XFillRectangle(dpy[d], frame[d], stencilgc[d], x, y, width, height) ;
X}
X
X
Xvoid
Xdraw_text(x, y, ftype, color, str)
Xenum font_type ftype ;
Xint x, y, color ;
Xchar *str ;
X{
X  int d ;
X
X  d = (int) cur_dpyno ;
X  if (iscolor[d]) gc_val.foreground = palette[color] ;
X  else
X    { 
X      if (color == C_WHITE) gc_val.foreground = backgnd[d] ;
X      else                  gc_val.foreground = foregnd[d] ;
X    }
X  gc_val.font = font[(int) ftype]->fid ;
X  gc_val.function = GXcopy ;
X  XChangeGC(dpy[d], gc[d], GCFont | GCForeground | GCFunction, &gc_val) ;
X  XDrawString(dpy[d], frame[d], gc[d], x, y, str, strlen(str)) ;
X}
X 
X 
Xstatic void
Xget_event()         /* Get the next canvas event. */
X{
X  int d ;
X
X  d = (int) cur_dpyno ;
X  XFlush(dpy[d]) ;
X  if (!XCheckMaskEvent(dpy[d], ExposureMask, &event))
X    XNextEvent(dpy[d], &event) ;
X}
X
X
XXFontStruct *
Xget_font(name)
Xchar *name ;
X{
X  XFontStruct *f ;
X
X  if (!(f = XLoadQueryFont(dpy[0], name)))
X    if (!(f = XLoadQueryFont(dpy[0], DEFFONT)))
X      {
X        FPRINTF(stderr, "%s: couldn't get the default font.", progname) ;
X        exit(1) ;
X      }
X  return(f) ;
X}
X
X
Xget_strwidth(ftype, str)    /* Get width in pixels of string value. */
Xenum font_type ftype ;
Xchar *str ;
X{
X  return(XTextWidth(font[(int) ftype], str, strlen(str))) ;
X}
X
X
Xstatic void
Xinit_X(dpyno, dtype)
Xenum dpy_type dpyno ;
Xenum disp_type dtype ;
X{
X  int d ;
X
X  d = (int) dpyno ;
X  if (dtype == XBLACK || dtype == XBOTH)
X    dpy[d] = open_display(dpyno, black_dpy) ;
X  else dpy[d] = open_display(dpyno, white_dpy) ;
X
X  screen[d] = DefaultScreen(dpy[d]) ;
X  root[d] = RootWindow(dpy[d], screen[d]) ;
X
X  if (!geometry[d])
X    STRCPY(geometry[d], XGetDefault(dpy[d], progname, "Geometry")) ;
X
X  foregnd[d] = BlackPixel(dpy[d], screen[d]) ;
X  backgnd[d] = WhitePixel(dpy[d], screen[d]) ;
X  scr_depth[d] = DefaultDepth(dpy[d], screen[d]) ;
X}
X
X
Xvoid
Xinit_fonts()             /* Open the normal and bold fonts. */
X{
X  font[(int) BFONT] = get_font(BOLDFONT) ;
X  font[(int) NFONT] = get_font(NORMALFONT) ;
X  bfont_height = font[(int) BFONT]->max_bounds.ascent +
X                 font[(int) BFONT]->max_bounds.descent ;
X  nfont_height = font[(int) NFONT]->max_bounds.ascent +
X                 font[(int) NFONT]->max_bounds.descent ;
X}
X
X
Xinit_ws_type()
X{
X#ifndef NOSELECT
X#ifdef NO_43SELECT
X  fullmask = 0 ;
X#else
X  FD_ZERO(&fullmask) ;
X#endif /*NO_43SELECT*/
X#endif /*NOSELECT*/
X
X  if (dtype == XTWO)
X    {
X      init_X(DPY1, XBLACK) ;
X      init_X(DPY2, XWHITE) ;
X    }
X  else init_X(DPY1, dtype) ;
X  cmap_loaded = 0 ;
X  move_delta = 10 ;
X
X  images[(int) BUT_STENCIL] = load_image(button_stencil_image) ;
X  images[(int) BUT_INVERT]  = load_image(button_invert_image) ;
X  images[(int) BUT_NORMAL]  = load_image(button_normal_image) ;
X  images[(int) CY_NORMAL]   = load_image(cycle_glyph_image) ;
X  images[(int) CY_STENCIL]  = load_image(cycle_stencil_image) ;
X  images[(int) CY_LINVERT]  = load_image(cycle_linvert_image) ;
X  images[(int) CY_RINVERT]  = load_image(cycle_rinvert_image) ;
X  images[(int) P_WHITE]     = load_image(white_image) ;
X  images[(int) P_BLACK]     = load_image(black_image) ;
X
X  cursor[(int) CANVASCUR] = XCreateFontCursor(dpy[0], XC_top_left_arrow) ;
X  cursor[(int) HOURGLASS] = XCreateFontCursor(dpy[0], XC_watch) ;
X  no_pixmap = XCreateBitmapFromData(dpy[0], root[0],
X                                    (char *) nocur_image, 16, 16) ;
X  cursor[(int) NOCURSOR]  = XCreatePixmapCursor(dpy[0], no_pixmap, no_pixmap,
X                                                &FGcolor, &BGcolor, 0, 0) ;
X  return 0 ;
X}
X
X
Xstatic void
Xload_colors()     /* Create and load reve color map. */
X{
X  XColor ccol ;
X  u_char red[OTH_COLORSIZE], green[OTH_COLORSIZE], blue[OTH_COLORSIZE] ;
X  int d, i, numcolors ;
X
X  if (cmap_loaded) return ;
X  d = (int) cur_dpyno ;
X  iscolor[d] = 0 ;
X  if (DisplayCells(dpy[d], screen[d]) > 2)
X    {
X      oth_colorsetup(red, green, blue) ;
X      iscolor[d] = 1 ;
X      numcolors = 0 ;
X      for (i = 0; i < OTH_COLORSIZE; i++)
X        {
X          ccol.flags = DoRed | DoGreen | DoBlue ;
X          ccol.red   = (unsigned short) (red[i]   << 8) ;
X          ccol.green = (unsigned short) (green[i] << 8) ;
X          ccol.blue  = (unsigned short) (blue[i]  << 8) ;
X          if (XAllocColor(dpy[d],
X              DefaultColormap(dpy[d], screen[d]), &ccol) == True)
X            palette[numcolors++] = ccol.pixel ;
X        }
X      if (numcolors < 2)
X        {
X          FPRINTF(stderr, "%s: cannot allocate colors.\n", progname) ;
X          exit(1) ;
X        }
X      cmap_loaded = 1 ;
X    }
X}
X
X
XPixmap
Xload_color_icon(sbuf)
Xunsigned short sbuf[] ;
X{
X  GC pix_gc ;
X  Pixmap pixmap ;
X  XImage *image ;
X  char cbuf[512*8] ;
X  int d, i ;
X
X  d = (int) cur_dpyno ;
X  for (i = 0; i < (256*8); i++)
X    {
X      cbuf[i*2+0] = palette[(sbuf[i] >> 8) & 0xFF] ;
X      cbuf[i*2+1] = palette[sbuf[i] & 0xFF] ;
X    }
X  pix_gc = DefaultGC(dpy[d], screen[d]) ;
X  image = XCreateImage(dpy[d], DefaultVisual(dpy[d], screen[d]),
X                       scr_depth[d], ZPixmap, 0, cbuf, 64, 64, 8, 64) ;
X  pixmap = XCreatePixmap(dpy[d], root[d],
X                         ICONWIDTH, (unsigned) image->height, scr_depth[d]) ;
X  XPutImage(dpy[d], pixmap, pix_gc, image, 0, 0, 0, 0,
X            ICONWIDTH, (unsigned) image->height) ;
X  return(pixmap) ;
X}
X
X
XPixmap
Xload_image(sbuf)
Xunsigned short sbuf[256] ;
X{
X  char cbuf[512] ;
X  int i ;
X
X  for (i = 0; i < 256; i++)
X    {
X      cbuf[i*2+0] = revtable[(sbuf[i] >> 8) & 0xFF] ;
X      cbuf[i*2+1] = revtable[sbuf[i] & 0xFF] ;
X    }
X  return(XCreateBitmapFromData(dpy[(int) cur_dpyno], root[(int) cur_dpyno],
X                               cbuf, 64, 64)) ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xlock_screen(state)     /* Turn graphics locking on or off - null routine. */
Xenum bltype state ;
X{}
X
X
Xvoid
Xmake_canvas() {}            /* Null routine, see the make_frame routine. */
X
X
Xvoid
Xmake_frame(argc, argv)      /* Create reve window/icon. */
Xint argc ;
Xchar *argv[] ;
X{
X  unsigned int h, w ;       /* Window dimensions. */
X  int d, flags ;
X  int x, y ;                /* Window position. */
X
X  d = (int) cur_dpyno ;
X  opvals[(int) RCLR] = GXclear ;
X  opvals[(int) RSRC] = GXcopy ;
X  opvals[(int) RINV] = GXxor ;
X
X  load_colors() ;
X  if (iscolor[d]) reve_icon = load_color_icon(cicon_image) ;
X  else            reve_icon = load_image(icon_image) ;
X
X  size.flags = PMinSize | PMaxSize | PPosition | PSize ;
X  size.x = 0 ;
X  size.y = 0 ;
X  size.max_width = size.min_width = size.width = TOTAL_WIDTH ;
X  size.max_height = size.min_height = size.height = TOTAL_HEIGHT ;
X
X  if (strlen(geometry[d]))
X    {
X      flags = XParseGeometry(geometry[d], &x, &y, &w, &h) ;
X      if (XValue & flags)
X        {
X          if (XNegative & flags)
X            x = DisplayWidth(dpy[d], screen[d]) + x - size.width ;
X            size.flags |= USPosition ;
X            size.x = x ;
X        }
X      if (YValue & flags)
X        {
X          if (YNegative & flags)
X            y = DisplayHeight(dpy[d], screen[d]) + y - size.height ;
X            size.flags |= USPosition ;
X            size.y = y ;
X        }
X    }
X
X  frame[d] = XCreateSimpleWindow(dpy[d], root[d],
X                                 size.x, size.y, size.width, size.height,
X                                 OTHELLO_BORDER_WIDTH, foregnd[d], backgnd[d]) ;
X
X  protocol_atom[d] = XInternAtom(dpy[d], "WM_PROTOCOLS", False) ;
X  kill_atom[d]     = XInternAtom(dpy[d], "WM_DELETE_WINDOW", False) ;
X         
X  XSetStandardProperties(dpy[d], frame[d], "reve", NULL, reve_icon,
X                         argv, argc, &size) ;
X
X  wm_hints.icon_x = ix ;
X  wm_hints.icon_y = iy ;
X  wm_hints.input = True ;
X  wm_hints.icon_pixmap = reve_icon ;
X  wm_hints.flags = InputHint | IconPixmapHint ;
X  if (iconic)
X    {    
X      wm_hints.initial_state = IconicState ;
X      wm_hints.flags |= StateHint ;
X    }    
X  XSetWMHints(dpy[d], frame[d], &wm_hints) ;
X         
X/* Set XA_WM_CLASS so things that depend on NAME work. */
X
X  XSetClassHint(dpy[d], frame[d], &class_hint) ;
X
X  gc_mask = GCForeground | GCBackground | GCGraphicsExposures ;
X  gc_val.foreground = foregnd[d] ;
X  gc_val.background = backgnd[d] ;
X  gc_val.graphics_exposures = False ;
X  gc[d] = XCreateGC(dpy[d], root[d], gc_mask, &gc_val) ;
X
X  ropgc[d] = XCreateGC(dpy[d], root[d], gc_mask, &gc_val) ;
X  XSetFillStyle(dpy[d], ropgc[d], FillStippled) ;
X
X  stencilgc[d] = XCreateGC(dpy[d], root[d], gc_mask, &gc_val) ;
X  XSetFillStyle(dpy[d], stencilgc[d], FillOpaqueStippled) ;
X}
X
X
Xvoid
Xmake_icon() {}        /* Null routine - icon created in make_frame. */
X
X
XDisplay *
Xopen_display(dpyno, display)   /* Establish a connection to a display server. */
Xenum dpy_type dpyno ;
Xchar *display ;
X{
X  int d ;
X  Display *dpy ;
X
X  d = (int) dpyno ;
X  if ((dpy = XOpenDisplay(display)) == NULL)
X    {
X      FPRINTF(stderr,"%s: Couldn't open display %s\n", progname, display) ;
X      exit(1) ;
X    }
X
X  xfd[d] = ConnectionNumber(dpy) ;
X
X#ifndef NOSELECT
X#ifdef NO_43SELECT
X  fullmask |= (1 << xfd[d]) ;
X#else
X  FD_SET(xfd[d], &fullmask) ;
X#endif /*NO_43SELECT*/
X#endif /*NOSELECT*/
X
X  return(dpy) ;
X}
X
X
Xvoid
Xprocess_event()         /* Determine event type. */
X{
X  XClientMessageEvent *ev ;
X  XKeyPressedEvent *key_event ;
X  char chs[2] ;
X  int d ;
X
X  d = (int) cur_dpyno ; 
X  switch (event.type)
X    {
X      case ClientMessage    : /* Catch ICCCM kill from WM. */
X
X                              ev = (XClientMessageEvent *) &event ;
X                              if (ev->message_type == protocol_atom[d] &&
X                                  ev->data.l[0] == kill_atom[d])
X                                exit(0) ;
X                              nextc = IGNORE_EVENT ;
X                              break ;
X      case Expose           : nextc = process_expose((XExposeEvent *) &event) ;
X                              break ;
X      case KeyPress         : key_event = (XKeyPressedEvent *) &event ;
X                              curx = key_event->x ;
X                              cury = key_event->y ;
X                              (void) XLookupString(key_event, chs, 1,
X                                                   (KeySym *)  NULL,
X                                                   (XComposeStatus *) NULL) ;
X                              cur_ch = chs[0] ;
X                              nextc = KEYBOARD ;
X                              break ;
X      case EnterNotify      : nextc = ENTER_WINDOW ;
X                              break ;
X      case LeaveNotify      : nextc = EXIT_WINDOW ;
X                              break ;
X      case MotionNotify     : nextc = MOUSE_MOVING ;
X                              curx = event.xbutton.x ;
X                              cury = event.xbutton.y ;
X                              break ;
X      case ButtonPress      : curx = event.xbutton.x ;
X                              cury = event.xbutton.y ;
X                              if (event.xbutton.button == Button1)
X                                nextc = LEFT_DOWN ;
X                              else if (event.xbutton.button == Button2)
X                                nextc = MIDDLE_DOWN ;
X                              else if (event.xbutton.button == Button3)
X                                nextc = RIGHT_DOWN ;
X                              break ;
X      case ButtonRelease    : curx = event.xbutton.x ;
X                              cury = event.xbutton.y ;
X                              if (event.xbutton.button == Button1)
X                                nextc = LEFT_UP ;
X                              else if (event.xbutton.button == Button2)
X                                nextc = MIDDLE_UP ;
X                              else if (event.xbutton.button == Button3)
X                                nextc = RIGHT_UP ;
X    }
X}
X
X
Xstatic
Xprocess_expose(event)
XXExposeEvent *event ;
X{
X  int d ;
X  int doframe = 0 ;
X
X  d = (int) cur_dpyno ;
X  do
X    if (event->count == 0 && event->window == frame[(int) cur_dpyno])
X      doframe++ ;
X  while (XCheckMaskEvent(dpy[d], ExposureMask, (XEvent *) event)) ;
X
X  return(doframe ? FRAME_REPAINT : IGNORE_EVENT) ;
X}
X
X
Xvoid
Xset_cursor(ctype)
Xenum curtype ctype ;
X{
X  int d ;
X
X  d = (int) cur_dpyno ;
X  XDefineCursor(dpy[d], frame[d], cursor[(int) ctype]) ;
X  XFlush(dpy[d]) ;
X}
X
X
Xvoid
Xstart_tool(dtype)            /* Start event dispatcher and display. */
Xenum disp_type dtype ;
X{
X  XSelectInput(dpy[0], frame[0], FRAME_MASK) ;
X  XMapWindow(dpy[0], frame[0]) ;
X
X  if (dtype == XTWO)
X    {
X      XSelectInput(dpy[1], frame[1], FRAME_MASK) ;
X      XMapWindow(dpy[1], frame[1]) ;
X    }
X
X  if (dtype == XTWO) Xselect_input() ;
X  else               Xnext_input() ;
X}
X
X
XXnext_input()
X{
X  for (;;)
X    {
X      get_event() ;          /* Get next canvas event. */
X      process_event() ;      /* Find out what kind it is. */
X      handle_event() ;       /* And do the apropriate action. */
X    }
X}
X
X
XXselect_input()
X{
X  int fd = -1 ;              /* File descriptor with this event. */
X  struct timeval tval ;      /* To set checking period. */
X
X  tval.tv_usec = 0 ;
X  tval.tv_sec = 0 ;
X
X  for (;;)
X    {
X      XSync(dpy[0], 0) ;
X      if (dtype == XTWO) XSync(dpy[1], 0) ;
X
X#ifdef NOSELECT
X      fd = 0 ;
X#else
X      fd = -1 ;
X      readmask = fullmask ;
X#ifdef NO_43SELECT
X      SELECT(32, &readmask, 0, 0, &tval) ;
X           if (readmask && (1 << xfd)[0]) fd = 0 ;
X      else if (readmask && (1 << xfd)[1]) fd = 1 ;
X#else
X      SELECT(FD_SETSIZE, &readmask, (fd_set *) 0, (fd_set *) 0, &tval) ;
X           if (FD_ISSET(xfd[0], &readmask)) fd = 0 ;
X      else if (FD_ISSET(xfd[1], &readmask)) fd = 1 ;
X#endif /*NO_43SELECT*/
X#endif /*NOSELECT*/
X 
X      if (fd >= 0)
X        {
X          cur_dpyno = (enum dpy_type) fd ;
X          do
X            {
X              get_event() ;            /* Get next canvas event. */
X              process_event() ;        /* Find out what kind it is. */
X              handle_event() ;         /* And do appropriate action. */
X            }             
X          while (XPending(dpy[fd])) ;
X        }
X    }
X}
END_OF_FILE
if test 22002 -ne `wc -c <'x11.c'`; then
    echo shar: \"'x11.c'\" unpacked with wrong size!
fi
# end of 'x11.c'
fi
echo shar: End of archive 4 \(of 7\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 7 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0