*/
#ifdef STANDALONE
-#define MODE_discrete
-#define PROGCLASS "Discrete"
-#define HACK_INIT init_discrete
-#define HACK_DRAW draw_discrete
-#define discrete_opts xlockmore_opts
-#define DEFAULTS "*delay: 1000 \n" \
- "*count: 4096 \n" \
- "*cycles: 2500 \n" \
- "*ncolors: 100 \n"
-#define SMOOTH_COLORS
-#include "xlockmore.h" /* in xscreensaver distribution */
-#include "erase.h"
+# define MODE_discrete
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 4096 \n" \
+ "*cycles: 2500 \n" \
+ "*ncolors: 100 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define SMOOTH_COLORS
+# include "xlockmore.h" /* in xscreensaver distribution */
+# include "erase.h"
#else /* STANDALONE */
-#include "xlock.h" /* in xlockmore distribution */
+# include "xlock.h" /* in xlockmore distribution */
#endif /* STANDALONE */
#ifdef MODE_discrete
-ModeSpecOpt discrete_opts =
+ENTRYPOINT ModeSpecOpt discrete_opts =
{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
#ifdef USE_MODULES
enum ftypes op;
int count;
XPoint *pointBuffer; /* pointer for XDrawPoints */
+
+ int sqrt_sign, std_sign;
+
+#ifdef STANDALONE
+ eraser_state *eraser;
+#endif
+
} discretestruct;
static discretestruct *discretes = (discretestruct *) NULL;
-void
-init_discrete(ModeInfo * mi)
+ENTRYPOINT void
+init_discrete (ModeInfo * mi)
{
double range;
discretestruct *hp;
/* if fails will check later */
}
+#ifndef STANDALONE
/* Clear the background. */
MI_CLEARWINDOW(mi);
+#endif
XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
hp->count = 0;
+ hp->sqrt_sign = 1;
+ hp->std_sign = 1;
}
-void
-draw_discrete(ModeInfo * mi)
+static void
+draw_discrete_1 (ModeInfo * mi)
{
Display *dsp = MI_DISPLAY(mi);
Window win = MI_WINDOW(mi);
? sqrt(fabs(hp->b * (hp->i - hp->c)))
: -sqrt(fabs(hp->b * (hp->i - hp->c))));
} else {
- static int s = 1;
-
- hp->i = s * hp->inc * hp->maxx / cycles / 2;
+ hp->i = (hp->sqrt_sign ? 1 : -1) * hp->inc * hp->maxx / cycles / 2;
hp->j = hp->a + hp->i;
- s = -s;
+ hp->sqrt_sign = !hp->sqrt_sign;
}
break;
case STANDARD:
hp->i = oldi + hp->j;
hp->i = fmod(hp->i + 2 * M_PI, 2 * M_PI);
} else {
- static int s = 1;
-
- hp->j = M_PI + fmod(s * hp->inc * 2 * M_PI / (cycles - 0.5), M_PI);
+ hp->j = M_PI + fmod((hp->std_sign ? 1 : -1) * hp->inc * 2 * M_PI / (cycles - 0.5), M_PI);
hp->i = M_PI;
- s = -s;
+ hp->std_sign = !hp->std_sign;
}
break;
case BIRDIE:
xp++;
}
XDrawPoints(dsp, win, gc, hp->pointBuffer, count, CoordModeOrigin);
- if (++hp->count > cycles) {
-#ifdef STANDALONE
- erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
-#endif /* STANDALONE */
- init_discrete(mi);
- }
}
-void
+ENTRYPOINT void
+draw_discrete (ModeInfo * mi)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+ int cycles = MI_CYCLES(mi);
+ int i;
+
+ if (hp->eraser) {
+ hp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), hp->eraser);
+ return;
+ }
+
+ for (i = 0; i < 10; i++) {
+ draw_discrete_1 (mi);
+ hp->count++;
+ }
+
+ if (hp->count > cycles) {
+ hp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), hp->eraser);
+ init_discrete(mi);
+ }
+}
+
+
+ENTRYPOINT void
+reshape_discrete(ModeInfo * mi, int width, int height)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+ hp->maxx = width;
+ hp->maxy = height;
+ XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
release_discrete(ModeInfo * mi)
{
if (discretes != NULL) {
}
}
-void
+ENTRYPOINT void
refresh_discrete(ModeInfo * mi)
{
MI_CLEARWINDOW(mi);
}
+ENTRYPOINT Bool
+discrete_handle_event (ModeInfo *mi, XEvent *event)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ hp->count = MI_CYCLES(mi);
+ return True;
+ }
+ return False;
+}
+
+
+
+XSCREENSAVER_MODULE ("Discrete", discrete)
+
#endif /* MODE_discrete */