Package: xscreensaver Version: 5.05-1 Followup-For: Bug #471920
Ok, I have narrowed down the bug to the new xinerama "sanity" code introduced in 5.05. I'm using the nvidia binary driver in "clone" mode (same picture displayed to two monitors). It seems that in this case, the nvidia driver reports two xinerama screens, and that check_xinerama_sanity() marks both of those screens as "insane" (one being detected as "enclosed" the other one as "duplicated"). The end result is that no usable screens are found, which obviously creates lots of problems for the rest of the code (in the previously submitted backtrace, a null screen pointer is passed to an xlib function). The bug does not occur if I disable "clone" mode and use only one monitor. A rough attempt at a fix is attached: while looping through available xinerama screens, if we do not find a "sane" one, we use the last one. It works for me(tm) although I have not tested it much.
--- xscreensaver.c.orig 2008-03-01 05:05:12.000000000 +0100 +++ xscreensaver.c 2008-03-22 09:26:39.000000000 +0100 @@ -899,7 +899,7 @@ check_xinerama_sanity (nscreens, si->prefs.verbose_p, xsi); for (i = 0; i < nscreens; i++) { - if (xsi[i].screen_number < 0) /* deemed insane */ + if (xsi[i].screen_number < 0 && i < nscreens-1) /* deemed insane */ continue; si->screens[j].x = xsi[i].x_org; si->screens[j].y = xsi[i].y_org;