From b7407c39c0d3785f2fc21782d31c439622f0d744 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Mon, 27 Feb 2012 18:20:37 +0100
Subject: NativeWindow: Relax Xinerama dependency / Rename Windows impl
 subfolder to common name win32 (same as stub_include)

Utilizing dlopen/dlsym in an efficient way relaxes the platform requirement of having Xinerama available.
This allows using Nokia N9 MeeGo out of the box.
---
 make/build-nativewindow.xml                        |  23 +--
 make/config/nativewindow/x11-lib.cfg               |   2 +
 make/scripts/tests.sh                              |   2 +-
 make/stub_includes/x11/window-lib.c                |   5 +-
 .../media/nativewindow/x11/X11GraphicsScreen.java  |   3 +-
 .../classes/jogamp/nativewindow/x11/X11Util.java   |  32 +++
 src/nativewindow/native/win32/GDImisc.c            | 226 +++++++++++++++++++++
 src/nativewindow/native/win32/WindowsDWM.c         |  95 +++++++++
 src/nativewindow/native/win32/WindowsDWM.h         |  32 +++
 src/nativewindow/native/windows/GDImisc.c          | 226 ---------------------
 src/nativewindow/native/windows/WindowsDWM.c       |  95 ---------
 src/nativewindow/native/windows/WindowsDWM.h       |  32 ---
 src/nativewindow/native/x11/XineramaHelper.c       | 202 ++++++++++--------
 src/nativewindow/native/x11/XineramaHelper.h       |  40 ++++
 src/nativewindow/native/x11/Xmisc.c                |   3 -
 .../classes/jogamp/newt/driver/x11/X11Screen.java  |   2 +-
 16 files changed, 554 insertions(+), 466 deletions(-)
 create mode 100644 src/nativewindow/native/win32/GDImisc.c
 create mode 100644 src/nativewindow/native/win32/WindowsDWM.c
 create mode 100644 src/nativewindow/native/win32/WindowsDWM.h
 delete mode 100644 src/nativewindow/native/windows/GDImisc.c
 delete mode 100644 src/nativewindow/native/windows/WindowsDWM.c
 delete mode 100644 src/nativewindow/native/windows/WindowsDWM.h
 create mode 100644 src/nativewindow/native/x11/XineramaHelper.h

diff --git a/make/build-nativewindow.xml b/make/build-nativewindow.xml
index 40fd24def..c66a92d09 100644
--- a/make/build-nativewindow.xml
+++ b/make/build-nativewindow.xml
@@ -227,7 +227,7 @@
                  outputRootDir="${build.nativewindow}"
                  config="${windowlib.os.cfg}"
                  includeRefid="stub.includes.fileset.platform"
-                 literalInclude="${stub.includes.gluegen.gg}"
+                 literalInclude="${stub.includes.gluegen.gg}, ${src.c}/${window.os.system}"
                  emitter="com.jogamp.gluegen.JavaEmitter"
                  debug="false"
                  dumpCPP="false">
@@ -372,42 +372,36 @@
       <linker id="linker.cfg.freebsd.nativewindow.x11" extends="linker.cfg.freebsd">
         <syslibset dir="/usr/local/lib" libs="X11"/>
         <syslibset dir="/usr/local/lib" libs="Xxf86vm" />
-        <syslibset dir="/usr/local/lib" libs="Xinerama"/>
         <syslibset dir="/usr/local/lib" libs="Xrender"/>
       </linker>
 
       <linker id="linker.cfg.freebsd.amd64.nativewindow.x11" extends="linker.cfg.freebsd.amd64">
         <syslibset dir="/usr/local/lib" libs="X11" />
         <syslibset dir="/usr/local/lib" libs="Xxf86vm" />
-        <syslibset dir="/usr/local/lib" libs="Xinerama"/>
         <syslibset dir="/usr/local/lib" libs="Xrender"/>
       </linker>
 
       <linker id="linker.cfg.linux.nativewindow.x11" extends="linker.cfg.linux">
         <syslibset libs="X11"/>
         <syslibset libs="Xxf86vm" />
-        <syslibset libs="Xinerama"/>
         <syslibset libs="Xrender"/>
       </linker>
 
       <linker id="linker.cfg.linux.x86.nativewindow.x11" extends="linker.cfg.linux.x86">
         <syslibset libs="X11"/>
         <syslibset libs="Xxf86vm" />
-        <syslibset libs="Xinerama"/>
         <syslibset libs="Xrender"/>
       </linker>
 
       <linker id="linker.cfg.linux.amd64.nativewindow.x11" extends="linker.cfg.linux.amd64">
         <syslibset libs="X11"/>
         <syslibset libs="Xxf86vm" />
-        <syslibset libs="Xinerama"/>
         <syslibset libs="Xrender"/>
       </linker>
 
       <linker id="linker.cfg.linux.armv7.nativewindow.x11" extends="linker.cfg.linux.armv7">
         <syslibset dir="${env.TARGET_PLATFORM_LIBS}" libs="X11" />
         <syslibset dir="${env.TARGET_PLATFORM_LIBS}" libs="Xxf86vm" />
-        <syslibset dir="${env.TARGET_PLATFORM_LIBS}" libs="Xinerama" />
         <syslibset dir="${env.TARGET_PLATFORM_LIBS}" libs="Xrender" />
       </linker>
 
@@ -415,9 +409,7 @@
         <linkerarg value="-L/usr/sfw/lib"/>
         <syslibset libs="X11"/>
         <syslibset libs="Xxf86vm" />
-        <syslibset libs="Xinerama"/>
         <syslibset libs="Xrender"/>
-        <syslibset libs="X11"/>
       </linker>
 
       <linker id="linker.cfg.solaris.sparcv9.nativewindow.x11" extends="linker.cfg.solaris.sparcv9">
@@ -425,9 +417,7 @@
         <linkerarg value="-L/usr/sfw/lib/sparcv9"/>
         <syslibset libs="X11"/>
         <syslibset libs="Xxf86vm" />
-        <syslibset libs="Xinerama"/>
         <syslibset libs="Xrender"/>
-        <syslibset libs="X11"/>
       </linker>
 
       <linker id="linker.cfg.solaris.amd64.nativewindow.x11" extends="linker.cfg.solaris.amd64">
@@ -435,9 +425,7 @@
         <linkerarg value="-L/usr/sfw/lib/amd64"/>
         <syslibset libs="X11"/>
         <syslibset libs="Xxf86vm" />
-        <syslibset libs="Xinerama"/>
         <syslibset libs="Xrender"/>
-        <syslibset libs="X11"/>
       </linker>
 
       <linker id="linker.cfg.win32.mingw.nativewindow" extends="linker.cfg.win32.mingw">
