File xscreensaver-slideshow-dri-detect.patch of Package xscreensaver
Index: hacks/glx/glslideshow.c
===================================================================
--- hacks/glx/glslideshow.c.orig 2011-09-28 22:34:41.000000000 +0200
+++ hacks/glx/glslideshow.c 2012-02-20 20:20:41.130046097 +0100
@@ -994,6 +994,29 @@ sanity_check (ModeInfo *mi)
else if (fps_cutoff > 30) fps_cutoff = 30;
}
+static void
+low_fps_mode(ModeInfo *mi)
+{
+ int i;
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+
+ zoom = 100;
+ fade_seconds = 0;
+
+ sanity_check (mi);
+
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ randomize_sprite (mi, sp);
+ sp->state = FULL;
+ }
+
+ ss->redisplay_needed_p = True;
+
+ /* Need this in case zoom changed. */
+ reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
+}
static void
check_fps (ModeInfo *mi)
@@ -1003,7 +1026,6 @@ check_fps (ModeInfo *mi)
slideshow_state *ss = &sss[MI_SCREEN(mi)];
double start_time, end_time, wall_elapsed, frame_duration, fps;
- int i;
start_time = ss->now;
end_time = double_time();
@@ -1034,22 +1056,7 @@ check_fps (ModeInfo *mi)
fprintf (stderr,
"%s: only %.1f fps! Turning off pan/fade to compensate...\n",
blurb(), fps);
- zoom = 100;
- fade_seconds = 0;
-
- sanity_check (mi);
-
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp = ss->sprites[i];
- randomize_sprite (mi, sp);
- sp->state = FULL;
- }
-
- ss->redisplay_needed_p = True;
-
- /* Need this in case zoom changed. */
- reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
+ low_fps_mode (mi);
#endif /* HAVE_COCOA */
}
@@ -1089,7 +1096,13 @@ init_slideshow (ModeInfo *mi)
ss = &sss[screen];
if ((ss->glx_context = init_GL(mi)) != NULL) {
- reshape_slideshow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (glXIsDirect (MI_DISPLAY(mi), *ss->glx_context) == True) {
+ reshape_slideshow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ low_fps_mode (mi);
+ }
+
} else {
MI_CLEARWINDOW(mi);
}