summaryrefslogtreecommitdiffstats
path: root/src/nativewindow
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2012-02-27 18:20:37 +0100
committerSven Gothel <[email protected]>2012-02-27 18:20:37 +0100
commitb7407c39c0d3785f2fc21782d31c439622f0d744 (patch)
tree5ef1fc876f54e182fa8cdea0226f55783c324a2f /src/nativewindow
parentf519190f0cf97eb6b3fda61f4eb8c1f55de43b51 (diff)
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.
Diffstat (limited to 'src/nativewindow')
-rw-r--r--src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java3
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java32
-rw-r--r--src/nativewindow/native/win32/GDImisc.c (renamed from src/nativewindow/native/windows/GDImisc.c)0
-rw-r--r--src/nativewindow/native/win32/WindowsDWM.c (renamed from src/nativewindow/native/windows/WindowsDWM.c)0
-rw-r--r--src/nativewindow/native/win32/WindowsDWM.h (renamed from src/nativewindow/native/windows/WindowsDWM.h)0
-rw-r--r--src/nativewindow/native/x11/XineramaHelper.c202
-rw-r--r--src/nativewindow/native/x11/XineramaHelper.h40
-rw-r--r--src/nativewindow/native/x11/Xmisc.c3
8 files changed, 189 insertions, 91 deletions
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/windows/GDImisc.c b/src/nativewindow/native/win32/GDImisc.c
index 3ab7f9859..3ab7f9859 100644
--- a/src/nativewindow/native/windows/GDImisc.c
+++ b/src/nativewindow/native/win32/GDImisc.c
diff --git a/src/nativewindow/native/windows/WindowsDWM.c b/src/nativewindow/native/win32/WindowsDWM.c
index cc9ed6d8c..cc9ed6d8c 100644
--- a/src/nativewindow/native/windows/WindowsDWM.c
+++ b/src/nativewindow/native/win32/WindowsDWM.c
diff --git a/src/nativewindow/native/windows/WindowsDWM.h b/src/nativewindow/native/win32/WindowsDWM.h
index 36f82fc94..36f82fc94 100644
--- a/src/nativewindow/native/windows/WindowsDWM.h
+++ b/src/nativewindow/native/win32/WindowsDWM.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;";