ftp://ftp.sunet.se/pub/vendor/sco/skunkware/osr5/x11/savers/xscreensaver/xscreensaver...
[xscreensaver] / hacks / compass.c
diff --git a/hacks/compass.c b/hacks/compass.c
deleted file mode 100644 (file)
index 56a1b0a..0000000
+++ /dev/null
@@ -1,935 +0,0 @@
-/* xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation.  No representations are made about the suitability of this
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- */
-
-#include <math.h>
-#include "screenhack.h"
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-# include "xdbe.h"
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-#define countof(x) (sizeof(x)/sizeof(*(x)))
-#define ABS(x) ((x)<0?-(x):(x))
-#define MAX(x,y) ((x)<(y)?(y):(x))
-#define MIN(x,y) ((x)>(y)?(y):(x))
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-struct disc {
-  int theta;           /* 0 - 360*64 */
-  int velocity;
-  int acceleration;
-  int limit;
-  GC gc;
-  void (*draw) (Display *, Drawable, struct disc *,
-                int x, int y, int radius);
-};
-
-
-static void
-draw_letters (Display *dpy, Drawable d, struct disc *disc,
-              int x, int y, int radius)
-{
-  XPoint points[50];
-  double th2 = 2 * M_PI * (disc->theta / ((double) 360*64));
-  double th;
-
-  /* W */
-
-  th = th2;
-
-  points[0].x = x + radius * 0.8 * cos(th - 0.07);
-  points[0].y = y + radius * 0.8 * sin(th - 0.07);
-
-  points[1].x = x + radius * 0.7 * cos(th - 0.05);
-  points[1].y = y + radius * 0.7 * sin(th - 0.05);
-
-  points[2].x = x + radius * 0.78 * cos(th);
-  points[2].y = y + radius * 0.78 * sin(th);
-
-  points[3].x = x + radius * 0.7 * cos(th + 0.05);
-  points[3].y = y + radius * 0.7 * sin(th + 0.05);
-
-  points[4].x = x + radius * 0.8 * cos(th + 0.07);
-  points[4].y = y + radius * 0.8 * sin(th + 0.07);
-
-  XDrawLines (dpy, d, disc->gc, points, 5, CoordModeOrigin);
-
-  /* 30 (1) */
-
-  th = th2 + (2 * M_PI * 0.08333);
-
-  points[0].x = x + radius * 0.78 * cos(th - 0.13);
-  points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
-  points[1].x = x + radius * 0.8  * cos(th - 0.08);
-  points[1].y = y + radius * 0.8  * sin(th - 0.08);
-
-  points[2].x = x + radius * 0.78 * cos(th - 0.03);
-  points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
-  points[3].x = x + radius * 0.76 * cos(th - 0.03);
-  points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
-  points[4].x = x + radius * 0.75 * cos(th - 0.08);
-  points[4].y = y + radius * 0.75 * sin(th - 0.08);
-
-  points[5].x = x + radius * 0.74 * cos(th - 0.03);
-  points[5].y = y + radius * 0.74 * sin(th - 0.03);
-
-  points[6].x = x + radius * 0.72 * cos(th - 0.03);
-  points[6].y = y + radius * 0.72 * sin(th - 0.03);
-
-  points[7].x = x + radius * 0.7  * cos(th - 0.08);
-  points[7].y = y + radius * 0.7  * sin(th - 0.08);
-
-  points[8].x = x + radius * 0.72  * cos(th - 0.13);
-  points[8].y = y + radius * 0.72  * sin(th - 0.13);
-
-  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
-  /* 30 (2) */
-
-  points[0].x = x + radius * 0.78 * cos(th + 0.03);
-  points[0].y = y + radius * 0.78 * sin(th + 0.03);
-
-  points[1].x = x + radius * 0.8  * cos(th + 0.08);
-  points[1].y = y + radius * 0.8  * sin(th + 0.08);
-
-  points[2].x = x + radius * 0.78 * cos(th + 0.13);
-  points[2].y = y + radius * 0.78 * sin(th + 0.13);
-
-  points[3].x = x + radius * 0.72 * cos(th + 0.13);
-  points[3].y = y + radius * 0.72 * sin(th + 0.13);
-
-  points[4].x = x + radius * 0.7  * cos(th + 0.08);
-  points[4].y = y + radius * 0.7  * sin(th + 0.08);
-
-  points[5].x = x + radius * 0.72  * cos(th + 0.03);
-  points[5].y = y + radius * 0.72  * sin(th + 0.03);
-
-  points[6] = points[0];
-
-  XDrawLines (dpy, d, disc->gc, points, 7, CoordModeOrigin);
-
-  /* 33 (1) */
-
-  th = th2 + (2 * M_PI * 0.16666);
-
-  points[0].x = x + radius * 0.78 * cos(th - 0.13);
-  points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
-  points[1].x = x + radius * 0.8  * cos(th - 0.08);
-  points[1].y = y + radius * 0.8  * sin(th - 0.08);
-
-  points[2].x = x + radius * 0.78 * cos(th - 0.03);
-  points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
-  points[3].x = x + radius * 0.76 * cos(th - 0.03);
-  points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
-  points[4].x = x + radius * 0.75 * cos(th - 0.08);
-  points[4].y = y + radius * 0.75 * sin(th - 0.08);
-
-  points[5].x = x + radius * 0.74 * cos(th - 0.03);
-  points[5].y = y + radius * 0.74 * sin(th - 0.03);
-
-  points[6].x = x + radius * 0.72 * cos(th - 0.03);
-  points[6].y = y + radius * 0.72 * sin(th - 0.03);
-
-  points[7].x = x + radius * 0.7  * cos(th - 0.08);
-  points[7].y = y + radius * 0.7  * sin(th - 0.08);
-
-  points[8].x = x + radius * 0.72  * cos(th - 0.13);
-  points[8].y = y + radius * 0.72  * sin(th - 0.13);
-
-  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
-  /* 33 (2) */
-
-  points[0].x = x + radius * 0.78 * cos(th + 0.03);
-  points[0].y = y + radius * 0.78 * sin(th + 0.03);
-
-  points[1].x = x + radius * 0.8  * cos(th + 0.08);
-  points[1].y = y + radius * 0.8  * sin(th + 0.08);
-
-  points[2].x = x + radius * 0.78 * cos(th + 0.13);
-  points[2].y = y + radius * 0.78 * sin(th + 0.13);
-
-  points[3].x = x + radius * 0.76 * cos(th + 0.13);
-  points[3].y = y + radius * 0.76 * sin(th + 0.13);
-
-  points[4].x = x + radius * 0.75 * cos(th + 0.08);
-  points[4].y = y + radius * 0.75 * sin(th + 0.08);
-
-  points[5].x = x + radius * 0.74 * cos(th + 0.13);
-  points[5].y = y + radius * 0.74 * sin(th + 0.13);
-
-  points[6].x = x + radius * 0.72 * cos(th + 0.13);
-  points[6].y = y + radius * 0.72 * sin(th + 0.13);
-
-  points[7].x = x + radius * 0.7  * cos(th + 0.08);
-  points[7].y = y + radius * 0.7  * sin(th + 0.08);
-
-  points[8].x = x + radius * 0.72  * cos(th + 0.03);
-  points[8].y = y + radius * 0.72  * sin(th + 0.03);
-
-  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
-  /* N */
-
-  th = th2 + (2 * M_PI * 0.25);
-
-  points[0].x = x + radius * 0.7 * cos(th - 0.05);
-  points[0].y = y + radius * 0.7 * sin(th - 0.05);
-
-  points[1].x = x + radius * 0.8 * cos(th - 0.05);
-  points[1].y = y + radius * 0.8 * sin(th - 0.05);
-
-  points[2].x = x + radius * 0.7 * cos(th + 0.05);
-  points[2].y = y + radius * 0.7 * sin(th + 0.05);
-
-  points[3].x = x + radius * 0.8 * cos(th + 0.05);
-  points[3].y = y + radius * 0.8 * sin(th + 0.05);
-
-  XDrawLines (dpy, d, disc->gc, points, 4, CoordModeOrigin);
-
-  /* 3 */
-
-  th = th2 + (2 * M_PI * 0.33333);
-
-  points[0].x = x + radius * 0.78 * cos(th - 0.05);
-  points[0].y = y + radius * 0.78 * sin(th - 0.05);
-
-  points[1].x = x + radius * 0.8  * cos(th);
-  points[1].y = y + radius * 0.8  * sin(th);
-
-  points[2].x = x + radius * 0.78 * cos(th + 0.05);
-  points[2].y = y + radius * 0.78 * sin(th + 0.05);
-
-  points[3].x = x + radius * 0.76 * cos(th + 0.05);
-  points[3].y = y + radius * 0.76 * sin(th + 0.05);
-
-  points[4].x = x + radius * 0.75 * cos(th);
-  points[4].y = y + radius * 0.75 * sin(th);
-
-  points[5].x = x + radius * 0.74 * cos(th + 0.05);
-  points[5].y = y + radius * 0.74 * sin(th + 0.05);
-
-  points[6].x = x + radius * 0.72 * cos(th + 0.05);
-  points[6].y = y + radius * 0.72 * sin(th + 0.05);
-
-  points[7].x = x + radius * 0.7  * cos(th);
-  points[7].y = y + radius * 0.7  * sin(th);
-
-  points[8].x = x + radius * 0.72  * cos(th - 0.05);
-  points[8].y = y + radius * 0.72  * sin(th - 0.05);
-
-  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
-  /* 6 */
-
-  th = th2 + (2 * M_PI * 0.41666);
-
-  points[0].x = x + radius * 0.78 * cos(th + 0.05);
-  points[0].y = y + radius * 0.78 * sin(th + 0.05);
-
-  points[1].x = x + radius * 0.8  * cos(th);
-  points[1].y = y + radius * 0.8  * sin(th);
-
-  points[2].x = x + radius * 0.78 * cos(th - 0.05);
-  points[2].y = y + radius * 0.78 * sin(th - 0.05);
-
-  points[3].x = x + radius * 0.72 * cos(th - 0.05);
-  points[3].y = y + radius * 0.72 * sin(th - 0.05);
-
-  points[4].x = x + radius * 0.7  * cos(th);
-  points[4].y = y + radius * 0.7  * sin(th);
-
-  points[5].x = x + radius * 0.72 * cos(th + 0.05);
-  points[5].y = y + radius * 0.72 * sin(th + 0.05);
-
-  points[6].x = x + radius * 0.74 * cos(th + 0.05);
-  points[6].y = y + radius * 0.74 * sin(th + 0.05);
-
-  points[7].x = x + radius * 0.76 * cos(th);
-  points[7].y = y + radius * 0.76 * sin(th);
-
-  points[8].x = x + radius * 0.74 * cos(th - 0.05);
-  points[8].y = y + radius * 0.74 * sin(th - 0.05);
-
-  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
-
-  /* E */
-
-  th = th2 + (2 * M_PI * 0.5);
-
-  points[0].x = x + radius * 0.8 * cos(th + 0.05);
-  points[0].y = y + radius * 0.8 * sin(th + 0.05);
-
-  points[1].x = x + radius * 0.8 * cos(th - 0.05);
-  points[1].y = y + radius * 0.8 * sin(th - 0.05);
-
-  points[2].x = x + radius * 0.75 * cos(th - 0.05);
-  points[2].y = y + radius * 0.75 * sin(th - 0.05);
-
-  points[3].x = x + radius * 0.75 * cos(th + 0.025);
-  points[3].y = y + radius * 0.75 * sin(th + 0.025);
-
-  points[4].x = x + radius * 0.75 * cos(th - 0.05);
-  points[4].y = y + radius * 0.75 * sin(th - 0.05);
-
-  points[5].x = x + radius * 0.7 * cos(th - 0.05);
-  points[5].y = y + radius * 0.7 * sin(th - 0.05);
-
-  points[6].x = x + radius * 0.7 * cos(th + 0.05);
-  points[6].y = y + radius * 0.7 * sin(th + 0.05);
-
-  XDrawLines (dpy, d, disc->gc, points, 7, CoordModeOrigin);
-
-  /* 12 (1) */
-
-  th = th2 + (2 * M_PI * 0.58333);
-
-  points[0].x = x + radius * 0.77 * cos(th - 0.06);
-  points[0].y = y + radius * 0.77 * sin(th - 0.06);
-
-  points[1].x = x + radius * 0.8  * cos(th - 0.03);
-  points[1].y = y + radius * 0.8  * sin(th - 0.03);
-
-  points[2].x = x + radius * 0.7  * cos(th - 0.03);
-  points[2].y = y + radius * 0.7  * sin(th - 0.03);
-
-  XDrawLines (dpy, d, disc->gc, points, 3, CoordModeOrigin);
-
-  /* 12 (2) */
-
-  points[0].x = x + radius * 0.78 * cos(th + 0.02);
-  points[0].y = y + radius * 0.78 * sin(th + 0.02);
-
-  points[1].x = x + radius * 0.8  * cos(th + 0.07);
-  points[1].y = y + radius * 0.8  * sin(th + 0.07);
-
-  points[2].x = x + radius * 0.78 * cos(th + 0.11);
-  points[2].y = y + radius * 0.78 * sin(th + 0.11);
-
-  points[3].x = x + radius * 0.76 * cos(th + 0.11);
-  points[3].y = y + radius * 0.76 * sin(th + 0.11);
-
-  points[4].x = x + radius * 0.74 * cos(th + 0.02);
-  points[4].y = y + radius * 0.74 * sin(th + 0.02);
-
-  points[5].x = x + radius * 0.71 * cos(th + 0.03);
-  points[5].y = y + radius * 0.71 * sin(th + 0.03);
-
-  points[6].x = x + radius * 0.7  * cos(th + 0.03);
-  points[6].y = y + radius * 0.7  * sin(th + 0.03);
-
-  points[7].x = x + radius * 0.7  * cos(th + 0.13);
-  points[7].y = y + radius * 0.7  * sin(th + 0.13);
-
-  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
-  /* 15 (1) */
-
-  th = th2 + (2 * M_PI * 0.66666);
-
-  points[0].x = x + radius * 0.77 * cos(th - 0.06);
-  points[0].y = y + radius * 0.77 * sin(th - 0.06);
-
-  points[1].x = x + radius * 0.8  * cos(th - 0.03);
-  points[1].y = y + radius * 0.8  * sin(th - 0.03);
-
-  points[2].x = x + radius * 0.7  * cos(th - 0.03);
-  points[2].y = y + radius * 0.7  * sin(th - 0.03);
-
-  XDrawLines (dpy, d, disc->gc, points, 3, CoordModeOrigin);
-
-  /* 15 (2) */
-
-  points[0].x = x + radius * 0.8  * cos(th + 0.11);
-  points[0].y = y + radius * 0.8  * sin(th + 0.11);
-
-  points[1].x = x + radius * 0.8  * cos(th + 0.02);
-  points[1].y = y + radius * 0.8  * sin(th + 0.02);
-
-  points[2].x = x + radius * 0.76 * cos(th + 0.02);
-  points[2].y = y + radius * 0.76 * sin(th + 0.02);
-
-  points[3].x = x + radius * 0.77 * cos(th + 0.06);
-  points[3].y = y + radius * 0.77 * sin(th + 0.06);
-
-  points[4].x = x + radius * 0.76 * cos(th + 0.10);
-  points[4].y = y + radius * 0.76 * sin(th + 0.10);
-
-  points[5].x = x + radius * 0.73 * cos(th + 0.11);
-  points[5].y = y + radius * 0.73 * sin(th + 0.11);
-
-  points[6].x = x + radius * 0.72 * cos(th + 0.10);
-  points[6].y = y + radius * 0.72 * sin(th + 0.10);
-
-  points[7].x = x + radius * 0.7  * cos(th + 0.06);
-  points[7].y = y + radius * 0.7  * sin(th + 0.06);
-
-  points[8].x = x + radius * 0.72 * cos(th + 0.02);
-  points[8].y = y + radius * 0.72 * sin(th + 0.02);
-
-  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
-  /* S */
-
-  th = th2 + (2 * M_PI * 0.75);
-
-  points[0].x = x + radius * 0.78 * cos(th + 0.05);
-  points[0].y = y + radius * 0.78 * sin(th + 0.05);
-
-  points[1].x = x + radius * 0.8  * cos(th);
-  points[1].y = y + radius * 0.8  * sin(th);
-
-  points[2].x = x + radius * 0.78 * cos(th - 0.05);
-  points[2].y = y + radius * 0.78 * sin(th - 0.05);
-
-  points[3].x = x + radius * 0.76 * cos(th - 0.05);
-  points[3].y = y + radius * 0.76 * sin(th - 0.05);
-
-  points[4].x = x + radius * 0.74 * cos(th + 0.05);
-  points[4].y = y + radius * 0.74 * sin(th + 0.05);
-
-  points[5].x = x + radius * 0.72 * cos(th + 0.05);
-  points[5].y = y + radius * 0.72 * sin(th + 0.05);
-
-  points[6].x = x + radius * 0.7  * cos(th);
-  points[6].y = y + radius * 0.7  * sin(th);
-
-  points[7].x = x + radius * 0.72  * cos(th - 0.05);
-  points[7].y = y + radius * 0.72  * sin(th - 0.05);
-
-  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
-  /* 21 (1) */
-
-  th = th2 + (2 * M_PI * 0.83333);
-
-  points[0].x = x + radius * 0.78 * cos(th - 0.13);
-  points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
-  points[1].x = x + radius * 0.8  * cos(th - 0.08);
-  points[1].y = y + radius * 0.8  * sin(th - 0.08);
-
-  points[2].x = x + radius * 0.78 * cos(th - 0.03);
-  points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
-  points[3].x = x + radius * 0.76 * cos(th - 0.03);
-  points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
-  points[4].x = x + radius * 0.74 * cos(th - 0.12);
-  points[4].y = y + radius * 0.74 * sin(th - 0.12);
-
-  points[5].x = x + radius * 0.71 * cos(th - 0.13);
-  points[5].y = y + radius * 0.71 * sin(th - 0.13);
-
-  points[6].x = x + radius * 0.7  * cos(th - 0.13);
-  points[6].y = y + radius * 0.7  * sin(th - 0.13);
-
-  points[7].x = x + radius * 0.7  * cos(th - 0.02);
-  points[7].y = y + radius * 0.7  * sin(th - 0.02);
-
-  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
-  /* 21 (2) */
-
-  points[0].x = x + radius * 0.77 * cos(th + 0.03);
-  points[0].y = y + radius * 0.77 * sin(th + 0.03);
-
-  points[1].x = x + radius * 0.8  * cos(th + 0.06);
-  points[1].y = y + radius * 0.8  * sin(th + 0.06);
-
-  points[2].x = x + radius * 0.7  * cos(th + 0.06);
-  points[2].y = y + radius * 0.7  * sin(th + 0.06);
-
-  XDrawLines (dpy, d, disc->gc, points, 3, CoordModeOrigin);
-
-  /* 24 (1) */
-
-  th = th2 + (2 * M_PI * 0.91666);
-
-  points[0].x = x + radius * 0.78 * cos(th - 0.13);
-  points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
-  points[1].x = x + radius * 0.8  * cos(th - 0.08);
-  points[1].y = y + radius * 0.8  * sin(th - 0.08);
-
-  points[2].x = x + radius * 0.78 * cos(th - 0.03);
-  points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
-  points[3].x = x + radius * 0.76 * cos(th - 0.03);
-  points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
-  points[4].x = x + radius * 0.74 * cos(th - 0.12);
-  points[4].y = y + radius * 0.74 * sin(th - 0.12);
-
-  points[5].x = x + radius * 0.71 * cos(th - 0.13);
-  points[5].y = y + radius * 0.71 * sin(th - 0.13);
-
-  points[6].x = x + radius * 0.7  * cos(th - 0.13);
-  points[6].y = y + radius * 0.7  * sin(th - 0.13);
-
-  points[7].x = x + radius * 0.7  * cos(th - 0.02);
-  points[7].y = y + radius * 0.7  * sin(th - 0.02);
-
-  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
-  /* 24 (2) */
-
-  points[0].x = x + radius * 0.69 * cos(th + 0.09);
-  points[0].y = y + radius * 0.69 * sin(th + 0.09);
-
-  points[1].x = x + radius * 0.8  * cos(th + 0.09);
-  points[1].y = y + radius * 0.8  * sin(th + 0.09);
-
-  points[2].x = x + radius * 0.72 * cos(th + 0.01);
-  points[2].y = y + radius * 0.72 * sin(th + 0.01);
-
-  points[3].x = x + radius * 0.72 * cos(th + 0.13);
-  points[3].y = y + radius * 0.72 * sin(th + 0.13);
-
-  XDrawLines (dpy, d, disc->gc, points, 4, CoordModeOrigin);
-}
-
-
-static void
-draw_ticks (Display *dpy, Drawable d, struct disc *disc,
-            int x, int y, int radius)
-{
-  XSegment segs[72];
-  int i;
-  double tick = (M_PI * 2) / 72;
-
-  for (i = 0; i < 72; i++)
-    {
-      int radius2 = radius;
-      double th = (i * tick) + (2 * M_PI * (disc->theta / ((double) 360*64)));
-
-      if (i % 6)
-        radius2 -= radius / 16;
-      else
-        radius2 -= radius / 8;
-
-      segs[i].x1 = x + radius  * cos(th);
-      segs[i].y1 = y + radius  * sin(th);
-      segs[i].x2 = x + radius2 * cos(th);
-      segs[i].y2 = y + radius2 * sin(th);
-    }
-  XDrawSegments (dpy, d, disc->gc, segs, countof(segs));
-
-  draw_letters (dpy, d, disc, x, y, radius);
-}
-
-
-static void
-draw_thin_arrow (Display *dpy, Drawable d, struct disc *disc,
-                 int x, int y, int radius)
-{
-  XPoint points[3];
-  double th;
-  int radius2;
-  double tick = ((M_PI * 2) / 72) * 2;
-
-  radius *= 0.9;
-  radius2 = radius - (radius / 8) * 3;
-
-  th = 2 * M_PI * (disc->theta / ((double) 360*64));
-
-  points[0].x = x + radius * cos(th);          /* tip */
-  points[0].y = y + radius * sin(th);
-
-  points[1].x = x + radius2 * cos(th - tick);  /* tip left */
-  points[1].y = y + radius2 * sin(th - tick);
-
-  points[2].x = x + radius2 * cos(th + tick);  /* tip right */
-  points[2].y = y + radius2 * sin(th + tick);
-
-  XDrawLine (dpy, d, disc->gc,
-             (int) (x + radius2 * cos(th)),
-             (int) (y + radius2 * sin(th)),
-             (int) (x + -radius * cos(th)),
-             (int) (y + -radius * sin(th)));
-
-  XFillPolygon (dpy, d, disc->gc, points, 3, Convex, CoordModeOrigin);
-}
-
-
-static void
-draw_thick_arrow (Display *dpy, Drawable d, struct disc *disc,
-                  int x, int y, int radius)
-{
-  XPoint points[10];
-  double th;
-  int radius2, radius3;
-  double tick = ((M_PI * 2) / 72) * 2;
-
-  radius *= 0.9;
-  radius2 = radius - (radius / 8) * 3;
-  radius3 = radius - (radius / 8) * 2;
-  th = 2 * M_PI * (disc->theta / ((double) 360*64));
-
-  points[0].x = x + radius * cos(th);          /* tip */
-  points[0].y = y + radius * sin(th);
-
-  points[1].x = x + radius2 * cos(th - tick);  /* tip left */
-  points[1].y = y + radius2 * sin(th - tick);
-
-  points[2].x = x + radius2 * cos(th + tick);  /* tip right */
-  points[2].y = y + radius2 * sin(th + tick);
-
-  points[3] = points[0];
-
-  XDrawLines (dpy, d, disc->gc, points, 4, CoordModeOrigin);
-
-  points[0].x = x + radius2 * cos(th - tick/2);         /* top left */
-  points[0].y = y + radius2 * sin(th - tick/2);
-
-  points[1].x = x + -radius2 * cos(th + tick/2); /* bottom left */
-  points[1].y = y + -radius2 * sin(th + tick/2);
-
-  points[2].x = x + -radius3 * cos(th);                 /* bottom */
-  points[2].y = y + -radius3 * sin(th);
-
-  points[3].x = x + -radius * cos(th);          /* bottom spike */
-  points[3].y = y + -radius * sin(th);
-
-  points[4] = points[2];                        /* return */
-
-  points[5].x = x + -radius2 * cos(th - tick/2); /* bottom right */
-  points[5].y = y + -radius2 * sin(th - tick/2);
-
-  points[6].x = x + radius2 * cos(th + tick/2);  /* top right */
-  points[6].y = y + radius2 * sin(th + tick/2);
-
-  XDrawLines (dpy, d, disc->gc, points, 7, CoordModeOrigin);
-}
-
-
-
-static void
-roll_disc (struct disc *disc)
-{
-  double th = disc->theta;
-  if (th < 0)
-    th = -(th + disc->velocity);
-  else
-    th = (th + disc->velocity);
-
-  if (th > (360*64))
-    th -= (360*64);
-  else if (th < 0)
-    th += (360*64);
-
-  disc->theta = (disc->theta > 0 ? th : -th);
-
-  disc->velocity += disc->acceleration;
-
-  if (disc->velocity > disc->limit || 
-      disc->velocity < -disc->limit)
-    disc->acceleration = -disc->acceleration;
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    disc->acceleration = -disc->acceleration;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (random() & 1)
-       disc->acceleration *= 1.2;
-      else
-       disc->acceleration *= 0.8;
-    }
-}
-
-
-static void
-init_spin (struct disc *disc)
-{
-  disc->limit = 5*64;
-  disc->theta = RAND(360*64);
-  disc->velocity = RAND(16) * RANDSIGN();
-  disc->acceleration = RAND(16) * RANDSIGN();
-}
-
-
-static void
-draw_compass (Display *dpy, Drawable d, struct disc **discs,
-              int x, int y, int radius)
-{
-  int i = 0;
-  while (discs[i])
-    {
-      discs[i]->draw (dpy, d, discs[i], x, y, radius);
-      roll_disc (discs[i]);
-      i++;
-    }
-}
-
-static void
-draw_pointer (Display *dpy, Drawable d, GC ptr_gc, GC dot_gc,
-              int x, int y, int radius)
-{
-  XPoint points[3];
-  int size = radius * 0.1;
-
-  /* top */
-
-  points[0].x = x - size;
-  points[0].y = y - radius - size;
-
-  points[1].x = x + size;
-  points[1].y = y - radius - size;
-
-  points[2].x = x;
-  points[2].y = y - radius;
-  
-  XFillPolygon (dpy, d, ptr_gc, points, 3, Convex, CoordModeOrigin);
-
-  /* top right */
-
-  points[0].x = x - (radius * 0.85);
-  points[0].y = y - (radius * 0.8);
-
-  points[1].x = x - (radius * 1.1);
-  points[1].y = y - (radius * 0.55);
-
-  points[2].x = x - (radius * 0.6);
-  points[2].y = y - (radius * 0.65);
-  
-  XFillPolygon (dpy, d, ptr_gc, points, 3, Convex, CoordModeOrigin);
-
-  /* left */
-
-  points[0].x = x - (radius * 1.05);
-  points[0].y = y;
-
-  points[1].x = x - (radius * 1.1);
-  points[1].y = y - (radius * 0.025);
-
-  points[2].x = x - (radius * 1.1);
-  points[2].y = y + (radius * 0.025);
-  
-  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
-
-  /* right */
-
-  points[0].x = x + (radius * 1.05);
-  points[0].y = y;
-
-  points[1].x = x + (radius * 1.1);
-  points[1].y = y - (radius * 0.025);
-
-  points[2].x = x + (radius * 1.1);
-  points[2].y = y + (radius * 0.025);
-  
-  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
-
-  /* bottom */
-
-  points[0].x = x;
-  points[0].y = y + (radius * 1.05);
-
-  points[1].x = x - (radius * 0.025);
-  points[1].y = y + (radius * 1.1);
-
-  points[2].x = x + (radius * 0.025);
-  points[2].y = y + (radius * 1.1);
-  
-  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
-
-  /* bottom left */
-
-  points[0].x = x + (radius * 0.74);
-  points[0].y = y + (radius * 0.74);
-
-  points[1].x = x + (radius * 0.78);
-  points[1].y = y + (radius * 0.75);
-
-  points[2].x = x + (radius * 0.75);
-  points[2].y = y + (radius * 0.78);
-  
-  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
-
-  /* top left */
-
-  points[0].x = x + (radius * 0.74);
-  points[0].y = y - (radius * 0.74);
-
-  points[1].x = x + (radius * 0.78);
-  points[1].y = y - (radius * 0.75);
-
-  points[2].x = x + (radius * 0.75);
-  points[2].y = y - (radius * 0.78);
-  
-  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
-
-  /* bottom right */
-
-  points[0].x = x - (radius * 0.74);
-  points[0].y = y + (radius * 0.74);
-
-  points[1].x = x - (radius * 0.78);
-  points[1].y = y + (radius * 0.75);
-
-  points[2].x = x - (radius * 0.75);
-  points[2].y = y + (radius * 0.78);
-  
-  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
-}
-
-\f
-char *progclass = "Compass";
-
-char *defaults [] = {
-  ".background:                #000000",
-  ".foreground:                #DDFFFF",
-  "*arrow1Foreground:  #FFF66A",
-  "*arrow2Foreground:  #F7D64A",
-  "*pointerForeground: #FF0000",
-  "*delay:             10000",
-  "*doubleBuffer:      True",
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-  "*useDBE:            True",
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-  0
-};
-
-XrmOptionDescRec options [] = {
-  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
-  { "-db",             ".doubleBuffer", XrmoptionNoArg,  "True" },
-  { "-no-db",          ".doubleBuffer", XrmoptionNoArg,  "False" },
-  { 0, 0, 0, 0 }
-};
-
-void
-screenhack (Display *dpy, Window window)
-{
-  XGCValues gcv;
-  int delay = get_integer_resource ("delay", "Integer");
-  Bool dbuf = get_boolean_resource ("doubleBuffer", "Boolean");
-  struct disc *discs[4];
-  int x, y, size, size2;
-  GC ptr_gc;
-  GC erase_gc = 0;
-  XWindowAttributes xgwa;
-  Pixmap b=0, ba=0, bb=0;      /* double-buffer to reduce flicker */
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-  XdbeBackBuffer backb = 0;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-  XGetWindowAttributes (dpy, window, &xgwa);
-  size2 = MIN(xgwa.width, xgwa.height);
-
-  if (size2 > 600) size2 = 600;
-
-  size = (size2 / 2) * 0.8;
-
-  x = xgwa.width/2;
-  y = xgwa.height/2;
-
-  if (dbuf)
-    {
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-      b = backb = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-      if (!b)
-        {
-          x = size2/2;
-          y = size2/2;
-          ba = XCreatePixmap (dpy, window, size2, size2, xgwa.depth);
-          bb = XCreatePixmap (dpy, window, size2, size2, xgwa.depth);
-          b = ba;
-        }
-    }
-  else
-    {
-      b = window;
-    }
-
-  discs[0] = (struct disc *) calloc (1, sizeof (struct disc));
-  discs[1] = (struct disc *) calloc (1, sizeof (struct disc));
-  discs[2] = (struct disc *) calloc (1, sizeof (struct disc));
-  discs[3] = 0;
-
-  gcv.foreground = get_pixel_resource ("foreground", "Foreground",
-                                       dpy, xgwa.colormap);
-  gcv.line_width = MAX(2, (size/60));
-  gcv.join_style = JoinBevel;
-  discs[0]->draw = draw_ticks;
-  discs[0]->gc = XCreateGC (dpy, b, GCForeground|GCLineWidth|GCJoinStyle,
-                            &gcv);
-  init_spin (discs[0]);
-
-  gcv.foreground = get_pixel_resource ("arrow2Foreground", "Foreground",
-                                       dpy, xgwa.colormap);
-  gcv.line_width = MAX(4, (size / 30));
-  discs[1]->draw = draw_thick_arrow;
-  discs[1]->gc = XCreateGC (dpy, b, GCForeground|GCLineWidth, &gcv);
-  init_spin (discs[1]);
-
-  gcv.foreground = get_pixel_resource ("arrow1Foreground", "Foreground",
-                                       dpy, xgwa.colormap);
-  gcv.line_width = MAX(4, (size / 30));
-  discs[2]->draw = draw_thin_arrow;
-  discs[2]->gc = XCreateGC (dpy, b, GCForeground|GCLineWidth, &gcv);
-  init_spin (discs[2]);
-
-  gcv.foreground = get_pixel_resource ("pointerForeground", "Foreground",
-                                       dpy, xgwa.colormap);
-  ptr_gc = XCreateGC (dpy, b, GCForeground|GCLineWidth, &gcv);
-
-  gcv.foreground = get_pixel_resource ("background", "Background",
-                                       dpy, xgwa.colormap);
-  erase_gc = XCreateGC (dpy, b, GCForeground, &gcv);
-
-  if (ba) XFillRectangle (dpy, ba, erase_gc, 0, 0, size2, size2);
-  if (bb) XFillRectangle (dpy, bb, erase_gc, 0, 0, size2, size2);
-
-  while (1)
-    {
-      XFillRectangle (dpy, b, erase_gc, 0, 0, xgwa.width, xgwa.height);
-
-      draw_compass (dpy, b, discs, x, y, size);
-      draw_pointer (dpy, b, ptr_gc, discs[0]->gc, x, y, size);
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-      if (backb)
-        {
-          XdbeSwapInfo info[1];
-          info[0].swap_window = window;
-          info[0].swap_action = XdbeUndefined;
-          XdbeSwapBuffers (dpy, info, 1);
-        }
-      else
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-      if (dbuf)
-        {
-          XCopyArea (dpy, b, window, erase_gc, 0, 0,
-                     size2, size2,
-                     xgwa.width/2 - x,
-                     xgwa.height/2 - y);
-          b = (b == ba ? bb : ba);
-        }
-
-      XSync (dpy, False);
-      screenhack_handle_events (dpy);
-      if (delay)
-        usleep (delay);
-    }
-}