< prev index next >
src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c
Print this page
*** 117,129 ****
short width;
short height;
} XineramaScreenInfo;
typedef XineramaScreenInfo* XineramaQueryScreensFunc(Display*, int*);
!
Bool usingXinerama = False;
- XRectangle fbrects[MAXFRAMEBUFFERS];
JNIEXPORT void JNICALL
Java_sun_awt_X11GraphicsConfig_initIDs (JNIEnv *env, jclass cls)
{
x11GraphicsConfigIDs.aData = NULL;
--- 117,128 ----
short width;
short height;
} XineramaScreenInfo;
typedef XineramaScreenInfo* XineramaQueryScreensFunc(Display*, int*);
! static XineramaQueryScreensFunc* XineramaQueryScreens = NULL;
Bool usingXinerama = False;
JNIEXPORT void JNICALL
Java_sun_awt_X11GraphicsConfig_initIDs (JNIEnv *env, jclass cls)
{
x11GraphicsConfigIDs.aData = NULL;
*** 584,594 ****
Bool gotXinExt = False;
void* libHandle = NULL;
int32_t locNumScr = 0;
XineramaScreenInfo *xinInfo;
char* XineramaQueryScreensName = "XineramaQueryScreens";
- XineramaQueryScreensFunc* XineramaQueryScreens = NULL;
gotXinExt = XQueryExtension(awt_display, XinExtName, &major_opcode,
&first_event, &first_error);
if (!gotXinExt) {
--- 583,592 ----
*** 610,649 ****
}
if (libHandle != NULL) {
XineramaQueryScreens = (XineramaQueryScreensFunc*)
dlsym(libHandle, XineramaQueryScreensName);
! if (XineramaQueryScreens != NULL) {
DTRACE_PRINTLN("calling XineramaQueryScreens func");
xinInfo = (*XineramaQueryScreens)(awt_display, &locNumScr);
! if (xinInfo != NULL && locNumScr > XScreenCount(awt_display)) {
! int32_t idx;
DTRACE_PRINTLN("Enabling Xinerama support");
usingXinerama = True;
/* set global number of screens */
DTRACE_PRINTLN1(" num screens = %i\n", locNumScr);
awt_numScreens = locNumScr;
-
- /* stuff values into fbrects */
- for (idx = 0; idx < awt_numScreens; idx++) {
- DASSERT(xinInfo[idx].screen_number == idx);
-
- fbrects[idx].width = xinInfo[idx].width;
- fbrects[idx].height = xinInfo[idx].height;
- fbrects[idx].x = xinInfo[idx].x_org;
- fbrects[idx].y = xinInfo[idx].y_org;
- }
} else {
! DTRACE_PRINTLN((xinInfo == NULL) ?
! "calling XineramaQueryScreens didn't work" :
! "XineramaQueryScreens <= XScreenCount"
! );
}
} else {
! DTRACE_PRINTLN("couldn't load XineramaQueryScreens symbol");
}
- dlclose(libHandle);
} else {
DTRACE_PRINTLN1("\ncouldn't open shared library: %s\n", dlerror());
}
}
#endif /* HEADLESS */
--- 608,638 ----
}
if (libHandle != NULL) {
XineramaQueryScreens = (XineramaQueryScreensFunc*)
dlsym(libHandle, XineramaQueryScreensName);
! if (XineramaQueryScreens == NULL) {
! DTRACE_PRINTLN("couldn't load XineramaQueryScreens symbol");
! dlclose(libHandle);
! } else {
DTRACE_PRINTLN("calling XineramaQueryScreens func");
xinInfo = (*XineramaQueryScreens)(awt_display, &locNumScr);
! if (xinInfo != NULL) {
! if (locNumScr > XScreenCount(awt_display)) {
DTRACE_PRINTLN("Enabling Xinerama support");
usingXinerama = True;
/* set global number of screens */
DTRACE_PRINTLN1(" num screens = %i\n", locNumScr);
awt_numScreens = locNumScr;
} else {
! DTRACE_PRINTLN("XineramaQueryScreens <= XScreenCount");
}
+ XFree(xinInfo);
} else {
! DTRACE_PRINTLN("calling XineramaQueryScreens didn't work");
! }
}
} else {
DTRACE_PRINTLN1("\ncouldn't open shared library: %s\n", dlerror());
}
}
#endif /* HEADLESS */
*** 1301,1331 ****
#else
jclass clazz;
jmethodID mid;
jobject bounds = NULL;
AwtGraphicsConfigDataPtr adata;
adata = (AwtGraphicsConfigDataPtr)
JNU_GetLongFieldAsPtr(env, this, x11GraphicsConfigIDs.aData);
clazz = (*env)->FindClass(env, "java/awt/Rectangle");
CHECK_NULL_RETURN(clazz, NULL);
mid = (*env)->GetMethodID(env, clazz, "<init>", "(IIII)V");
if (mid != NULL) {
if (usingXinerama) {
if (0 <= screen && screen < awt_numScreens) {
! bounds = (*env)->NewObject(env, clazz, mid, fbrects[screen].x,
! fbrects[screen].y,
! fbrects[screen].width,
! fbrects[screen].height);
} else {
jclass exceptionClass = (*env)->FindClass(env, "java/lang/IllegalArgumentException");
if (exceptionClass != NULL) {
(*env)->ThrowNew(env, exceptionClass, "Illegal screen index");
}
}
! } else {
XWindowAttributes xwa;
memset(&xwa, 0, sizeof(xwa));
AWT_LOCK ();
XGetWindowAttributes(awt_display,
--- 1290,1335 ----
#else
jclass clazz;
jmethodID mid;
jobject bounds = NULL;
AwtGraphicsConfigDataPtr adata;
+ int32_t locNumScr = 0;
+ XineramaScreenInfo *xinInfo;
adata = (AwtGraphicsConfigDataPtr)
JNU_GetLongFieldAsPtr(env, this, x11GraphicsConfigIDs.aData);
clazz = (*env)->FindClass(env, "java/awt/Rectangle");
CHECK_NULL_RETURN(clazz, NULL);
mid = (*env)->GetMethodID(env, clazz, "<init>", "(IIII)V");
if (mid != NULL) {
if (usingXinerama) {
if (0 <= screen && screen < awt_numScreens) {
! AWT_LOCK();
! xinInfo = (*XineramaQueryScreens)(awt_display, &locNumScr);
! AWT_UNLOCK();
! if (xinInfo != NULL && locNumScr > 0) {
! if (screen >= locNumScr) {
! screen = 0; // fallback to the main screen
! }
! DASSERT(xinInfo[screen].screen_number == screen);
! bounds = (*env)->NewObject(env, clazz, mid,
! xinInfo[screen].x_org,
! xinInfo[screen].y_org,
! xinInfo[screen].width,
! xinInfo[screen].height);
! XFree(xinInfo);
! }
} else {
jclass exceptionClass = (*env)->FindClass(env, "java/lang/IllegalArgumentException");
if (exceptionClass != NULL) {
(*env)->ThrowNew(env, exceptionClass, "Illegal screen index");
}
}
! }
! if (!bounds) {
! // Xinerama cannot provide correct bounds, will try X11
XWindowAttributes xwa;
memset(&xwa, 0, sizeof(xwa));
AWT_LOCK ();
XGetWindowAttributes(awt_display,
< prev index next >