Jogamp
NativeWindow/OSX: Add nativewindow_macosx lib and nativewindow.os.macosx.jar for...
authorSven Gothel <sgothel@jausoft.com>
Sun, 25 Sep 2011 02:28:47 +0000 (04:28 +0200)
committerSven Gothel <sgothel@jausoft.com>
Sun, 25 Sep 2011 02:28:47 +0000 (04:28 +0200)
make/build-common.xml
make/build-nativewindow.xml
src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java
src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java
src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java [new file with mode: 0644]
src/nativewindow/native/macosx/OSXmisc.c [new file with mode: 0644]

index 1145258..58a829f 100644 (file)
         <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}" />
index b13e9b0..244f610 100644 (file)
@@ -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"
           <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
                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 -->
         </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}"
index 5c01c68..ef8876f 100644 (file)
@@ -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",
index 9c29bbd..d0152ce 100644 (file)
@@ -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 (file)
index 0000000..ffd23fe
--- /dev/null
@@ -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 (file)
index 0000000..24cb8d4
--- /dev/null
@@ -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);
+}
+
http://JogAmp.org git info: FAQ, tutorial and man pages.