<AWT Dev> [OpenJDK 2D-Dev] [PATCH] 6636469: Java Fullscreen Exclusive Mode not working with Xorg server 1.3.0 and above
Phil Race
Phil.Race at Sun.COM
Sat Dec 8 12:05:40 PST 2007
Dan,
We can't take this fix as you have not signed the SCA and your name does not
appear here : https://sca.dev.java.net/CA_signatories.htm#m
-phil
Dan Munckton wrote:
> Hi Oleg, Dmitry, Yuri, all
>
> Please find attached my first attempt at fixing bug 6636469 [0].
>
>
> APPROACH
>
> The fix is really simple it just checks to make sure RANDR's version is
> 1.2 or greater if usingXinerama is true, if this is all fine it proceeds
> to load the libXrandr funcs.
>
> For the moment I've completely ignored 6599351, and not touched any of
> the Xinerama loading code at all.
>
> BTW I note that with 6599351 the user has an old style X dual-head
> config without using Xinerama - I found a note on the Debian Xrandr1.2
> Howto wiki page [1] explaining that this configuration should crash
> Xserver 1.3. Does it behave differently in Solaris X?
>
>
> TESTING
>
> The equipment I have here will allow me to test single monitor setups
> with X servers 1.2 and 1.3. Java now behaves as expected in the
> following cases:
>
> 1) Xserver 1.2 + 1 monitor + Xrandr
> Expect: isFullScreenSupported: true
> Result: PASS
>
> 2) Xserver 1.2 + 1 monitor + Xinerama enabled (Xinerama won't actually
> load but Xrandr and DRI won't load either)
> Expect: isFullScreenSupported: false
> Result: PASS
>
> 3) Xserver 1.3 + 1 monitor + Xrandr + fake Xinerama
> Expect: isFullScreenSupported: true
> Result: PASS
>
> 4) Xserver 1.3 + 1 monitor + Xinerama enabled (Xinerama won't actually
> load but Xrandr and DRI won't load either)
> Expect: isFullScreenSupported: false
> Result: PASS
>
>
> TESTING TODO
>
> I have an external LCD monitor at work which I can hook up to my laptop
> next week. This should allow me to test out Xrandr 1.2 multi-monitor
> setups. I'll post results as soon as complete.
>
> However I don't think I can test out Xinerama dual head configs. I tried
> to set this up once before but failed - I'm still not 100% certain if
> Xinerama is actually compiled into my X server I will need to check this
> out properly.
>
> If anyone here has a multi monitor setup already and would be prepared
> to help me test the following scenarios I'd be very grateful.
>
> 5) Xserver 1.2 + 2 monitor + Xinerama (Xrandr and DRI won't load)
> Expect: isFullScreenSupported: false
>
> 6) Xserver 1.3 + 2 monitors + Xinerama
> Expect: isFullScreenSupported: false
>
> I am also still to run the jtreg tests against this. I will come back
> with results.
>
> Also, do I need to mail both awt-dev and 2d-dev or will just one do in
> future?
>
> Cheers
>
> Dan
>
>
> [0] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6636469
> [1] Section VI.3 of http://wiki.debian.org/XStrikeForce/HowToRandR12
>
> ------------------------------------------------------------------------
>
> diff -r 99a06bc7fdb5 -r 7e529c4088cc src/solaris/native/sun/awt/awt_GraphicsEnv.c
> --- a/src/solaris/native/sun/awt/awt_GraphicsEnv.c Tue Dec 04 16:28:33 2007 -0800
> +++ b/src/solaris/native/sun/awt/awt_GraphicsEnv.c Sat Dec 08 13:29:25 2007 +0000
> @@ -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,37 @@ 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
> + * 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_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;
> + }
> }
>
> LOAD_XRANDR_FUNC(XRRGetScreenInfo);
> @@ -1814,15 +1843,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);
>
More information about the awt-dev
mailing list