ftp://ftp.uni-heidelberg.de/pub/X11/contrib/applications/xscreensaver-2.07.tar.gz
[xscreensaver] / hacks / xroger-hack.c
diff --git a/hacks/xroger-hack.c b/hacks/xroger-hack.c
new file mode 100644 (file)
index 0000000..32e1e4b
--- /dev/null
@@ -0,0 +1,100 @@
+/* xscreensaver, Copyright (c) 1991-1994 Jamie Zawinski <jwz@netscape.com>
+ *
+ * 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 "screenhack.h"
+
+char *progclass = "XRoger";
+
+char *defaults [] = {
+  "XRoger.background:  black",
+  "XRoger.foreground:  red",
+  "*delay:             5",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+extern void skull (Display *, Window, GC, GC, int, int, int, int);
+
+void
+screenhack (dpy, window)
+     Display *dpy;
+     Window window;
+{
+  double delta = 0.005;
+  XGCValues gcv;
+  Colormap cmap;
+  GC draw_gc, erase_gc;
+  unsigned int fg;
+  XColor color, color2, color3;
+  int delay = get_integer_resource ("delay", "Integer");
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap);
+  erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  if (fg == gcv.foreground)
+    fg = ((gcv.foreground == WhitePixel (dpy, DefaultScreen (dpy)))
+         ? BlackPixel (dpy, DefaultScreen (dpy))
+         : WhitePixel (dpy, DefaultScreen (dpy)));
+  gcv.foreground = fg;
+  draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  color.pixel = gcv.foreground;
+  XQueryColor (dpy, cmap, &color);
+  while (1)
+    {
+      int w, h, ww, hh, x, y;
+      time_t start_time;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      w = xgwa.width;
+      h = xgwa.height;
+
+      ww = 100 + random () % (w - 100);
+      hh = 100 + random () % (h - 100);
+      if (ww < 10) ww = 50;
+      if (hh < 10) hh = 50;
+      if (ww < hh) hh = ww;
+      else ww = hh;
+      x = random () % (w - ww);
+      y = random () % (h - hh);
+      XClearWindow (dpy, window);
+      skull (dpy, window, draw_gc, erase_gc, x, y, ww, hh);
+      XSync (dpy, True);
+      start_time = time ((time_t *) 0);
+      if (mono_p)
+       sleep (delay);
+      else
+       while (start_time + delay > time ((time_t *) 0))
+         {
+           int H;
+           double S, V;
+           color2 = color;
+           rgb_to_hsv (color2.red, color2.green, color2.blue, &H, &S, &V);
+           V += delta;
+           if (V >= 1.0) V = 1.0, delta = -delta;
+           if (V <= 0.7) V = 0.7, delta = -delta;
+           hsv_to_rgb (H, S, V, &color2.red, &color2.green, &color2.blue);
+           color3 = color2;
+           if (XAllocColor (dpy, cmap, &color3))
+             {
+               XSetForeground (dpy, draw_gc, color3.pixel);
+               color2.pixel = color3.pixel;
+               XFreeColors (dpy, cmap, &color.pixel, 1, 0);
+             }
+           color = color2;
+           usleep (20000);
+         }
+    }
+}