ken@uunet.UU.NET (Ken Marks (x2425)) (08/21/90)
Submitted-by: balr!panasun!ken@uunet.UU.NET (Ken Marks (x2425)) Posting-number: Volume 8, Issue 78 Archive-name: chaos/part02 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 10)." # Contents: common/showEvent.c gencmap/Imakefile gencmap/gencmap.c # widgets/List.c # Wrapped by ken@panasun on Mon Jul 30 14:59:47 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'common/showEvent.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'common/showEvent.c'\" else echo shar: Extracting \"'common/showEvent.c'\" \(23550 characters\) sed "s/^X//" >'common/showEvent.c' <<'END_OF_FILE' X/* X * Copyright (c) Ken W. Marks 1989, 1990. X */ X X#include <stdio.h> X#include <X11/Intrinsic.h> X#include <X11/Xproto.h> X#include <Chaos.h> X XBoolean use_separate_lines = True; Xstatic char *sep; X X/******************************************************************************/ X/**** Miscellaneous routines to convert values to their string equivalents ****/ X/******************************************************************************/ X X/* Returns the string equivalent of a boolean parameter */ Xstatic char *TorF(bool) Xint bool; X{ X switch (bool) X { X case True: X return ("True"); X X case False: X return ("False"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a property notify state */ Xstatic char *PropertyState(state) Xint state; X{ X switch (state) X { X case PropertyNewValue: X return ("PropertyNewValue"); X X case PropertyDelete: X return ("PropertyDelete"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a visibility notify state */ Xstatic char *VisibilityState(state) Xint state; X{ X switch (state) X { X case VisibilityUnobscured: X return ("VisibilityUnobscured"); X X case VisibilityPartiallyObscured: X return ("VisibilityPartiallyObscured"); X X case VisibilityFullyObscured: X return ("VisibilityFullyObscured"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a timestamp */ Xstatic char *ServerTime(time) XTime time; X{ X unsigned long msec; X unsigned long sec; X unsigned long min; X unsigned long hr; X unsigned long day; X static char buffer[32]; X X msec = time % 1000; X time /= 1000; X sec = time % 60; X time /= 60; X min = time % 60; X time /= 60; X hr = time % 24; X time /= 24; X day = time; X X (void) sprintf(buffer, "%d day%s %02d:%02d:%02d.%03d", X day, day == 1 ? "" : "(s)", hr, min, sec, msec); X return (buffer); X} X X/* Simple structure to ease the interpretation of masks */ Xtypedef struct _MaskType X{ X unsigned int value; X char *string; X} MaskType; X X/* Returns the string equivalent of a mask of buttons and modifier keys */ Xstatic char *ButtonOrModifierState(state) Xunsigned int state; X{ X static char buffer[256]; X static MaskType masks[] = { X {ShiftMask, "ShiftMask"}, X {LockMask, "LockMask"}, X {ControlMask, "ControlMask"}, X {Mod1Mask, "Mod1Mask"}, X {Mod2Mask, "Mod2Mask"}, X {Mod3Mask, "Mod3Mask"}, X {Mod4Mask, "Mod4Mask"}, X {Mod5Mask, "Mod5Mask"}, X {Button1Mask, "Button1Mask"}, X {Button2Mask, "Button2Mask"}, X {Button3Mask, "Button3Mask"}, X {Button4Mask, "Button4Mask"}, X {Button5Mask, "Button5Mask"}, X }; X int num_masks = sizeof(masks) / sizeof(MaskType); X int ii; X Boolean first = True; X X buffer[0] = NULL; X X if (state == 0) X return (buffer); X X for (ii = 0; ii < num_masks; ii++) X if (state & masks[ii].value) X if (first) X { X first = False; X (void) strcat(buffer, masks[ii].string); X } X else X { X (void) strcat(buffer, " | "); X (void) strcat(buffer, masks[ii].string); X } X return (buffer); X} X X/* Returns the string equivalent of a mask of configure window values */ Xstatic char *ConfigureValueMask(valuemask) Xunsigned long valuemask; X{ X static char buffer[256]; X static MaskType masks[] = { X {CWX, "CWX"}, X {CWY, "CWY"}, X {CWWidth, "CWWidth"}, X {CWHeight, "CWHeight"}, X {CWBorderWidth, "CWBorderWidth"}, X {CWSibling, "CWSibling"}, X {CWStackMode, "CWStackMode"}, X }; X int num_masks = sizeof(masks) / sizeof(MaskType); X int ii; X Boolean first = True; X X buffer[0] = NULL; X X if (valuemask == 0) X return (buffer); X X for (ii = 0; ii < num_masks; ii++) X if (valuemask & masks[ii].value) X if (first) X { X first = False; X (void) strcat(buffer, masks[ii].string); X } X else X { X (void) strcat(buffer, " | "); X (void) strcat(buffer, masks[ii].string); X } X X return (buffer); X} X X/* Returns the string equivalent of a motion hint */ Xstatic char *IsHint(is_hint) Xchar is_hint; X{ X switch (is_hint) X { X case NotifyNormal: X return ("NotifyNormal"); X X case NotifyHint: X return ("NotifyHint"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of an id or the value "None" */ Xstatic char *MaybeNone(value) Xint value; X{ X static char buffer[16]; X X if (value == None) X return ("None"); X else X { X (void) sprintf(buffer, "0x%x", value); X return (buffer); X } X} X X/* Returns the string equivalent of a colormap state */ Xstatic char *ColormapState(state) Xint state; X{ X switch (state) X { X case ColormapInstalled: X return ("ColormapInstalled"); X X case ColormapUninstalled: X return ("ColormapUninstalled"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a crossing detail */ Xstatic char *CrossingDetail(detail) Xint detail; X{ X switch (detail) X { X case NotifyAncestor: X return ("NotifyAncestor"); X X case NotifyInferior: X return ("NotifyInferior"); X X case NotifyVirtual: X return ("NotifyVirtual"); X X case NotifyNonlinear: X return ("NotifyNonlinear"); X X case NotifyNonlinearVirtual: X return ("NotifyNonlinearVirtual"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a focus change detail */ Xstatic char *FocusChangeDetail(detail) Xint detail; X{ X switch (detail) X { X case NotifyAncestor: X return ("NotifyAncestor"); X X case NotifyInferior: X return ("NotifyInferior"); X X case NotifyVirtual: X return ("NotifyVirtual"); X X case NotifyNonlinear: X return ("NotifyNonlinear"); X X case NotifyNonlinearVirtual: X return ("NotifyNonlinearVirtual"); X X case NotifyPointer: X return ("NotifyPointer"); X X case NotifyPointerRoot: X return ("NotifyPointerRoot"); X X case NotifyDetailNone: X return ("NotifyDetailNone"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a configure detail */ Xstatic char *ConfigureDetail(detail) Xint detail; X{ X switch (detail) X { X case Above: X return ("Above"); X X case Below: X return ("Below"); X X case TopIf: X return ("TopIf"); X X case BottomIf: X return ("BottomIf"); X X case Opposite: X return ("Opposite"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a grab mode */ Xstatic char *GrabMode(mode) Xint mode; X{ X switch (mode) X { X case NotifyNormal: X return ("NotifyNormal"); X X case NotifyGrab: X return ("NotifyGrab"); X X case NotifyUngrab: X return ("NotifyUngrab"); X X case NotifyWhileGrabbed: X return ("NotifyWhileGrabbed"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a mapping request */ Xstatic char *MappingRequest(request) Xint request; X{ X switch (request) X { X case MappingModifier: X return ("MappingModifier"); X X case MappingKeyboard: X return ("MappingKeyboard"); X X case MappingPointer: X return ("MappingPointer"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a stacking order place */ Xstatic char *Place(place) Xint place; X{ X switch (place) X { X case PlaceOnTop: X return ("PlaceOnTop"); X X case PlaceOnBottom: X return ("PlaceOnBottom"); X X default: X return ("?"); X } X} X X/* Returns the string equivalent of a major code */ Xstatic char *MajorCode(code) Xint code; X{ X static char buffer[32]; X X switch (code) X { X case X_CopyArea: X return ("X_CopyArea"); X X case X_CopyPlane: X return ("X_CopyPlane"); X X default: X (void) sprintf(buffer, "0x%x", code); X return (buffer); X } X} X X/* Returns the string equivalent the keycode contained in the key event */ Xstatic char *Keycode(ev) XXKeyEvent *ev; X{ X static char buffer[256]; X KeySym keysym_str; X char *keysym_name; X char string[256]; X X XLookupString(ev, string, 64, &keysym_str, NULL); X X if (keysym_str == NoSymbol) X keysym_name = "NoSymbol"; X else if (!(keysym_name = XKeysymToString(keysym_str))) X keysym_name = "(no name)"; X (void) sprintf(buffer, "%u (keysym 0x%x \"%s\")", X ev->keycode, keysym_str, keysym_name); X return (buffer); X} X X/* Returns the string equivalent of an atom or "None"*/ Xstatic char *AtomName(dpy, atom) XDisplay *dpy; XAtom atom; X{ X static char buffer[256]; X char *atom_name; X X if (atom == None) X return ("None"); X X atom_name = XGetAtomName(dpy, atom); X (void) strncpy(buffer, atom_name, 256); X free(atom_name); X X return (buffer); X} X X/******************************************************************************/ X/**** Routines to print out readable values for the field of various events ***/ X/******************************************************************************/ X Xstatic void VerbMotion(ev) XXMotionEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("root = 0x%x%s", ev->root, sep); X (void) printf("subwindow = 0x%x%s", ev->subwindow, sep); X (void) printf("time = %s%s", ServerTime(ev->time), sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("x_root = %d y_root = %d%s", ev->x_root, ev->y_root, sep); X (void) printf("state = %s%s", ButtonOrModifierState(ev->state), sep); X (void) printf("is_hint = %s%s", IsHint(ev->is_hint), sep); X (void) printf("same_screen = %s\n", TorF(ev->same_screen)); X} X Xstatic void VerbButton(ev) XXButtonEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("root = 0x%x%s", ev->root, sep); X (void) printf("subwindow = 0x%x%s", ev->subwindow, sep); X (void) printf("time = %s%s", ServerTime(ev->time), sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("x_root = %d y_root = %d%s", ev->x_root, ev->y_root, sep); X (void) printf("state = %s%s", ButtonOrModifierState(ev->state), sep); X (void) printf("button = Button%d%s", ev->button, sep); X (void) printf("same_screen = %s\n", TorF(ev->same_screen)); X} X Xstatic void VerbColormap(ev) XXColormapEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("colormap = %s%s", MaybeNone((int) (ev->colormap)), sep); X (void) printf("new = %s%s", TorF(ev->new), sep); X (void) printf("state = %s\n", ColormapState(ev->state)); X} X Xstatic void VerbCrossing(ev) XXCrossingEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("root = 0x%x%s", ev->root, sep); X (void) printf("subwindow = 0x%x%s", ev->subwindow, sep); X (void) printf("time = %s%s", ServerTime(ev->time), sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("x_root = %d y_root = %d%s", ev->x_root, ev->y_root, sep); X (void) printf("mode = %s%s", GrabMode(ev->mode), sep); X (void) printf("detail = %s%s", CrossingDetail(ev->detail), sep); X (void) printf("same_screen = %s%s", TorF(ev->same_screen), sep); X (void) printf("focus = %s%s", TorF(ev->focus), sep); X (void) printf("state = %s\n", ButtonOrModifierState(ev->state)); X} X Xstatic void VerbExpose(ev) XXExposeEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("width = %d height = %d%s", ev->width, ev->height, sep); X (void) printf("count = %d\n", ev->count); X} X Xstatic void VerbGraphicsExpose(ev) XXGraphicsExposeEvent *ev; X{ X (void) printf("drawable = 0x%x%s", ev->drawable, sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("width = %d height = %d%s", ev->width, ev->height, sep); X (void) printf("major_code = %s%s", MajorCode(ev->major_code), sep); X (void) printf("minor_code = %d\n", ev->minor_code); X} X Xstatic void VerbNoExpose(ev) XXNoExposeEvent *ev; X{ X (void) printf("drawable = 0x%x%s", ev->drawable, sep); X (void) printf("major_code = %s%s", MajorCode(ev->major_code), sep); X (void) printf("minor_code = %d\n", ev->minor_code); X} X Xstatic void VerbFocus(ev) XXFocusChangeEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("mode = %s%s", GrabMode(ev->mode), sep); X (void) printf("detail = %s\n", FocusChangeDetail(ev->detail)); X} X Xstatic void VerbKeymap(ev) XXKeymapEvent *ev; X{ X int ii; X X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("key_vector = "); X for (ii = 0; ii < 32; ii++) X (void) printf("%02x", ev->key_vector[ii]); X (void) printf("\n"); X} X Xstatic void VerbKey(ev) XXKeyEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("root = 0x%x%s", ev->root, sep); X (void) printf("subwindow = 0x%x%s", ev->subwindow, sep); X (void) printf("time = %s%s", ServerTime(ev->time), sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("x_root = %d y_root = %d%s", ev->x_root, ev->y_root, sep); X (void) printf("state = %s%s", ButtonOrModifierState(ev->state), sep); X (void) printf("keycode = %s%s", Keycode(ev), sep); X (void) printf("same_screen = %s\n", TorF(ev->same_screen)); X} X Xstatic void VerbProperty(ev) XXPropertyEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("atom = %s%s", AtomName(ev->display, ev->atom), sep); X (void) printf("time = %s%s", ServerTime(ev->time), sep); X (void) printf("state = %s\n", PropertyState(ev->state)); X} X Xstatic void VerbResizeRequest(ev) XXResizeRequestEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("width = %d height = %d\n", ev->width, ev->height); X} X Xstatic void VerbCirculate(ev) XXCirculateEvent *ev; X{ X (void) printf("event = 0x%x%s", ev->event, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("place = %s\n", Place(ev->place)); X} X Xstatic void VerbConfigure(ev) XXConfigureEvent *ev; X{ X (void) printf("event = 0x%x%s", ev->event, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("width = %d height = %d%s", ev->width, ev->height, sep); X (void) printf("border_width = %d%s", ev->border_width, sep); X (void) printf("above = %s%s", MaybeNone((int) (ev->above)), sep); X (void) printf("override_redirect = %s\n", TorF(ev->override_redirect)); X} X Xstatic void VerbCreateWindow(ev) XXCreateWindowEvent *ev; X{ X (void) printf("parent = 0x%x%s", ev->parent, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("width = %d height = %d%s", ev->width, ev->height, sep); X (void) printf("border_width = %d%s", ev->border_width, sep); X (void) printf("override_redirect = %s\n", TorF(ev->override_redirect)); X} X Xstatic void VerbDestroyWindow(ev) XXDestroyWindowEvent *ev; X{ X (void) printf("event = 0x%x%s", ev->event, sep); X (void) printf("window = 0x%x\n", ev->window); X} X Xstatic void VerbGravity(ev) XXGravityEvent *ev; X{ X (void) printf("event = 0x%x%s", ev->event, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("x = %d y = %d\n", ev->x, ev->y); X} X Xstatic void VerbMap(ev) XXMapEvent *ev; X{ X (void) printf("event = 0x%x%s", ev->event, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("override_redirect = %s\n", TorF(ev->override_redirect)); X} X Xstatic void VerbReparent(ev) XXReparentEvent *ev; X{ X (void) printf("event = 0x%x%s", ev->event, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("parent = 0x%x%s", ev->parent, sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("override_redirect = %s\n", TorF(ev->override_redirect)); X} X Xstatic void VerbUnmap(ev) XXUnmapEvent *ev; X{ X (void) printf("event = 0x%x%s", ev->event, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("from_configure = %s\n", TorF(ev->from_configure)); X} X Xstatic void VerbCirculateRequest(ev) XXCirculateRequestEvent *ev; X{ X (void) printf("parent = 0x%x%s", ev->parent, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("place = %s\n", Place(ev->place)); X} X Xstatic void VerbConfigureRequest(ev) XXConfigureRequestEvent *ev; X{ X (void) printf("parent = 0x%x%s", ev->parent, sep); X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("x = %d y = %d%s", ev->x, ev->y, sep); X (void) printf("width = %d height = %d%s", ev->width, ev->height, sep); X (void) printf("border_width = %d%s", ev->border_width, sep); X (void) printf("above = %s%s", MaybeNone((int) (ev->above)), sep); X (void) printf("detail = 0x%x%s", ConfigureDetail(ev->detail), sep); X (void) printf("value_mask = %s\n", ConfigureValueMask(ev->value_mask)); X} X Xstatic void VerbMapRequest(ev) XXMapRequestEvent *ev; X{ X (void) printf("parent = 0x%x%s", ev->parent, sep); X (void) printf("window = 0x%x\n", ev->window); X} X Xstatic void VerbClient(ev) XXClientMessageEvent *ev; X{ X int ii; X X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("message_type = %s%s", AtomName(ev->display, X ev->message_type), sep); X (void) printf("format = %d\n", ev->format); X (void) printf("data (shown as longs) = "); X for (ii = 0; ii < 5; ii++) X (void) printf(" 0x%08x", ev->data.l[ii]); X (void) printf("\n"); X} X Xstatic void VerbMapping(ev) XXMappingEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("request = 0x%x%s", MappingRequest(ev->request), sep); X (void) printf("first_keycode = 0x%x%s", ev->first_keycode, sep); X (void) printf("count = 0x%x\n", ev->count); X} X Xstatic void VerbSelectionClear(ev) XXSelectionClearEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("selection = %s%s", AtomName(ev->display, ev->selection), X sep); X (void) printf("time = %s\n", ServerTime(ev->time)); X} X Xstatic void VerbSelection(ev) XXSelectionEvent *ev; X{ X (void) printf("requestor = 0x%x%s", ev->requestor, sep); X (void) printf("selection = %s%s", AtomName(ev->display, ev->selection), X sep); X (void) printf("target = %s%s", AtomName(ev->display, ev->target), sep); X (void) printf("property = %s%s", AtomName(ev->display, ev->property), sep); X (void) printf("time = %s\n", ServerTime(ev->time)); X} X Xstatic void VerbSelectionRequest(ev) XXSelectionRequestEvent *ev; X{ X (void) printf("owner = 0x%x%s", ev->owner, sep); X (void) printf("requestor = 0x%x%s", ev->requestor, sep); X (void) printf("selection = %s%s", AtomName(ev->display, ev->selection), X sep); X (void) printf("target = %s%s", AtomName(ev->display, ev->target), sep); X (void) printf("property = %s%s", AtomName(ev->display, ev->property), sep); X (void) printf("time = %s\n", ServerTime(ev->time)); X} X Xstatic void VerbVisibility(ev) XXVisibilityEvent *ev; X{ X (void) printf("window = 0x%x%s", ev->window, sep); X (void) printf("state = %s\n", VisibilityState(ev->state)); X} X X/******************************************************************************/ X/************ Return the string representation for type of an event ***********/ X/******************************************************************************/ X Xchar *GetEventType(ev) XXEvent *ev; X{ X switch (ev->type) X { X case KeyPress: X return ("KeyPress"); X case KeyRelease: X return ("KeyRelease"); X case ButtonPress: X return ("ButtonPress"); X case ButtonRelease: X return ("ButtonRelease"); X case MotionNotify: X return ("MotionNotify"); X case EnterNotify: X return ("EnterNotify"); X case LeaveNotify: X return ("LeaveNotify"); X case FocusIn: X return ("FocusIn"); X case FocusOut: X return ("FocusOut"); X case KeymapNotify: X return ("KeymapNotify"); X case Expose: X return ("Expose"); X case GraphicsExpose: X return ("GraphicsExpose"); X case NoExpose: X return ("NoExpose"); X case VisibilityNotify: X return ("VisibilityNotify"); X case CreateNotify: X return ("CreateNotify"); X case DestroyNotify: X return ("DestroyNotify"); X case UnmapNotify: X return ("UnmapNotify"); X case MapNotify: X return ("MapNotify"); X case MapRequest: X return ("MapRequest"); X case ReparentNotify: X return ("ReparentNotify"); X case ConfigureNotify: X return ("ConfigureNotify"); X case ConfigureRequest: X return ("ConfigureRequest"); X case GravityNotify: X return ("GravityNotify"); X case ResizeRequest: X return ("ResizeRequest"); X case CirculateNotify: X return ("CirculateNotify"); X case CirculateRequest: X return ("CirculateRequest"); X case PropertyNotify: X return ("PropertyNotify"); X case SelectionClear: X return ("SelectionClear"); X case SelectionRequest: X return ("SelectionRequest"); X case SelectionNotify: X return ("SelectionNotify"); X case ColormapNotify: X return ("ColormapNotify"); X case ClientMessage: X return ("ClientMessage"); X case MappingNotify: X return ("MappingNotify"); X } X return (NULL); /* this makes lint happy */ X} X X/******************************************************************************/ X/**************** Print the values of all fields for any event ****************/ X/******************************************************************************/ X Xvoid ShowEvent(ev) XXAnyEvent *ev; X{ X /* determine which field separator to use */ X if (use_separate_lines) X sep = "\n"; X else X sep = " "; X X (void) printf("type = %s%s", GetEventType((XEvent *) ev), sep); X (void) printf("serial = %d%s", ev->serial, sep); X (void) printf("send_event = %s%s", TorF(ev->send_event), sep); X (void) printf("display = 0x%x%s", ev->display, sep); X X switch (ev->type) X { X case MotionNotify: X VerbMotion((XMotionEvent *) ev); X break; X X case ButtonPress: X case ButtonRelease: X VerbButton((XButtonEvent *) ev); X break; X X case ColormapNotify: X VerbColormap((XColormapEvent *) ev); X break; X X case EnterNotify: X case LeaveNotify: X VerbCrossing((XCrossingEvent *) ev); X break; X X case Expose: X VerbExpose((XExposeEvent *) ev); X break; X X case GraphicsExpose: X VerbGraphicsExpose((XGraphicsExposeEvent *) ev); X break; X X case NoExpose: X VerbNoExpose((XNoExposeEvent *) ev); X break; X X case FocusIn: X case FocusOut: X VerbFocus((XFocusChangeEvent *) ev); X break; X X case KeymapNotify: X VerbKeymap((XKeymapEvent *) ev); X break; X X case KeyPress: X case KeyRelease: X VerbKey((XKeyEvent *) ev); X break; X X case PropertyNotify: X VerbProperty((XPropertyEvent *) ev); X break; X X case ResizeRequest: X VerbResizeRequest((XResizeRequestEvent *) ev); X break; X X case CirculateNotify: X VerbCirculate((XCirculateEvent *) ev); X break; X X case ConfigureNotify: X VerbConfigure((XConfigureEvent *) ev); X break; X X case CreateNotify: X VerbCreateWindow((XCreateWindowEvent *) ev); X break; X X case DestroyNotify: X VerbDestroyWindow((XDestroyWindowEvent *) ev); X break; X X case GravityNotify: X VerbGravity((XGravityEvent *) ev); X break; X X case MapNotify: X VerbMap((XMapEvent *) ev); X break; X X case ReparentNotify: X VerbReparent((XReparentEvent *) ev); X break; X X case UnmapNotify: X VerbUnmap((XUnmapEvent *) ev); X break; X X case CirculateRequest: X VerbCirculateRequest((XCirculateRequestEvent *) ev); X break; X X case ConfigureRequest: X VerbConfigureRequest((XConfigureRequestEvent *) ev); X break; X X case MapRequest: X VerbMapRequest((XMapRequestEvent *) ev); X break; X X case ClientMessage: X VerbClient((XClientMessageEvent *) ev); X break; X X case MappingNotify: X VerbMapping((XMappingEvent *) ev); X break; X X case SelectionClear: X VerbSelectionClear((XSelectionClearEvent *) ev); X break; X X case SelectionNotify: X VerbSelection((XSelectionEvent *) ev); X break; X X case SelectionRequest: X VerbSelectionRequest((XSelectionRequestEvent *) ev); X break; X X case VisibilityNotify: X VerbVisibility((XVisibilityEvent *) ev); X break; X X } X} END_OF_FILE if test 23550 -ne `wc -c <'common/showEvent.c'`; then echo shar: \"'common/showEvent.c'\" unpacked with wrong size! fi # end of 'common/showEvent.c' fi if test -f 'gencmap/Imakefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gencmap/Imakefile'\" else echo shar: Extracting \"'gencmap/Imakefile'\" \(394 characters\) sed "s/^X//" >'gencmap/Imakefile' <<'END_OF_FILE' X INCLUDES = -I../headers X COMMONLIB = ../common/libcommon.a X DEPLIBS = $(COMMONLIB) $(DEPXLIB) X SYS_LIBRARIES = -lm X X#ifdef UltrixArchitecture XLOCAL_LIBRARIES = $(DEPLIBS) X#else XLOCAL_LIBRARIES = $(COMMONLIB) $(XLIB) X#endif X XSRCS = \ X gencmap.c X XOBJS = \ X gencmap.o X XComplexProgramTarget(gencmap) X Xsaber_src: X #cd ../common X #make saber X #cd ../gencmap X #make saber_gencmap X END_OF_FILE if test 394 -ne `wc -c <'gencmap/Imakefile'`; then echo shar: \"'gencmap/Imakefile'\" unpacked with wrong size! fi # end of 'gencmap/Imakefile' fi if test -f 'gencmap/gencmap.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gencmap/gencmap.c'\" else echo shar: Extracting \"'gencmap/gencmap.c'\" \(3267 characters\) sed "s/^X//" >'gencmap/gencmap.c' <<'END_OF_FILE' X/* X * Copyright (c) Ken W. Marks 1989, 1990. X */ X X#include <stdio.h> X#include <ctype.h> X#include <math.h> X#include <values.h> X#include <X11/Intrinsic.h> X#include <Colormap.h> X X#ifndef M_PI X#define M_PI 3.14159265358979323846 X#endif X Xchar *map_dir = "."; X X Xvoid SineFunc(n, red, green, blue, closure) Xint n; Xunsigned char *red; Xunsigned char *green; Xunsigned char *blue; Xcaddr_t closure; X{ X double radians; X int reps = (int) closure; X X radians = (double) (n - NUM_RESERVED) / (double) (NUM_COLORS - X NUM_RESERVED) * 2.0 * M_PI * (double) reps; X X *red = (unsigned char) (fabs(sin(radians)) * X (double) MAX_INTENSITY); X X *green = (unsigned char) (fabs(sin(radians + 2.0 / 3.0 * M_PI)) * X (double) MAX_INTENSITY); X X *blue = (unsigned char) (fabs(sin(radians + 4.0 / 3.0 * M_PI)) * X (double) MAX_INTENSITY); X} X X Xvoid ZebraFunc(n, red, green, blue) Xint n; Xunsigned char *red; Xunsigned char *green; Xunsigned char *blue; X{ X double radians; X double hue, sat, bright; X double r, g, b; X X radians = (double) (n - NUM_RESERVED) / (double) (NUM_COLORS - X NUM_RESERVED) * 2.0 * M_PI; X X *red = (unsigned char) (fabs(sin(radians)) * X (double) MAX_INTENSITY); X X *green = (unsigned char) (fabs(sin(radians + 2.0 / 3.0 * M_PI)) * X (double) MAX_INTENSITY); X X *blue = (unsigned char) (fabs(sin(radians + 4.0 / 3.0 * M_PI)) * X (double) MAX_INTENSITY); X X RGB2HSB((double) *red / 255.0, (double) *green / 255.0, X (double) *blue / 255.0, &hue, &sat, &bright); X X switch (n % 4) X { X case 0: X bright *= 0.70; X break; X X case 1: X bright *= 0.90; X break; X X case 2: X bright *= 0.80; X break; X X case 3: X bright *= 1.00; X break; X } X X X HSB2RGB(hue, sat, bright, &r, &g, &b); X X *red = (unsigned char) (r * 255.0); X *green = (unsigned char) (g * 255.0); X *blue = (unsigned char) (b * 255.0); X} X X Xusage(cmd) Xchar *cmd; X{ X (void) fprintf(stderr, "usage: %s [ -ghorstz ] filename\n", cmd); X exit(1); X} X X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X char *cmd = argv[0]; X char *value; X int reps; X extern char *getenv(); X X if (argc != 3) X usage(cmd); X X if (value = getenv("MAPDIR")) X map_dir = value; X X if (strncmp(argv[1], "-g", 2) == 0) X { X /* Store gray-scale colormap */ X reps = (int) (isdigit(argv[1][2]) ? argv[1][2] - '0' : 1); X StoreGray(reps); X } X else if (strncmp(argv[1], "-h", 2) == 0) X { X /* Store Hue-Saturation-Brightness colormap */ X reps = (int) (isdigit(argv[1][2]) ? argv[1][2] - '0' : 1); X StoreHSB(reps); X } X else if (strncmp(argv[1], "-o", 2) == 0) X { X /* Store 8 color (octo) colormap */ X StoreOctoColor(); X } X else if (strncmp(argv[1], "-r", 2) == 0) X { X /* Store random colormap */ X StoreRandom(); X } X else if (strncmp(argv[1], "-s", 2) == 0) X { X /* Store sine colormap */ X reps = (int) (isdigit(argv[1][2]) ? argv[1][2] - '0' : 1); X StoreColors(SineFunc, (caddr_t) reps); X } X else if (strncmp(argv[1], "-t", 2) == 0) X { X /* Store 3 color (RGB) colormap */ X StoreTriColor(); X } X else if (strncmp(argv[1], "-z", 2) == 0) X { X /* Store funky zebra colormap */ X StoreColors(ZebraFunc, (caddr_t) NULL); X } X else X usage(cmd); X X (void) WriteColors(".", argv[2]); X exit(0); X} END_OF_FILE if test 3267 -ne `wc -c <'gencmap/gencmap.c'`; then echo shar: \"'gencmap/gencmap.c'\" unpacked with wrong size! fi # end of 'gencmap/gencmap.c' fi if test -f 'widgets/List.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'widgets/List.c'\" else echo shar: Extracting \"'widgets/List.c'\" \(23630 characters\) sed "s/^X//" >'widgets/List.c' <<'END_OF_FILE' X/* X * Copyright (c) Ken W. Marks 1989, 1990. X */ X X#include <stdio.h> X#include <X11/IntrinsicP.h> X#include <X11/StringDefs.h> X#include <Chaos.h> X#include <LocalDefs.h> X#include <ListP.h> X#include <Colormap.h> X#include <DlgShell.h> X X#define IN_UP_ARROW(w, x, y) (((x) >= (w)->list.item_width && \ X (x) < (w)->core.width && \ X (y) >= 0 && \ X (y) < (w)->list.char_height) ? True : False) X X#define IN_DOWN_ARROW(w, x, y) (((x) >= (w)->list.item_width && \ X (x) < (w)->core.width && \ X (y) > (w)->core.height - (w)->list.char_height \ X && (y) < (w)->core.height) ? True : False) X X#define IN_SCROLLBAR(w, x, y) (((x) >= (w)->list.item_width && \ X (x) < (w)->core.width && \ X (y) >= (w)->list.char_height && \ X (y) <= (w)->core.height - \ X (w)->list.char_height) ? True : False) X X#define GET_ITEM(w, x, y) (((x) >= (w)->list.item_width || \ X (x) < 0 || \ X (y) < 0 || \ X (y) >= (w)->core.height) ? NO_ITEM : \ X (y) / (w)->list.item_height + \ X (w)->list.first_visible_item) X X#define NEAREST_ITEM(w, y) (((y) - (w)->list.char_height) * \ X (w)->list.num_stops / (w)->list.bar_height) X X#define ITEM_POS(w, item) ((short) (item * (w)->list.bar_height / \ X (w)->list.num_stops + 3 * \ X (w)->list.char_height / 2)) X X#define BEFORE_VIEW(w, item) ((item < (w)->list.first_visible_item) ? \ X True : False) X X#define AFTER_VIEW(w, item) ((item >= (w)->list.first_visible_item + \ X (w)->list.num_visible) ? True : False) X X/* internal padding for items in list buttons */ X#define VERTICAL_PAD 2 X#define HORIZONTAL_PAD 2 X X/* default number of items visible */ X#define DEFAULT_VISIBLE 5 X X#define UP_ARROW_STRING "\016\017" X#define DOWN_ARROW_STRING "\020\021" X#define SLOT_STRING "\022\023" X#define KNOB_STRING "\024\025" X X#define ARROW '\037' X#define BLANK '\036' X Xstatic void ListInitialize(); Xstatic void ListRealize(); Xstatic void ListRedisplay(); Xstatic void ListDestroy(); Xstatic void ListDrawItem(); Xstatic void ListDrawItems(); Xstatic void ListDrawBar(); Xstatic void ListDrawAll(); Xstatic void ListMoveKnob(); Xstatic void ListUnselectIfUnseen(); Xstatic void ListScrollBackward(); Xstatic void ListScrollForward(); Xstatic void ListNotify(); Xstatic void ListMark(); Xstatic void ListGoto(); Xstatic void ListFocusIn(); Xstatic void ListFocusOut(); Xstatic void ListBtnUp(); Xstatic void ListMotion(); X X#define offset(field) XtOffset(ListWidget, list.field) X#define goffset(field) XtOffset(Widget,core.field) X Xstatic XtResource list_resources[] = { X {XtNlistDefault, XtCDefault, XtRInt, sizeof(int), X offset(selected_item), XtRImmediate, (caddr_t) 0}, X {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), X offset(foreground), XtRString, "Black"}, X {XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel), X goffset(background_pixel), XtRString, "White"}, X {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *), X offset(font), XtRString, "chaos-bold"}, X {XtNlistItems, XtCList, XtRPointer, sizeof(char **), X offset(list_items), XtRString, NULL}, X {XtNhorizPad, XtCMargin, XtRDimension, sizeof(Dimension), X offset(h_pad), XtRImmediate, (caddr_t) HORIZONTAL_PAD}, X {XtNvertPad, XtCMargin, XtRDimension, sizeof(Dimension), X offset(v_pad), XtRImmediate, (caddr_t) VERTICAL_PAD}, X {XtNcallback, XtCCallback, XtRCallback, sizeof(caddr_t), X offset(callbacks), XtRCallback, (caddr_t) NULL}, X {XtNdialogbox, XtCWidget, XtRWidget, sizeof(Widget), X offset(dialogbox), XtRWidget, (caddr_t) NULL}, X {XtNnumberVisible, XtCDefault, XtRInt, sizeof(int), X offset(num_visible), XtRImmediate, (caddr_t) DEFAULT_VISIBLE}, X {XtNcharsWide, XtCDefault, XtRInt, sizeof(int), X offset(chars_wide), XtRImmediate, (caddr_t) 0}, X}; X Xstatic XtActionsRec list_actions[] = X{ X {"notify", ListNotify}, X {"mark", ListMark}, X {"goto", ListGoto}, X {"focus_in", ListFocusIn}, X {"focus_out", ListFocusOut}, X {"release", ListBtnUp}, X {"move", ListMotion}, X}; X Xstatic char list_translations[] = X"<BtnDown>: mark(BUTTON) notify(BUTTON)\n\ X <BtnUp>: release()\n\ X <Motion>: move()\n\ X <Key>Return: notify(KEY)\n\ X <Key>Up: mark(PREV)\n\ X <Key>Down: mark(NEXT)\n\ X Shift<Key>Tab: goto(PREV)\n\ X <Key>Tab: goto(NEXT)\n\ X <FocusIn>: focus_in()\n\ X <FocusOut>: focus_out()\n\ X"; X X#define superclass (&simpleClassRec) X XListClassRec listClassRec = { X { X /* core fields */ X /* superclass */ (WidgetClass) superclass, X /* class_name */ "List", X /* widget_size */ sizeof(ListRec), X /* class_initialize */ NULL, X /* class_part_initialize */ NULL, X /* class_inited */ FALSE, X /* initialize */ ListInitialize, X /* initialize_hook */ NULL, X /* realize */ ListRealize, X /* actions */ list_actions, X /* num_actions */ XtNumber(list_actions), X /* resources */ list_resources, X /* resource_count */ XtNumber(list_resources), X /* xrm_class */ NULLQUARK, X /* compress_motion */ TRUE, X /* compress_exposure */ TRUE, X /* compress_enterleave */ TRUE, X /* visible_interest */ FALSE, X /* destroy */ ListDestroy, X /* resize */ NULL, X /* expose */ ListRedisplay, X /* set_values */ NULL, X /* set_values_hook */ NULL, X /* set_values_almost */ XtInheritSetValuesAlmost, X /* get_values_hook */ NULL, X /* accept_focus */ NULL, X /* version */ XtVersion, X /* callback_private */ NULL, X /* tm_table */ list_translations, X /* query_geometry */ NULL, X /* display_accelerator */ XtInheritDisplayAccelerator, X /* extension */ NULL X }, X { X /* Simple class fields initialization */ X /* change_sensitive */ XtInheritChangeSensitive X } X}; X X XWidgetClass listWidgetClass = (WidgetClass) & listClassRec; X X X/************************************************************/ X/******************** Private Procedures ********************/ X/************************************************************/ X X Xstatic void ListCopyItems(w) XListWidget w; X{ X int ii; X char *label; X X if (w->list.list_items == NULL) X { X w->list.list_items = (ListItem *) malloc(sizeof(ListItem)); X w->list.list_items[0].label = NULL; X w->list.num_items = 0; X return; X } X X /* SUPPRESS 530 */ X for (ii = 0; w->list.list_items[ii].label != NULL; ++ii); X X w->list.num_items = ii; X X /* Allocate a private copy of the list structure so that it doesn't change X * from under us. */ X X w->list.list_items = (ListItem *) COPY(w->list.list_items, (ii + 1) * X sizeof(ListItem)); X X /* And don't forget to make private copies of all the labels in the X * structures (with space for 1 special leading char). */ X X while (--ii >= 0) X { X label = w->list.list_items[ii].label; X w->list.list_items[ii].label = malloc((unsigned) (strlen(label) + 2)); X w->list.list_items[ii].label[0] = BLANK; X (void) strcpy(&(w->list.list_items[ii].label[1]), label); X } X} X X Xstatic void ListFreeItems(w) XListWidget w; X{ X ListItem *ptr = w->list.list_items; X X while (ptr->label != NULL) X { X free(ptr->label); X ++ptr; X } X free((char *) w->list.list_items); X} X X Xstatic void ListGetGC(w) XListWidget w; X{ X XGCValues values; X X values.foreground = w->list.foreground; X values.background = w->core.background_pixel; X values.font = w->list.font->fid; X X w->list.normal_gc = XtGetGC((Widget) w, (unsigned) GCForeground | X GCBackground | GCFont, &values); X X values.foreground = w->core.background_pixel; X values.background = w->list.foreground; X X w->list.reverse_gc = XtGetGC((Widget) w, (unsigned) GCForeground | X GCBackground | GCFont, &values); X} X X Xstatic void ListSetSize(w) XListWidget w; X{ X XtWidgetGeometry my_request; X XFontStruct *fs = w->list.font; X ListItem *item; X Cardinal height = fs->max_bounds.ascent + fs->max_bounds.descent; X Cardinal width = fs->max_bounds.width; X Cardinal label_width; X char *label; X int ii; X X item = w->list.list_items; X for (ii = 0; ii < w->list.num_items; ++ii) X { X label = item->label; X label_width = STRLEN(label); X if (label == NULL) X break; X w->list.chars_wide = MAX(w->list.chars_wide, label_width); X ++item; X } X X w->list.item_width = w->list.chars_wide * width + 2 * w->list.h_pad; X w->list.baseline = fs->max_bounds.ascent; X w->list.baseline_to_center = height / 2 - w->list.baseline; X w->list.char_width = width; X w->list.char_height = height; X w->list.item_height = height + 2 * w->list.v_pad; X X my_request.request_mode = CWWidth | CWHeight | CWBorderWidth; X my_request.width = w->list.item_width + 2 * width; X my_request.height = w->list.item_height * w->list.num_visible; X my_request.border_width = 1; X X XtMakeGeometryRequest((Widget) w, &my_request, NULL); X X w->list.bar_min_y = height + fs->max_bounds.ascent; X w->list.bar_max_y = w->core.height - (height + fs->max_bounds.descent); X} X X X/*ARGSUSED*/ Xstatic void ListInitialize(request, new) XWidget request; /* unused */ XWidget new; X{ X ListWidget w = (ListWidget) new; X X if (w->list.dialogbox == NULL) X { X eprintf("XtNdialogbox not set\n"); X abort(); X } X X if (w->list.num_visible < DEFAULT_VISIBLE) X { X eprintf("XtNnumberVisible must be at least %d\n", DEFAULT_VISIBLE); X abort(); X } X ListGetGC(w); X ListCopyItems(w); X ListSetSize(w); X X w->list.active_item = NO_ITEM; X w->list.first_visible_item = 0; X w->list.num_stops = w->list.num_items - w->list.num_visible + 1; X if (w->list.num_stops < 1) X w->list.num_stops = 1; X w->list.bar_height = w->core.height - 2 * w->list.char_height; X w->list.bar_offset = w->list.char_height + w->list.baseline + X w->list.baseline_to_center; X w->list.knob_y = w->list.bar_min_y; X w->list.scrolling = False; X} X X Xstatic void ListRealize(widget, valueMask, attrs) XWidget widget; XXtValueMask *valueMask; XXSetWindowAttributes *attrs; X{ X ListWidget w = (ListWidget) widget; X Display *dpy = XtDisplay(w); X Window window; X Position y; X X XtCreateWindow(widget, InputOutput, (Visual *) CopyFromParent, X *valueMask, attrs); X X window = XtWindow(w); X X w->list.pixmap = XCreatePixmap(dpy, window, w->list.char_width * 2, X w->core.height, w->core.depth); X X if (!w->list.pixmap) X { X eprintf("Insufficient space for pixmap\n"); X abort(); X } X X y = w->list.baseline; X XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, y, X UP_ARROW_STRING, 2); X X for (y = w->list.char_height + w->list.baseline; X y < w->core.height - w->list.char_height + w->list.baseline; X y += w->list.char_height) X XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, y, X SLOT_STRING, 2); X X y = w->core.height - w->list.char_height + w->list.baseline; X XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, y, X DOWN_ARROW_STRING, 2); X X XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, w->list.knob_y, X KNOB_STRING, 2); X} X X X/*ARGSUSED*/ Xstatic void ListRedisplay(widget, event, region) XWidget widget; XXEvent *event; /* unused */ XRegion region; /* unused */ X{ X if (XtIsRealized(widget) == False) X return; X X ListDrawAll(widget); X} X X Xstatic void ListDestroy(widget) XWidget widget; X{ X ListWidget w = (ListWidget) widget; X X XtReleaseGC(widget, w->list.normal_gc); X XtReleaseGC(widget, w->list.reverse_gc); X} X X Xstatic void ListDrawItem(widget, item) XWidget widget; Xint item; X{ X ListWidget w = (ListWidget) widget; X Display *dpy = XtDisplay(w); X Window window = XtWindow(w); X int absolute_item; X char *label; X Position x, y; X int label_len; X GC fill_gc; X GC draw_gc; X X if (item <= NO_ITEM || item > w->list.num_visible) X return; X X absolute_item = item + w->list.first_visible_item; X X if (absolute_item >= w->list.num_items) X label = NULL; X else X { X label = w->list.list_items[absolute_item].label; X X if (absolute_item == w->list.active_item) X label[0] = ARROW; X else X label[0] = BLANK; X } X X x = (Position) w->list.h_pad; X y = (Position) w->list.item_height * item + w->list.v_pad + X w->list.baseline; X X if (XtIsRealized(widget)) X { X X if (absolute_item == w->list.selected_item) X { X fill_gc = w->list.normal_gc; X draw_gc = w->list.reverse_gc; X } X else X { X fill_gc = w->list.reverse_gc; X draw_gc = w->list.normal_gc; X } X X label_len = STRLEN(label); X X if (label_len != 0) X XDrawImageString(dpy, window, draw_gc, x, y, label, label_len); X X XFillRectangle(dpy, window, fill_gc, x + label_len * X w->list.char_width, y - w->list.baseline, (w->list.chars_wide - X label_len) * w->list.char_width, w->list.char_height); X } X} X X Xstatic void ListDrawItems(widget) XWidget widget; X{ X ListWidget w = (ListWidget) widget; X int ii; X X for (ii = 0; ii < w->list.num_visible; ++ii) X ListDrawItem(widget, ii); X} X X Xstatic void ListDrawBar(widget) XWidget widget; X{ X ListWidget w = (ListWidget) widget; X Display *dpy = XtDisplay(w); X Window window = XtWindow(w); X X if (XtIsRealized(widget)) X XCopyArea(dpy, w->list.pixmap, window, w->list.normal_gc, X 0, 0, w->list.char_width * 2, w->core.height, w->list.item_width, 0); X} X X Xstatic void ListDrawAll(widget) XWidget widget; X{ X ListDrawItems(widget); X ListDrawBar(widget); X} X X Xstatic void ListMoveKnob(widget, y) XWidget widget; XPosition y; X{ X ListWidget w = (ListWidget) widget; X Display *dpy = XtDisplay(w); X X y -= w->list.baseline_to_center; X X if (y < w->list.bar_min_y) X y = w->list.bar_min_y; X else if (y > w->list.bar_max_y) X y = w->list.bar_max_y; X X if (y == w->list.knob_y) X return; X X /* Erase the old knob */ X XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, w->list.knob_y, X SLOT_STRING, 2); X X w->list.knob_y = y; X X /* Draw new knob */ X XDrawImageString(dpy, w->list.pixmap, w->list.normal_gc, 0, w->list.knob_y, X KNOB_STRING, 2); X X ListDrawBar(widget); X} X X Xstatic void ListUnselectIfUnseen(widget) XWidget widget; X{ X ListWidget w = (ListWidget) widget; X X if (BEFORE_VIEW(w, w->list.selected_item) || X AFTER_VIEW(w, w->list.selected_item)) X w->list.selected_item = NO_ITEM; X} X X Xstatic void ListScrollBackward(widget) XWidget widget; X{ X ListWidget w = (ListWidget) widget; X X if (w->list.first_visible_item == 0) X return; X X --w->list.first_visible_item; X X if (AFTER_VIEW(w, w->list.active_item)) X --w->list.active_item; X X /* If the selected item becomes unseen, unselect it */ X ListUnselectIfUnseen(widget); X ListDrawItems(widget); X ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item)); X} X X Xstatic void ListScrollForward(widget) XWidget widget; X{ X ListWidget w = (ListWidget) widget; X X if (w->list.first_visible_item >= w->list.num_stops - 1) X return; X X ++w->list.first_visible_item; X X if (BEFORE_VIEW(w, w->list.active_item)) X ++w->list.active_item; X X /* If the selected item becomes unseen, unselect it */ X ListUnselectIfUnseen(widget); X ListDrawItems(widget); X ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item)); X} X X Xstatic void ListScrollTo(widget, y) XWidget widget; Xint y; X{ X ListWidget w = (ListWidget) widget; X int item; X X ListMoveKnob(widget, y); X X item = NEAREST_ITEM(w, y); X if (item == w->list.first_visible_item) X return; X X w->list.first_visible_item = item; X X if (BEFORE_VIEW(w, w->list.active_item) || X AFTER_VIEW(w, w->list.active_item)) X w->list.active_item = w->list.first_visible_item; X X /* If the selected item becomes unseen, unselect it */ X ListUnselectIfUnseen(widget); X ListDrawItems(widget); X} X X Xstatic void ListStartScroll(widget, y) XWidget widget; Xint y; X{ X ListWidget w = (ListWidget) widget; X X w->list.scrolling = True; X X ListScrollTo(widget, y); X} X X X/***********************************************************/ X/******************** Action Procedures ********************/ X/***********************************************************/ X X X/*ARGSUSED*/ Xstatic void ListFocusIn(widget, event, params, num_params) XWidget widget; XXEvent *event; XString *params; XCardinal *num_params; /* unused */ X{ X ListWidget w = (ListWidget) widget; X XFocusInEvent *ev = (XFocusInEvent *) & event->xfocus; X X if (ev->mode != NotifyGrab) X return; X X if (w->list.active_item == NO_ITEM) X w->list.active_item = w->list.first_visible_item; X X ListDrawAll(widget); X} X X X/*ARGSUSED*/ Xstatic void ListFocusOut(widget, event, params, num_params) XWidget widget; XXEvent *event; XString *params; XCardinal *num_params; /* unused */ X{ X ListWidget w = (ListWidget) widget; X int last_active_item = w->list.active_item; X XFocusOutEvent *ev = (XFocusOutEvent *) & event->xfocus; X X if (ev->mode != NotifyUngrab) X return; X X if (w->list.active_item != NO_ITEM) X { X w->list.active_item = NO_ITEM; X ListDrawItem(widget, last_active_item - w->list.first_visible_item); X } X} X X X/*ARGSUSED*/ Xstatic void ListNotify(widget, event, params, num_params) XWidget widget; XXEvent *event; XString *params; XCardinal *num_params; /* unused */ X{ X ListWidget w = (ListWidget) widget; X XButtonEvent *ev = (XButtonEvent *) & event->xbutton; X int item; X int last_selected_item; X X if (params[0][0] == 'B') X item = GET_ITEM(w, ev->x, ev->y); X else X item = w->list.active_item; X X if (item == NO_ITEM) X return; X X last_selected_item = w->list.selected_item; X w->list.selected_item = item; X X ListDrawItem(widget, last_selected_item - w->list.first_visible_item); X X ListDrawItem(widget, item - w->list.first_visible_item); X X XtCallCallbacks(widget, XtNcallback, (XtPointer) item); X} X X X/*ARGSUSED*/ Xstatic void ListMark(widget, event, params, num_params) XWidget widget; XXEvent *event; XString *params; /* unused */ XCardinal *num_params; /* unused */ X{ X ListWidget w = (ListWidget) widget; X XButtonEvent *ev = (XButtonEvent *) & event->xbutton; X int item; X int last_item = w->list.active_item; X X switch (params[0][0]) X { X case 'B': X item = GET_ITEM(w, ev->x, ev->y); X if (item != NO_ITEM) X { X DialogSetNewFocus(w->list.dialogbox, widget); X w->list.active_item = item; X break; X } X if (IN_UP_ARROW(w, ev->x, ev->y)) X { X if (w->list.active_item == NO_ITEM) X { X DialogSetNewFocus(w->list.dialogbox, widget); X w->list.active_item = w->list.first_visible_item - 1; X } X ListScrollBackward(widget); X } X else if (IN_DOWN_ARROW(w, ev->x, ev->y)) X { X if (w->list.active_item == NO_ITEM) X { X DialogSetNewFocus(w->list.dialogbox, widget); X w->list.active_item = w->list.first_visible_item; X } X ListScrollForward(widget); X } X else if (IN_SCROLLBAR(w, ev->x, ev->y)) X { X if (w->list.active_item == NO_ITEM) X { X DialogSetNewFocus(w->list.dialogbox, widget); X w->list.active_item = w->list.first_visible_item; X } X ListStartScroll(widget, ev->y); X } X break; X X case 'P': X item = w->list.active_item - 1; X if (item < 0) X item = 0; X w->list.active_item = item; X if (BEFORE_VIEW(w, item)) X { X ListScrollBackward(widget); X return; X } X break; X X case 'N': X item = w->list.active_item + 1; X if (item >= w->list.num_items) X item = w->list.num_items - 1; X w->list.active_item = item; X if (AFTER_VIEW(w, item)) X { X ListScrollForward(widget); X return; X } X break; X } X X ListDrawItem(widget, last_item - w->list.first_visible_item); X ListDrawItem(widget, item - w->list.first_visible_item); X} X X X/*ARGSUSED*/ Xstatic void ListGoto(widget, event, params, num_params) XWidget widget; XXEvent *event; /* unused */ XString *params; /* unused */ XCardinal *num_params; /* unused */ X{ X ListWidget w = (ListWidget) widget; X int item = w->list.active_item - w->list.first_visible_item; X X w->list.active_item = NO_ITEM; X ListDrawItem(widget, item); X X switch (params[0][0]) X { X case 'P': X DialogSetPrevFocus(w->list.dialogbox); X break; X X case 'N': X DialogSetNextFocus(w->list.dialogbox); X break; X } X} X X X/*ARGSUSED*/ Xstatic void ListBtnUp(widget, event, params, num_params) XWidget widget; XXEvent *event; XString *params; /* unused */ XCardinal *num_params; /* unused */ X{ X ListWidget w = (ListWidget) widget; X XButtonEvent *ev = (XButtonEvent *) & event->xbutton; X X if (w->list.scrolling == False) X return; X X w->list.scrolling = False; X X if (ev->x <= w->list.item_width || ev->x >= w->core.width || X ev->y < w->list.char_height || X ev->y >= w->core.height - w->list.char_height) X return; X X ListScrollTo(widget, ev->y); X} X X X/*ARGSUSED*/ Xstatic void ListMotion(widget, event, params, num_params) XWidget widget; XXEvent *event; XString *params; /* unused */ XCardinal *num_params; /* unused */ X{ X ListWidget w = (ListWidget) widget; X XMotionEvent *ev = (XMotionEvent *) & event->xmotion; X X if (w->list.scrolling == False) X return; X X if (ev->x <= w->list.item_width || ev->x >= w->core.width || X ev->y < w->list.char_height || X ev->y >= w->core.height - w->list.char_height) X return; X X ListScrollTo(widget, ev->y); X} X X X/***********************************************************/ X/******************** Public Procedures ********************/ X/***********************************************************/ X X XBoolean ListChangeLabel(widget, item, label) XWidget widget; XCardinal item; XString label; X{ X ListWidget w = (ListWidget) widget; X ListItem *list_item; X X if (item >= w->list.num_items || label == NULL) X return (False); X X list_item = &(w->list.list_items[item]); X if (strcmp(&(list_item->label[1]), label) == SAME) X return (True); X free(list_item->label); X list_item->label = malloc((unsigned) (strlen(label) + 2)); X (void) strcpy(&(list_item->label[1]), label); X X ListDrawItem(widget, (int) (item - w->list.first_visible_item)); X return (True); X} X X XBoolean ListChangeSelected(widget, item) XWidget widget; Xint item; X{ X ListWidget w = (ListWidget) widget; X int last_item = w->list.selected_item; X X if (item >= (int) w->list.num_items) X return (False); X X if (item == last_item) X return (True); X X w->list.selected_item = item; X X if (item == NO_ITEM) X { X /* Scroll viewport to start */ X w->list.first_visible_item = 0; X ListMoveKnob(widget, 0); X ListDrawAll(widget); X return (True); X } X X if (BEFORE_VIEW(w, item)) X { X /* Scroll viewport down so item is just visible */ X w->list.first_visible_item = item; X ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item)); X ListDrawAll(widget); X } X else if (AFTER_VIEW(w, item)) X { X /* Scroll viewport up so item is just visible */ X w->list.first_visible_item = item - w->list.num_visible + 1; X ListMoveKnob(widget, ITEM_POS(w, w->list.first_visible_item)); X ListDrawAll(widget); X } X else X { X /* Item was previously visible - just change selection */ X ListDrawItem(widget, last_item - w->list.first_visible_item); X ListDrawItem(widget, (int) (item - w->list.first_visible_item)); X } X X return (True); X} X X XBoolean ListChangeItems(widget, new_items) XWidget widget; XListItem *new_items; X{ X ListWidget w = (ListWidget) widget; X int ii = 0; X X while (w->list.list_items[ii].label != NULL && new_items[ii].label != NULL) X { X if (strcmp(&w->list.list_items[ii].label[1], new_items[ii].label) X != SAME) X break; X ++ii; X } X X /* just return if the list has not changed */ X if (w->list.list_items[ii].label == NULL && new_items[ii].label == NULL) X return (True); X X ListFreeItems(w); X X w->list.list_items = new_items; X ListCopyItems(w); X X w->list.selected_item = NO_ITEM; X w->list.first_visible_item = 0; X w->list.num_stops = w->list.num_items - w->list.num_visible + 1; X if (w->list.num_stops < 1) X w->list.num_stops = 1; X ListDrawItems(widget); X ListMoveKnob(widget, 0); X return (True); X} END_OF_FILE if test 23630 -ne `wc -c <'widgets/List.c'`; then echo shar: \"'widgets/List.c'\" unpacked with wrong size! fi # end of 'widgets/List.c' fi echo shar: End of archive 2 \(of 10\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 10 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.