From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / moebius.c
index b7b83f202b0c1ace001c87583ff522178acbde30..80a8246381a171d7c2036ce94e9238187d1ae0d2 100644 (file)
@@ -80,15 +80,17 @@ static const char sccsid[] = "@(#)moebius.c 5.01 2001/03/01 xlockmore";
 #ifdef STANDALONE
 # define MODE_moebius
 # define refresh_moebius 0
+# define release_moebius 0
 # define DEFAULTS                      "*delay:                20000   \n"                     \
-                                                       "*showFPS:      False   \n"
+                                                       "*showFPS:      False   \n"                     \
+                                                       "*suppressRotationAnimation: True\n" \
 
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 #else /* !STANDALONE */
 # include "xlock.h"            /* from the xlockmore distribution */
 #endif /* !STANDALONE */
 
-#ifdef HAVE_COCOA
+#ifdef HAVE_JWXYZ
 # include "jwxyz.h"
 #else
 # include <X11/Xlib.h>
@@ -147,7 +149,7 @@ ENTRYPOINT ModeSpecOpt moebius_opts =
 
 #ifdef USE_MODULES
 ModStruct   moebius_description =
-{"moebius", "init_moebius", "draw_moebius", "release_moebius",
+{"moebius", "init_moebius", "draw_moebius", (char *) NULL,
  "draw_moebius", "change_moebius", (char *) NULL, &moebius_opts,
  1000, 1, 1, 1, 4, 1.0, "",
  "Shows Moebius Strip II, an Escher-like GL scene with ants", 0, NULL};
@@ -652,55 +654,15 @@ pinit(ModeInfo *mi)
 }
 
 
-
-ENTRYPOINT void
-release_moebius (ModeInfo * mi)
-{
-       if (moebius != NULL) {
-               (void) free((void *) moebius);
-               moebius = (moebiusstruct *) NULL;
-       }
-       FreeAllGL(mi);
-}
-
 ENTRYPOINT Bool
 moebius_handle_event (ModeInfo *mi, XEvent *event)
 {
   moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
 
-  if (event->xany.type == ButtonPress &&
-      event->xbutton.button == Button1)
-    {
-      mp->button_down_p = True;
-      gltrackball_start (mp->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)
-    {
-      mp->button_down_p = 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 (mp->trackball, event->xbutton.button, 10,
-                              !!event->xbutton.state);
-      return True;
-    }
-  else if (event->xany.type == MotionNotify &&
-           mp->button_down_p)
-    {
-      gltrackball_track (mp->trackball,
-                         event->xmotion.x, event->xmotion.y,
-                         MI_WIDTH (mi), MI_HEIGHT (mi));
-      return True;
-    }
+  if (gltrackball_event_handler (event, mp->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &mp->button_down_p))
+    return True;
 
   return False;
 }
@@ -711,11 +673,7 @@ init_moebius (ModeInfo * mi)
 {
        moebiusstruct *mp;
 
-       if (moebius == NULL) {
-               if ((moebius = (moebiusstruct *) calloc(MI_NUM_SCREENS(mi),
-                                           sizeof (moebiusstruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, moebius, NULL);
        mp = &moebius[MI_SCREEN(mi)];
        mp->step = NRAND(90);
        mp->ant_position = NRAND(90);
@@ -723,7 +681,7 @@ init_moebius (ModeInfo * mi)
     {
       double rot_speed = 0.3;
       mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
-      mp->trackball = gltrackball_init ();
+      mp->trackball = gltrackball_init (True);
     }
 
        if ((mp->glx_context = init_GL(mi)) != NULL) {
@@ -759,12 +717,10 @@ draw_moebius (ModeInfo * mi)
 
        glPushMatrix();
 
+
        glTranslatef(0.0, 0.0, -10.0);
 
-    /* Do it twice because we don't track the device's orientation. */
-    glRotatef( current_device_rotation(), 0, 0, 1);
     gltrackball_rotate (mp->trackball);
-    glRotatef(-current_device_rotation(), 0, 0, 1);
 
        if (!MI_IS_ICONIC(mi)) {
                glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window);
@@ -772,6 +728,18 @@ draw_moebius (ModeInfo * mi)
                glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
        }
 
+# 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, h, 1);  /* #### not quite right */
+        h = 1.7;
+        glScalef (h, h, h);
+      }
+    }
+# endif
+
     {
       double x, y, z;
       get_rotation (mp->rot, &x, &y, &z, !mp->button_down_p);
@@ -782,7 +750,7 @@ draw_moebius (ModeInfo * mi)
 
        /* moebius */
        if (!draw_moebius_strip(mi)) {
-               release_moebius(mi);
+               MI_ABORT(mi);
                return;
        }