X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fsballs.c;h=4c1ff9290ec8bee7a0941878f217bc9fc0316bfa;hb=39809ded547bdbb08207d3e514950425215b4410;hp=420a6a6173a2a68a27fc8a87c193c6dfe77b432b;hpb=6b1c86cf395f59389e4ece4ea8f4bea2c332745b;p=xscreensaver diff --git a/hacks/glx/sballs.c b/hacks/glx/sballs.c index 420a6a61..4c1ff929 100644 --- a/hacks/glx/sballs.c +++ b/hacks/glx/sballs.c @@ -47,7 +47,7 @@ static const char sccsid[] = "@(#)sballs.c 5.02 2001/03/10 xlockmore"; "*showFPS: False \n" \ "*wireframe: False \n" \ -# define refresh_sballs 0 +# define release_sballs 0 #define MODE_sballs #include "xlockmore.h" /* from the xscreensaver distribution */ #include "gltrackball.h" @@ -117,8 +117,8 @@ ENTRYPOINT ModeSpecOpt sballs_opts = #ifdef USE_MODULES ModStruct sballs_description = - { "sballs", "init_sballs", "draw_sballs", "release_sballs", - "draw_sballs", "change_sballs", (char *) NULL, &sballs_opts, + { "sballs", "init_sballs", "draw_sballs", NULL, + "draw_sballs", "change_sballs", "free_sballs", &sballs_opts, /* delay,count,cycles,size,ncolors,sat */ @@ -525,6 +525,12 @@ ENTRYPOINT void reshape_sballs(ModeInfo * mi, int width, int height) sb->WIDTH = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size; sb->HEIGHT = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size; } + + if (width > height * 5) { /* tiny window: show middle */ + sb->WIDTH = width; + sb->HEIGHT = sb->WIDTH*0.75; + } + glViewport((MI_WIDTH(mi) - sb->WIDTH) / 2, (MI_HEIGHT(mi) - sb->HEIGHT) / 2, sb->WIDTH, sb->HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -564,10 +570,19 @@ static void Draw(ModeInfo * mi) glColor3f(0, 0, 0); } glBegin(GL_QUAD_STRIP); +#ifndef HAVE_MOBILE + /* Letterbox the background image */ glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(8, 4.1, -4); glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(8, -4.1, -4); glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-8, 4.1, -4); glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-8, -4.1, -4); +#else + /* Fill the iPhone screen. Letterboxing looks dumb there. */ + glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(4, 5.2, -4); + glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(4, -5.2, -4); + glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-4, 5.2, -4); + glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-4, -5.2, -4); +#endif glEnd(); mi->polygon_count++; @@ -588,8 +603,8 @@ static void Draw(ModeInfo * mi) if (do_texture) #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, sb->faceid); -#endif /* HAVE_GLBINDTEXTURE */ else +#endif /* HAVE_GLBINDTEXTURE */ glEnable(GL_LIGHTING); for (sphere=0;spheretrackball = gltrackball_init (); + sb->trackball = gltrackball_init (True); if ((sb->glx_context = init_GL(mi)) != NULL) { @@ -747,33 +756,27 @@ ENTRYPOINT void draw_sballs(ModeInfo * mi) /* *----------------------------------------------------------------------------- * The display is being taken away from us. Free up malloc'ed - * memory and X resources that we've alloc'ed. Only called - * once, we must zap everything for every screen. + * memory and X resources that we've alloc'ed. *----------------------------------------------------------------------------- */ -ENTRYPOINT void release_sballs(ModeInfo * mi) +ENTRYPOINT void free_sballs(ModeInfo * mi) { - int screen; - - if (sballs != NULL) { - for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { - sballsstruct *sb = &sballs[screen]; - if (sb->btexture) - { - glDeleteTextures(1,&sb->backid); - XDestroyImage(sb->btexture); - } - if (sb->ftexture) - { - glDeleteTextures(1,&sb->faceid); - XDestroyImage(sb->ftexture); - } + sballsstruct *sb = &sballs[MI_SCREEN(mi)]; + if (sb->glx_context) + { + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sb->glx_context)); + if (sb->btexture) + { + glDeleteTextures(1,&sb->backid); + XDestroyImage(sb->btexture); + } + if (sb->ftexture) + { + glDeleteTextures(1,&sb->faceid); + XDestroyImage(sb->ftexture); } - (void) free((void *) sballs); - sballs = (sballsstruct *) NULL; } - FreeAllGL(mi); } ENTRYPOINT Bool @@ -781,39 +784,10 @@ sballs_handle_event (ModeInfo *mi, XEvent *event) { sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - if (event->xany.type == ButtonPress && - event->xbutton.button == Button1) - { - sb->button_down_p = True; - gltrackball_start (sb->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) - { - sb->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 (sb->trackball, event->xbutton.button, 5, - !!event->xbutton.state); - return True; - } - else if (event->xany.type == MotionNotify && - sb->button_down_p) - { - gltrackball_track (sb->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } + if (gltrackball_event_handler (event, sb->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &sb->button_down_p)) + return True; return False; }