From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / glx / lockward.c
index 60d684d10878afce7602bc92774411c83e04060c..f15374b213824ba9e86a1e442385cd6c1e8dce08 100644 (file)
@@ -39,7 +39,7 @@
 #define        DEFAULTS        "*delay:        20000   \n"\
                        "*showFPS:      False   \n"
 
-#define        refresh_lockward        0
+#define        release_lockward        0
 
 
 #define        NUMOF(x)        (sizeof ((x)) / sizeof ((*x)))
@@ -136,7 +136,7 @@ typedef struct lockward_context {
 /***************************************************************************
  * Prototypes.
  */
-static void free_lockward (lockward_context *ctx);
+ENTRYPOINT void free_lockward (ModeInfo *mi);
 
 
 /***************************************************************************
@@ -203,9 +203,20 @@ ENTRYPOINT ModeSpecOpt lockward_opts = {
 ENTRYPOINT void
 reshape_lockward (ModeInfo *mi, int width, int height)
 {
+       lockward_context *ctx = &g_ctx[MI_SCREEN (mi)];
        GLfloat h = (GLfloat) height / (GLfloat) width;
+        int y = 0;
+
+        if (width > height * 5) {   /* tiny window: show middle */
+          height = width * 9/16;
+          y = -height/2;
+          h = height / (GLfloat) width;
+        }
+
+       glXMakeCurrent (MI_DISPLAY (mi), MI_WINDOW (mi),
+                       *(ctx->glx_context));
 
-       glViewport (0, 0, (GLint) width, (GLint) height);
+       glViewport (0, y, (GLint) width, (GLint) height);
 
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity ();
@@ -827,15 +838,7 @@ init_lockward (ModeInfo *mi)
        lockward_context        *ctx;
        int             i, n;
 
-       if (!g_ctx) {
-               g_ctx = (lockward_context *) calloc (MI_NUM_SCREENS (mi),
-                                                  sizeof (lockward_context));
-               if (!g_ctx) {
-                       fprintf (stderr, "%s: can't allocate context.\n",
-                                progname);
-                       exit (1);
-               }
-       }
+       MI_INIT (mi, g_ctx);
        ctx = &g_ctx[MI_SCREEN (mi)];
 
        ctx->glx_context = init_GL (mi);
@@ -853,7 +856,8 @@ init_lockward (ModeInfo *mi)
        /* ctx->blades_inner    = glGenLists (NRADII); */
        ctx->rings              = glGenLists (NRADII - 1);
        ctx->blendmode          = 0;
-       ctx->fps                = 1000000 / MI_DELAY (mi);
+/* WTF?        ctx->fps                = 1000000 / MI_DELAY (mi); */
+        ctx->fps = 60;
        ctx->nextblink          = calc_interval_frames
                                   (ctx, g_blinkidle_min, g_blinkidle_max);
        ctx->blink.drawfunc     = NULL;
@@ -927,11 +931,18 @@ init_lockward (ModeInfo *mi)
        }
 }
 
-static void
-free_lockward (lockward_context *ctx)
+ENTRYPOINT void
+free_lockward (ModeInfo *mi)
 {
+       lockward_context        *ctx = &g_ctx[MI_SCREEN (mi)];
        int i;
 
+       if (!ctx->glx_context)
+               return;
+
+       glXMakeCurrent (MI_DISPLAY (mi), MI_WINDOW (mi),
+                       *(ctx->glx_context));
+
        if (ctx->blink.noise)
                free (ctx->blink.noise);
        if (glIsList (ctx->rings))
@@ -951,25 +962,6 @@ free_lockward (lockward_context *ctx)
        }
 }
 
-ENTRYPOINT void
-release_lockward (ModeInfo *mi)
-{
-       int i;
-
-       if (!g_ctx)
-               return;
-
-       for (i = MI_NUM_SCREENS (mi);  --i >= 0; ) {
-               if (g_ctx[i].glx_context)
-                       glXMakeCurrent (MI_DISPLAY (mi), MI_WINDOW (mi),
-                                       *(g_ctx[i].glx_context));
-               free_lockward (&g_ctx[i]);
-       }
-
-       FreeAllGL (mi);
-       free (g_ctx);  g_ctx = NULL;
-}
-
 
 XSCREENSAVER_MODULE ("Lockward", lockward)