@@ -468,7 +456,7 @@
 
       <linker id="linker.cfg.hpux.nativewindow" extends="linker.cfg.hpux">
         <syslibset dir="/usr/lib" libs="X11"/>
-        <syslibset dir="/usr/lib" libs="Xinerama"/>
+        <syslibset dir="/usr/lib" libs="Xrender"/>
       </linker>
     </target>
 
@@ -665,8 +653,8 @@
 
         <patternset id="c.src.files.windows">
           <include name="${rootrel.generated.c}/Windows/GDI*.c"/>
-          <include name="${rootrel.src.c}/windows/GDImisc.c"/>
-          <include name="${rootrel.src.c}/windows/WindowsDWM.c"/>
+          <include name="${rootrel.src.c}/win32/GDImisc.c"/>
+          <include name="${rootrel.src.c}/win32/WindowsDWM.c"/>
           <include name="${rootrel.src.c}/NativewindowCommon.c"/>
         </patternset>
 
@@ -710,7 +698,8 @@
                 <includepath path="${src.generated.c}/X11"     if="isX11"/>
                 <includepath path="${src.generated.c}/MacOSX"  if="isOSX"/>
                 <includepath path="${src.generated.c}/Windows" if="isWindows"/>
-                <includepath path="${src.c}/windows"           if="isWindows"/>
+                <includepath path="${src.c}/win32"             if="isWindows"/>
+                <includepath path="${src.c}/x11"               if="isX11"/>
                 <includepath path="${src.c}"/>
       
                 <!-- This must come last to not override real include paths -->
diff --git a/make/config/nativewindow/x11-lib.cfg b/make/config/nativewindow/x11-lib.cfg
index 2fe45cf12..ed8c13b54 100644
--- a/make/config/nativewindow/x11-lib.cfg
+++ b/make/config/nativewindow/x11-lib.cfg
@@ -21,6 +21,7 @@ Opaque long Display *
 Opaque boolean Bool
 Opaque long GLXFBConfig
 Opaque long Visual *
+Opaque long void *
 
 IncludeAs CustomJavaCode X11Lib x11-CustomJavaCode.java
 
@@ -46,4 +47,5 @@ CustomCCode #include <gluegen_stddef.h>
 CustomCCode #include <X11/Xlib.h>
 CustomCCode #include <X11/Xutil.h>
 CustomCCode #include <X11/extensions/Xrender.h>
