From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / hypnowheel.c
index c05f503d3b994296d5b0a34546262b94216e92fa..4a8fe5e2a0c93183c923918aced8296f3569c1b5 100644 (file)
                        "*showFPS:      False       \n" \
                        "*fpsSolid:     True        \n" \
                        "*wireframe:    False       \n" \
+                       "*suppressRotationAnimation: True\n" \
 
 # define refresh_hypnowheel 0
 # define release_hypnowheel 0
-# define hypnowheel_handle_event 0
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
@@ -63,7 +63,7 @@ static hypnowheel_configuration *bps = NULL;
 
 static GLfloat speed;
 static GLfloat twistiness;
-static GLfloat nlayers;
+static GLint nlayers;
 static Bool do_wander;
 static Bool do_symmetric;
 
@@ -82,7 +82,7 @@ static argtype vars[] = {
   {&do_symmetric, "symmetric",  "Symmetric",  DEF_SYMMETRIC,  t_Bool},
   {&speed,       "speed",      "Speed",      DEF_SPEED,      t_Float},
   {&twistiness,          "twistiness", "Twistiness", DEF_TWISTINESS, t_Float},
-  {&nlayers,     "layers",     "Layers",     DEF_LAYERS,     t_Float},
+  {&nlayers,     "layers",     "Layers",     DEF_LAYERS,     t_Int},
 };
 
 ENTRYPOINT ModeSpecOpt hypnowheel_opts = {
@@ -150,6 +150,14 @@ reshape_hypnowheel (ModeInfo *mi, int width, int height)
              0.0, 0.0, 0.0,
              0.0, 1.0, 0.0);
 
+# ifdef HAVE_MOBILE    /* Keep it the same relative size when rotated. */
+  {
+    int o = (int) current_device_rotation();
+    if (o != 0 && o != 180 && o != -180)
+      glScalef (1/h, 1/h, 1/h);
+  }
+# endif
+
   glClear(GL_COLOR_BUFFER_BIT);
 }
 
@@ -161,14 +169,7 @@ init_hypnowheel (ModeInfo *mi)
   int wire = MI_IS_WIREFRAME(mi);
   int i;
 
-  if (!bps) {
-    bps = (hypnowheel_configuration *)
-      calloc (MI_NUM_SCREENS(mi), sizeof (hypnowheel_configuration));
-    if (!bps) {
-      fprintf(stderr, "%s: out of memory\n", progname);
-      exit(1);
-    }
-  }
+  MI_INIT (mi, bps, NULL);
 
   bp = &bps[MI_SCREEN(mi)];
 
@@ -176,17 +177,20 @@ init_hypnowheel (ModeInfo *mi)
 
   reshape_hypnowheel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
 
-  bp->rot = make_rotator (0, 0, 0, 0, speed * 0.0025, False);
+  if (! bp->rot)
+    bp->rot = make_rotator (0, 0, 0, 0, speed * 0.0025, False);
 
   bp->ncolors = 1024;
-  bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+  if (!bp->colors)
+    bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
   make_smooth_colormap (0, 0, 0,
                         bp->colors, &bp->ncolors,
                         False, 0, False);
 
   if (MI_COUNT(mi) < 2) MI_COUNT(mi) = 2;
   if (nlayers < 1) nlayers = 1;
-  bp->discs = (disc *) calloc (nlayers, sizeof (disc));
+  if (!bp->discs)
+    bp->discs = (disc *) calloc (nlayers, sizeof (disc));
 
   for (i = 0; i < nlayers; i++)
     {
@@ -201,6 +205,7 @@ init_hypnowheel (ModeInfo *mi)
       spin_speed   += frand (spin_speed   / 5);
       wander_speed += frand (wander_speed * 3);
 
+      if (!bp->discs[i].rot)
       bp->discs[i].rot = make_rotator (spin_speed, spin_speed, spin_speed,
                                        spin_accel,
                                        (do_wander ? wander_speed : 0),
@@ -293,6 +298,18 @@ draw_hypnowheel (ModeInfo *mi)
   glXSwapBuffers(dpy, window);
 }
 
+ENTRYPOINT Bool
+hypnowheel_handle_event (ModeInfo *mi, XEvent *event)
+{
+  if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+    {
+      init_hypnowheel (mi);
+      return True;
+    }
+  return False;
+}
+
+
 XSCREENSAVER_MODULE ("Hypnowheel", hypnowheel)
 
 #endif /* USE_GL */