From b72bedc93e4dca6d3c55cae0cc811cb4baac13e0 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Sun, 25 Sep 2011 04:28:47 +0200
Subject: NativeWindow/OSX: Add nativewindow_macosx lib and
 nativewindow.os.macosx.jar for 'GetLocationOnScreen()'

---
 .../media/nativewindow/NativeWindowFactory.java    |   3 +
 .../nativewindow/jawt/macosx/MacOSXJAWTWindow.java |  13 ++-
 .../jogamp/nativewindow/macosx/OSXUtil.java        |  39 ++++++++
 src/nativewindow/native/macosx/OSXmisc.c           | 106 +++++++++++++++++++++
 4 files changed, 159 insertions(+), 2 deletions(-)
 create mode 100644 src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java
 create mode 100644 src/nativewindow/native/macosx/OSXmisc.c

(limited to 'src')

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);
+}
+
-- 
cgit v1.2.3