http://ftp.x.org/contrib/applications/xscreensaver-2.17.tar.gz
[xscreensaver] / hacks / xlock_23.h
diff --git a/hacks/xlock_23.h b/hacks/xlock_23.h
new file mode 100644 (file)
index 0000000..d509f56
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+**  Helpful definitions for porting xlock modes to xscreensaver.
+**  by Charles Hannum, mycroft@ai.mit.edu
+**
+**  for xlock 2.3 and xscreensaver 1.2, 28AUG92
+**
+**  Modified for xlockmore 3.0 by Anthony Thyssen <anthony@cit.gu.edu.au>
+**  on August 1995.
+**
+**  Tweaked by jwz to work with both ANSI and K&R compilers, 10-May-97.
+**
+**    Note: this file no longer works as of (at least) xlockmore 4.03a10:
+**    see jwz's new xlockmore.h file for a similar hack that works with
+**    code written for that version.
+**
+**  To use, just copy the appropriate file from xlock, add a target
+**  for it in the Imakefile, and do the following:
+**
+**  1) If you include math.h, make sure it is before xlock.h.
+**  2) Make sure the first thing you do in initfoo() is to call
+**     XGetWindowAttributes.  This is what actually sets up the
+**     colormap and whatnot.
+**  3) Add an appropriate PROGRAM() line at the end of the .c file.
+**     The information you need for this comes from xlock's file
+**     resource.c.
+**
+**  That's about all there is to it.
+**
+**  As an added bonus, if you put an empty definition of PROGRAM() in
+**  xlock's xlock.h, you can now use the code with either xlock or
+**  xscreensaver.
+**
+**
+**  If you make any improvements to this code, please send them to me!
+**  It could certainly use some more work.
+*/
+
+#include "screenhack.h"
+
+#define MAXSCREENS 1
+
+static GC gc;
+static unsigned long *pixels = 0, fg_pixel, bg_pixel;
+static int npixels;
+static Colormap cmap;
+
+static int batchcount;
+static unsigned int delay;
+static unsigned int cycles;
+static double saturation;
+
+#ifndef min
+#define min(a,b) ((a)<(b)?(a):(b))
+#endif
+
+typedef struct {
+  GC gc;
+  int npixels;
+  u_long *pixels;
+} perscreen;
+
+static perscreen Scr[MAXSCREENS];
+static Display *dsp;
+
+static int screen = 0;
+
+static void
+#ifdef __STDC__
+My_XGetWindowAttributes (Display *dpy, Window win, XWindowAttributes *xgwa)
+#else /* !__STDC__ */
+My_XGetWindowAttributes (dpy, win, xgwa)
+  Display *dpy;
+  Window win;
+  XWindowAttributes *xgwa;
+#endif /* !__STDC__ */
+{
+  XGetWindowAttributes (dpy, win, xgwa);
+
+  if (! pixels) {
+    XGCValues gcv;
+    XColor color;
+    int n;
+    int i, shift;
+
+    cmap = xgwa->colormap;
+
+    i = get_integer_resource ("ncolors", "Integer");
+    if (i <= 2) i = 2, mono_p = True;
+    shift = 360 / i;
+    pixels = (unsigned long *) calloc (i, sizeof (unsigned long));
+    fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+    bg_pixel = get_pixel_resource ("background", "Background", dpy, cmap);
+    if (! mono_p) {
+      for (npixels = 0; npixels < i; npixels++) {
+        hsv_to_rgb ((360*npixels)/i, saturation, 1.0,
+                   &color.red, &color.green, &color.blue);
+        if (! XAllocColor (dpy, cmap, &color))
+          break;
+        pixels[npixels] = color.pixel;
+      }
+    }
+    n = get_integer_resource ("delay", "Usecs");
+    if (n >= 0) delay = n;
+    n = get_integer_resource ("count", "Integer");
+    if (n > 0) batchcount = n;
+
+    n = get_integer_resource ("cycles", "Integer");
+    if (n >= 0) cycles = n;
+
+    gcv.foreground = fg_pixel;
+    gcv.background = bg_pixel;
+    gc = XCreateGC (dpy, win, GCForeground|GCBackground, &gcv);
+
+    XClearWindow (dpy, win);
+
+    Scr[screen].gc = gc;
+    Scr[screen].npixels = npixels;
+    Scr[screen].pixels = pixels;
+  }
+}
+
+#define XGetWindowAttributes(a,b,c) My_XGetWindowAttributes(a,b,c)
+
+#undef BlackPixel
+#define BlackPixel(a,b) bg_pixel
+#undef WhitePixel
+#define WhitePixel(a,b) fg_pixel
+#define mono mono_p
+
+#define seconds() time((time_t*)0)
+
+char *defaults[] = {
+  "*background:        black",
+  "*foreground:        white",
+  "*ncolors:   64",
+  "*delay:     -1",
+  "*count:     -1",
+  "*cycles:    -1",
+  0
+};
+
+XrmOptionDescRec options[] = {
+  {"-count",   ".count",       XrmoptionSepArg, 0},
+  {"-ncolors", ".ncolors",     XrmoptionSepArg, 0},
+  {"-delay",   ".delay",       XrmoptionSepArg, 0},
+  {"-cycles",   ".cycles",      XrmoptionSepArg, 0},
+  { 0, 0, 0, 0 }
+};
+
+#if defined(__STDC__) || defined(__ANSI_CPP__)
+# define XLOCK_INIT(Z) init##Z
+# define XLOCK_DRAW(Z) draw##Z
+#else  /* K&R CPP */
+# define XLOCK_INIT(Z) init/**/Z
+# define XLOCK_DRAW(Z) draw/**/Z
+#endif /* K&R CPP */
+
+#ifdef __STDC__
+# define XLOCK_SCREENHACK_PROTOTYPE()  \
+  screenhack(Display *dpy, Window window)
+# define XLOCK_PROTOS(Z) /* */
+#else  /* K&R C */
+# define XLOCK_SCREENHACK_PROTOTYPE()  \
+  screenhack(dpy, window)              \
+       Display *dpy;                   \
+       Window window;
+# define XLOCK_PROTOS(Z)               \
+  void init##Z(Window);                        \
+  void draw##Z(Window);                        \
+
+#endif /* K&R C */
+
+#define PROGRAM(Y,Z,D,B,C,S)           \
+  char *progclass = Y;                 \
+  XLOCK_PROTOS(Z)                      \
+                                       \
+  void XLOCK_SCREENHACK_PROTOTYPE()    \
+  {                                    \
+    batchcount = B;                    \
+    delay = D;                         \
+    cycles = C;                                \
+    saturation = S;                    \
+    dsp = dpy;                         \
+                                       \
+    XLOCK_INIT(Z) (window);            \
+    while (1)                          \
+      {                                        \
+       XLOCK_DRAW(Z) (window);         \
+       XSync (dpy, True);              \
+       if (delay) usleep (delay);      \
+      }                                        \
+  }