#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;
    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;

    sprintf(buffer, "%ld day%s %02ld:%02ld:%02ld.%03ld",
      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;
{
    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(valuemask)
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(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;
{
    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(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;
{
    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(ev)
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\")",
      ev->keycode, (unsigned)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", (unsigned)ev->window, sep);
    printf("root=0x%x%s", (unsigned)ev->root, sep);
    printf("subwindow=0x%x%s", (unsigned)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", (unsigned)ev->window, sep);
    printf("root=0x%x%s", (unsigned)ev->root, sep);
    printf("subwindow=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)ev->window, sep);
    printf("root=0x%x%s", (unsigned)ev->root, sep);
    printf("subwindow=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)ev->window, sep);
    printf("root=0x%x%s", (unsigned)ev->root, sep);
    printf("subwindow=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)ev->window, sep);
    printf("width=%d height=%d\n", ev->width, ev->height);
}

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

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

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

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

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

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

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

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

    printf("window=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)ev->owner, sep);
    printf("requestor=0x%x%s", (unsigned)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", (unsigned)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");
    }
    return "???";
}

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

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

    printf("type=%s%s", GetType(ev), sep);
    printf("serial=%ld%s", ev->serial, sep);
    printf("send_event=%s%s", TorF(ev->send_event), sep);
    printf("display=0x%x%s", (unsigned)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;

    }
}
