[comp.sources.x] v04i006: Dragon, Patch1

argv@island.uu.net (Dan Heller) (05/24/89)

Submitted-by: Gary Barnes <uunet!igor!amber!geb>
Posting-number: Volume 4, Issue 6
Archive-name: Dragon/patch1 (Part2)

*** ../dragon/Imakefile	Tue May 23 00:05:20 1989
--- Imakefile	Mon May 22 23:55:26 1989
***************
*** 1,7 ****
!            SRCS = main.c board.c button.c icon.c tile.c tile_bits.c
!            OBJS = main.o board.o button.o icon.o tile.o tile_bits.o
         PROGRAMS = dragon
!         DEFINES =
         INCLUDES = 
    SYS_LIBRARIES = -lXaw -lXmu -lXt -lX11
  
--- 1,8 ----
!            SRCS = main.c board.c button.c draw.c icon.c tile.c tile_bits.c
!            OBJS = main.o board.o button.o draw.o icon.o tile.o tile_bits.o
         PROGRAMS = dragon
!        LINTOPTS = -uxz
!         DEFINES = -DWANTDEBUG
         INCLUDES = 
    SYS_LIBRARIES = -lXaw -lXmu -lXt -lX11
  
***************
*** 13,19 ****
--- 14,27 ----
          $(USRLIBDIR)/libXt.a \
          $(USRLIBDIR)/libX11.a
  
+ lint:
+ 	$(LINT) $(LINTFLAGS) $(SRCS)
+ 
  MakeBug:
  	cp Makefile MakeBug.bak
  	make -f MakeBug.bak Makefile
  	rm MakeBug.bak
+ 
+ tar:
+ 	tar cf - . > ../dragon.tar
+ 	compress -v ../dragon.tar
*** ../dragon/Makefile	Tue May 23 00:05:21 1989
--- Makefile	Mon May 22 23:55:28 1989
***************
*** 1,4 ****
!             TOP = /usr/src/X11R3
          UTILSRC = $(TOP)/util
         IMAKESRC = $(UTILSRC)/imake
            IMAKE = $(IMAKESRC)/imake
--- 1,4 ----
!             TOP = /src/x
          UTILSRC = $(TOP)/util
         IMAKESRC = $(UTILSRC)/imake
            IMAKE = $(IMAKESRC)/imake
*** ../dragon/README	Tue May 23 00:03:36 1989
--- README	Mon May 22 23:55:30 1989
***************
*** 1,9 ****
! 04/19/89
  
  Dragon is a game.  It implements a version of the ancient game of Mah-Jongg.
  
! Dragon is known to work on a Sun 3/60 running SunOS 3.5 with X11R3 from MIT.
! It compiles with the Sun compiler and with gcc version 1.31.
  
  As of this writing, the Athena Dialog widget has a bug that can cause Dragon
  to get a segmentation/memory error.  There is code in X11R3/lib/Xaw/Dialog.c
--- 1,24 ----
! 05/18/89
  
  Dragon is a game.  It implements a version of the ancient game of Mah-Jongg.
  
! Dragon is known to work on a Sun 3/60 running SunOS 3.5 with X11R3 from
! MIT.  It compiles with the Sun compiler and with gcc version 1.31.
! 
! I have been told that the current version (this one right here) runs
! correctly on monochrome, gray-scale, and color DEC equipment.  Presumably
! it will run correctly on most servers at this point.
! 
! Dragon is a "monochrome" application; it uses two colors; the default
! "foreground" color and the default "background" color as defined and
! determined by the X Toolkit.
! 
! If you do a "make all" initially then the Makefile will be rebuilt using
! the MIT imake program.  If you do not have the MIT imake program (or don't
! want to use it) then rename the Makefile.Canned file to be Makefile and
! hand-edit it for use at your site.
! 
! 04/19/89
  
  As of this writing, the Athena Dialog widget has a bug that can cause Dragon
  to get a segmentation/memory error.  There is code in X11R3/lib/Xaw/Dialog.c
*** ../dragon/button.c	Tue May 23 00:04:00 1989
--- button.c	Mon May 22 23:55:36 1989
***************
*** 4,9 ****
--- 4,12 ----
  * Author: Gary E. Barnes	March 1989
  *
  * button.c - Deals with the command buttons on the board
+ ******************************************************************************
+ *  4/24/89 GEB 	- When "Other" pressed, if "Samples" is on then turn it off
+ *		-  before changing button menus.
  ******************************************************************************/
  
  #include "main.h"
***************
*** 57,62 ****
--- 60,66 ----
      { "New Game",   New_Game,	  FALSE   },
      { "Restart",    Restart_Game, FALSE  },
      { "Save",	    Save_Game,    FALSE   },
+ #define OTHER_BUTTON 3
      { "Other",	    Other,	  TRUE    },
  
      { "Hint",	    Hints,	  FALSE   },
