From b72bedc93e4dca6d3c55cae0cc811cb4baac13e0 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sun, 25 Sep 2011 04:28:47 +0200 Subject: NativeWindow/OSX: Add nativewindow_macosx lib and nativewindow.os.macosx.jar for 'GetLocationOnScreen()' --- make/build-common.xml | 4 + make/build-nativewindow.xml | 31 +++++- .../media/nativewindow/NativeWindowFactory.java | 3 + .../nativewindow/jawt/macosx/MacOSXJAWTWindow.java | 13 ++- .../jogamp/nativewindow/macosx/OSXUtil.java | 39 ++++++++ src/nativewindow/native/macosx/OSXmisc.c | 106 +++++++++++++++++++++ 6 files changed, 191 insertions(+), 5 deletions(-) create mode 100644 src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java create mode 100644 src/nativewindow/native/macosx/OSXmisc.c 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 @@ + + + + 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/**"/> + value="javax/media/nativewindow/* javax/media/nativewindow/util/* javax/media/nativewindow/egl/* com/jogamp/nativewindow/* jogamp/nativewindow/* jogamp/nativewindow/jvm/* ${java.part.swt}"/> @@ -81,6 +81,9 @@ + + + + + + + @@ -749,7 +767,14 @@ - + + + + + + + () { 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 +#include +#include +#include +#include +#include + +#include "NativewindowCommon.h" +#include "jogamp_nativewindow_macosx_OSXUtil.h" + +static const char * const ClazzNamePoint = "javax/media/nativewindow/util/Point"; +static const char * const ClazzAnyCstrName = ""; +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