+CustomCCode #include <XineramaHelper.h>
 
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh
index 8a861679f..c2905ea2e 100755
--- a/make/scripts/tests.sh
+++ b/make/scripts/tests.sh
@@ -50,7 +50,7 @@ function jrun() {
     swton=$1
     shift
 
-    D_ARGS="-Dnewt.test.Screen.disableScreenMode -Dnewt.debug.Screen"
+    #D_ARGS="-Dnewt.test.Screen.disableScreenMode -Dnewt.debug.Screen"
     #D_ARGS="-Djogl.debug.ExtensionAvailabilityCache -Djogl.debug=all -Dnativewindow.debug=all -Djogamp.debug.ProcAddressHelper=true -Djogamp.debug.NativeLibrary=true -Djogamp.debug.NativeLibrary.Lookup=true"
     #D_ARGS="-Djogamp.debug=all -Dnativewindow.debug=all -Djogl.debug=all -Dnewt.debug=all"
     #D_ARGS="-Dnewt.debug.MainThread"
diff --git a/make/stub_includes/x11/window-lib.c b/make/stub_includes/x11/window-lib.c
index 7b6da3c65..bc5df4ae4 100644
--- a/make/stub_includes/x11/window-lib.c
+++ b/make/stub_includes/x11/window-lib.c
@@ -8,6 +8,8 @@
 #define _Xconst const
 #endif /* _Xconst */
 
+#include <XineramaHelper.h>
+
 extern intptr_t XSynchronize(Display *display, Bool onoff);
 
 extern int XFlush(Display *display);
@@ -52,9 +54,6 @@ extern int XFree(
     void*		/* data */
 );
 
-// Helper routine for querying whether Xinerama is enabled.
-Bool XineramaEnabled(Display* display);
-
 // Routines for changing gamma settings.
 // Note that these are not currently supported on Solaris.
 Bool XF86VidModeGetGammaRampSize(
diff --git a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java
index 6473b9f67..ed59861ca 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java
@@ -65,8 +65,7 @@ public class X11GraphicsScreen extends DefaultGraphicsScreen implements Cloneabl
 
     private static int fetchScreen(X11GraphicsDevice device, int screen) {
         // It still could be an AWT hold handle ..
-        long display = device.getHandle();
-        if(X11Lib.XineramaEnabled(display)) {
+        if(X11Util.XineramaIsEnabled(device.getHandle())) {
             screen = 0; // Xinerama -> 1 screen
         }
         return screen;
diff --git a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java
index 7e5155771..4cbc1e367 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java
@@ -485,6 +485,38 @@ public class X11Util {
         }
     }
 
+    static volatile boolean XineramaFetched = false;
+    static long XineramaLibHandle = 0;
+    static long XineramaQueryFunc = 0;
+    
+    public static boolean XineramaIsEnabled(long display) {
+        if(0==display) {
+            throw new IllegalArgumentException("Display NULL");
+        }
+        if(!XineramaFetched) { // volatile: ok
+            synchronized(X11Util.class) {
+                if( !XineramaFetched ) {
+                    XineramaLibHandle = X11Lib.XineramaGetLibHandle();
+                    if(0 != XineramaLibHandle) {
+                        XineramaQueryFunc = X11Lib.XineramaGetQueryFunc(XineramaLibHandle);
+                    }
+                    XineramaFetched = true;
+                }
+            }
+        }
+        if(0!=XineramaQueryFunc) {
+            final boolean res = X11Lib.XineramaIsEnabled(XineramaQueryFunc, display);
+            if(DEBUG) {
+                System.err.println("XineramaIsEnabled: "+res);
+            }
+            return res;
+        } else if(DEBUG) {
+            System.err.println("XineramaIsEnabled: Couldn't bind to Xinerama - lib 0x"+Long.toHexString(XineramaLibHandle)+
+                               "query 0x"+Long.toHexString(XineramaQueryFunc));
+        }
+        return false;
+    }
+    
     private static native boolean initialize0(boolean firstUIActionOnProcess);
     private static native void shutdown0();
     private static native void setX11ErrorHandler0(boolean onoff, boolean quiet);
diff --git a/src/nativewindow/native/win32/GDImisc.c b/src/nativewindow/native/win32/GDImisc.c
new file mode 100644
index 000000000..3ab7f9859
--- /dev/null
+++ b/src/nativewindow/native/win32/GDImisc.c
@@ -0,0 +1,226 @@
+#include <jni.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+#include <wingdi.h>
+#include <stddef.h>
+
+#include <gluegen_stdint.h>
+
+#include <stdio.h>
+
+#include "NativewindowCommon.h"
+#include "jogamp_nativewindow_windows_GDIUtil.h"
+
+// #define VERBOSE_ON 1
+
+#ifdef VERBOSE_ON
+    #define DBG_PRINT(args...) fprintf(stderr, args);
+#else
+    #define DBG_PRINT(args...)
+#endif
+
+static const char * const ClazzNamePoint = "javax/media/nativewindow/util/Point";
+static const char * const ClazzAnyCstrName = "<init>";
+static const char * const ClazzNamePointCstrSignature = "(II)V";
+
+static jclass pointClz = NULL;
+static jmethodID pointCstr = NULL;
+
+HINSTANCE GetApplicationHandle() {
+    return GetModuleHandle(NULL);
+}
+
+/*   Java->C glue code:
+ *   Java package: jogamp.nativewindow.windows.GDIUtil
+ *    Java method: boolean CreateWindowClass(long hInstance, java.lang.String clazzName, long wndProc)
+ *     C function: BOOL CreateWindowClass(HANDLE hInstance, LPCSTR clazzName, HANDLE wndProc);
+ */
+JNIEXPORT jboolean JNICALL
+Java_jogamp_nativewindow_windows_GDIUtil_CreateWindowClass
+    (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName, jlong wndProc) 
+{
+    HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
+    const TCHAR* clazzName = NULL;
+    WNDCLASS  wc;
+    jboolean res;
+
+#ifdef UNICODE
+    clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName);
+#else
+    clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL);
+#endif
+
+    ZeroMemory( &wc, sizeof( wc ) );
+    if( GetClassInfo( hInstance,  clazzName, &wc ) ) {
+        // registered already
+        res = JNI_TRUE;
+    } else {
+        // register now
+        ZeroMemory( &wc, sizeof( wc ) );
+        wc.style = CS_HREDRAW | CS_VREDRAW ;
+        wc.lpfnWndProc = (WNDPROC) (intptr_t) wndProc;
+        wc.cbClsExtra = 0;
+        wc.cbWndExtra = 0;
+        wc.hInstance = hInstance;
+        wc.hIcon = NULL;
+        wc.hCursor = LoadCursor( NULL, IDC_ARROW);
+        wc.hbrBackground = NULL; // no background paint - GetStockObject(BLACK_BRUSH);
+        wc.lpszMenuName = NULL;
+        wc.lpszClassName = clazzName;
+        res = ( 0 != RegisterClass( &wc ) ) ? JNI_TRUE : JNI_FALSE ;
+    }
+
+#ifdef UNICODE
+    free((void*) clazzName);
+#else
+    (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName);
+#endif
+
+    return res;
+}
+
+/*   Java->C glue code:
+ *   Java package: jogamp.nativewindow.windows.GDIUtil
+ *    Java method: boolean DestroyWindowClass(long hInstance, java.lang.String className)
+ *     C function: BOOL DestroyWindowClass(HANDLE hInstance, LPCSTR className);
+ */
+JNIEXPORT jboolean JNICALL
+Java_jogamp_nativewindow_windows_GDIUtil_DestroyWindowClass
+    (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName) 
+{
+    HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
+    const TCHAR* clazzName = NULL;
+    jboolean res;
+
+#ifdef UNICODE
+    clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName);
+#else
+    clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL);
+#endif
+
+    res = ( 0 != UnregisterClass( clazzName, hInstance ) ) ? JNI_TRUE : JNI_FALSE ;
+
+#ifdef UNICODE
+    free((void*) clazzName);
+#else
+    (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName);
+#endif
+
+    return res;
+}
+
+
+/*   Java->C glue code:
+ *   Java package: jogamp.nativewindow.windows.GDIUtil
+ *    Java method: long CreateDummyWindow0(long hInstance, java.lang.String className, java.lang.String windowName, int x, int y, int width, int height)
+ *     C function: HANDLE CreateDummyWindow0(HANDLE hInstance, LPCSTR className, LPCSTR windowName, int x, int y, int width, int height);
+ */
+JNIEXPORT jlong JNICALL
+Java_jogamp_nativewindow_windows_GDIUtil_CreateDummyWindow0
+    (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jWndClassName, jstring jWndName, jint x, jint y, jint width, jint height) 
+{
+    HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
+    const TCHAR* wndClassName = NULL;
+    const TCHAR* wndName = NULL;
+    DWORD     dwExStyle;
+    DWORD     dwStyle;
+    HWND      hWnd;
+
+#ifdef UNICODE
+    wndClassName = NewtCommon_GetNullTerminatedStringChars(env, jWndClassName);
+    wndName = NewtCommon_GetNullTerminatedStringChars(env, jWndName);
+#else
+    wndClassName = (*env)->GetStringUTFChars(env, jWndClassName, NULL);
+    wndName = (*env)->GetStringUTFChars(env, jWndName, NULL);
+#endif
+
+    dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
+    dwStyle = WS_OVERLAPPEDWINDOW;
+
+    hWnd = CreateWindowEx( dwExStyle,
+                           wndClassName,
+                           wndName,
+                           dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+                           x, y, width, height,
+                           NULL, NULL, hInstance, NULL );
+
+#ifdef UNICODE
+    free((void*) wndClassName);
+    free((void*) wndName);
+#else
+    (*env)->ReleaseStringUTFChars(env, jWndClassName, wndClassName);
+    (*env)->ReleaseStringUTFChars(env, jWndName, wndName);
+#endif
+
+    return (jlong) (intptr_t) hWnd;
+}
+
+
+/*
+ * Class:     jogamp_nativewindow_windows_GDIUtil
+ * Method:    initIDs0
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_jogamp_nativewindow_windows_GDIUtil_initIDs0
+  (JNIEnv *env, jclass clazz)
+{
+    if(NativewindowCommon_init(env)) {
+        jclass c = (*env)->FindClass(env, ClazzNamePoint);
+        if(NULL==c) {
+            NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't find %s", ClazzNamePoint);
+        }
+        pointClz = (jclass)(*env)->NewGlobalRef(env, c);
+        (*env)->DeleteLocalRef(env, c);
+        if(NULL==pointClz) {
+            NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't use %s", ClazzNamePoint);
+        }
+        pointCstr = (*env)->GetMethodID(env, pointClz, ClazzAnyCstrName, ClazzNamePointCstrSignature);
+        if(NULL==pointCstr) {
+            NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't fetch %s.%s %s",
+                ClazzNamePoint, ClazzAnyCstrName, ClazzNamePointCstrSignature);
+        }
+    }
+    return JNI_TRUE;
+}
+
+LRESULT CALLBACK DummyWndProc( HWND   hWnd, UINT   uMsg, WPARAM wParam, LPARAM lParam) {
+  return DefWindowProc(hWnd,uMsg,wParam,lParam);
+}
+
+/*
+ * Class:     jogamp_nativewindow_windows_GDIUtil
+ * Method:    getDummyWndProc0
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_windows_GDIUtil_getDummyWndProc0
+  (JNIEnv *env, jclass clazz)
+{
+    return (jlong) (intptr_t) DummyWndProc;
+}
+
+/*
+ * Class:     jogamp_nativewindow_windows_GDIUtil
+ * Method:    GetRelativeLocation0
+ * Signature: (JJII)Ljavax/media/nativewindow/util/Point;
+ */
+JNIEXPORT jobject JNICALL Java_jogamp_nativewindow_windows_GDIUtil_GetRelativeLocation0
+  (JNIEnv *env, jclass unused, jlong jsrc_win, jlong jdest_win, jint src_x, jint src_y)
+{
+    HWND src_win = (HWND) (intptr_t) jsrc_win;
+    HWND dest_win = (HWND) (intptr_t) jdest_win;
+    POINT dest = { src_x, src_y } ;
+    int res;
+
+    res = MapWindowPoints(src_win, dest_win, &dest, 1);
+
+    DBG_PRINT("*** WindowsWindow: getRelativeLocation0: %p %d/%d -> %p %d/%d - ok: %d\n",
+        (void*)src_win, src_x, src_y, (void*)dest_win, (int)dest.x, (int)dest.y, res);
+
+    return (*env)->NewObject(env, pointClz, pointCstr, (jint)dest.x, (jint)dest.y);
+}
+
diff --git a/src/nativewindow/native/win32/WindowsDWM.c b/src/nativewindow/native/win32/WindowsDWM.c
new file mode 100644
index 000000000..cc9ed6d8c
--- /dev/null
+++ b/src/nativewindow/native/win32/WindowsDWM.c
@@ -0,0 +1,95 @@
+
+#include "WindowsDWM.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+// #define VERBOSE_ON 1
+
+#ifdef VERBOSE_ON
+    #define DBG_PRINT(args...) fprintf(stderr, args);
+#else
+    #define DBG_PRINT(args...)
+#endif
+
+/* GetProcAddress doesn't exist in A/W variants under desktop Windows */
+#ifndef UNDER_CE
+#define GetProcAddressA GetProcAddress
+#endif
+
+typedef HRESULT (WINAPI *DwmEnableCompositionPROCADDR)(UINT uCompositionAction);
+typedef HRESULT (WINAPI *DwmIsCompositionEnabledPROCADDR)(BOOL * pfEnabled);
+typedef HRESULT (WINAPI *DwmEnableBlurBehindWindowPROCADDR)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind);  
+typedef HRESULT (WINAPI *DwmExtendFrameIntoClientAreaPROCADDR)(HWND hwnd, const MARGINS *pMarInset);  
+
+static int _init = 0; // 1: init, 2: has DWM extension
+static DwmEnableCompositionPROCADDR _DwmEnableComposition = NULL;
+static DwmIsCompositionEnabledPROCADDR _DwmIsCompositionEnabled = NULL;
+static DwmEnableBlurBehindWindowPROCADDR _DwmEnableBlurBehindWindow = NULL;
+static DwmExtendFrameIntoClientAreaPROCADDR _DwmExtendFrameIntoClientArea = NULL;
+
+static int initWindowsDWM() {
+    if(0 == _init) {
+        _init = 1;
+        HANDLE shell = LoadLibrary(TEXT("dwmapi.dll"));
+        if (shell) {
+            _DwmEnableComposition = (DwmEnableCompositionPROCADDR) GetProcAddressA (shell, "DwmEnableComposition");
+            _DwmIsCompositionEnabled = (DwmIsCompositionEnabledPROCADDR) GetProcAddressA (shell, "DwmIsCompositionEnabled");
+            _DwmEnableBlurBehindWindow = (DwmEnableBlurBehindWindowPROCADDR) GetProcAddressA (shell, "DwmEnableBlurBehindWindow");
+            _DwmExtendFrameIntoClientArea = (DwmExtendFrameIntoClientAreaPROCADDR) GetProcAddressA (shell, "DwmExtendFrameIntoClientArea");
+            if(NULL != _DwmEnableComposition && NULL != _DwmIsCompositionEnabled && 
+               NULL != _DwmEnableBlurBehindWindow && NULL != _DwmExtendFrameIntoClientArea) {
+                _init = 2;
+            }
+        }
+        // FreeLibrary (shell);  
+        DBG_PRINT("DWM - initWindowsDWM: %d - s %p, e %p, c %p\n", _init, shell, _DwmEnableBlurBehindWindow, _DwmExtendFrameIntoClientArea);
+    }
+    return _init;
+}
+
+BOOL DwmIsExtensionAvailable() {
+    return (2 == initWindowsDWM()) ? TRUE : FALSE;
+}
+
+BOOL DwmIsCompositionEnabled( ) {
+    if(2 == initWindowsDWM()) {
+        BOOL fEnabled = FALSE;
+        if( 0 == _DwmIsCompositionEnabled(&fEnabled) ) {
+            DBG_PRINT("DWM - DwmIsCompositionEnabled: %d\n", fEnabled);
+            return fEnabled;
+        }
+    }
+    DBG_PRINT("DWM - DwmIsCompositionEnabled failed\n");
+    return FALSE;
+}
+
+BOOL DwmEnableComposition( UINT uCompositionAction ) {
+    if(2 == initWindowsDWM()) {
+        return 0 == _DwmEnableComposition(uCompositionAction) ? TRUE : FALSE;
+    }
+    return FALSE;
+}
+
+BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind) {  
+    if(2 == initWindowsDWM()) {
+        _DwmEnableBlurBehindWindow(hwnd, pBlurBehind);
+        DBG_PRINT("DWM - DwmEnableBlurBehindWindow: hwnd %p, f %d, on %d, %p\n", 
+            (void *)hwnd, 
+            (int) pBlurBehind->dwFlags,
+            (int) pBlurBehind->fEnable,
+            (void *)pBlurBehind->hRgnBlur);
+        return TRUE;
+    }
+    DBG_PRINT("DWM - DwmEnableBlurBehindWindow: n/a\n");
+    return FALSE;
+}  
+
+BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset) {
+    if(2 == initWindowsDWM()) {
+        _DwmExtendFrameIntoClientArea(hwnd, pMarInset);
+        return TRUE;
+    }
+    return FALSE;
+}  
+  
diff --git a/src/nativewindow/native/win32/WindowsDWM.h b/src/nativewindow/native/win32/WindowsDWM.h
new file mode 100644
index 000000000..36f82fc94
--- /dev/null
+++ b/src/nativewindow/native/win32/WindowsDWM.h
@@ -0,0 +1,32 @@
+#ifndef _WINDOWS_DWM_H_
+#define _WINDOWS_DWM_H_
+
+    #include <windows.h> 
+
+    #define DWM_BB_ENABLE                 0x00000001  // fEnable has been specified  
+    #define DWM_EC_DISABLECOMPOSITION     0
+    #define DWM_EC_ENABLECOMPOSITION      1
+      
+    typedef struct _DWM_BLURBEHIND  
+    {  
+        DWORD dwFlags;  
+        BOOL fEnable;  
+        HRGN hRgnBlur;  
+        BOOL fTransitionOnMaximized;  
+    } DWM_BLURBEHIND, *PDWM_BLURBEHIND;  
+      
+    typedef struct _MARGINS  
+    {  
+        int cxLeftWidth;      // width of left border that retains its size  
+        int cxRightWidth;     // width of right border that retains its size  
+        int cyTopHeight;      // height of top border that retains its size  
+        int cyBottomHeight;   // height of bottom border that retains its size  
+    } MARGINS, *PMARGINS;  
+      
+    BOOL DwmIsExtensionAvailable();
+    BOOL DwmIsCompositionEnabled();
+    BOOL DwmEnableComposition( UINT uCompositionAction );
+    BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind);
+    BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset);
+      
+#endif /* _WINDOWS_DWM_H_ */
diff --git a/src/nativewindow/native/windows/GDImisc.c b/src/nativewindow/native/windows/GDImisc.c
deleted file mode 100644
index 3ab7f9859..000000000
--- a/src/nativewindow/native/windows/GDImisc.c
+++ /dev/null
@@ -1,226 +0,0 @@
-#include <jni.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#undef WIN32_LEAN_AND_MEAN
-
-#include <wingdi.h>
-#include <stddef.h>
-
-#include <gluegen_stdint.h>
-
-#include <stdio.h>
-
-#include "NativewindowCommon.h"
-#include "jogamp_nativewindow_windows_GDIUtil.h"
-
-// #define VERBOSE_ON 1
-
-#ifdef VERBOSE_ON
-    #define DBG_PRINT(args...) fprintf(stderr, args);
-#else
-    #define DBG_PRINT(args...)
-#endif
-
-static const char * const ClazzNamePoint = "javax/media/nativewindow/util/Point";
-static const char * const ClazzAnyCstrName = "<init>";
-static const char * const ClazzNamePointCstrSignature = "(II)V";
-
-static jclass pointClz = NULL;
-static jmethodID pointCstr = NULL;
-
-HINSTANCE GetApplicationHandle() {
-    return GetModuleHandle(NULL);
-}
-
-/*   Java->C glue code:
- *   Java package: jogamp.nativewindow.windows.GDIUtil
- *    Java method: boolean CreateWindowClass(long hInstance, java.lang.String clazzName, long wndProc)
- *     C function: BOOL CreateWindowClass(HANDLE hInstance, LPCSTR clazzName, HANDLE wndProc);
- */
-JNIEXPORT jboolean JNICALL
-Java_jogamp_nativewindow_windows_GDIUtil_CreateWindowClass
-    (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName, jlong wndProc) 
-{
-    HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
-    const TCHAR* clazzName = NULL;
-    WNDCLASS  wc;
-    jboolean res;
-
-#ifdef UNICODE
-    clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName);
-#else
-    clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL);
-#endif
-
-    ZeroMemory( &wc, sizeof( wc ) );
-    if( GetClassInfo( hInstance,  clazzName, &wc ) ) {
-        // registered already
-        res = JNI_TRUE;
-    } else {
-        // register now
-        ZeroMemory( &wc, sizeof( wc ) );
-        wc.style = CS_HREDRAW | CS_VREDRAW ;
-        wc.lpfnWndProc = (WNDPROC) (intptr_t) wndProc;
-        wc.cbClsExtra = 0;
-        wc.cbWndExtra = 0;
-        wc.hInstance = hInstance;
-        wc.hIcon = NULL;
-        wc.hCursor = LoadCursor( NULL, IDC_ARROW);
-        wc.hbrBackground = NULL; // no background paint - GetStockObject(BLACK_BRUSH);
-        wc.lpszMenuName = NULL;
-        wc.lpszClassName = clazzName;
-        res = ( 0 != RegisterClass( &wc ) ) ? JNI_TRUE : JNI_FALSE ;
-    }
-
-#ifdef UNICODE
-    free((void*) clazzName);
-#else
-    (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName);
-#endif
-
-    return res;
-}
-
-/*   Java->C glue code:
- *   Java package: jogamp.nativewindow.windows.GDIUtil
- *    Java method: boolean DestroyWindowClass(long hInstance, java.lang.String className)
- *     C function: BOOL DestroyWindowClass(HANDLE hInstance, LPCSTR className);
- */
-JNIEXPORT jboolean JNICALL
-Java_jogamp_nativewindow_windows_GDIUtil_DestroyWindowClass
-    (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName) 
-{
-    HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
-    const TCHAR* clazzName = NULL;
-    jboolean res;
-
-#ifdef UNICODE
-    clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName);
-#else
-    clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL);
-#endif
-
-    res = ( 0 != UnregisterClass( clazzName, hInstance ) ) ? JNI_TRUE : JNI_FALSE ;
-
-#ifdef UNICODE
-    free((void*) clazzName);
-#else
-    (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName);
-#endif
-
-    return res;
-}
-
-
-/*   Java->C glue code:
- *   Java package: jogamp.nativewindow.windows.GDIUtil
- *    Java method: long CreateDummyWindow0(long hInstance, java.lang.String className, java.lang.String windowName, int x, int y, int width, int height)
- *     C function: HANDLE CreateDummyWindow0(HANDLE hInstance, LPCSTR className, LPCSTR windowName, int x, int y, int width, int height);
- */
-JNIEXPORT jlong JNICALL
-Java_jogamp_nativewindow_windows_GDIUtil_CreateDummyWindow0
-    (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jWndClassName, jstring jWndName, jint x, jint y, jint width, jint height) 
-{
-    HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
-    const TCHAR* wndClassName = NULL;
-    const TCHAR* wndName = NULL;
-    DWORD     dwExStyle;
-    DWORD     dwStyle;
-    HWND      hWnd;
-
-#ifdef UNICODE
-    wndClassName = NewtCommon_GetNullTerminatedStringChars(env, jWndClassName);
-    wndName = NewtCommon_GetNullTerminatedStringChars(env, jWndName);
-#else
-    wndClassName = (*env)->GetStringUTFChars(env, jWndClassName, NULL);
-    wndName = (*env)->GetStringUTFChars(env, jWndName, NULL);
-#endif
-
-    dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
-    dwStyle = WS_OVERLAPPEDWINDOW;
-
-    hWnd = CreateWindowEx( dwExStyle,
-                           wndClassName,
-                           wndName,
-                           dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
-                           x, y, width, height,
-                           NULL, NULL, hInstance, NULL );
-
-#ifdef UNICODE
-    free((void*) wndClassName);
-    free((void*) wndName);
-#else
-    (*env)->ReleaseStringUTFChars(env, jWndClassName, wndClassName);
-    (*env)->ReleaseStringUTFChars(env, jWndName, wndName);
-#endif
-
-    return (jlong) (intptr_t) hWnd;
-}
-
-
-/*
- * Class:     jogamp_nativewindow_windows_GDIUtil
- * Method:    initIDs0
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL Java_jogamp_nativewindow_windows_GDIUtil_initIDs0
-  (JNIEnv *env, jclass clazz)
-{
-    if(NativewindowCommon_init(env)) {
-        jclass c = (*env)->FindClass(env, ClazzNamePoint);
-        if(NULL==c) {
-            NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't find %s", ClazzNamePoint);
-        }
-        pointClz = (jclass)(*env)->NewGlobalRef(env, c);
-        (*env)->DeleteLocalRef(env, c);
-        if(NULL==pointClz) {
-            NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't use %s", ClazzNamePoint);
-        }
-        pointCstr = (*env)->GetMethodID(env, pointClz, ClazzAnyCstrName, ClazzNamePointCstrSignature);
-        if(NULL==pointCstr) {
-            NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't fetch %s.%s %s",
-                ClazzNamePoint, ClazzAnyCstrName, ClazzNamePointCstrSignature);
-        }
-    }
-    return JNI_TRUE;
-}
-
-LRESULT CALLBACK DummyWndProc( HWND   hWnd, UINT   uMsg, WPARAM wParam, LPARAM lParam) {
-  return DefWindowProc(hWnd,uMsg,wParam,lParam);
-}
-
-/*
- * Class:     jogamp_nativewindow_windows_GDIUtil
- * Method:    getDummyWndProc0
- * Signature: ()J
- */
-JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_windows_GDIUtil_getDummyWndProc0
-  (JNIEnv *env, jclass clazz)
-{
-    return (jlong) (intptr_t) DummyWndProc;
-}
-
-/*
- * Class:     jogamp_nativewindow_windows_GDIUtil
- * Method:    GetRelativeLocation0
- * Signature: (JJII)Ljavax/media/nativewindow/util/Point;
- */
-JNIEXPORT jobject JNICALL Java_jogamp_nativewindow_windows_GDIUtil_GetRelativeLocation0
-  (JNIEnv *env, jclass unused, jlong jsrc_win, jlong jdest_win, jint src_x, jint src_y)
-{
-    HWND src_win = (HWND) (intptr_t) jsrc_win;
-    HWND dest_win = (HWND) (intptr_t) jdest_win;
-    POINT dest = { src_x, src_y } ;
-    int res;
-
-    res = MapWindowPoints(src_win, dest_win, &dest, 1);
-
-    DBG_PRINT("*** WindowsWindow: getRelativeLocation0: %p %d/%d -> %p %d/%d - ok: %d\n",
-        (void*)src_win, src_x, src_y, (void*)dest_win, (int)dest.x, (int)dest.y, res);
-
-    return (*env)->NewObject(env, pointClz, pointCstr, (jint)dest.x, (jint)dest.y);
-}
-
diff --git a/src/nativewindow/native/windows/WindowsDWM.c b/src/nativewindow/native/windows/WindowsDWM.c
deleted file mode 100644
index cc9ed6d8c..000000000
--- a/src/nativewindow/native/windows/WindowsDWM.c
+++ /dev/null
@@ -1,95 +0,0 @@
-
-#include "WindowsDWM.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-
-// #define VERBOSE_ON 1
-
-#ifdef VERBOSE_ON
-    #define DBG_PRINT(args...) fprintf(stderr, args);
-#else
-    #define DBG_PRINT(args...)
-#endif
-
-/* GetProcAddress doesn't exist in A/W variants under desktop Windows */
-#ifndef UNDER_CE
-#define GetProcAddressA GetProcAddress
-#endif
-
-typedef HRESULT (WINAPI *DwmEnableCompositionPROCADDR)(UINT uCompositionAction);
-typedef HRESULT (WINAPI *DwmIsCompositionEnabledPROCADDR)(BOOL * pfEnabled);
-typedef HRESULT (WINAPI *DwmEnableBlurBehindWindowPROCADDR)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind);  
-typedef HRESULT (WINAPI *DwmExtendFrameIntoClientAreaPROCADDR)(HWND hwnd, const MARGINS *pMarInset);  
-
-static int _init = 0; // 1: init, 2: has DWM extension
-static DwmEnableCompositionPROCADDR _DwmEnableComposition = NULL;
-static DwmIsCompositionEnabledPROCADDR _DwmIsCompositionEnabled = NULL;
-static DwmEnableBlurBehindWindowPROCADDR _DwmEnableBlurBehindWindow = NULL;
-static DwmExtendFrameIntoClientAreaPROCADDR _DwmExtendFrameIntoClientArea = NULL;
-
-static int initWindowsDWM() {
-    if(0 == _init) {
-        _init = 1;
-        HANDLE shell = LoadLibrary(TEXT("dwmapi.dll"));
-        if (shell) {
-            _DwmEnableComposition = (DwmEnableCompositionPROCADDR) GetProcAddressA (shell, "DwmEnableComposition");
-            _DwmIsCompositionEnabled = (DwmIsCompositionEnabledPROCADDR) GetProcAddressA (shell, "DwmIsCompositionEnabled");
-            _DwmEnableBlurBehindWindow = (DwmEnableBlurBehindWindowPROCADDR) GetProcAddressA (shell, "DwmEnableBlurBehindWindow");
-            _DwmExtendFrameIntoClientArea = (DwmExtendFrameIntoClientAreaPROCADDR) GetProcAddressA (shell, "DwmExtendFrameIntoClientArea");
-            if(NULL != _DwmEnableComposition && NULL != _DwmIsCompositionEnabled && 
-               NULL != _DwmEnableBlurBehindWindow && NULL != _DwmExtendFrameIntoClientArea) {
-                _init = 2;
-            }
-        }
-        // FreeLibrary (shell);  
-        DBG_PRINT("DWM - initWindowsDWM: %d - s %p, e %p, c %p\n", _init, shell, _DwmEnableBlurBehindWindow, _DwmExtendFrameIntoClientArea);
-    }
-    return _init;
-}
-
-BOOL DwmIsExtensionAvailable() {
-    return (2 == initWindowsDWM()) ? TRUE : FALSE;
-}
-
-BOOL DwmIsCompositionEnabled( ) {
-    if(2 == initWindowsDWM()) {
-        BOOL fEnabled = FALSE;
-        if( 0 == _DwmIsCompositionEnabled(&fEnabled) ) {
-            DBG_PRINT("DWM - DwmIsCompositionEnabled: %d\n", fEnabled);
-            return fEnabled;
-        }
-    }
-    DBG_PRINT("DWM - DwmIsCompositionEnabled failed\n");
-    return FALSE;
-}
-
-BOOL DwmEnableComposition( UINT uCompositionAction ) {
-    if(2 == initWindowsDWM()) {
-        return 0 == _DwmEnableComposition(uCompositionAction) ? TRUE : FALSE;
-    }
-    return FALSE;
-}
-
-BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind) {  
-    if(2 == initWindowsDWM()) {
-        _DwmEnableBlurBehindWindow(hwnd, pBlurBehind);
-        DBG_PRINT("DWM - DwmEnableBlurBehindWindow: hwnd %p, f %d, on %d, %p\n", 
-            (void *)hwnd, 
-            (int) pBlurBehind->dwFlags,
-            (int) pBlurBehind->fEnable,
-            (void *)pBlurBehind->hRgnBlur);
-        return TRUE;
-    }
-    DBG_PRINT("DWM - DwmEnableBlurBehindWindow: n/a\n");
-    return FALSE;
-}  
-
-BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset) {
-    if(2 == initWindowsDWM()) {
-        _DwmExtendFrameIntoClientArea(hwnd, pMarInset);
-        return TRUE;
-    }
-    return FALSE;
-}  
-  
diff --git a/src/nativewindow/native/windows/WindowsDWM.h b/src/nativewindow/native/windows/WindowsDWM.h
deleted file mode 100644
index 36f82fc94..000000000
--- a/src/nativewindow/native/windows/WindowsDWM.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef _WINDOWS_DWM_H_
-#define _WINDOWS_DWM_H_
-
-    #include <windows.h> 
-
-    #define DWM_BB_ENABLE                 0x00000001  // fEnable has been specified  
-    #define DWM_EC_DISABLECOMPOSITION     0
-    #define DWM_EC_ENABLECOMPOSITION      1
-      
-    typedef struct _DWM_BLURBEHIND  
-    {  
-        DWORD dwFlags;  
-        BOOL fEnable;  
-        HRGN hRgnBlur;  
-        BOOL fTransitionOnMaximized;  
-    } DWM_BLURBEHIND, *PDWM_BLURBEHIND;  
-      
-    typedef struct _MARGINS  
-    {  
-        int cxLeftWidth;      // width of left border that retains its size  
-        int cxRightWidth;     // width of right border that retains its size  
-        int cyTopHeight;      // height of top border that retains its size  
-        int cyBottomHeight;   // height of bottom border that retains its size  
-    } MARGINS, *PMARGINS;  
-      
-    BOOL DwmIsExtensionAvailable();
-    BOOL DwmIsCompositionEnabled();
-    BOOL DwmEnableComposition( UINT uCompositionAction );
-    BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind);
-    BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset);
-      
-#endif /* _WINDOWS_DWM_H_ */
diff --git a/src/nativewindow/native/x11/XineramaHelper.c b/src/nativewindow/native/x11/XineramaHelper.c
index 62c02c8c8..ffd66a1b9 100644
--- a/src/nativewindow/native/x11/XineramaHelper.c
+++ b/src/nativewindow/native/x11/XineramaHelper.c
@@ -1,122 +1,152 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright (c) 2010 JogAmp Community. All rights reserved.
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
  * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
