diff options
author | Sven Gothel <[email protected]> | 2011-09-25 04:28:47 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-09-25 04:28:47 +0200 |
commit | b72bedc93e4dca6d3c55cae0cc811cb4baac13e0 (patch) | |
tree | 020d3c36e5b452e0ec813882e652bb835d8218d7 /src | |
parent | b7ca9b5dffa8c6d197258e1bcd7b065c36136d17 (diff) |
NativeWindow/OSX: Add nativewindow_macosx lib and nativewindow.os.macosx.jar for 'GetLocationOnScreen()'
Diffstat (limited to 'src')
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); +} + |