diff options
-rw-r--r-- | make/build-common.xml | 4 | ||||
-rw-r--r-- | make/build-nativewindow.xml | 31 | ||||
-rw-r--r-- | src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java | 3 | ||||
-rw-r--r-- | src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java | 13 | ||||
-rw-r--r-- | src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java | 39 | ||||
-rw-r--r-- | src/nativewindow/native/macosx/OSXmisc.c | 106 |
6 files changed, 191 insertions, 5 deletions
diff --git a/make/build-common.xml b/make/build-common.xml index 114525855..58a829fc6 100644 --- a/make/build-common.xml +++ b/make/build-common.xml @@ -245,16 +245,20 @@ <property name="nativewindow.awt.jar" value="${build.nativewindow}/nativewindow.awt.jar" /> <property name="nativewindow.os.x11.jar" value="${build.nativewindow}/nativewindow.os.x11.jar" /> <property name="nativewindow.os.win.jar" value="${build.nativewindow}/nativewindow.os.win.jar" /> + <property name="nativewindow.os.macosx.jar" value="${build.nativewindow}/nativewindow.os.macosx.jar" /> + <path id="nativewindow_all_atoms.classpath"> <pathelement location="${nativewindow.core.jar}" /> <pathelement location="${nativewindow.awt.jar}" /> <pathelement location="${nativewindow.os.x11.jar}" /> <pathelement location="${nativewindow.os.win.jar}" /> + <pathelement location="${nativewindow.os.macosx.jar}" /> </path> <path id="nativewindow_all-noawt_atoms.classpath"> <pathelement location="${nativewindow.core.jar}" /> <pathelement location="${nativewindow.os.x11.jar}" /> <pathelement location="${nativewindow.os.win.jar}" /> + <pathelement location="${nativewindow.os.macosx.jar}" /> </path> <path id="nativewindow_core_atoms.classpath"> <pathelement location="${nativewindow.core.jar}" /> diff --git a/make/build-nativewindow.xml b/make/build-nativewindow.xml index b13e9b0ff..244f61046 100644 --- a/make/build-nativewindow.xml +++ b/make/build-nativewindow.xml @@ -70,7 +70,7 @@ value="jogamp/nativewindow/swt/**"/> <property name="java.part.core" - value="javax/media/nativewindow/* javax/media/nativewindow/util/* javax/media/nativewindow/egl/* javax/media/nativewindow/macosx/* javax/media/nativewindow/windows/* com/jogamp/nativewindow/* jogamp/nativewindow/* jogamp/nativewindow/jvm/* ${java.part.swt}"/> + value="javax/media/nativewindow/* javax/media/nativewindow/util/* javax/media/nativewindow/egl/* com/jogamp/nativewindow/* jogamp/nativewindow/* jogamp/nativewindow/jvm/* ${java.part.swt}"/> <property name="java.part.awt" value="javax/media/nativewindow/awt/* jogamp/nativewindow/jawt/** jogamp/nativewindow/**/awt/**"/> @@ -81,6 +81,9 @@ <property name="java.part.windows" value="jogamp/nativewindow/windows/** javax/media/nativewindow/windows/*" /> + <property name="java.part.macosx" + value="jogamp/nativewindow/macosx/** javax/media/nativewindow/macosx/*" /> + <!-- condition excludes --> <condition property="java.excludes.awt" @@ -582,6 +585,11 @@ <include name="${rootrel.src.c}/NativewindowCommon.c"/> </patternset> + <patternset id="c.src.files.macosx"> + <include name="${rootrel.src.c}/macosx/OSXmisc.c"/> + <include name="${rootrel.src.c}/NativewindowCommon.c"/> + </patternset> + <echo message="Compiling @{output.lib.name}" /> <!-- have to wrap cc task with outofdate, because otherwise cc links a new library @@ -694,7 +702,17 @@ compiler.cfg.id="${compiler.cfg.id}" linker.cfg.id="${linker.cfg.id.oswin}"/> </target> - <target name="c.build.nativewindow.windowlib" depends="c.build.nativewindow.windowlib.x11, c.build.nativewindow.windowlib.windows"/> + + <target name="c.build.nativewindow.windowlib.macosx" if="isOSX"> + <javah destdir="${src.generated.c}/MacOSX" classpath="${javah.classpath}" class="jogamp.nativewindow.macosx.OSXUtil" /> + + <c.build c.compiler.src.files="c.src.files.macosx" + output.lib.name="nativewindow_macosx" + compiler.cfg.id="${compiler.cfg.id}" + linker.cfg.id="${linker.cfg.id.oswin}"/> + </target> + + <target name="c.build.nativewindow.windowlib" depends="c.build.nativewindow.windowlib.x11, c.build.nativewindow.windowlib.windows, c.build.nativewindow.windowlib.macosx"/> <target name="c.manifest" if="isVC8Family"> <!-- exec mt, the Microsoft Manifest Tool, to include DLL manifests in order to resolve the location of msvcr80.dll --> @@ -749,7 +767,14 @@ </jar> </target> - <target name="build-jars-javase" depends="setup-manifestfile,build-jars-awt,build-jars-x11,build-jars-windows"> + <target name="build-jars-macosx" depends="setup-manifestfile"> + <jar manifest="${build.nativewindow}/manifest.mf" destfile="${nativewindow.os.macosx.jar}" filesonly="true"> + <fileset dir="${classes}" + includes="${java.part.macosx}" /> + </jar> + </target> + + <target name="build-jars-javase" depends="setup-manifestfile,build-jars-awt,build-jars-x11,build-jars-windows,build-jars-macosx"> <jar manifest="${build.nativewindow}/manifest.mf" destfile="${nativewindow.core.jar}" filesonly="true"> <fileset dir="${classes}" includes="${java.part.core}" diff --git a/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java b/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java index 5c01c681a..ef8876f50 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java +++ b/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java @@ -82,6 +82,7 @@ public abstract class NativeWindowFactory { public static final String AWTComponentClassName = "java.awt.Component" ; public static final String JAWTUtilClassName = "jogamp.nativewindow.jawt.JAWTUtil" ; public static final String X11UtilClassName = "jogamp.nativewindow.x11.X11Util"; + public static final String OSXUtilClassName = "jogamp.nativewindow.macosx.OSXUtil"; public static final String GDIClassName = "jogamp.nativewindow.windows.GDI"; public static final String X11JAWTToolkitLockClassName = "jogamp.nativewindow.jawt.x11.X11JAWTToolkitLock" ; public static final String X11ToolkitLockClassName = "jogamp.nativewindow.x11.X11ToolkitLock" ; @@ -139,6 +140,8 @@ public abstract class NativeWindowFactory { clazzName = X11UtilClassName; } else if( TYPE_WINDOWS.equals(nativeWindowingTypePure) ) { clazzName = GDIClassName; + } else if( TYPE_MACOSX.equals(nativeWindowingTypePure) ) { + clazzName = OSXUtilClassName; } if( null != clazzName ) { ReflectionUtil.callStaticMethod(clazzName, "initSingleton", diff --git a/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java b/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java index 9c29bbd52..d0152ce4e 100644 --- a/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java +++ b/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java @@ -40,6 +40,7 @@ package jogamp.nativewindow.jawt.macosx; +import java.awt.Component; import java.security.AccessController; import java.security.PrivilegedAction; @@ -53,6 +54,7 @@ import jogamp.nativewindow.jawt.JAWTFactory; import jogamp.nativewindow.jawt.JAWTWindow; import jogamp.nativewindow.jawt.JAWT_DrawingSurface; import jogamp.nativewindow.jawt.JAWT_DrawingSurfaceInfo; +import jogamp.nativewindow.macosx.OSXUtil; public class MacOSXJAWTWindow extends JAWTWindow { @@ -86,7 +88,7 @@ public class MacOSXJAWTWindow extends JAWTWindow { ret = NativeWindow.LOCK_SURFACE_CHANGED; } if (firstLock) { - AccessController.doPrivileged(new PrivilegedAction() { + AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dsi = ds.GetDrawingSurfaceInfo(); return null; @@ -132,7 +134,14 @@ public class MacOSXJAWTWindow extends JAWTWindow { } protected Point getLocationOnScreenImpl(int x, int y) { - return null; // FIXME + Component c = component; + while(null != c) { + x += c.getX(); + y += c.getY(); + c = c.getParent(); + } + // return OSXUtil.GetLocationOnScreen(getWindowHandle(), x, y); + return new Point(x, y); } // Variables for lockSurface/unlockSurface diff --git a/src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java b/src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java new file mode 100644 index 000000000..ffd23fef7 --- /dev/null +++ b/src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java @@ -0,0 +1,39 @@ +package jogamp.nativewindow.macosx; + +import javax.media.nativewindow.NativeWindowException; +import javax.media.nativewindow.util.Point; + +import jogamp.nativewindow.Debug; +import jogamp.nativewindow.NWJNILibLoader; + +public class OSXUtil { + private static boolean isInit = false; + private static final boolean DEBUG = Debug.debug("OSXUtil"); + + public static synchronized void initSingleton(boolean firstX11ActionOnProcess) { + if(!isInit) { + NWJNILibLoader.loadNativeWindow("macosx"); + + if( !initIDs0() ) { + throw new NativeWindowException("MacOSX: Could not initialized native stub"); + } + + if(DEBUG) { + System.out.println("OSX.isFirstX11ActionOnProcess: "+firstX11ActionOnProcess); + } + + isInit = true; + } + } + + public static boolean requiresToolkitLock() { + return false; + } + + public static Point GetLocationOnScreen(long windowOrView, int src_x, int src_y) { + return (Point) GetLocationOnScreen0(windowOrView, src_x, src_y); + } + + private static native boolean initIDs0(); + private static native Object GetLocationOnScreen0(long windowOrView, int src_x, int src_y); +} diff --git a/src/nativewindow/native/macosx/OSXmisc.c b/src/nativewindow/native/macosx/OSXmisc.c new file mode 100644 index 000000000..24cb8d48f --- /dev/null +++ b/src/nativewindow/native/macosx/OSXmisc.c @@ -0,0 +1,106 @@ +/** + * 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. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> +#include <unistd.h> +#include <AppKit/AppKit.h> + +#include "NativewindowCommon.h" +#include "jogamp_nativewindow_macosx_OSXUtil.h" + +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; + +static int _initialized=0; + +JNIEXPORT jboolean JNICALL +Java_jogamp_nativewindow_macosx_OSXUtil_initIDs0(JNIEnv *env, jclass _unused) { + if(0==_initialized) { + jclass c; + c = (*env)->FindClass(env, ClazzNamePoint); + if(NULL==c) { + NativewindowCommon_FatalError(env, "FatalError Java_jogamp_newt_driver_macosx_MacWindow_initIDs0: can't find %s", ClazzNamePoint); + } + pointClz = (jclass)(*env)->NewGlobalRef(env, c); + (*env)->DeleteLocalRef(env, c); + if(NULL==pointClz) { + NativewindowCommon_FatalError(env, "FatalError Java_jogamp_newt_driver_macosx_MacWindow_initIDs0: can't use %s", ClazzNamePoint); + } + pointCstr = (*env)->GetMethodID(env, pointClz, ClazzAnyCstrName, ClazzNamePointCstrSignature); + if(NULL==pointCstr) { + NativewindowCommon_FatalError(env, "FatalError Java_jogamp_newt_driver_macosx_MacWindow_initIDs0: can't fetch %s.%s %s", + ClazzNamePoint, ClazzAnyCstrName, ClazzNamePointCstrSignature); + } + + _initialized=1; + } + return JNI_TRUE; +} + +/* + * Class: jogamp_newt_driver_macosx_MacWindow + * Method: getLocationOnScreenImpl0 + * Signature: (JII)Ljavax/media/nativewindow/util/Point; + */ +JNIEXPORT jobject JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_GetLocationOnScreen0 + (JNIEnv *env, jclass unused, jlong winOrView, jint src_x, jint src_y) +{ + NSRect r; + int dest_x=-1; + int dest_y=-1; + + NSObject *nsObj = (NSObject*) ((intptr_t) winOrView); + NSWindow* win = NULL; + + if( [nsObj isKindOfClass:[NSWindow class]] ) { + win = (NSWindow*) nsObj; + } else if( nsObj != NULL && [nsObj isKindOfClass:[NSView class]] ) { + NSView* view = (NSView*) nsObj; + win = [view window]; + } else { + NativewindowCommon_throwNewRuntimeException(env, "neither win not view %p\n", nsObj); + } + + r.origin.x = src_x; + r.origin.y = src_x; + r.size.width = 0; + r.size.height = 0; + // NSRect rS = [win convertRectToScreen: r]; // 10.7 + NSPoint oS = [win convertBaseToScreen: r.origin]; + dest_x = (int) oS.x; + dest_y = (int) oS.y; + + return (*env)->NewObject(env, pointClz, pointCstr, (jint)dest_x, (jint)dest_y); +} + |