***************
*** 68,73 ****
--- 72,78 ----
  Button_Rec	Buttons2[NBUTTONS] = {
      { "Redraw",	    Redraw_All,	  FALSE   },
      { "Sides",	    Sides,	  FALSE   },
+ #define SAMPLES_BUTTON 2
      { "Samples",    Show_Samples, TRUE    },
      { "Other",	    Other,	  TRUE    },
  
***************
*** 107,114 ****
  {
  #undef SETARG
  #define SETARG(name,value) \
!     if (argi >= XtNumber(args)) {fprintf(stderr,"BS args overrun!\n");} \
!     XtSetArg( args[argi], name,  value ); ++argi;
  
      Arg		args[10];
      int		argi;
--- 112,119 ----
  {
  #undef SETARG
  #define SETARG(name,value) \
!     DEBUG_ERROR(argi >= XtNumber(args),"BS args overrun!\n" ); \
!     XtSetArg( args[argi], name,  (XtArgVal)value ); ++argi;
  
      Arg		args[10];
      int		argi;
***************
*** 218,226 ****
      if (All_Buttons == &Buttons1[0]) {
  	All_Buttons = &Buttons2[0];
      } else {
  	All_Buttons = &Buttons1[0];
      }
!     All_Buttons[3].hilite = !All_Buttons[3].hilite;
      XClearArea( XtDisplay(Board), XtWindow(w),
  	        0, 0, 0, (unsigned)(2*Tile_Height-Side_Y-Shadow_Y-1), FALSE );
      Button_Expose( w, event, params, num_params );
--- 223,236 ----
      if (All_Buttons == &Buttons1[0]) {
  	All_Buttons = &Buttons2[0];
      } else {
+ 	/*--Turn off Samples mode if we are changing menus. */
+ 	if (Buttons2[SAMPLES_BUTTON].hilite) {
+ 	    (*(Buttons2[SAMPLES_BUTTON].action))(w, event, params, num_params);
+ 	    Buttons2[SAMPLES_BUTTON].hilite = FALSE;
+ 	}
  	All_Buttons = &Buttons1[0];
      }
!     All_Buttons[OTHER_BUTTON].hilite = !All_Buttons[OTHER_BUTTON].hilite;
      XClearArea( XtDisplay(Board), XtWindow(w),
  	        0, 0, 0, (unsigned)(2*Tile_Height-Side_Y-Shadow_Y-1), FALSE );
      Button_Expose( w, event, params, num_params );
***************
*** 259,266 ****
      FILE	*file;
  
      DEBUG_CALL(Restore_Game);
!     strcpy( &name[0], getenv( "HOME" ) );
!     strcat( &name[0], "/.dragon-save" );
      file = fopen( &name[0], "r" );
      if (file == (FILE*)NULL) {
  	Complain( "Cannot open the $HOME/.dragon-save file." );
--- 269,276 ----
      FILE	*file;
  
      DEBUG_CALL(Restore_Game);
!     (void)strcpy( &name[0], getenv( "HOME" ) );
!     (void)strcat( &name[0], "/.dragon-save" );
      file = fopen( &name[0], "r" );
      if (file == (FILE*)NULL) {
  	Complain( "Cannot open the $HOME/.dragon-save file." );
***************
*** 289,296 ****
      FILE	*file;
  
      DEBUG_CALL(Save_Game);
!     strcpy( &name[0], getenv( "HOME" ) );
!     strcat( &name[0], "/.dragon-save" );
      file = fopen( &name[0], "w" );
      if (file == (FILE*)NULL) {
  	Complain( "Cannot open the $HOME/.dragon-save file." );
--- 299,306 ----
      FILE	*file;
  
      DEBUG_CALL(Save_Game);
!     (void)strcpy( &name[0], getenv( "HOME" ) );
!     (void)strcat( &name[0], "/.dragon-save" );
      file = fopen( &name[0], "w" );
      if (file == (FILE*)NULL) {
  	Complain( "Cannot open the $HOME/.dragon-save file." );
***************
*** 401,408 ****
  	    if (but[i].text == NULL) { goto Next_Button; }
  	    l = strlen(but[i].text);
  	    if (l > 8) {
! 		fprintf( stderr, "Button name too long: %s\n",
! 			 but[i].text );
  		l = 8;
  	    }
  	    but[i].x = x;
--- 411,418 ----
  	    if (but[i].text == NULL) { goto Next_Button; }
  	    l = strlen(but[i].text);
  	    if (l > 8) {
! 		(void)fprintf( stderr, "Button name too long: %s\n",
! 			       but[i].text );
  		l = 8;
  	    }
  	    but[i].x = x;
***************
*** 463,469 ****
  * Called to draw the vector text in some button.
  ******************************************************************************/
  {
!     static char pntserr[] = "DT pnts overflow!\n";
      XPoint	pnts[50];
      int		pnti;
      int		h1;
--- 473,481 ----
  * Called to draw the vector text in some button.
  ******************************************************************************/
  {
! #ifdef WANTDEBUG
!     static char *pntserr = "DT pnts overflow!\n";
! #endif
      XPoint	pnts[50];
      int		pnti;
      int		h1;
***************
*** 471,477 ****
  
  #undef PNT
  #define PNT(X,Y) \
!     if (pnti >= XtNumber(pnts)){fprintf(stderr,pntserr);} \
      pnts[pnti].x = X; pnts[pnti].y = Y; ++pnti
      ;
  
--- 483,489 ----
  
  #undef PNT
  #define PNT(X,Y) \
!     DEBUG_ERROR( pnti >= XtNumber(pnts), pntserr ); \
      pnts[pnti].x = X; pnts[pnti].y = Y; ++pnti
      ;
  
***************
*** 500,512 ****
  		PNT( 0,		h26	);
  		PNT( w6,	h6	);
  		PNT( w6,	h6	);
! 		PNT( 2*w6,	0	);
  		PNT( w6,	-h6	);
  		PNT( w6,	-h6	);
  		PNT( 0,		-h26	);
  		PNT( -w6,	-h6	);
  		PNT( -w6,	-h6	);
! 		PNT( -2*w6,	0	);
  		PNT( -w6,	h6	);
  		PNT( -w6,	h6	);
  		break;
--- 512,524 ----
  		PNT( 0,		h26	);
  		PNT( w6,	h6	);
  		PNT( w6,	h6	);
! 		PNT( w1-4*w6,	0	);
  		PNT( w6,	-h6	);
  		PNT( w6,	-h6	);
  		PNT( 0,		-h26	);
  		PNT( -w6,	-h6	);
  		PNT( -w6,	-h6	);
! 		PNT( -(w1-4*w6),0	);
  		PNT( -w6,	h6	);
  		PNT( -w6,	h6	);
  		break;
*** ../dragon/dragon.man	Tue May 23 00:03:54 1989
--- dragon.man	Mon May 22 23:55:37 1989
***************
*** 8,16 ****
--- 8,18 ----
  [-icongeometry geometry]
  [-/+iconic]
  [-iconname name]
+ [-geometry geometry]
  [-/+reverse]
  [-/+shadows]
  [-sides type]
+ [-/+sticky]
  .SH DESCRIPTION
  \fIDragon\fP plays a version of the game of Mah-Jongg.
  
***************
*** 73,78 ****
--- 75,85 ----
  250 milliseconds.  Clicks further apart than this will be treated as
  separate single clicks instead of one double click.
  .TP 8
+ .B \-geometry geometry
+ Use this option to specify the geometry to be used for the
+ \fIdragon\fP window.  There are five sizes that \fIdragon\fP prefers,
+ 450x340, 650x500, 870x660, 1080x820, and 1290x980.
+ .TP 8
  .B \-icongeometry geometry
  Use this option to specify the geometry to be used for the
  \fIdragon\fP icon.  There are two sizes that \fIdragon\fP prefers,
***************
*** 97,102 ****
--- 104,116 ----
  .B \-sides type
  This option can be used to specify the way that tile sides are drawn.
  There are four possiblities.  "gray" (the default), "black", and "line".
+ .TP 8
+ .B \-sticky
+ By default, the first selection is "sticky" (+sticky) which means that
+ attempts to select a second tile that is free but which doesn't match
+ the first are rejected.  If the first selection is not sticky
+ (-sticky), an attempt to select a free tile that doesn't match the first
+ will deselect the first tile and leave only the second selected.
  .SH MOUSE BUTTONS
  Click button 1 on any tile to select it.  Click on any menu button to activate
  it.
***************
*** 176,181 ****
--- 190,201 ----
  Specifies the maximum time to allow between the two clicks that form a
  double-click.  The default is 250.
  .TP 8
+ .B "geometry (\fPclass\fB Geometry)"
+ Use this option to specify the geometry to be used for the
+ \fIdragon\fP window.  There are five sizes that \fIdragon\fP prefers,
+ 450x340, 650x500, 870x660, 1080x820, and 1290x980.  The default is
+ "450x340".
+ .TP 8
  .B "iconGeometry (\fPclass\fB IconGeometry)"
  Specifies the geometry of the \fIdragon\fB icon.  Preferred sizes are
  32x32 and 64x64.  The default is "64x64".
***************
*** 190,195 ****
--- 210,219 ----
  .B "reverseVideo (\fPclass\fB ReverseVideo)"
  Specifies TRUE for reverse-video effects and FALSE for normal-video.
  The default is FALSE.
+ .TP 8
+ .B "stickyTile \(fPclass\fB StickyTile)|
+ Specify TRUE for first tile selected to be sticky (default), FALSE for
+ selection follows click.
  .TP 8
  .B "tileShadows (\fPclass\fB TileShadows)"
  Specifies TRUE if tiles are to have 3-D shadows and FALSE if not.  The
*** ../dragon/icon.c	Tue May 23 00:04:01 1989
--- icon.c	Mon May 22 23:55:41 1989
***************
*** 13,19 ****
  
  extern char * malloc();
  extern        free();
- extern Pixmap XCreateTile();
  
  
  GC	Icon_GC = (GC)0;		/* GC used for Icon window. */
--- 13,18 ----
***************
*** 58,70 ****
   *  preexisting Icon images. */
  
      if (Icon_GC == (GC)0) {
! 	if (Dragon_Resources.Reverse_Video) {
! 	    gcv.background = BlackPixelOfScreen(XtScreen(w));
! 	    gcv.foreground = WhitePixelOfScreen(XtScreen(w));
! 	} else {
! 	    gcv.foreground = BlackPixelOfScreen(XtScreen(w));
! 	    gcv.background = WhitePixelOfScreen(XtScreen(w));
! 	}
  	Icon_GC = XtGetGC( w, GCForeground|GCBackground, &gcv );
      }
      ximage.height  = size;
--- 57,64 ----
   *  preexisting Icon images. */
  
      if (Icon_GC == (GC)0) {
! 	gcv.foreground = Dragon_Resources.Foreground;
! 	gcv.background = Dragon_Resources.Background;
  	Icon_GC = XtGetGC( w, GCForeground|GCBackground, &gcv );
      }
      ximage.height  = size;
***************
*** 115,122 ****
      int	  	 scr;
  
  #define SETARG(name,value) \
!     if (*argi >= argn) {fprintf(stderr,"IS args overrun!\n");} \
!     XtSetArg( args[*argi], name,  value ); ++*argi;
  
  /*--If we've been asked to set up the Icon geometry then do that. */
  
--- 109,116 ----
      int	  	 scr;
  
  #define SETARG(name,value) \
!     DEBUG_ERROR( *argi >= argn, "IS args overrun!\n" ); \
!     XtSetArg( args[*argi], name,  (XtArgVal)value ); ++*argi;
  
  /*--If we've been asked to set up the Icon geometry then do that. */
  
***************
*** 172,183 ****
  		    ic[i].min_height <= size &&
  		    size-ic[i].min_height & ic[i].height_inc == 0) {
  		    Icon_Pixmap =		/* Size is perfect */
! 		      XCreateTile( XtDisplay(Dragon),
! 				   RootWindowOfScreen(XtScreen(Dragon)),
! 				   (size == 64
! 				    ? &dragon_icon64_bits[0]
! 				    : &dragon_icon32_bits[0]), 
! 				   size, size );
  		}
  	    }
  	    if (Icon_Pixmap != (Pixmap)NULL || 	/* Stop on success */
--- 166,181 ----
  		    ic[i].min_height <= size &&
  		    size-ic[i].min_height & ic[i].height_inc == 0) {
  		    Icon_Pixmap =		/* Size is perfect */
! 		      XCreatePixmapFromBitmapData
! 			( XtDisplay(Dragon),
! 			  RootWindowOfScreen(XtScreen(Dragon)),
! 			  (size == 64
! 			   ? &dragon_icon64_bits[0]
! 			   : &dragon_icon32_bits[0]), 
! 			  (unsigned int)size, (unsigned int)size,
! 			  Dragon_Resources.Foreground,
! 			  Dragon_Resources.Background,
! 			  DefaultDepthOfScreen(XtScreen(Dragon)) );
  		}
  	    }
  	    if (Icon_Pixmap != (Pixmap)NULL || 	/* Stop on success */
***************
*** 193,199 ****
  	    char	*data;
  	    char	*orig;
  	    char	*ptr;
! 	    int		 w, wb, h, hb;
  	    int		 inc;
  
  /*--Figure out which of our pixmaps we will copy into this odd pixmap. */
--- 191,197 ----
  	    char	*data;
  	    char	*orig;
  	    char	*ptr;
! 	    unsigned int w, wb, h, hb;
  	    int		 inc;
  
  /*--Figure out which of our pixmaps we will copy into this odd pixmap. */
***************
*** 235,243 ****
  /*--Create the pixmap and free up the data area. */
  
  	    Icon_Pixmap =
! 	      XCreateTile( XtDisplay(Dragon),
! 			   RootWindowOfScreen(XtScreen(Dragon)),
! 			   data, w, h );
  	    free( data );
  	}
  	XFree( ic );
--- 233,243 ----
  /*--Create the pixmap and free up the data area. */
  
  	    Icon_Pixmap =
! 	      XCreatePixmapFromBitmapData
! 		( XtDisplay(Dragon), RootWindowOfScreen(XtScreen(Dragon)),
! 		  data, w, h,
! 		  Dragon_Resources.Foreground, Dragon_Resources.Background,
! 		  DefaultDepthOfScreen(XtScreen(Dragon)) );
  	    free( data );
  	}
  	XFree( ic );
***************
*** 262,270 ****
  	Widget		Icon_Core;
  
  #define LCLARG(name,value) \
! 	if (SomeArgsi >= XtNumber(SomeArgs)) \
! 	  {fprintf(stderr,"IS SomeArgs overrun!\n");} \
! 	XtSetArg( SomeArgs[SomeArgsi], name,  value ); ++SomeArgsi;
          ;
  
  /*--Create a shell to contain the Icon window. */
--- 262,270 ----
  	Widget		Icon_Core;
  
  #define LCLARG(name,value) \
! 	DEBUG_ERROR( SomeArgsi >= XtNumber(SomeArgs), \
! 		     "IS SomeArgs overrun!\n" ); \
! 	XtSetArg( SomeArgs[SomeArgsi], name,  (XtArgVal)value ); ++SomeArgsi;
          ;
  
  /*--Create a shell to contain the Icon window. */
*** ../dragon/main.c	Tue May 23 00:04:03 1989
--- main.c	Mon May 22 23:55:43 1989
***************
*** 38,57 ****
       XtRString, (caddr_t)default}
  #define INT(name,class,field,default) \
      {name, class, XtRInt, sizeof(int), offset(field), XtRInt, (caddr_t)default}
  #define STRING(name,class,field,default) \
      {name, class, XtRString, sizeof(String), offset(field), XtRString, \
       (caddr_t)default}
  
  static XtResource dragon_resources[] = {
    CURSOR ( "cursor",        XtCCursor,       Cursor,	         "hand2"     ),
    BOOLEAN( "debug",	    "Debug",	     Debug,		 &def_FALSE  ),
    INT    ( "doubleClick",   "DoubleClick",   Double_Click_Time,  &def_DCTime ),
!   STRING ( XtNgeometry,     XtCGeometry,     Geometry,		 "444x339"   ),
    STRING ( "iconGeometry",  "IconGeometry",  Icon_Geometry,      "64x64"     ),
    BOOLEAN( "iconic",        "Iconic",        Iconic,             &def_FALSE  ),
    STRING ( XtNiconName,	    XtCIconName,     Icon_Name,		 NULL 	     ),
    BOOLEAN( XtNreverseVideo, XtCReverseVideo, Reverse_Video,      &def_FALSE  ),
!   BOOLEAN( "tileShadows",   "TileShadows",   Tile_Shadows,	 &def_TRUE  ),
    STRING ( "tileSides",	    "TileSides",     Tile_Sides,	 "gray"	     ),
  };
  
--- 38,65 ----
       XtRString, (caddr_t)default}
  #define INT(name,class,field,default) \
      {name, class, XtRInt, sizeof(int), offset(field), XtRInt, (caddr_t)default}
+ #define PIXEL(name,class,field,default) \
+     {name, class, XtRPixel, sizeof(Pixel), \
+      offset(field), XtRString, (caddr_t)default}
  #define STRING(name,class,field,default) \
      {name, class, XtRString, sizeof(String), offset(field), XtRString, \
       (caddr_t)default}
  
  static XtResource dragon_resources[] = {
+   PIXEL  ( XtNbackground,   XtCBackground,   Background,
+ 	   XtExtdefaultbackground ),
    CURSOR ( "cursor",        XtCCursor,       Cursor,	         "hand2"     ),
    BOOLEAN( "debug",	    "Debug",	     Debug,		 &def_FALSE  ),
    INT    ( "doubleClick",   "DoubleClick",   Double_Click_Time,  &def_DCTime ),
!   PIXEL  ( XtNforeground,   XtCForeground,   Foreground,
! 	   XtExtdefaultforeground ),
!   STRING ( XtNgeometry,     XtCGeometry,     Geometry,		 "450x340"   ),
    STRING ( "iconGeometry",  "IconGeometry",  Icon_Geometry,      "64x64"     ),
    BOOLEAN( "iconic",        "Iconic",        Iconic,             &def_FALSE  ),
    STRING ( XtNiconName,	    XtCIconName,     Icon_Name,		 NULL 	     ),
    BOOLEAN( XtNreverseVideo, XtCReverseVideo, Reverse_Video,      &def_FALSE  ),
!   BOOLEAN( "stickyTile",    "StickyTile",    Sticky_Tile,	 &def_TRUE   ),
!   BOOLEAN( "tileShadows",   "TileShadows",   Tile_Shadows,	 &def_TRUE   ),
    STRING ( "tileSides",	    "TileSides",     Tile_Sides,	 "gray"	     ),
  };
  
***************
*** 80,85 ****
--- 88,95 ----
  {"-shadows",	 ".tileShadows",     XrmoptionNoArg,   (caddr_t)"off"  },
  {"+shadows",	 ".tileShadows",     XrmoptionNoArg,   (caddr_t)"on" },
  {"-sides",	 ".tileSides",	     XrmoptionSepArg,  (caddr_t)"line"},
+ {"-sticky",	 ".stickyTile",      XrmoptionNoArg,   (caddr_t)"off" },
+ {"+sticky",	 ".stickyTile",      XrmoptionNoArg,   (caddr_t)"on" },
  };
  
  typedef struct {
***************
*** 100,105 ****
--- 110,116 ----
  {"-/+reverse",		 "turn on/off reverse video"},
  {"-/+shadows",		 "turn on/off tile shadows"},
  {"-sides line/black/gray","set the style for tile sides"},
+ {"-/+sticky",		 "first tile selected sticky"},
  { NULL, NULL }
  };
  
***************
*** 157,195 ****
  } /* Command_Line_Help */
  
  
- Pixmap XCreateTile( display, d, data, width, height )
-      Display	    *display;
-      Drawable	     d;
-      char	    *data;
-      unsigned int    width, height;
- /******************************************************************************
- * Converted form of XCreatePixmapFromBitmapData.  Use our GC and don't bother
- * the Server for another one.
- ******************************************************************************/
- {
-     XImage ximage;
-     Pixmap pix;
- 
-     pix = XCreatePixmap( display, d, width, height, 1 );
-     if (pix == (Pixmap)0) return (Pixmap)0;
- 
-     ximage.height = height;
-     ximage.width = width;
-     ximage.depth = 1;
-     ximage.xoffset = 0;
-     ximage.format = XYBitmap;
-     ximage.data = data;
-     ximage.byte_order = LSBFirst;
-     ximage.bitmap_unit = 8;
-     ximage.bitmap_bit_order = LSBFirst;
-     ximage.bitmap_pad = 8;
-     ximage.bytes_per_line = (width+7)/8;
- 
-     XPutImage( display, pix, Normal_GC, &ximage, 0, 0, 0, 0, width, height );
-     return pix;
- } /* XCreateTile */
- 
- 
  static void GC_Setup()
  /******************************************************************************
  * Set up the GC's that we will be using for drawing.
--- 168,173 ----
***************
*** 198,208 ****
      XGCValues	gcv;
      Pixel	pix;
  
! /*--Xor_GC - fg = black, bg = white, func = xor */
  
      gcv.function = GXxor;
!     gcv.foreground = BlackPixelOfScreen(XtScreen(Dragon));
!     gcv.background = WhitePixelOfScreen(XtScreen(Dragon));
      Xor_GC = XtGetGC( Dragon,
  		      GCFunction|GCForeground|GCBackground,
  		      &gcv );
--- 176,187 ----
      XGCValues	gcv;
      Pixel	pix;
  
! /*--Xor_GC - fg = black, bg = white, func = xor; flops colors between the
!  *  foreground and the background when applied. */
  
      gcv.function = GXxor;
!     gcv.foreground = Dragon_Resources.Foreground ^ Dragon_Resources.Background;
!     gcv.background = (Pixel)0;	/* pixel value with all bits "off" */
      Xor_GC = XtGetGC( Dragon,
  		      GCFunction|GCForeground|GCBackground,
  		      &gcv );
***************
*** 210,227 ****
  /*--Normal_GC - fg = black, bg = white, func = copy */
  
      gcv.function = GXcopy;
!     if (Dragon_Resources.Reverse_Video) {
! 	gcv.background = BlackPixelOfScreen(XtScreen(Dragon));
! 	gcv.foreground = WhitePixelOfScreen(XtScreen(Dragon));
!     }
      Normal_GC = XtGetGC( Dragon, GCFunction|GCForeground|GCBackground, &gcv );
  
  /*--Gray_GC - fg = black, bg = white, func = copy, tile = Gray */
  
!     gcv.tile = XCreateTile( XtDisplay(Board), XtWindow(Board),
! 			    gray_bits, gray_width, gray_height );
!     if (gcv.tile == None) {
! 	fprintf( stderr, "Can't allocate gray pixmap.\n" );
  	exit(1);
      }
      gcv.fill_style = FillTiled;
--- 189,208 ----
  /*--Normal_GC - fg = black, bg = white, func = copy */
  
      gcv.function = GXcopy;
!     gcv.foreground = Dragon_Resources.Foreground;
!     gcv.background = Dragon_Resources.Background;
      Normal_GC = XtGetGC( Dragon, GCFunction|GCForeground|GCBackground, &gcv );
  
  /*--Gray_GC - fg = black, bg = white, func = copy, tile = Gray */
  
!     gcv.tile =
!       XCreatePixmapFromBitmapData
! 	( XtDisplay(Board), XtWindow(Board),
! 	  gray_bits, gray_width, gray_height,
! 	  Dragon_Resources.Foreground, Dragon_Resources.Background,
! 	  DefaultDepthOfScreen(XtScreen(Board)) );
!     if (gcv.tile == (Pixmap)0L) {
! 	(void)fprintf( stderr, "Can't allocate gray pixmap.\n" );
  	exit(1);
      }
      gcv.fill_style = FillTiled;
***************
*** 229,259 ****
  		       GCFunction|GCForeground|GCBackground|GCTile|GCFillStyle,
  		       &gcv );
  
