From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / rubikblocks.c
index 14872367e3dbcdf7208a35aa1d9c5ea1e19dd9a1..9a6ecbdc06ae4794f0b4971ef326e5c09e40bebb 100644 (file)
 
 #define DEFAULTS   "*delay:         20000         \n" \
                    "*showFPS:       False         \n" \
-                   "*wireframe:     False         \n"
+                   "*wireframe:     False         \n" \
+                  "*suppressRotationAnimation: True\n" \
 
 # define refresh_rubikblocks 0
+# define release_rubikblocks 0
 #include "xlockmore.h"
 #include "rotator.h"
 #include "gltrackball.h"
@@ -87,7 +89,7 @@ ENTRYPOINT ModeSpecOpt rubikblocks_opts = {countof(opts), opts, countof(vars), v
 
 #ifdef USE_MODULES
 ModStruct   rubikblocks_description =
-{ "rubikblocks", "init_rubikblocks", "draw_rubikblocks", "release_rubikblocks",
+{ "rubikblocks", "init_rubikblocks", "draw_rubikblocks", NULL,
   "draw_rubikblocks", "change_rubikblocks", NULL, &rubikblocks_opts,
   25000, 1, 1, 1, 1.0, 4, "",
   "Shows randomly shuffling Rubik's Mirror Blocks puzzle", 0, NULL
@@ -259,6 +261,7 @@ draw_main(ModeInfo *mi, rubikblocks_conf *cp)
 
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glLoadIdentity();
+
   get_position(cp->rot, &x, &y, &z, !cp->button_down);
   glTranslatef((x-0.5)*6, (y-0.5)*6, -20);
 
@@ -270,6 +273,15 @@ draw_main(ModeInfo *mi, rubikblocks_conf *cp)
   glRotatef(z*360, 0, 0, 1);
   glScalef(size, size, size);
 
+# ifdef HAVE_MOBILE    /* Keep it the same relative size when rotated. */
+  {
+    GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+    int o = (int) current_device_rotation();
+    if (o != 0 && o != 180 && o != -180)
+      glScalef (1/h, 1/h, 1/h);
+  }
+# endif
+
   if(cp->wire) glColor3f(0.7, 0.7, 0.7);
   if(!cp->pause)
     for(i = 0; i < 27; i++)
@@ -540,34 +552,11 @@ reshape_rubikblocks(ModeInfo *mi, int width, int height)
   glClear(GL_COLOR_BUFFER_BIT);
 }
 
-ENTRYPOINT void 
-release_rubikblocks(ModeInfo *mi) 
-{
-  if (rubikblocks != NULL) 
-  {
-    int screen;
-    for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) 
-    {
-      rubikblocks_conf *cp = &rubikblocks[screen];
-      if (cp->glx_context) {
-        cp->glx_context = NULL;
-      }
-    }
-    free((void *)rubikblocks);
-    rubikblocks = NULL;
-  }
-  FreeAllGL(mi);
-}
-
 ENTRYPOINT void 
 init_rubikblocks(ModeInfo *mi) 
 {
   rubikblocks_conf *cp;
-  if(!rubikblocks) 
-  {
-    rubikblocks = (rubikblocks_conf *)calloc(MI_NUM_SCREENS(mi), sizeof(rubikblocks_conf));
-    if(!rubikblocks) return;
-  }
+  MI_INIT(mi, rubikblocks, NULL);
   cp = &rubikblocks[MI_SCREEN(mi)];
 
   if(tex)
@@ -600,7 +589,7 @@ draw_rubikblocks(ModeInfo * mi)
   glXMakeCurrent(display, window, *(cp->glx_context));
   if (!draw_main(mi, cp)) 
   {
-    release_rubikblocks(mi);
+    MI_ABORT(mi);
     return;
   }
   if (MI_IS_FPS(mi)) do_fps (mi);