X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fjuggler3d.c;h=031502912cc5584eede216f33ddf86bfec725e9c;hb=39809ded547bdbb08207d3e514950425215b4410;hp=02c1f179dddea37f648e4c69e1abd2e30f1b19d9;hpb=f8cf5ac7b2f53510f80a0eaf286a25298be17bfe;p=xscreensaver diff --git a/hacks/glx/juggler3d.c b/hacks/glx/juggler3d.c index 02c1f179..03150291 100644 --- a/hacks/glx/juggler3d.c +++ b/hacks/glx/juggler3d.c @@ -131,11 +131,11 @@ "*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))) @@ -144,7 +144,7 @@ #include "tube.h" #include "rotator.h" #include "gltrackball.h" -#include "glxfonts.h" +#include "texfont.h" #include #ifdef USE_GL /* whole file */ @@ -579,13 +579,7 @@ typedef struct { ObjType objtypes; Object *objects; struct patternindex patternindex; - -# ifdef HAVE_GLBITMAP - XFontStruct *mode_font; - GLuint font_dlist; -# else texture_font_data *font_data; -# endif } jugglestruct; static jugglestruct *juggles = (jugglestruct *) NULL; @@ -642,8 +636,10 @@ trajectory_destroy(Trajectory *t) { REMOVE(t); /* Unlink and free */ } -static void -free_juggle(jugglestruct *sp) { +ENTRYPOINT void +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); @@ -662,22 +658,17 @@ free_juggle(jugglestruct *sp) { free(sp->pattern); sp->pattern = NULL; } -# ifdef HAVE_GLBITMAP - if (sp->mode_font!=None) { - XFreeFontInfo(NULL,sp->mode_font,1); - sp->mode_font = None; - } -# endif /* HAVE_GLBITMAP */ } 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; @@ -699,7 +690,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; @@ -751,7 +741,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=' '; @@ -771,7 +761,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; } @@ -872,8 +862,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; @@ -918,7 +909,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; @@ -2104,8 +2095,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 +-+ @@ -2454,19 +2444,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 @@ -2583,7 +2560,7 @@ refill_juggle(ModeInfo * mi) name(sp); - if (!part(sp)) + if (!part(mi)) return; lob(mi); @@ -2593,7 +2570,7 @@ refill_juggle(ModeInfo * mi) positions(sp); if (!projectile(sp)) { - free_juggle(sp); + free_juggle(mi); return; } @@ -2658,24 +2635,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); 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); -# ifdef HAVE_GLBITMAP - load_font (mi->dpy, "titleFont", &sp->mode_font, &sp->font_dlist); -# else /* !HAVE_GLBITMAP */ sp->font_data = load_texture_font (mi->dpy, "titleFont"); -# endif /* !HAVE_GLBITMAP */ reshape_juggle (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */ @@ -2708,7 +2675,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, " ")) { @@ -2762,14 +2729,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; } @@ -2832,51 +2799,15 @@ juggle_handle_event (ModeInfo *mi, XEvent *event) { jugglestruct *sp = &juggles[MI_SCREEN(mi)]; - if (event->xany.type == ButtonPress && - event->xbutton.button == Button1) - { - sp->button_down_p = True; - gltrackball_start (sp->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) + 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 = False; + change_juggle (mi); 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; } @@ -2908,6 +2839,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); @@ -2919,7 +2851,6 @@ draw_juggle (ModeInfo *mi) (z - 0.5) * 15); gltrackball_rotate (sp->trackball); - glRotatef(current_device_rotation(), 0, 0, 1); get_rotation (sp->rot, &x, &y, &z, !sp->button_down_p); @@ -3062,15 +2993,10 @@ draw_juggle (ModeInfo *mi) } } - print_gl_string (mi->dpy, -# ifdef HAVE_GLBITMAP - sp->mode_font, sp->font_dlist, -# else /* !HAVE_GLBITMAP */ - sp->font_data, -# endif /* !HAVE_GLBITMAP */ - 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) @@ -3080,7 +3006,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); }