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);

Reply via email to