From 3db4e89cb2c36f63c6d0a8f3450705d1ef3694b0 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Fri, 18 Nov 2011 09:14:08 +0100
Subject: NEWT/AWT Focus Traversal / Deadlock Fix (Windows) ; Harmonized NEWT
 KeyListener handling (Bug 526)

NativeWindow:
  - expose 'hasFocus()'

Window:
  - 'protected enqueueRequestFocus(..)' -> 'public requestFocus(boolean wait)'

  - New: 'setKeyboardFocusHandler(KeyListener)' allowing focus traversal co-op w/ covered TK (AWT)

WindowImpl:
  - Impl Window changes (see above)
  - Impl 'consumedTag' see commit 3b38957f36d4f89b85730755a41c00892ac70591

NewtCanvasAWT:
  - FocusAction only removes the global AWT focus owner.
    This fixes a deadlock on the Windows platform of AWT's native peer requestFocus impl,
    since it's no more called at this point.

  - NEW FocusTraversalKeyListener is set as the newtChild's KeyboardFocusHandler,
    allowing traversal to the next/previous AWT component.

AWTParentWindowAdapter:
  - focusGained(..) clears AWT focus and propagates focus to Newt child,
    non blocking w/ 'requestFocus(false)' (see above)

KeyEvent:
  - Document limitations of getKeyChar() (Bug 526)

MacWindow:
  - only deliver keyChar on key Typed events, harmonizing platform behavior (Bug 526)

WindowsWindow:
  - regenerate the keyCode for EVENT_KEY_TYPED (Bug 526)

X11Windows:
  - complete keyCode mapping X11 -> Newt - X11KeySym2NewtVKey()
  - only deliver keyChar on key Typed events, harmonizing platform behavior (Bug 526)

Tests:
  - GearsES2: Make focus visible
  - TestParentingFocusTraversal01AWT: unit test for keyboard focus traversal w/ NewtCanvasAWT
---
 .../classes/jogamp/newt/driver/macosx/MacWindow.java     | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

(limited to 'src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java')

diff --git a/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java b/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java
index 292a9c255..e1b2ef87d 100644
--- a/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java
+++ b/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java
@@ -311,20 +311,24 @@ public class MacWindow extends WindowImpl implements SurfaceChangeable {
     
     @Override
     public void sendKeyEvent(int eventType, int modifiers, int keyCode, char keyChar) {
-        final int key = convertKeyChar(keyChar);
-        if(DEBUG_IMPLEMENTATION) System.err.println("MacWindow.sendKeyEvent "+Thread.currentThread().getName());
         // Note that we send the key char for the key code on this
         // platform -- we do not get any useful key codes out of the system
-        super.sendKeyEvent(eventType, modifiers, key, keyChar);        
+        final int keyCode2 = convertKeyChar(keyChar);
+        if(DEBUG_IMPLEMENTATION) System.err.println("MacWindow.sendKeyEvent "+Thread.currentThread().getName()+" char: "+keyChar+", code 0x"+Integer.toHexString(keyCode)+" -> 0x"+Integer.toHexString(keyCode2));
+        // only deliver keyChar on key Typed events, harmonizing platform behavior
+        keyChar = KeyEvent.EVENT_KEY_TYPED == eventType ? keyChar : (char)-1;
+        super.sendKeyEvent(eventType, modifiers, keyCode2, keyChar);        
     }
     
     @Override
     public void enqueueKeyEvent(boolean wait, int eventType, int modifiers, int keyCode, char keyChar) {
-        final int key = convertKeyChar(keyChar);
-        if(DEBUG_IMPLEMENTATION) System.err.println("MacWindow.enqueueKeyEvent "+Thread.currentThread().getName());
         // Note that we send the key char for the key code on this
         // platform -- we do not get any useful key codes out of the system
-        super.enqueueKeyEvent(wait, eventType, modifiers, key, keyChar);
+        final int keyCode2 = convertKeyChar(keyChar);
+        if(DEBUG_IMPLEMENTATION) System.err.println("MacWindow.enqueueKeyEvent "+Thread.currentThread().getName()+" char: "+keyChar+", code 0x"+Integer.toHexString(keyCode)+" -> 0x"+Integer.toHexString(keyCode2));
+        // only deliver keyChar on key Typed events, harmonizing platform behavior
+        keyChar = KeyEvent.EVENT_KEY_TYPED == eventType ? keyChar : (char)-1;
+        super.enqueueKeyEvent(wait, eventType, modifiers, keyCode2, keyChar);
     }
 
     //----------------------------------------------------------------------
-- 
cgit v1.2.3