! /*--Over_GC - fg = black, bg = white, func = or */
  
!     if (Dragon_Resources.Reverse_Video) {
! 	gcv.function = GXand;
!     } else {
! 	gcv.function = GXor;
!     }
!     gcv.tile =
!       XCreateTile( XtDisplay(Board), XtWindow(Board),
! 		   shadow_bits, shadow_width, shadow_height );
!     if (gcv.tile == None) {
! 	fprintf( stderr, "Can't allocate shadow pixmap.\n" );
  	exit(1);
      }
!     gcv.fill_style = FillTiled;
      Over_GC = XtGetGC( Dragon,
! 		       GCFunction|GCForeground|GCBackground|GCTile|GCFillStyle,
  		       &gcv );
  
  /*--Reverse_GC - fg = white, bg = black, func = copy */
  
      gcv.function = GXcopy;
!     pix = gcv.background;
!     gcv.background = gcv.foreground;
!     gcv.foreground = pix;
      Reverse_GC = XtGetGC( Dragon, GCFunction|GCForeground|GCBackground, &gcv );
  
  } /* GC_Setup */
--- 210,237 ----
  		       GCFunction|GCForeground|GCBackground|GCTile|GCFillStyle,
  		       &gcv );
  
! /*--Over_GC - fg = black xor white, bg = 0, func = copy */
  
