提交 6db9f186 编写于 作者: T tdv

6636469: Java Fullscreen Exclusive Mode not working with Xorg server 1.3.0 and above

Summary: improve the check for full exclusive screen support by analyzing RANDR extension version
Reviewed-by: tdv, prr
Contributed-by: NDan Munckton <lists@munckfish.net>
上级 78a39de2
......@@ -1626,6 +1626,8 @@ Java_sun_awt_X11GraphicsEnvironment_getXineramaCenterPoint(JNIEnv *env,
#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,6 +1675,8 @@ static XRRSetScreenConfigAndRateType awt_XRRSetScreenConfigAndRate;
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,
......@@ -1679,6 +1684,41 @@ X11GD_InitXrandrFuncs(JNIEnv *env)
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);
LOAD_XRANDR_FUNC(XRRFreeScreenConfigInfo);
LOAD_XRANDR_FUNC(XRRConfigRates);
......@@ -1814,15 +1854,6 @@ Java_sun_awt_X11GraphicsDevice_initXrandrExtension
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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册