From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / glx / sierpinski3d.c
index 3b80fc2b498d499a453498d55928832d19933584..0317299ab25d24dcdbefeb4bfdd08369fadd6022 100644 (file)
@@ -32,7 +32,6 @@ static const char sccsid[] = "@(#)sierpinski3D.c      00.01 99/11/04 xlockmore";
                                                                        "*wireframe:    False   \n"                     \
                                                                        "*suppressRotationAnimation: True\n" \
 
-# define refresh_gasket 0
 # define release_gasket 0
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -79,7 +78,7 @@ ENTRYPOINT ModeSpecOpt gasket_opts = {countof(opts), opts, countof(vars), vars,
 #ifdef USE_MODULES
 ModStruct   gasket_description =
 {"gasket", "init_gasket", "draw_gasket", NULL,
- "draw_gasket", "init_gasket", NULL, &gasket_opts,
+ "draw_gasket", "init_gasket", "free_gasket", &gasket_opts,
  1000, 1, 2, 1, 4, 1.0, "",
  "Shows GL's Sierpinski gasket", 0, NULL};
 
@@ -386,8 +385,15 @@ ENTRYPOINT void
 reshape_gasket(ModeInfo *mi, int width, int height)
 {
   GLfloat h = (GLfloat) height / (GLfloat) width;
+  int y = 0;
 
-  glViewport(0, 0, (GLint) width, (GLint) height);
+  if (width > height * 5) {   /* tiny window: show middle */
+    height = width * 9/16;
+    y = -height/2;
+    h = height / (GLfloat) width;
+  }
+
+  glViewport(0, y, (GLint) width, (GLint) height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective (30.0, 1/h, 1.0, 100.0);
@@ -467,16 +473,13 @@ gasket_handle_event (ModeInfo *mi, XEvent *event)
 }
 
 
-static void free_gasket(ModeInfo * mi);
-
-
 ENTRYPOINT void
 init_gasket(ModeInfo *mi)
 {
   int           screen = MI_SCREEN(mi);
   gasketstruct *gp;
 
-  MI_INIT (mi, gasket, free_gasket);
+  MI_INIT (mi, gasket);
   gp = &gasket[screen];
 
   gp->window = MI_WINDOW(mi);