/* -*- Mode: C; tab-width: 4 -*-
* swirl --- swirly color-cycling patterns.
*/
-#if !defined( lint ) && !defined( SABER )
+#if 0
static const char sccsid[] = "@(#)swirl.c 4.00 97/01/01 xlockmore";
#endif
* event will the author be liable for any lost revenue or profits or
* other special, indirect and consequential damages.
*
- * 13-May-97: jwz@netscape.com: turned into a standalone program.
+ * 13-May-97: jwz@jwz.org: turned into a standalone program.
* 21-Apr-95: improved startup time for TrueColour displays
* (limited to 16bpp to save memory) S.Early <sde1000@cam.ac.uk>
* 09-Jan-95: fixed colour maps (more colourful) and the image now spirals
*/
#ifdef STANDALONE
-# define PROGCLASS "Swirl"
-# define HACK_INIT init_swirl
-# define HACK_DRAW draw_swirl
-# define swirl_opts xlockmore_opts
# define DEFAULTS "*count: 5 \n" \
"*delay: 10000 \n" \
- "*ncolors: 200 \n"
+ "*ncolors: 200 \n" \
+ "*useSHM: True \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
# define SMOOTH_COLORS
# define WRITABLE_COLORS
# include "xlockmore.h" /* from the xscreensaver distribution */
-# include <X11/Xutil.h>
+# ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+# endif /* HAVE_XSHM_EXTENSION */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
+# undef HAVE_XSHM_EXTENSION
#endif /* !STANDALONE */
-ModeSpecOpt swirl_opts = {
+ENTRYPOINT ModeSpecOpt swirl_opts = {
0, NULL, 0, NULL, NULL };
#include <time.h>
#endif /* !STANDALONE */
-#ifdef STANDALONE
-# define MI_COLORMAP MI_WIN_COLORMAP
-#else /* !STANDALONE */
+#ifndef STANDALONE
swirl->fg = MI_FG_COLOR(mi);
swirl->bg = MI_BG_COLOR(mi);
swirl->fgcol.pixel = swirl->fg;
* - swirl is the swirl data
*/
static void
-initialise_image(Display * dpy, SWIRL_P swirl)
+initialise_image(ModeInfo * mi, SWIRL_P swirl)
{
- unsigned int pad;
- int bytes_per_line;
- int image_depth = swirl->rdepth;
- int data_depth = image_depth;
-
- /* On SGIs at least, using an XImage of depth 24 on a Visual of depth 24
- requires the XImage data to use 32 bits per pixel. I don't understand
- how one is supposed to determine this -- maybe XListPixmapFormats?
- But on systems that don't work this way, allocating 32 bpp instead of
- 24 will be wasteful but non-fatal. -- jwz, 16-May-97. */
- if (data_depth >= 24 && data_depth < 32)
- data_depth = 32;
-
- /* get the bitmap pad */
- pad = BitmapPad(dpy);
- /* destroy the old image (destroy XImage and data) */
- if (swirl->ximage != NULL)
- XDestroyImage(swirl->ximage);
-
- /* how many bytes per line? (bits rounded up to pad) */
- bytes_per_line = ((swirl->width * data_depth + pad - 1) / pad) * (pad / 8);
-
- /* allocate space for the image */
- swirl->image = (unsigned char *) calloc(bytes_per_line * swirl->height, 1);
-
- /* create an ximage with this */
- swirl->ximage = XCreateImage(dpy, swirl->visual, image_depth, ZPixmap,
- 0, (char *) swirl->image, swirl->width,
- swirl->height, pad, bytes_per_line);
+ Display *dpy = MI_DISPLAY(mi);
+
+ if (swirl->ximage != NULL)
+ XDestroyImage(swirl->ximage);
+
+ swirl->ximage = 0;
+#ifdef HAVE_XSHM_EXTENSION
+ if (mi->use_shm)
+ {
+ swirl->ximage = create_xshm_image(dpy, swirl->visual, swirl->rdepth,
+ ZPixmap, 0, &mi->shm_info,
+ swirl->width, swirl->height);
+ if (!swirl->ximage)
+ mi->use_shm = False;
+ }
+#endif /* HAVE_XSHM_EXTENSION */
+
+ if (!swirl->ximage)
+ {
+ swirl->ximage = XCreateImage(dpy, swirl->visual, swirl->rdepth, ZPixmap,
+ 0, 0, swirl->width, swirl->height,
+ 8, 0);
+ swirl->image = (unsigned char *)
+ calloc(swirl->height, swirl->ximage->bytes_per_line);
+ swirl->ximage->data = (char *) swirl->image;
+ }
}
/****************************************************************/
draw_block(swirl->ximage, x, y, r, do_point(swirl, x, y));
/* update the screen */
-/* PURIFY 4.0.1 on SunOS4 and on Solaris 2 reports a 256 byte memory leak on *
- the next line. */
- XPutImage(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), swirl->ximage,
- x, y, x, y, r, r);
+
+#ifdef HAVE_XSHM_EXTENSION
+ if (mi->use_shm)
+ XShmPutImage(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), swirl->ximage,
+ x, y, x, y, r, r, False);
+ else
+#endif /* !HAVE_XSHM_EXTENSION */
+ /* PURIFY 4.0.1 on SunOS4 and on Solaris 2 reports a 256 byte memory
+ leak on the next line. */
+ XPutImage(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), swirl->ximage,
+ x, y, x, y, r, r);
}
/****************************************************************/
*
* - win is the window to draw in
*/
-void
+ENTRYPOINT void
init_swirl(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
/* does the swirls array exist? */
if (swirls == NULL) {
- int i;
-
/* allocate an array, one entry for each screen */
- swirls = (SWIRL_P) calloc(ScreenCount(display), sizeof (SWIRL));
-
- /* initialise them all */
- for (i = 0; i < ScreenCount(display); i++)
- initialise_swirl(mi, &swirls[i]);
+ swirls = (SWIRL_P) calloc(MI_NUM_SCREENS(mi), sizeof (SWIRL));
}
/* get a pointer to this swirl */
swirl = &(swirls[MI_SCREEN(mi)]);
-
- /* get window parameters */
+ initialise_swirl(mi, swirl);
+
+ /* get window parameters */
swirl->win = window;
swirl->width = MI_WIN_WIDTH(mi);
swirl->height = MI_WIN_HEIGHT(mi);
swirl->depth = 16;
/* initialise image for speeding up drawing */
- initialise_image(display, swirl);
+ initialise_image(mi, swirl);
/* clear the window (before setting the colourmap) */
XClearWindow(display, MI_WINDOW(mi));
*
* - win is the window to draw in
*/
-void
+ENTRYPOINT void
draw_swirl(ModeInfo * mi)
{
SWIRL_P swirl = &(swirls[MI_SCREEN(mi)]);
if (swirl->drawing) {
#ifdef STANDALONE
if (mi->writable_p)
- rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi),
+ rotate_colors(mi->xgwa.screen, MI_COLORMAP(mi),
swirl->rgb_values, swirl->colours, 1);
#else /* !STANDALONE */
/* rotate the colours */
} else {
#ifdef STANDALONE
if (mi->writable_p)
- rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi),
+ rotate_colors(mi->xgwa.screen, MI_COLORMAP(mi),
swirl->rgb_values, swirl->colours, 1);
#else /* !STANDALONE */
/* rotate the colours */
#ifdef STANDALONE
/* Pick a new colormap! */
XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
- free_colors (MI_DISPLAY(mi), MI_COLORMAP(mi),
+ free_colors (mi->xgwa.screen, MI_COLORMAP(mi),
mi->colors, mi->npixels);
- make_smooth_colormap (MI_DISPLAY(mi),
- MI_VISUAL(mi),
+ make_smooth_colormap (mi->xgwa.screen, MI_VISUAL(mi),
MI_COLORMAP(mi),
mi->colors, &mi->npixels, True,
&mi->writable_p, True);
}
}
+ENTRYPOINT void
+reshape_swirl(ModeInfo * mi, int width, int height)
+{
+ XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+ init_swirl (mi);
+}
+
/****************************************************************/
-void
-release_swirl(ModeInfo * mi)
+ENTRYPOINT void
+release_swirl (ModeInfo * mi)
{
/* does the swirls array exist? */
if (swirls != NULL) {
for (i = 0; i < MI_NUM_SCREENS(mi); i++) {
SWIRL_P swirl = &(swirls[i]);
+#ifndef STANDALONE
if (swirl->cmap != (Colormap) NULL)
XFreeColormap(MI_DISPLAY(mi), swirl->cmap);
+#endif /* STANDALONE */
+#ifndef STANDALONE
if (swirl->rgb_values != NULL)
XFree((void *) swirl->rgb_values);
+#endif /* !STANDALONE */
if (swirl->ximage != NULL)
XDestroyImage(swirl->ximage);
if (swirl->knots)
/****************************************************************/
-void
-refresh_swirl(ModeInfo * mi)
+ENTRYPOINT void
+refresh_swirl (ModeInfo * mi)
{
SWIRL_P swirl = &(swirls[MI_SCREEN(mi)]);
swirl->drawing = False;
}
}
+
+ENTRYPOINT Bool
+swirl_handle_event (ModeInfo *mi, XEvent *event)
+{
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ reshape_swirl (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ return False;
+}
+
+XSCREENSAVER_MODULE ("Swirl", swirl)