summaryrefslogtreecommitdiffstats
path: root/src/nativewindow
diff options
context:
space:
mode:
Diffstat (limited to 'src/nativewindow')
-rw-r--r--src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java3
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java13
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java39
-rw-r--r--src/nativewindow/native/macosx/OSXmisc.c106
4 files changed, 159 insertions, 2 deletions
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);
+}
+