[comp.sources.x] v03i070: xgraph -- graph points and functions, Part01/06

argv@island.uu.net (Dan Heller) (04/11/89)

Submitted-by: David Harrison <davidh@ic.berkeley.edu>
Posting-number: Volume 3, Issue 70
Archive-name: xgraph/part01

[ I compiled this on a sun3/60 running 3.5 and a sun4/280 running 4.0 with
  no problems.  I ran in on my 3/60 and the program came up on my color
  frame buffer regardless of which screen I attempted to display it.  The
  program looks for the color visual, so I don't know what it'll do if it
  can't find it or has to display on monochrome.  There is *no* Imakefile
  so flames>/dev/null please..  The following 6 shar files create their own
  directories including the top-level xgraph-11 directory.  The program's
  output is rather impressive -- it uses only libX11.a (no widgets as it
  is based on an X10 version of the same program).  --argv ]

#!/bin/sh
# to extract, remove the header and type "sh filename"
if `test ! -d ./xgraph-11`
then
  mkdir ./xgraph-11
  echo "mkdir ./xgraph-11"
fi
if `test ! -d ./xgraph-11/ux11`
then
  mkdir ./xgraph-11/ux11
  echo "mkdir ./xgraph-11/ux11"
fi
if `test ! -s ./xgraph-11/ux11/ux11_open.c`
then
echo "writing ./xgraph-11/ux11/ux11_open.c"
cat > ./xgraph-11/ux11/ux11_open.c << '\End\Of\Shar\'
/*
 * X11 Utility functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

Display *ux11_open_display(argc, argv)
int argc;
char *argv[];
/* Looks for -display option */
{
    Display *disp;
    char *disp_name;

    disp = XOpenDisplay(disp_name = ux11_get_value(argc, argv, "-display", ""));
    if (!disp) {
	fprintf(stderr, "%s: cannot open display `%s'\n", argv[0], disp_name);
	abort();
    }
    return disp;
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11_open.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11f_gcvals.c`
then
echo "writing ./xgraph-11/ux11/ux11f_gcvals.c"
cat > ./xgraph-11/ux11/ux11f_gcvals.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

VARARGS(ux11_fill_gcvals, unsigned long, (XGCValues *gcvals, ...))
/*
 * ux11_fill_gcvals(gcvals, name, value, ... , UX11_END);
 * XGCValues *gcvals;
 * Sets the values of an XGCValues structure using variable
 * argument lists.  The returned value is the the value_mask
 * indicating what field is set.  The fields available
 * are those described for the value mask (e.g. GCFunction, etc).
 */
{
    va_list ap;
    unsigned long value_mask = 0;
    unsigned long field;
#ifdef __STDC__

    va_start(ap, gcvals);
#else
    XGCValues *gcvals;

    va_start(ap);
    gcvals = va_arg(ap, XGCValues *);
#endif

    while ((field = va_arg(ap, unsigned long)) != UX11_END) {
	if (field == GCFunction) {
	    gcvals->function = va_arg(ap, int);
	    value_mask |= GCFunction;
	} else if (field == GCPlaneMask) {
	    gcvals->plane_mask = va_arg(ap, unsigned long);
	    value_mask |= GCPlaneMask;
	} else if (field == GCForeground) {
	    gcvals->foreground = va_arg(ap, unsigned long);
	    value_mask |= GCForeground;
	} else if (field == GCBackground) {
	    gcvals->background = va_arg(ap, unsigned long);
	    value_mask |= GCBackground;
	} else if (field == GCLineWidth) {
	    gcvals->line_width = va_arg(ap, int);
	    value_mask |= GCLineWidth;
	} else if (field == GCLineStyle) {
	    gcvals->line_style = va_arg(ap, int);
	    value_mask |= GCLineStyle;
	} else if (field == GCCapStyle) {
	    gcvals->cap_style = va_arg(ap, int);
	    value_mask |= GCCapStyle;
	} else if (field == GCJoinStyle) {
	    gcvals->join_style = va_arg(ap, int);
	    value_mask |= GCJoinStyle;
	} else if (field == GCFillStyle) {
	    gcvals->fill_style = va_arg(ap, int);
	    value_mask |= GCFillStyle;
	} else if (field == GCFillRule) {
	    gcvals->fill_rule = va_arg(ap, int);
	    value_mask |= GCFillRule;
	} else if (field == GCTile) {
	    gcvals->tile = va_arg(ap, Pixmap);
	    value_mask |= GCTile;
	} else if (field == GCStipple) {
	    gcvals->stipple = va_arg(ap, Pixmap);
	    value_mask |= GCStipple;
	} else if (field == GCTileStipXOrigin) {
	    gcvals->ts_x_origin = va_arg(ap, int);
	    value_mask |= GCTileStipXOrigin;
	} else if (field == GCTileStipYOrigin) {
	    gcvals->ts_y_origin = va_arg(ap, int);
	    value_mask |= GCTileStipYOrigin;
	} else if (field == GCFont) {
	    gcvals->font = va_arg(ap, Font);
	    value_mask |= GCFont;
	} else if (field == GCSubwindowMode) {
	    gcvals->subwindow_mode = va_arg(ap, int);
	    value_mask |= GCSubwindowMode;
	} else if (field == GCGraphicsExposures) {
	    gcvals->graphics_exposures = va_arg(ap, Bool);
	    value_mask |= GCGraphicsExposures;
	} else if (field == GCClipXOrigin) {
	    gcvals->clip_x_origin = va_arg(ap, int);
	    value_mask |= GCClipXOrigin;
	} else if (field == GCClipYOrigin) {
	    gcvals->clip_y_origin = va_arg(ap, int);
	    value_mask |= GCClipYOrigin;
	} else if (field == GCClipMask) {
	    gcvals->clip_mask = va_arg(ap, Pixmap);
	    value_mask |= GCClipMask;
	} else if (field == GCDashOffset) {
	    gcvals->dash_offset = va_arg(ap, int);
	    value_mask |= GCDashOffset;
	} else if (field == GCDashList) {
	    gcvals->dashes = va_arg(ap, char);
	    value_mask |= GCDashList;
	} else if (field == GCArcMode) {
	    gcvals->arc_mode = va_arg(ap, int);
	    value_mask |= GCArcMode;
	} else {
	    /* Error */
	    fprintf(stderr, "unknown field to ux11_fill_gcvals: %x\n", field);
	    abort();
	}
    }
    va_end(ap);
    return value_mask;
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11f_gcvals.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11f_hints.c`
then
echo "writing ./xgraph-11/ux11/ux11f_hints.c"
cat > ./xgraph-11/ux11/ux11f_hints.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

VARARGS(ux11_fill_hints, unsigned long, (XWMHints *hints, ...))
/*
 * ux11_fill_gcvals(hints, name, value, ... , UX11_END);
 * XWMHints *hints;
 * Sets the values of an XWMHints structure using variable
 * argument lists.  The returned value is the the value_mask
 * indicating what field is set.  The fields available
 * are those described for the value mask (e.g. InputHint, etc).
 */
{
    va_list ap;
    unsigned long value_mask = 0;
    unsigned long field;
    XPoint *pnt;
#ifdef __STDC__

    va_start(ap, hints);
#else
    XWMHints *hints;

    va_start(ap);
    hints = va_arg(ap, XWMHints *);
#endif

    while ((field = va_arg(ap, unsigned long)) != UX11_END) {
	if (field == InputHint) {
	    hints->input = va_arg(ap, int);
	    value_mask |= InputHint;
	} else if (field == StateHint) {
	    hints->initial_state = va_arg(ap, int);
	    value_mask |= StateHint;
	} else if (field == IconPixmapHint) {
	    hints->icon_pixmap = va_arg(ap, Pixmap);
	    value_mask |= IconPixmapHint;
	} else if (field == IconWindowHint) {
	    hints->icon_window = va_arg(ap, Window);
	    value_mask |= IconWindowHint;
	} else if (field == IconPositionHint) {
	    pnt = va_arg(ap, XPoint *);
	    hints->icon_x = pnt->x;
	    hints->icon_y = pnt->y;
	    value_mask |= IconPositionHint;
	} else if (field == IconMaskHint) {
	    hints->icon_mask = va_arg(ap, Pixmap);
	    value_mask |= IconMaskHint;
	} else if (field == WindowGroupHint) {
	    hints->window_group = va_arg(ap, XID);
	    value_mask |= WindowGroupHint;
	} else {
	    /* Default action */
	    fprintf(stderr, "unknown field to ux11_fill_hints: %x\n", field);
	    abort();
	}
    }
    va_end(ap);
    return value_mask;
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11f_hints.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11f_image.c`
then
echo "writing ./xgraph-11/ux11/ux11f_image.c"
cat > ./xgraph-11/ux11/ux11f_image.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

VARARGS(ux11_fill_image, void, (XImage *image, ...))
/*
 * ux11_fill_image(image, name, value, ..., UX11_END)
 * May be implemented at a later date.
 */
{

}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11f_image.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11f_size.c`
then
echo "writing ./xgraph-11/ux11/ux11f_size.c"
cat > ./xgraph-11/ux11/ux11f_size.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

VARARGS(ux11_fill_size, unsigned long, (XSizeHints *hints, ...))
/*
 * ux11_fill_size(hints, name, value, ... , UX11_END);
 * XSizeHints *hints;
 * Sets the values of an XSizeHints structure using variable
 * argument lists.  The returned value is the the value_mask
 * indicating what field is set.  The fields available
 * are those described for the value mask (e.g. USPosition, etc).
 * Needs to be reworked substantially.
 */
{
    va_list ap;
    unsigned long value_mask = 0;
    unsigned long field;
    XPoint *pnt;
#ifdef __STDC__

    va_start(ap, hints);
#else
    XWMHints *hints;

    va_start(ap);
    gcvals = va_arg(ap, XWMHints *);
#endif

    while ((field = va_arg(ap, unsigned long)) != UX11_END) {
	if (field == USPosition) {
	    pnt = va_arg(ap, XPoint *);
	    hints->x = pnt->x;
	    hints->y = pnt->y;
	    value_mask |= USPosition;
	} else if (field == USSize) {
	    pnt = va_arg(ap, XPoint *);
	    hints->width = pnt->x;
	    hints->height = pnt->y;
	    value_mask |=  USSize;
	} else if (field == PPosition) {
	    pnt = va_arg(ap, XPoint *);
	    hints->x = pnt->x;
	    hints->y = pnt->y;
	    value_mask |=  PPosition;
	} else if (field == PSize) {
	    pnt = va_arg(ap, XPoint *);
	    hints->width = pnt->x;
	    hints->height = pnt->y;
	    value_mask |=  PSize;
	} else if (field == PMinSize) {
	    pnt = va_arg(ap, XPoint *);
	    hints->min_width = pnt->x;
	    hints->min_height = pnt->y;
	    value_mask |=  PMinSize;
	} else if (field == PMaxSize) {
	    pnt = va_arg(ap, XPoint *);
	    hints->max_width = pnt->x;
	    hints->max_height = pnt->y;
	    value_mask |=  PMaxSize;
	} else if (field == PResizeInc) {
	    pnt = va_arg(ap, XPoint *);
	    hints->width_inc = pnt->x;
	    hints->height_inc = pnt->y;
	    value_mask |=  PResizeInc;
	} else if (field == PAspect) {
	    value_mask |=  PAspect;
	} else {
	    /* Default action */
	}

	if (field == InputHint) {
	    hints->input = va_arg(ap, int);
	    value_mask |= InputHint;
	} else if (field == StateHint) {
	    hints->initial_state = va_arg(ap, int);
	    value_mask |= StateHint;
	} else if (field == IconPixmapHint) {
	    hints->icon_pixmap = va_arg(ap, Pixmap);
	    value_mask |= IconPixmapHint;
	} else if (field == IconWindowHint) {
	    hints->icon_window = va_arg(ap, Window);
	    value_mask |= IconWindowHint;
	} else if (field == IconPositionHint) {
	    pnt = va_arg(ap, XPoint *);
	    hints->icon_x = pnt->x;
	    hints->icon_y = pnt->y;
	    value_mask |= IconPositionHint;
	} else if (field == IconMaskHint) {
	    hints->icon_mask = va_arg(ap, Pixmap);
	    value_mask |= IconMaskHint;
	} else if (field == WindowGroupHint) {
	    hints->window_group = va_arg(ap, XId);
	    value_mask |= WindowGroupHint;
	} else {
	    /* Default action */
	    fprintf(stderr, "unknown field to ux11_fill_hints: %x\n", field);
	    abort();
	}
    }
    va_end(ap);
    return value_mask;
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11f_size.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11f_watter.c`
then
echo "writing ./xgraph-11/ux11/ux11f_watter.c"
cat > ./xgraph-11/ux11/ux11f_watter.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

VARARGS(ux11_fill_wattr, unsigned long, (XSetWindowAttributes *wattr, ... ))
/*
 * ux11_fill_wattr(wattr, name, value, ... , UX11_END);
 * XSetWindowAttributes *wattr;
 * Sets items in a fresh window attribute structure using
 * variable argument lists.  The settable fields are given
 * by the value mask (e.g. CWBackPixmap, etc).  The return 
 * value is the valuemask of those fields set in the structure.
 */
{
    va_list ap;
    unsigned long value_mask = 0;
    unsigned long field;
#ifdef __STDC__

    va_start(ap, wattr);
#else
    XSetWindowAttributes *wattr;

    va_start(ap);
    wattr = va_arg(ap, XSetWindowAttributes *);
#endif

    while ((field = va_arg(ap, unsigned long)) != UX11_END) {
	if (field == CWBackPixmap) {
	    wattr->background_pixmap = va_arg(ap, Pixmap);
	    value_mask |= CWBackPixmap;
	} else if (field == CWBackPixel) {
	    wattr->background_pixel = va_arg(ap, unsigned long);
	    value_mask |= CWBackPixel;
	} else if (field == CWBorderPixmap) {
	    wattr->border_pixel = va_arg(ap, Pixmap);
	    value_mask |= CWBorderPixmap;
	} else if (field == CWBorderPixel) {
	    wattr->border_pixel = va_arg(ap, unsigned long);
	    value_mask |= CWBorderPixel;
	} else if (field == CWBitGravity) {
	    wattr->bit_gravity = va_arg(ap, int);
	    value_mask |= CWBitGravity;
	} else if (field == CWWinGravity) {
	    wattr->win_gravity = va_arg(ap, int);
	    value_mask |= CWWinGravity;
	} else if (field == CWBackingStore) {
	    wattr->backing_store = va_arg(ap, int);
	    value_mask |= CWBackingStore;
	} else if (field == CWBackingPlanes) {
	    wattr->backing_planes = va_arg(ap, unsigned long);
	    value_mask |= CWBackingPlanes;
	} else if (field == CWBackingPixel) {
	    wattr->backing_pixel = va_arg(ap, unsigned long);
	    value_mask |= CWBackingPixel;
	} else if (field == CWOverrideRedirect) {
	    wattr->override_redirect = va_arg(ap, Bool);
	    value_mask |= CWOverrideRedirect;
	} else if (field == CWSaveUnder) {
	    wattr->save_under = va_arg(ap, Bool);
	    value_mask |= CWSaveUnder;
	} else if (field == CWEventMask) {
	    wattr->event_mask = va_arg(ap, long);
	    value_mask |= CWEventMask;
	} else if (field == CWDontPropagate) {
	    wattr->do_not_propagate_mask = va_arg(ap, long);
	    value_mask |= CWDontPropagate;
	} else if (field == CWColormap) {
	    wattr->colormap = va_arg(ap, Colormap);
	    value_mask |= CWColormap;
	} else if (field == CWCursor) {
	    wattr->cursor = va_arg(ap, Cursor);
	    value_mask |= CWCursor;
	} else {
	    /* Error - not real graceful here */
	    fprintf(stderr, "unknown field to ux11_fill_wattr: %x\n", field);
	    abort();
	}
    }
    va_end(ap);
    return value_mask;
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11f_watter.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11f_xa.c`
then
echo "writing ./xgraph-11/ux11/ux11f_xa.c"
cat > ./xgraph-11/ux11/ux11f_xa.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

VARARGS(ux11_fill_xa, int, (Arg *arg_list, int size, ...))
/*
 * int ux11_fill_xa(arg_list, size, name, value, ... , UX11_END)
 * Arg *arg_list;
 * int size;
 * String name;
 * XtArgVal value;
 * Sets the components of a X toolkit argument list.  The argument list
 * is passed in as `arg_list'.  Its size should be passed in as `size'.
 * The routine returns the number of arguments set if successful, zero
 * if not successful (e.g. not enough slots).
 */
{
    va_list ap;
    String field;
    int len;
#ifdef __STDC__
    va_start(ap, size);
#else
    Arg *arg_list;
    int size;

    va_start(ap);
    arg_list = va_arg(ap, Arg *);
    size = va_arg(ap, int);
#endif

    len = 0;
    while ((field = va_arg(ap, String)) != (String) UX11_END) {
	if (len >= size) {
	    /* Not enough slots */
	}
	arg_list[len].name = field;
	arg_list[len].value = va_arg(ap, XtArgVal);
	len++;
    }
    return len;
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11f_xa.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11g_value.c`
then
echo "writing ./xgraph-11/ux11/ux11g_value.c"
cat > ./xgraph-11/ux11/ux11g_value.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

char *ux11_get_value(argc, argv, value, def)
int argc;
char *argv[];
char *value;
char *def;
/*
 * Reads through all arguments looking for `value' (which is
 * usually a name preceeded by a - sign) and returns the
 * value found.  If no value is found,  def is returned.
 */
{
    int idx;
    char *ret_value = def;

    for (idx = 1;  idx < argc-1;  idx++) {
	if (strcmp(argv[idx], value) == 0) {
	    ret_value = argv[idx+1];
	    break;
	}
    }
    return ret_value;
}

\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11g_value.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11n_font.c`
then
echo "writing ./xgraph-11/ux11/ux11n_font.c"
cat > ./xgraph-11/ux11/ux11n_font.c << '\End\Of\Shar\'
/*
 * UX11 Utiltity Functions
 */

#include <stdio.h>
#include <strings.h>
#include "ux11.h"
#include "ux11_internal.h"
#include <X11/Xatom.h>

#define MAX_FONTS	100

int ux11_find_font(disp, scrn_num, pat, good_func, data_p, rtn_font, rtn_name)
Display *disp;			/* What display to examine */
int scrn_num;			/* Screen number           */
char *pat;			/* Font pattern            */
long (*good_func)();		/* Desirablity function    */
VOID_P data_p;			/* Data to function        */
XFontStruct **rtn_font;		/* Returned font           */
char **rtn_name;		/* Font name (returned)    */
/*
 * Locates an appropriate font.  Uses `good_func' to evaluate
 * the list of fonts from the server.  `good_func' has the
 * following form:
 *   long good_func(disp, scrn_num, font, data)
 *   Display *disp;
 *   int scrn_num;
 *   XFontStruct *font;
 *   VOID_P data;
 * This should return the desirability of the font (larger values
 * mean better visuals).  The `data' parameter is passed to
 * the function unchanged.  Returns a non-zero status if successful.
 */
{
    int font_count, i;
    long max_eval, eval;
    char **font_list;
    XFontStruct *font_data, *chosen_data;

    font_list = XListFonts(disp, pat, MAX_FONTS, &font_count);
    if (font_count <= 0) return 0;

    font_data = XLoadQueryFont(disp, font_list[0]);
    max_eval = (*good_func)(disp, scrn_num, font_data, data_p);
    *rtn_name = font_list[0];
    *rtn_font = font_data;

    for (i = 1;  i < font_count;  i++) {
	font_data = XLoadQueryFont(disp, font_list[i]);
	if (font_data) {
	    if ((eval = (*good_func)(disp, scrn_num, font_data, data_p)) > max_eval) {
		max_eval = eval;
		*rtn_name = font_list[i];
		XFreeFont(disp, *rtn_font);
		*rtn_font = font_data;
	    } else {
		XFreeFont(disp, font_data);
	    }
	}
    }
    *rtn_name = strcpy(malloc((unsigned) (strlen(*rtn_name)+1)), *rtn_name);
    XFreeFontNames(font_list);
    return 1;
}



typedef struct font_size_defn {
    long micrometers;		/* Size in micrometers (10e-6 meters) */
} font_size;

#define MAX_VALUE	23400L
#define ABS(val)	((val) < 0 ? (-(val)) : (val))

static long ux11_size_eval(disp, scrn_num, font, data)
Display *disp;			/* Display          */
int scrn_num;			/* Screen number    */
XFontStruct *font;		/* Font to examine  */
VOID_P data;			/* Data to function */
/*
 * This routine examines the font `font' and returns an evaluation
 * of it based on size.  The size is passed in as `data'.  If it
 * is close between fonts,  whether one is proportionally spaced
 * counts for a few more points.
 */
{
    font_size *desired_size = (font_size *) data;
    double um_per_pixel;
    long height;

    um_per_pixel = ((double) (DisplayHeightMM(disp, scrn_num) * 1000)) /
      ((double) DisplayHeight(disp, scrn_num));
    height = (int) ((((double)
		      (font->max_bounds.ascent + font->max_bounds.descent))
		     * um_per_pixel) + 0.5);
    return  (MAX_VALUE - ABS(height - desired_size->micrometers)) +
      (font->per_char ? 300 : 0);
}

int ux11_size_font(disp, scrn_num, size, rtn_font, rtn_name)
Display *disp;			/* What display to examine */
int scrn_num;			/* Screen number           */
long size;			/* Font size (micrometers) */
XFontStruct **rtn_font;		/* Returned font           */
char **rtn_name;		/* Returned name           */
/*
 * Finds the closest font supported on the indicated screen of
 * the supplied display whose size is `size' measured in micrometers.
 * The font is returned in `rtn_font' and its name is returned
 * in `rtn_name'.  The routine returns a non-zero status if
 * successful.  Only normal roman style fonts are examined.
 */
{
    font_size data;

    data.micrometers = size;
    return ux11_find_font(disp, scrn_num,
			  "*-medium-r-normal-*", ux11_size_eval, (VOID_P) &data,
			  rtn_font, rtn_name);
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11n_font.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11n_visual.c`
then
echo "writing ./xgraph-11/ux11/ux11n_visual.c"
cat > ./xgraph-11/ux11/ux11n_visual.c << '\End\Of\Shar\'
/*
 * UX11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

static XVisualInfo *get_all_visuals();

int ux11_find_visual(disp, good_func, rtn_vis)
Display *disp;			/* What display to examine */
int (*good_func)();		/* Desirability function   */
XVisualInfo *rtn_vis;		/* VisualInfo to fill in   */
/*
 * Locates an appropriate color visual.  Uses `good_func' to evaluate 
 * all visuals.  The function has the following form:
 *   int good_func(vis)
 *   XVisualInfo *vis;
 * Should return the desirability of the visual (larger values
 * mean better visuals).  Returns a non-zero status if successful.
 */
{
    XVisualInfo *vlist;
    int num_vis, idx, max_cost, cost;
    XVisualInfo *chosen;

    vlist = get_all_visuals(disp, &num_vis);
    if (!vlist) return 0;

    max_cost = (*good_func)(&(vlist[0]));
    chosen = vlist;
    for (idx = 1;  idx < num_vis;  idx++) {
	if ((cost = (*good_func)(&(vlist[idx]))) > max_cost) {
	    max_cost = cost;
	    chosen = &(vlist[idx]);
	}
    }
    *rtn_vis = *chosen;
    XFree(vlist);
    return 1;
}

static XVisualInfo *get_all_visuals(disp, num)
Display *disp;
int *num;
/*
 * Gets the visual list for for the specified display.  Number
 * of items returned in `num'.
 */
{
    return XGetVisualInfo(disp, VisualNoMask, (XVisualInfo *) 0, num);
}

\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11n_visual.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11s_vismap.c`
then
echo "writing ./xgraph-11/ux11/ux11s_vismap.c"
cat > ./xgraph-11/ux11/ux11s_vismap.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

#define UX11_MIN_DEPTH	4

int ux11_std_vismap(disp, rtn_vis, rtn_cmap, rtn_scrn, rtn_depth)
Display *disp;			/* Display to examine */
Visual **rtn_vis;		/* Returned visual    */
Colormap *rtn_cmap;		/* Returned colormap  */
int *rtn_scrn;			/* Returned screen    */
int *rtn_depth;			/* Returned depth     */
/*
 * This routine tries to find a visual/colormap pair that
 * supports color for `disp'.  The following steps are
 * used to determine this pair:
 *  1.  The default depth of the default screen is examined.
 *      If it is more than four,  the default visual and
 *      colormap for the display is returned.
 *  2.  ux11_find_visual is used to see if there is a good
 *      alternate visual available (better than the default).
 *      If so,  a new colormap is made for the visual
 *      and it is returned.  If no good alternative is
 *      found,  the routine returns the default visual/colormap.
 * The routine returns zero if unsuccessful.  It returns UX11_DEFAULT
 * if the default is returned,  and UX11_ALTERNATE if a non-defualt
 * visual/colormap is returned.
 */
{
    int def_depth;
    XVisualInfo info;

    def_depth = DefaultDepth(disp, DefaultScreen(disp));
    if (def_depth > UX11_MIN_DEPTH) {
	/* Plenty and sufficient default resources */
	*rtn_vis = DefaultVisual(disp, DefaultScreen(disp));
	*rtn_cmap = DefaultColormap(disp, DefaultScreen(disp));
	*rtn_scrn = DefaultScreen(disp);
	*rtn_depth = DefaultDepth(disp, DefaultScreen(disp));
	return UX11_DEFAULT;
    } else {
	/* Try to find another suitable visual */
	if (ux11_find_visual(disp, ux11_color_vis, &info)) {
	    /* Is it bettern -- this could be a better test */
	    if (info.depth > UX11_MIN_DEPTH) {
		*rtn_vis = info.visual;
		*rtn_scrn = info.screen;
		*rtn_depth = info.depth;

		/* New colormap required */
		*rtn_cmap = XCreateColormap(disp,
					    RootWindow(disp, info.screen),
					    info.visual, AllocNone);
		if (*rtn_cmap) {
		    return UX11_ALTERNATE;
		} else {
		    return 0;
		}
	    } else {
		/* Back to the default */
		*rtn_vis = DefaultVisual(disp, DefaultScreen(disp));
		*rtn_cmap = DefaultColormap(disp, DefaultScreen(disp));
		*rtn_scrn = DefaultScreen(disp);
		*rtn_depth = DefaultDepth(disp, DefaultScreen(disp));
		return UX11_DEFAULT;
	    }
	} else {
	    return 0;
	}
    }
}



int ux11_color_vis(vis)
XVisualInfo *vis;		/* Visual to examine */
/*
 * Returns a desirability index for the passed visual.
 * This functions preference list is:
 *   PsuedoColor
 *   DirectColor
 *   StaticColor
 *   TrueColor
 *   GrayScale
 *   StaticGray
 */
{
    switch (vis->class) {
    case PseudoColor:
	return vis->colormap_size * 100;
	break;
    case DirectColor:
	return vis->depth * 1000;
	break;
    case StaticColor:
	return vis->colormap_size * 50;
	break;
    case TrueColor:
	return vis->depth * 500;
	break;
    case GrayScale:
	return vis->colormap_size * 25;
	break;
    case StaticGray:
	return vis->depth * 250;
       	break;
    default:
	fprintf(stderr, "Unknown visual type: %d\n", vis->class);
	abort();
    }
}
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11s_vismap.c"
fi
if `test ! -s ./xgraph-11/ux11/ux11w_props.c`
then
echo "writing ./xgraph-11/ux11/ux11w_props.c"
cat > ./xgraph-11/ux11/ux11w_props.c << '\End\Of\Shar\'
/*
 * X11 Utility Functions
 */

#include <stdio.h>
#include "ux11.h"
#include "ux11_internal.h"

VARARGS(ux11_win_props, void, (Window win, ...))
/*
 * ux11_win_propts(win, name, value, ... , UX11_END)
 * Window win;
 * Sets or replaces standard window property values for
 * the window `win'.  The property names are defined
 * in ux11.h.  May be implemented later.
 */
{

}
 
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/ux11/ux11w_props.c"
fi
if `test ! -d ./xgraph-11/xtb`
then
  mkdir ./xgraph-11/xtb
  echo "mkdir ./xgraph-11/xtb"
fi
if `test ! -s ./xgraph-11/xtb/Makefile`
then
echo "writing ./xgraph-11/xtb/Makefile"
cat > ./xgraph-11/xtb/Makefile << '\End\Of\Shar\'
#
# Makefile for xtb Toolkit library
#

CLEVEL	= -g
CFLAGS	= $(CLEVEL)
CC	= cc

TARGET	= libxtb.a

SOURCES = xtb.c
OBJECTS = xtb.o

TAGFILE	= TAGS

#---------

.c.o:
		$(CC) $(CFLAGS) -c $*.c
		ar r $(TARGET) $*.o

$(TARGET):	$(OBJECTS)
		ranlib $(TARGET)

$(TAGFILE):	$(SOURCES)
		ctags -eut $(SOURCES)

clean:
		rm -rf $(TARGET) $(OBJECTS)

\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/xtb/Makefile"
fi
if `test ! -s ./xgraph-11/xtb/xtb.h`
then
echo "writing ./xgraph-11/xtb/xtb.h"
cat > ./xgraph-11/xtb/xtb.h << '\End\Of\Shar\'
/*
 * xtb - a mini-toolbox for X11
 *
 * David Harrison
 * University of California, Berkeley
 * 1988
 */

#ifndef _XTB_
#define _XTB_

#include "../copyright.h"

/* Handler function return codes */
typedef enum xtb_hret_defn { XTB_NOTDEF, XTB_HANDLED, XTB_STOP } xtb_hret;

/* If you have an ANSI compiler,  some checking will be done */
#ifdef __STDC__
#define DECLARE(func, rtn, args)	extern rtn func args
typedef void *xtb_data;
#else
#define DECLARE(func, rtn, args)	extern rtn func ()
typedef char *xtb_data;
#endif

/* Basic return value */
typedef struct xtb_frame_defn {
    Window win;
    int x_loc, y_loc;
    unsigned int width, height;
} xtb_frame;

DECLARE(xtb_init, void, (Display *disp, int scrn,
			 unsigned long foreground,
			 unsigned long background,
			 XFontStruct *font));
   /* Initializes mini-toolbox */

/*
 * Basic event handling
 */

DECLARE(xtb_register, void, (Window win,
			     xtb_hret (*func)(XEvent *evt, xtb_data info),
			     xtb_data info));
   /* Registers call-back function */

DECLARE(xtb_lookup, xtb_data, (Window win));
   /* Returns data associated with window */

DECLARE(xtb_dispatch, xtb_hret, (XEvent *evt));
   /* Dispatches events for mini-toolbox */

DECLARE(xtb_unregister, int, (Window win, xtb_data *info));
   /* Unregisters a call-back function */

/*
 * Command button frame
 */

DECLARE(xtb_bt_new, void, (Window win, char *text,
			   xtb_hret (*func)(Window win, int state,
				       xtb_data val),
			   xtb_data val,
			   xtb_frame *frame));
   /* Creates new button  */

DECLARE(xtb_bt_get, int, (Window win, xtb_data *stuff));
   /* Returns state of button */
DECLARE(xtb_bt_set, int, (Window win, int val, xtb_data stuff));
   /* Sets state of button */
DECLARE(xtb_bt_del, void, (Window win, xtb_data *info));
   /* Deletes a button */

/*
 * Button row frame - built on top of buttons
 */

DECLARE(xtb_br_new, void, (Window win, int cnt, char *lbls[], int init,
			   xtb_hret (*func)(Window win, int prev,
					    int this, xtb_data val),
			   xtb_data val,
			   xtb_frame *frame));
   /* Creates a new button row frame */

DECLARE(xtb_br_get, int, (Window win));
   /* Returns currently selected button */
DECLARE(xtb_br_del, void, (Window win));
   /* Deletes a button row */

/*
 * Text output (label) frames
 */

DECLARE(xtb_to_new, void, (Window win, char *text,
			   XFontStruct *ft, xtb_frame *frame));
   /* Create new text output frame */
DECLARE(xtb_to_del, void, (Window win));

/*
 * Text input (editable text) frames
 */

#define MAXCHBUF	1024

DECLARE(xtb_ti_new, void, (Window win, char *text, int maxchar,
			   xtb_hret (*func)(Window win, int ch,
					    char *textcopy, xtb_data *val),
			   xtb_data val, xtb_frame *frame));
   /* Creates a new text input frame */		   

DECLARE(xtb_ti_get, void, (Window win, char text[MAXCHBUF], xtb_data *val));
   /* Returns state of text input frame */
DECLARE(xtb_ti_set, int, (Window win, char *text, xtb_data val));
   /* Sets the state of text input frame */
DECLARE(xtb_ti_ins, int, (Window win, int ch));
   /* Inserts character onto end of text input frame */
DECLARE(xtb_ti_dch, int, (Window win));
   /* Deletes character from end of text input frame */
DECLARE(xtb_ti_del, void, (Window win, xtb_data *info));
   /* Deletes an text input frame */

/*
 * Block frame
 */

DECLARE(xtb_bk_new, void, (Window win, unsigned width, unsigned height,
			   xtb_frame *frame));
   /* Makes a new block frame */
DECLARE(xtb_bk_del, void, (Window win));
   /* Deletes a block frame */


/*
 * Formatting support
 */

#define MAX_BRANCH	50

typedef enum xtb_fmt_types_defn { W_TYPE, A_TYPE } xtb_fmt_types;
typedef enum xtb_fmt_dir_defn { HORIZONTAL, VERTICAL } xtb_fmt_dir;
typedef enum xtb_just_defn {
    XTB_CENTER=0, XTB_LEFT, XTB_RIGHT, XTB_TOP, XTB_BOTTOM
} xtb_just;

typedef struct xtb_fmt_widget_defn {
    xtb_fmt_types type;		/* W_TYPE */
    xtb_frame *w;
} xtb_fmt_widget;

typedef struct xtb_fmt_align_defn {
    xtb_fmt_types type;		/* A_TYPE */
    xtb_fmt_dir dir;		/* HORIZONTAL or VERTICAL */
    int padding;		/* Outside padding        */
    int interspace;		/* Internal padding       */
    xtb_just just;		/* Justification          */
    int ni;			/* Number of items */
    union xtb_fmt_defn *items[MAX_BRANCH]; /* Branches themselves */
} xtb_fmt_align;

typedef union xtb_fmt_defn {
    xtb_fmt_types type;		/* W_TYPE or A_TYPE */
    xtb_fmt_widget wid;
    xtb_fmt_align align;
} xtb_fmt;

#define NE	0

DECLARE(xtb_w, xtb_fmt *, (xtb_frame *w));
   /* Returns formatting structure for frame */
DECLARE(xtb_hort, xtb_fmt *, (xtb_just just, int padding, int interspace, ...));
   /* Varargs routine for horizontal formatting */
DECLARE(xtb_vert, xtb_fmt *, (xtb_just just, int padding, int interspace, ...));
   /* Varargs routine for vertical formatting */
DECLARE(xtb_fmt_do, xtb_fmt *, (xtb_fmt *def, unsigned *w, unsigned *h));
   /* Carries out formatting */
DECLARE(xtb_mv_frames, void, (int nf, xtb_frame frames[]));
   /* Actually moves widgets */
DECLARE(xtb_fmt_free, void, (xtb_fmt *def));
   /* Frees resources claimed by xtb_w, xtb_hort, and xtb_vert */

#endif /* _XTB_ */
\End\Of\Shar\
else
  echo "will not over write ./xgraph-11/xtb/xtb.h"
fi
echo "Finished archive 1 of 6"