< prev index next >
src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c
Print this page
rev 54264 : 8220528: [AIX] Fix basic Xinerama and Xrender functionality
Reviewed-by: clanger, stuefe
*** 120,144 ****
* operation on both OSes. Until then, some of the Xinerama-related code
* is ifdef'd appropriately. -bchristi, 7/12/01
*/
#define MAXFRAMEBUFFERS 16
! #if defined(__linux__) || defined(MACOSX)
typedef struct {
int screen_number;
short x_org;
short y_org;
short width;
short height;
} XineramaScreenInfo;
typedef XineramaScreenInfo* XineramaQueryScreensFunc(Display*, int*);
-
- #else /* SOLARIS */
- typedef Status XineramaGetInfoFunc(Display* display, int screen_number,
- XRectangle* framebuffer_rects, unsigned char* framebuffer_hints,
- int* num_framebuffers);
#endif
Bool usingXinerama = False;
XRectangle fbrects[MAXFRAMEBUFFERS];
--- 120,143 ----
* operation on both OSes. Until then, some of the Xinerama-related code
* is ifdef'd appropriately. -bchristi, 7/12/01
*/
#define MAXFRAMEBUFFERS 16
! #if defined(__solaris__)
! typedef Status XineramaGetInfoFunc(Display* display, int screen_number,
! XRectangle* framebuffer_rects, unsigned char* framebuffer_hints,
! int* num_framebuffers);
! #else /* Linux, Mac, AIX */
typedef struct {
int screen_number;
short x_org;
short y_org;
short width;
short height;
} XineramaScreenInfo;
typedef XineramaScreenInfo* XineramaQueryScreensFunc(Display*, int*);
#endif
Bool usingXinerama = False;
XRectangle fbrects[MAXFRAMEBUFFERS];
*** 423,432 ****
--- 422,432 ----
// Only use the RENDER extension if it is available on the X server
if (XQueryExtension(awt_display, "RENDER",
&major_opcode, &first_event, &first_error))
{
+ DTRACE_PRINTLN("RENDER extension available");
xrenderLibHandle = dlopen("libXrender.so.1", RTLD_LAZY | RTLD_GLOBAL);
#ifdef MACOSX
#define XRENDER_LIB "/usr/X11/lib/libXrender.dylib"
#else
*** 436,457 ****
if (xrenderLibHandle == NULL) {
xrenderLibHandle = dlopen(XRENDER_LIB,
RTLD_LAZY | RTLD_GLOBAL);
}
! #ifndef __linux__ /* SOLARIS */
if (xrenderLibHandle == NULL) {
xrenderLibHandle = dlopen("/usr/lib/libXrender.so.1",
RTLD_LAZY | RTLD_GLOBAL);
}
#endif
-
if (xrenderLibHandle != NULL) {
xrenderFindVisualFormat =
(XRenderFindVisualFormatFunc*)dlsym(xrenderLibHandle,
"XRenderFindVisualFormat");
}
}
for (i = 0; i < nTrue; i++) {
if (XVisualIDFromVisual(pVITrue[i].visual) ==
XVisualIDFromVisual(defaultConfig->awt_visInfo.visual) ||
--- 436,469 ----
if (xrenderLibHandle == NULL) {
xrenderLibHandle = dlopen(XRENDER_LIB,
RTLD_LAZY | RTLD_GLOBAL);
}
! #if defined(__solaris__)
if (xrenderLibHandle == NULL) {
xrenderLibHandle = dlopen("/usr/lib/libXrender.so.1",
RTLD_LAZY | RTLD_GLOBAL);
}
+ #elif defined(_AIX)
+ if (xrenderLibHandle == NULL) {
+ xrenderLibHandle = dlopen("libXrender.a(libXrender.so.0)",
+ RTLD_MEMBER | RTLD_LAZY | RTLD_GLOBAL);
+ }
#endif
if (xrenderLibHandle != NULL) {
+ DTRACE_PRINTLN("Loaded libXrender");
xrenderFindVisualFormat =
(XRenderFindVisualFormatFunc*)dlsym(xrenderLibHandle,
"XRenderFindVisualFormat");
+ if (xrenderFindVisualFormat == NULL) {
+ DTRACE_PRINTLN1("Can't find 'XRenderFindVisualFormat' in libXrender (%s)", dlerror());
}
+ } else {
+ DTRACE_PRINTLN1("Can't load libXrender (%s)", dlerror());
+ }
+ } else {
+ DTRACE_PRINTLN("RENDER extension NOT available");
}
for (i = 0; i < nTrue; i++) {
if (XVisualIDFromVisual(pVITrue[i].visual) ==
XVisualIDFromVisual(defaultConfig->awt_visInfo.visual) ||
*** 470,482 ****
--- 482,499 ----
pVITrue [i].visual);
if (format &&
format->type == PictTypeDirect &&
format->direct.alphaMask)
{
+ DTRACE_PRINTLN1("GraphicsConfig[%d] supports Translucency", ind);
graphicsConfigs [ind]->isTranslucencySupported = 1;
memcpy(&graphicsConfigs [ind]->renderPictFormat, format,
sizeof(*format));
+ } else {
+ DTRACE_PRINTLN1(format ?
+ "GraphicsConfig[%d] has no Translucency support" :
+ "Error calling 'XRenderFindVisualFormat'", ind);
}
}
}
if (xrenderLibHandle != NULL) {
*** 580,590 ****
AWT_UNLOCK ();
}
#ifndef HEADLESS
! #if defined(__linux__) || defined(MACOSX)
static void xinerama_init_linux()
{
void* libHandle = NULL;
int32_t locNumScr = 0;
XineramaScreenInfo *xinInfo;
--- 597,607 ----
AWT_UNLOCK ();
}
#ifndef HEADLESS
! #if defined(__linux__) || defined(MACOSX) || defined(_AIX)
static void xinerama_init_linux()
{
void* libHandle = NULL;
int32_t locNumScr = 0;
XineramaScreenInfo *xinInfo;
*** 593,610 ****
/* load library */
libHandle = dlopen(VERSIONED_JNI_LIB_NAME("Xinerama", "1"),
RTLD_LAZY | RTLD_GLOBAL);
if (libHandle == NULL) {
libHandle = dlopen(JNI_LIB_NAME("Xinerama"), RTLD_LAZY | RTLD_GLOBAL);
}
if (libHandle != NULL) {
XineramaQueryScreens = (XineramaQueryScreensFunc*)
dlsym(libHandle, XineramaQueryScreensName);
if (XineramaQueryScreens != NULL) {
! DTRACE_PRINTLN("calling XineramaQueryScreens func on Linux");
xinInfo = (*XineramaQueryScreens)(awt_display, &locNumScr);
if (xinInfo != NULL && locNumScr > XScreenCount(awt_display)) {
int32_t idx;
DTRACE_PRINTLN("Enabling Xinerama support");
usingXinerama = True;
--- 610,631 ----
/* load library */
libHandle = dlopen(VERSIONED_JNI_LIB_NAME("Xinerama", "1"),
RTLD_LAZY | RTLD_GLOBAL);
if (libHandle == NULL) {
+ #if defined(_AIX)
+ libHandle = dlopen("libXext.a(shr_64.o)", RTLD_MEMBER | RTLD_LAZY | RTLD_GLOBAL);
+ #else
libHandle = dlopen(JNI_LIB_NAME("Xinerama"), RTLD_LAZY | RTLD_GLOBAL);
+ #endif
}
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;
*** 620,641 ****
fbrects[idx].height = xinInfo[idx].height;
fbrects[idx].x = xinInfo[idx].x_org;
fbrects[idx].y = xinInfo[idx].y_org;
}
} else {
! DTRACE_PRINTLN("calling XineramaQueryScreens didn't work");
}
} else {
DTRACE_PRINTLN("couldn't load XineramaQueryScreens symbol");
}
dlclose(libHandle);
} else {
DTRACE_PRINTLN1("\ncouldn't open shared library: %s\n", dlerror());
}
}
! #endif
! #if !defined(__linux__) && !defined(MACOSX) /* Solaris */
static void xinerama_init_solaris()
{
void* libHandle = NULL;
unsigned char fbhints[MAXFRAMEBUFFERS];
int32_t locNumScr = 0;
--- 641,664 ----
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());
}
}
! #elif defined(__solaris__)
static void xinerama_init_solaris()
{
void* libHandle = NULL;
unsigned char fbhints[MAXFRAMEBUFFERS];
int32_t locNumScr = 0;
*** 687,701 ****
DTRACE_PRINTLN("Xinerama extension is not available");
return;
}
DTRACE_PRINTLN("Xinerama extension is available");
! #if defined(__linux__) || defined(MACOSX)
! xinerama_init_linux();
! #else /* Solaris */
xinerama_init_solaris();
! #endif /* __linux__ || MACOSX */
}
#endif /* HEADLESS */
Display *
awt_init_Display(JNIEnv *env, jobject this)
--- 710,724 ----
DTRACE_PRINTLN("Xinerama extension is not available");
return;
}
DTRACE_PRINTLN("Xinerama extension is available");
! #if defined(__solaris__)
xinerama_init_solaris();
! #else /* Linux, Mac, AIX */
! xinerama_init_linux();
! #endif
}
#endif /* HEADLESS */
Display *
awt_init_Display(JNIEnv *env, jobject this)
< prev index next >