Commit Diff


commit - 52abe8e13010b21ae13d05f1428caca05aa24bdf
commit + 0206bd5113e727870d4eb24fbd5f17843745237d
blob - 358a36a50fec691ea170d42b49f7c87313fd826e
blob + fa2493f346a36a7bbfe12e5ab62d6dc2cf680237
--- src/cmd/rio/error.c
+++ src/cmd/rio/error.c
@@ -87,6 +87,7 @@ dotrace(char *s, Client *c, XEvent *e)
 {
 	if(debug == 0)
 		return;
+setbuf(stdout, 0);
 	fprintf(stderr, "rio: %s: c=%p", s, (void*)c);
 	if(c)
 		fprintf(stderr, " x %d y %d dx %d dy %d w 0x%x parent 0x%x", c->x, c->y, c->dx, c->dy, (int)c->window, (int)c->parent);
blob - 1fa00ffcfeba9409d66321611129f29dc504ca18
blob + 36c0cdc014c3a40cc901c67885f5d6b52ad56fd9
--- src/cmd/rio/event.c
+++ src/cmd/rio/event.c
@@ -124,7 +124,9 @@ configurereq(XConfigureRequestEvent *e)
 	e->value_mask &= ~CWSibling;
 
 	if(c){
-		gravitate(c, 1);
+		c->x -= c->border;
+		c->y -= c->border;
+
 		if(e->value_mask & CWX)
 			c->x = e->x;
 		if(e->value_mask & CWY)
@@ -135,7 +137,20 @@ configurereq(XConfigureRequestEvent *e)
 			c->dy = e->height;
 		if(e->value_mask & CWBorderWidth)
 			c->border = e->border_width;
-		gravitate(c, 0);
+	
+		if((e->value_mask & (CWX|CWY|CWWidth|CWHeight)) == (CWWidth|CWHeight)
+		&& c->dx >= c->screen->width && c->dy >= c->screen->height){
+			c->border = 0;
+			e->value_mask |= CWX|CWY;
+		}else
+			c->border = BORDER;
+
+		c->x += c->border;
+		c->y += c->border;
+		
+		e->x = c->x;
+		e->y = c->y;
+
 		if(e->value_mask & CWStackMode){
 			if(e->detail == Above)
 				top(c);
@@ -143,15 +158,14 @@ configurereq(XConfigureRequestEvent *e)
 				e->value_mask &= ~CWStackMode;
 		}
 		if(c->parent != c->screen->root && c->window == e->window){
-			wc.x = c->x-BORDER;
-			wc.y = c->y-BORDER;
-			wc.width = c->dx+2*BORDER;
-			wc.height = c->dy+2*BORDER;
+			wc.x = c->x - c->border;
+			wc.y = c->y - c->border;
+			wc.width = c->dx+c->border+c->border;
+			wc.height = c->dy+c->border+c->border;
 			wc.border_width = 1;
 			wc.sibling = None;
 			wc.stack_mode = e->detail;
 			XConfigureWindow(dpy, c->parent, e->value_mask, &wc);
-			sendconfig(c);
 			if(e->value_mask & CWStackMode){
 				top(c);
 				active(c);
@@ -160,8 +174,8 @@ configurereq(XConfigureRequestEvent *e)
 	}
 
 	if(c && c->init){
-		wc.x = BORDER;
-		wc.y = BORDER;
+		wc.x = c->border;
+		wc.y = c->border;
 	}
 	else {
 		wc.x = e->x;
@@ -174,7 +188,6 @@ configurereq(XConfigureRequestEvent *e)
 	wc.stack_mode = Above;
 	e->value_mask &= ~CWStackMode;
 	e->value_mask |= CWBorderWidth;
-
 	XConfigureWindow(dpy, e->window, e->value_mask, &wc);
 }
 
blob - cbe7f239e67d7ddbab37c34c8a27b15ff1099f1d
blob + 4766f1d8b799b97df0ec9c17d428eabbf087c79b
--- src/cmd/rio/fns.h
+++ src/cmd/rio/fns.h
@@ -113,3 +113,5 @@ void	dotrace();
 
 /* cursor.c */
 void	initcurs();
+
+void ShowEvent(XEvent*);
blob - afb2bb8bbd3ae0f26b6c4751a332195affb84593
blob + 2170340c94b413258d90202349a01b1986694212
--- src/cmd/rio/main.c
+++ src/cmd/rio/main.c
@@ -449,6 +449,7 @@ sendconfig(Client *c)
 {
 	XConfigureEvent ce;
 
+fprintf(stderr, "send config: %p / %d %d %d %d\n", c);
 	ce.type = ConfigureNotify;
 	ce.event = c->window;
 	ce.window = c->window;
blob - 3f42b2c4625648f44b35f54ca719cbb2af75c226
blob + 135226d3aee91e9aaf796ef94bd63cd7de7974fc
--- src/cmd/rio/mkfile
+++ src/cmd/rio/mkfile
@@ -27,10 +27,11 @@ LDFLAGS=-L$X11/lib$L64/ -lXext -lX11
 
 <|sh mkriorules.sh
 
-CFLAGS=$CFLAGS -DSHAPE
+CFLAGS=$CFLAGS -DSHAPE -DDEBUG_EV -DDEBUG
 
 $O.xevents: xevents.$O printevent.$O
 	$LD -o $target $prereq $LDFLAGS
 
 xevents.$O printevent.$O: printevent.h
 
+error.$O: showevent/ShowEvent.c
blob - /dev/null
blob + 9e70f565955a40226fb8dfe4fd7935b7ead379db (mode 644)
--- /dev/null
+++ src/cmd/rio/showevent/Makefile
@@ -0,0 +1,13 @@
+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
blob - /dev/null
blob + b6429cb8727addad1272766dbc2ff1e9c8d39d26 (mode 644)
--- /dev/null
+++ src/cmd/rio/showevent/README
@@ -0,0 +1,28 @@
+I have edited this code to work on modern compilers.
+
+Russ Cox
+
+---
+
+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
blob - /dev/null
blob + e73e8ccc67490185f56e4b6d06eca2763501f3ee (mode 644)
--- /dev/null
+++ src/cmd/rio/showevent/ShowEvent.c
@@ -0,0 +1,890 @@
+#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(dpy, atom)
+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;
+
+    }
+}
blob - /dev/null
blob + cfd188a775a839fc15678030f507d16e57f772c9 (mode 644)
--- /dev/null
+++ src/cmd/rio/showevent/ShowEvent.man
@@ -0,0 +1,20 @@
+.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.
+
blob - /dev/null
blob + 972ddd5666baac0991a3ef2b5068e9f6438c04da (mode 644)
--- /dev/null
+++ src/cmd/rio/showevent/part01
@@ -0,0 +1,1103 @@
+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
blob - /dev/null
blob + 935ec354b717b10af4bcd36ea15dfed3a1d64a01 (mode 644)
--- /dev/null
+++ src/cmd/rio/showevent/patchlevel.h
@@ -0,0 +1 @@
+#define PATCHLEVEL 0
blob - /dev/null
blob + 7b22e970ef6e7a2c2473298cfcf3fe0d9dbef87c (mode 644)
--- /dev/null
+++ src/cmd/rio/showevent/sample.c
@@ -0,0 +1,48 @@
+#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");
+    }
+}
+