Path: uunet!wyse!mikew
From: mikew@wyse.wyse.com (Mike Wexler)
Newsgroups: comp.sources.x
Subject: v02i056:  subroutine to print events in human readable form, Part01/01
Message-ID: <1935@wyse.wyse.com>
Date: 22 Dec 88 19:28:25 GMT
Organization: Wyse Technology, San Jose
Lines: 1093
Approved: mikew@wyse.com

Submitted-by: richsun!darkstar!ken
Posting-number: Volume 2, Issue 56
Archive-name: showevent/part01



Following is a shar file of a debugging aid along with a sample program to
show how it is used.  The README contains more details.

				Ken

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	Makefile
#	README
#	ShowEvent.c
#	ShowEvent.man
#	patchlevel.h
#	sample.c
# This archive created: Thu Dec 22 12:13:46 1988
export PATH; PATH=/bin:$PATH
if test -f 'Makefile'
then
	echo shar: will not over-write existing file "'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
CFLAGS = -g 
INCLUDE = -I/global/include
LFLAGS = -L/global/lib
OBJS =	ShowEvent.o sample.o
LIBS = -lX11

all: sample

.c.o:
	$(CC) $(INCLUDE) $(CFLAGS) -c $<

sample: $(OBJS)
	$(CC) $(LFLAGS) $(OBJS) $(LIBS) -o sample
SHAR_EOF
fi # end of overwriting check
if test -f 'README'
then
	echo shar: will not over-write existing file "'README'"
else
cat << \SHAR_EOF > 'README'
There are times during debugging when it would be real useful to be able to
print the fields of an event in a human readable form.  Too many times I found 
myself scrounging around in section 8 of the Xlib manual looking for the valid 
fields for the events I wanted to see, then adding printf's to display the 
numeric values of the fields, and then scanning through X.h trying to decode
the cryptic detail and state fields.  After playing with xev, I decided to
write a couple of standard functions that I could keep in a library and call
on whenever I needed a little debugging verbosity.  The first function,
GetType(), is useful for returning the string representation of the type of
an event.  The second function, ShowEvent(), is used to display all the fields
of an event in a readable format.  The functions are not complicated, in fact,
they are mind-numbingly boring - but that's just the point nobody wants to
spend the time writing functions like this, they just want to have them when
they need them.

A simple, sample program is included which does little else but to demonstrate
the use of these two functions.  These functions have saved me many an hour 
during debugging and I hope you find some benefit to these.  If you have any
comments, suggestions, improvements, or if you find any blithering errors you 
can get it touch with me at the following location:

			ken@richsun.UUCP
SHAR_EOF
fi # end of overwriting check
if test -f 'ShowEvent.c'
then
	echo shar: will not over-write existing file "'ShowEvent.c'"
else
cat << \SHAR_EOF > 'ShowEvent.c'
#include <X11/Intrinsic.h>
#include <X11/Xproto.h>

Boolean use_separate_lines = True;
static char *sep;

/******************************************************************************/
/**** Miscellaneous routines to convert values to their string equivalents ****/
/******************************************************************************/

