8222789: Replace the usage of "Sun's Xinerama API" by the "XFree86's Xinerama API" on Solaris

Reviewed-by: prr
This commit is contained in:
Sergey Bylokhov 2019-04-22 12:40:55 -07:00
parent c3b64599dc
commit 2c4624394e

@ -107,21 +107,9 @@ static char *x11GraphicsConfigClassName = "sun/awt/X11GraphicsConfig";
* pass the correct Display value, depending on the circumstances (a single
* X display, multiple X displays, or a single X display with multiple
* Xinerama screens).
*
* Solaris and Linux differ in the functions used to access Xinerama-related
* data. This is in part because at this time, the X consortium has not
* finalized the "official" Xinerama API. Once this spec is available, and
* both OSes are conformant, one code base should be sufficient for Xinerama
* 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;
@ -131,7 +119,6 @@ typedef struct {
} XineramaScreenInfo;
typedef XineramaScreenInfo* XineramaQueryScreensFunc(Display*, int*);
#endif
Bool usingXinerama = False;
XRectangle fbrects[MAXFRAMEBUFFERS];
@ -587,15 +574,30 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
}
#ifndef HEADLESS
#if defined(__linux__) || defined(MACOSX) || defined(_AIX)
static void xinerama_init_linux()
{
/*
* Checks if Xinerama is running and perform Xinerama-related initialization.
*/
static void xineramaInit(void) {
char* XinExtName = "XINERAMA";
int32_t major_opcode, first_event, first_error;
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) {
DTRACE_PRINTLN("Xinerama extension is not available");
return;
}
DTRACE_PRINTLN("Xinerama extension is available");
/* load library */
libHandle = dlopen(VERSIONED_JNI_LIB_NAME("Xinerama", "1"),
RTLD_LAZY | RTLD_GLOBAL);
@ -644,68 +646,6 @@ static void xinerama_init_linux()
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;
/* load and run XineramaGetInfo */
char* XineramaGetInfoName = "XineramaGetInfo";
XineramaGetInfoFunc* XineramaSolarisFunc = NULL;
/* load library */
libHandle = dlopen(JNI_LIB_NAME("Xext"), RTLD_LAZY | RTLD_GLOBAL);
if (libHandle != NULL) {
XineramaSolarisFunc = (XineramaGetInfoFunc*)dlsym(libHandle, XineramaGetInfoName);
if (XineramaSolarisFunc != NULL) {
DTRACE_PRINTLN("calling XineramaGetInfo func on Solaris");
if ((*XineramaSolarisFunc)(awt_display, 0, &fbrects[0],
&fbhints[0], &locNumScr) != 0 &&
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("calling XineramaGetInfo didn't work");
}
} else {
DTRACE_PRINTLN("couldn't load XineramaGetInfo symbol");
}
dlclose(libHandle);
} else {
DTRACE_PRINTLN1("\ncouldn't open shared library: %s\n", dlerror());
}
}
#endif
/*
* Checks if Xinerama is running and perform Xinerama-related
* platform dependent initialization.
*/
static void xineramaInit(void) {
char* XinExtName = "XINERAMA";
int32_t major_opcode, first_event, first_error;
Bool gotXinExt = False;
gotXinExt = XQueryExtension(awt_display, XinExtName, &major_opcode,
&first_event, &first_error);
if (!gotXinExt) {
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 *