* other special, indirect and consequential damages.
*
* Revision History:
- * 13-May-97: jwz@netscape.com: turned into a standalone program.
+ * 22-Jan-98: jwz: made the flag wigglier; added xpm support.
+ * (I tried to do this by re-porting from xlockmore, but the
+ * current xlockmore version is completely inscrutable.)
+ * 13-May-97: jwz@jwz.org: turned into a standalone program.
* Made it able to animate arbitrary (runtime) text or bitmaps.
* 01-May-96: written.
*/
# define DEF_TEXT ""
# include "xlockmore.h" /* from the xscreensaver distribution */
+# ifdef HAVE_XPM
+# include <X11/xpm.h>
+# ifndef PIXEL_ALREADY_TYPEDEFED
+# define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */
+# endif
+# endif
+
#ifdef HAVE_XMU
# ifndef VMS
# include <X11/Xmu/Drawing.h>
# endif /* VMS */
#endif /* HAVE_XMU */
-#include "bob.xbm"
+#include "images/bob.xbm"
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
-#if defined(VMS) && !defined(HAVE_UNAME) && (__VMS_VER >= 70000000)
-# define HAVE_UNAME 1
-#endif
-
#ifdef HAVE_UNAME
# include <sys/utsname.h>
#endif /* HAVE_UNAME */
+#ifdef STANDALONE
+static XrmOptionDescRec opts[] =
+{
+ { "-bitmap", ".flag.bitmap", XrmoptionSepArg, 0 },
+ { "-text", ".flag.text", XrmoptionSepArg, 0 }
+};
+
+#endif /* STANDALONE */
+
ModeSpecOpt flag_opts = {
- 0, NULL, 0, NULL, NULL };
+#ifdef STANDALONE
+ 2, opts, 0, NULL, NULL
+#else /* !STANDALONE */
+ 0, NULL, 0, NULL, NULL
+#endif /* STANDALONE */
+};
#include <string.h>
#include <X11/Xutil.h>
flagstruct *fp = &flags[MI_SCREEN(mi)];
int i;
+ /*-
+ * change the periodicity of the sin formula : the maximum of the
+ * periocity seem to be 16 ( 2^4 ), after the drawing isn't good looking
+ */
+ int periodicity = random_num(4);
+ int puissance = 1;
+
+ /* for (i=0;i<periodicity;i++) puissance*=2; */
+ puissance <<= periodicity;
for (i = 0; i < ANGLES; i++)
- fp->stab[i] = (int) (SINF(i * 4 * M_PI / ANGLES) * fp->samp) + fp->sofs;
+ fp->stab[i] = (int) (SINF(i * puissance * M_PI / ANGLES) * fp->samp) +
+ fp->sofs;
}
static void
fp->stab[(fp->sidx + x + y) % ANGLES];
yp = (int) (fp->size * (float) y) +
fp->stab[(fp->sidx + 4 * x + y + y) % ANGLES];
- if (XGetPixel(fp->image, x, y))
+
+ if (fp->image->depth > 1)
+ XSetForeground(display, MI_GC(mi),
+ XGetPixel(fp->image, x, y));
+ else if (XGetPixel(fp->image, x, y))
XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
else if (MI_NPIXELS(mi) <= 2)
XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
else
XSetForeground(display, MI_GC(mi),
MI_PIXEL(mi, (y + x + fp->sidx + fp->startcolor) % MI_NPIXELS(mi)));
+
if (fp->pointsize <= 1)
XDrawPoint(display, fp->cache, MI_GC(mi), xp, yp);
else if (fp->pointsize < 6)
*bitmap_name &&
!!strcmp(bitmap_name, "(default)"))
{
+#ifdef HAVE_XPM
+ Window window = MI_WINDOW(mi);
+ XWindowAttributes xgwa;
+ XpmAttributes xpmattrs;
+ int result;
+ Pixmap bitmap = 0;
+ int width = 0, height = 0;
+ xpmattrs.valuemask = 0;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+# ifdef XpmCloseness
+ xpmattrs.valuemask |= XpmCloseness;
+ xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+ xpmattrs.valuemask |= XpmVisual;
+ xpmattrs.visual = xgwa.visual;
+# endif
+# ifdef XpmDepth
+ xpmattrs.valuemask |= XpmDepth;
+ xpmattrs.depth = xgwa.depth;
+# endif
+# ifdef XpmColormap
+ xpmattrs.valuemask |= XpmColormap;
+ xpmattrs.colormap = xgwa.colormap;
+# endif
+
+ /* Uh, we don't need these now. We use the colors from the xpm.
+ It kinda sucks that we already allocated them. */
+ XFreeColors(dpy, xgwa.colormap, mi->pixels, mi->npixels, 0L);
+
+ result = XpmReadFileToPixmap (dpy, window, bitmap_name, &bitmap, 0,
+ &xpmattrs);
+ switch (result)
+ {
+ case XpmColorError:
+ fprintf (stderr, "%s: warning: xpm color substitution performed\n",
+ progname);
+ /* fall through */
+ case XpmSuccess:
+ width = xpmattrs.width;
+ height = xpmattrs.height;
+ break;
+ case XpmFileInvalid:
+ case XpmOpenFailed:
+ bitmap = 0;
+ break;
+ case XpmColorFailed:
+ fprintf (stderr, "%s: xpm: color allocation failed\n", progname);
+ exit (-1);
+ case XpmNoMemory:
+ fprintf (stderr, "%s: xpm: out of memory\n", progname);
+ exit (-1);
+ default:
+ fprintf (stderr, "%s: xpm: unknown error code %d\n", progname,
+ result);
+ exit (-1);
+ }
+
+ if (bitmap)
+ {
+ fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, ~0L,
+ ZPixmap);
+ XFreePixmap(dpy, bitmap);
+ }
+ else
+#endif /* HAVE_XPM */
+
#ifdef HAVE_XMU
- int width, height, xh, yh;
- Pixmap bitmap =
- XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy),
- bitmap_name, 0, 0, &width, &height, &xh, &yh);
- if (!bitmap)
{
- fprintf(stderr, "%s: unable to load bitmap file %s\n",
- progname, bitmap_name);
- exit (1);
+ int width, height, xh, yh;
+ Pixmap bitmap =
+ XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy),
+ bitmap_name, 0, 0, &width, &height, &xh, &yh);
+ if (!bitmap)
+ {
+ fprintf(stderr, "%s: unable to load bitmap file %s\n",
+ progname, bitmap_name);
+ exit (1);
+ }
+ fp->image = XGetImage(dpy, bitmap, 0, 0, width, height,
+ 1L, XYPixmap);
+ XFreePixmap(dpy, bitmap);
}
- fp->image = XGetImage(dpy, bitmap, 0, 0, width, height,
- 1L, XYPixmap);
- XFreePixmap(dpy, bitmap);
#else /* !XMU */
fprintf (stderr,
*s = 0;
text = (char *) malloc(strlen(uts.nodename) +
strlen(uts.sysname) +
+ strlen(uts.version) +
strlen(uts.release) + 10);
+# ifdef _AIX
+ sprintf(text, "%s\n%s %s.%s",
+ uts.nodename, uts.sysname, uts.version, uts.release);
+# else /* !_AIX */
sprintf(text, "%s\n%s %s",
uts.nodename, uts.sysname, uts.release);
+# endif /* !_AIX */
}
#else /* !HAVE_UNAME */
# ifdef VMS
}
else
{
+ char *bits = (char *) malloc (sizeof(bob_bits));
+ memcpy (bits, bob_bits, sizeof(bob_bits));
fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0,
- (char *) bob_bits, bob_width, bob_height,
+ bits, bob_width, bob_height,
8, 0);
fp->image->byte_order = LSBFirst;
fp->image->bitmap_bit_order = LSBFirst;
XClearWindow(display, MI_WINDOW(mi));
}
+void release_flag(ModeInfo * mi);
+
+
void
draw_flag(ModeInfo * mi)
{
XFlush(display);
fp->timer++;
if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
+ {
+ release_flag(mi);
init_flag(mi);
+ }
}
void