diff options
Diffstat (limited to 'src/newt/classes')
11 files changed, 188 insertions, 140 deletions
diff --git a/src/newt/classes/com/jogamp/newt/Window.java b/src/newt/classes/com/jogamp/newt/Window.java index e43961e98..82f878a98 100644 --- a/src/newt/classes/com/jogamp/newt/Window.java +++ b/src/newt/classes/com/jogamp/newt/Window.java @@ -1029,8 +1029,9 @@ public interface Window extends NativeWindow, WindowClosingProtocol, ScalableSur * @param y dirty-region x-pos in pixel units * @param width dirty-region width in pixel units * @param height dirty-region height in pixel units + * @return true if window {@link #isNativeValid()} */ - void windowRepaint(int x, int y, int width, int height); + boolean windowRepaint(int x, int y, int width, int height); /** * Enqueues a {@link com.jogamp.newt.event.NEWTEvent NEWT event}. diff --git a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java index cbac22e26..09f5e1ebf 100644 --- a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java +++ b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java @@ -844,8 +844,8 @@ public class GLWindow extends GLAutoDrawableBase implements GLAutoDrawable, Wind // Window completion // @Override - public final void windowRepaint(final int x, final int y, final int width, final int height) { - window.windowRepaint(x, y, width, height); + public final boolean windowRepaint(final int x, final int y, final int width, final int height) { + return window.windowRepaint(x, y, width, height); } @Override diff --git a/src/newt/classes/jogamp/newt/DefaultEDTUtil.java b/src/newt/classes/jogamp/newt/DefaultEDTUtil.java index ff713410b..26a2544c7 100644 --- a/src/newt/classes/jogamp/newt/DefaultEDTUtil.java +++ b/src/newt/classes/jogamp/newt/DefaultEDTUtil.java @@ -146,10 +146,14 @@ public class DefaultEDTUtil implements EDTUtil { @Override public final boolean invokeStop(final boolean wait, final Runnable task) { if(DEBUG) { - System.err.println(Thread.currentThread()+": Default-EDT.invokeStop wait "+wait); + System.err.println(Thread.currentThread()+": Default-EDT.invokeStop.0 wait "+wait+" "+this); ExceptionUtils.dumpStack(System.err); } - return invokeImpl(wait, task, true /* stop */, false /* provokeError */); + final boolean res = invokeImpl(wait, task, true /* stop */, false /* provokeError */); + if(DEBUG) { + System.err.println(Thread.currentThread()+": Default-EDT.invokeStop.X wait "+wait+" "+this); + } + return res; } public final boolean invokeAndWaitError(final Runnable task) { @@ -202,7 +206,8 @@ public class DefaultEDTUtil implements EDTUtil { if( !edt.isRunning ) { if( null != task ) { if( stop ) { - System.err.println(Thread.currentThread()+": Warning: Default-EDT is about (3) to stop and stopped already, dropping task. Remaining tasks: "+edt.tasks.size()+" - "+edt); + System.err.println(Thread.currentThread()+": Warning: Default-EDT is about (3) to stop and stopped already, executing stop-task. Remaining tasks: "+edt.tasks.size()+" - "+edt); + task.run(); } else { System.err.println(Thread.currentThread()+": Warning: Default-EDT is not running, dropping task. NEDT "+edt); } @@ -210,7 +215,7 @@ public class DefaultEDTUtil implements EDTUtil { ExceptionUtils.dumpStack(System.err); } } - return false; + return stop; // OK if invokeStop } else if( stop && null == task ) { task = nullTask; // ensures execution triggering stop } diff --git a/src/newt/classes/jogamp/newt/DisplayImpl.java b/src/newt/classes/jogamp/newt/DisplayImpl.java index aea42b66d..cea779d0b 100644 --- a/src/newt/classes/jogamp/newt/DisplayImpl.java +++ b/src/newt/classes/jogamp/newt/DisplayImpl.java @@ -821,6 +821,6 @@ public abstract class DisplayImpl extends Display { protected int hashCode; protected int refCount; // number of Display references by Screen protected boolean exclusive; // do not share this display, uses NullLock! - protected AbstractGraphicsDevice aDevice; + protected volatile AbstractGraphicsDevice aDevice; } diff --git a/src/newt/classes/jogamp/newt/WindowImpl.java b/src/newt/classes/jogamp/newt/WindowImpl.java index 75c1e9474..ff333f720 100644 --- a/src/newt/classes/jogamp/newt/WindowImpl.java +++ b/src/newt/classes/jogamp/newt/WindowImpl.java @@ -69,7 +69,6 @@ import com.jogamp.common.ExceptionUtils; import com.jogamp.common.os.Clock; import com.jogamp.common.util.ArrayHashSet; import com.jogamp.common.util.Bitfield; -import com.jogamp.common.util.InterruptSource; import com.jogamp.common.util.PropertyAccess; import com.jogamp.common.util.ReflectionUtil; import com.jogamp.common.util.locks.LockFactory; @@ -2363,7 +2362,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer return stateMask.get(STATE_BIT_MAXIMIZED_HORZ); } /** Triggered by implementation's WM events to update maximized window state. */ - protected final void maximizedChanged(final boolean newMaxHorz, final boolean newMaxVert) { + protected final boolean maximizedChanged(final boolean newMaxHorz, final boolean newMaxVert) { if( !isFullscreen() ) { final String stateMask0 = DEBUG_IMPLEMENTATION ? getStateMaskString() : null; final boolean changedHorz = stateMask.put(STATE_BIT_MAXIMIZED_HORZ, newMaxHorz) != newMaxHorz; @@ -2381,6 +2380,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer System.err.println("Window.maximizedChanged.ignored: "+stateMask0+" -> max["+(newMaxHorz?"":"!")+"h, "+(newMaxVert?"":"!")+"v]"); } } + return isNativeValid(); } /** * Manually calculate maximized and de-maximized position and size @@ -3756,14 +3756,16 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer // Native MouseEvents pre-processed to be enqueued or consumed directly // - public final void sendMouseEvent(final short eventType, final int modifiers, - final int x, final int y, final short button, final float rotation) { + public final boolean sendMouseEvent(final short eventType, final int modifiers, + final int x, final int y, final short button, final float rotation) { doMouseEvent(false, false, eventType, modifiers, x, y, button, MouseEvent.getRotationXYZ(rotation, modifiers), 1f); + return isNativeValid(); } - public final void enqueueMouseEvent(final boolean wait, final short eventType, final int modifiers, + public final boolean enqueueMouseEvent(final boolean wait, final short eventType, final int modifiers, final int x, final int y, final short button, final float rotation) { doMouseEvent(true, wait, eventType, modifiers, x, y, button, MouseEvent.getRotationXYZ(rotation, modifiers), 1f); + return isNativeValid(); } protected final void doMouseEvent(final boolean enqueue, final boolean wait, final short eventType, final int modifiers, final int x, final int y, final short button, final float rotation) { @@ -4543,14 +4545,16 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer return false; } - public void sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public boolean sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { // Always add currently pressed mouse buttons to modifier mask consumeKeyEvent( KeyEvent.create(eventType, this, System.currentTimeMillis(), modifiers | pState1.buttonPressedMask, keyCode, keySym, keyChar) ); + return isNativeValid(); } - public void enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public boolean enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { // Always add currently pressed mouse buttons to modifier mask enqueueEvent(wait, KeyEvent.create(eventType, this, System.currentTimeMillis(), modifiers | pState1.buttonPressedMask, keyCode, keySym, keyChar) ); + return isNativeValid(); } @Override @@ -4779,7 +4783,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer // /** Triggered by implementation's WM events to update the focus state. */ - protected void focusChanged(final boolean defer, final boolean focusGained) { + protected boolean focusChanged(final boolean defer, final boolean focusGained) { if( stateMask.get(PSTATE_BIT_FOCUS_CHANGE_BROKEN) || stateMask.get(STATE_BIT_FOCUSED) != focusGained ) { @@ -4797,15 +4801,17 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer enqueueWindowEvent(false, evt); } } + return isNativeValid(); } /** Triggered by implementation's WM events to update the visibility state. */ - protected final void visibleChanged(final boolean visible) { + protected final boolean visibleChanged(final boolean visible) { if( stateMask.put(STATE_BIT_VISIBLE, visible) != visible ) { if(DEBUG_IMPLEMENTATION) { System.err.println("Window.visibleChanged ("+getThreadName()+"): visible "+(!visible)+" -> state "+getStateMaskString()+" - windowHandle "+toHexString(windowHandle)+" parentWindowHandle "+toHexString(parentWindowHandle)); } } + return isNativeValid(); } /** Triggered by implementation's WM events to update the client-area size in window units w/o insets/decorations. */ @@ -4840,10 +4846,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer enqueueWindowEvent(false, WindowEvent.EVENT_WINDOW_RESIZED); } } - return true; - } else { - return false; } + return isNativeValid(); } /** Triggered by implementation's WM events to update the position. */ @@ -4871,11 +4875,10 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer } else { enqueueWindowEvent(false, WindowEvent.EVENT_WINDOW_MOVED); } - return true; } else { stateMask.clear(STATE_BIT_AUTOPOSITION); // ensure it's off even w/ same position - return false; } + return isNativeValid(); } /** @@ -4888,7 +4891,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @see #getInsets() * @see #updateInsetsImpl(Insets) */ - protected final void insetsChanged(final boolean windowUnits, final int leftU, final int rightU, final int topU, final int bottomU) { + protected final boolean insetsChanged(final boolean windowUnits, final int leftU, final int rightU, final int topU, final int bottomU) { if ( leftU >= 0 && rightU >= 0 && topU >= 0 && bottomU >= 0 ) { final int[] tl_win; final int[] br_win; @@ -4915,6 +4918,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer insets.set(tl_win[0], br_win[0], tl_win[1], br_win[1]); } } + return isNativeValid(); } /** @@ -4925,7 +4929,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @param width dirty-region width in pixel units * @param height dirty-region height in pixel units */ - protected final void windowRepaint(final boolean defer, final int x, final int y, int width, int height) { + protected final boolean windowRepaint(final boolean defer, final int x, final int y, int width, int height) { width = ( 0 >= width ) ? getSurfaceWidth() : width; height = ( 0 >= height ) ? getSurfaceHeight() : height; if(DEBUG_IMPLEMENTATION) { @@ -4936,6 +4940,9 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer final NEWTEvent e = new WindowUpdateEvent(WindowEvent.EVENT_WINDOW_REPAINT, this, System.currentTimeMillis(), new Rectangle(x, y, width, height)); doEvent(defer, false, e); + return true; + } else { + return false; } } @@ -5002,19 +5009,21 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @param button * @param rotation */ - protected final void visibleChangedSendMouseEvent(final boolean defer, final int visibleChange, - final short eventType, final int modifiers, - final int x, final int y, final short button, final float rotation) { + protected final boolean visibleChangedSendMouseEvent(final boolean defer, final int visibleChange, + final short eventType, final int modifiers, + final int x, final int y, final short button, final float rotation) { + boolean res = true; if( 0 <= visibleChange ) { // ignore visible < 0 - visibleChanged(0 < visibleChange); + res = visibleChanged(0 < visibleChange); } if( 0 < eventType ) { if( defer ) { - enqueueMouseEvent(false /* wait */, eventType, modifiers, x, y, button, rotation); + res = res && enqueueMouseEvent(false /* wait */, eventType, modifiers, x, y, button, rotation); } else { - sendMouseEvent(eventType, modifiers, x, y, button, rotation); + res = res && sendMouseEvent(eventType, modifiers, x, y, button, rotation); } } + return res; } /** @@ -5026,12 +5035,13 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @param width dirty-region width in pixel units * @param height dirty-region height in pixel units */ - protected final void visibleChangedWindowRepaint(final boolean defer, final int visibleChange, - final int x, final int y, final int width, final int height) { + protected final boolean visibleChangedWindowRepaint(final boolean defer, final int visibleChange, + final int x, final int y, final int width, final int height) { + boolean res = true; if( 0 <= visibleChange ) { // ignore visible < 0 - visibleChanged(0 < visibleChange); + res = visibleChanged(0 < visibleChange); } - windowRepaint(defer, x, y, width, height); + return res && windowRepaint(defer, x, y, width, height); } /** @@ -5041,15 +5051,17 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @param focusChange -1 ignored, 0 unfocused, > 0 focused * @param visibleChange -1 ignored, 0 invisible, > 0 visible */ - protected final void focusVisibleChanged(final boolean defer, - final int focusChange, - final int visibleChange) { + protected final boolean focusVisibleChanged(final boolean defer, + final int focusChange, + final int visibleChange) { + boolean res = true; if( 0 <= focusChange ) { // ignore focus < 0 - focusChanged(defer, 0 < focusChange); + res = focusChanged(defer, 0 < focusChange); } if( 0 <= visibleChange ) { // ignore visible < 0 - visibleChanged(0 < visibleChange); + res = res && visibleChanged(0 < visibleChange); } + return res && isNativeValid(); } /** @@ -5061,12 +5073,13 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @param bottom insets, -1 ignored * @param visibleChange -1 ignored, 0 invisible, > 0 visible */ - protected final void insetsVisibleChanged(final boolean windowUnits, - final int left, final int right, final int top, final int bottom, final int visibleChange) { - insetsChanged(windowUnits, left, right, top, bottom); + protected final boolean insetsVisibleChanged(final boolean windowUnits, + final int left, final int right, final int top, final int bottom, final int visibleChange) { + boolean res = insetsChanged(windowUnits, left, right, top, bottom); if( 0 <= visibleChange ) { // ignore visible < 0 - visibleChanged(0 < visibleChange); + res = res && visibleChanged(0 < visibleChange); } + return res; } /** @@ -5086,21 +5099,22 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @param visibleChange -1 ignored, 0 invisible, > 0 visible * @param force */ - protected final void sizePosInsetsFocusVisibleChanged(final boolean defer, - final boolean windowUnits, - final int newX, final int newY, final int newWidth, final int newHeight, - final int left, final int right, final int top, final int bottom, - final int focusChange, - final int visibleChange, final boolean force) { - sizeChanged(defer, windowUnits, newWidth, newHeight, force); - positionChanged(defer, windowUnits, newX, newY); - insetsChanged(windowUnits, left, right, top, bottom); + protected final boolean sizePosInsetsFocusVisibleChanged(final boolean defer, + final boolean windowUnits, + final int newX, final int newY, final int newWidth, final int newHeight, + final int left, final int right, final int top, final int bottom, + final int focusChange, + final int visibleChange, final boolean force) { + boolean res = sizeChanged(defer, windowUnits, newWidth, newHeight, force); + res = res && positionChanged(defer, windowUnits, newX, newY); + res = res && insetsChanged(windowUnits, left, right, top, bottom); if( 0 <= focusChange ) { // ignore focus < 0 - focusChanged(defer, 0 < focusChange); + res = res && focusChanged(defer, 0 < focusChange); } if( 0 <= visibleChange ) { // ignore visible < 0 - visibleChanged(0 < visibleChange); + res = res && visibleChanged(0 < visibleChange); } + return res; } /** @@ -5122,20 +5136,21 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * @param force * @param windowUnits if true, values are given in window units, otherwise in pixel units. */ - protected final void sizePosMaxInsetsVisibleChanged(final boolean defer, final boolean windowUnits, - final int newX, final int newY, final int newWidth, final int newHeight, - final int maxHorzChange, final int maxVertChange, - final int left, final int right, final int top, final int bottom, - final int visibleChange, final boolean force) { - sizeChanged(defer, windowUnits, newWidth, newHeight, force); - positionChanged(defer, windowUnits, newX, newY); + protected final boolean sizePosMaxInsetsVisibleChanged(final boolean defer, final boolean windowUnits, + final int newX, final int newY, final int newWidth, final int newHeight, + final int maxHorzChange, final int maxVertChange, + final int left, final int right, final int top, final int bottom, + final int visibleChange, final boolean force) { + boolean res = sizeChanged(defer, windowUnits, newWidth, newHeight, force); + res = res && positionChanged(defer, windowUnits, newX, newY); if( 0 <= maxHorzChange && 0 <= maxVertChange ) { - maximizedChanged(0 < maxHorzChange, 0 < maxVertChange); + res = res && maximizedChanged(0 < maxHorzChange, 0 < maxVertChange); } - insetsChanged(false, left, right, top, bottom); + res = res && insetsChanged(false, left, right, top, bottom); if( 0 <= visibleChange ) { // ignore visible < 0 - visibleChanged(0 < visibleChange); + res = res && visibleChanged(0 < visibleChange); } + return res; } // @@ -5261,19 +5276,23 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer // @Override - public final void windowRepaint(final int x, final int y, final int width, final int height) { - windowRepaint(false, x, y, width, height); + public final boolean windowRepaint(final int x, final int y, final int width, final int height) { + return windowRepaint(false, x, y, width, height); } // // Accumulated actions // - /** Triggered by implementation. */ - protected final void sendMouseEventRequestFocus(final short eventType, final int modifiers, - final int x, final int y, final short button, final float rotation) { - sendMouseEvent(eventType, modifiers, x, y, button, rotation); - requestFocus(false /* wait */); + /** Triggered by implementation or event dispatcher. */ + protected final boolean sendMouseEventRequestFocus(final short eventType, final int modifiers, + final int x, final int y, final short button, final float rotation) { + if( sendMouseEvent(eventType, modifiers, x, y, button, rotation) ) { + requestFocus(false /* wait */); + return true; + } else { + return false; + } } // diff --git a/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java index 9ffeaffa2..33155ad67 100644 --- a/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java +++ b/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java @@ -245,6 +245,7 @@ public class WindowDriver extends jogamp.newt.WindowImpl implements Callback2 { } if( enable ) { androidView.post(new Runnable() { + @Override public void run() { androidView.setClickable(false); androidView.setFocusable(true); @@ -300,6 +301,7 @@ public class WindowDriver extends jogamp.newt.WindowImpl implements Callback2 { if( null != viewGroup && !added2StaticViewGroup ) { added2StaticViewGroup = true; viewGroup.post(new Runnable() { + @Override public void run() { if(null == androidView) { setupAndroidView( StaticContext.getContext() ); @@ -324,7 +326,7 @@ public class WindowDriver extends jogamp.newt.WindowImpl implements Callback2 { } @Override - protected final void createNativeImpl(boolean[] positionModified) { + protected final void createNativeImpl(final boolean[] positionModified) { // Create own screen/device resource instance allowing independent ownership, // while still utilizing shared EGL resources. final AbstractGraphicsScreen aScreen = getScreen().getGraphicsScreen(); @@ -412,6 +414,7 @@ public class WindowDriver extends jogamp.newt.WindowImpl implements Callback2 { final ViewGroup viewGroup = StaticContext.getContentViewGroup(); if( null != viewGroup) { viewGroup.post(new Runnable() { + @Override public void run() { viewGroup.removeView(androidView); Log.d(MD.TAG, "closeNativeImpl: removed from static ViewGroup - on thread "+Thread.currentThread().getName()); @@ -437,8 +440,8 @@ public class WindowDriver extends jogamp.newt.WindowImpl implements Callback2 { * {@inheritDoc} */ @Override - public final void focusChanged(final boolean defer, final boolean focusGained) { - super.focusChanged(defer, focusGained); + public final boolean focusChanged(final boolean defer, final boolean focusGained) { + return super.focusChanged(defer, focusGained); } @Override @@ -446,6 +449,7 @@ public class WindowDriver extends jogamp.newt.WindowImpl implements Callback2 { if(null != androidView) { Log.d(MD.TAG, "requestFocusImpl: reparented "+reparented); androidView.post(new Runnable() { + @Override public void run() { androidView.requestFocus(); androidView.bringToFront(); diff --git a/src/newt/classes/jogamp/newt/driver/ios/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/ios/WindowDriver.java index 454b2200f..6aa4fdc9c 100644 --- a/src/newt/classes/jogamp/newt/driver/ios/WindowDriver.java +++ b/src/newt/classes/jogamp/newt/driver/ios/WindowDriver.java @@ -526,15 +526,16 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl } /** Callback for native screen position change event of the client area. */ - protected void screenPositionChanged(final boolean defer, final int newX, final int newY) { + protected boolean screenPositionChanged(final boolean defer, final int newX, final int newY) { // passed coordinates are in screen position of the client area if( isNativeValid() ) { + final boolean[] res = { true }; final NativeWindow parent = getParent(); if( !useParent(parent) || isOffscreenInstance ) { if(DEBUG_IMPLEMENTATION) { System.err.println("MacWindow.positionChanged.0 (Screen Pos - TOP): ("+getThreadName()+"): (defer: "+defer+") "+getX()+"/"+getY()+" -> "+newX+"/"+newY); } - positionChanged(defer, true, newX, newY); + res[0] = positionChanged(defer, true, newX, newY); } else { final Runnable action = new Runnable() { @Override @@ -547,18 +548,19 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl if(DEBUG_IMPLEMENTATION) { System.err.println("MacWindow.positionChanged.1 (Screen Pos - CHILD): ("+getThreadName()+"): (defer: "+defer+") "+getX()+"/"+getY()+" -> absPos "+newX+"/"+newY+", parentOnScreen "+parentOnScreen+" -> "+absPos); } - positionChanged(false, true, absPos.getX(), absPos.getY()); + res[0] = positionChanged(false, true, absPos.getX(), absPos.getY()); } }; if( defer ) { new InterruptSource.Thread(null, action).start(); } else { action.run(); } - } + return res[0]; } else if(DEBUG_IMPLEMENTATION) { System.err.println("MacWindow.positionChanged.2 (Screen Pos - IGN): ("+getThreadName()+"): (defer: "+defer+") "+getX()+"/"+getY()+" -> "+newX+"/"+newY); } + return false; } @Override @@ -609,25 +611,26 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl // /** Triggered by implementation's WM events to update the client-area position, size and insets. */ - protected void sizeScreenPosInsetsChanged(final boolean defer, - final int newX, final int newY, - final int newWidth, final int newHeight, - final int left, final int right, final int top, final int bottom, - final boolean force, - final boolean withinLiveResize) { + protected boolean sizeScreenPosInsetsChanged(final boolean defer, + final int newX, final int newY, + final int newWidth, final int newHeight, + final int left, final int right, final int top, final int bottom, + final boolean force, + final boolean withinLiveResize) { final LifecycleHook lh = getLifecycleHook(); if( withinLiveResize && !resizeAnimatorPaused && null!=lh ) { resizeAnimatorPaused = lh.pauseRenderingAction(); } - sizeChanged(defer, false, newWidth, newHeight, force); - screenPositionChanged(defer, newX, newY); - insetsChanged(false, left, right, top, bottom); - if( !withinLiveResize && resizeAnimatorPaused ) { + boolean res = sizeChanged(defer, false, newWidth, newHeight, force); + res = res && screenPositionChanged(defer, newX, newY); + res = res && insetsChanged(false, left, right, top, bottom); + if( !withinLiveResize && resizeAnimatorPaused && res ) { resizeAnimatorPaused = false; if( null!=lh ) { lh.resumeRenderingAction(); } } + return res; } @Override @@ -638,9 +641,9 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl SurfaceScaleUtils.scale(y, getPixelScaleY()), button, rotationXYZ, rotationScale); } - public final void sendTouchScreenEvent(final short eventType, final int modifiers, - final int[] pActionIdx, final short[] pNames, - final int[] pTypesI, final int[] pX, final int[] pY, final float[] pPressure, final float maxPressure) { + public final boolean sendTouchScreenEvent(final short eventType, final int modifiers, + final int[] pActionIdx, final short[] pNames, + final int[] pTypesI, final int[] pX, final int[] pY, final float[] pPressure, final float maxPressure) { final int pCount = pNames.length; final MouseEvent.PointerType[] pTypes = new MouseEvent.PointerType[pCount]; for(int i=0; i<pCount; i++) { @@ -651,19 +654,20 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl pTypes, eventType, modifiers, pActionIdx[i], true /*normalPNames*/, pNames, pX, pY, pPressure, maxPressure, new float[] { 0f, 0f, 0f} /*rotationXYZ*/, 1f/*rotationScale*/); } + return isNativeValid(); } @Override - public final void sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public final boolean sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { throw new InternalError("XXX: Adapt Java Code to Native Code Changes"); } @Override - public final void enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short _keyCode, final short _keySym, final char keyChar) { + public final boolean enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short _keyCode, final short _keySym, final char keyChar) { throw new InternalError("XXX: Adapt Java Code to Native Code Changes"); } - protected final void enqueueKeyEvent(final boolean wait, final short eventType, int modifiers, final short _keyCode, final char keyChar, final char keySymChar) { + protected final boolean enqueueKeyEvent(final boolean wait, final short eventType, int modifiers, final short _keyCode, final char keyChar, final char keySymChar) { // 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 final short keyCode = MacKeyUtil.validateKeyCode(_keyCode, keyChar); @@ -685,6 +689,7 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl // OSX delivery order is PRESSED (t0), RELEASED (t1) and TYPED (t2) -> NEWT order: PRESSED (t0) and RELEASED (t1) // Auto-Repeat: OSX delivers only PRESSED, inject auto-repeat RELEASE key _before_ PRESSED + boolean res = true; switch(eventType) { case KeyEvent.EVENT_KEY_RELEASED: if( isKeyCodeTracked(keyCode) ) { @@ -696,12 +701,12 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl if( setKeyPressed(keyCode, true) ) { // key was already pressed modifiers |= InputEvent.AUTOREPEAT_MASK; - super.enqueueKeyEvent(wait, KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); // RELEASED + res = super.enqueueKeyEvent(wait, KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); // RELEASED } } break; } - super.enqueueKeyEvent(wait, eventType, modifiers, keyCode, keySym, keyChar); + return res && super.enqueueKeyEvent(wait, eventType, modifiers, keyCode, keySym, keyChar); } protected int getDisplayID() { diff --git a/src/newt/classes/jogamp/newt/driver/macosx/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/macosx/WindowDriver.java index 79951e5a6..e8383916e 100644 --- a/src/newt/classes/jogamp/newt/driver/macosx/WindowDriver.java +++ b/src/newt/classes/jogamp/newt/driver/macosx/WindowDriver.java @@ -556,16 +556,17 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl } /** Callback for native screen position change event of the client area. */ - protected void screenPositionChanged(final boolean defer, final int newX, final int newY) { + protected boolean screenPositionChanged(final boolean defer, final int newX, final int newY) { // passed coordinates are in screen position of the client area if( isNativeValid() ) { + final boolean[] res = { true }; final NativeWindow parent = getParent(); final boolean useParentLoc = useParentLocation(parent); if( !useParentLoc || isOffscreenInstance ) { if(DEBUG_IMPLEMENTATION) { System.err.println("MacWindow.positionChanged.0 (Screen Pos - TOP): ("+getThreadName()+"): (defer: "+defer+") "+getX()+"/"+getY()+" -> "+newX+"/"+newY); } - positionChanged(defer, true, newX, newY); + res[0] = positionChanged(defer, true, newX, newY); } else if( useParentLoc && !isVisible() ) { // Fake invisible child window: drop fake position update for fake invisibility if(DEBUG_IMPLEMENTATION) { @@ -590,18 +591,19 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl if(DEBUG_IMPLEMENTATION) { System.err.println("MacWindow.positionChanged.1 (Screen Pos - CHILD): ("+getThreadName()+"): (defer: "+defer+") "+getX()+"/"+getY()+" -> absPos "+newX+"/"+newY+", parentOnScreen "+parentOnScreen+" -> "+absPos); } - positionChanged(false, true, absPos.getX(), absPos.getY()); + res[0] = positionChanged(false, true, absPos.getX(), absPos.getY()); } }; if( defer ) { new InterruptSource.Thread(null, action).start(); } else { action.run(); } - } + return res[0]; } else if(DEBUG_IMPLEMENTATION) { System.err.println("MacWindow.positionChanged.2 (Screen Pos - IGN): ("+getThreadName()+"): (defer: "+defer+") "+getX()+"/"+getY()+" -> "+newX+"/"+newY); } + return false; } @Override @@ -654,25 +656,26 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl // /** Triggered by implementation's WM events to update the client-area position, size and insets. */ - protected void sizeScreenPosInsetsChanged(final boolean defer, - final int newX, final int newY, - final int newWidth, final int newHeight, - final int left, final int right, final int top, final int bottom, - final boolean force, - final boolean withinLiveResize) { + protected boolean sizeScreenPosInsetsChanged(final boolean defer, + final int newX, final int newY, + final int newWidth, final int newHeight, + final int left, final int right, final int top, final int bottom, + final boolean force, + final boolean withinLiveResize) { final LifecycleHook lh = getLifecycleHook(); if( withinLiveResize && !resizeAnimatorPaused && null!=lh ) { resizeAnimatorPaused = lh.pauseRenderingAction(); } - sizeChanged(defer, true /* windowUnits */, newWidth, newHeight, force); - screenPositionChanged(defer, newX, newY); - insetsChanged(false, left, right, top, bottom); - if( !withinLiveResize && resizeAnimatorPaused ) { + boolean res = sizeChanged(defer, true /* windowUnits */, newWidth, newHeight, force); + res = res && screenPositionChanged(defer, newX, newY); + res = res && insetsChanged(false, left, right, top, bottom); + if( !withinLiveResize && resizeAnimatorPaused && res ) { resizeAnimatorPaused = false; if( null!=lh ) { lh.resumeRenderingAction(); } } + return res; } @Override @@ -727,16 +730,16 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl } @Override - public final void sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public final boolean sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { throw new InternalError("XXX: Adapt Java Code to Native Code Changes"); } @Override - public final void enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short _keyCode, final short _keySym, final char keyChar) { + public final boolean enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short _keyCode, final short _keySym, final char keyChar) { throw new InternalError("XXX: Adapt Java Code to Native Code Changes"); } - protected final void enqueueKeyEvent(final boolean wait, final short eventType, int modifiers, final short _keyCode, final char keyChar, final char keySymChar) { + protected final boolean enqueueKeyEvent(final boolean wait, final short eventType, int modifiers, final short _keyCode, final char keyChar, final char keySymChar) { // 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 final short keyCode = MacKeyUtil.validateKeyCode(_keyCode, keyChar); @@ -758,6 +761,7 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl // OSX delivery order is PRESSED (t0), RELEASED (t1) and TYPED (t2) -> NEWT order: PRESSED (t0) and RELEASED (t1) // Auto-Repeat: OSX delivers only PRESSED, inject auto-repeat RELEASE key _before_ PRESSED + boolean res = true; switch(eventType) { case KeyEvent.EVENT_KEY_RELEASED: if( isKeyCodeTracked(keyCode) ) { @@ -769,12 +773,12 @@ public class WindowDriver extends WindowImpl implements MutableSurface, DriverCl if( setKeyPressed(keyCode, true) ) { // key was already pressed modifiers |= InputEvent.AUTOREPEAT_MASK; - super.enqueueKeyEvent(wait, KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); // RELEASED + res = super.enqueueKeyEvent(wait, KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); // RELEASED } } break; } - super.enqueueKeyEvent(wait, eventType, modifiers, keyCode, keySym, keyChar); + return res && super.enqueueKeyEvent(wait, eventType, modifiers, keyCode, keySym, keyChar); } protected int getDisplayID() { diff --git a/src/newt/classes/jogamp/newt/driver/windows/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/windows/WindowDriver.java index b95911adf..fb88c77df 100644 --- a/src/newt/classes/jogamp/newt/driver/windows/WindowDriver.java +++ b/src/newt/classes/jogamp/newt/driver/windows/WindowDriver.java @@ -194,9 +194,9 @@ public class WindowDriver extends WindowImpl { if( !cfg.getChosenCapabilities().isBackgroundOpaque() ) { GDIUtil.DwmSetupTranslucency(_windowHandle, true); } - InitWindow0(_windowHandle, flags); setWindowHandle(_windowHandle); windowHandleClose = _windowHandle; + InitWindow0(_windowHandle, flags); if( 0 == ( STATE_MASK_CHILDWIN & flags ) && 1 <= maxCount ) { reconfigureWindowImpl(xy_pix[0], xy_pix[1], sz_pix[0], sz_pix[1], flags); @@ -411,15 +411,16 @@ public class WindowDriver extends WindowImpl { * for details. * </p> */ - public final void sendTouchScreenEvent(final short eventType, final int modifiers, - final int pActionIdx, final short[] pNames, - final int[] pX, final int[] pY, final float[] pPressure, final float maxPressure) { + public final boolean sendTouchScreenEvent(final short eventType, final int modifiers, + final int pActionIdx, final short[] pNames, + final int[] pX, final int[] pY, final float[] pPressure, final float maxPressure) { final int pCount = pNames.length; final MouseEvent.PointerType[] pTypes = new MouseEvent.PointerType[pCount]; for(int i=pCount-1; i>=0; i--) { pTypes[i] = PointerType.TouchScreen; } doPointerEvent(false /*enqueue*/, false /*wait*/, pTypes, eventType, modifiers, pActionIdx, false /*normalPNames*/, pNames, pX, pY, pPressure, maxPressure, new float[] { 0f, 0f, 0f} /*rotationXYZ*/, 1f/*rotationScale*/); + return isNativeValid(); } // @@ -447,35 +448,37 @@ public class WindowDriver extends WindowImpl { } @Override - public final void sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public final boolean sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { final boolean isModifierKey = KeyEvent.isModifierKey(keySym); // System.err.println("*** sendKeyEvent: event "+KeyEvent.getEventTypeString(eventType)+", keyCode "+toHexString(keyCode)+", keyChar <"+keyChar+">, mods "+toHexString(modifiers)+ // ", isKeyCodeTracked "+isKeyCodeTracked(keyCode)+", was: pressed "+isKeyPressed(keyCode)+", printableKey "+KeyEvent.isPrintableKey(keyCode, false)+" [modifierKey "+isModifierKey+"] - "+System.currentTimeMillis()); // Reorder: WINDOWS delivery order is PRESSED (t0), TYPED (t0) and RELEASED (t1) -> NEWT order: PRESSED (t0) and RELEASED (t1) // Auto-Repeat: WINDOWS delivers only PRESSED (t0) and TYPED (t0). + boolean res = true; switch(eventType) { case KeyEvent.EVENT_KEY_RELEASED: if( isKeyCodeTracked(keyCode) ) { if( repeatedKey == keyCode && !isModifierKey ) { // AR out - send out missing PRESSED - super.sendKeyEvent(KeyEvent.EVENT_KEY_PRESSED, modifiers | InputEvent.AUTOREPEAT_MASK, keyCode, keySym, keyChar); + res = super.sendKeyEvent(KeyEvent.EVENT_KEY_PRESSED, modifiers | InputEvent.AUTOREPEAT_MASK, keyCode, keySym, keyChar); } setKeyPressed(keyCode, false); repeatedKey = KeyEvent.VK_UNDEFINED; } - super.sendKeyEvent(KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); + res = res && super.sendKeyEvent(KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); break; case KeyEvent.EVENT_KEY_PRESSED: if( !handlePressTypedAutoRepeat(isModifierKey, modifiers, keyCode, keySym, keyChar) ) { - super.sendKeyEvent(KeyEvent.EVENT_KEY_PRESSED, modifiers, keyCode, keySym, keyChar); + res = super.sendKeyEvent(KeyEvent.EVENT_KEY_PRESSED, modifiers, keyCode, keySym, keyChar); } break; } + return res; } @Override - public final void enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public final boolean enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { throw new InternalError("XXX: Adapt Java Code to Native Code Changes"); } diff --git a/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java b/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java index e0fd20e2b..2957df93a 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java +++ b/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java @@ -154,10 +154,11 @@ public class DisplayDriver extends DisplayImpl { this.randr_error_base = randr_error_base; this.xi_opcode = xi_opcode; } - private void sendRRScreenChangeNotify(final long event) { + private boolean sendRRScreenChangeNotify(final long event) { if( null != rAndR ) { rAndR.sendRRScreenChangeNotify(getHandle(), event); } + return isNativeValidAsync(); } void registerRandR(final RandR rAndR) { this.rAndR = rAndR; diff --git a/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java index e939edeae..501adee9c 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java +++ b/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java @@ -204,12 +204,15 @@ public class WindowDriver extends WindowImpl { @Override protected void closeNativeImpl() { - if(0!=javaWindowHandle && null!=getScreen() ) { + final long _javaWindowHandle = javaWindowHandle; + if(0!=_javaWindowHandle && null!=getScreen() ) { final DisplayDriver display = (DisplayDriver) getScreen().getDisplay(); final AbstractGraphicsDevice edtDevice = display.getGraphicsDevice(); edtDevice.lock(); try { - CloseWindow0(edtDevice.getHandle(), javaWindowHandle /* , display.getKbdHandle() */, // XKB disabled for now + setWindowHandle(0); // dispose native window handle ASAP + javaWindowHandle = 0; // dispose our javaWindow handle ASAP + CloseWindow0(display, edtDevice.getHandle(), _javaWindowHandle /* , display.getKbdHandle() */, // XKB disabled for now display.getRandREventBase(), display.getRandRErrorBase(), display.getXiOpcode()); } catch (final Throwable t) { if(DEBUG_IMPLEMENTATION) { @@ -218,7 +221,6 @@ public class WindowDriver extends WindowImpl { } } finally { edtDevice.unlock(); - javaWindowHandle = 0; last_monitor = null; } } @@ -304,7 +306,7 @@ public class WindowDriver extends WindowImpl { * {@inheritDoc} */ @Override - protected void focusChanged(final boolean defer, final boolean focusGained) { + protected boolean focusChanged(final boolean defer, final boolean focusGained) { if( isNativeValid() && isFullscreen() && !isAlwaysOnBottom() && tempFSAlwaysOnTop && hasFocus() != focusGained ) { final int flags = getReconfigureMask(CHANGE_MASK_ALWAYSONTOP, isVisible()) | ( focusGained ? STATE_MASK_ALWAYSONTOP : 0 ); @@ -320,7 +322,7 @@ public class WindowDriver extends WindowImpl { } }); } - super.focusChanged(defer, focusGained); + return super.focusChanged(defer, focusGained); } @Override @@ -349,11 +351,12 @@ public class WindowDriver extends WindowImpl { return res; } - protected void reparentNotify(final long newParentWindowHandle) { + protected boolean reparentNotify(final long newParentWindowHandle) { if(DEBUG_IMPLEMENTATION) { final long p0 = getParentWindowHandle(); System.err.println("Window.reparentNotify ("+getThreadName()+"): "+toHexString(p0)+" -> "+toHexString(newParentWindowHandle)); } + return isNativeValid(); } @Override @@ -490,7 +493,7 @@ public class WindowDriver extends WindowImpl { } /** Called by native TK */ - protected final void sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar0, final String keyString) { + protected final boolean sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar0, final String keyString) { // handleKeyEvent(true, false, eventType, modifiers, keyCode, keyChar); final boolean isModifierKey = KeyEvent.isModifierKey(keyCode); final boolean isAutoRepeat = 0 != ( InputEvent.AUTOREPEAT_MASK & modifiers ); @@ -498,22 +501,24 @@ public class WindowDriver extends WindowImpl { // System.err.println("*** sendKeyEvent: event "+KeyEvent.getEventTypeString(eventType)+", keyCode "+toHexString(keyCode)+", keyChar <"+keyChar0+">/<"+keyChar+">, keyString "+keyString+", mods "+toHexString(modifiers)+ // ", isKeyCodeTracked "+isKeyCodeTracked(keyCode)+", was: pressed "+isKeyPressed(keyCode)+", repeat "+isAutoRepeat+", [modifierKey "+isModifierKey+"] - "+System.currentTimeMillis()); + boolean res = true; if( !isAutoRepeat || !isModifierKey ) { // ! ( isModifierKey && isAutoRepeat ) switch(eventType) { case KeyEvent.EVENT_KEY_PRESSED: - super.sendKeyEvent(KeyEvent.EVENT_KEY_PRESSED, modifiers, keyCode, keySym, keyChar); + res = super.sendKeyEvent(KeyEvent.EVENT_KEY_PRESSED, modifiers, keyCode, keySym, keyChar); break; case KeyEvent.EVENT_KEY_RELEASED: - super.sendKeyEvent(KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); + res = super.sendKeyEvent(KeyEvent.EVENT_KEY_RELEASED, modifiers, keyCode, keySym, keyChar); break; } } + return res; } - public final void sendTouchScreenEvent(final short eventType, final int modifiers, - final int pActionIdx, final short[] pNames, - final int[] pX, final int[] pY, final float[] pPressure, final float maxPressure) { + public final boolean sendTouchScreenEvent(final short eventType, final int modifiers, + final int pActionIdx, final short[] pNames, + final int[] pX, final int[] pY, final float[] pPressure, final float maxPressure) { final int pCount = pNames.length; final MouseEvent.PointerType[] pTypes = new MouseEvent.PointerType[pCount]; for(int i=0; i<pCount; i++) { @@ -522,14 +527,15 @@ public class WindowDriver extends WindowImpl { doPointerEvent(false /*enqueue*/, false /*wait*/, pTypes, eventType, modifiers, pActionIdx, true /*normalPNames*/, pNames, pX, pY, pPressure, maxPressure, new float[] { 0f, 0f, 0f} /*rotationXYZ*/, 1f/*rotationScale*/); + return isNativeValid(); } @Override - public final void sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public final boolean sendKeyEvent(final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { throw new InternalError("XXX: Adapt Java Code to Native Code Changes"); } @Override - public final void enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { + public final boolean enqueueKeyEvent(final boolean wait, final short eventType, final int modifiers, final short keyCode, final short keySym, final char keyChar) { throw new InternalError("XXX: Adapt Java Code to Native Code Changes"); } @@ -565,7 +571,7 @@ public class WindowDriver extends WindowImpl { int pixelDataSize, Object pixels, int pixels_byte_offset, boolean pixels_is_direct, boolean verbose); private static native int GetSupportedReconfigMask0(long javaWindowHandle); - private native void CloseWindow0(long display, long javaWindowHandle /*, long kbdHandle*/, // XKB disabled for now + private native void CloseWindow0(DisplayDriver disbplayDriver, long display, long javaWindowHandle /*, long kbdHandle*/, // XKB disabled for now final int randr_event_base, final int randr_error_base, final int xi_opcode); private static native void reconfigureWindow0(long display, int screen_index, long parentWindowHandle, long javaWindowHandle, int x, int y, int width, int height, int flags); |