From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / hacks / glx / carousel.c
index 25fb5292d08a9203ad5c772390541369f3ac3d17..cf2f51c8f1a567cf40775c82298459b38e071468 100644 (file)
@@ -1,4 +1,4 @@
-/* carousel, Copyright (c) 2005-2011 Jamie Zawinski <jwz@jwz.org>
+/* carousel, Copyright (c) 2005-2014 Jamie Zawinski <jwz@jwz.org>
  * Loads a sequence of images and rotates them around.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -426,11 +426,6 @@ carousel_handle_event (ModeInfo *mi, XEvent *event)
     {
       if (! ss->button_down_p)
         ss->button_down_time = time((time_t *) 0);
-      ss->button_down_p = True;
-      gltrackball_start (ss->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)
@@ -446,25 +441,16 @@ carousel_handle_event (ModeInfo *mi, XEvent *event)
           for (i = 0; i < ss->nframes; i++)
             ss->frames[i]->expires += secs;
         }
-      ss->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 (ss->trackball, event->xbutton.button, 5,
-                              !event->xbutton.state);
-      return True;
     }
-  else if (event->xany.type == MotionNotify &&
-           ss->button_down_p)
+
+  if (gltrackball_event_handler (event, ss->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &ss->button_down_p))
+    return True;
+  else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
     {
-      gltrackball_track (ss->trackball,
-                         event->xmotion.x, event->xmotion.y,
-                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      int i = random() % ss->nframes;
+      ss->frames[i]->expires  = 0;
       return True;
     }
 
@@ -520,8 +506,26 @@ loading_msg (ModeInfo *mi, int n)
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();
-  gluOrtho2D(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi));
 
+  {
+    double rot = current_device_rotation();
+    glRotatef(rot, 0, 0, 1);
+    if ((rot >  45 && rot <  135) ||
+        (rot < -45 && rot > -135))
+      {
+        GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+        glScalef (s, 1/s, 1);
+      }
+  }
+
+  if (MI_WIDTH(mi) < MI_HEIGHT(mi))  /* USE_IPHONE portrait orientation */
+    {
+      GLfloat s = (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi));
+      glScalef (s, s, s);
+      glTranslatef(-s/2, 0, 0);
+    }
+
+  glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
   glTranslatef ((MI_WIDTH(mi)  - ss->loading_sw) / 2,
                 (MI_HEIGHT(mi) - ss->loading_sh) / 2,
                 0);
@@ -591,7 +595,7 @@ init_carousel (ModeInfo *mi)
     ss->rot = make_rotator (spin_speed, spin_speed, spin_speed,
                             spin_accel, wander_speed, True);
 
-    ss->trackball = gltrackball_init ();
+    ss->trackball = gltrackball_init (False);
   }
 
   if (strstr ((char *) glGetString(GL_EXTENSIONS),
@@ -832,6 +836,8 @@ draw_carousel (ModeInfo *mi)
 
   glPushMatrix();
 
+  glRotatef(current_device_rotation(), 0, 0, 1);
+
 
   /* Run the startup "un-shrink" animation.
    */