X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fhypnowheel.c;h=0602e6e4e423970125bb7a3afa06255f9ca6f29d;hb=39809ded547bdbb08207d3e514950425215b4410;hp=3131a9fce80331144088d5fbb522b18d167c2b11;hpb=7b34ef992563d7bcbb64cc5597dc45fa24470b05;p=xscreensaver diff --git a/hacks/glx/hypnowheel.c b/hacks/glx/hypnowheel.c index 3131a9fc..0602e6e4 100644 --- a/hacks/glx/hypnowheel.c +++ b/hacks/glx/hypnowheel.c @@ -22,10 +22,10 @@ "*showFPS: False \n" \ "*fpsSolid: True \n" \ "*wireframe: False \n" \ + "*suppressRotationAnimation: True\n" \ -# define refresh_hypnowheel 0 +# define free_hypnowheel 0 # define release_hypnowheel 0 -# define hypnowheel_handle_event 0 #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -137,8 +137,15 @@ ENTRYPOINT void reshape_hypnowheel (ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; - glViewport (0, 0, (GLint) width, (GLint) height); + if (width > height * 3) { /* tiny window: show middle */ + height = width; + y = -height/2; + h = height / (GLfloat) width; + } + + glViewport (0, y, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -150,6 +157,14 @@ reshape_hypnowheel (ModeInfo *mi, int width, int height) 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); +# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */ + { + int o = (int) current_device_rotation(); + if (o != 0 && o != 180 && o != -180) + glScalef (1/h, 1/h, 1/h); + } +# endif + glClear(GL_COLOR_BUFFER_BIT); } @@ -161,14 +176,7 @@ init_hypnowheel (ModeInfo *mi) int wire = MI_IS_WIREFRAME(mi); int i; - if (!bps) { - bps = (hypnowheel_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (hypnowheel_configuration)); - if (!bps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - } + MI_INIT (mi, bps); bp = &bps[MI_SCREEN(mi)]; @@ -176,17 +184,20 @@ init_hypnowheel (ModeInfo *mi) reshape_hypnowheel (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); - bp->rot = make_rotator (0, 0, 0, 0, speed * 0.0025, False); + if (! bp->rot) + bp->rot = make_rotator (0, 0, 0, 0, speed * 0.0025, False); bp->ncolors = 1024; - bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor)); + if (!bp->colors) + bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor)); make_smooth_colormap (0, 0, 0, bp->colors, &bp->ncolors, False, 0, False); if (MI_COUNT(mi) < 2) MI_COUNT(mi) = 2; if (nlayers < 1) nlayers = 1; - bp->discs = (disc *) calloc (nlayers, sizeof (disc)); + if (!bp->discs) + bp->discs = (disc *) calloc (nlayers, sizeof (disc)); for (i = 0; i < nlayers; i++) { @@ -201,6 +212,7 @@ init_hypnowheel (ModeInfo *mi) spin_speed += frand (spin_speed / 5); wander_speed += frand (wander_speed * 3); + if (!bp->discs[i].rot) bp->discs[i].rot = make_rotator (spin_speed, spin_speed, spin_speed, spin_accel, (do_wander ? wander_speed : 0), @@ -293,6 +305,18 @@ draw_hypnowheel (ModeInfo *mi) glXSwapBuffers(dpy, window); } +ENTRYPOINT Bool +hypnowheel_handle_event (ModeInfo *mi, XEvent *event) +{ + if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event)) + { + init_hypnowheel (mi); + return True; + } + return False; +} + + XSCREENSAVER_MODULE ("Hypnowheel", hypnowheel) #endif /* USE_GL */