!     gcv.function = GXcopy;
!     gcv.stipple =		/* stipple operations are always depth 1 */
!       XCreateBitmapFromData
! 	( XtDisplay(Board), XtWindow(Board),
! 	  shadow_bits, shadow_width, shadow_height );
!     if (gcv.stipple == (Pixmap)0L) {
! 	(void)fprintf( stderr, "Can't allocate shadow pixmap.\n" );
  	exit(1);
      }
!     gcv.fill_style = FillStippled;
      Over_GC = XtGetGC( Dragon,
! 		       GCFunction|GCForeground|GCBackground|
! 		          GCStipple|GCFillStyle,
  		       &gcv );
  
  /*--Reverse_GC - fg = white, bg = black, func = copy */
  
      gcv.function = GXcopy;
!     gcv.background = Dragon_Resources.Foreground;
!     gcv.foreground = Dragon_Resources.Background;
      Reverse_GC = XtGetGC( Dragon, GCFunction|GCForeground|GCBackground, &gcv );
  
  } /* GC_Setup */
***************
*** 271,278 ****
  
  #undef SETARG
  #define SETARG(name,value) \
!     if (argi >= XtNumber(args)) {fprintf(stderr,"main, args overrun!\n");} \
!     XtSetArg( args[argi], name,  value ); ++argi;
  
  /*--Start up the toolkit.  This creates a shell widget.  Unfortunately the
   *  only way the toolkit allows you to specify default application resources
--- 249,256 ----
  
  #undef SETARG
  #define SETARG(name,value) \
!     DEBUG_ERROR(argi >= XtNumber(args), "main, args overrun!\n" ); \
!     XtSetArg( args[argi], name,  (XtArgVal)value ); ++argi;
  
  /*--Start up the toolkit.  This creates a shell widget.  Unfortunately the
   *  only way the toolkit allows you to specify default application resources
***************
*** 323,335 ****
      SETARG( XtNmaxAspectX,	1333 );
      SETARG( XtNmaxAspectY,	1000 );
      SETARG( XtNgeometry,	Dragon_Resources.Geometry );
!     if (Dragon_Resources.Reverse_Video) {
! 	SETARG( XtNbackground, BlackPixelOfScreen(XtScreen(Dragon)) );
! 	SETARG( XtNforeground, WhitePixelOfScreen(XtScreen(Dragon)) );
!     } else {
! 	SETARG( XtNforeground, BlackPixelOfScreen(XtScreen(Dragon)) );
! 	SETARG( XtNbackground, WhitePixelOfScreen(XtScreen(Dragon)) );
!     }
  
      SETARG( XtNallowShellResize, TRUE );
      SETARG( XtNinput,		 TRUE );
--- 301,308 ----
      SETARG( XtNmaxAspectX,	1333 );
      SETARG( XtNmaxAspectY,	1000 );
      SETARG( XtNgeometry,	Dragon_Resources.Geometry );
!     SETARG( XtNforeground, Dragon_Resources.Foreground );
!     SETARG( XtNbackground, Dragon_Resources.Background );
  
      SETARG( XtNallowShellResize, TRUE );
      SETARG( XtNinput,		 TRUE );
***************
*** 352,358 ****
      } else if (strcmp( Dragon_Resources.Tile_Sides, "gray" ) == 0) {
  	Tile_Control |= BLACKSIDE | GRAYSIDE;
      } else if (strcmp( Dragon_Resources.Tile_Sides, "line" ) != 0) {
! 	fprintf(stderr,"-side option not given line, gray, or black value.\n");
      }
  
  /*--Create the board that we will be using; realize it too. */
