From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / juggler3d.c
index 6349d9df2cc5bf0fbcdb6514326120bc91b2f86a..61b68eea14a0975780d76f6e2b538dcf498276a4 100644 (file)
                        "*count:        200     \n" \
                        "*cycles:       1000    \n" \
                        "*ncolors:      32      \n" \
-                        "*titleFont:  -*-helvetica-bold-r-normal-*-180-*\n" \
+             "*titleFont:  -*-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*\n" \
                        "*showFPS:      False   \n" \
                        "*wireframe:    False   \n" \
 
 # define refresh_juggle 0
+# define release_juggle 0
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "tube.h"
 #include "rotator.h"
 #include "gltrackball.h"
-#include "glxfonts.h"
+#include "texfont.h"
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -579,9 +580,7 @@ typedef struct {
   ObjType       objtypes;
   Object       *objects;
   struct patternindex patternindex;
-
-  XFontStruct *mode_font;
-  GLuint font_dlist;
+  texture_font_data *font_data;
 } jugglestruct;
 
 static jugglestruct *juggles = (jugglestruct *) NULL;
@@ -639,7 +638,9 @@ trajectory_destroy(Trajectory *t) {
 }
 
 static void
-free_juggle(jugglestruct *sp) {
+free_juggle(ModeInfo *mi) {
+  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+
   if (sp->head != NULL) {
        while (sp->head->next != sp->head) {
          trajectory_destroy(sp->head->next);
@@ -658,20 +659,17 @@ free_juggle(jugglestruct *sp) {
        free(sp->pattern);
        sp->pattern = NULL;
   }
-  if (sp->mode_font!=None) {
-       XFreeFontInfo(NULL,sp->mode_font,1);
-       sp->mode_font = None;
-  }
 }
 
 static Bool
-add_throw(jugglestruct *sp, char type, int h, Notation n, const char* name)
+add_throw(ModeInfo *mi, char type, int h, Notation n, const char* name)
 {
+  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
   Trajectory *t;
 
   ADD_ELEMENT(Trajectory, t, sp->head->prev);
   if(t == NULL){ /* Out of Memory */
-       free_juggle(sp);
+       free_juggle(mi);
        return False;
   }
   t->object = NULL;
@@ -693,7 +691,6 @@ add_throw(jugglestruct *sp, char type, int h, Notation n, const char* name)
 static Bool
 program(ModeInfo *mi, const char *patn, const char *name, int cycles)
 {
-  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
   const char *p;
   int w, h, i, seen;
   Notation notation;
@@ -745,7 +742,7 @@ program(ModeInfo *mi, const char *patn, const char *name, int cycles)
                case ' ':
                  if (seen) {
                        i++;
-                       if (!add_throw(sp, type, h, notation, title))
+                       if (!add_throw(mi, type, h, notation, title))
                                return False;
                        title = NULL;
                        type=' ';
@@ -765,7 +762,7 @@ program(ModeInfo *mi, const char *patn, const char *name, int cycles)
          }
        }
        if (seen) { /* end of sequence */
-         if (!add_throw(sp, type, h, notation, title))
+         if (!add_throw(mi, type, h, notation, title))
                return False;
          title = NULL;
        }
@@ -866,8 +863,9 @@ name(jugglestruct *sp)
 /* ..nm.. -> .. LTn LC RTm RC .. */
 
 static Bool
-part(jugglestruct *sp)
+part(ModeInfo *mi)
 {
+  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
   Trajectory *t, *nt, *p;
   Hand hand = (LRAND() & 1) ? RIGHT : LEFT;
 
@@ -912,7 +910,7 @@ part(jugglestruct *sp)
          t->action = CATCH;
          ADD_ELEMENT(Trajectory, nt, p);
          if(nt == NULL){
-               free_juggle(sp);
+               free_juggle(mi);
                return False;
          }
          nt->object = NULL;
@@ -2098,8 +2096,7 @@ show_europeanclub(ModeInfo *mi, unsigned long color, Trace *s)
   GLfloat gcolor1[4] = { 0, 0, 0, 1 };
   GLfloat gcolor2[4] = { 1, 1, 1, 1 };
   int slices = 16;
-  int divs = s->divisions;
-  divs = 4;
+  int divs = 4;
 
   /*    6   6
          +-+
@@ -2448,19 +2445,6 @@ show_bball(ModeInfo *mi, unsigned long color, Trace *s)
  **************************************************************************/
 
 
-ENTRYPOINT void
-release_juggle (ModeInfo * mi)
-{
-  if (juggles != NULL) {
-       int screen;
-
-       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
-         free_juggle(&juggles[screen]);
-       free(juggles);
-       juggles = (jugglestruct *) NULL;
-  }
-}
-
 /* FIXME: refill_juggle currently just appends new throws to the
  * programme.  This is fine if the programme is empty, but if there
  * are still some trajectories left then it really should take these
@@ -2577,7 +2561,7 @@ refill_juggle(ModeInfo * mi)
 
   name(sp);
 
-  if (!part(sp))
+  if (!part(mi))
        return;
 
   lob(mi);
@@ -2587,7 +2571,7 @@ refill_juggle(ModeInfo * mi)
   positions(sp);
 
   if (!projectile(sp)) {
-       free_juggle(sp);
+       free_juggle(mi);
        return;
   }
 
@@ -2652,20 +2636,14 @@ init_juggle (ModeInfo * mi)
   jugglestruct *sp = 0;
   int wire = MI_IS_WIREFRAME(mi);
 
-  if (!juggles) {
-    juggles = (jugglestruct *)
-      calloc (MI_NUM_SCREENS(mi), sizeof (jugglestruct));
-    if (!juggles) {
-      fprintf(stderr, "%s: out of memory\n", progname);
-      exit(1);
-    }
-  }
+  MI_INIT (mi, juggles, free_juggle);
 
   sp = &juggles[MI_SCREEN(mi)];
 
-  sp->glx_context = init_GL(mi);
+  if (!sp->glx_context)   /* re-initting breaks print_texture_label */
+    sp->glx_context = init_GL(mi);
 
-  load_font (mi->dpy, "titleFont",  &sp->mode_font, &sp->font_dlist);
+  sp->font_data = load_texture_font (mi->dpy, "titleFont");
 
   reshape_juggle (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
@@ -2698,7 +2676,7 @@ init_juggle (ModeInfo * mi)
     double spin_accel   = 0.05;
     sp->rot = make_rotator (0, spin_speed, 0, 
                             spin_accel, wander_speed, False);
-    sp->trackball = gltrackball_init ();
+    sp->trackball = gltrackball_init (False);
   }
 
   if (only && *only && strcmp(only, " ")) {
@@ -2752,14 +2730,14 @@ init_juggle (ModeInfo * mi)
        /* create circular trajectory list */
        ADD_ELEMENT(Trajectory, sp->head, sp->head);
        if(sp->head == NULL){
-         free_juggle(sp);
+         free_juggle(mi);
          return;
        }
 
        /* create circular object list */
        ADD_ELEMENT(Object, sp->objects, sp->objects);
        if(sp->objects == NULL){
-         free_juggle(sp);
+         free_juggle(mi);
          return;
        }
 
@@ -2822,51 +2800,15 @@ juggle_handle_event (ModeInfo *mi, XEvent *event)
 {
   jugglestruct *sp = &juggles[MI_SCREEN(mi)];
 
-  if (event->xany.type == ButtonPress &&
-      event->xbutton.button == Button1)
+  if (gltrackball_event_handler (event, sp->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &sp->button_down_p))
+    return True;
+  else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
     {
-      sp->button_down_p = True;
-      gltrackball_start (sp->trackball,
-                         event->xbutton.x, event->xbutton.y,
-                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      change_juggle (mi);
       return True;
     }
-  else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button == Button1)
-    {
-      sp->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 (sp->trackball, event->xbutton.button, 10,
-                              !!event->xbutton.state);
-      return True;
-    }
-  else if (event->xany.type == MotionNotify &&
-           sp->button_down_p)
-    {
-      gltrackball_track (sp->trackball,
-                         event->xmotion.x, event->xmotion.y,
-                         MI_WIDTH (mi), MI_HEIGHT (mi));
-      return True;
-    }
-  else if (event->xany.type == KeyPress)
-    {
-      KeySym keysym;
-      char c = 0;
-      XLookupString (&event->xkey, &c, 1, &keysym, 0);
-      if (c == ' ' || c == '\n' || c == '\r' || c == '\t')
-        {
-          change_juggle (mi);
-          return True;
-        }
-    }
-
 
   return False;
 }
@@ -2898,6 +2840,7 @@ draw_juggle (ModeInfo *mi)
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glPushMatrix ();
+  glRotatef(current_device_rotation(), 0, 0, 1);
 
   glTranslatef(0,-3,0);
 
@@ -3051,12 +2994,10 @@ draw_juggle (ModeInfo *mi)
        }
   }
 
-  if(sp->mode_font != None) {
-    print_gl_string (mi->dpy, sp->mode_font, sp->font_dlist,
-                     mi->xgwa.width, mi->xgwa.height,
-                     10, mi->xgwa.height - 10,
-                     sp->pattern, False);
-  }
+  glColor3f (1, 1, 0);
+  print_texture_label (mi->dpy, sp->font_data,
+                       mi->xgwa.width, mi->xgwa.height,
+                       1, sp->pattern);
 
 #ifdef MEMTEST
   if((int)(sp->time/10) % 1000 == 0)
@@ -3066,7 +3007,6 @@ draw_juggle (ModeInfo *mi)
   if (future < sp->time + 100 * THROW_CATCH_INTERVAL) {
        refill_juggle(mi);
   } else if (sp->time > 1<<30) { /* Hard Reset before the clock wraps */
-       release_juggle(mi);
        init_juggle(mi);
   }