/* Returns the string equivalent of a boolean parameter */
static char *TorF(bool)
int bool;
{
    switch (bool) {
    case True:
	return ("True");

    case False:
	return ("False");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a property notify state */
static char *PropertyState(state)
int state;
{
    switch (state) {
    case PropertyNewValue:
	return ("PropertyNewValue");

    case PropertyDelete:
	return ("PropertyDelete");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a visibility notify state */
static char *VisibilityState(state)
int state;
{
    switch (state) {
    case VisibilityUnobscured:
	return ("VisibilityUnobscured");

    case VisibilityPartiallyObscured:
	return ("VisibilityPartiallyObscured");

    case VisibilityFullyObscured:
	return ("VisibilityFullyObscured");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a timestamp */
static char *ServerTime(time)
Time time;
{
    unsigned long msec;
    unsigned long sec;
    unsigned long min;
    unsigned long hr;
    unsigned long day;
    char buffer[32];

    msec = time % 1000;
    time /= 1000;
    sec = time % 60;
    time /= 60;
    min = time % 60;
    time /= 60;
    hr = time % 24;
    time /= 24;
    day = time;

    sprintf(buffer, "%d day%s %02d:%02d:%02d.%03d",
      day, day == 1 ? "" : "(s)", hr, min, sec, msec);
    return (buffer);
}

/* Simple structure to ease the interpretation of masks */
typedef struct _MaskType {
    unsigned int value;
    char *string;
} MaskType;

/* Returns the string equivalent of a mask of buttons and/or modifier keys */
static char *ButtonAndOrModifierState(state)
unsigned int state;
{
    char buffer[256];
    static MaskType masks[] = {
	{Button1Mask, "Button1Mask"},
	{Button2Mask, "Button2Mask"},
	{Button3Mask, "Button3Mask"},
	{Button4Mask, "Button4Mask"},
	{Button5Mask, "Button5Mask"},
	{ShiftMask, "ShiftMask"},
	{LockMask, "LockMask"},
	{ControlMask, "ControlMask"},
	{Mod1Mask, "Mod1Mask"},
	{Mod2Mask, "Mod2Mask"},
	{Mod3Mask, "Mod3Mask"},
	{Mod4Mask, "Mod4Mask"},
	{Mod5Mask, "Mod5Mask"},
    };
    int num_masks = sizeof(masks) / sizeof(MaskType);
    int i;
    Boolean first = True;

    buffer[0] = NULL;

    for (i = 0; i < num_masks; i++)
	if (state & masks[i].value)
	    if (first) {
		first = False;
		strcpy(buffer, masks[i].string);
	    } else {
		strcat(buffer, " | ");
		strcat(buffer, masks[i].string);
	    }
    return (buffer);
}

/* Returns the string equivalent of a mask of configure window values */
static char *ConfigureValueMask(valuemask)
unsigned int valuemask;
{
    char buffer[256];
    static MaskType masks[] = {
	{CWX, "CWX"},
	{CWY, "CWY"},
	{CWWidth, "CWWidth"},
	{CWHeight, "CWHeight"},
	{CWBorderWidth, "CWBorderWidth"},
	{CWSibling, "CWSibling"},
	{CWStackMode, "CWStackMode"},
    };
    int num_masks = sizeof(masks) / sizeof(MaskType);
    int i;
    Boolean first = True;

    buffer[0] = NULL;

    for (i = 0; i < num_masks; i++)
	if (valuemask & masks[i].value)
	    if (first) {
		first = False;
		strcpy(buffer, masks[i].string);
	    } else {
		strcat(buffer, " | ");
		strcat(buffer, masks[i].string);
	    }

    return (buffer);
}

/* Returns the string equivalent of a motion hint */
static char *IsHint(is_hint)
char is_hint;
{
    switch (is_hint) {
    case NotifyNormal:
	return ("NotifyNormal");

    case NotifyHint:
	return ("NotifyHint");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of an id or the value "None" */
static char *MaybeNone(value)
int value;
{
    char buffer[16];

    if (value == None)
	return ("None");
    else {
	sprintf(buffer, "0x%x", value);
	return (buffer);
    }
}

/* Returns the string equivalent of a colormap state */
static char *ColormapState(state)
int state;
{
    switch (state) {
    case ColormapInstalled:
	return ("ColormapInstalled");

    case ColormapUninstalled:
	return ("ColormapUninstalled");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a crossing detail */
static char *CrossingDetail(detail)
int detail;
{
    switch (detail) {
    case NotifyAncestor:
	return ("NotifyAncestor");

    case NotifyInferior:
	return ("NotifyInferior");

    case NotifyVirtual:
	return ("NotifyVirtual");

    case NotifyNonlinear:
	return ("NotifyNonlinear");

    case NotifyNonlinearVirtual:
	return ("NotifyNonlinearVirtual");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a focus change detail */
static char *FocusChangeDetail(detail)
int detail;
{
    switch (detail) {
    case NotifyAncestor:
	return ("NotifyAncestor");

    case NotifyInferior:
	return ("NotifyInferior");

    case NotifyVirtual:
	return ("NotifyVirtual");

    case NotifyNonlinear:
	return ("NotifyNonlinear");

    case NotifyNonlinearVirtual:
	return ("NotifyNonlinearVirtual");

    case NotifyPointer:
	return ("NotifyPointer");

    case NotifyPointerRoot:
	return ("NotifyPointerRoot");

    case NotifyDetailNone:
	return ("NotifyDetailNone");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a configure detail */
static char *ConfigureDetail(detail)
int detail;
{
    switch (detail) {
    case Above:
	return ("Above");

    case Below:
	return ("Below");

    case TopIf:
	return ("TopIf");

    case BottomIf:
	return ("BottomIf");

    case Opposite:
	return ("Opposite");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a grab mode */
static char *GrabMode(mode)
int mode;
{
    switch (mode) {
    case NotifyNormal:
	return ("NotifyNormal");

    case NotifyGrab:
	return ("NotifyGrab");

    case NotifyUngrab:
	return ("NotifyUngrab");

    case NotifyWhileGrabbed:
	return ("NotifyWhileGrabbed");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a mapping request */
static char *MappingRequest(request)
int request;
{
    switch (request) {
    case MappingModifier:
	return ("MappingModifier");

    case MappingKeyboard:
	return ("MappingKeyboard");

    case MappingPointer:
	return ("MappingPointer");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a stacking order place */
static char *Place(place)
int place;
{
    switch (place) {
    case PlaceOnTop:
	return ("PlaceOnTop");

    case PlaceOnBottom:
	return ("PlaceOnBottom");

    default:
	return ("?");
    }
}

/* Returns the string equivalent of a major code */
static char *MajorCode(code)
int code;
{
    char buffer[32];

    switch (code) {
    case X_CopyArea:
	return ("X_CopyArea");

    case X_CopyPlane:
	return ("X_CopyPlane");

    default:
	sprintf(buffer, "0x%x", code);
	return (buffer);
    }
}

/* Returns the string equivalent the keycode contained in the key event */
static char *Keycode(ev)
XKeyEvent *ev;
{
    char buffer[256];
    KeySym keysym_str;
    char *keysym_name;
    char string[256];

    XLookupString(ev, string, 64, &keysym_str, NULL);

    if (keysym_str == NoSymbol)
	keysym_name = "NoSymbol";
    else if (!(keysym_name = XKeysymToString(keysym_str)))
	keysym_name = "(no name)";
    sprintf(buffer, "%u (keysym 0x%x \"%s\")",
      ev->keycode, keysym_str, keysym_name);
    return (buffer);
}

/* Returns the string equivalent of an atom or "None"*/
static char *AtomName(dpy, atom)
Display *dpy;
Atom atom;
{
    char buffer[256];
    char *atom_name;

    if (atom == None)
	return ("None");

    atom_name = XGetAtomName(dpy, atom);
    strncpy(buffer, atom_name, 256);
    XFree(atom_name);
    return (buffer);
}

/******************************************************************************/
/**** Routines to print out readable values for the field of various events ***/
/******************************************************************************/

static void VerbMotion(ev)
XMotionEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("root=0x%x%s", ev->root, sep);
    printf("subwindow=0x%x%s", ev->subwindow, sep);
    printf("time=%s%s", ServerTime(ev->time), sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
    printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
    printf("is_hint=%s%s", IsHint(ev->is_hint), sep);
    printf("same_screen=%s\n", TorF(ev->same_screen));
}

static void VerbButton(ev)
XButtonEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("root=0x%x%s", ev->root, sep);
    printf("subwindow=0x%x%s", ev->subwindow, sep);
    printf("time=%s%s", ServerTime(ev->time), sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
    printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
    printf("button=%s%s", ButtonAndOrModifierState(ev->button), sep);
    printf("same_screen=%s\n", TorF(ev->same_screen));
}

static void VerbColormap(ev)
XColormapEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("colormap=%s%s", MaybeNone(ev->colormap), sep);
    printf("new=%s%s", TorF(ev->new), sep);
    printf("state=%s\n", ColormapState(ev->state));
}

static void VerbCrossing(ev)
XCrossingEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("root=0x%x%s", ev->root, sep);
    printf("subwindow=0x%x%s", ev->subwindow, sep);
    printf("time=%s%s", ServerTime(ev->time), sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
    printf("mode=%s%s", GrabMode(ev->mode), sep);
    printf("detail=%s%s", CrossingDetail(ev->detail), sep);
    printf("same_screen=%s%s", TorF(ev->same_screen), sep);
    printf("focus=%s%s", TorF(ev->focus), sep);
    printf("state=%s\n", ButtonAndOrModifierState(ev->state));
}

static void VerbExpose(ev)
XExposeEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("width=%d height=%d%s", ev->width, ev->height, sep);
    printf("count=%d\n", ev->count);
}

static void VerbGraphicsExpose(ev)
XGraphicsExposeEvent *ev;
{
    printf("drawable=0x%x%s", ev->drawable, sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("width=%d height=%d%s", ev->width, ev->height, sep);
    printf("major_code=%s%s", MajorCode(ev->major_code), sep);
    printf("minor_code=%d\n", ev->minor_code);
}

static void VerbNoExpose(ev)
XNoExposeEvent *ev;
{
    printf("drawable=0x%x%s", ev->drawable, sep);
    printf("major_code=%s%s", MajorCode(ev->major_code), sep);
    printf("minor_code=%d\n", ev->minor_code);
}

static void VerbFocus(ev)
XFocusChangeEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("mode=%s%s", GrabMode(ev->mode), sep);
    printf("detail=%s\n", FocusChangeDetail(ev->detail));
}

static void VerbKeymap(ev)
XKeymapEvent *ev;
{
    int i;

    printf("window=0x%x%s", ev->window, sep);
    printf("key_vector=");
    for (i = 0; i < 32; i++)
	printf("%02x", ev->key_vector[i]);
    printf("\n");
}

static void VerbKey(ev)
XKeyEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("root=0x%x%s", ev->root, sep);
    printf("subwindow=0x%x%s", ev->subwindow, sep);
    printf("time=%s%s", ServerTime(ev->time), sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
    printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
    printf("keycode=%s%s", Keycode(ev), sep);
    printf("same_screen=%s\n", TorF(ev->same_screen));
}

static void VerbProperty(ev)
XPropertyEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("atom=%s%s", AtomName(ev->display, ev->atom), sep);
    printf("time=%s%s", ServerTime(ev->time), sep);
    printf("state=%s\n", PropertyState(ev->state));
}

static void VerbResizeRequest(ev)
XResizeRequestEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("width=%d height=%d\n", ev->width, ev->height);
}

static void VerbCirculate(ev)
XCirculateEvent *ev;
{
    printf("event=0x%x%s", ev->event, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("place=%s\n", Place(ev->place));
}

static void VerbConfigure(ev)
XConfigureEvent *ev;
{
    printf("event=0x%x%s", ev->event, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("width=%d height=%d%s", ev->width, ev->height, sep);
    printf("border_width=%d%s", ev->border_width, sep);
    printf("above=%s%s", MaybeNone(ev->above), sep);
    printf("override_redirect=%s\n", TorF(ev->override_redirect));
}

static void VerbCreateWindow(ev)
XCreateWindowEvent *ev;
{
    printf("parent=0x%x%s", ev->parent, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("width=%d height=%d%s", ev->width, ev->height, sep);
    printf("border_width=%d%s", ev->border_width, sep);
    printf("override_redirect=%s\n", TorF(ev->override_redirect));
}

static void VerbDestroyWindow(ev)
XDestroyWindowEvent *ev;
{
    printf("event=0x%x%s", ev->event, sep);
    printf("window=0x%x\n", ev->window);
}

static void VerbGravity(ev)
XGravityEvent *ev;
{
    printf("event=0x%x%s", ev->event, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("x=%d y=%d\n", ev->x, ev->y);
}

static void VerbMap(ev)
XMapEvent *ev;
{
    printf("event=0x%x%s", ev->event, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("override_redirect=%s\n", TorF(ev->override_redirect));
}

static void VerbReparent(ev)
XReparentEvent *ev;
{
    printf("event=0x%x%s", ev->event, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("parent=0x%x%s", ev->parent, sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("override_redirect=%s\n", TorF(ev->override_redirect));
}

static void VerbUnmap(ev)
XUnmapEvent *ev;
{
    printf("event=0x%x%s", ev->event, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("from_configure=%s\n", TorF(ev->from_configure));
}

static void VerbCirculateRequest(ev)
XCirculateRequestEvent *ev;
{
    printf("parent=0x%x%s", ev->parent, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("place=%s\n", Place(ev->place));
}

static void VerbConfigureRequest(ev)
XConfigureRequestEvent *ev;
{
    printf("parent=0x%x%s", ev->parent, sep);
    printf("window=0x%x%s", ev->window, sep);
    printf("x=%d y=%d%s", ev->x, ev->y, sep);
    printf("width=%d height=%d%s", ev->width, ev->height, sep);
    printf("border_width=%d%s", ev->border_width, sep);
    printf("above=%s%s", MaybeNone(ev->above), sep);
    printf("detail=0x%x%s", ConfigureDetail(ev->detail), sep);
    printf("value_mask=%s\n", ConfigureValueMask(ev->value_mask));
}

static void VerbMapRequest(ev)
XMapRequestEvent *ev;
{
    printf("parent=0x%x%s", ev->parent, sep);
    printf("window=0x%x\n", ev->window);
}

static void VerbClient(ev)
XClientMessageEvent *ev;
{
    int i;

    printf("window=0x%x%s", ev->window, sep);
    printf("message_type=%s%s", AtomName(ev->display, ev->message_type), sep);
    printf("format=%d\n", ev->format);
    printf("data (shown as longs)=");
    for (i = 0; i < 5; i++)
	printf(" 0x%08x", ev->data.l[i]);
    printf("\n");
}

static void VerbMapping(ev)
XMappingEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("request=0x%x%s", MappingRequest(ev->request), sep);
    printf("first_keycode=0x%x%s", ev->first_keycode, sep);
    printf("count=0x%x\n", ev->count);
}

static void VerbSelectionClear(ev)
XSelectionClearEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
    printf("time=%s\n", ServerTime(ev->time));
}

static void VerbSelection(ev)
XSelectionEvent *ev;
{
    printf("requestor=0x%x%s", ev->requestor, sep);
    printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
    printf("target=%s%s", AtomName(ev->display, ev->target), sep);
    printf("property=%s%s", AtomName(ev->display, ev->property), sep);
    printf("time=%s\n", ServerTime(ev->time));
}

static void VerbSelectionRequest(ev)
XSelectionRequestEvent *ev;
{
    printf("owner=0x%x%s", ev->owner, sep);
    printf("requestor=0x%x%s", ev->requestor, sep);
    printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
    printf("target=%s%s", AtomName(ev->display, ev->target), sep);
    printf("property=%s%s", AtomName(ev->display, ev->property), sep);
    printf("time=%s\n", ServerTime(ev->time));
}

static void VerbVisibility(ev)
XVisibilityEvent *ev;
{
    printf("window=0x%x%s", ev->window, sep);
    printf("state=%s\n", VisibilityState(ev->state));
}

/******************************************************************************/
/************ Return the string representation for type of an event ***********/
/******************************************************************************/

char *GetType(ev)
XEvent *ev;
{
    switch (ev->type) {
    case KeyPress:
	return ("KeyPress");
    case KeyRelease:
	return ("KeyRelease");
    case ButtonPress:
	return ("ButtonPress");
    case ButtonRelease:
	return ("ButtonRelease");
    case MotionNotify:
	return ("MotionNotify");
    case EnterNotify:
	return ("EnterNotify");
    case LeaveNotify:
	return ("LeaveNotify");
    case FocusIn:
	return ("FocusIn");
    case FocusOut:
	return ("FocusOut");
    case KeymapNotify:
	return ("KeymapNotify");
    case Expose:
	return ("Expose");
    case GraphicsExpose:
	return ("GraphicsExpose");
    case NoExpose:
	return ("NoExpose");
    case VisibilityNotify:
	return ("VisibilityNotify");
    case CreateNotify:
	return ("CreateNotify");
    case DestroyNotify:
	return ("DestroyNotify");
    case UnmapNotify:
	return ("UnmapNotify");
    case MapNotify:
	return ("MapNotify");
    case MapRequest:
	return ("MapRequest");
    case ReparentNotify:
	return ("ReparentNotify");
    case ConfigureNotify:
	return ("ConfigureNotify");
    case ConfigureRequest:
	return ("ConfigureRequest");
    case GravityNotify:
	return ("GravityNotify");
    case ResizeRequest:
	return ("ResizeRequest");
    case CirculateNotify:
	return ("CirculateNotify");
    case CirculateRequest:
	return ("CirculateRequest");
    case PropertyNotify:
	return ("PropertyNotify");
    case SelectionClear:
	return ("SelectionClear");
    case SelectionRequest:
	return ("SelectionRequest");
    case SelectionNotify:
	return ("SelectionNotify");
    case ColormapNotify:
	return ("ColormapNotify");
    case ClientMessage:
	return ("ClientMessage");
    case MappingNotify:
	return ("MappingNotify");
    }
}

/******************************************************************************/
/**************** Print the values of all fields for any event ****************/
/******************************************************************************/

void ShowEvent(ev)
XAnyEvent *ev;
{
    /* determine which field separator to use */
    if (use_separate_lines)
	sep = "\n";
    else
	sep = " ";

    printf("type=%s%s", GetType(ev), sep);
    printf("serial=%d%s", ev->serial, sep);
    printf("send_event=%s%s", TorF(ev->send_event), sep);
    printf("display=0x%x%s", ev->display, sep);

    switch (ev->type) {
    case MotionNotify:
	VerbMotion(ev);
	break;

    case ButtonPress:
    case ButtonRelease:
	VerbButton(ev);
	break;

    case ColormapNotify:
	VerbColormap(ev);
	break;

    case EnterNotify:
    case LeaveNotify:
	VerbCrossing(ev);
	break;

    case Expose:
	VerbExpose(ev);
	break;

    case GraphicsExpose:
	VerbGraphicsExpose(ev);
	break;

    case NoExpose:
	VerbNoExpose(ev);
	break;

    case FocusIn:
    case FocusOut:
	VerbFocus(ev);
	break;

    case KeymapNotify:
	VerbKeymap(ev);
	break;

    case KeyPress:
    case KeyRelease:
	VerbKey(ev);
	break;

    case PropertyNotify:
	VerbProperty(ev);
	break;

    case ResizeRequest:
	VerbResizeRequest(ev);
	break;

    case CirculateNotify:
	VerbCirculate(ev);
	break;

    case ConfigureNotify:
	VerbConfigure(ev);
	break;

    case CreateNotify:
	VerbCreateWindow(ev);
	break;

    case DestroyNotify:
	VerbDestroyWindow(ev);
	break;

    case GravityNotify:
	VerbGravity(ev);
	break;

    case MapNotify:
	VerbMap(ev);
	break;

    case ReparentNotify:
	VerbReparent(ev);
	break;

    case UnmapNotify:
	VerbUnmap(ev);
	break;

    case CirculateRequest:
	VerbCirculateRequest(ev);
	break;

    case ConfigureRequest:
	VerbConfigureRequest(ev);
	break;

    case MapRequest:
	VerbMapRequest(ev);
	break;

    case ClientMessage:
	VerbClient(ev);
	break;

    case MappingNotify:
	VerbMapping(ev);
	break;

    case SelectionClear:
	VerbSelectionClear(ev);
	break;

    case SelectionNotify:
	VerbSelection(ev);
	break;

    case SelectionRequest:
	VerbSelectionRequest(ev);
	break;

    case VisibilityNotify:
	VerbVisibility(ev);
	break;

    }
}
SHAR_EOF
fi # end of overwriting check
if test -f 'ShowEvent.man'
then
	echo shar: will not over-write existing file "'ShowEvent.man'"
else
cat << \SHAR_EOF > 'ShowEvent.man'
.TH ShowEvent 3X11 "December 1988"
.SH NAME
.B ShowEvent \- display the fields of an event
.br
.B GetType - get a string representation of an event type

.SH SYNOPSIS
.B void ShowEvent(event)
.br
.B XEvent *event;
.PP
.B char *GetType(event)
.br
.B XEvent *event;

.SH DESCRIPTION
ShowEvent displays the fields of the specified event in a readable form.
.PP
GetType returns the string representation of the specified event type.

SHAR_EOF
fi # end of overwriting check
if test -f 'patchlevel.h'
then
	echo shar: will not over-write existing file "'patchlevel.h'"
else
cat << \SHAR_EOF > 'patchlevel.h'
#define PATCHLEVEL 0
SHAR_EOF
fi # end of overwriting check
if test -f 'sample.c'
then
	echo shar: will not over-write existing file "'sample.c'"
else
cat << \SHAR_EOF > 'sample.c'
#include <X11/Intrinsic.h>

/*
 * Disclaimer: No I don't actually code like this but this is a simple,
 * "Quick-n-Dirty", plain, vanilla, "No ups, No extras" piece of code.
 */

main(argc, argv)
int argc;
char **argv;
{
    Display *dpy;
    int screen;
    Window window;
    XEvent event;
    extern Boolean use_separate_lines;

    if (!(dpy = XOpenDisplay(""))) {
	printf("Failed to open display...\n");
	exit(1);
    }
    screen = DefaultScreen(dpy);

    window = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), 100, 100,
      300, 200, 2, BlackPixel(dpy, screen), WhitePixel(dpy, screen));

    XSelectInput(dpy, window, KeyPressMask | KeyReleaseMask | ButtonPressMask |
      ButtonReleaseMask | EnterWindowMask | LeaveWindowMask |
      PointerMotionMask | PointerMotionHintMask | Button1MotionMask |
      Button2MotionMask | Button3MotionMask | Button4MotionMask |
      Button5MotionMask | ButtonMotionMask | KeymapStateMask |
      ExposureMask | VisibilityChangeMask | StructureNotifyMask |
      SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask |
      PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask);

    XMapWindow(dpy, window);

    /* set this to false to make ShowEvent take up less vertival space */
    use_separate_lines = True;

    while (1) {
	XNextEvent(dpy, &event);
	printf("Detail of %s event:\n", GetType(&event));
	ShowEvent(&event);
	printf("\n\n");
    }
}

SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0
-- 
Mike Wexler(wyse!mikew)    Phone: (408)433-1000 x1330
Moderator of comp.sources.x
