Hi,

JFYI, I have developed preliminary version of the fix (some lines may be changed in final version because of possible conflicts with removing Motif-based AWT implementation)

But anyone who suffer from the problem can already use these changes.

Regards, Oleg.

+++ Makefile        2007-09-25 13:03:02.000000000 +0400
@@ -47,11 +47,10 @@
 AUTO_JAVA_PRUNE = WrapperGenerator.java

 LDFLAGS += -L$(OPENWIN_LIB)

 ifeq ($(PLATFORM), linux)
-FILES_c += Xinerama.c
 LDFLAGS += -lpthread
 dummy := $(shell $(MKDIR) -p $(LIB_LOCATION))
 endif

# Since this library will be living in a subdirectory below the other libraries
@@ -249,12 +248,10 @@
         fi
         @if [ "$(DOCOMPARE)$(suffix $@)" = "true.64" ]; then \
$(ECHO) COMPARING $@ and $(STORED_SIZES_TMPL_$(PLATFORM)_$(LIBARCH)); \
             $(DIFF) $@ $(STORED_SIZES_TMPL_$(PLATFORM)_$(LIBARCH)); \
         fi
-
-

 $(TEMPDIR)/.gen.wrappers: $(SIZES) $(WRAPPER_GENERATOR_CLASS) $(XLIBTYPES)
$(BOOT_JAVA_CMD) -cp $(WRAPPER_GENERATOR_TEMPDIR) WrapperGenerator \
             $(GEN_DIR) $(XLIBTYPES) "gen" $(WRAPPER_GENERATOR_DIR)/sizes

+++ mawt.gmk        2007-09-25 13:03:02.000000000 +0400
@@ -55,13 +55,10 @@
   FILES_c = $(FILES_MOTIF_c) $(FILES_NO_MOTIF_c)

   ifeq ($(MOTIF_VERSION), 2)
     FILES_c += awt_motif21.c
     FILES_c += awt_Choice21.c
-    ifeq  ($(PLATFORM), linux)
-        FILES_c += Xinerama.c
-    endif
   endif

 endif

 ifeq ($(PLATFORM), solaris)

+++ awt_GraphicsEnv.c        2007-09-25 13:06:28.000000000 +0400
@@ -30,10 +30,11 @@
 #include <sun_awt_X11GraphicsEnvironment.h>
 #include <sun_awt_X11GraphicsDevice.h>
 #include <sun_awt_X11GraphicsConfig.h>
 #ifndef HEADLESS
 #include <X11/extensions/Xdbe.h>
+#include <X11/XKBlib.h>
 #include "Xrandr.h"
 #include "GLXGraphicsConfig.h"
 #endif /* !HEADLESS */

 #include <jni.h>
@@ -56,11 +57,10 @@
 #endif

 #ifndef HEADLESS
 #ifdef __linux__
 #include <X11/XKBlib.h>
-#include "Xinerama.h"
 #endif

 int awt_numScreens;     /* Xinerama-aware number of screens */

 AwtScreenDataPtr x11Screens;
@@ -123,11 +123,22 @@
  * operation on both OSes.  Until then, some of the Xinerama-related code
  * is ifdef'd appropriately.  -bchristi, 7/12/01
  */

 #define MAXFRAMEBUFFERS 16
-#ifndef __linux__ /* SOLARIS */
+#ifdef __linux__
+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);
typedef Status XineramaGetCenterHintFunc(Display* display, int screen_number,
                                          int* x, int* y);
@@ -615,113 +626,128 @@
     if (largestAmtScr != wdata->screenNum) {
         wdata->screenNum = largestAmtScr;
         /* update peer, target Comp */
         (*env)->CallVoidMethod(env, peer,
mWindowPeerIDs.draggedToScreenMID, largestAmtScr);
-
     }
 #endif /* XAWT */
 }
 #endif /* HEADLESS */

-/*
- * Do Xinerama-related initialization such as
- * - check if Xinerama is running
- * - if so, load and run Xinerama query functions from the appropriate library
- */
 #ifndef HEADLESS
