From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / galaxy.c
index 06aa1c4d4da252d6dac8173dea7d2ebbd8ef8ffd..7f72af5b2ccb22b0aee64cb6c13af4805341d13f 100644 (file)
@@ -43,10 +43,12 @@ static const char sccsid[] = "@(#)galaxy.c 4.04 97/07/28 xlockmore";
 # define DEFAULTS      "*delay:  20000  \n"   \
                                        "*count:  -5     \n"   \
                                        "*cycles:  250   \n"   \
-                                       "*ncolors:  64   \n"
+                                       "*ncolors:  64   \n" \
+                                       "*fpsSolid:  true   \n" \
+                                       "*ignoreRotation: True \n" \
+
 # define UNIFORM_COLORS
-# define reshape_galaxy 0
-# define galaxy_handle_event 0
+# define release_galaxy 0
 # include "xlockmore.h"    /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 # include "xlock.h"     /* from the xlockmore distribution */
@@ -157,8 +159,9 @@ x-axis */
 static unistruct *universes = NULL;
 
 static void
-free_galaxies(unistruct * gp)
+free_galaxies(ModeInfo * mi)
 {
+ unistruct  *gp = &universes[MI_SCREEN(mi)];
  if (gp->galaxies != NULL) {
   int         i;
 
@@ -190,7 +193,7 @@ startover(ModeInfo * mi)
  gp->rot_x = 0;
 
  if (MI_BATCHCOUNT(mi) < -MINGALAXIES)
-  free_galaxies(gp);
+  free_galaxies(mi);
  gp->ngalaxies = MI_BATCHCOUNT(mi);
  if (gp->ngalaxies < -MINGALAXIES)
   gp->ngalaxies = NRAND(-gp->ngalaxies - MINGALAXIES + 1) + MINGALAXIES;
@@ -305,14 +308,10 @@ init_galaxy(ModeInfo * mi)
 {
  unistruct  *gp;
 
- if (universes == NULL) {
-  if ((universes = (unistruct *) calloc(MI_NUM_SCREENS(mi),
-      sizeof (unistruct))) == NULL)
-   return;
- }
+ MI_INIT (mi, universes, free_galaxies);
  gp = &universes[MI_SCREEN(mi)];
 
-# ifdef HAVE_COCOA     /* Don't second-guess Quartz's double-buffering */
+# ifdef HAVE_JWXYZ     /* Don't second-guess Quartz's double-buffering */
   dbufp = False;
 # endif
 
@@ -368,9 +367,9 @@ draw_galaxy(ModeInfo * mi)
 
         d = d0 * d0 + d1 * d1 + d2 * d2;
         if (d > EPSILON)
-          d = gt->mass / (d * sqrt(d)) * DELTAT * DELTAT * QCONS;
+          d = gtk->mass / (d * sqrt(d)) * DELTAT * DELTAT * QCONS;
         else
-          d = gt->mass * eps;
+          d = gtk->mass / (eps * sqrt(eps));
         v0 += d0 * d;
         v1 += d1 * d;
         v2 += d2 * d;
@@ -400,19 +399,19 @@ draw_galaxy(ModeInfo * mi)
 
       d = d0 * d0 + d1 * d1 + d2 * d2;
       if (d > EPSILON)
-        d = gt->mass * gt->mass / (d * sqrt(d)) * DELTAT * QCONS;
+        d = 1 / (d * sqrt(d)) * DELTAT * QCONS;
       else
-        d = gt->mass * gt->mass / (EPSILON * sqrt_EPSILON) * DELTAT * QCONS;
+        d = 1 / (EPSILON * sqrt_EPSILON) * DELTAT * QCONS;
 
       d0 *= d;
       d1 *= d;
       d2 *= d;
-      gt->vel[0] += d0 / gt->mass;
-      gt->vel[1] += d1 / gt->mass;
-      gt->vel[2] += d2 / gt->mass;
-      gtk->vel[0] -= d0 / gtk->mass;
-      gtk->vel[1] -= d1 / gtk->mass;
-      gtk->vel[2] -= d2 / gtk->mass;
+      gt->vel[0] += d0 * gtk->mass;
+      gt->vel[1] += d1 * gtk->mass;
+      gt->vel[2] += d2 * gtk->mass;
+      gtk->vel[0] -= d0 * gt->mass;
+      gtk->vel[1] -= d1 * gt->mass;
+      gtk->vel[2] -= d2 * gt->mass;
     }
 
     gt->pos[0] += gt->vel[0] * DELTAT;
@@ -439,16 +438,10 @@ draw_galaxy(ModeInfo * mi)
 }
 
 ENTRYPOINT void
-release_galaxy(ModeInfo * mi)
+reshape_galaxy(ModeInfo * mi, int width, int height)
 {
- if (universes != NULL) {
-  int         screen;
-
-  for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
-   free_galaxies(&universes[screen]);
-  (void) free((void *) universes);
-  universes = NULL;
- }
+  XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+  init_galaxy (mi);
 }
 
 ENTRYPOINT void
@@ -457,4 +450,16 @@ refresh_galaxy(ModeInfo * mi)
  /* Do nothing, it will refresh by itself */
 }
 
+ENTRYPOINT Bool
+galaxy_handle_event (ModeInfo *mi, XEvent *event)
+{
+  if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+    {
+      reshape_galaxy (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  return False;
+}
+
+
 XSCREENSAVER_MODULE ("Galaxy", galaxy)