--- 325,332 ----
      } else if (strcmp( Dragon_Resources.Tile_Sides, "gray" ) == 0) {
  	Tile_Control |= BLACKSIDE | GRAYSIDE;
      } else if (strcmp( Dragon_Resources.Tile_Sides, "line" ) != 0) {
! 	(void)fprintf( stderr,
! 		       "-side option not given line, gray, or black value.\n");
      }
  
  /*--Create the board that we will be using; realize it too. */
***************
*** 368,378 ****
  /*--Now make it all appear in front of the user. */
  
      {	Pixmap	pix;
! 	pix = XCreateTile( XtDisplay(Board), XtWindow(Board),
! 			   background_bits, background_width,
! 			   background_height);
! 	if (pix == None) {
! 	    fprintf( stderr, "Can't allocate background pixmap.\n" );
  	    exit(1);
  	}
  	XSetWindowBackgroundPixmap( XtDisplay(Board), XtWindow(Board), pix );
--- 342,356 ----
  /*--Now make it all appear in front of the user. */
  
      {	Pixmap	pix;
! 	pix =
! 	  XCreatePixmapFromBitmapData
! 	    ( XtDisplay(Board), XtWindow(Board),
! 	      background_bits, background_width, background_height,
! 	      Dragon_Resources.Foreground, Dragon_Resources.Background,
! 	      DefaultDepthOfScreen(XtScreen(Board)) );
! 					  
! 	if (pix == (Pixmap)0L) {
! 	    (void)fprintf( stderr, "Can't allocate background pixmap.\n" );
  	    exit(1);
  	}
  	XSetWindowBackgroundPixmap( XtDisplay(Board), XtWindow(Board), pix );
***************
*** 384,399 ****
      XtMainLoop();
  
  } /* main */
- 
- #if 0
- */* print out the name of a widget; NOTE: no \n printed so printout is not
- * * flushed until our caller does one. */
- *
- *void spit(w)
- *     Widget	w;
- *{
- *    if (w == NULL) return;
- *    spit( w->core.parent );
- *    fprintf( stderr, ".%s", w->core.name );
- *}
- #endif /* 0 */
--- 362,364 ----
*** ../dragon/main.h	Tue May 23 00:04:05 1989
--- main.h	Mon May 22 23:55:44 1989
***************
*** 15,22 ****
--- 15,24 ----
  #include <X11/Simple.h>
  #include <X11/StringDefs.h>
  
+ #ifndef TRUE
  #define TRUE	1
  #define FALSE	0
+ #endif
  
  #ifdef _MAIN_C_
  #define VAR(A)		A
***************
*** 32,37 ****
--- 34,41 ----
  ******************************************************************************/
  
  typedef struct _Dragon_Resources_Rec{
+     Pixel		Foreground;		/* Default foreground color */
+     Pixel		Background;		/* Default background color */
      Cursor		Cursor;			/* Name of cursor to use */
      Boolean		Debug;			/* Debug printouts */
      int			Double_Click_Time;	/* Time (ms) between clicks */
***************
*** 40,61 ****
      Boolean		Iconic;			/* Do we start as an icon? */
      String		Icon_Name;		/* Name for the icon */
      Boolean		Reverse_Video;		/* Do all in reverse? */
      Boolean		Tile_Shadows;		/* Want shadows? */
      String		Tile_Sides;		/* What side type? */
  } Dragon_Resources_Rec, *Dragon_Resources_Ptr;
  
  #define DEBUG_CALL(Name) \
    if (Dragon_Resources.Debug) { \
!     fprintf( stderr, "Name call\n" ); fflush(stderr); \
    }
  #define DEBUG_RETURN(Name) \
    if (Dragon_Resources.Debug) { \
!     fprintf( stderr, "Name return\n" ); fflush(stderr); \
    }
  #define DEBUG_OTHER(Name,Other) \
    if (Dragon_Resources.Debug) { \
!     fprintf( stderr, "Name Other\n" ); fflush(stderr); \
    }
  
  /******************************************************************************
  * Bitmap/Image Initialization Structure
--- 44,75 ----
      Boolean		Iconic;			/* Do we start as an icon? */
      String		Icon_Name;		/* Name for the icon */
      Boolean		Reverse_Video;		/* Do all in reverse? */
+     Boolean		Sticky_Tile;		/* Is first tile sticky? */
      Boolean		Tile_Shadows;		/* Want shadows? */
      String		Tile_Sides;		/* What side type? */
  } Dragon_Resources_Rec, *Dragon_Resources_Ptr;
  
