part01 (26666B)
1 Path: uunet!wyse!mikew 2 From: mikew@wyse.wyse.com (Mike Wexler) 3 Newsgroups: comp.sources.x 4 Subject: v02i056: subroutine to print events in human readable form, Part01/01 5 Message-ID: <1935@wyse.wyse.com> 6 Date: 22 Dec 88 19:28:25 GMT 7 Organization: Wyse Technology, San Jose 8 Lines: 1093 9 Approved: mikew@wyse.com 10 11 Submitted-by: richsun!darkstar!ken 12 Posting-number: Volume 2, Issue 56 13 Archive-name: showevent/part01 14 15 16 17 Following is a shar file of a debugging aid along with a sample program to 18 show how it is used. The README contains more details. 19 20 Ken 21 22 #! /bin/sh 23 # This is a shell archive, meaning: 24 # 1. Remove everything above the #! /bin/sh line. 25 # 2. Save the resulting text in a file. 26 # 3. Execute the file with /bin/sh (not csh) to create the files: 27 # Makefile 28 # README 29 # ShowEvent.c 30 # ShowEvent.man 31 # patchlevel.h 32 # sample.c 33 # This archive created: Thu Dec 22 12:13:46 1988 34 export PATH; PATH=/bin:$PATH 35 if test -f 'Makefile' 36 then 37 echo shar: will not over-write existing file "'Makefile'" 38 else 39 cat << \SHAR_EOF > 'Makefile' 40 CFLAGS = -g 41 INCLUDE = -I/global/include 42 LFLAGS = -L/global/lib 43 OBJS = ShowEvent.o sample.o 44 LIBS = -lX11 45 46 all: sample 47 48 .c.o: 49 $(CC) $(INCLUDE) $(CFLAGS) -c $< 50 51 sample: $(OBJS) 52 $(CC) $(LFLAGS) $(OBJS) $(LIBS) -o sample 53 SHAR_EOF 54 fi # end of overwriting check 55 if test -f 'README' 56 then 57 echo shar: will not over-write existing file "'README'" 58 else 59 cat << \SHAR_EOF > 'README' 60 There are times during debugging when it would be real useful to be able to 61 print the fields of an event in a human readable form. Too many times I found 62 myself scrounging around in section 8 of the Xlib manual looking for the valid 63 fields for the events I wanted to see, then adding printf's to display the 64 numeric values of the fields, and then scanning through X.h trying to decode 65 the cryptic detail and state fields. After playing with xev, I decided to 66 write a couple of standard functions that I could keep in a library and call 67 on whenever I needed a little debugging verbosity. The first function, 68 GetType(), is useful for returning the string representation of the type of 69 an event. The second function, ShowEvent(), is used to display all the fields 70 of an event in a readable format. The functions are not complicated, in fact, 71 they are mind-numbingly boring - but that's just the point nobody wants to 72 spend the time writing functions like this, they just want to have them when 73 they need them. 74 75 A simple, sample program is included which does little else but to demonstrate 76 the use of these two functions. These functions have saved me many an hour 77 during debugging and I hope you find some benefit to these. If you have any 78 comments, suggestions, improvements, or if you find any blithering errors you 79 can get it touch with me at the following location: 80 81 ken@richsun.UUCP 82 SHAR_EOF 83 fi # end of overwriting check 84 if test -f 'ShowEvent.c' 85 then 86 echo shar: will not over-write existing file "'ShowEvent.c'" 87 else 88 cat << \SHAR_EOF > 'ShowEvent.c' 89 #include <X11/Intrinsic.h> 90 #include <X11/Xproto.h> 91 92 Boolean use_separate_lines = True; 93 static char *sep; 94 95 /******************************************************************************/ 96 /**** Miscellaneous routines to convert values to their string equivalents ****/ 97 /******************************************************************************/ 98 99 /* Returns the string equivalent of a boolean parameter */ 100 static char *TorF(bool) 101 int bool; 102 { 103 switch (bool) { 104 case True: 105 return ("True"); 106 107 case False: 108 return ("False"); 109 110 default: 111 return ("?"); 112 } 113 } 114 115 /* Returns the string equivalent of a property notify state */ 116 static char *PropertyState(state) 117 int state; 118 { 119 switch (state) { 120 case PropertyNewValue: 121 return ("PropertyNewValue"); 122 123 case PropertyDelete: 124 return ("PropertyDelete"); 125 126 default: 127 return ("?"); 128 } 129 } 130 131 /* Returns the string equivalent of a visibility notify state */ 132 static char *VisibilityState(state) 133 int state; 134 { 135 switch (state) { 136 case VisibilityUnobscured: 137 return ("VisibilityUnobscured"); 138 139 case VisibilityPartiallyObscured: 140 return ("VisibilityPartiallyObscured"); 141 142 case VisibilityFullyObscured: 143 return ("VisibilityFullyObscured"); 144 145 default: 146 return ("?"); 147 } 148 } 149 150 /* Returns the string equivalent of a timestamp */ 151 static char *ServerTime(time) 152 Time time; 153 { 154 unsigned long msec; 155 unsigned long sec; 156 unsigned long min; 157 unsigned long hr; 158 unsigned long day; 159 char buffer[32]; 160 161 msec = time % 1000; 162 time /= 1000; 163 sec = time % 60; 164 time /= 60; 165 min = time % 60; 166 time /= 60; 167 hr = time % 24; 168 time /= 24; 169 day = time; 170 171 sprintf(buffer, "%d day%s %02d:%02d:%02d.%03d", 172 day, day == 1 ? "" : "(s)", hr, min, sec, msec); 173 return (buffer); 174 } 175 176 /* Simple structure to ease the interpretation of masks */ 177 typedef struct _MaskType { 178 unsigned int value; 179 char *string; 180 } MaskType; 181 182 /* Returns the string equivalent of a mask of buttons and/or modifier keys */ 183 static char *ButtonAndOrModifierState(state) 184 unsigned int state; 185 { 186 char buffer[256]; 187 static MaskType masks[] = { 188 {Button1Mask, "Button1Mask"}, 189 {Button2Mask, "Button2Mask"}, 190 {Button3Mask, "Button3Mask"}, 191 {Button4Mask, "Button4Mask"}, 192 {Button5Mask, "Button5Mask"}, 193 {ShiftMask, "ShiftMask"}, 194 {LockMask, "LockMask"}, 195 {ControlMask, "ControlMask"}, 196 {Mod1Mask, "Mod1Mask"}, 197 {Mod2Mask, "Mod2Mask"}, 198 {Mod3Mask, "Mod3Mask"}, 199 {Mod4Mask, "Mod4Mask"}, 200 {Mod5Mask, "Mod5Mask"}, 201 }; 202 int num_masks = sizeof(masks) / sizeof(MaskType); 203 int i; 204 Boolean first = True; 205 206 buffer[0] = NULL; 207 208 for (i = 0; i < num_masks; i++) 209 if (state & masks[i].value) 210 if (first) { 211 first = False; 212 strcpy(buffer, masks[i].string); 213 } else { 214 strcat(buffer, " | "); 215 strcat(buffer, masks[i].string); 216 } 217 return (buffer); 218 } 219 220 /* Returns the string equivalent of a mask of configure window values */ 221 static char *ConfigureValueMask(valuemask) 222 unsigned int valuemask; 223 { 224 char buffer[256]; 225 static MaskType masks[] = { 226 {CWX, "CWX"}, 227 {CWY, "CWY"}, 228 {CWWidth, "CWWidth"}, 229 {CWHeight, "CWHeight"}, 230 {CWBorderWidth, "CWBorderWidth"}, 231 {CWSibling, "CWSibling"}, 232 {CWStackMode, "CWStackMode"}, 233 }; 234 int num_masks = sizeof(masks) / sizeof(MaskType); 235 int i; 236 Boolean first = True; 237 238 buffer[0] = NULL; 239 240 for (i = 0; i < num_masks; i++) 241 if (valuemask & masks[i].value) 242 if (first) { 243 first = False; 244 strcpy(buffer, masks[i].string); 245 } else { 246 strcat(buffer, " | "); 247 strcat(buffer, masks[i].string); 248 } 249 250 return (buffer); 251 } 252 253 /* Returns the string equivalent of a motion hint */ 254 static char *IsHint(is_hint) 255 char is_hint; 256 { 257 switch (is_hint) { 258 case NotifyNormal: 259 return ("NotifyNormal"); 260 261 case NotifyHint: 262 return ("NotifyHint"); 263 264 default: 265 return ("?"); 266 } 267 } 268 269 /* Returns the string equivalent of an id or the value "None" */ 270 static char *MaybeNone(value) 271 int value; 272 { 273 char buffer[16]; 274 275 if (value == None) 276 return ("None"); 277 else { 278 sprintf(buffer, "0x%x", value); 279 return (buffer); 280 } 281 } 282 283 /* Returns the string equivalent of a colormap state */ 284 static char *ColormapState(state) 285 int state; 286 { 287 switch (state) { 288 case ColormapInstalled: 289 return ("ColormapInstalled"); 290 291 case ColormapUninstalled: 292 return ("ColormapUninstalled"); 293 294 default: 295 return ("?"); 296 } 297 } 298 299 /* Returns the string equivalent of a crossing detail */ 300 static char *CrossingDetail(detail) 301 int detail; 302 { 303 switch (detail) { 304 case NotifyAncestor: 305 return ("NotifyAncestor"); 306 307 case NotifyInferior: 308 return ("NotifyInferior"); 309 310 case NotifyVirtual: 311 return ("NotifyVirtual"); 312 313 case NotifyNonlinear: 314 return ("NotifyNonlinear"); 315 316 case NotifyNonlinearVirtual: 317 return ("NotifyNonlinearVirtual"); 318 319 default: 320 return ("?"); 321 } 322 } 323 324 /* Returns the string equivalent of a focus change detail */ 325 static char *FocusChangeDetail(detail) 326 int detail; 327 { 328 switch (detail) { 329 case NotifyAncestor: 330 return ("NotifyAncestor"); 331 332 case NotifyInferior: 333 return ("NotifyInferior"); 334 335 case NotifyVirtual: 336 return ("NotifyVirtual"); 337 338 case NotifyNonlinear: 339 return ("NotifyNonlinear"); 340 341 case NotifyNonlinearVirtual: 342 return ("NotifyNonlinearVirtual"); 343 344 case NotifyPointer: 345 return ("NotifyPointer"); 346 347 case NotifyPointerRoot: 348 return ("NotifyPointerRoot"); 349 350 case NotifyDetailNone: 351 return ("NotifyDetailNone"); 352 353 default: 354 return ("?"); 355 } 356 } 357 358 /* Returns the string equivalent of a configure detail */ 359 static char *ConfigureDetail(detail) 360 int detail; 361 { 362 switch (detail) { 363 case Above: 364 return ("Above"); 365 366 case Below: 367 return ("Below"); 368 369 case TopIf: 370 return ("TopIf"); 371 372 case BottomIf: 373 return ("BottomIf"); 374 375 case Opposite: 376 return ("Opposite"); 377 378 default: 379 return ("?"); 380 } 381 } 382 383 /* Returns the string equivalent of a grab mode */ 384 static char *GrabMode(mode) 385 int mode; 386 { 387 switch (mode) { 388 case NotifyNormal: 389 return ("NotifyNormal"); 390 391 case NotifyGrab: 392 return ("NotifyGrab"); 393 394 case NotifyUngrab: 395 return ("NotifyUngrab"); 396 397 case NotifyWhileGrabbed: 398 return ("NotifyWhileGrabbed"); 399 400 default: 401 return ("?"); 402 } 403 } 404 405 /* Returns the string equivalent of a mapping request */ 406 static char *MappingRequest(request) 407 int request; 408 { 409 switch (request) { 410 case MappingModifier: 411 return ("MappingModifier"); 412 413 case MappingKeyboard: 414 return ("MappingKeyboard"); 415 416 case MappingPointer: 417 return ("MappingPointer"); 418 419 default: 420 return ("?"); 421 } 422 } 423 424 /* Returns the string equivalent of a stacking order place */ 425 static char *Place(place) 426 int place; 427 { 428 switch (place) { 429 case PlaceOnTop: 430 return ("PlaceOnTop"); 431 432 case PlaceOnBottom: 433 return ("PlaceOnBottom"); 434 435 default: 436 return ("?"); 437 } 438 } 439 440 /* Returns the string equivalent of a major code */ 441 static char *MajorCode(code) 442 int code; 443 { 444 char buffer[32]; 445 446 switch (code) { 447 case X_CopyArea: 448 return ("X_CopyArea"); 449 450 case X_CopyPlane: 451 return ("X_CopyPlane"); 452 453 default: 454 sprintf(buffer, "0x%x", code); 455 return (buffer); 456 } 457 } 458 459 /* Returns the string equivalent the keycode contained in the key event */ 460 static char *Keycode(ev) 461 XKeyEvent *ev; 462 { 463 char buffer[256]; 464 KeySym keysym_str; 465 char *keysym_name; 466 char string[256]; 467 468 XLookupString(ev, string, 64, &keysym_str, NULL); 469 470 if (keysym_str == NoSymbol) 471 keysym_name = "NoSymbol"; 472 else if (!(keysym_name = XKeysymToString(keysym_str))) 473 keysym_name = "(no name)"; 474 sprintf(buffer, "%u (keysym 0x%x \"%s\")", 475 ev->keycode, keysym_str, keysym_name); 476 return (buffer); 477 } 478 479 /* Returns the string equivalent of an atom or "None"*/ 480 static char *AtomName(dpy, atom) 481 Display *dpy; 482 Atom atom; 483 { 484 char buffer[256]; 485 char *atom_name; 486 487 if (atom == None) 488 return ("None"); 489 490 atom_name = XGetAtomName(dpy, atom); 491 strncpy(buffer, atom_name, 256); 492 XFree(atom_name); 493 return (buffer); 494 } 495 496 /******************************************************************************/ 497 /**** Routines to print out readable values for the field of various events ***/ 498 /******************************************************************************/ 499 500 static void VerbMotion(ev) 501 XMotionEvent *ev; 502 { 503 printf("window=0x%x%s", ev->window, sep); 504 printf("root=0x%x%s", ev->root, sep); 505 printf("subwindow=0x%x%s", ev->subwindow, sep); 506 printf("time=%s%s", ServerTime(ev->time), sep); 507 printf("x=%d y=%d%s", ev->x, ev->y, sep); 508 printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); 509 printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep); 510 printf("is_hint=%s%s", IsHint(ev->is_hint), sep); 511 printf("same_screen=%s\n", TorF(ev->same_screen)); 512 } 513 514 static void VerbButton(ev) 515 XButtonEvent *ev; 516 { 517 printf("window=0x%x%s", ev->window, sep); 518 printf("root=0x%x%s", ev->root, sep); 519 printf("subwindow=0x%x%s", ev->subwindow, sep); 520 printf("time=%s%s", ServerTime(ev->time), sep); 521 printf("x=%d y=%d%s", ev->x, ev->y, sep); 522 printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); 523 printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep); 524 printf("button=%s%s", ButtonAndOrModifierState(ev->button), sep); 525 printf("same_screen=%s\n", TorF(ev->same_screen)); 526 } 527 528 static void VerbColormap(ev) 529 XColormapEvent *ev; 530 { 531 printf("window=0x%x%s", ev->window, sep); 532 printf("colormap=%s%s", MaybeNone(ev->colormap), sep); 533 printf("new=%s%s", TorF(ev->new), sep); 534 printf("state=%s\n", ColormapState(ev->state)); 535 } 536 537 static void VerbCrossing(ev) 538 XCrossingEvent *ev; 539 { 540 printf("window=0x%x%s", ev->window, sep); 541 printf("root=0x%x%s", ev->root, sep); 542 printf("subwindow=0x%x%s", ev->subwindow, sep); 543 printf("time=%s%s", ServerTime(ev->time), sep); 544 printf("x=%d y=%d%s", ev->x, ev->y, sep); 545 printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); 546 printf("mode=%s%s", GrabMode(ev->mode), sep); 547 printf("detail=%s%s", CrossingDetail(ev->detail), sep); 548 printf("same_screen=%s%s", TorF(ev->same_screen), sep); 549 printf("focus=%s%s", TorF(ev->focus), sep); 550 printf("state=%s\n", ButtonAndOrModifierState(ev->state)); 551 } 552 553 static void VerbExpose(ev) 554 XExposeEvent *ev; 555 { 556 printf("window=0x%x%s", ev->window, sep); 557 printf("x=%d y=%d%s", ev->x, ev->y, sep); 558 printf("width=%d height=%d%s", ev->width, ev->height, sep); 559 printf("count=%d\n", ev->count); 560 } 561 562 static void VerbGraphicsExpose(ev) 563 XGraphicsExposeEvent *ev; 564 { 565 printf("drawable=0x%x%s", ev->drawable, sep); 566 printf("x=%d y=%d%s", ev->x, ev->y, sep); 567 printf("width=%d height=%d%s", ev->width, ev->height, sep); 568 printf("major_code=%s%s", MajorCode(ev->major_code), sep); 569 printf("minor_code=%d\n", ev->minor_code); 570 } 571 572 static void VerbNoExpose(ev) 573 XNoExposeEvent *ev; 574 { 575 printf("drawable=0x%x%s", ev->drawable, sep); 576 printf("major_code=%s%s", MajorCode(ev->major_code), sep); 577 printf("minor_code=%d\n", ev->minor_code); 578 } 579 580 static void VerbFocus(ev) 581 XFocusChangeEvent *ev; 582 { 583 printf("window=0x%x%s", ev->window, sep); 584 printf("mode=%s%s", GrabMode(ev->mode), sep); 585 printf("detail=%s\n", FocusChangeDetail(ev->detail)); 586 } 587 588 static void VerbKeymap(ev) 589 XKeymapEvent *ev; 590 { 591 int i; 592 593 printf("window=0x%x%s", ev->window, sep); 594 printf("key_vector="); 595 for (i = 0; i < 32; i++) 596 printf("%02x", ev->key_vector[i]); 597 printf("\n"); 598 } 599 600 static void VerbKey(ev) 601 XKeyEvent *ev; 602 { 603 printf("window=0x%x%s", ev->window, sep); 604 printf("root=0x%x%s", ev->root, sep); 605 printf("subwindow=0x%x%s", ev->subwindow, sep); 606 printf("time=%s%s", ServerTime(ev->time), sep); 607 printf("x=%d y=%d%s", ev->x, ev->y, sep); 608 printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); 609 printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep); 610 printf("keycode=%s%s", Keycode(ev), sep); 611 printf("same_screen=%s\n", TorF(ev->same_screen)); 612 } 613 614 static void VerbProperty(ev) 615 XPropertyEvent *ev; 616 { 617 printf("window=0x%x%s", ev->window, sep); 618 printf("atom=%s%s", AtomName(ev->display, ev->atom), sep); 619 printf("time=%s%s", ServerTime(ev->time), sep); 620 printf("state=%s\n", PropertyState(ev->state)); 621 } 622 623 static void VerbResizeRequest(ev) 624 XResizeRequestEvent *ev; 625 { 626 printf("window=0x%x%s", ev->window, sep); 627 printf("width=%d height=%d\n", ev->width, ev->height); 628 } 629 630 static void VerbCirculate(ev) 631 XCirculateEvent *ev; 632 { 633 printf("event=0x%x%s", ev->event, sep); 634 printf("window=0x%x%s", ev->window, sep); 635 printf("place=%s\n", Place(ev->place)); 636 } 637 638 static void VerbConfigure(ev) 639 XConfigureEvent *ev; 640 { 641 printf("event=0x%x%s", ev->event, sep); 642 printf("window=0x%x%s", ev->window, sep); 643 printf("x=%d y=%d%s", ev->x, ev->y, sep); 644 printf("width=%d height=%d%s", ev->width, ev->height, sep); 645 printf("border_width=%d%s", ev->border_width, sep); 646 printf("above=%s%s", MaybeNone(ev->above), sep); 647 printf("override_redirect=%s\n", TorF(ev->override_redirect)); 648 } 649 650 static void VerbCreateWindow(ev) 651 XCreateWindowEvent *ev; 652 { 653 printf("parent=0x%x%s", ev->parent, sep); 654 printf("window=0x%x%s", ev->window, sep); 655 printf("x=%d y=%d%s", ev->x, ev->y, sep); 656 printf("width=%d height=%d%s", ev->width, ev->height, sep); 657 printf("border_width=%d%s", ev->border_width, sep); 658 printf("override_redirect=%s\n", TorF(ev->override_redirect)); 659 } 660 661 static void VerbDestroyWindow(ev) 662 XDestroyWindowEvent *ev; 663 { 664 printf("event=0x%x%s", ev->event, sep); 665 printf("window=0x%x\n", ev->window); 666 } 667 668 static void VerbGravity(ev) 669 XGravityEvent *ev; 670 { 671 printf("event=0x%x%s", ev->event, sep); 672 printf("window=0x%x%s", ev->window, sep); 673 printf("x=%d y=%d\n", ev->x, ev->y); 674 } 675 676 static void VerbMap(ev) 677 XMapEvent *ev; 678 { 679 printf("event=0x%x%s", ev->event, sep); 680 printf("window=0x%x%s", ev->window, sep); 681 printf("override_redirect=%s\n", TorF(ev->override_redirect)); 682 } 683 684 static void VerbReparent(ev) 685 XReparentEvent *ev; 686 { 687 printf("event=0x%x%s", ev->event, sep); 688 printf("window=0x%x%s", ev->window, sep); 689 printf("parent=0x%x%s", ev->parent, sep); 690 printf("x=%d y=%d%s", ev->x, ev->y, sep); 691 printf("override_redirect=%s\n", TorF(ev->override_redirect)); 692 } 693 694 static void VerbUnmap(ev) 695 XUnmapEvent *ev; 696 { 697 printf("event=0x%x%s", ev->event, sep); 698 printf("window=0x%x%s", ev->window, sep); 699 printf("from_configure=%s\n", TorF(ev->from_configure)); 700 } 701 702 static void VerbCirculateRequest(ev) 703 XCirculateRequestEvent *ev; 704 { 705 printf("parent=0x%x%s", ev->parent, sep); 706 printf("window=0x%x%s", ev->window, sep); 707 printf("place=%s\n", Place(ev->place)); 708 } 709 710 static void VerbConfigureRequest(ev) 711 XConfigureRequestEvent *ev; 712 { 713 printf("parent=0x%x%s", ev->parent, sep); 714 printf("window=0x%x%s", ev->window, sep); 715 printf("x=%d y=%d%s", ev->x, ev->y, sep); 716 printf("width=%d height=%d%s", ev->width, ev->height, sep); 717 printf("border_width=%d%s", ev->border_width, sep); 718 printf("above=%s%s", MaybeNone(ev->above), sep); 719 printf("detail=0x%x%s", ConfigureDetail(ev->detail), sep); 720 printf("value_mask=%s\n", ConfigureValueMask(ev->value_mask)); 721 } 722 723 static void VerbMapRequest(ev) 724 XMapRequestEvent *ev; 725 { 726 printf("parent=0x%x%s", ev->parent, sep); 727 printf("window=0x%x\n", ev->window); 728 } 729 730 static void VerbClient(ev) 731 XClientMessageEvent *ev; 732 { 733 int i; 734 735 printf("window=0x%x%s", ev->window, sep); 736 printf("message_type=%s%s", AtomName(ev->display, ev->message_type), sep); 737 printf("format=%d\n", ev->format); 738 printf("data (shown as longs)="); 739 for (i = 0; i < 5; i++) 740 printf(" 0x%08x", ev->data.l[i]); 741 printf("\n"); 742 } 743 744 static void VerbMapping(ev) 745 XMappingEvent *ev; 746 { 747 printf("window=0x%x%s", ev->window, sep); 748 printf("request=0x%x%s", MappingRequest(ev->request), sep); 749 printf("first_keycode=0x%x%s", ev->first_keycode, sep); 750 printf("count=0x%x\n", ev->count); 751 } 752 753 static void VerbSelectionClear(ev) 754 XSelectionClearEvent *ev; 755 { 756 printf("window=0x%x%s", ev->window, sep); 757 printf("selection=%s%s", AtomName(ev->display, ev->selection), sep); 758 printf("time=%s\n", ServerTime(ev->time)); 759 } 760 761 static void VerbSelection(ev) 762 XSelectionEvent *ev; 763 { 764 printf("requestor=0x%x%s", ev->requestor, sep); 765 printf("selection=%s%s", AtomName(ev->display, ev->selection), sep); 766 printf("target=%s%s", AtomName(ev->display, ev->target), sep); 767 printf("property=%s%s", AtomName(ev->display, ev->property), sep); 768 printf("time=%s\n", ServerTime(ev->time)); 769 } 770 771 static void VerbSelectionRequest(ev) 772 XSelectionRequestEvent *ev; 773 { 774 printf("owner=0x%x%s", ev->owner, sep); 775 printf("requestor=0x%x%s", ev->requestor, sep); 776 printf("selection=%s%s", AtomName(ev->display, ev->selection), sep); 777 printf("target=%s%s", AtomName(ev->display, ev->target), sep); 778 printf("property=%s%s", AtomName(ev->display, ev->property), sep); 779 printf("time=%s\n", ServerTime(ev->time)); 780 } 781 782 static void VerbVisibility(ev) 783 XVisibilityEvent *ev; 784 { 785 printf("window=0x%x%s", ev->window, sep); 786 printf("state=%s\n", VisibilityState(ev->state)); 787 } 788 789 /******************************************************************************/ 790 /************ Return the string representation for type of an event ***********/ 791 /******************************************************************************/ 792 793 char *GetType(ev) 794 XEvent *ev; 795 { 796 switch (ev->type) { 797 case KeyPress: 798 return ("KeyPress"); 799 case KeyRelease: 800 return ("KeyRelease"); 801 case ButtonPress: 802 return ("ButtonPress"); 803 case ButtonRelease: 804 return ("ButtonRelease"); 805 case MotionNotify: 806 return ("MotionNotify"); 807 case EnterNotify: 808 return ("EnterNotify"); 809 case LeaveNotify: 810 return ("LeaveNotify"); 811 case FocusIn: 812 return ("FocusIn"); 813 case FocusOut: 814 return ("FocusOut"); 815 case KeymapNotify: 816 return ("KeymapNotify"); 817 case Expose: 818 return ("Expose"); 819 case GraphicsExpose: 820 return ("GraphicsExpose"); 821 case NoExpose: 822 return ("NoExpose"); 823 case VisibilityNotify: 824 return ("VisibilityNotify"); 825 case CreateNotify: 826 return ("CreateNotify"); 827 case DestroyNotify: 828 return ("DestroyNotify"); 829 case UnmapNotify: 830 return ("UnmapNotify"); 831 case MapNotify: 832 return ("MapNotify"); 833 case MapRequest: 834 return ("MapRequest"); 835 case ReparentNotify: 836 return ("ReparentNotify"); 837 case ConfigureNotify: 838 return ("ConfigureNotify"); 839 case ConfigureRequest: 840 return ("ConfigureRequest"); 841 case GravityNotify: 842 return ("GravityNotify"); 843 case ResizeRequest: 844 return ("ResizeRequest"); 845 case CirculateNotify: 846 return ("CirculateNotify"); 847 case CirculateRequest: 848 return ("CirculateRequest"); 849 case PropertyNotify: 850 return ("PropertyNotify"); 851 case SelectionClear: 852 return ("SelectionClear"); 853 case SelectionRequest: 854 return ("SelectionRequest"); 855 case SelectionNotify: 856 return ("SelectionNotify"); 857 case ColormapNotify: 858 return ("ColormapNotify"); 859 case ClientMessage: 860 return ("ClientMessage"); 861 case MappingNotify: 862 return ("MappingNotify"); 863 } 864 } 865 866 /******************************************************************************/ 867 /**************** Print the values of all fields for any event ****************/ 868 /******************************************************************************/ 869 870 void ShowEvent(ev) 871 XAnyEvent *ev; 872 { 873 /* determine which field separator to use */ 874 if (use_separate_lines) 875 sep = "\n"; 876 else 877 sep = " "; 878 879 printf("type=%s%s", GetType(ev), sep); 880 printf("serial=%d%s", ev->serial, sep); 881 printf("send_event=%s%s", TorF(ev->send_event), sep); 882 printf("display=0x%x%s", ev->display, sep); 883 884 switch (ev->type) { 885 case MotionNotify: 886 VerbMotion(ev); 887 break; 888 889 case ButtonPress: 890 case ButtonRelease: 891 VerbButton(ev); 892 break; 893 894 case ColormapNotify: 895 VerbColormap(ev); 896 break; 897 898 case EnterNotify: 899 case LeaveNotify: 900 VerbCrossing(ev); 901 break; 902 903 case Expose: 904 VerbExpose(ev); 905 break; 906 907 case GraphicsExpose: 908 VerbGraphicsExpose(ev); 909 break; 910 911 case NoExpose: 912 VerbNoExpose(ev); 913 break; 914 915 case FocusIn: 916 case FocusOut: 917 VerbFocus(ev); 918 break; 919 920 case KeymapNotify: 921 VerbKeymap(ev); 922 break; 923 924 case KeyPress: 925 case KeyRelease: 926 VerbKey(ev); 927 break; 928 929 case PropertyNotify: 930 VerbProperty(ev); 931 break; 932 933 case ResizeRequest: 934 VerbResizeRequest(ev); 935 break; 936 937 case CirculateNotify: 938 VerbCirculate(ev); 939 break; 940 941 case ConfigureNotify: 942 VerbConfigure(ev); 943 break; 944 945 case CreateNotify: 946 VerbCreateWindow(ev); 947 break; 948 949 case DestroyNotify: 950 VerbDestroyWindow(ev); 951 break; 952 953 case GravityNotify: 954 VerbGravity(ev); 955 break; 956 957 case MapNotify: 958 VerbMap(ev); 959 break; 960 961 case ReparentNotify: 962 VerbReparent(ev); 963 break; 964 965 case UnmapNotify: 966 VerbUnmap(ev); 967 break; 968 969 case CirculateRequest: 970 VerbCirculateRequest(ev); 971 break; 972 973 case ConfigureRequest: 974 VerbConfigureRequest(ev); 975 break; 976 977 case MapRequest: 978 VerbMapRequest(ev); 979 break; 980 981 case ClientMessage: 982 VerbClient(ev); 983 break; 984 985 case MappingNotify: 986 VerbMapping(ev); 987 break; 988 989 case SelectionClear: 990 VerbSelectionClear(ev); 991 break; 992 993 case SelectionNotify: 994 VerbSelection(ev); 995 break; 996 997 case SelectionRequest: 998 VerbSelectionRequest(ev); 999 break; 1000 1001 case VisibilityNotify: 1002 VerbVisibility(ev); 1003 break; 1004 1005 } 1006 } 1007 SHAR_EOF 1008 fi # end of overwriting check 1009 if test -f 'ShowEvent.man' 1010 then 1011 echo shar: will not over-write existing file "'ShowEvent.man'" 1012 else 1013 cat << \SHAR_EOF > 'ShowEvent.man' 1014 .TH ShowEvent 3X11 "December 1988" 1015 .SH NAME 1016 .B ShowEvent \- display the fields of an event 1017 .br 1018 .B GetType - get a string representation of an event type 1019 1020 .SH SYNOPSIS 1021 .B void ShowEvent(event) 1022 .br 1023 .B XEvent *event; 1024 .PP 1025 .B char *GetType(event) 1026 .br 1027 .B XEvent *event; 1028 1029 .SH DESCRIPTION 1030 ShowEvent displays the fields of the specified event in a readable form. 1031 .PP 1032 GetType returns the string representation of the specified event type. 1033 1034 SHAR_EOF 1035 fi # end of overwriting check 1036 if test -f 'patchlevel.h' 1037 then 1038 echo shar: will not over-write existing file "'patchlevel.h'" 1039 else 1040 cat << \SHAR_EOF > 'patchlevel.h' 1041 #define PATCHLEVEL 0 1042 SHAR_EOF 1043 fi # end of overwriting check 1044 if test -f 'sample.c' 1045 then 1046 echo shar: will not over-write existing file "'sample.c'" 1047 else 1048 cat << \SHAR_EOF > 'sample.c' 1049 #include <X11/Intrinsic.h> 1050 1051 /* 1052 * Disclaimer: No I don't actually code like this but this is a simple, 1053 * "Quick-n-Dirty", plain, vanilla, "No ups, No extras" piece of code. 1054 */ 1055 1056 main(argc, argv) 1057 int argc; 1058 char **argv; 1059 { 1060 Display *dpy; 1061 int screen; 1062 Window window; 1063 XEvent event; 1064 extern Boolean use_separate_lines; 1065 1066 if (!(dpy = XOpenDisplay(""))) { 1067 printf("Failed to open display...\n"); 1068 exit(1); 1069 } 1070 screen = DefaultScreen(dpy); 1071 1072 window = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), 100, 100, 1073 300, 200, 2, BlackPixel(dpy, screen), WhitePixel(dpy, screen)); 1074 1075 XSelectInput(dpy, window, KeyPressMask | KeyReleaseMask | ButtonPressMask | 1076 ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | 1077 PointerMotionMask | PointerMotionHintMask | Button1MotionMask | 1078 Button2MotionMask | Button3MotionMask | Button4MotionMask | 1079 Button5MotionMask | ButtonMotionMask | KeymapStateMask | 1080 ExposureMask | VisibilityChangeMask | StructureNotifyMask | 1081 SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask | 1082 PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask); 1083 1084 XMapWindow(dpy, window); 1085 1086 /* set this to false to make ShowEvent take up less vertival space */ 1087 use_separate_lines = True; 1088 1089 while (1) { 1090 XNextEvent(dpy, &event); 1091 printf("Detail of %s event:\n", GetType(&event)); 1092 ShowEvent(&event); 1093 printf("\n\n"); 1094 } 1095 } 1096 1097 SHAR_EOF 1098 fi # end of overwriting check 1099 # End of shell archive 1100 exit 0 1101 -- 1102 Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330 1103 Moderator of comp.sources.x