diff options
author | Sven Gothel <[email protected]> | 2010-09-23 16:21:39 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-09-23 16:21:39 +0200 |
commit | 0feca163be47db2ea94f7546e696136d6f9496e9 (patch) | |
tree | acb22106e716b7a4670a280c53466cf30aad233c /src/nativewindow/classes/com | |
parent | 46971a3b9d58bcd1e2305d0f428b31ce30273293 (diff) |
NEWT: Fix Display/Window/Screen OO Identity, Reparenting and requestFocus
NativeWindow: Interface NativeWindow changes:
- Remove 'throws' qualifier in lockSurface(), since it is not
- Adding convenient 'one call' isSurfaceLockedByOtherThread()
- Adding getSurfaceLockOwner()
NEWT Window/GLWindow:
- Unclutter Window/GLWindow relationship - save Window's indentity
GLWindow's role is a GLAutoDrawable implementation aggregating
(maybe even compositioning) a Window.
The previous implementation just derived from the Window implementation,
overwriting methods and fields - impossible to ensure sanity / completness.
It was also not ensured that the added functionality of GLWindow
(setVisible, destroy, ..) has been issued in case of handling the
aggregated Window alone (window callbacks, ..).
To solve this issue in a 1st attempt without changing the GLWindow API,
Window is just an interface, being implemented by their specializations,
hence sanity is intrinsic.
GLWindow's added functionality is ensured by a Window.LifecycleHook
interfaced implementation, registered at the aggregated Window.
- Screen and Window are interfaces now (new files)
- Display is an abstract class.
- Their (abstract) implementations resides in impl/<BaseName>Impl
- GLWindow implements Window as well
- Remove Screen reference handled by setScreen(Screen) method.
- Lock native parentWindow if used (createNative/reparenting)
- Move lockSurface/unlockSurface from unchecked override pattern
to an callback style using abstract methods lockSurfaceImpl/...
- Sorting all methods to semantic sections, abstract, superinterface, ..
- Reparenting: Handling different reparenting situations:
- Unchanged - No change
- Native Reparenting - Compatible Display/Screen, try native reparenting
- Native (Re)Creation - Use destroy/create pattern
- Native Creation Pending - Create later
- setUndecorated() calls reconfigure Window now, ie tries to change the window actually
- Don't issue 'requestFocus()' directly from the native implementation anymore,
call it from the Java code.
- Window/GLWindow/NewtFactory: Constructor simplification
Avoid explosion of constructor overloading, ie removing the 'undecorated' variant,
since this is redundant due to the 'setUndecorated(boolean)' method.
- Fixed/added API documentation
Diffstat (limited to 'src/nativewindow/classes/com')
3 files changed, 54 insertions, 5 deletions
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NullWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NullWindow.java index 7c446addc..fc6242968 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NullWindow.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NullWindow.java @@ -77,11 +77,19 @@ public class NullWindow implements NativeWindow, SurfaceChangeable { recurLock.unlock(); } + public synchronized boolean isSurfaceLockedByOtherThread() { + return recurLock.isLockedByOtherThread(); + } + public synchronized boolean isSurfaceLocked() { return recurLock.isLocked(); } - public Exception getLockedStack() { + public Thread getSurfaceLockOwner() { + return recurLock.getOwner(); + } + + public Exception getSurfaceLockStack() { return recurLock.getLockedStack(); } diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/RecursiveToolkitLock.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/RecursiveToolkitLock.java index b676f6996..3e571b0ef 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/RecursiveToolkitLock.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/RecursiveToolkitLock.java @@ -1,3 +1,31 @@ +/** + * Copyright 2010 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. + */ + package com.jogamp.nativewindow.impl; import javax.media.nativewindow.*; @@ -9,8 +37,9 @@ public class RecursiveToolkitLock { private Thread owner = null; private int recursionCount = 0; private Exception lockedStack = null; - private static final long timeout = 300000; // maximum wait 3s - private static final boolean TRACE_LOCK = false; + private static final long timeout = 3000; // maximum wait 3s + // private static final long timeout = 300000; // maximum wait 300s + private static final boolean TRACE_LOCK = Debug.debug("TraceLock"); public Exception getLockedStack() { return lockedStack; @@ -32,6 +61,10 @@ public class RecursiveToolkitLock { return null != owner; } + public synchronized boolean isLockedByOtherThread() { + return null != owner && Thread.currentThread() != owner ; + } + public synchronized int getRecursionCount() { return recursionCount; } diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java index a59b34eb0..1cd63235d 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java @@ -126,11 +126,19 @@ public abstract class JAWTWindow implements NativeWindow { recurLock.unlock(); } + public synchronized boolean isSurfaceLockedByOtherThread() { + return recurLock.isLockedByOtherThread(); + } + public synchronized boolean isSurfaceLocked() { return recurLock.isLocked(); } - public Exception getLockedStack() { + public Thread getSurfaceLockOwner() { + return recurLock.getOwner(); + } + + public Exception getSurfaceLockStack() { return recurLock.getLockedStack(); } @@ -188,7 +196,7 @@ public abstract class JAWTWindow implements NativeWindow { } else { sb.append(", component NULL"); } - sb.append(", locked "+isSurfaceLocked()+ + sb.append(", lockedExt "+isSurfaceLockedByOtherThread()+ ",\n\tconfig "+config+ ",\n\twrappedWindow "+getWrappedWindow()+"]"); |