+ *    1. Redistributions of source code must retain the above copyright notice, this list of
+ *       conditions and the following disclaimer.
  * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
+ *    2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *       of conditions and the following disclaimer in the documentation and/or other materials
+ *       provided with the distribution.
  * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
  */
 
-/* This file contains a helper routine to be called by Java code to
-   determine whether the Xinerama extension is in use and therefore to
-   treat the multiple AWT screens as one large screen. */
+#include <XineramaHelper.h>
 
-#include <gluegen_stdint.h>
-#include <X11/Xlib.h>
 #include <stdio.h>
+#include <dlfcn.h>
+
+// #define DEBUG 1
+
+static const char* XinExtName = "XINERAMA";
 
 #ifdef __sun_obsolete
 
-typedef Status XineramaGetInfoFunc(Display* display, int screen_number,
+static const char* XineramaLibNames[] = { "libXext.so", NULL } ;
+static const char* XineramaGetInfoName = "XineramaGetInfo";
+
+typedef Status (* PFNXineramaGetInfoPROC) (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);
-
-XineramaGetCenterHintFunc* XineramaSolarisCenterFunc = NULL;
-#include <dlfcn.h>
 
 #else
 
-#include <X11/extensions/Xinerama.h>
+static const char* XineramaLibNames[]= { "libXinerama.so.1", "libXinerama.so", NULL };
+static const char* XineramaIsActiveName = "XineramaIsActive";
 
-#endif
+typedef Bool (* PFNXineramaIsActivePROC) (Display *display);
 
-Bool XineramaEnabled(Display* display) {
-#ifdef __sun_obsolete
+#endif
 
-#define MAXFRAMEBUFFERS 16
-  char* XinExtName = "XINERAMA";
-  int32_t major_opcode, first_event, first_error;
-  Bool gotXinExt = False;
-  void* libHandle = 0;
-  unsigned char fbhints[MAXFRAMEBUFFERS];
-  XRectangle fbrects[MAXFRAMEBUFFERS];
-  int locNumScr = 0;
-  Bool usingXinerama = False;
+static Bool XineramaIsEnabledPlatform(void *xineramaQueryFunc, Display* display) {
+    Bool res = False;
+    #ifdef __sun_obsolete
+      #define MAXFRAMEBUFFERS 16
+      unsigned char fbhints[MAXFRAMEBUFFERS];
+      XRectangle fbrects[MAXFRAMEBUFFERS];
+      int locNumScr = 0;
+
+      if(NULL!=xineramaQueryFunc && NULL!=display) {
+          PFNXineramaGetInfoPROC XineramaSolarisPROC = (PFNXineramaGetInfoPROC)xineramaQueryFunc;
+          res = XineramaSolarisPROC(display, 0, &fbrects[0], &fbhints[0], &locNumScr) != 0;
+      }
+    #else
+      if(NULL!=xineramaQueryFunc && NULL!=display) {
+          PFNXineramaIsActivePROC XineramaIsActivePROC = (PFNXineramaIsActivePROC) xineramaQueryFunc;
+          res = XineramaIsActivePROC(display);
+      }
+    #endif
+    return res;
+}
 
-  char* XineramaLibName= "libXext.so";
-  char* XineramaGetInfoName = "XineramaGetInfo";
-  char* XineramaGetCenterHintName = "XineramaGetCenterHint";
-  XineramaGetInfoFunc* XineramaSolarisFunc = NULL;
+void* XineramaGetLibHandle() {
+  void* xineramaLibHandle = NULL;
+  int i;
 
-  gotXinExt = XQueryExtension(display, XinExtName, &major_opcode,
-                              &first_event, &first_error);
+  for(i=0; NULL==xineramaLibHandle && NULL!=XineramaLibNames[i]; i++) {
+    xineramaLibHandle = dlopen(XineramaLibNames[i], RTLD_LAZY | RTLD_GLOBAL);
+  }
 
-  if (gotXinExt) {
-    /* 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) {
-        if ((*XineramaSolarisFunc)(display, 0, &fbrects[0],
-                                   &fbhints[0], &locNumScr) != 0) {
-
-          usingXinerama = True;
-        }
-      }
-      dlclose(libHandle);
+  #ifdef DEBUG
+    if(NULL!=xineramaLibHandle) {
+      fprintf(stderr, "XineramaGetLibHandle: using lib %s -> %p\n", XineramaLibNames[i-1], xineramaLibHandle);
+    } else {
+      fprintf(stderr, "XineramaGetLibHandle: no native lib available\n");
     }
+  #endif
+
+  return xineramaLibHandle;
+}
+
+Bool XineramaReleaseLibHandle(void* xineramaLibHandle) {
+  #ifdef DEBUG
+    fprintf(stderr, "XineramaReleaseLibHandle: release lib %p\n", xineramaLibHandle);
+  #endif
+  if(NULL==xineramaLibHandle) {
+    return False;
   }
-  return usingXinerama;
-  
-#else
+  return 0 == dlclose(xineramaLibHandle) ? True : False;
+}
+
+void* XineramaGetQueryFunc(void *xineramaLibHandle) {
+    void * funcptr = NULL;
 
-  static const char* XinExtName = "XINERAMA";
+    if(NULL==xineramaLibHandle) {
+      return NULL;
+    }
+
+    #ifdef __sun_obsolete
+      #ifdef DEBUG
+        fprintf(stderr, "XineramaGetQueryFunc: trying func %p -> %s\n", xineramaLibHandle, XineramaGetInfoName);
+      #endif
+      funcptr = dlsym(xineramaLibHandle, XineramaGetInfoName);
+    #else
+      #ifdef DEBUG
+        fprintf(stderr, "XineramaGetQueryFunc: trying func %p -> %s\n", xineramaLibHandle, XineramaIsActiveName);
+      #endif
+      funcptr = dlsym(xineramaLibHandle, XineramaIsActiveName);
+    #endif
+    #ifdef DEBUG
+      fprintf(stderr, "XineramaGetQueryFunc: got func %p\n", funcptr);
+    #endif
+    return funcptr;
+}
+
+Bool XineramaIsEnabled(void *xineramaQueryFunc, Display* display) {
   int32_t major_opcode, first_event, first_error;
   Bool gotXinExt = False;
-  Bool isXinActive = False;
+  Bool res = False;
 
-  // fprintf(stderr, "XineramaEnabled: p0\n"); fflush(stderr);
+  if(NULL==xineramaQueryFunc || NULL==display) {
+    return False;
+  }
 
   gotXinExt = XQueryExtension(display, XinExtName, &major_opcode,
                               &first_event, &first_error);
-  // fprintf(stderr, "XineramaEnabled: p1 gotXinExt %d\n",gotXinExt); fflush(stderr);
 
-  if (gotXinExt) {
-    isXinActive = XineramaIsActive(display);
-  }
-  // fprintf(stderr, "XineramaEnabled: p2 XineramaIsActive %d\n", isXinActive); fflush(stderr);
+  #ifdef DEBUG
+    fprintf(stderr, "XineramaIsEnabled: has Xinerama Ext: ext %d, query-func %p\n", gotXinExt, xineramaQueryFunc);
+  #endif
 
-  return isXinActive;
+  if(gotXinExt) {
+    res = XineramaIsEnabledPlatform(xineramaQueryFunc, display);
+  }
 
-#endif
+  return res;
 }
 
diff --git a/src/nativewindow/native/x11/XineramaHelper.h b/src/nativewindow/native/x11/XineramaHelper.h
new file mode 100644
index 000000000..42b6a03ae
--- /dev/null
+++ b/src/nativewindow/native/x11/XineramaHelper.h
@@ -0,0 +1,40 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ * 
+ *    1. Redistributions of source code must retain the above copyright notice, this list of
+ *       conditions and the following disclaimer.
+ * 
+ *    2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *       of conditions and the following disclaimer in the documentation and/or other materials
+ *       provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+ 
+#ifndef XineramaHelper_h
+#define XineramaHelper_h
+
+#include <gluegen_stdint.h>
+#include <X11/Xlib.h>
+
+void* XineramaGetLibHandle();
+Bool XineramaReleaseLibHandle(void* xineramaLibHandle);
+void* XineramaGetQueryFunc(void *xineramaLibHandle);
+Bool XineramaIsEnabled(void *xineramaQueryFunc, Display* display);
+
+#endif /* XineramaHelper_h */
diff --git a/src/nativewindow/native/x11/Xmisc.c b/src/nativewindow/native/x11/Xmisc.c
index d28891cda..a99499879 100644
--- a/src/nativewindow/native/x11/Xmisc.c
+++ b/src/nativewindow/native/x11/Xmisc.c
@@ -91,9 +91,6 @@ Bool XF86VidModeSetGammaRamp(
     #define DBG_PRINT(args...)
 #endif
 
-/* Need to pull this in as we don't have a stub header for it */
-extern Bool XineramaEnabled(Display* display);
-
 static const char * const ClazzNameBuffers = "com/jogamp/common/nio/Buffers";
 static const char * const ClazzNameBuffersStaticCstrName = "copyByteBuffer";
 static const char * const ClazzNameBuffersStaticCstrSignature = "(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;";
diff --git a/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java b/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java
index ba1aed308..b688c6870 100644
--- a/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java
+++ b/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java
@@ -277,7 +277,7 @@ public class X11Screen extends ScreenImpl {
 
     private class XineramaEnabledQuery implements DisplayImpl.DisplayRunnable<Boolean> {
         public Boolean run(long dpy) {        
-            return new Boolean(X11Lib.XineramaEnabled(dpy)); 
+            return new Boolean(X11Util.XineramaIsEnabled(dpy)); 
         }        
     }
     private XineramaEnabledQuery xineramaEnabledQuery = new XineramaEnabledQuery();
-- 
cgit v1.2.3