--- /dev/null
+/*
+** 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); \
+ } \
+ }