|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 13495 (0x34b7)
Types: TextFile
Names: »main.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/X/Dragon/main.c.orig«
/******************************************************************************
* Dragon - a version of Mah-Jongg for X Windows
*
* Author: Gary E. Barnes March 1989
*
* main.c - The mainline code.
******************************************************************************/
#define _MAIN_C_
#include "main.h"
#include <X11/ShellP.h>
#include "ic/background.ic"
#include "ic/gray.ic"
#include "ic/shadow.ic"
extern void Icon_Setup();
extern void Board_Setup();
\f
/******************************************************************************
* Dragon Resources
******************************************************************************/
static int def_DCTime = 250; /* ms for double click */
static Boolean def_FALSE = FALSE;
static Boolean def_TRUE = TRUE;
#define offset(field) XtOffset( Dragon_Resources_Ptr, field )
#define BOOLEAN(name,class,field,default) \
{name, class, XtRBoolean, sizeof(Boolean), offset(field), XtRBoolean, \
(caddr_t)default}
#define CURSOR(name,class,field,default) \
{name, class, XtRCursor, sizeof(Cursor), offset(field), \
XtRString, (caddr_t)default}
#define FONT(name,class,field,default) \
{name, class, XtRFontStruct, sizeof(XFontStruct*), offset(field), \
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" ),
};
#undef offset
#undef BOOLEAN
#undef FONT
#undef INT
#undef STRING
\f
/******************************************************************************
* Dragon Command Line Options
******************************************************************************/
static XrmOptionDescRec command_line_options[] = {
{"-cursor", ".cursor", XrmoptionSepArg, (caddr_t)NULL },
{"-debug", ".debug", XrmoptionNoArg, (caddr_t)"on" },
{"-double", ".doubleClick", XrmoptionSepArg, (caddr_t)NULL },
{"-geometry", ".geometry", XrmoptionSepArg, (caddr_t)NULL },
{"-icongeometry",".iconGeometry", XrmoptionSepArg, (caddr_t)NULL },
{"-iconic", ".iconic", XrmoptionNoArg, (caddr_t)"on" },
{"+iconic", ".iconic", XrmoptionNoArg, (caddr_t)"off" },
{"-iconname", ".iconName", XrmoptionSepArg, (caddr_t)NULL },
{"-reverse", "*reverseVideo", XrmoptionNoArg, (caddr_t)"on" },
{"+reverse", "*reverseVideo", XrmoptionNoArg, (caddr_t)"off" },
{"-shadows", ".tileShadows", XrmoptionNoArg, (caddr_t)"off" },
{"+shadows", ".tileShadows", XrmoptionNoArg, (caddr_t)"on" },
{"-sides", ".tileSides", XrmoptionSepArg, (caddr_t)"line"},
};
typedef struct {
String name;
String desc;
} Option_Help;
static Option_Help command_line_help[] = {
{"-help", "print out this message"},
{"-display displayname", "X server to contact"},
{"-cursor name", "name of the cursor to use"},
{"-double time", "double-click time limit in milliseconds"},
{"-font name", "font to use for buttons and messages"},
{"-geometry WxH+X+Y", "size (in pixels) and position of the board"},
{"-icongeometry WxH+X+Y","size (in pixels) and position of the program icon"},
{"-/+iconic", "begin program as an icon"},
{"-iconname name", "name to use with the program icon"},
{"-/+reverse", "turn on/off reverse video"},
{"-/+shadows", "turn on/off tile shadows"},
{"-sides line/black/gray","set the style for tile sides"},
{ NULL, NULL }
};
\f
static void Command_Line_Usage( Bad_Option )
String Bad_Option;
/******************************************************************************
* Bad_Option - Specifies the unfathomable command line option we received
*
* Called when we find an unrecognized command line option. We spit out a
* Unix-sytle usage message and die.
******************************************************************************/
{
Option_Help *opt;
int col;
(void)fprintf( stderr, "%s: unrecognized command line option [%s]\n\n",
Program_Name, Bad_Option );
(void)fprintf( stderr, "usage: %s", Program_Name );
col = 8 + strlen(Program_Name);
for (opt = command_line_help; opt->name; opt++) {
int len = 3 + strlen(opt->name); /* space[string] */
if (col + len > 79) {
(void)fprintf (stderr, "\n "); /* 3 spaces */
col = 3;
}
(void)fprintf (stderr, " [%s]", opt->name);
col += len;
}
(void)fprintf( stderr, "\n\nType %s -help for a more help.\n",
Program_Name );
exit( 1 );
} /* Command_Line_Usage */
\f
static void Command_Line_Help()
/******************************************************************************
* Called when the -help switch is used. Put out our extended help message.
******************************************************************************/
{
Option_Help *opt;
(void)fprintf( stderr, "usage:\n %s [options]\n\n",
Program_Name);
(void)fprintf( stderr, "Where the options are:\n");
for (opt = command_line_help; opt->name; opt++) {
(void)fprintf( stderr, " %-24s %s\n", opt->name, opt->desc );
}
(void)fprintf( stderr, "\n" );
exit( 0 );
} /* Command_Line_Help */
\f
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 */
\f
static void GC_Setup()
/******************************************************************************
* Set up the GC's that we will be using for drawing.
******************************************************************************/
{
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 );
/*--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;
Gray_GC = XtGetGC( Dragon,
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 */
\f
int main (argc, argv)
int argc;
String *argv;
/******************************************************************************
* Our Main-Line Code.
******************************************************************************/
{
Arg args[40];
int argi = 0;
#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
* is by having a /usr/lib/X11/app-defaults/Application resouce file. I'm
* not interested in doing this. If some site wants to create one in order
* to customize the program then that is fine. However, I want my program
* to be "standalone"; ie. if you have the binary executable then you have
* all you *must-have*. So, I will Destroy this widget shortly. */
Program_Name = argv[0];
Dragon =
XtInitialize ( "dragon", "Dragon",
command_line_options, XtNumber(command_line_options),
&argc, argv );
/*--See if there is anything left on the command line. */
for (++argv, --argc; argc > 0; ++argv, --argc) {
if (strcmp( argv[0], "-help" ) == 0) { Command_Line_Help(); }
Command_Line_Usage( argv[0] );
}
/*--Now get the application resources. */
DEBUG_OTHER(main,XtGetApplicationResources);
XtGetApplicationResources( Dragon, (caddr_t)&Dragon_Resources,
dragon_resources, XtNumber(dragon_resources),
(ArgList)NULL, (Cardinal)0 );
/*--Set up our icon. */
DEBUG_OTHER(main,Icon_Setup);
Icon_Setup( args, (int)XtNumber(args), &argi );
/*--Now set up our "real" application shell. */
DEBUG_OTHER(main,XtDestroyWidget);
XtDestroyWidget( Dragon );
/*--Set up various other controls on our top level widget that we require. */
SETARG( XtNminWidth, 450 );
SETARG( XtNminHeight, 340 );
SETARG( XtNwidthInc, 210 );
SETARG( XtNheightInc, 160 );
SETARG( XtNminAspectX, 1333 );
SETARG( XtNminAspectY, 1000 );
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 );
if (argi > XtNumber(args)) {
(void)fprintf(stderr, "assert: args?\n");
exit(1);
}
DEBUG_OTHER(main,XtCreateApplicationShell);
Dragon = XtCreateApplicationShell( "dragon",
topLevelShellWidgetClass,
args, (Cardinal)argi );
argi = 0;
/*--Check the tile controls. */
Tile_Control = 0;
if (Dragon_Resources.Tile_Shadows) { Tile_Control |= SHADOW; }
if (strcmp( Dragon_Resources.Tile_Sides, "black" ) == 0) {
Tile_Control |= BLACKSIDE;
} 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. */
DEBUG_OTHER(main,Board_Setup);
Board_Setup();
/*--Set up our GC's. */
DEBUG_OTHER(main,GC_Setup);
GC_Setup();
/*--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 );
}
/*--Now do the real thing. */
DEBUG_OTHER(main,XtMainLoop);
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 */