aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2010-09-03 00:06:03 +0300
committerSven Gothel <[email protected]>2010-09-03 00:06:03 +0300
commit340b1ceb07907be113e33c54d084e53ddc93e368 (patch)
tree2839cd761cbe52ee39151ef24f5c7c4ddca36b5d
parent1b2f7ebe62ce661eb32cc9caf74c6c49c8c5f15a (diff)
NEWT: Focus Fix + Cleanup
Issueing 'requestFocus' via the native EDT dispatch loop may cause a deadlock, due to a possible implicite AWT requestFocus call (NewtCanvasAWT). Approach: RequestFocus issued directly, by Window.requestFocus() and the native EDT dispatch loop, is queued for later execution by EDT. This shall decouple a possible native windowing TK resource collision. - X11Windows.c: Add missing 'reparented' param for requestFocus to force requestFocus after reparenting. - AWTWindow.java: Add requestFocusImpl() +++ NEWT: Cleanup - Remove Event Type Bits in: - EventListener.h - NEWTEventListener.java - Remove InputEvent 'consume' status -
-rw-r--r--src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java20
-rw-r--r--src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01cAWT.java3
-rw-r--r--src/newt/classes/com/jogamp/newt/Display.java6
-rw-r--r--src/newt/classes/com/jogamp/newt/Window.java28
-rw-r--r--src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java30
-rw-r--r--src/newt/classes/com/jogamp/newt/event/InputEvent.java9
-rw-r--r--src/newt/classes/com/jogamp/newt/event/NEWTEvent.java9
-rw-r--r--src/newt/classes/com/jogamp/newt/event/NEWTEventConsumer.java4
-rw-r--r--src/newt/classes/com/jogamp/newt/event/NEWTEventListener.java5
-rw-r--r--src/newt/classes/com/jogamp/newt/impl/awt/AWTDisplay.java2
-rw-r--r--src/newt/classes/com/jogamp/newt/impl/awt/AWTWindow.java8
-rw-r--r--src/newt/native/BroadcomEGL.c1
-rw-r--r--src/newt/native/EventListener.h9
-rw-r--r--src/newt/native/IntelGDL.c1
-rw-r--r--src/newt/native/KDWindow.c1
-rw-r--r--src/newt/native/MacWindow.m1
-rw-r--r--src/newt/native/WindowsWindow.c19
-rw-r--r--src/newt/native/X11Window.c28
18 files changed, 98 insertions, 86 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java
index 61705439e..9dc77679b 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java
@@ -250,14 +250,14 @@ public abstract class GLContextImpl extends GLContext {
* MakeCurrent functionality, which also issues the creation of the actual OpenGL context.<br>
* The complete callgraph for general OpenGL context creation is:<br>
* <ul>
- * <li> {@link #makeCurrent} <i>GLContextImpl</i>
- * <li> {@link #makeCurrentImpl} <i>Platform Implementation</i>
- * <li> {@link #create} <i>Platform Implementation</i>
+ * <li> {@link #makeCurrent} <i>GLContextImpl</i></li>
+ * <li> {@link #makeCurrentImpl} <i>Platform Implementation</i></li>
+ * <li> {@link #create} <i>Platform Implementation</i></li>
* <li> If <code>ARB_create_context</code> is supported:
* <ul>
- * <li> {@link #createContextARB} <i>GLContextImpl</i>
- * <li> {@link #createContextARBImpl} <i>Platform Implementation</i>
- * </ul>
+ * <li> {@link #createContextARB} <i>GLContextImpl</i></li>
+ * <li> {@link #createContextARBImpl} <i>Platform Implementation</i></li>
+ * </ul></li>
* </ul><br>
*
* Once at startup, ie triggered by the singleton constructor of a {@link GLDrawableFactoryImpl} specialization,
@@ -267,10 +267,10 @@ public abstract class GLContextImpl extends GLContext {
* <ul>
* <li> {@link #createContextARBMapVersionsAvailable}
* <ul>
- * <li> {@link #createContextARBVersions}
- * </ul>
- * <li> {@link #mapVersionAvailable}
- * </ul>
+ * <li> {@link #createContextARBVersions}</li>
+ * </ul></li>
+ * <li> {@link #mapVersionAvailable}</li>
+ * </ul></li>
* </ul><br>
*
* @see #makeCurrentImpl
diff --git a/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01cAWT.java b/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01cAWT.java
index 0233a6aad..abd5b95ce 100644
--- a/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01cAWT.java
+++ b/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01cAWT.java
@@ -73,7 +73,6 @@ public class TestParenting01cAWT {
static int width, height;
static long durationPerTest = 800;
- static long waitReparent = 0;
static GLCapabilities glCaps;
@BeforeClass
@@ -232,8 +231,6 @@ public class TestParenting01cAWT {
for(int i=0; i<args.length; i++) {
if(args[i].equals("-time")) {
durationPerTest = atoi(args[++i]);
- } else if(args[i].equals("-wait")) {
- waitReparent = atoi(args[++i]);
}
}
String tstname = TestParenting01cAWT.class.getName();
diff --git a/src/newt/classes/com/jogamp/newt/Display.java b/src/newt/classes/com/jogamp/newt/Display.java
index 00abd8406..b9ef93572 100644
--- a/src/newt/classes/com/jogamp/newt/Display.java
+++ b/src/newt/classes/com/jogamp/newt/Display.java
@@ -181,7 +181,7 @@ public abstract class Display {
}
}
- public boolean runCreateAndDestroyOnEDT() {
+ protected boolean getShallRunOnEDT() {
return true;
}
@@ -232,7 +232,7 @@ public abstract class Display {
public void runOnEDTIfAvail(boolean wait, final Runnable task) {
EDTUtil _edtUtil = getEDTUtil();
- if(runCreateAndDestroyOnEDT() && null!=_edtUtil) {
+ if(getShallRunOnEDT() && null!=_edtUtil) {
_edtUtil.invoke(wait, task);
} else {
task.run();
@@ -363,7 +363,7 @@ public abstract class Display {
enqueueEvent(false, event);
}
} else {
- throw new RuntimeException("Event source not a NEWT one: "+source.getClass().getName()+", "+source);
+ throw new RuntimeException("Event source not NEWT: "+source.getClass().getName()+", "+source);
}
eventTask.notifyIssuer();
}
diff --git a/src/newt/classes/com/jogamp/newt/Window.java b/src/newt/classes/com/jogamp/newt/Window.java
index 0ec8a109b..d002791ca 100644
--- a/src/newt/classes/com/jogamp/newt/Window.java
+++ b/src/newt/classes/com/jogamp/newt/Window.java
@@ -297,12 +297,21 @@ public abstract class Window implements NativeWindow, NEWTEventConsumer
}
public void requestFocus() {
- if(0 != windowHandle) {
- requestFocusImpl();
- }
+ enqueueRequestFocus(false); // FIXME: or shall we wait ?
}
protected void requestFocusImpl() {}
+ class RequestFocusAction implements Runnable {
+ public void run() {
+ Window.this.requestFocusImpl();
+ }
+ }
+ RequestFocusAction requestFocusAction = new RequestFocusAction();
+
+ public void enqueueRequestFocus(boolean wait) {
+ runOnEDTIfAvail(wait, requestFocusAction);
+ }
+
/**
* May set to a {@link FocusRunnable}, {@link FocusRunnable#run()} before Newt requests the native focus.
* This allows notifying a covered window toolkit like AWT that the focus is requested,
@@ -985,20 +994,19 @@ public abstract class Window implements NativeWindow, NEWTEventConsumer
switch(e.getEventType()) {
case WindowEvent.EVENT_WINDOW_REPAINT:
if( windowIsLocked() ) {
+ // make sure only one repaint event is queued
if(!repaintQueued) {
repaintQueued=true;
return false;
- } else {
- return true;
}
- } else {
- if(DEBUG_IMPLEMENTATION) {
+ return true;
+ }
+ if(DEBUG_IMPLEMENTATION) {
System.out.println("Window.windowRepaint: "+e);
// Exception ee = new Exception("Window.windowRepaint: "+e);
// ee.printStackTrace();
- }
- repaintQueued=false;
}
+ repaintQueued=false; // no repaint event queued
break;
default:
break;
@@ -1009,6 +1017,8 @@ public abstract class Window implements NativeWindow, NEWTEventConsumer
getInnerWindow().consumeKeyEvent((KeyEvent)e);
} else if(e instanceof MouseEvent) {
getInnerWindow().consumeMouseEvent((MouseEvent)e);
+ } else {
+ throw new NativeWindowException("Unexpected NEWTEvent type " + e);
}
return true;
}
diff --git a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
index 6fd924e66..57647df5c 100644
--- a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
+++ b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
@@ -96,7 +96,7 @@ public class NewtCanvasAWT extends java.awt.Canvas {
if(DEBUG_IMPLEMENTATION) {
System.out.println("FocusActionImpl.run() "+Window.getThreadName());
}
- NewtCanvasAWT.this.requestFocusAWT();
+ NewtCanvasAWT.this.requestFocusAWTParent();
}
}
FocusActionImpl focusActionImpl = new FocusActionImpl();
@@ -213,12 +213,11 @@ public class NewtCanvasAWT extends java.awt.Canvas {
}
}
- void requestFocusAWT() {
+ final void requestFocusAWTParent() {
super.requestFocus();
}
- public void requestFocus() {
- super.requestFocus();
+ final void requestFocusNEWTChild() {
if(null!=newtChild) {
newtChild.setFocusAction(null);
newtChild.requestFocus();
@@ -226,32 +225,31 @@ public class NewtCanvasAWT extends java.awt.Canvas {
}
}
+ public void requestFocus() {
+ requestFocusAWTParent();
+ requestFocusNEWTChild();
+ }
+
public boolean requestFocus(boolean temporary) {
boolean res = super.requestFocus(temporary);
- if(res && null!=newtChild) {
- newtChild.setFocusAction(null);
- newtChild.requestFocus();
- newtChild.setFocusAction(focusAction);
+ if(res) {
+ requestFocusNEWTChild();
}
return res;
}
public boolean requestFocusInWindow() {
boolean res = super.requestFocusInWindow();
- if(res && null!=newtChild) {
- newtChild.setFocusAction(null);
- newtChild.requestFocus();
- newtChild.setFocusAction(focusAction);
+ if(res) {
+ requestFocusNEWTChild();
}
return res;
}
public boolean requestFocusInWindow(boolean temporary) {
boolean res = super.requestFocusInWindow(temporary);
- if(res && null!=newtChild) {
- newtChild.setFocusAction(null);
- newtChild.requestFocus();
- newtChild.setFocusAction(focusAction);
+ if(res) {
+ requestFocusNEWTChild();
}
return res;
}
diff --git a/src/newt/classes/com/jogamp/newt/event/InputEvent.java b/src/newt/classes/com/jogamp/newt/event/InputEvent.java
index 02fbe59ef..d014de7f3 100644
--- a/src/newt/classes/com/jogamp/newt/event/InputEvent.java
+++ b/src/newt/classes/com/jogamp/newt/event/InputEvent.java
@@ -48,17 +48,9 @@ public abstract class InputEvent extends NEWTEvent
protected InputEvent(int eventType, Object source, long when, int modifiers) {
super(eventType, source, when);
- this.consumed=false;
this.modifiers=modifiers;
}
- public void consume() {
- consumed=true;
- }
-
- public boolean isConsumed() {
- return consumed;
- }
public int getModifiers() {
return modifiers;
}
@@ -94,6 +86,5 @@ public abstract class InputEvent extends NEWTEvent
return "InputEvent[modifiers:"+modifiers+", "+super.toString()+"]";
}
- private boolean consumed;
private int modifiers;
}
diff --git a/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java b/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java
index 9afcb840c..c85fc5f64 100644
--- a/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java
+++ b/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java
@@ -40,6 +40,13 @@ import java.util.*;
* NEWT events are provided for notification purposes ONLY;<br>
* The NEWT will automatically handle the event semantics internally, regardless of whether a program is receiving these events or not.<br>
* The actual event semantic is processed before the event is send.<br>
+ *
+ * Event type registry:<br>
+ * <ul>
+ * <li> WindowEvent <code>100..10x</code></li>
+ * <li> MouseEvent <code>200..20x</code></li>
+ * <li> KeyEvent <code>300..30x</code></li>
+ * </ul><br>
*/
public class NEWTEvent extends java.util.EventObject {
private boolean isSystemEvent;
@@ -61,6 +68,8 @@ public class NEWTEvent extends java.util.EventObject {
// 2: com.jogamp.newt.Window
// 2: com.jogamp.newt.event.awt.AWTNewtEventFactory
//
+ // FIXME: verify the isSystemEvent evaluation
+ //
static final String WindowClazzName = "com.jogamp.newt.Window" ;
static final String AWTNewtEventFactoryClazzName = "com.jogamp.newt.event.awt.AWTNewtEventFactory" ;
diff --git a/src/newt/classes/com/jogamp/newt/event/NEWTEventConsumer.java b/src/newt/classes/com/jogamp/newt/event/NEWTEventConsumer.java
index e37c820a1..d3d897f3b 100644
--- a/src/newt/classes/com/jogamp/newt/event/NEWTEventConsumer.java
+++ b/src/newt/classes/com/jogamp/newt/event/NEWTEventConsumer.java
@@ -36,8 +36,8 @@ public interface NEWTEventConsumer {
/**
* Consume the event
*
- * @return true if the event can be consumed now,
- * otherwise propagate it later.
+ * @return true if the event has been consumed,
+ * otherwise it returns false for later propagation.
*/
public boolean consumeEvent(NEWTEvent event);
}
diff --git a/src/newt/classes/com/jogamp/newt/event/NEWTEventListener.java b/src/newt/classes/com/jogamp/newt/event/NEWTEventListener.java
index 2a187f8c4..90d00383d 100644
--- a/src/newt/classes/com/jogamp/newt/event/NEWTEventListener.java
+++ b/src/newt/classes/com/jogamp/newt/event/NEWTEventListener.java
@@ -37,10 +37,5 @@ import com.jogamp.newt.*;
public interface NEWTEventListener extends java.util.EventListener
{
- public static final int WINDOW = 1 << 0;
- public static final int MOUSE = 1 << 1;
- public static final int KEY = 1 << 2;
- public static final int SURFACE = 1 << 3;
-
}
diff --git a/src/newt/classes/com/jogamp/newt/impl/awt/AWTDisplay.java b/src/newt/classes/com/jogamp/newt/impl/awt/AWTDisplay.java
index e705d364a..92c4e53eb 100644
--- a/src/newt/classes/com/jogamp/newt/impl/awt/AWTDisplay.java
+++ b/src/newt/classes/com/jogamp/newt/impl/awt/AWTDisplay.java
@@ -54,7 +54,7 @@ public class AWTDisplay extends Display {
protected void closeNative() { }
- public boolean runCreateAndDestroyOnEDT() {
+ protected boolean getShallRunOnEDT() {
return false;
}
protected void dispatchMessagesNative() { /* nop */ }
diff --git a/src/newt/classes/com/jogamp/newt/impl/awt/AWTWindow.java b/src/newt/classes/com/jogamp/newt/impl/awt/AWTWindow.java
index 56e5a4240..db55aee6f 100644
--- a/src/newt/classes/com/jogamp/newt/impl/awt/AWTWindow.java
+++ b/src/newt/classes/com/jogamp/newt/impl/awt/AWTWindow.java
@@ -84,6 +84,14 @@ public class AWTWindow extends Window {
// non fullscreen dimensions ..
private int nfs_width, nfs_height, nfs_x, nfs_y;
+ protected void requestFocusImpl() {
+ runOnEDT(true, new Runnable() {
+ public void run() {
+ container.requestFocus();
+ }
+ });
+ }
+
protected void setTitleImpl(final String title) {
runOnEDT(true, new Runnable() {
public void run() {
diff --git a/src/newt/native/BroadcomEGL.c b/src/newt/native/BroadcomEGL.c
index 7bb21cd3b..ddac0ef45 100644
--- a/src/newt/native/BroadcomEGL.c
+++ b/src/newt/native/BroadcomEGL.c
@@ -43,7 +43,6 @@
#include "com_jogamp_newt_impl_opengl_broadcom_egl_Window.h"
-#include "EventListener.h"
#include "MouseEvent.h"
#include "KeyEvent.h"
diff --git a/src/newt/native/EventListener.h b/src/newt/native/EventListener.h
deleted file mode 100644
index 2e0e92323..000000000
--- a/src/newt/native/EventListener.h
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#ifndef _EVENT_LISTSENER_H
-#define _EVENT_LISTSENER_H
-
-#define EVENT_WINDOW (1 << 0)
-#define EVENT_MOUSE (1 << 1)
-#define EVENT_KEY (1 << 2)
-
-#endif
diff --git a/src/newt/native/IntelGDL.c b/src/newt/native/IntelGDL.c
index 8a4d7172c..eb6becbbd 100644
--- a/src/newt/native/IntelGDL.c
+++ b/src/newt/native/IntelGDL.c
@@ -41,7 +41,6 @@
#include "com_jogamp_newt_impl_intel_gdl_Screen.h"
#include "com_jogamp_newt_impl_intel_gdl_Window.h"
-#include "EventListener.h"
#include "MouseEvent.h"
#include "KeyEvent.h"
diff --git a/src/newt/native/KDWindow.c b/src/newt/native/KDWindow.c
index b67b8dbd3..75a2fe1a1 100644
--- a/src/newt/native/KDWindow.c
+++ b/src/newt/native/KDWindow.c
@@ -66,7 +66,6 @@
#include "com_jogamp_newt_impl_opengl_kd_KDWindow.h"
-#include "EventListener.h"
#include "MouseEvent.h"
#include "KeyEvent.h"
diff --git a/src/newt/native/MacWindow.m b/src/newt/native/MacWindow.m
index 6e8599d92..950a26acc 100644
--- a/src/newt/native/MacWindow.m
+++ b/src/newt/native/MacWindow.m
@@ -36,7 +36,6 @@
#import "com_jogamp_newt_impl_macosx_MacWindow.h"
#import "NewtMacWindow.h"
-#import "EventListener.h"
#import "MouseEvent.h"
#import "KeyEvent.h"
diff --git a/src/newt/native/WindowsWindow.c b/src/newt/native/WindowsWindow.c
index cda6a4086..6b8f2b73f 100644
--- a/src/newt/native/WindowsWindow.c
+++ b/src/newt/native/WindowsWindow.c
@@ -91,7 +91,6 @@
#include "com_jogamp_newt_impl_windows_WindowsWindow.h"
-#include "EventListener.h"
#include "MouseEvent.h"
#include "InputEvent.h"
#include "KeyEvent.h"
@@ -117,9 +116,12 @@ static jmethodID visibleChangedID = NULL;
static jmethodID windowDestroyNotifyID = NULL;
static jmethodID windowDestroyedID = NULL;
static jmethodID windowRepaintID = NULL;
+static jmethodID enqueueMouseEventID = NULL;
static jmethodID sendMouseEventID = NULL;
+static jmethodID enqueueKeyEventID = NULL;
static jmethodID sendKeyEventID = NULL;
static jmethodID focusActionID = NULL;
+static jmethodID enqueueRequestFocusID = NULL;
static RECT* UpdateInsets(JNIEnv *env, HWND hwnd, jobject window);
@@ -806,7 +808,7 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message,
case WM_LBUTTONDOWN:
DBG_PRINT("*** WindowsWindow: LBUTTONDOWN\n");
- NewtWindows_requestFocus ( env, window, wnd, FALSE ); // request focus on this window, if not already ..
+ (*env)->CallVoidMethod(env, window, enqueueRequestFocusID, JNI_FALSE);
(*env)->CallVoidMethod(env, window, sendMouseEventID,
(jint) EVENT_MOUSE_PRESSED,
GetModifiers(),
@@ -826,7 +828,7 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message,
case WM_MBUTTONDOWN:
DBG_PRINT("*** WindowsWindow: MBUTTONDOWN\n");
- NewtWindows_requestFocus ( env, window, wnd, FALSE ); // request focus on this window, if not already ..
+ (*env)->CallVoidMethod(env, window, enqueueRequestFocusID, JNI_FALSE);
(*env)->CallVoidMethod(env, window, sendMouseEventID,
(jint) EVENT_MOUSE_PRESSED,
GetModifiers(),
@@ -846,7 +848,7 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message,
case WM_RBUTTONDOWN:
DBG_PRINT("*** WindowsWindow: RBUTTONDOWN\n");
- NewtWindows_requestFocus ( env, window, wnd, FALSE ); // request focus on this window, if not already ..
+ (*env)->CallVoidMethod(env, window, enqueueRequestFocusID, JNI_FALSE);
(*env)->CallVoidMethod(env, window, sendMouseEventID,
(jint) EVENT_MOUSE_PRESSED,
GetModifiers(),
@@ -1075,8 +1077,11 @@ JNIEXPORT jboolean JNICALL Java_com_jogamp_newt_impl_windows_WindowsWindow_initI
windowDestroyNotifyID = (*env)->GetMethodID(env, clazz, "windowDestroyNotify", "()V");
windowDestroyedID = (*env)->GetMethodID(env, clazz, "windowDestroyed", "()V");
windowRepaintID = (*env)->GetMethodID(env, clazz, "windowRepaint", "(IIII)V");
+ enqueueMouseEventID = (*env)->GetMethodID(env, clazz, "enqueueMouseEvent", "(ZIIIIII)V");
sendMouseEventID = (*env)->GetMethodID(env, clazz, "sendMouseEvent", "(IIIIII)V");
+ enqueueKeyEventID = (*env)->GetMethodID(env, clazz, "enqueueKeyEvent", "(ZIIIC)V");
sendKeyEventID = (*env)->GetMethodID(env, clazz, "sendKeyEvent", "(IIIC)V");
+ enqueueRequestFocusID = (*env)->GetMethodID(env, clazz, "enqueueRequestFocus", "(Z)V");
focusActionID = (*env)->GetMethodID(env, clazz, "focusAction", "()Z");
if (insetsChangedID == NULL ||
@@ -1087,10 +1092,12 @@ JNIEXPORT jboolean JNICALL Java_com_jogamp_newt_impl_windows_WindowsWindow_initI
windowDestroyNotifyID == NULL ||
windowDestroyedID == NULL ||
windowRepaintID == NULL ||
+ enqueueMouseEventID == NULL ||
sendMouseEventID == NULL ||
+ enqueueKeyEventID == NULL ||
sendKeyEventID == NULL ||
- focusActionID == NULL)
- {
+ focusActionID == NULL ||
+ enqueueRequestFocusID == NULL) {
return JNI_FALSE;
}
BuildDynamicKeyMapTable();
diff --git a/src/newt/native/X11Window.c b/src/newt/native/X11Window.c
index 11c11915d..61575c947 100644
--- a/src/newt/native/X11Window.c
+++ b/src/newt/native/X11Window.c
@@ -49,7 +49,6 @@
#include "com_jogamp_newt_impl_x11_X11Window.h"
-#include "EventListener.h"
#include "MouseEvent.h"
#include "KeyEvent.h"
#include "WindowEvent.h"
@@ -160,9 +159,12 @@ static jmethodID windowDestroyNotifyID = NULL;
static jmethodID windowDestroyedID = NULL;
static jmethodID windowRepaintID = NULL;
static jmethodID windowCreatedID = NULL;
+static jmethodID enqueueMouseEventID = NULL;
static jmethodID sendMouseEventID = NULL;
+static jmethodID enqueueKeyEventID = NULL;
static jmethodID sendKeyEventID = NULL;
static jmethodID focusActionID = NULL;
+static jmethodID enqueueRequestFocusID = NULL;
static jmethodID displayCompletedID = NULL;
@@ -391,11 +393,12 @@ static Window NewtWindows_getParent (Display *dpy, Window w) {
return 0;
} */
-static void NewtWindows_requestFocus0 (JNIEnv *env, jobject window, Display *dpy, Window w, XWindowAttributes *xwa) {
+static void NewtWindows_requestFocus0 (JNIEnv *env, jobject window, Display *dpy, Window w, XWindowAttributes *xwa,
+ Bool reparented){
Window focus_return;
int revert_to_return;
XGetInputFocus(dpy, &focus_return, &revert_to_return);
- if(focus_return!=w) {
+ if(reparented || focus_return!=w) {
// Avoid 'BadMatch' errors from XSetInputFocus, ie if window is not viewable
if( JNI_FALSE == (*env)->CallBooleanMethod(env, window, focusActionID) ) {
if(xwa->map_state == IsViewable) {
@@ -405,11 +408,12 @@ static void NewtWindows_requestFocus0 (JNIEnv *env, jobject window, Display *dpy
}
}
-static void NewtWindows_requestFocus1 (JNIEnv *env, jobject window, Display *dpy, Window w) {
+static void NewtWindows_requestFocus1 (JNIEnv *env, jobject window, Display *dpy, Window w,
+ Bool reparented) {
XWindowAttributes xwa;
XGetWindowAttributes(dpy, w, &xwa);
- NewtWindows_requestFocus0 (env, window, dpy, w, &xwa);
+ NewtWindows_requestFocus0 (env, window, dpy, w, &xwa, reparented);
XSync(dpy, False);
}
@@ -541,7 +545,7 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Display_DispatchMessages
switch(evt.type) {
case ButtonPress:
- NewtWindows_requestFocus1 ( env, jwindow, dpy, evt.xany.window );
+ (*env)->CallVoidMethod(env, jwindow, enqueueRequestFocusID, JNI_FALSE);
(*env)->CallVoidMethod(env, jwindow, sendMouseEventID,
(jint) EVENT_MOUSE_PRESSED,
(jint) evt.xbutton.state,
@@ -710,8 +714,11 @@ JNIEXPORT jboolean JNICALL Java_com_jogamp_newt_impl_x11_X11Window_initIDs0
windowDestroyedID = (*env)->GetMethodID(env, clazz, "windowDestroyed", "()V");
windowRepaintID = (*env)->GetMethodID(env, clazz, "windowRepaint", "(IIII)V");
windowCreatedID = (*env)->GetMethodID(env, clazz, "windowCreated", "(J)V");
+ enqueueMouseEventID = (*env)->GetMethodID(env, clazz, "enqueueMouseEvent", "(ZIIIIII)V");
sendMouseEventID = (*env)->GetMethodID(env, clazz, "sendMouseEvent", "(IIIIII)V");
+ enqueueKeyEventID = (*env)->GetMethodID(env, clazz, "enqueueKeyEvent", "(ZIIIC)V");
sendKeyEventID = (*env)->GetMethodID(env, clazz, "sendKeyEvent", "(IIIC)V");
+ enqueueRequestFocusID = (*env)->GetMethodID(env, clazz, "enqueueRequestFocus", "(Z)V");
focusActionID = (*env)->GetMethodID(env, clazz, "focusAction", "()Z");
if (sizeChangedID == NULL ||
@@ -722,9 +729,12 @@ JNIEXPORT jboolean JNICALL Java_com_jogamp_newt_impl_x11_X11Window_initIDs0
windowDestroyedID == NULL ||
windowRepaintID == NULL ||
windowCreatedID == NULL ||
+ enqueueMouseEventID == NULL ||
sendMouseEventID == NULL ||
+ enqueueKeyEventID == NULL ||
sendKeyEventID == NULL ||
- focusActionID == NULL) {
+ focusActionID == NULL ||
+ enqueueRequestFocusID == NULL) {
return JNI_FALSE;
}
return JNI_TRUE;
@@ -1019,7 +1029,7 @@ static void NewtWindows_reparentWindow
XMapRaised(dpy, w);
XSync(dpy, False);
- NewtWindows_requestFocus0 ( env, obj, dpy, w, xwa );
+ NewtWindows_requestFocus0 ( env, obj, dpy, w, xwa, True );
XSync(dpy, False);
}
@@ -1102,7 +1112,7 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Window_reparentWindow0
JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Window_requestFocus0
(JNIEnv *env, jobject obj, jlong display, jlong window)
{
- NewtWindows_requestFocus1 ( env, obj, (Display *) (intptr_t) display, (Window)window ) ;
+ NewtWindows_requestFocus1 ( env, obj, (Display *) (intptr_t) display, (Window)window, False ) ;
}
/*