#ifdef STANDALONE
# define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n"
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
-# define refresh_surface 0
+# define free_surface 0
+# define release_surface 0
# include "xlockmore.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
/* new window size or exposure */
ENTRYPOINT void reshape_surface(ModeInfo *mi, int width, int height)
{
+ surfacestruct *sp = &surface[MI_SCREEN(mi)];
GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
- glViewport(0, 0, (GLint) width, (GLint) height);
+ glViewport(0, y, (GLint) width, (GLint) height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective (30.0, 1/h, 1.0, 100.0);
glLoadIdentity();
gluLookAt(0.0, 0.0, 30.0, 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);
}
{
surfacestruct *sp = &surface[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)
- {
- 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));
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
return True;
- }
return False;
}
int screen = MI_SCREEN(mi);
surfacestruct *sp;
- if (surface == NULL)
- {
- if ((surface = (surfacestruct *) calloc(MI_NUM_SCREENS(mi),
- sizeof(surfacestruct))) == NULL)
- return;
- }
+ MI_INIT (mi, surface);
sp = &surface[screen];
sp->window = MI_WINDOW(mi);
1.0,
do_wander ? wander_speed : 0,
True);
- sp->trackball = gltrackball_init ();
+ sp->trackball = gltrackball_init (True);
}
if (!strcasecmp(surface_type,"random"))
}
-ENTRYPOINT void release_surface(ModeInfo * mi)
-{
- if (surface != NULL)
- {
- int screen;
-
- for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
- {
- surfacestruct *sp = &surface[screen];
-
- if (sp->glx_context)
- {
- /* Display lists MUST be freed while their glXContext is current. */
- glXMakeCurrent(MI_DISPLAY(mi), sp->window, *(sp->glx_context));
- }
- }
- (void) free((void *)surface);
- surface = NULL;
- }
- FreeAllGL(mi);
-}
-
-
XSCREENSAVER_MODULE_2("Surfaces", surfaces, surface)
#endif