+ #ifdef WANTDEBUG
  #define DEBUG_CALL(Name) \
    if (Dragon_Resources.Debug) { \
!     (void)fprintf( stderr, "Name call\n" ); (void)fflush(stderr); \
    }
  #define DEBUG_RETURN(Name) \
    if (Dragon_Resources.Debug) { \
!     (void)fprintf( stderr, "Name return\n" ); (void)fflush(stderr); \
    }
  #define DEBUG_OTHER(Name,Other) \
    if (Dragon_Resources.Debug) { \
!     (void)fprintf( stderr, "Name Other\n" ); (void)fflush(stderr); \
    }
+ #define DEBUG_ERROR(Test,Msg) \
+   if (Test) { (void)fprintf(stderr,Msg); (void)fflush(stderr); }
+ #else
+ #define DEBUG_CALL(Name)
+ #define DEBUG_RETURN(Name)
+ #define DEBUG_OTHER(Name,Other)
+ #define DEBUG_ERROR(Test,Msg)
+ #endif /* WANTDEBUG */
  
  /******************************************************************************
  * Bitmap/Image Initialization Structure
***************
*** 96,98 ****
--- 110,116 ----
  VAR( GC			   Over_GC );		/* fg=blk, bg=wht, fcn=or */
  VAR( GC			   Reverse_GC );	/* fg=wht, bg=blk, fcn=copy */
  VAR( GC			   Xor_GC );		/* fg=blk, bg=wht, fcn=xor */
