X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Frotzoomer.c;h=6298b34e0fd1ce8f3ab2a06202fa0e5245d08ddc;hb=4ade52359b6eba3621566dac79793a33aa4c915f;hp=52b382f629d7298d5f0f9e64d936660876150581;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/rotzoomer.c b/hacks/rotzoomer.c index 52b382f6..6298b34e 100644 --- a/hacks/rotzoomer.c +++ b/hacks/rotzoomer.c @@ -59,6 +59,8 @@ struct state { int sweep; int delay; int anim; + int duration; + time_t start_time; async_load_state *img_loader; @@ -176,8 +178,8 @@ reset_zoom (struct state *st, struct zoom_area *za) za->ww = st->width - za->w; za->hh = st->height - za->h; - za->x = (random() % za->ww); - za->y = (random() % za->hh); + za->x = (za->ww ? random() % za->ww : 0); + za->y = (za->hh ? random() % za->hh : 0); za->dx = ((2 * (random() & 1)) - 1) * (100 + random() % 300); za->dy = ((2 * (random() & 1)) - 1) * (100 + random() % 300); @@ -264,13 +266,15 @@ init_hack (struct state *st) { int i; + st->start_time = time ((time_t) 0); st->zoom_box = calloc (st->num_zoom, sizeof (struct zoom_area *)); for (i = 0; i < st->num_zoom; i++) { st->zoom_box[i] = create_zoom (st); } - memcpy (st->buffer_map->data, st->orig_map->data, - st->height * st->buffer_map->bytes_per_line); + if (st->height && st->orig_map->data) + memcpy (st->buffer_map->data, st->orig_map->data, + st->height * st->buffer_map->bytes_per_line); DisplayImage(st, 0, 0, st->width, st->height); } @@ -280,7 +284,7 @@ static unsigned long rotzoomer_draw (Display *disp, Window win, void *closure) { struct state *st = (struct state *) closure; - int delay = (st->delay * 1000); + int delay = st->delay; int i; if (st->img_loader) /* still loading */ @@ -294,6 +298,16 @@ rotzoomer_draw (Display *disp, Window win, void *closure) 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); + return st->delay; + } + for (i = 0; i < st->num_zoom; i++) { if (st->move || st->sweep) update_position (st->zoom_box[i]); @@ -394,6 +408,9 @@ rotzoomer_init (Display *dpy, Window window) st->anim = get_boolean_resource (st->dpy, "anim", "Boolean"); st->delay = get_integer_resource (st->dpy, "delay", "Integer"); + st->duration = get_integer_resource (st->dpy, "duration", "Seconds"); + if (st->delay < 0) st->delay = 0; + if (st->duration < 1) st->duration = 1; /* In sweep or static mode, we want only one box */ if (st->sweep || !st->anim) @@ -403,6 +420,8 @@ rotzoomer_init (Display *dpy, Window window) if (!st->anim) st->sweep = 0; + st->start_time = time ((time_t) 0); + setup_X (st); return st; @@ -431,6 +450,7 @@ rotzoomer_free (Display *dpy, Window window, void *closure) static const char *rotzoomer_defaults[] = { ".background: black", ".foreground: white", + "*fpsSolid: true", #ifdef HAVE_XSHM_EXTENSION "*useSHM: True", #else @@ -439,7 +459,11 @@ static const char *rotzoomer_defaults[] = { "*anim: True", "*mode: stationary", "*numboxes: 2", - "*delay: 10", + "*delay: 10000", + "*duration: 120", +#ifdef USE_IPHONE + "*ignoreRotation: True", +#endif 0 }; @@ -453,9 +477,10 @@ static XrmOptionDescRec rotzoomer_options[] = { { "-anim", ".anim", XrmoptionNoArg, "True" }, { "-no-anim", ".anim", XrmoptionNoArg, "False" }, { "-delay", ".delay", XrmoptionSepArg, 0 }, + {"-duration", ".duration", XrmoptionSepArg, 0 }, { "-n", ".numboxes", XrmoptionSepArg, 0 }, { 0, 0, 0, 0 } }; -XSCREENSAVER_MODULE ("Rotzoomer", rotzoomer) +XSCREENSAVER_MODULE ("RotZoomer", rotzoomer)