From http://www.jwz.org/xscreensaver/xscreensaver-5.22.tar.gz
[xscreensaver] / hacks / rotzoomer.c
index 29a566275445ae07a6e70bacd5698a057e9bae53..6298b34e0fd1ce8f3ab2a06202fa0e5245d08ddc 100644 (file)
@@ -59,6 +59,8 @@ struct state {
   int sweep;
   int delay;
   int anim;
+  int duration;
+  time_t start_time;
 
   async_load_state *img_loader;
 
@@ -264,6 +266,7 @@ 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);
@@ -281,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 */
@@ -295,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]);
@@ -395,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)
@@ -404,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;
@@ -432,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
@@ -440,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
 };
 
@@ -454,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)