-/* xscreensaver, Copyright (c) 1992-2006 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2014 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
int xoff, yoff;
int grid_w, grid_h;
int delay, delay2;
+ int duration;
GC gc;
unsigned long fg, bg;
int max_width, max_height;
int draw_last;
int draw_initted;
+ time_t start_time;
async_load_state *img_loader;
};
{
struct state *st = (struct state *) calloc (1, sizeof(*st));
XWindowAttributes xgwa;
- Visual *visual;
XGCValues gcv;
long gcflags;
XGetWindowAttributes (st->dpy, st->window, &xgwa);
st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
- visual = xgwa.visual;
st->max_width = xgwa.width;
st->max_height = xgwa.height;
st->delay = get_integer_resource (st->dpy, "delay", "Integer");
st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
st->grid_size = get_integer_resource (st->dpy, "gridSize", "Integer");
st->pix_inc = get_integer_resource (st->dpy, "pixelIncrement", "Integer");
if (st->delay < 0) st->delay = 0;
if (st->delay2 < 0) st->delay2 = 0;
+ if (st->duration < 1) st->duration = 1;
if (st->pix_inc < 1) st->pix_inc = 1;
if (st->grid_size < 1) st->grid_size = 1;
if (st->img_loader) /* still loading */
{
st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
- if (! st->img_loader) /* just finished */
+ if (! st->img_loader) { /* just finished */
+ st->start_time = time ((time_t *) 0);
draw_grid (st);
+ }
return st->delay;
}
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ st->draw_initted = 0;
+ return st->delay;
+ }
+
if (! st->draw_initted)
{
if (!slidescreen_draw_early (st))
/* alternate between horizontal and vertical slides */
/* note that draw_dir specifies the direction the _hole_ moves, not the tiles */
if (st->draw_last == VERTICAL) {
- if ((st->draw_rnd = random () % (st->grid_w - 1)) < st->hole_x) {
+ if (((st->grid_w > 1) ? st->draw_rnd = random () % (st->grid_w - 1) : 0)
+ < st->hole_x) {
st->draw_dx = -1; st->draw_dir = LEFT; st->hole_x -= st->draw_rnd;
} else {
st->draw_dx = 1; st->draw_dir = RIGHT; st->draw_rnd -= st->hole_x;
st->draw_dy = 0; st->draw_w = st->draw_size = st->draw_rnd + 1; st->draw_h = 1;
st->draw_last = HORIZONTAL;
} else {
- if ((st->draw_rnd = random () % (st->grid_h - 1)) < st->hole_y) {
+ if (((st->grid_h > 1) ? st->draw_rnd = random () % (st->grid_h - 1) : 0)
+ < st->hole_y) {
st->draw_dy = -1; st->draw_dir = UP; st->hole_y -= st->draw_rnd;
} else {
st->draw_dy = 1; st->draw_dir = DOWN; st->draw_rnd -= st->hole_y;
slidescreen_reshape (Display *dpy, Window window, void *closure,
unsigned int w, unsigned int h)
{
+ struct state *st = (struct state *) closure;
+ st->max_width = w;
+ st->max_height = h;
+ if (! st->img_loader) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ }
}
static Bool
slidescreen_event (Display *dpy, Window window, void *closure, XEvent *event)
{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
return False;
}
static const char *slidescreen_defaults [] = {
"*dontClearRoot: True",
+ "*fpsSolid: true",
#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
"*visualID: Best",
"*internalBorderWidth: 4",
"*delay: 50000",
"*delay2: 1000000",
+ "*duration: 120",
+#ifdef USE_IPHONE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
0
};
{ "-increment", ".pixelIncrement", XrmoptionSepArg, 0 },
{ "-delay", ".delay", XrmoptionSepArg, 0 },
{ "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
{ 0, 0, 0, 0 }
};
-XSCREENSAVER_MODULE ("Slidescreen", slidescreen)
+XSCREENSAVER_MODULE ("SlideScreen", slidescreen)