From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / rubikblocks.c
index ed5e1775a6ef8d5f72e43e2e80e2c5aa8157fb12..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,13 +261,11 @@ 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);
 
-  /* Do it twice because we don't track the device's orientation. */
-  glRotatef( current_device_rotation(), 0, 0, 1);
   gltrackball_rotate(cp->trackball);
-  glRotatef(-current_device_rotation(), 0, 0, 1);
 
   get_rotation(cp->rot, &x, &y, &z, !cp->button_down);
   glRotatef(x*360, 1, 0, 0);
@@ -273,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++)
@@ -522,7 +531,7 @@ init_cp(rubikblocks_conf *cp)
 
   cp->rot = make_rotator(spin?spinspeed:0, spin?spinspeed:0, spin?spinspeed:0,
       0.1, wander?wspeed:0, True);
-  cp->trackball = gltrackball_init();
+  cp->trackball = gltrackball_init(True);
 
   if(rndstart) randomize(cp);
 }
@@ -543,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)
@@ -603,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);
@@ -626,32 +612,12 @@ ENTRYPOINT Bool
 rubikblocks_handle_event (ModeInfo *mi, XEvent *event)
 {
   rubikblocks_conf *cp = &rubikblocks[MI_SCREEN(mi)];
-  if(event->xany.type == ButtonPress && event->xbutton.button == Button1)
-  {
-    cp->button_down = True;
-    gltrackball_start(cp->trackball, event->xbutton.x, event->xbutton.y,
-        MI_WIDTH(mi), MI_HEIGHT(mi));
-    return True;
-  }
-  else if(event->xany.type == ButtonRelease && event->xbutton.button == Button1)
-  {
-    cp->button_down = False;
-    return True;
-  }
-  else if(event->xany.type == ButtonPress &&
-      (event->xbutton.button == Button4 || event->xbutton.button == Button5 ||
-       event->xbutton.button == Button6 || event->xbutton.button == Button7))
-  {
-    gltrackball_mousewheel(cp->trackball,
-        event->xbutton.button, 5, !!event->xbutton.state);
-    return True;
-  }
-  else if(event->xany.type == MotionNotify && cp->button_down)
-  {
-    gltrackball_track(cp->trackball, event->xmotion.x, event->xmotion.y,
-        MI_WIDTH (mi), MI_HEIGHT (mi));
+
+  if (gltrackball_event_handler (event, cp->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &cp->button_down))
     return True;
-  }
+
   return False;
 }