/*
 * Original code posted to comp.sources.x
 * Modifications by Russ Cox <rsc@swtch.com>.
 */

/*
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


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
*/

#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/Xproto.h>
#include "printevent.h"

static char* sep = " ";

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

/* Returns the string equivalent of a boolean parameter */
static char*
TorF(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(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(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)
{
    unsigned long msec;
    unsigned long sec;
    unsigned long min;
    unsigned long hr;
    unsigned long day;
    static 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;

if(0)
    sprintf(buffer, "%lu day%s %02lu:%02lu:%02lu.%03lu",
      day, day == 1 ? "" : "(s)", hr, min, sec, msec);
      
    sprintf(buffer, "%lud%luh%lum%lu.%03lds", day, hr, min, sec, msec);
    return (buffer);
}

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

/* Returns the string equivalent of a mask of buttons and/or modifier keys */
static char*
ButtonAndOrModifierState(unsigned int state)
{
    static 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] = 0;

    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(unsigned int valuemask)
{
    static 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] = 0;

    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(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(int value)
{
    static 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(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(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(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(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(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(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(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(int code)
{
    static 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(XKeyEvent *ev)
{
    static 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\")",
      (int)ev->keycode, (int)keysym_str, keysym_name);
    return (buffer);
}

/* Returns the string equivalent of an atom or "None"*/
static char*
AtomName(Display *dpy, Atom atom)
{
    static 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(XMotionEvent *ev)
{
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("root=0x%x%s", (int)ev->root, sep);
    printf("subwindow=0x%x%s", (int)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(XButtonEvent *ev)
{
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("root=0x%x%s", (int)ev->root, sep);
    printf("subwindow=0x%x%s", (int)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(XColormapEvent *ev)
{
    printf("window=0x%x%s", (int)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(XCrossingEvent *ev)
{
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("root=0x%x%s", (int)ev->root, sep);
    printf("subwindow=0x%x%s", (int)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(XExposeEvent *ev)
{
    printf("window=0x%x%s", (int)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(XGraphicsExposeEvent *ev)
{
    printf("drawable=0x%x%s", (int)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(XNoExposeEvent *ev)
{
    printf("drawable=0x%x%s", (int)ev->drawable, sep);
    printf("major_code=%s%s", MajorCode(ev->major_code), sep);
    printf("minor_code=%d\n", ev->minor_code);
}

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

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

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

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

    printf("window=0x%x%s", (int)ev->window, sep);
    printf("root=0x%x%s", (int)ev->root, sep);
    printf("subwindow=0x%x%s", (int)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(XPropertyEvent *ev)
{
    printf("window=0x%x%s", (int)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(XResizeRequestEvent *ev)
{
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("width=%d height=%d\n", ev->width, ev->height);
}

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

static void
VerbConfigure(XConfigureEvent *ev)
{
    printf("event=0x%x%s", (int)ev->event, sep);
    printf("window=0x%x%s", (int)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(XCreateWindowEvent *ev)
{
    printf("parent=0x%x%s", (int)ev->parent, sep);
    printf("window=0x%x%s", (int)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(XDestroyWindowEvent *ev)
{
    printf("event=0x%x%s", (int)ev->event, sep);
    printf("window=0x%x\n", (int)ev->window);
}

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

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

static void
VerbReparent(XReparentEvent *ev)
{
    printf("event=0x%x%s", (int)ev->event, sep);
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("parent=0x%x%s", (int)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(XUnmapEvent *ev)
{
    printf("event=0x%x%s", (int)ev->event, sep);
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("from_configure=%s\n", TorF(ev->from_configure));
}

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

static void
VerbConfigureRequest(XConfigureRequestEvent *ev)
{
    printf("parent=0x%x%s", (int)ev->parent, sep);
    printf("window=0x%x%s", (int)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=%s%s", ConfigureDetail(ev->detail), sep);
    printf("value_mask=%s\n", ConfigureValueMask(ev->value_mask));
}

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

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

    printf("window=0x%x%s", (int)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%08lx", ev->data.l[i]);
    printf("\n");
}

static void
VerbMapping(XMappingEvent *ev)
{
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("request=%s%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(XSelectionClearEvent *ev)
{
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
    printf("time=%s\n", ServerTime(ev->time));
}

static void
VerbSelection(XSelectionEvent *ev)
{
    printf("requestor=0x%x%s", (int)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(XSelectionRequestEvent *ev)
{
    printf("owner=0x%x%s", (int)ev->owner, sep);
    printf("requestor=0x%x%s", (int)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(XVisibilityEvent *ev)
{
    printf("window=0x%x%s", (int)ev->window, sep);
    printf("state=%s\n", VisibilityState(ev->state));
}

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

char *eventtype(XEvent *ev)
{
    static char buffer[20];
    
    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");
    }
    sprintf(buffer, "%d", ev->type);
    return buffer;
}

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

void printevent(XEvent *e)
{
    XAnyEvent *ev = (void*)e;

    printf("%3ld %-20s ", ev->serial, eventtype(e));
    if(ev->send_event)
        printf("(sendevent) ");
    if(0){
        printf("type=%s%s", eventtype(e), sep);
        printf("serial=%lu%s", ev->serial, sep);
        printf("send_event=%s%s", TorF(ev->send_event), sep);
        printf("display=0x%p%s", ev->display, sep);
    }

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

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

    case ColormapNotify:
	VerbColormap((void*)ev);
	break;

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

    case Expose:
	VerbExpose((void*)ev);
	break;

    case GraphicsExpose:
	VerbGraphicsExpose((void*)ev);
	break;

    case NoExpose:
	VerbNoExpose((void*)ev);
	break;

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

    case KeymapNotify:
	VerbKeymap((void*)ev);
	break;

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

    case PropertyNotify:
	VerbProperty((void*)ev);
	break;

    case ResizeRequest:
	VerbResizeRequest((void*)ev);
	break;

    case CirculateNotify:
	VerbCirculate((void*)ev);
	break;

    case ConfigureNotify:
	VerbConfigure((void*)ev);
	break;

    case CreateNotify:
	VerbCreateWindow((void*)ev);
	break;

    case DestroyNotify:
	VerbDestroyWindow((void*)ev);
	break;

    case GravityNotify:
	VerbGravity((void*)ev);
	break;

    case MapNotify:
	VerbMap((void*)ev);
	break;

    case ReparentNotify:
	VerbReparent((void*)ev);
	break;

    case UnmapNotify:
	VerbUnmap((void*)ev);
	break;

    case CirculateRequest:
	VerbCirculateRequest((void*)ev);
	break;

    case ConfigureRequest:
	VerbConfigureRequest((void*)ev);
	break;

    case MapRequest:
	VerbMapRequest((void*)ev);
	break;

    case ClientMessage:
	VerbClient((void*)ev);
	break;

    case MappingNotify:
	VerbMapping((void*)ev);
	break;

    case SelectionClear:
	VerbSelectionClear((void*)ev);
	break;

    case SelectionNotify:
	VerbSelection((void*)ev);
	break;

    case SelectionRequest:
	VerbSelectionRequest((void*)ev);
	break;

    case VisibilityNotify:
	VerbVisibility((void*)ev);
	break;
    }
}

