diff options
-rw-r--r-- | src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java | 4 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java | 16 | ||||
-rw-r--r-- | src/newt/native/MacWindow.m | 54 | ||||
-rw-r--r-- | src/newt/native/NewtMacWindow.h | 13 | ||||
-rw-r--r-- | src/newt/native/NewtMacWindow.m | 43 |
5 files changed, 96 insertions, 34 deletions
diff --git a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java index b2d97c7d5..47977610f 100644 --- a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java +++ b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java @@ -307,6 +307,10 @@ public class NewtCanvasAWT extends java.awt.Canvas implements WindowClosingProto final void requestFocusNEWTChild() { if(null!=newtChild) { newtChild.setFocusAction(null); + // FIXME: Experimental 'steal AWT focus', + // since we have to disable the focus action due to recursion and AWT EDT blocking. + KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); + kfm.clearGlobalFocusOwner(); newtChild.requestFocus(); newtChild.setFocusAction(focusAction); } diff --git a/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java b/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java index 0bb0b6b13..8886cf630 100644 --- a/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java +++ b/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java @@ -181,8 +181,8 @@ public class MacWindow extends WindowImpl { setTitle0(getWindowHandle(), title); } - protected void requestFocusImpl(boolean reparented) { - makeKeyAndOrderFront0(getWindowHandle()); + protected void requestFocusImpl(boolean force) { + requestFocus0(getWindowHandle(), force); } protected boolean reconfigureWindowImpl(int x, int y, int width, int height, int flags) { @@ -196,17 +196,14 @@ public class MacWindow extends WindowImpl { if( getWindowHandle() == 0 ) { if( 0 != ( FLAG_IS_VISIBLE & flags) ) { createWindow(false, pS, width, height, 0 != ( FLAG_IS_FULLSCREEN & flags)); - makeKeyAndOrderFront0(getWindowHandle()); // no native event .. visibleChanged(true, true); - focusChanged(true, true); } /* else { ?? } */ } else { if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) && 0 == ( FLAG_IS_VISIBLE & flags) ) { orderOut0(getWindowHandle()); // no native event .. visibleChanged(true, false); - focusChanged(true, false); } if( 0 != ( FLAG_CHANGE_DECORATION & flags) || 0 != ( FLAG_CHANGE_PARENTING & flags) || @@ -225,10 +222,9 @@ public class MacWindow extends WindowImpl { sizeChanged(true, width, height, false); // incl. validation (incl. repositioning) } if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) && 0 != ( FLAG_IS_VISIBLE & flags) ) { - makeKeyAndOrderFront0(getWindowHandle()); + orderFront0(getWindowHandle()); // no native event .. - visibleChanged(true, true); - focusChanged(true, true); + visibleChanged(true, true); } setAlwaysOnTop0(getWindowHandle(), 0 != ( FLAG_IS_ALWAYSONTOP & flags)); } @@ -447,10 +443,10 @@ public class MacWindow extends WindowImpl { boolean opaque, boolean fullscreen, int windowStyle, int backingStoreType, int screen_idx, long view); - private native void makeKeyAndOrderFront0(long window); - private native void makeKey0(long window); + private native void requestFocus0(long window, boolean force); /** in case of a child window, it actually only issues orderBack(..) */ private native void orderOut0(long window); + private native void orderFront0(long window); private native void close0(long window); private native void setTitle0(long window, String title); private native long contentView0(long window); diff --git a/src/newt/native/MacWindow.m b/src/newt/native/MacWindow.m index fa555d119..871370b0d 100644 --- a/src/newt/native/MacWindow.m +++ b/src/newt/native/MacWindow.m @@ -48,6 +48,7 @@ static const char * const ClazzAnyCstrName = "<init>"; static const char * const ClazzNamePointCstrSignature = "(II)V"; static jclass pointClz = NULL; static jmethodID pointCstr = NULL; +static jmethodID focusActionID = NULL; static NSString* jstringToNSString(JNIEnv* env, jstring jstr) { @@ -243,6 +244,11 @@ JNIEXPORT jboolean JNICALL Java_jogamp_newt_driver_macosx_MacWindow_initIDs0 ClazzNamePoint, ClazzAnyCstrName, ClazzNamePointCstrSignature); } + focusActionID = (*env)->GetMethodID(env, clazz, "focusAction", "()Z"); + if(NULL==focusActionID) { + NewtCommon_FatalError(env, "FatalError Java_jogamp_newt_driver_macosx_MacWindow_initIDs0: can't fetch method focusAction()Z"); + } + // Need this when debugging, as it is necessary to attach gdb to // the running java process -- "gdb java" doesn't work // printf("Going to sleep for 10 seconds\n"); @@ -336,8 +342,7 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_macosx_MacWindow_createWindow0 // Immediately re-position the window based on an upper-left coordinate system setFrameTopLeftPoint(parentWindow, myWindow, x, y); - // [myWindow makeKeyAndOrderFront: myWindow]; - [myWindow performSelectorOnMainThread:@selector(makeKeyAndOrderFront:) withObject:myWindow waitUntilDone:YES]; + [myWindow orderFront: myWindow]; NS_DURING // Available >= 10.5 - Makes the menubar disapear @@ -361,42 +366,50 @@ NS_ENDHANDLER /* * Class: jogamp_newt_driver_macosx_MacWindow - * Method: makeKeyAndOrderFront - * Signature: (J)V + * Method: requestFocus0 + * Signature: (JZ)V */ -JNIEXPORT void JNICALL Java_jogamp_newt_driver_macosx_MacWindow_makeKeyAndOrderFront0 - (JNIEnv *env, jobject unused, jlong window) +JNIEXPORT void JNICALL Java_jogamp_newt_driver_macosx_MacWindow_requestFocus0 + (JNIEnv *env, jobject window, jlong w, jboolean force) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; - NSWindow* win = (NSWindow*) ((intptr_t) window); - - DBG_PRINT( "makeKeyAndOrderFront0 - window: %p (START)\n", win); - - [win performSelectorOnMainThread:@selector(makeKeyAndOrderFront:) withObject:win waitUntilDone:YES]; - // [win makeKeyAndOrderFront: win]; + NSWindow* win = (NSWindow*) ((intptr_t) w); + BOOL hasFocus = [win isKeyWindow]; + + DBG_PRINT( "requestFocus - window: %p, force %d, hasFocus %d (START)\n", win, force, hasFocus); + + if( JNI_TRUE==force || !hasFocus ) { + if( JNI_TRUE==force || JNI_FALSE == (*env)->CallBooleanMethod(env, window, focusActionID) ) { + DBG_PRINT( "makeKeyWindow win %p\n", win); + // [win performSelectorOnMainThread:@selector(orderFrontRegardless) withObject:nil waitUntilDone:YES]; + // [win performSelectorOnMainThread:@selector(makeKeyWindow) withObject:nil waitUntilDone:YES]; + [win orderFrontRegardless]; + [win makeKeyWindow]; + [win makeFirstResponder: nil]; + } + } - DBG_PRINT( "makeKeyAndOrderFront0 - window: %p (END)\n", win); + DBG_PRINT( "requestFocus - window: %p, force %d (END)\n", win, force); [pool release]; } /* * Class: jogamp_newt_driver_macosx_MacWindow - * Method: makeKey + * Method: orderFront0 * Signature: (J)V */ -JNIEXPORT void JNICALL Java_jogamp_newt_driver_macosx_MacWindow_makeKey0 +JNIEXPORT void JNICALL Java_jogamp_newt_driver_macosx_MacWindow_orderFront0 (JNIEnv *env, jobject unused, jlong window) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSWindow* win = (NSWindow*) ((intptr_t) window); - DBG_PRINT( "makeKey0 - window: %p (START)\n", win); + DBG_PRINT( "orderFront0 - window: %p (START)\n", win); - [win performSelectorOnMainThread:@selector(makeKeyWindow:) withObject:nil waitUntilDone:YES]; - // [win makeKeyWindow]; + [win orderFrontRegardless]; - DBG_PRINT( "makeKey0 - window: %p (END)\n", win); + DBG_PRINT( "orderFront0 - window: %p (END)\n", win); [pool release]; } @@ -415,7 +428,6 @@ JNIEXPORT void JNICALL Java_jogamp_newt_driver_macosx_MacWindow_orderOut0 DBG_PRINT( "orderOut0 - window: (parent %p) %p (START)\n", pWin, mWin); - // [mWin performSelectorOnMainThread:@selector(orderOut:) withObject:mWin waitUntilDone:NO]; if(NULL == pWin) { [mWin orderOut: mWin]; } else { @@ -458,7 +470,6 @@ NS_ENDHANDLER } [mWin orderOut: mWin]; - // [mWin performSelectorOnMainThread:@selector(close:) withObject:nil waitUntilDone:NO]; [mWin close]; // performs release! DBG_PRINT( "*************** windowClose.X: %p (parent %p)\n", mWin, pWin); @@ -481,7 +492,6 @@ JNIEXPORT void JNICALL Java_jogamp_newt_driver_macosx_MacWindow_setTitle0 NSString* str = jstringToNSString(env, title); [str autorelease]; - // [win performSelectorOnMainThread:@selector(setTitle:) withObject:str waitUntilDone:NO]; [win setTitle: str]; DBG_PRINT( "setTitle0 - window: %p (END)\n", win); diff --git a/src/newt/native/NewtMacWindow.h b/src/newt/native/NewtMacWindow.h index 532eba6b4..648b68275 100644 --- a/src/newt/native/NewtMacWindow.h +++ b/src/newt/native/NewtMacWindow.h @@ -80,6 +80,8 @@ - (void) rightMouseDown: (NSEvent*) theEvent; - (void) resetCursorRects; +- (BOOL) acceptsFirstResponder; + @end #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 @@ -100,10 +102,8 @@ + (BOOL) initNatives: (JNIEnv*) env forClass: (jobject) clazz; - (NSPoint) newtScreenWinPos2OSXScreenPos: (NSPoint) p; - - (NSPoint) newtClientWinPos2OSXScreenPos: (NSPoint) p; - (NSPoint) getLocationOnScreen: (NSPoint) p; - - (NSPoint) screenPos2NewtClientWinPos: (NSPoint) p; - (void) cursorHide:(BOOL)v; @@ -113,6 +113,15 @@ - (void) updateInsets: (JNIEnv*) env; +- (BOOL) becomeFirstResponder; +- (BOOL) resignFirstResponder; +- (void) becomeKeyWindow; +- (void) windowDidBecomeKey: (NSNotification *) notification; +- (void) sendFocusGained; +- (void) resignKeyWindow; +- (void) windowDidResignKey: (NSNotification *) notification; +- (void) sendFocusLost; + - (id) initWithContentRect: (NSRect) contentRect styleMask: (NSUInteger) windowStyle backing: (NSBackingStoreType) bufferingType diff --git a/src/newt/native/NewtMacWindow.m b/src/newt/native/NewtMacWindow.m index d4e2c2b6d..bb7fddb60 100644 --- a/src/newt/native/NewtMacWindow.m +++ b/src/newt/native/NewtMacWindow.m @@ -213,6 +213,11 @@ static jmethodID windowDestroyNotifyID = NULL; [super viewDidUnhide]; } +- (BOOL)acceptsFirstResponder +{ + return YES; +} + @end @implementation NewtMacWindow @@ -742,8 +747,33 @@ static jint mods2JavaMods(NSUInteger mods) [pool release]; } +- (BOOL) becomeFirstResponder +{ + DBG_PRINT( "*************** becomeFirstResponder\n"); + return [super becomeFirstResponder]; +} + +- (BOOL) resignFirstResponder +{ + DBG_PRINT( "*************** resignFirstResponder\n"); + return [super resignFirstResponder]; +} + +- (void) becomeKeyWindow +{ + DBG_PRINT( "*************** becomeKeyWindow\n"); + [super becomeKeyWindow]; +} + - (void) windowDidBecomeKey: (NSNotification *) notification { + DBG_PRINT( "*************** windowDidBecomeKey\n"); + [self sendFocusGained]; +} + +- (void) sendFocusGained +{ + DBG_PRINT( "sendFocusGained\n"); NSView* nsview = [self contentView]; if( ! [nsview isMemberOfClass:[NewtView class]] ) { return; @@ -769,8 +799,21 @@ static jint mods2JavaMods(NSUInteger mods) } } +- (void) resignKeyWindow +{ + DBG_PRINT( "*************** becomeKeyWindow\n"); + [super becomeKeyWindow]; +} + - (void) windowDidResignKey: (NSNotification *) notification { + DBG_PRINT( "*************** windowDidResignKey\n"); + [self sendFocusLost]; +} + +- (void) sendFocusLost +{ + DBG_PRINT( "sendFocusLost\n"); NSView* nsview = [self contentView]; if( ! [nsview isMemberOfClass:[NewtView class]] ) { return; |