+ 
+ #undef VAR
+ #undef VARI
+ 
*** ../dragon/tile.c	Tue May 23 00:03:57 1989
--- tile.c	Mon May 22 23:55:46 1989
***************
*** 122,129 ****
  /*--Make sure that our caller is rational. */
  
      if (size < 1 || size > 5) {
! 	fprintf( stderr, "Bad size given to Configure_Tiles in tile.c [%d].\n",
! 		 size );
  	size = 1;
      }
  
--- 122,130 ----
  /*--Make sure that our caller is rational. */
  
      if (size < 1 || size > 5) {
! 	(void)fprintf( stderr,
! 		       "Bad size given to Configure_Tiles in tile.c [%d].\n",
! 		       size );
  	size = 1;
      }
  
***************
*** 201,207 ****
  * Called to draw the number in the upper right corner of a numbered tile.
  ******************************************************************************/
  {
!     XPutImage( XtDisplay(Board), XtWindow(Board), Over_GC, image,
  	       0, 0, x + Number_X, y + Number_Y,
  	       (unsigned int)image->width, (unsigned int)image->height );
  } /* Draw_Number */
--- 202,208 ----
  * Called to draw the number in the upper right corner of a numbered tile.
  ******************************************************************************/
  {
!     XPutImage( XtDisplay(Board), XtWindow(Board), Xor_GC, image,
  	       0, 0, x + Number_X, y + Number_Y,
  	       (unsigned int)image->width, (unsigned int)image->height );
  } /* Draw_Number */
No differences encountered