-void xineramaInit(void) {
 #ifdef __linux__
-    char* XinExtName = "XINERAMA";
-    int32_t major_opcode, first_event, first_error;
-    Bool gotXinExt = False;
-    unsigned char fbhints[MAXFRAMEBUFFERS];
+static void xinerama_init_linux()
+{
+    void* libHandle = 0;
+    char* XineramaLibName= "libXinerama.so";
     int32_t locNumScr = 0;
-    int32_t idx;
-
     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 available");
- DTRACE_PRINTLN("calling XineramaGetInfo func on Linux"); - xinInfo = XineramaQueryScreens(awt_display, &locNumScr);
-                    if (xinInfo != NULL) {
-                        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("calling XineramaQueryScreens didn't work");
-                    }
+    /* load library */
+    libHandle = dlopen(XineramaLibName, RTLD_LAZY | RTLD_GLOBAL);
+    if (libHandle != 0) {
+        XineramaQueryScreens = (XineramaQueryScreensFunc*)
+            dlsym(libHandle, XineramaQueryScreensName);
+
+        if (XineramaQueryScreens != NULL) {
+            DTRACE_PRINTLN("calling XineramaGetInfo func on Linux");
+            xinInfo = (*XineramaQueryScreens)(awt_display, &locNumScr);
+            if (xinInfo != NULL) {
+                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("calling XineramaQueryScreens didn't work");
+            }
+        } else {
+            DTRACE_PRINTLN("couldn't load XineramaQueryScreens symbol");
+        }
+        dlclose(libHandle);
     } else {
-        DTRACE_PRINTLN("Xinerama not available");
+        DTRACE_PRINTLN1("\ncouldn't open shared library: %s\n", dlerror());
     }
-
-#else /* Solaris */
-
-    char* XinExtName = "XINERAMA";
-    int32_t major_opcode, first_event, first_error;
-    Bool gotXinExt = False;
+}
+#endif
+#ifndef __linux__ /* Solaris */
+static void xinerama_init_solaris()
+{
     void* libHandle = 0;
-    unsigned char fbhints[MAXFRAMEBUFFERS];
-    int locNumScr = 0;
-
     char* XineramaLibName= "libXext.so";
+    unsigned char fbhints[MAXFRAMEBUFFERS];
+    int32_t locNumScr = 0;
+    /* load and run XineramaGetInfo */
     char* XineramaGetInfoName = "XineramaGetInfo";
     char* XineramaGetCenterHintName = "XineramaGetCenterHint";
     XineramaGetInfoFunc* XineramaSolarisFunc = NULL;

-    gotXinExt = XQueryExtension(awt_display, XinExtName, &major_opcode,
-                                &first_event, &first_error);
-
-    if (gotXinExt) {
-        DTRACE_PRINTLN("Xinerama extension available");
-
-        /* load library, load and run XineramaGetInfo */
-        libHandle = dlopen(XineramaLibName, RTLD_LAZY | RTLD_GLOBAL);
-        if (libHandle != 0) {
- XineramaSolarisFunc = (XineramaGetInfoFunc*)dlsym(libHandle, XineramaGetInfoName);
-            XineramaSolarisCenterFunc =
-             (XineramaGetCenterHintFunc*)dlsym(libHandle,
-                                               XineramaGetCenterHintName);
-            if (XineramaSolarisFunc != NULL) {
-                DTRACE_PRINTLN("calling XineramaGetInfo func on Solaris");
-                if ((*XineramaSolarisFunc)(awt_display, 0, &fbrects[0],
-                     &fbhints[0], &locNumScr) != 0) {
-
-                    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");
-                }
+    /* load library */
+    libHandle = dlopen(XineramaLibName, RTLD_LAZY | RTLD_GLOBAL);
+    if (libHandle != 0) {
+ XineramaSolarisFunc = (XineramaGetInfoFunc*)dlsym(libHandle, XineramaGetInfoName);
+        XineramaSolarisCenterFunc =
+ (XineramaGetCenterHintFunc*)dlsym(libHandle, XineramaGetCenterHintName);
+
+        if (XineramaSolarisFunc != NULL) {
+            DTRACE_PRINTLN("calling XineramaGetInfo func on Solaris");
+            if ((*XineramaSolarisFunc)(awt_display, 0, &fbrects[0],
+                                       &fbhints[0], &locNumScr) != 0)
+            {
+                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("couldn't load XineramaGetInfo symbol");
+                DTRACE_PRINTLN("calling XineramaGetInfo didn't work");
             }
-            dlclose(libHandle);
         } else {
- DTRACE_PRINTLN1("\ncouldn't open shared library: %s\n", dlerror());
+            DTRACE_PRINTLN("couldn't load XineramaGetInfo symbol");
         }
+        dlclose(libHandle);
     } else {
-        DTRACE_PRINTLN("Xinerama not available");
+        DTRACE_PRINTLN1("\ncouldn't open shared library: %s\n", dlerror());
     }
+}
+#endif
+
+/*
+ * Checks is 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 is not available");
+        return;
+    }
+
+    DTRACE_PRINTLN("Xinerama extension is available");
+#ifdef __linux__
+    xinerama_init_linux();
+#else /* Solaris */
+    xinerama_init_solaris();
 #endif /* __linux__ */
 }
 #endif /* HEADLESS */

 Display *
@@ -920,11 +946,11 @@
 Java_sun_awt_X11GraphicsDevice_getDisplay(JNIEnv *env, jobject this)
 {
 #ifdef HEADLESS
     return NULL;
 #else
-    return (jlong) awt_display;
+    return ptr_to_jlong(awt_display);
 #endif /* !HEADLESS */
 }

 #ifdef MITSHM

Reply via email to