From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / jigglypuff.c
index d23b82171b8b8f8fa3beb4bdf6e3f8743de2cef8..4a77c8c562687b8992f5dc816d6c02bcd0ebe9d9 100644 (file)
@@ -39,6 +39,7 @@
 # define DEFAULTS           "*delay: 20000\n" \
                             "*showFPS: False\n" \
                             "*wireframe: False\n" \
+                           "*suppressRotationAnimation: True\n" \
 
 # define refresh_jigglypuff 0
 # define release_jigglypuff 0
@@ -929,33 +930,11 @@ ENTRYPOINT Bool jigglypuff_handle_event(ModeInfo *mi, XEvent *event)
 {
     jigglystruct *js = &jss[MI_SCREEN(mi)];
     
-    if(event->xany.type == ButtonPress &&
-       event->xbutton.button == Button1) {
-       js->button_down = 1;
-       gltrackball_start(js->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) {
-       js->button_down = 0;
-       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 (js->trackball, event->xbutton.button, 10,
-                              !!event->xbutton.state);
-      return True;
-    }
-    else if(event->xany.type == MotionNotify && js->button_down) {
-       gltrackball_track(js->trackball, event->xmotion.x, event->xmotion.y,
-                         MI_WIDTH(mi), MI_HEIGHT(mi));
-       return True;
-    }
+    if (gltrackball_event_handler (event, js->trackball,
+                                   MI_WIDTH (mi), MI_HEIGHT (mi),
+                                   &js->button_down))
+    return True;
+
     return False;
 }
 
@@ -982,6 +961,16 @@ ENTRYPOINT void draw_jigglypuff(ModeInfo *mi)
     glLoadIdentity();
     glTranslatef(0,0,-10);
 
+
+# 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
+
     glRotatef(js->angle, sin(js->axis), cos(js->axis), -sin(js->axis));
     glTranslatef(0, 0, 5);
     if(!(js->button_down)) {
@@ -993,10 +982,7 @@ ENTRYPOINT void draw_jigglypuff(ModeInfo *mi)
        }
     }
 
-    /* Do it twice because we don't track the device's orientation. */
-    glRotatef( current_device_rotation(), 0, 0, 1);
     gltrackball_rotate(js->trackball);
-    glRotatef(-current_device_rotation(), 0, 0, 1);
 
     if(js->color_style == COLOR_STYLE_CYCLE) {
        int i;
@@ -1024,14 +1010,7 @@ ENTRYPOINT void init_jigglypuff(ModeInfo *mi)
     jigglystruct *js;
     int subdivs;
 
-    if(!jss) {
-       jss = (jigglystruct*)
-           calloc(MI_NUM_SCREENS(mi), sizeof(jigglystruct));
-       if(!jss) {
-           fprintf(stderr, "%s: No..memory...must...abort..\n", progname);
-           exit(1);
-       }
-    }
+    MI_INIT(mi, jss, NULL);
 
     js = &jss[MI_SCREEN(mi)];
 
@@ -1076,7 +1055,7 @@ ENTRYPOINT void init_jigglypuff(ModeInfo *mi)
     else {
        MI_CLEARWINDOW(mi);
     }
-    js->trackball = gltrackball_init();
+    js->trackball = gltrackball_init(True);
 /*    _DEBUG("distance : %f\nhold : %f\nspherify : %f\ndamping : %f\ndfact : %f\n",
           js->stable_distance, js->hold_strength, js->spherify_strength,
           js->damping_velocity, js->damping_factor);