lemke@uunet.UU.NET (Dave Lemke) (03/15/90)
Submitted-by: Dave Lemke <lupine!lemke@uunet.UU.NET> Posting-number: Volume 6, Issue 31 Archive-name: xclock/part01 this is yet another clock, this time using the SHAPE extension with the X logo as the face. Dave lemke@ncd.com #! /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 shell archive." # Contents: README Imakefile makefile Clock.c ClockP.h Clock.h # lclock.c transform.c transform.h lclock.man # Wrapped by lemke@hansen on Fri Mar 9 11:00:11 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(732 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' Xlclock -- Logo clock -- yet another clock demo X Xthis one requires R4 libraries and a server that supports SHAPE. X Xits been tested with uwm, twm, olwm and swm (including swm's virtual Xdesktop), and is happiest with those WM in that order: uwm & twm don't Xget in its way at all, and olwm and swm (at least the versions i have) Xdon't understand SHAPE, so things don't look right. X Xit shouldn't be too difficult to modify Clock.c to use any Xlogo as the clock face. just replace the calls to XmuDrawLogo() Xwith another drawing routine. X XBugs: XTwo of the inner sides have no border. This is due to the Xway XmuDrawLogo() calculates its polygons. X XDave Lemke ARPA: lemke@ncd.com XNetwork Computing Devices, Inc. UUCP: uunet!ncd!lemke END_OF_FILE if test 732 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'Imakefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Imakefile'\" else echo shar: Extracting \"'Imakefile'\" \(371 characters\) sed "s/^X//" >'Imakefile' <<'END_OF_FILE' X#ifdef BandAidCompiler X#include BandAidCompiler X#endif X XDEFINES = ExtensionDefines XINCLUDES = -I$(TOP) -I$(TOP)/X11 XSYS_LIBRARIES = -lm XDEPLIBS = $(DEPXTOOLLIB) $(DEPXMULIB) $(DEPEXTENSIONLIB) $(DEPXLIB) XLOCAL_LIBRARIES = $(XTOOLLIB) $(XMULIB) $(EXTENSIONLIB) $(XLIB) X XSRCS = lclock.c Clock.c transform.c XOBJS = lclock.o Clock.o transform.o X XComplexProgramTarget(lclock) END_OF_FILE if test 371 -ne `wc -c <'Imakefile'`; then echo shar: \"'Imakefile'\" unpacked with wrong size! fi # end of 'Imakefile' fi if test -f 'makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'makefile'\" else echo shar: Extracting \"'makefile'\" \(408 characters\) sed "s/^X//" >'makefile' <<'END_OF_FILE' XCFLAGS = -O XLDFLAGS = XLIBS = -lXt -lXmu -lXext -lX11 -lm X X.KEEP_STATE: X XOBJS = Clock.o lclock.o transform.o XSRCS = Clock.c lclock.c transform.c X XHEADERS = CLock.h CLockP.h transform.h X Xall: lclock X Xlclock: $(OBJS) X cc -o $@ $(OBJS) $(LDFLAGS) $(LIBS) X Xshar: X shar README Imakefile makefile Clock.c ClockP.h Clock.h \ X lclock.c transform.c transform.h lclock.man > lclock.shar X Xclean: X rm -f *.o core lclock END_OF_FILE if test 408 -ne `wc -c <'makefile'`; then echo shar: \"'makefile'\" unpacked with wrong size! fi # end of 'makefile' fi if test -f 'Clock.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Clock.c'\" else echo shar: Extracting \"'Clock.c'\" \(11473 characters\) sed "s/^X//" >'Clock.c' <<'END_OF_FILE' X/* X * Clock.c X * X * a NeWS clone clock X * X * Dave Lemke X * lemke@ncd.com X * Wed Feb 28 16:42:39 PST 1990 X * X * idea from the NeWS sunclock demo by Stuart Marks and Greg McLaughlin. X * code is whacked over 'oclock' by Keith Packard X */ X X#include <X11/Xos.h> X#include <stdio.h> X#include <X11/IntrinsicP.h> X#include <X11/StringDefs.h> X#include <X11/Xmu/Converters.h> X#include "ClockP.h" X#include <math.h> X#include <X11/extensions/shape.h> X X#define offset(field) XtOffset(ClockWidget,clock.field) X#define goffset(field) XtOffset(Widget,core.field) X Xstatic XtResource resources[] = { X {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension), X goffset(width), XtRString, "120"}, X {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension), X goffset(height), XtRString, "120"}, X {XtNminute, XtCForeground, XtRPixel, sizeof(Pixel), X offset(minute), XtRString, XtDefaultBackground}, X {XtNhour, XtCForeground, XtRPixel, sizeof(Pixel), X offset(hour), XtRString, XtDefaultBackground}, X {XtNborder, XtCForeground, XtRPixel, sizeof(Pixel), X offset(border), XtRString, XtDefaultBackground}, X {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(Boolean), X offset(reverse_video), XtRString, "FALSE"}, X {XtNbackingStore, XtCBackingStore, XtRBackingStore, sizeof(int), X offset(backing_store), XtRString, "default"}, X}; X X#undef offset X#undef goffset X Xstatic void Initialize(), Realize(), Destroy(), Resize(), Redisplay(); X X#define BORDER_WIDTH (0.1) X#define WINDOW_WIDTH (2.0 - BORDER_WIDTH*2) X#define WINDOW_HEIGHT (2.0 - BORDER_WIDTH*2) X#define MINUTE_WIDTH (BORDER_WIDTH / 2.0) X#define HOUR_WIDTH (BORDER_WIDTH / 2.0) X#define JEWEL_SIZE (BORDER_WIDTH * 0.75) X#define MINUTE_LENGTH (0.8) X#define HOUR_LENGTH (0.5) X X#define HAND_BORDER_WIDTH (0.02) X X#define LOGO_BORDER_WIDTH (w->core.width/20) X#define LOGO_BORDER_HEIGHT (w->core.height/20) X#define LOGO_WINDOW_WIDTH (w->core.width - LOGO_BORDER_WIDTH*2) X#define LOGO_WINDOW_HEIGHT (w->core.height - LOGO_BORDER_HEIGHT*2) X X#define HOUR_HAND 1 X#define MINUTE_HAND 2 X X Xstatic void ClassInitialize(); X XClockClassRec clockClassRec = { X { /* core fields */ X /* superclass */ &widgetClassRec, X /* class_name */ "LogoClock", X /* size */ sizeof(ClockRec), X /* class_initialize */ ClassInitialize, X /* class_part_initialize */ NULL, X /* class_inited */ FALSE, X /* initialize */ Initialize, X /* initialize_hook */ NULL, X /* realize */ Realize, X /* actions */ NULL, X /* num_actions */ 0, X /* resources */ resources, X /* num_resources */ XtNumber(resources), X /* xrm_class */ NULL, X /* compress_motion */ TRUE, X /* compress_exposure */ TRUE, X /* compress_enterleave */ TRUE, X /* visible_interest */ FALSE, X /* destroy */ Destroy, X /* resize */ Resize, X /* expose */ Redisplay, X /* set_values */ NULL, X /* set_values_hook */ NULL, X /* set_values_almost */ NULL, X /* get_values_hook */ NULL, X /* accept_focus */ NULL, X /* version */ XtVersion, X /* callback_private */ NULL, X /* tm_table */ NULL, X /* query_geometry */ XtInheritQueryGeometry, X } X}; X Xstatic void XClassInitialize() X{ X XtAddConverter(XtRString, XtRBackingStore, XmuCvtStringToBackingStore, X NULL, 0); X} X XWidgetClass clockWidgetClass = (WidgetClass) & clockClassRec; X X/* ARGSUSED */ Xstatic void XInitialize(greq, gnew) X Widget greq, X gnew; X{ X ClockWidget w = (ClockWidget) gnew; X int shape_event_base, X shape_error_base; X X /* wait for Realize to add the timeout */ X w->clock.interval_id = 0; X X if (!XShapeQueryExtension(XtDisplay(w), &shape_event_base, X &shape_error_base)) { X fprintf(stderr, "sorry, lclock needs the SHAPE extension to run\n"); X } X w->clock.shape_mask = 0; X w->clock.shapeGC = 0; X w->clock.shapebackGC = 0; X w->clock.handGC = 0; X w->clock.shape_width = 0; X w->clock.shape_height = 0; X} X Xstatic void XResize(w) X ClockWidget w; X{ X int face_width, X face_height; X X if (!XtIsRealized(w)) X return; X X /* X * compute desired border size X */ X X SetTransform(&w->clock.maskt, X 0, w->core.width, X w->core.height, 0, X -1.0, 1.0, X -1.0, 1.0); X X face_width = abs(Xwidth(BORDER_WIDTH, BORDER_WIDTH, &w->clock.maskt)); X face_height = abs(Xheight(BORDER_WIDTH, BORDER_WIDTH, &w->clock.maskt)); X X /* X * shape the windows and borders X */ X X SetTransform(&w->clock.t, X face_width, w->core.width - face_width, X w->core.height - face_height, face_height, X -WINDOW_WIDTH / 2, WINDOW_WIDTH / 2, X -WINDOW_HEIGHT / 2, WINDOW_HEIGHT / 2); X X draw_clock(w); X} X X Xdraw_clock(w) X ClockWidget w; X{ X XGCValues xgcv; X Widget parent; X int x, X y; X Pixmap shape_mask; X X /* X * allocate a pixmap to draw shapes in X */ X X shape_mask = XCreatePixmap(XtDisplay(w), XtWindow(w), X w->core.width, w->core.height, 1); X if (!w->clock.shapeGC) { X w->clock.shapeGC = XCreateGC(XtDisplay(w), shape_mask, 0, &xgcv); X xgcv.foreground = 0; X w->clock.shapebackGC = XCreateGC(XtDisplay(w), shape_mask, X GCForeground, &xgcv); X } X /* erase the pixmap */ X XSetForeground(XtDisplay(w), w->clock.shapeGC, 0); X XFillRectangle(XtDisplay(w), shape_mask, w->clock.shapeGC, X 0, 0, w->core.width, w->core.height); X XSetForeground(XtDisplay(w), w->clock.shapeGC, 1); X X /* X * draw the bounding shape. Doing this first eliminates extra exposure X * events. X */ X X XmuDrawLogo(XtDisplay(w), shape_mask, w->clock.shapeGC, X w->clock.shapebackGC, X 0, 0, X w->core.width, w->core.height); X X draw_hands(w, shape_mask, True); X /* X * Find the highest enclosing widget and shape it X */ X X x = 0; X y = 0; X for (parent = (Widget) w; XtParent(parent); parent = XtParent(parent)) { X x = x + parent->core.x + parent->core.border_width; X y = y + parent->core.y + parent->core.border_width; X } X X XShapeCombineMask(XtDisplay(parent), XtWindow(parent), ShapeBounding, X x, y, shape_mask, ShapeSet); X X /* erase the pixmap */ X XSetForeground(XtDisplay(w), w->clock.shapeGC, 0); X XFillRectangle(XtDisplay(w), shape_mask, w->clock.shapeGC, X 0, 0, w->core.width, w->core.height); X XSetForeground(XtDisplay(w), w->clock.shapeGC, 1); X X /* X * draw the clip shape X */ X X XmuDrawLogo(XtDisplay(w), shape_mask, w->clock.shapeGC, X w->clock.shapebackGC, X LOGO_BORDER_WIDTH, LOGO_BORDER_HEIGHT, X LOGO_WINDOW_WIDTH, LOGO_WINDOW_HEIGHT); X X draw_hands(w, shape_mask, False); X X XShapeCombineMask(XtDisplay(w), XtWindow(w), ShapeClip, X 0, 0, shape_mask, ShapeSet); X X XFreePixmap(XtDisplay(w), shape_mask); X} X Xdraw_hands(w, mask, border) X ClockWidget w; X Pixmap mask; X Bool border; X{ X draw_hand(w, mask, MINUTE_HAND, border, w->clock.shapeGC); X draw_hand(w, mask, HOUR_HAND, border, w->clock.shapeGC); X} X Xdraw_hand(w, drawable, hand, border, gc) X ClockWidget w; X Drawable drawable; X int hand; X Bool border; X GC gc; X{ X TPoint poly[POLY_SIZE]; X double angle, X width, X length; X X switch (hand) { X case HOUR_HAND: X angle = w->clock.hour_angle; X width = HOUR_WIDTH; X length = HOUR_LENGTH; X break; X case MINUTE_HAND: X angle = w->clock.minute_angle; X width = MINUTE_WIDTH; X length = MINUTE_LENGTH; X break; X } X X if (border) X compute_hand(angle, length, width, poly); X else X compute_hand(angle, X length - 2 * HAND_BORDER_WIDTH, X width - 2 * HAND_BORDER_WIDTH, X poly); X X TFillPolygon(XtDisplay(w), drawable, gc, X &w->clock.t, poly, POLY_SIZE, X Convex, CoordModeOrigin); X} X X/* ARGSUSED */ Xstatic void XRedisplay(gw, event, region) X Widget gw; X XEvent *event; X Region region; X{ X ClockWidget w; X X w = (ClockWidget) gw; X XClearWindow(XtDisplay(w), XtWindow(w)); /* erase the old hands */ X if (!w->clock.handGC) X w->clock.handGC = XCreateGC(XtDisplay(w), XtWindow(w), 0, NULL); X paint_hands(w); X} X Xstatic void XRealize(gw, valueMask, attrs) X Widget gw; X XtValueMask *valueMask; X XSetWindowAttributes *attrs; X{ X ClockWidget w = (ClockWidget) gw; X static int new_time(); X X if (w->clock.backing_store != Always + WhenMapped + NotUseful) { X attrs->backing_store = w->clock.backing_store; X *valueMask |= CWBackingStore; X } X XtCreateWindow(gw, (unsigned) InputOutput, (Visual *) CopyFromParent, X *valueMask, attrs); X X Resize(w); X new_time((caddr_t) gw, 0); X} X Xstatic void XDestroy(gw) X Widget gw; X{ X ClockWidget w = (ClockWidget) gw; X X if (w->clock.interval_id) X XtRemoveTimeOut(w->clock.interval_id); X if (w->clock.shapeGC) X XtDestroyGC(w->clock.shapeGC); X if (w->clock.shapebackGC) X XtDestroyGC(w->clock.shapebackGC); X if (w->clock.handGC) X XtDestroyGC(w->clock.handGC); X} X X X/* X * routines to draw the hands X */ X X#define PI (3.14159265358979323846) X X/* X * converts a number from 0..1 representing a clockwise radial distance X * from the 12 oclock position to a radian measure of the counter-clockwise X * distance from the 3 oclock position X */ X Xstatic double Xclock_to_angle(clock) X double clock; X{ X if (clock >= .75) X clock -= 1.0; X return -2.0 * PI * clock + PI / 2.0; X} X X/* ARGSUSED */ Xstatic int Xnew_time(client_data, id) X caddr_t client_data; X XtIntervalId id; /* unused */ X{ X ClockWidget w = (ClockWidget) client_data; X long now; X struct tm *localtime(), X *tm; X X (void) time(&now); X tm = localtime(&now); X if (tm->tm_hour >= 12) X tm->tm_hour -= 12; X w->clock.hour_angle = clock_to_angle((((double) tm->tm_hour) + X ((double) tm->tm_min) / 60.0) / 12.0); X w->clock.minute_angle = X clock_to_angle(((double) tm->tm_min) / 60.0); X /* X * add the timeout before painting the hands, that may take a while and X * we'd like the clock to keep up with time changes. X */ X w->clock.interval_id = XtAddTimeOut((60 - tm->tm_sec) * 1000, new_time, X client_data); X draw_clock(w); X} /* new_time */ X X X/* X * A hand is a rectangle with a triangular cap at the far end. X * This is represented with a five sided polygon. X */ X Xcompute_hand(a, l, width, poly) X double a, X l, X width; X TPoint poly[POLY_SIZE]; X{ X double c, X s; X X c = cos(a); X s = sin(a); X poly[0].x = c * l; X poly[0].y = s * l; X poly[1].x = (l - width) * c - s * width; X poly[1].y = (l - width) * s + c * width; X poly[2].x = (-width) * c - s * width; X poly[2].y = (-width) * s + c * width; X poly[3].x = (-width) * c + s * width; X poly[3].y = (-width) * s - c * width; X poly[4].x = (l - width) * c + s * width; X poly[4].y = (l - width) * s - c * width; X poly[5].x = poly[0].x; X poly[5].y = poly[0].y; X} X Xpaint_hands(w) X ClockWidget w; X{ X GC gc = w->clock.handGC; X Display *dpy = XtDisplay(w); X X /* draw the hands, border first, hour hand on top */ X XSetForeground(dpy, gc, w->clock.border); X draw_hand(w, XtWindow(w), MINUTE_HAND, True, gc); X XSetForeground(dpy, gc, w->clock.minute); X draw_hand(w, XtWindow(w), MINUTE_HAND, False, gc); X X XSetForeground(dpy, gc, w->clock.border); X draw_hand(w, XtWindow(w), HOUR_HAND, True, gc); X XSetForeground(dpy, gc, w->clock.hour); X draw_hand(w, XtWindow(w), HOUR_HAND, False, gc); X} END_OF_FILE if test 11473 -ne `wc -c <'Clock.c'`; then echo shar: \"'Clock.c'\" unpacked with wrong size! fi # end of 'Clock.c' fi if test -f 'ClockP.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ClockP.h'\" else echo shar: Extracting \"'ClockP.h'\" \(1379 characters\) sed "s/^X//" >'ClockP.h' <<'END_OF_FILE' X/* X * $XConsortium: ClockP.h,v 1.5 89/07/21 13:44:45 jim Exp $ X */ X X#ifndef _ClockP_h X#define _ClockP_h X X#include "Clock.h" X#include <X11/CoreP.h> X#include "transform.h" X X#define POLY_SIZE 6 X X/* New fields for the clock widget instance record */ Xtypedef struct { X Pixel minute; /* minute hand pixel */ X Pixel hour; /* hour hand pixel */ X Pixel border; /* border pixel */ X GC shapeGC; /* pointer to GraphicsContext */ X GC shapebackGC; /* pointer to GraphicsContext */ X/* start of graph stuff */ X int backing_store; /* backing store variety */ X Boolean reverse_video; /* swap fg and bg pixels */ X XtIntervalId interval_id; X Transform t; X Transform maskt; X Pixmap shape_mask; /* window shape */ X int shape_width; /* window width when shape last made */ X int shape_height; /* window height when shape last made */ X GC handGC; X double hour_angle; /* hour hand position */ X double minute_angle; /* minute hand position */ X} ClockPart; X X/* Full instance record declaration */ Xtypedef struct _ClockRec { X CorePart core; X ClockPart clock; X} ClockRec; X X/* New fields for the Clock widget class record */ Xtypedef struct {int dummy;} ClockClassPart; X X/* Full class record declaration. */ Xtypedef struct _ClockClassRec { X CoreClassPart core_class; X ClockClassPart clock_class; X} ClockClassRec; X X/* Class pointer. */ Xextern ClockClassRec clockClassRec; X X#endif /* _ClockP_h */ END_OF_FILE if test 1379 -ne `wc -c <'ClockP.h'`; then echo shar: \"'ClockP.h'\" unpacked with wrong size! fi # end of 'ClockP.h' fi if test -f 'Clock.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Clock.h'\" else echo shar: Extracting \"'Clock.h'\" \(1230 characters\) sed "s/^X//" >'Clock.h' <<'END_OF_FILE' X/* X * $XConsortium: Clock.h,v 1.4 89/07/21 13:44:44 jim Exp $ X */ X X#ifndef _XtClock_h X#define _XtClock_h X X/*********************************************************************** X * X * Clock Widget X * X ***********************************************************************/ X X/* Parameters: X X Name Class RepType Default Value X ---- ----- ------- ------------- X background Background pixel White X border BorderColor pixel Black X borderWidth BorderWidth int 1 X minute Foreground Pixel Black X hour Foreground Pixel Black X height Height int 120 X mappedWhenManaged MappedWhenManaged Boolean True X reverseVideo ReverseVideo Boolean False X width Width int 120 X x Position int 0 X y Position int 0 X X*/ X X#define XtNminute "minute" X#define XtNhour "hour" X X#define XtNshapeWindow "shapeWindow" X#define XtCShapeWindow "ShapeWindow" X Xtypedef struct _ClockRec *ClockWidget; /* completely defined in ClockPrivate.h */ Xtypedef struct _ClockClassRec *ClockWidgetClass; /* completely defined in ClockPrivate.h */ X Xextern WidgetClass clockWidgetClass; X XXtEventHandler structure_event(); X X#endif /* _XtClock_h */ X/* DON'T ADD STUFF AFTER THIS #endif */ END_OF_FILE if test 1230 -ne `wc -c <'Clock.h'`; then echo shar: \"'Clock.h'\" unpacked with wrong size! fi # end of 'Clock.h' fi if test -f 'lclock.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'lclock.c'\" else echo shar: Extracting \"'lclock.c'\" \(1515 characters\) sed "s/^X//" >'lclock.c' <<'END_OF_FILE' X#include <X11/Intrinsic.h> X#include <X11/Xatom.h> X#include <X11/StringDefs.h> X#include <X11/Shell.h> X#include "Clock.h" X#include <stdio.h> X Xextern void exit(); X X/* Command line options table. Only resources are entered here...there is a X pass over the remaining options after XtParseCommand is let loose. */ X X/* Exit with message describing command line format */ X Xvoid usage() X{ X fprintf(stderr, X"usage: oclock\n"); X fprintf (stderr, X" [-geometry [{width}][x{height}][{+-}{xoff}[{+-}{yoff}]]] [-display [{host}]:[{vs}]]\n"); X fprintf(stderr, X" [-fg {color}] [-bg {color}] [-bd {color}] [-bw {pixels}]\n"); X fprintf(stderr, X" [-minute {color}] [-hour {color}]\n"); X fprintf(stderr, X" [-backing {backing-store}]\n"); X exit(1); X} X Xstatic XrmOptionDescRec options[] = { X{"-bg", "*Background", XrmoptionSepArg, NULL}, X{"-foreground", "*Foreground", XrmoptionSepArg, NULL}, X{"-background", "*Background", XrmoptionSepArg, NULL}, X{"-minute", "*clock.minute", XrmoptionSepArg, NULL}, X{"-hour", "*clock.hour", XrmoptionSepArg, NULL}, X{"-backing", "*clock.backingStore", XrmoptionSepArg, NULL}, X}; X Xvoid main(argc, argv) X int argc; X char **argv; X{ X Widget toplevel; X Widget clock; X X toplevel = XtInitialize(NULL, "LogoClock", options, XtNumber (options), X &argc, argv); X X if (argc != 1) usage(); X X clock = XtCreateManagedWidget ("lclock", clockWidgetClass, toplevel, X NULL, 0); X XtRealizeWidget (toplevel); X XtMainLoop(); X} END_OF_FILE if test 1515 -ne `wc -c <'lclock.c'`; then echo shar: \"'lclock.c'\" unpacked with wrong size! fi # end of 'lclock.c' fi if test -f 'transform.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'transform.c'\" else echo shar: Extracting \"'transform.c'\" \(2202 characters\) sed "s/^X//" >'transform.c' <<'END_OF_FILE' X/* X * transformed coordinate system objects for X X */ X X# include <X11/Xlib.h> X# include "transform.h" X Xstatic XPoint * XTranslatePoints (points, n_points, t, mode) XTPoint *points; Xint n_points; XTransform *t; Xint mode; X{ X XPoint *xpoints; X int i; X double xoff = 0.0, yoff = 0.0; X X xpoints = (XPoint *) malloc (n_points * sizeof (*xpoints)); X if (!xpoints) X return 0; X for (i = 0; i < n_points; i++) { X xpoints[i].x = Xx(points[i].x + xoff, points[i].y + yoff, t); X xpoints[i].y = Xy(points[i].x + xoff, points[i].y + yoff, t); X if (mode == CoordModePrevious) { X xoff += points[i].x; X yoff += points[i].y; X } X } X return xpoints; X} X XTFillPolygon (dpy, d, gc, t, points, n_points, shape, mode) Xregister Display *dpy; XDrawable d; XGC gc; XTransform *t; XTPoint *points; Xint n_points; Xint shape; Xint mode; X{ X XPoint *xpoints; X X xpoints = TranslatePoints (points, n_points, t, mode); X if (xpoints) { X XFillPolygon (dpy, d, gc, xpoints, n_points, shape, X CoordModeOrigin); X free (xpoints); X } X} X XTDrawArc (dpy, d, gc, t, x, y, width, height, angle1, angle2) X register Display *dpy; X Drawable d; X GC gc; X Transform *t; X double x, y, width, height; X int angle1, angle2; X{ X int xx, xy, xw, xh; X X xx = Xx(x,y,t); X xy = Xy(x,y,t); X xw = Xwidth (width, height, t); X xh = Xheight (width, height, t); X if (xw < 0) { X xx += xw; X xw = -xw; X } X if (xh < 0) { X xy += xh; X xh = -xh; X } X XDrawArc (dpy, d, gc, xx, xy, xw, xh, angle1, angle2); X} X XTFillArc (dpy, d, gc, t, x, y, width, height, angle1, angle2) X register Display *dpy; X Drawable d; X GC gc; X Transform *t; X double x, y, width, height; X int angle1, angle2; X{ X int xx, xy, xw, xh; X X xx = Xx(x,y,t); X xy = Xy(x,y,t); X xw = Xwidth (width, height, t); X xh = Xheight (width, height, t); X if (xw < 0) { X xx += xw; X xw = -xw; X } X if (xh < 0) { X xy += xh; X xh = -xh; X } X XFillArc (dpy, d, gc, xx, xy, xw, xh, angle1, angle2); X} X XSetTransform (t, xx1, xx2, xy1, xy2, tx1, tx2, ty1, ty2) XTransform *t; Xint xx1, xx2, xy1, xy2; Xdouble tx1, tx2, ty1, ty2; X{ X t->mx = ((double) xx2 - xx1) / (tx2 - tx1); X t->bx = ((double) xx1) - t->mx * tx1; X t->my = ((double) xy2 - xy1) / (ty2 - ty1); X t->by = ((double) xy1) - t->my * ty1; X} END_OF_FILE if test 2202 -ne `wc -c <'transform.c'`; then echo shar: \"'transform.c'\" unpacked with wrong size! fi # end of 'transform.c' fi if test -f 'transform.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'transform.h'\" else echo shar: Extracting \"'transform.h'\" \(756 characters\) sed "s/^X//" >'transform.h' <<'END_OF_FILE' X/* X * header file for transformed coordinate system. No rotations X * supported, as elipses cannot be rotated in X. X */ X Xtypedef struct _transform { X double mx, bx; X double my, by; X} Transform; X Xtypedef struct _TPoint { X double x, y; X} TPoint; X Xtypedef struct _TRectangle { X double x, y, width, height; X} TRectangle; X X# define Xx(x,y,t) ((int)((t)->mx * (x) + (t)->bx + 0.5)) X# define Xy(x,y,t) ((int)((t)->my * (y) + (t)->by + 0.5)) X# define Xwidth(w,h,t) ((int)((t)->mx * (w) + 0.5)) X# define Xheight(w,h,t) ((int)((t)->my * (h) + 0.5)) X# define Tx(x,y,t) ((((double) (x)) - (t)->bx) / (t)->mx) X# define Ty(x,y,t) ((((double) (y)) - (t)->by) / (t)->my) X# define Twidth(w,h,t) (((double) (w)) / (t)->mx) X# define Theight(w,h,t) (((double) (h)) / (t)->my) END_OF_FILE if test 756 -ne `wc -c <'transform.h'`; then echo shar: \"'transform.h'\" unpacked with wrong size! fi # end of 'transform.h' fi if test -f 'lclock.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'lclock.man'\" else echo shar: Extracting \"'lclock.man'\" \(1807 characters\) sed "s/^X//" >'lclock.man' <<'END_OF_FILE' X.TH LCLOCK 1 "Release 4" "X Version 11" X.SH NAME Xlclock \- display time of day X.SH SYNOPSIS X.B lclock X[-option ...] X.SH DESCRIPTION X.I Clock Xsimply displays the current time on an analog display X.SH OPTIONS X.TP 8 X.B \-bg \fIbackground color\fB Xchoose a different color for the background. X.TP 8 X.B \-minute \fIminute color\fB Xchoose a different color for the minute hand of the clock. X.TP 8 X.B \-hour \fIhour color\fB Xchoose a different color for the hour hand of the clock. X.TP 8 X.B \-backing \fI{ WhenMapped Always NotUseful }\fB Xselects an appropriate level of backing store. X.TP 8 X.B \-geometry \fIgeometry\fB Xdefine the initial window geometry; see \fIX(1)\fP. X.TP 8 X.B \-display \fIdisplay\fB Xspecify the display to use; see \fIX(1)\fP. X.TP 8 X.B \-bd \fIborder color\fB Xchoose a different color for the window border. X.TP 8 X.B \-bw \fIborder width\fB Xchoose a different width for the window border. As the Clock widget changes Xits border around quite a bit, this is most usefully set to zero. X.SH COLORS XAlthough the default colors for the Clock widget are black and white, the Xwidget was designed in color; unfortunately, the toolkit makes specifying Xthese colors in a device-independent manner difficult. If you want to Xsee the correct colors, add the following lines to your resource file: X.sp 1 XClock*Background: grey X.br XClock*BorderColor: light blue X.br XClock*hour: yellow X.br XClock*minute: yellow X.SH BUGS XShould really be called \fBxclock\fR, but that name was already taken. X.SH "SEE ALSO" XX(1), X Toolkit documentation X.SH COPYRIGHT XCopyright 1989, Massachusetts Institute of Technology. XCopyright 1990, Network Computing Devices, Inc. X.br XSee \fIX(1)\fP for a full statement of rights and permissions. X.SH AUTHOR XKeith Packard, MIT X Consortium XDave Lemke, Network Computing Devices, Inc END_OF_FILE if test 1807 -ne `wc -c <'lclock.man'`; then echo shar: \"'lclock.man'\" unpacked with wrong size! fi # end of 'lclock.man' fi echo shar: End of shell archive. exit 0 ------- End of Forwarded Message dan ----------------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com 632 Petaluma Ave, Sebastopol, CA 95472 800-338-NUTS, in CA: 800-533-NUTS, FAX 707-829-0104 Opinions expressed reflect those of the author only.