[comp.sources.x] v08i078: chaos, Part02/10

ken@uunet.UU.NET (Ken Marks (x2425)) (08/21/90)

Submitted-by: balr!panasun!ken@uunet.UU.NET (Ken Marks (x2425))
Posting-number: Volume 8, Issue 78
Archive-name: chaos/part02

#! /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 2 (of 10)."
# Contents:  common/showEvent.c gencmap/Imakefile gencmap/gencmap.c
#   widgets/List.c
# Wrapped by ken@panasun on Mon Jul 30 14:59:47 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'common/showEvent.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'common/showEvent.c'\"
else
echo shar: Extracting \"'common/showEvent.c'\" \(23550 characters\)
sed "s/^X//" >'common/showEvent.c' <<'END_OF_FILE'
X/*
X * Copyright (c) Ken W. Marks 1989, 1990.
X */
X
X#include <stdio.h>
X#include <X11/Intrinsic.h>
X#include <X11/Xproto.h>
X#include <Chaos.h>
X
XBoolean use_separate_lines = True;
Xstatic char *sep;
X
X/******************************************************************************/
X/**** Miscellaneous routines to convert values to their string equivalents ****/
X/******************************************************************************/
X
X/* Returns the string equivalent of a boolean parameter */
Xstatic char *TorF(bool)
Xint bool;
X{
X    switch (bool)
X    {
X    case True:
X	return ("True");
X
X    case False:
X	return ("False");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a property notify state */
Xstatic char *PropertyState(state)
Xint state;
X{
X    switch (state)
X    {
X    case PropertyNewValue:
X	return ("PropertyNewValue");
X
X    case PropertyDelete:
X	return ("PropertyDelete");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a visibility notify state */
Xstatic char *VisibilityState(state)
Xint state;
X{
X    switch (state)
X    {
X    case VisibilityUnobscured:
X	return ("VisibilityUnobscured");
X
X    case VisibilityPartiallyObscured:
X	return ("VisibilityPartiallyObscured");
X
X    case VisibilityFullyObscured:
X	return ("VisibilityFullyObscured");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a timestamp */
Xstatic char *ServerTime(time)
XTime time;
X{
X    unsigned long msec;
X    unsigned long sec;
X    unsigned long min;
X    unsigned long hr;
X    unsigned long day;
X    static char buffer[32];
X
X    msec = time % 1000;
X    time /= 1000;
X    sec = time % 60;
X    time /= 60;
X    min = time % 60;
X    time /= 60;
X    hr = time % 24;
X    time /= 24;
X    day = time;
X
X    (void) sprintf(buffer, "%d day%s %02d:%02d:%02d.%03d",
X      day, day == 1 ? "" : "(s)", hr, min, sec, msec);
X    return (buffer);
X}
X
X/* Simple structure to ease the interpretation of masks */
Xtypedef struct _MaskType
X{
X    unsigned int value;
X    char *string;
X} MaskType;
X
X/* Returns the string equivalent of a mask of buttons and modifier keys */
Xstatic char *ButtonOrModifierState(state)
Xunsigned int state;
X{
X    static char buffer[256];
X    static MaskType masks[] = {
X	{ShiftMask, "ShiftMask"},
X	{LockMask, "LockMask"},
X	{ControlMask, "ControlMask"},
X	{Mod1Mask, "Mod1Mask"},
X	{Mod2Mask, "Mod2Mask"},
X	{Mod3Mask, "Mod3Mask"},
X	{Mod4Mask, "Mod4Mask"},
X	{Mod5Mask, "Mod5Mask"},
X	{Button1Mask, "Button1Mask"},
X	{Button2Mask, "Button2Mask"},
X	{Button3Mask, "Button3Mask"},
X	{Button4Mask, "Button4Mask"},
X	{Button5Mask, "Button5Mask"},
X    };
X    int num_masks = sizeof(masks) / sizeof(MaskType);
X    int ii;
X    Boolean first = True;
X
X    buffer[0] = NULL;
X
X    if (state == 0)
X	return (buffer);
X
X    for (ii = 0; ii < num_masks; ii++)
X	if (state & masks[ii].value)
X	    if (first)
X	    {
X		first = False;
X		(void) strcat(buffer, masks[ii].string);
X	    }
X	    else
X	    {
X		(void) strcat(buffer, " | ");
X		(void) strcat(buffer, masks[ii].string);
X	    }
X    return (buffer);
X}
X
X/* Returns the string equivalent of a mask of configure window values */
Xstatic char *ConfigureValueMask(valuemask)
Xunsigned long valuemask;
X{
X    static char buffer[256];
X    static MaskType masks[] = {
X	{CWX, "CWX"},
X	{CWY, "CWY"},
X	{CWWidth, "CWWidth"},
X	{CWHeight, "CWHeight"},
X	{CWBorderWidth, "CWBorderWidth"},
X	{CWSibling, "CWSibling"},
X	{CWStackMode, "CWStackMode"},
X    };
X    int num_masks = sizeof(masks) / sizeof(MaskType);
X    int ii;
X    Boolean first = True;
X
X    buffer[0] = NULL;
X
X    if (valuemask == 0)
X	return (buffer);
X
X    for (ii = 0; ii < num_masks; ii++)
X	if (valuemask & masks[ii].value)
X	    if (first)
X	    {
X		first = False;
X		(void) strcat(buffer, masks[ii].string);
X	    }
X	    else
X	    {
X		(void) strcat(buffer, " | ");
X		(void) strcat(buffer, masks[ii].string);
X	    }
X
X    return (buffer);
X}
X
X/* Returns the string equivalent of a motion hint */
Xstatic char *IsHint(is_hint)
Xchar is_hint;
X{
X    switch (is_hint)
X    {
X    case NotifyNormal:
X	return ("NotifyNormal");
X
X    case NotifyHint:
X	return ("NotifyHint");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of an id or the value "None" */
Xstatic char *MaybeNone(value)
Xint value;
X{
X    static char buffer[16];
X
X    if (value == None)
X	return ("None");
X    else
X    {
X	(void) sprintf(buffer, "0x%x", value);
X	return (buffer);
X    }
X}
X
X/* Returns the string equivalent of a colormap state */
Xstatic char *ColormapState(state)
Xint state;
X{
X    switch (state)
X    {
X    case ColormapInstalled:
X	return ("ColormapInstalled");
X
X    case ColormapUninstalled:
X	return ("ColormapUninstalled");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a crossing detail */
Xstatic char *CrossingDetail(detail)
Xint detail;
X{
X    switch (detail)
X    {
X    case NotifyAncestor:
X	return ("NotifyAncestor");
X
X    case NotifyInferior:
X	return ("NotifyInferior");
X
X    case NotifyVirtual:
X	return ("NotifyVirtual");
X
X    case NotifyNonlinear:
X	return ("NotifyNonlinear");
X
X    case NotifyNonlinearVirtual:
X	return ("NotifyNonlinearVirtual");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a focus change detail */
Xstatic char *FocusChangeDetail(detail)
Xint detail;
X{
X    switch (detail)
X    {
X    case NotifyAncestor:
X	return ("NotifyAncestor");
X
X    case NotifyInferior:
X	return ("NotifyInferior");
X
X    case NotifyVirtual:
X	return ("NotifyVirtual");
X
X    case NotifyNonlinear:
X	return ("NotifyNonlinear");
X
X    case NotifyNonlinearVirtual:
X	return ("NotifyNonlinearVirtual");
X
X    case NotifyPointer:
X	return ("NotifyPointer");
X
X    case NotifyPointerRoot:
X	return ("NotifyPointerRoot");
X
X    case NotifyDetailNone:
X	return ("NotifyDetailNone");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a configure detail */
Xstatic char *ConfigureDetail(detail)
Xint detail;
X{
X    switch (detail)
X    {
X    case Above:
X	return ("Above");
X
X    case Below:
X	return ("Below");
X
X    case TopIf:
X	return ("TopIf");
X
X    case BottomIf:
X	return ("BottomIf");
X
X    case Opposite:
X	return ("Opposite");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a grab mode */
Xstatic char *GrabMode(mode)
Xint mode;
X{
X    switch (mode)
X    {
X    case NotifyNormal:
X	return ("NotifyNormal");
X
X    case NotifyGrab:
X	return ("NotifyGrab");
X
X    case NotifyUngrab:
X	return ("NotifyUngrab");
X
X    case NotifyWhileGrabbed:
X	return ("NotifyWhileGrabbed");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a mapping request */
Xstatic char *MappingRequest(request)
Xint request;
X{
X    switch (request)
X    {
X    case MappingModifier:
X	return ("MappingModifier");
X
X    case MappingKeyboard:
X	return ("MappingKeyboard");
X
X    case MappingPointer:
X	return ("MappingPointer");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a stacking order place */
Xstatic char *Place(place)
Xint place;
X{
X    switch (place)
X    {
X    case PlaceOnTop:
X	return ("PlaceOnTop");
X
X    case PlaceOnBottom:
X	return ("PlaceOnBottom");
X
X    default:
X	return ("?");
X    }
X}
X
X/* Returns the string equivalent of a major code */
Xstatic char *MajorCode(code)
Xint code;
X{
X    static char buffer[32];
X
X    switch (code)
X    {
X    case X_CopyArea:
X	return ("X_CopyArea");
X
X    case X_CopyPlane:
X	return ("X_CopyPlane");
X
X    default:
X	(void) sprintf(buffer, "0x%x", code);
X	return (buffer);
X    }
X}
X
X/* Returns the string equivalent the keycode contained in the key event */
Xstatic char *Keycode(ev)
XXKeyEvent *ev;
X{
X    static char buffer[256];
X    KeySym keysym_str;
X    char *keysym_name;
X    char string[256];
X
X    XLookupString(ev, string, 64, &keysym_str, NULL);
X
X    if (keysym_str == NoSymbol)
X	keysym_name = "NoSymbol";
X    else if (!(keysym_name = XKeysymToString(keysym_str)))
X	keysym_name = "(no name)";
X    (void) sprintf(buffer, "%u (keysym 0x%x \"%s\")",
X      ev->keycode, keysym_str, keysym_name);
X    return (buffer);
X}
X
X/* Returns the string equivalent of an atom or "None"*/
Xstatic char *AtomName(dpy, atom)
XDisplay *dpy;
XAtom atom;
X{
X    static char buffer[256];
X    char *atom_name;
X
X    if (atom == None)
X	return ("None");
X
X    atom_name = XGetAtomName(dpy, atom);
X    (void) strncpy(buffer, atom_name, 256);
X    free(atom_name);
X
X    return (buffer);
X}
X
X/******************************************************************************/
X/**** Routines to print out readable values for the field of various events ***/
X/******************************************************************************/
X
Xstatic void VerbMotion(ev)
XXMotionEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("root = 0x%x%s", ev->root, sep);
X    (void) printf("subwindow = 0x%x%s", ev->subwindow, sep);
X    (void) printf("time = %s%s", ServerTime(ev->time), sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("x_root = %d  y_root = %d%s", ev->x_root, ev->y_root, sep);
X    (void) printf("state = %s%s", ButtonOrModifierState(ev->state), sep);
X    (void) printf("is_hint = %s%s", IsHint(ev->is_hint), sep);
X    (void) printf("same_screen = %s\n", TorF(ev->same_screen));
X}
X
Xstatic void VerbButton(ev)
XXButtonEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("root = 0x%x%s", ev->root, sep);
X    (void) printf("subwindow = 0x%x%s", ev->subwindow, sep);
X    (void) printf("time = %s%s", ServerTime(ev->time), sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("x_root = %d  y_root = %d%s", ev->x_root, ev->y_root, sep);
X    (void) printf("state = %s%s", ButtonOrModifierState(ev->state), sep);
X    (void) printf("button = Button%d%s", ev->button, sep);
X    (void) printf("same_screen = %s\n", TorF(ev->same_screen));
X}
X
Xstatic void VerbColormap(ev)
XXColormapEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("colormap = %s%s", MaybeNone((int) (ev->colormap)), sep);
X    (void) printf("new = %s%s", TorF(ev->new), sep);
X    (void) printf("state = %s\n", ColormapState(ev->state));
X}
X
Xstatic void VerbCrossing(ev)
XXCrossingEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("root = 0x%x%s", ev->root, sep);
X    (void) printf("subwindow = 0x%x%s", ev->subwindow, sep);
X    (void) printf("time = %s%s", ServerTime(ev->time), sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("x_root = %d  y_root = %d%s", ev->x_root, ev->y_root, sep);
X    (void) printf("mode = %s%s", GrabMode(ev->mode), sep);
X    (void) printf("detail = %s%s", CrossingDetail(ev->detail), sep);
X    (void) printf("same_screen = %s%s", TorF(ev->same_screen), sep);
X    (void) printf("focus = %s%s", TorF(ev->focus), sep);
X    (void) printf("state = %s\n", ButtonOrModifierState(ev->state));
X}
X
Xstatic void VerbExpose(ev)
XXExposeEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("width = %d height = %d%s", ev->width, ev->height, sep);
X    (void) printf("count = %d\n", ev->count);
X}
X
Xstatic void VerbGraphicsExpose(ev)
XXGraphicsExposeEvent *ev;
X{
X    (void) printf("drawable = 0x%x%s", ev->drawable, sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("width = %d height = %d%s", ev->width, ev->height, sep);
X    (void) printf("major_code = %s%s", MajorCode(ev->major_code), sep);
X    (void) printf("minor_code = %d\n", ev->minor_code);
X}
X
Xstatic void VerbNoExpose(ev)
XXNoExposeEvent *ev;
X{
X    (void) printf("drawable = 0x%x%s", ev->drawable, sep);
X    (void) printf("major_code = %s%s", MajorCode(ev->major_code), sep);
X    (void) printf("minor_code = %d\n", ev->minor_code);
X}
X
Xstatic void VerbFocus(ev)
XXFocusChangeEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("mode = %s%s", GrabMode(ev->mode), sep);
X    (void) printf("detail = %s\n", FocusChangeDetail(ev->detail));
X}
X
Xstatic void VerbKeymap(ev)
XXKeymapEvent *ev;
X{
X    int ii;
X
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("key_vector = ");
X    for (ii = 0; ii < 32; ii++)
X	(void) printf("%02x", ev->key_vector[ii]);
X    (void) printf("\n");
X}
X
Xstatic void VerbKey(ev)
XXKeyEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("root = 0x%x%s", ev->root, sep);
X    (void) printf("subwindow = 0x%x%s", ev->subwindow, sep);
X    (void) printf("time = %s%s", ServerTime(ev->time), sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("x_root = %d  y_root = %d%s", ev->x_root, ev->y_root, sep);
X    (void) printf("state = %s%s", ButtonOrModifierState(ev->state), sep);
X    (void) printf("keycode = %s%s", Keycode(ev), sep);
X    (void) printf("same_screen = %s\n", TorF(ev->same_screen));
X}
X
Xstatic void VerbProperty(ev)
XXPropertyEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("atom = %s%s", AtomName(ev->display, ev->atom), sep);
X    (void) printf("time = %s%s", ServerTime(ev->time), sep);
X    (void) printf("state = %s\n", PropertyState(ev->state));
X}
X
Xstatic void VerbResizeRequest(ev)
XXResizeRequestEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("width = %d height = %d\n", ev->width, ev->height);
X}
X
Xstatic void VerbCirculate(ev)
XXCirculateEvent *ev;
X{
X    (void) printf("event = 0x%x%s", ev->event, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("place = %s\n", Place(ev->place));
X}
X
Xstatic void VerbConfigure(ev)
XXConfigureEvent *ev;
X{
X    (void) printf("event = 0x%x%s", ev->event, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("width = %d height = %d%s", ev->width, ev->height, sep);
X    (void) printf("border_width = %d%s", ev->border_width, sep);
X    (void) printf("above = %s%s", MaybeNone((int) (ev->above)), sep);
X    (void) printf("override_redirect = %s\n", TorF(ev->override_redirect));
X}
X
Xstatic void VerbCreateWindow(ev)
XXCreateWindowEvent *ev;
X{
X    (void) printf("parent = 0x%x%s", ev->parent, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("width = %d height = %d%s", ev->width, ev->height, sep);
X    (void) printf("border_width = %d%s", ev->border_width, sep);
X    (void) printf("override_redirect = %s\n", TorF(ev->override_redirect));
X}
X
Xstatic void VerbDestroyWindow(ev)
XXDestroyWindowEvent *ev;
X{
X    (void) printf("event = 0x%x%s", ev->event, sep);
X    (void) printf("window = 0x%x\n", ev->window);
X}
X
Xstatic void VerbGravity(ev)
XXGravityEvent *ev;
X{
X    (void) printf("event = 0x%x%s", ev->event, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("x = %d  y = %d\n", ev->x, ev->y);
X}
X
Xstatic void VerbMap(ev)
XXMapEvent *ev;
X{
X    (void) printf("event = 0x%x%s", ev->event, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("override_redirect = %s\n", TorF(ev->override_redirect));
X}
X
Xstatic void VerbReparent(ev)
XXReparentEvent *ev;
X{
X    (void) printf("event = 0x%x%s", ev->event, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("parent = 0x%x%s", ev->parent, sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("override_redirect = %s\n", TorF(ev->override_redirect));
X}
X
Xstatic void VerbUnmap(ev)
XXUnmapEvent *ev;
X{
X    (void) printf("event = 0x%x%s", ev->event, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("from_configure = %s\n", TorF(ev->from_configure));
X}
X
Xstatic void VerbCirculateRequest(ev)
XXCirculateRequestEvent *ev;
X{
X    (void) printf("parent = 0x%x%s", ev->parent, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("place = %s\n", Place(ev->place));
X}
X
Xstatic void VerbConfigureRequest(ev)
XXConfigureRequestEvent *ev;
X{
X    (void) printf("parent = 0x%x%s", ev->parent, sep);
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("x = %d  y = %d%s", ev->x, ev->y, sep);
X    (void) printf("width = %d height = %d%s", ev->width, ev->height, sep);
X    (void) printf("border_width = %d%s", ev->border_width, sep);
X    (void) printf("above = %s%s", MaybeNone((int) (ev->above)), sep);
X    (void) printf("detail = 0x%x%s", ConfigureDetail(ev->detail), sep);
X    (void) printf("value_mask = %s\n", ConfigureValueMask(ev->value_mask));
X}
X
Xstatic void VerbMapRequest(ev)
XXMapRequestEvent *ev;
X{
X    (void) printf("parent = 0x%x%s", ev->parent, sep);
X    (void) printf("window = 0x%x\n", ev->window);
X}
X
Xstatic void VerbClient(ev)
XXClientMessageEvent *ev;
X{
X    int ii;
X
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("message_type = %s%s", AtomName(ev->display,
X	ev->message_type), sep);
X    (void) printf("format = %d\n", ev->format);
X    (void) printf("data (shown as longs) = ");
X    for (ii = 0; ii < 5; ii++)
X	(void) printf(" 0x%08x", ev->data.l[ii]);
X    (void) printf("\n");
X}
X
Xstatic void VerbMapping(ev)
XXMappingEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("request = 0x%x%s", MappingRequest(ev->request), sep);
X    (void) printf("first_keycode = 0x%x%s", ev->first_keycode, sep);
X    (void) printf("count = 0x%x\n", ev->count);
X}
X
Xstatic void VerbSelectionClear(ev)
XXSelectionClearEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("selection = %s%s", AtomName(ev->display, ev->selection),
X      sep);
X    (void) printf("time = %s\n", ServerTime(ev->time));
X}
X
Xstatic void VerbSelection(ev)
XXSelectionEvent *ev;
X{
X    (void) printf("requestor = 0x%x%s", ev->requestor, sep);
X    (void) printf("selection = %s%s", AtomName(ev->display, ev->selection),
X      sep);
X    (void) printf("target = %s%s", AtomName(ev->display, ev->target), sep);
X    (void) printf("property = %s%s", AtomName(ev->display, ev->property), sep);
X    (void) printf("time = %s\n", ServerTime(ev->time));
X}
X
Xstatic void VerbSelectionRequest(ev)
XXSelectionRequestEvent *ev;
X{
X    (void) printf("owner = 0x%x%s", ev->owner, sep);
X    (void) printf("requestor = 0x%x%s", ev->requestor, sep);
X    (void) printf("selection = %s%s", AtomName(ev->display, ev->selection),
X      sep);
X    (void) printf("target = %s%s", AtomName(ev->display, ev->target), sep);
X    (void) printf("property = %s%s", AtomName(ev->display, ev->property), sep);
X    (void) printf("time = %s\n", ServerTime(ev->time));
X}
X
Xstatic void VerbVisibility(ev)
XXVisibilityEvent *ev;
X{
X    (void) printf("window = 0x%x%s", ev->window, sep);
X    (void) printf("state = %s\n", VisibilityState(ev->state));
X}
X
X/******************************************************************************/
X/************ Return the string representation for type of an event ***********/
X/******************************************************************************/
X
Xchar *GetEventType(ev)
XXEvent *ev;
X{
X    switch (ev->type)
X    {
X    case KeyPress:
X	return ("KeyPress");
X    case KeyRelease:
X	return ("KeyRelease");
X    case ButtonPress:
X	return ("ButtonPress");
X    case ButtonRelease:
X	return ("ButtonRelease");
X    case MotionNotify:
X	return ("MotionNotify");
X    case EnterNotify:
X	return ("EnterNotify");
X    case LeaveNotify:
X	return ("LeaveNotify");
X    case FocusIn:
X	return ("FocusIn");
X    case FocusOut:
X	return ("FocusOut");
X    case KeymapNotify:
X	return ("KeymapNotify");
X    case Expose:
X	return ("Expose");
X    case GraphicsExpose:
X	return ("GraphicsExpose");
X    case NoExpose:
X	return ("NoExpose");
X    case VisibilityNotify:
X	return ("VisibilityNotify");
X    case CreateNotify:
X	return ("CreateNotify");
X    case DestroyNotify:
X	return ("DestroyNotify");
X    case UnmapNotify:
X	return ("UnmapNotify");
X    case MapNotify:
X	return ("MapNotify");
X    case MapRequest:
X	return ("MapRequest");
X    case ReparentNotify:
X	return ("ReparentNotify");
X    case ConfigureNotify:
X	return ("ConfigureNotify");
X    case ConfigureRequest:
X	return ("ConfigureRequest");
X    case GravityNotify:
X	return ("GravityNotify");
X    case ResizeRequest:
X	return ("ResizeRequest");
X    case CirculateNotify:
X	return ("CirculateNotify");
X    case CirculateRequest:
X	return ("CirculateRequest");
X    case PropertyNotify:
X	return ("PropertyNotify");
X    case SelectionClear:
X	return ("SelectionClear");
X    case SelectionRequest:
X	return ("SelectionRequest");
X    case SelectionNotify:
X	return ("SelectionNotify");
X    case ColormapNotify:
X	return ("ColormapNotify");
X    case ClientMessage:
X	return ("ClientMessage");
X    case MappingNotify:
X	return ("MappingNotify");
X    }
X    return (NULL);		/* this makes lint happy */
X}
X
X/******************************************************************************/
X/**************** Print the values of all fields for any event ****************/
X/******************************************************************************/
X
Xvoid ShowEvent(ev)
XXAnyEvent *ev;
X{
X    /* determine which field separator to use */
X    if (use_separate_lines)
X	sep = "\n";
X    else
X	sep = " ";
X
X    (void) printf("type = %s%s", GetEventType((XEvent *) ev), sep);
X    (void) printf("serial = %d%s", ev->serial, sep);
X    (void) printf("send_event = %s%s", TorF(ev->send_event), sep);
X    (void) printf("display = 0x%x%s", ev->display, sep);
X
X    switch (ev->type)
X    {
X    case MotionNotify:
X	VerbMotion((XMotionEvent *) ev);
X	break;
X
X    case ButtonPress:
X    case ButtonRelease:
X	VerbButton((XButtonEvent *) ev);
X	break;
X
X    case ColormapNotify:
X	VerbColormap((XColormapEvent *) ev);
X	break;
X
X    case EnterNotify:
X    case LeaveNotify:
X	VerbCrossing((XCrossingEvent *) ev);
X	break;
X
X    case Expose:
X	VerbExpose((XExposeEvent *) ev);
X	break;
X
X    case GraphicsExpose:
X	VerbGraphicsExpose((XGraphicsExposeEvent *) ev);
X	break;
X
X    case NoExpose:
X	VerbNoExpose((XNoExposeEvent *) ev);
X	break;
X
X    case FocusIn:
X    case FocusOut:
X	VerbFocus((XFocusChangeEvent *) ev);
X	break;
X
X    case KeymapNotify:
X	VerbKeymap((XKeymapEvent *) ev);
X	break;
X
X    case KeyPress:
X    case KeyRelease:
X	VerbKey((XKeyEvent *) ev);
X	break;
X
X    case PropertyNotify:
X	VerbProperty((XPropertyEvent *) ev);
X	break;
X
X    case ResizeRequest:
X	VerbResizeRequest((XResizeRequestEvent *) ev);
X	break;
X
X    case CirculateNotify:
X	VerbCirculate((XCirculateEvent *) ev);
X	break;
X
X    case ConfigureNotify:
X	VerbConfigure((XConfigureEvent *) ev);
X	break;
X
X    case CreateNotify:
X	VerbCreateWindow((XCreateWindowEvent *) ev);
X	break;
X
X    case DestroyNotify:
X	VerbDestroyWindow((XDestroyWindowEvent *) ev);
X	break;
X
X    case GravityNotify:
X	VerbGravity((XGravityEvent *) ev);
X	break;
X
X    case MapNotify:
X	VerbMap((XMapEvent *) ev);
X	break;
X
X    case ReparentNotify:
X	VerbReparent((XReparentEvent *) ev);
X	break;
X
X    case UnmapNotify:
X	VerbUnmap((XUnmapEvent *) ev);
X	break;
X
X    case CirculateRequest:
X	VerbCirculateRequest((XCirculateRequestEvent *) ev);
X	break;
X
X    case ConfigureRequest:
X	VerbConfigureRequest((XConfigureRequestEvent *) ev);
X	break;
X
X    case MapRequest:
X	VerbMapRequest((XMapRequestEvent *) ev);
X	break;
X
X    case ClientMessage:
X	VerbClient((XClientMessageEvent *) ev);
X	break;
X
X    case MappingNotify:
X	VerbMapping((XMappingEvent *) ev);
X	break;
X
X    case SelectionClear:
X	VerbSelectionClear((XSelectionClearEvent *) ev);
X	break;
X
X    case SelectionNotify:
X	VerbSelection((XSelectionEvent *) ev);
X	break;
X
X    case SelectionRequest:
X	VerbSelectionRequest((XSelectionRequestEvent *) ev);
X	break;
X
X    case VisibilityNotify:
X	VerbVisibility((XVisibilityEvent *) ev);
X	break;
X
X    }
X}
END_OF_FILE
if test 23550 -ne `wc -c <'common/showEvent.c'`; then
    echo shar: \"'common/showEvent.c'\" unpacked with wrong size!
fi
# end of 'common/showEvent.c'
fi
if test -f 'gencmap/Imakefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gencmap/Imakefile'\"
else
echo shar: Extracting \"'gencmap/Imakefile'\" \(394 characters\)
sed "s/^X//" >'gencmap/Imakefile' <<'END_OF_FILE'
X       INCLUDES = -I../headers
X      COMMONLIB = ../common/libcommon.a
X        DEPLIBS = $(COMMONLIB) $(DEPXLIB)
X  SYS_LIBRARIES = -lm
X
X#ifdef UltrixArchitecture
XLOCAL_LIBRARIES = $(DEPLIBS)
X#else
XLOCAL_LIBRARIES = $(COMMONLIB) $(XLIB)
X#endif
X
XSRCS = \
X	gencmap.c
X
XOBJS = \
X	gencmap.o
X
XComplexProgramTarget(gencmap)
X
Xsaber_src:
X	#cd ../common
X	#make saber
X	#cd ../gencmap
X	#make saber_gencmap
X
END_OF_FILE
if test 394 -ne `wc -c <'gencmap/Imakefile'`; then
    echo shar: \"'gencmap/Imakefile'\" unpacked with wrong size!
fi
# end of 'gencmap/Imakefile'
fi
if test -f 'gencmap/gencmap.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gencmap/gencmap.c'\"
else
echo shar: Extracting \"'gencmap/gencmap.c'\" \(3267 characters\)
sed "s/^X//" >'gencmap/gencmap.c' <<'END_OF_FILE'
X/*
X * Copyright (c) Ken W. Marks 1989, 1990.
X */
X
X#include <stdio.h>
X#include <ctype.h>
X#include <math.h>
X#include <values.h>
X#include <X11/Intrinsic.h>
X#include <Colormap.h>
X
X#ifndef M_PI
X#define M_PI    3.14159265358979323846
X#endif
X
Xchar *map_dir = ".";
X
X
Xvoid SineFunc(n, red, green, blue, closure)
Xint n;
Xunsigned char *red;
Xunsigned char *green;
Xunsigned char *blue;
Xcaddr_t closure;
X{
X    double radians;
X    int reps = (int) closure;
X
X    radians = (double) (n - NUM_RESERVED) / (double) (NUM_COLORS -
X      NUM_RESERVED) * 2.0 * M_PI * (double) reps;
X
X    *red = (unsigned char) (fabs(sin(radians)) *
X      (double) MAX_INTENSITY);
X
X    *green = (unsigned char) (fabs(sin(radians + 2.0 / 3.0 * M_PI)) *
X      (double) MAX_INTENSITY);
X
X    *blue = (unsigned char) (fabs(sin(radians + 4.0 / 3.0 * M_PI)) *
X      (double) MAX_INTENSITY);
X}
X
X
Xvoid ZebraFunc(n, red, green, blue)
Xint n;
Xunsigned char *red;
Xunsigned char *green;
Xunsigned char *blue;
X{
X    double radians;
X    double hue, sat, bright;
X    double r, g, b;
X
X    radians = (double) (n - NUM_RESERVED) / (double) (NUM_COLORS -
X      NUM_RESERVED) * 2.0 * M_PI;
X
X    *red = (unsigned char) (fabs(sin(radians)) *
X      (double) MAX_INTENSITY);
X
X    *green = (unsigned char) (fabs(sin(radians + 2.0 / 3.0 * M_PI)) *
X      (double) MAX_INTENSITY);
X
X    *blue = (unsigned char) (fabs(sin(radians + 4.0 / 3.0 * M_PI)) *
X      (double) MAX_INTENSITY);
X
X    RGB2HSB((double) *red / 255.0, (double) *green / 255.0,
X      (double) *blue / 255.0, &hue, &sat, &bright);
X
X    switch (n % 4)
X    {
X    case 0:
X	bright *= 0.70;
X	break;
X
X    case 1:
X	bright *= 0.90;
X	break;
X
X    case 2:
X	bright *= 0.80;
X	break;
X
X    case 3:
X	bright *= 1.00;
X	break;
X    }
X
X
X    HSB2RGB(hue, sat, bright, &r, &g, &b);
X
X    *red = (unsigned char) (r * 255.0);
X    *green = (unsigned char) (g * 255.0);
X    *blue = (unsigned char) (b * 255.0);
X}
X
X
Xusage(cmd)
Xchar *cmd;
X{
X    (void) fprintf(stderr, "usage: %s [ -ghorstz ] filename\n", cmd);
X    exit(1);
X}
X
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X    char *cmd = argv[0];
X    char *value;
X    int reps;
X    extern char *getenv();
X
X    if (argc != 3)
X	usage(cmd);
X
X    if (value = getenv("MAPDIR"))
X	map_dir = value;
X
X    if (strncmp(argv[1], "-g", 2) == 0)
X    {
X	/* Store gray-scale colormap */
X	reps = (int) (isdigit(argv[1][2]) ? argv[1][2] - '0' : 1);
X	StoreGray(reps);
X    }
X    else if (strncmp(argv[1], "-h", 2) == 0)
X    {
X	/* Store Hue-Saturation-Brightness colormap */
X	reps = (int) (isdigit(argv[1][2]) ? argv[1][2] - '0' : 1);
X	StoreHSB(reps);
X    }
X    else if (strncmp(argv[1], "-o", 2) == 0)
X    {
X	/* Store 8 color (octo) colormap */
X	StoreOctoColor();
X    }
X    else if (strncmp(argv[1], "-r", 2) == 0)
X    {
X	/* Store random colormap */
X	StoreRandom();
X    }
X    else if (strncmp(argv[1], "-s", 2) == 0)
X    {
X	/* Store sine colormap */
X	reps = (int) (isdigit(argv[1][2]) ? argv[1][2] - '0' : 1);
X	StoreColors(SineFunc, (caddr_t) reps);
X    }
X    else if (strncmp(argv[1], "-t", 2) == 0)
X    {
X	/* Store 3 color (RGB) colormap */
X	StoreTriColor();
X    }
X    else if (strncmp(argv[1], "-z", 2) == 0)
X    {
X	/* Store funky zebra colormap */
X	StoreColors(ZebraFunc, (caddr_t) NULL);
X    }
X    else
X	usage(cmd);
X
X    (void) WriteColors(".", argv[2]);
X    exit(0);
X}
END_OF_FILE
if test 3267 -ne `wc -c <'gencmap/gencmap.c'`; then
    echo shar: \"'gencmap/gencmap.c'\" unpacked with wrong size!
fi
# end of 'gencmap/gencmap.c'
fi
if test -f 'widgets/List.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'widgets/List.c'\"
else
echo shar: Extracting \"'widgets/List.c'\" \(23630 characters\)
sed "s/^X//" >'widgets/List.c' <<'END_OF_FILE'
X/*
X * Copyright (c) Ken W. Marks 1989, 1990.
X */
X
X#include <stdio.h>
X#include <X11/IntrinsicP.h>
X#include <X11/StringDefs.h>
X#include <Chaos.h>
X#include <LocalDefs.h>
X#include <ListP.h>
X#include <Colormap.h>
X#include <DlgShell.h>
X
X#define IN_UP_ARROW(w, x, y)	(((x) >= (w)->list.item_width && \
X				(x) < (w)->core.width && \
X				(y) >= 0 && \
X				(y) < (w)->list.char_height) ? True : False)
X
X#define IN_DOWN_ARROW(w, x, y)	(((x) >= (w)->list.item_width && \
X				(x) < (w)->core.width && \
X				(y) > (w)->core.height - (w)->list.char_height \
X				&& (y) < (w)->core.height) ? True : False)
X
X#define IN_SCROLLBAR(w, x, y)	(((x) >= (w)->list.item_width && \
X				(x) < (w)->core.width && \
X				(y) >= (w)->list.char_height && \
X				(y) <= (w)->core.height - \
X				(w)->list.char_height) ? True : False)
X
X#define GET_ITEM(w, x, y)	(((x) >= (w)->list.item_width || \
X				(x) < 0 || \
X				(y) < 0 || \
X				(y) >= (w)->core.height) ? NO_ITEM : \
X				(y) / (w)->list.item_height + \
X				(w)->list.first_visible_item)
X
X#define NEAREST_ITEM(w, y)	(((y) - (w)->list.char_height) * \
X				(w)->list.num_stops / (w)->list.bar_height)
X
X#define ITEM_POS(w, item)	((short) (item * (w)->list.bar_height / \
X				(w)->list.num_stops + 3 * \
X				(w)->list.char_height / 2))
X
X#define BEFORE_VIEW(w, item)	((item < (w)->list.first_visible_item) ? \
X				True : False)
X
X#define AFTER_VIEW(w, item)	((item >= (w)->list.first_visible_item + \
X				(w)->list.num_visible) ? True : False)
X
X/* internal padding for items in list buttons */
X#define VERTICAL_PAD		2
X#define HORIZONTAL_PAD		2
X
X/* default number of items visible */
X#define DEFAULT_VISIBLE		5
X
X#define UP_ARROW_STRING		"\016\017"
X#define DOWN_ARROW_STRING	"\020\021"
X#define SLOT_STRING		"\022\023"
X#define KNOB_STRING		"\024\025"
X
X#define ARROW			'\037'
X#define BLANK			'\036'
X
Xstatic void ListInitialize();
Xstatic void ListRealize();
Xstatic void ListRedisplay();
Xstatic void ListDestroy();
Xstatic void ListDrawItem();
Xstatic void ListDrawItems();
Xstatic void ListDrawBar();
Xstatic void ListDrawAll();
Xstatic void ListMoveKnob();
Xstatic void ListUnselectIfUnseen();
Xstatic void ListScrollBackward();
Xstatic void ListScrollForward();
Xstatic void ListNotify();
Xstatic void ListMark();
Xstatic void ListGoto();
Xstatic void ListFocusIn();
Xstatic void ListFocusOut();
Xstatic void ListBtnUp();
Xstatic void ListMotion();
X
X#define offset(field) XtOffset(ListWidget, list.field)
X#define goffset(field) XtOffset(Widget,core.field)
X
Xstatic XtResource list_resources[] = {
X    {XtNlistDefault, XtCDefault, XtRInt, sizeof(int),
X    offset(selected_item), XtRImmediate, (caddr_t) 0},
X    {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
X    offset(foreground), XtRString, "Black"},
X    {XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel),
X    goffset(background_pixel), XtRString, "White"},
X    {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
X    offset(font), XtRString, "chaos-bold"},
X    {XtNlistItems, XtCList, XtRPointer, sizeof(char **),
X    offset(list_items), XtRString, NULL},
X    {XtNhorizPad, XtCMargin, XtRDimension, sizeof(Dimension),
X    offset(h_pad), XtRImmediate, (caddr_t) HORIZONTAL_PAD},
X    {XtNvertPad, XtCMargin, XtRDimension, sizeof(Dimension),
X    offset(v_pad), XtRImmediate, (caddr_t) VERTICAL_PAD},
X    {XtNcallback, XtCCallback, XtRCallback, sizeof(caddr_t),
X    offset(callbacks), XtRCallback, (caddr_t) NULL},
X    {XtNdialogbox, XtCWidget, XtRWidget, sizeof(Widget),
X    offset(dialogbox), XtRWidget, (caddr_t) NULL},
X    {XtNnumberVisible, XtCDefault, XtRInt, sizeof(int),
X    offset(num_visible), XtRImmediate, (caddr_t) DEFAULT_VISIBLE},
X    {XtNcharsWide, XtCDefault, XtRInt, sizeof(int),
X    offset(chars_wide), XtRImmediate, (caddr_t) 0},
X};
X
Xstatic XtActionsRec list_actions[] =
X{
X    {"notify", ListNotify},
X    {"mark", ListMark},
X    {"goto", ListGoto},
X    {"focus_in", ListFocusIn},
X    {"focus_out", ListFocusOut},
X    {"release", ListBtnUp},
X    {"move", ListMotion},
X};
X
Xstatic char list_translations[] =
X"<BtnDown>:		mark(BUTTON) notify(BUTTON)\n\
X <BtnUp>:		release()\n\
X <Motion>:		move()\n\
X <Key>Return:		notify(KEY)\n\
X <Key>Up:		mark(PREV)\n\
X <Key>Down:		mark(NEXT)\n\
X Shift<Key>Tab:		goto(PREV)\n\
X <Key>Tab:		goto(NEXT)\n\
X <FocusIn>:		focus_in()\n\
X <FocusOut>:		focus_out()\n\
X";
X
X#define superclass		(&simpleClassRec)
X
XListClassRec listClassRec = {
X    {
X	/* core fields 		 */
X	 /* superclass		 */ (WidgetClass) superclass,
X	 /* class_name		 */ "List",
X	 /* widget_size		 */ sizeof(ListRec),
X	 /* class_initialize	 */ NULL,
X	 /* class_part_initialize */ NULL,
X	 /* class_inited	 */ FALSE,
X	 /* initialize		 */ ListInitialize,
X	 /* initialize_hook	 */ NULL,
X	 /* realize		 */ ListRealize,
X	 /* actions		 */ list_actions,
X	 /* num_actions		 */ XtNumber(list_actions),
X	 /* resources		 */ list_resources,
X	 /* resource_count	 */ XtNumber(list_resources),
X	 /* xrm_class		 */ NULLQUARK,
X	 /* compress_motion	 */ TRUE,
X	 /* compress_exposure	 */ TRUE,
X	 /* compress_enterleave	 */ TRUE,
X	 /* visible_interest	 */ FALSE,
X	 /* destroy		 */ ListDestroy,
X	 /* resize		 */ NULL,
X	 /* expose		 */ ListRedisplay,
X	 /* set_values		 */ NULL,
X	 /* set_values_hook	 */ NULL,
X	 /* set_values_almost	 */ XtInheritSetValuesAlmost,
X	 /* get_values_hook	 */ NULL,
X	 /* accept_focus	 */ NULL,
X	 /* version		 */ XtVersion,
X	 /* callback_private	 */ NULL,
X	 /* tm_table		 */ list_translations,
X	 /* query_geometry       */ NULL,
X	 /* display_accelerator	 */ XtInheritDisplayAccelerator,
X	 /* extension		 */ NULL
X    },
X    {
X	/* Simple class fields initialization */
X	 /* change_sensitive	 */ XtInheritChangeSensitive
X    }
X};
X
X
XWidgetClass listWidgetClass = (WidgetClass) & listClassRec;
X
X
X/************************************************************/
X/******************** Private Procedures ********************/
X/************************************************************/
X
X
Xstatic void ListCopyItems(w)
XListWidget w;
X{
X    int ii;
X    char *label;
X
X    if (w->list.list_items == NULL)
X    {
X	w->list.list_items = (ListItem *) malloc(sizeof(ListItem));
X	w->list.list_items[0].label = NULL;
X	w->list.num_items = 0;
X	return;
X    }
X
X    /* SUPPRESS 530 */
X    for (ii = 0; w->list.list_items[ii].label != NULL; ++ii);
X
X    w->list.num_items = ii;
X
X    /* Allocate a private copy of the list structure so that it doesn't change
X     * from under us. */
X
X    w->list.list_items = (ListItem *) COPY(w->list.list_items, (ii + 1) *
X      sizeof(ListItem));
X
X    /* And don't forget to make private copies of all the labels in the
X     * structures (with space for 1 special leading char). */
X
X    while (--ii >= 0)
X    {
X	label = w->list.list_items[ii].label;
X	w->list.list_items[ii].label = malloc((unsigned) (strlen(label) + 2));
X	w->list.list_items[ii].label[0] = BLANK;
X	(void) strcpy(&(w->list.list_items[ii].label[1]), label);
X    }
X}
X
X
Xstatic void ListFreeItems(w)
XListWidget w;
X{
X    ListItem *ptr = w->list.list_items;
X
X    while (ptr->label != NULL)
X    {
X	free(ptr->label);
X	++ptr;
X    }
X    free((char *) w->list.list_items);
X}
X
X
Xstatic void ListGetGC(w)
XListWidget w;
X{
X    XGCValues values;
X
X    values.foreground = w->list.foreground;
X    values.background = w->core.background_pixel;
X    values.font = w->list.font->fid;
X
X    w->list.normal_gc = XtGetGC((Widget) w, (unsigned) GCForeground |
X      GCBackground | GCFont, &values);
X
X    values.foreground = w->core.background_pixel;
X    values.background = w->list.foreground;
X
X    w->list.reverse_gc = XtGetGC((Widget) w, (unsigned) GCForeground |
X      GCBackground | GCFont, &values);
X}
X
X
Xstatic void ListSetSize(w)
XListWidget w;
X{
X    XtWidgetGeometry my_request;
X    XFontStruct *fs = w->list.font;
X    ListItem *item;
X    Cardinal height = fs->max_bounds.ascent + fs->max_bounds.descent;
X    Cardinal width = fs->max_bounds.width;
X    Cardinal label_width;
X    char *label;
X    int ii;
X
X    item = w->list.list_items;
X    for (ii = 0; ii < w->list.num_items; ++ii)
X    {
X	label = item->label;
X	label_width = STRLEN(label);
X	if (label == NULL)
X	    break;
X	w->list.chars_wide = MAX(w->list.chars_wide, label_width);
X	++item;
X    }
X
X    w->list.item_width = w->list.chars_wide * width + 2 * w->list.h_pad;
X    w->list.baseline = fs->max_bounds.ascent;
X    w->list.baseline_to_center = height / 2 - w->list.baseline;
X    w->list.char_width = width;
X    w->list.char_height = height;
X    w->list.item_height = height + 2 * w->list.v_pad;
X
X    my_request.request_mode = CWWidth | CWHeight | CWBorderWidth;
X    my_request.width = w->list.item_width + 2 * width;
X    my_request.height = w->list.item_height * w->list.num_visible;
X    my_request.border_width = 1;
X
X    XtMakeGeometryRequest((Widget) w, &my_request, NULL);
X
X    w->list.bar_min_y = height + fs->max_bounds.ascent;
X    w->list.bar_max_y = w->core.height - (height + fs->max_bounds.descent);
X}
X
X
X/*ARGSUSED*/
Xstatic void ListInitialize(request, new)
XWidget request;			/* unused */
XWidget new;
X{
X    ListWidget w = (ListWidget) new;
X
X    if (w->list.dialogbox == NULL)
X    {
X	eprintf("XtNdialogbox not set\n");
X	abort();
X    }
X
X    if (w->list.num_visible < DEFAULT_VISIBLE)
X    {
X	eprintf("XtNnumberVisible must be at least %d\n", DEFAULT_VISIBLE);
X	abort();
X    }
X    ListGetGC(w);
X    ListCopyItems(w);
X    ListSetSize(w);
X
X    w->list.active_item = NO_ITEM;
X    w->list.first_visible_item = 0;
X    w->list.num_stops = w->list.num_items - w->list.num_visible + 1;
X    if (w->list.num_stops < 1)
X	w->list.num_stops = 1;
X    w->list.bar_height = w->core.height - 2 * w->list.char_height;
X    w->list.bar_offset = w->list.char_height + w->list.baseline +
X      w->list.baseline_to_center;
X    w->list.knob_y = w->list.bar_min_y;
X    w->list.scrolling = False;
X}
X
X
Xstatic void ListRealize(widget, valueMask, attrs)
XWidget widget;
XXtValueMask *valueMask;
XXSetWindowAttributes *attrs;
X{
X    ListWidget w = (ListWidget) widget;
X    Display *dpy = XtDisplay(w);
X    Window window;
X    Position y;
X
X    XtCreateWindow(widget, InputOutput, (Visual *) CopyFromParent,
X      *valueMask, attrs);
X
X    window = XtWindow(w);
X
X    w->list.pixmap = XCreatePixmap(dpy, window, w->list.char_width * 2,
X      w->core.height, w->core.depth);
X
X    if (!w->list.pixmap)
X    {
X	eprintf("Insufficient space for pixmap\n");
X	abort();
X    }
X
X    y = w->list.baseline;
X    XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, y,
X      UP_ARROW_STRING, 2);
X
X    for (y = w->list.char_height + w->list.baseline;
X      y < w->core.height - w->list.char_height + w->list.baseline;
X      y += w->list.char_height)
X	XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, y,
X	  SLOT_STRING, 2);
X
X    y = w->core.height - w->list.char_height + w->list.baseline;
X    XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, y,
X      DOWN_ARROW_STRING, 2);
X
X    XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, w->list.knob_y,
X      KNOB_STRING, 2);
X}
X
X
X/*ARGSUSED*/
Xstatic void ListRedisplay(widget, event, region)
XWidget widget;
XXEvent *event;			/* unused */
XRegion region;			/* unused */
X{
X    if (XtIsRealized(widget) == False)
X	return;
X
X    ListDrawAll(widget);
X}
X
X
Xstatic void ListDestroy(widget)
XWidget widget;
X{
X    ListWidget w = (ListWidget) widget;
X
X    XtReleaseGC(widget, w->list.normal_gc);
X    XtReleaseGC(widget, w->list.reverse_gc);
X}
X
X
Xstatic void ListDrawItem(widget, item)
XWidget widget;
Xint item;
X{
X    ListWidget w = (ListWidget) widget;
X    Display *dpy = XtDisplay(w);
X    Window window = XtWindow(w);
X    int absolute_item;
X    char *label;
X    Position x, y;
X    int label_len;
X    GC fill_gc;
X    GC draw_gc;
X
X    if (item <= NO_ITEM || item > w->list.num_visible)
X	return;
X
X    absolute_item = item + w->list.first_visible_item;
X
X    if (absolute_item >= w->list.num_items)
X	label = NULL;
X    else
X    {
X	label = w->list.list_items[absolute_item].label;
X
X	if (absolute_item == w->list.active_item)
X	    label[0] = ARROW;
X	else
X	    label[0] = BLANK;
X    }
X
X    x = (Position) w->list.h_pad;
X    y = (Position) w->list.item_height * item + w->list.v_pad +
X      w->list.baseline;
X
X    if (XtIsRealized(widget))
X    {
X
X	if (absolute_item == w->list.selected_item)
X	{
X	    fill_gc = w->list.normal_gc;
X	    draw_gc = w->list.reverse_gc;
X	}
X	else
X	{
X	    fill_gc = w->list.reverse_gc;
X	    draw_gc = w->list.normal_gc;
X	}
X
X	label_len = STRLEN(label);
X
X	if (label_len != 0)
X	    XDrawImageString(dpy, window, draw_gc, x, y, label, label_len);
X
X	XFillRectangle(dpy, window, fill_gc, x + label_len *
X	  w->list.char_width, y - w->list.baseline, (w->list.chars_wide -
X	    label_len) * w->list.char_width, w->list.char_height);
X    }
X}
X
X
Xstatic void ListDrawItems(widget)
XWidget widget;
X{
X    ListWidget w = (ListWidget) widget;
X    int ii;
X
X    for (ii = 0; ii < w->list.num_visible; ++ii)
X	ListDrawItem(widget, ii);
X}
X
X
Xstatic void ListDrawBar(widget)
XWidget widget;
X{
X    ListWidget w = (ListWidget) widget;
X    Display *dpy = XtDisplay(w);
X    Window window = XtWindow(w);
X
X    if (XtIsRealized(widget))
X	XCopyArea(dpy, w->list.pixmap, window, w->list.normal_gc,
X	  0, 0, w->list.char_width * 2, w->core.height, w->list.item_width, 0);
X}
X
X
Xstatic void ListDrawAll(widget)
XWidget widget;
X{
X    ListDrawItems(widget);
X    ListDrawBar(widget);
X}
X
X
Xstatic void ListMoveKnob(widget, y)
XWidget widget;
XPosition y;
X{
X    ListWidget w = (ListWidget) widget;
X    Display *dpy = XtDisplay(w);
X
X    y -= w->list.baseline_to_center;
X
X    if (y < w->list.bar_min_y)
X	y = w->list.bar_min_y;
X    else if (y > w->list.bar_max_y)
X	y = w->list.bar_max_y;
X
X    if (y == w->list.knob_y)
X	return;
X
X    /* Erase the old knob */
X    XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, w->list.knob_y,
X      SLOT_STRING, 2);
X
X    w->list.knob_y = y;
X
X    /* Draw new knob */
X    XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, w->list.knob_y,
X      KNOB_STRING, 2);
X
X    ListDrawBar(widget);
X}
X
X
Xstatic void ListUnselectIfUnseen(widget)
XWidget widget;
X{
X    ListWidget w = (ListWidget) widget;
X
X    if (BEFORE_VIEW(w, w->list.selected_item) ||
X      AFTER_VIEW(w, w->list.selected_item))
X	w->list.selected_item = NO_ITEM;
X}
X
X
Xstatic void ListScrollBackward(widget)
XWidget widget;
X{
X    ListWidget w = (ListWidget) widget;
X
X    if (w->list.first_visible_item == 0)
X	return;
X
X    --w->list.first_visible_item;
X
X    if (AFTER_VIEW(w, w->list.active_item))
X	--w->list.active_item;
X
X    /* If the selected item becomes unseen, unselect it */
X    ListUnselectIfUnseen(widget);
X    ListDrawItems(widget);
X    ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item));
X}
X
X
Xstatic void ListScrollForward(widget)
XWidget widget;
X{
X    ListWidget w = (ListWidget) widget;
X
X    if (w->list.first_visible_item >= w->list.num_stops - 1)
X	return;
X
X    ++w->list.first_visible_item;
X
X    if (BEFORE_VIEW(w, w->list.active_item))
X	++w->list.active_item;
X
X    /* If the selected item becomes unseen, unselect it */
X    ListUnselectIfUnseen(widget);
X    ListDrawItems(widget);
X    ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item));
X}
X
X
Xstatic void ListScrollTo(widget, y)
XWidget widget;
Xint y;
X{
X    ListWidget w = (ListWidget) widget;
X    int item;
X
X    ListMoveKnob(widget, y);
X
X    item = NEAREST_ITEM(w, y);
X    if (item == w->list.first_visible_item)
X	return;
X
X    w->list.first_visible_item = item;
X
X    if (BEFORE_VIEW(w, w->list.active_item) ||
X      AFTER_VIEW(w, w->list.active_item))
X	w->list.active_item = w->list.first_visible_item;
X
X    /* If the selected item becomes unseen, unselect it */
X    ListUnselectIfUnseen(widget);
X    ListDrawItems(widget);
X}
X
X
Xstatic void ListStartScroll(widget, y)
XWidget widget;
Xint y;
X{
X    ListWidget w = (ListWidget) widget;
X
X    w->list.scrolling = True;
X
X    ListScrollTo(widget, y);
X}
X
X
X/***********************************************************/
X/******************** Action Procedures ********************/
X/***********************************************************/
X
X
X/*ARGSUSED*/
Xstatic void ListFocusIn(widget, event, params, num_params)
XWidget widget;
XXEvent *event;
XString *params;
XCardinal *num_params;		/* unused */
X{
X    ListWidget w = (ListWidget) widget;
X    XFocusInEvent *ev = (XFocusInEvent *) & event->xfocus;
X
X    if (ev->mode != NotifyGrab)
X        return;
X
X    if (w->list.active_item == NO_ITEM)
X	w->list.active_item = w->list.first_visible_item;
X
X    ListDrawAll(widget);
X}
X
X
X/*ARGSUSED*/
Xstatic void ListFocusOut(widget, event, params, num_params)
XWidget widget;
XXEvent *event;
XString *params;
XCardinal *num_params;		/* unused */
X{
X    ListWidget w = (ListWidget) widget;
X    int last_active_item = w->list.active_item;
X    XFocusOutEvent *ev = (XFocusOutEvent *) & event->xfocus;
X
X    if (ev->mode != NotifyUngrab)
X        return;
X
X    if (w->list.active_item != NO_ITEM)
X    {
X	w->list.active_item = NO_ITEM;
X	ListDrawItem(widget, last_active_item - w->list.first_visible_item);
X    }
X}
X
X
X/*ARGSUSED*/
Xstatic void ListNotify(widget, event, params, num_params)
XWidget widget;
XXEvent *event;
XString *params;
XCardinal *num_params;		/* unused */
X{
X    ListWidget w = (ListWidget) widget;
X    XButtonEvent *ev = (XButtonEvent *) & event->xbutton;
X    int item;
X    int last_selected_item;
X
X    if (params[0][0] == 'B')
X	item = GET_ITEM(w, ev->x, ev->y);
X    else
X	item = w->list.active_item;
X
X    if (item == NO_ITEM)
X	return;
X
X    last_selected_item = w->list.selected_item;
X    w->list.selected_item = item;
X
X    ListDrawItem(widget, last_selected_item - w->list.first_visible_item);
X
X    ListDrawItem(widget, item - w->list.first_visible_item);
X
X    XtCallCallbacks(widget, XtNcallback, (XtPointer) item);
X}
X
X
X/*ARGSUSED*/
Xstatic void ListMark(widget, event, params, num_params)
XWidget widget;
XXEvent *event;
XString *params;			/* unused */
XCardinal *num_params;		/* unused */
X{
X    ListWidget w = (ListWidget) widget;
X    XButtonEvent *ev = (XButtonEvent *) & event->xbutton;
X    int item;
X    int last_item = w->list.active_item;
X
X    switch (params[0][0])
X    {
X    case 'B':
X	item = GET_ITEM(w, ev->x, ev->y);
X	if (item != NO_ITEM)
X	{
X	    DialogSetNewFocus(w->list.dialogbox, widget);
X	    w->list.active_item = item;
X	    break;
X	}
X	if (IN_UP_ARROW(w, ev->x, ev->y))
X	{
X	    if (w->list.active_item == NO_ITEM)
X	    {
X		DialogSetNewFocus(w->list.dialogbox, widget);
X		w->list.active_item = w->list.first_visible_item - 1;
X	    }
X	    ListScrollBackward(widget);
X	}
X	else if (IN_DOWN_ARROW(w, ev->x, ev->y))
X	{
X	    if (w->list.active_item == NO_ITEM)
X	    {
X		DialogSetNewFocus(w->list.dialogbox, widget);
X		w->list.active_item = w->list.first_visible_item;
X	    }
X	    ListScrollForward(widget);
X	}
X	else if (IN_SCROLLBAR(w, ev->x, ev->y))
X	{
X	    if (w->list.active_item == NO_ITEM)
X	    {
X		DialogSetNewFocus(w->list.dialogbox, widget);
X		w->list.active_item = w->list.first_visible_item;
X	    }
X	    ListStartScroll(widget, ev->y);
X	}
X	break;
X
X    case 'P':
X	item = w->list.active_item - 1;
X	if (item < 0)
X	    item = 0;
X	w->list.active_item = item;
X	if (BEFORE_VIEW(w, item))
X	{
X	    ListScrollBackward(widget);
X	    return;
X	}
X	break;
X
X    case 'N':
X	item = w->list.active_item + 1;
X	if (item >= w->list.num_items)
X	    item = w->list.num_items - 1;
X	w->list.active_item = item;
X	if (AFTER_VIEW(w, item))
X	{
X	    ListScrollForward(widget);
X	    return;
X	}
X	break;
X    }
X
X    ListDrawItem(widget, last_item - w->list.first_visible_item);
X    ListDrawItem(widget, item - w->list.first_visible_item);
X}
X
X
X/*ARGSUSED*/
Xstatic void ListGoto(widget, event, params, num_params)
XWidget widget;
XXEvent *event;			/* unused */
XString *params;			/* unused */
XCardinal *num_params;		/* unused */
X{
X    ListWidget w = (ListWidget) widget;
X    int item = w->list.active_item - w->list.first_visible_item;
X
X    w->list.active_item = NO_ITEM;
X    ListDrawItem(widget, item);
X
X    switch (params[0][0])
X    {
X    case 'P':
X	DialogSetPrevFocus(w->list.dialogbox);
X	break;
X
X    case 'N':
X	DialogSetNextFocus(w->list.dialogbox);
X	break;
X    }
X}
X
X
X/*ARGSUSED*/
Xstatic void ListBtnUp(widget, event, params, num_params)
XWidget widget;
XXEvent *event;
XString *params;			/* unused */
XCardinal *num_params;		/* unused */
X{
X    ListWidget w = (ListWidget) widget;
X    XButtonEvent *ev = (XButtonEvent *) & event->xbutton;
X
X    if (w->list.scrolling == False)
X	return;
X
X    w->list.scrolling = False;
X
X    if (ev->x <= w->list.item_width || ev->x >= w->core.width ||
X      ev->y < w->list.char_height ||
X      ev->y >= w->core.height - w->list.char_height)
X	return;
X
X    ListScrollTo(widget, ev->y);
X}
X
X
X/*ARGSUSED*/
Xstatic void ListMotion(widget, event, params, num_params)
XWidget widget;
XXEvent *event;
XString *params;			/* unused */
XCardinal *num_params;		/* unused */
X{
X    ListWidget w = (ListWidget) widget;
X    XMotionEvent *ev = (XMotionEvent *) & event->xmotion;
X
X    if (w->list.scrolling == False)
X	return;
X
X    if (ev->x <= w->list.item_width || ev->x >= w->core.width ||
X      ev->y < w->list.char_height ||
X      ev->y >= w->core.height - w->list.char_height)
X	return;
X
X    ListScrollTo(widget, ev->y);
X}
X
X
X/***********************************************************/
X/******************** Public Procedures ********************/
X/***********************************************************/
X
X
XBoolean ListChangeLabel(widget, item, label)
XWidget widget;
XCardinal item;
XString label;
X{
X    ListWidget w = (ListWidget) widget;
X    ListItem *list_item;
X
X    if (item >= w->list.num_items || label == NULL)
X	return (False);
X
X    list_item = &(w->list.list_items[item]);
X    if (strcmp(&(list_item->label[1]), label) == SAME)
X	return (True);
X    free(list_item->label);
X    list_item->label = malloc((unsigned) (strlen(label) + 2));
X    (void) strcpy(&(list_item->label[1]), label);
X
X    ListDrawItem(widget, (int) (item - w->list.first_visible_item));
X    return (True);
X}
X
X
XBoolean ListChangeSelected(widget, item)
XWidget widget;
Xint item;
X{
X    ListWidget w = (ListWidget) widget;
X    int last_item = w->list.selected_item;
X
X    if (item >= (int) w->list.num_items)
X	return (False);
X
X    if (item == last_item)
X	return (True);
X
X    w->list.selected_item = item;
X
X    if (item == NO_ITEM)
X    {
X	/* Scroll viewport to start */
X	w->list.first_visible_item = 0;
X	ListMoveKnob(widget, 0);
X	ListDrawAll(widget);
X	return (True);
X    }
X
X    if (BEFORE_VIEW(w, item))
X    {
X	/* Scroll viewport down so item is just visible */
X	w->list.first_visible_item = item;
X	ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item));
X	ListDrawAll(widget);
X    }
X    else if (AFTER_VIEW(w, item))
X    {
X	/* Scroll viewport up so item is just visible */
X	w->list.first_visible_item = item - w->list.num_visible + 1;
X	ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item));
X	ListDrawAll(widget);
X    }
X    else
X    {
X	/* Item was previously visible - just change selection */
X	ListDrawItem(widget, last_item - w->list.first_visible_item);
X	ListDrawItem(widget, (int) (item - w->list.first_visible_item));
X    }
X
X    return (True);
X}
X
X
XBoolean ListChangeItems(widget, new_items)
XWidget widget;
XListItem *new_items;
X{
X    ListWidget w = (ListWidget) widget;
X    int ii = 0;
X
X    while (w->list.list_items[ii].label != NULL && new_items[ii].label != NULL)
X    {
X	if (strcmp(&w->list.list_items[ii].label[1], new_items[ii].label)
X	  != SAME)
X	    break;
X	++ii;
X    }
X
X    /* just return if the list has not changed */
X    if (w->list.list_items[ii].label == NULL && new_items[ii].label == NULL)
X	return (True);
X
X    ListFreeItems(w);
X
X    w->list.list_items = new_items;
X    ListCopyItems(w);
X
X    w->list.selected_item = NO_ITEM;
X    w->list.first_visible_item = 0;
X    w->list.num_stops = w->list.num_items - w->list.num_visible + 1;
X    if (w->list.num_stops < 1)
X	w->list.num_stops = 1;
X    ListDrawItems(widget);
X    ListMoveKnob(widget, 0);
X    return (True);
X}
END_OF_FILE
if test 23630 -ne `wc -c <'widgets/List.c'`; then
    echo shar: \"'widgets/List.c'\" unpacked with wrong size!
fi
# end of 'widgets/List.c'
fi
echo shar: End of archive 2 \(of 10\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 10 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

dan
----------------------------------------------------
O'Reilly && Associates   argv@sun.com / argv@ora.com
Opinions expressed reflect those of the author only.