Hi
New patch attached with updates as requested.
Note that I have also moved the logic which ensures single screen only
configs within the "if (usingXinerama)" block below the RANDR version
check. I just feel this is tidier it means that the code path for users
of Xorg server 1.2 and below is exactly as before, and the patch then
only adds support for users of Xorg 1.3 and above and no more.
>
> I agree that it'll be hard to create a robust automated
> test for this bug (and there's plenty of manual tests
> already, adding a new one won't be of much benefit),
> so I suggest we skip on regression test for this one.
Ok fine.
One important thing I'd like to bring to your attention is this: so far
I've been testing FSEM mode using my employer's own fullscreen product
[0] and it's been working fine. Today I decided to check using the
DisplayModeTest example from the Java Fullscreen Exclusive Mode Tutorial
[1]. With this app on Xorg 1.3/RANDR 1.2, the mouse cursor is lost after
changing display mode. Sometimes it pops back after a short time, other
times I have to Alt+Tab out and back in to get it back.
So far I've tried explicitly resetting the cursor
(this.setCursor(Cursor.getDefaultCursor()) and adding an extra sync
(Toolkit.getDefaultToolkit().sync()) when the mode changes but neither
of these helped any.
I'll see if I can find out more, but would welcome any suggestions as to
why this may be.
Is there a schedule available on the planned dates of Java 6 updates or
OpenJDK promotions/builds? I'm sure someone else asked this question and
was directed to the mail archives but I couldn't find a mail with the
details.
Cheers
Dan
[0] http://www.inquizitor.com/
[1]
http://java.sun.com/docs/books/tutorial/extra/fullscreen/example-1dot4/DisplayModeTest.java
diff --git a/src/solaris/native/sun/awt/awt_GraphicsEnv.c b/src/solaris/native/sun/awt/awt_GraphicsEnv.c
--- a/src/solaris/native/sun/awt/awt_GraphicsEnv.c
+++ b/src/solaris/native/sun/awt/awt_GraphicsEnv.c
@@ -1626,6 +1626,8 @@ Java_sun_awt_X11GraphicsEnvironment_getX
#define BIT_DEPTH_MULTI java_awt_DisplayMode_BIT_DEPTH_MULTI
+typedef Status
+ (*XRRQueryVersionType) (Display *dpy, int *major_versionp, int *minor_versionp);
typedef XRRScreenConfiguration*
(*XRRGetScreenInfoType)(Display *dpy, Drawable root);
typedef void
@@ -1650,6 +1652,7 @@ typedef Status
short rate,
Time timestamp);
+static XRRQueryVersionType awt_XRRQueryVersion;
static XRRGetScreenInfoType awt_XRRGetScreenInfo;
static XRRFreeScreenConfigInfoType awt_XRRFreeScreenConfigInfo;
static XRRConfigRatesType awt_XRRConfigRates;
@@ -1672,11 +1675,48 @@ static jboolean
static jboolean
X11GD_InitXrandrFuncs(JNIEnv *env)
{
+ int rr_maj_ver = 0, rr_min_ver = 0;
+
void *pLibRandR = dlopen("libXrandr.so.2", RTLD_LAZY | RTLD_LOCAL);
if (pLibRandR == NULL) {
J2dRlsTraceLn(J2D_TRACE_ERROR,
"X11GD_InitXrandrFuncs: Could not open libXrandr.so.2");
return JNI_FALSE;
+ }
+
+ LOAD_XRANDR_FUNC(XRRQueryVersion);
+
+ if (!(*awt_XRRQueryVersion)(awt_display, &rr_maj_ver, &rr_min_ver)) {
+ J2dRlsTraceLn(J2D_TRACE_ERROR,
+ "X11GD_InitXrandrFuncs: XRRQueryVersion returned an error status");
+ dlclose(pLibRandR);
+ return JNI_FALSE;
+ }
+
+ if (usingXinerama) {
+ /*
+ * We can proceed as long as this is RANDR 1.2 or above.
+ * As of Xorg server 1.3 onwards the Xinerama backend may actually be
+ * a fake one provided by RANDR itself. See Java bug 6636469 for info.
+ */
+ if (!(rr_maj_ver > 1 || (rr_maj_ver == 1 && rr_min_ver >= 2))) {
+ J2dRlsTraceLn2(J2D_TRACE_INFO, "X11GD_InitXrandrFuncs: Can't use Xrandr. "
+ "Xinerama is active and Xrandr version is %d.%d",
+ rr_maj_ver, rr_min_ver);
+ dlclose(pLibRandR);
+ return JNI_FALSE;
+ }
+
+ /*
+ * REMIND: Fullscreen mode doesn't work quite right with multi-monitor
+ * setups and RANDR 1.2. So for now we also require a single screen.
+ */
+ if (awt_numScreens > 1 ) {
+ J2dRlsTraceLn(J2D_TRACE_INFO, "X11GD_InitXrandrFuncs: Can't use Xrandr. "
+ "Multiple screens in use");
+ dlclose(pLibRandR);
+ return JNI_FALSE;
+ }
}
LOAD_XRANDR_FUNC(XRRGetScreenInfo);
@@ -1814,15 +1854,6 @@ Java_sun_awt_X11GraphicsDevice_initXrand
int opcode = 0, firstEvent = 0, firstError = 0;
jboolean ret;
- if (usingXinerama) {
- /*
- * REMIND: we'll just punt if Xinerama is enabled; we can remove this
- * restriction in the future if we find Xinerama and XRandR playing
- * well together...
- */
- return JNI_FALSE;
- }
-
AWT_LOCK();
ret = (jboolean)XQueryExtension(awt_display, "RANDR",
&opcode, &firstEvent, &firstError);