diff options
author | Sven Gothel <[email protected]> | 2012-05-01 09:21:14 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2012-05-01 09:21:14 +0200 |
commit | 4e0eb391d6c64f956ea5c87c0385ab48a24b2175 (patch) | |
tree | 69f0f45c73fc7fe2a95a678e75fa5fb4262911db /src/newt/classes/com | |
parent | 5742b1faa210401470032ef129e56a83c47fd046 (diff) |
Fix Bug 560 and NEWT window closing behavior in general for all platforms.
- NEWT/WindowImpl:
- 'void windowDestroyNotify()' -> 'boolean windowDestroyNotify(boolean force)', allowing to signal a forced close,
as well as replying whether the window has been closed. (called by native code)
- destroy(): set states before releasing the window lock
- NEWT/X11: Pass windowDeleteAtom for reconfigure window, in case of reparenting child to top-level
- NEWT/OSX:
- Add 'BOOL windowShouldClose()' impl., ie. having a chance to reject the close attempt
- Common impl. for 'windowShouldClose' and 'windowWillClose' -> 'windowClosingImpl'
utilizing new 'windowDestroyNotify' code (see above).
Fixes bug 560.
- NEWT/JOGLNewtApplet1Run: Refine out-of browser window behavior for window-close button
- default: move NEWT window back to browser parent
- closeable: close NEWT window
- jogl-test-applets: Add NApplet-Closeable test (Applet out-of browser window is closable)
Diffstat (limited to 'src/newt/classes/com')
-rwxr-xr-x | src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java | 9 | ||||
-rwxr-xr-x | src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtAppletBase.java | 27 |
2 files changed, 34 insertions, 2 deletions
diff --git a/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java b/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java index a052f6f97..82562636b 100755 --- a/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java +++ b/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java @@ -36,6 +36,7 @@ import java.awt.event.KeyListener; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; +import javax.media.nativewindow.WindowClosingProtocol; import javax.media.opengl.FPSCounter; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; @@ -64,7 +65,7 @@ import com.jogamp.newt.opengl.GLWindow; * </p> * * <p> - * Example of an applet tag using GearsES2 in an undecorated, translucent and always-on-top window: + * Example of an applet tag using GearsES2 in an undecorated, translucent, closeable and always-on-top window: * <pre> <applet width=1 height=1> <param name="java_arguments" value="-Dsun.java2d.noddraw=true"> @@ -73,6 +74,7 @@ import com.jogamp.newt.opengl.GLWindow; <param name="gl_swap_interval" value="1"> <param name="gl_undecorated" value="true"> <param name="gl_alwaysontop" value="true"> + <param name="gl_closeable" value="true"> <param name="gl_alpha" value="1"> <param name="gl_multisamplebuffer" value="0"> <param name="gl_opaque" value="false"> @@ -115,6 +117,7 @@ public class JOGLNewtApplet1Run extends Applet { boolean glTrace=false; boolean glUndecorated=false; boolean glAlwaysOnTop=false; + boolean glCloseable=false; boolean glOpaque=true; int glAlphaBits=0; int glNumMultisampleBuffer=0; @@ -128,6 +131,7 @@ public class JOGLNewtApplet1Run extends Applet { glTrace = JOGLNewtAppletBase.str2Bool(getParameter("gl_trace"), glTrace); glUndecorated = JOGLNewtAppletBase.str2Bool(getParameter("gl_undecorated"), glUndecorated); glAlwaysOnTop = JOGLNewtAppletBase.str2Bool(getParameter("gl_alwaysontop"), glAlwaysOnTop); + glCloseable = JOGLNewtAppletBase.str2Bool(getParameter("gl_closeable"), glCloseable); glOpaque = JOGLNewtAppletBase.str2Bool(getParameter("gl_opaque"), glOpaque); glAlphaBits = JOGLNewtAppletBase.str2Int(getParameter("gl_alpha"), glAlphaBits); glNumMultisampleBuffer = JOGLNewtAppletBase.str2Int(getParameter("gl_multisamplebuffer"), glNumMultisampleBuffer); @@ -157,6 +161,7 @@ public class JOGLNewtApplet1Run extends Applet { System.err.println("glTrace: "+glTrace); System.err.println("glUndecorated: "+glUndecorated); System.err.println("glAlwaysOnTop: "+glAlwaysOnTop); + System.err.println("glCloseable: "+glCloseable); System.err.println("glOpaque: "+glOpaque); System.err.println("glAlphaBits: "+glAlphaBits); System.err.println("glNumMultisampleBuffer: "+glNumMultisampleBuffer); @@ -166,6 +171,7 @@ public class JOGLNewtApplet1Run extends Applet { base = new JOGLNewtAppletBase(glEventListenerClazzName, glSwapInterval, glNoDefaultKeyListener, + glCloseable, glDebug, glTrace); @@ -181,6 +187,7 @@ public class JOGLNewtApplet1Run extends Applet { glWindow.setUpdateFPSFrames(FPSCounter.DEFAULT_FRAMES_PER_INTERVAL, System.err); glWindow.setUndecorated(glUndecorated); glWindow.setAlwaysOnTop(glAlwaysOnTop); + glWindow.setDefaultCloseOperation(glCloseable ? WindowClosingProtocol.DISPOSE_ON_CLOSE : WindowClosingProtocol.DO_NOTHING_ON_CLOSE); container.setLayout(new BorderLayout()); if(appletDebugTestBorder) { container.add(new Button("North"), BorderLayout.NORTH); diff --git a/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtAppletBase.java b/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtAppletBase.java index 67da50210..9ffc24372 100755 --- a/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtAppletBase.java +++ b/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtAppletBase.java @@ -32,6 +32,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import javax.media.nativewindow.NativeWindow; +import javax.media.nativewindow.WindowClosingProtocol; import javax.media.opengl.FPSCounter; import javax.media.opengl.GL; import javax.media.opengl.GLAutoDrawable; @@ -43,8 +44,10 @@ import jogamp.newt.Debug; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.KeyListener; import com.jogamp.newt.event.MouseListener; +import com.jogamp.newt.event.WindowAdapter; import com.jogamp.newt.event.WindowEvent; import com.jogamp.newt.event.WindowListener; +import com.jogamp.newt.event.WindowUpdateEvent; import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.util.Animator; @@ -58,6 +61,7 @@ public class JOGLNewtAppletBase implements KeyListener, GLEventListener { String glEventListenerClazzName; int glSwapInterval; boolean noDefaultKeyListener; + boolean glClosable; boolean glDebug; boolean glTrace; @@ -70,12 +74,14 @@ public class JOGLNewtAppletBase implements KeyListener, GLEventListener { public JOGLNewtAppletBase(String glEventListenerClazzName, int glSwapInterval, boolean noDefaultKeyListener, + boolean glClosable, boolean glDebug, boolean glTrace) { this.glEventListenerClazzName=glEventListenerClazzName; this.glSwapInterval=glSwapInterval; this.noDefaultKeyListener = noDefaultKeyListener; + this.glClosable = glClosable; this.glDebug = glDebug; this.glTrace = glTrace; } @@ -152,9 +158,25 @@ public class JOGLNewtAppletBase implements KeyListener, GLEventListener { init(Thread.currentThread().getThreadGroup(), glWindow); } - public void init(ThreadGroup tg, GLWindow glWindow) { + public void init(ThreadGroup tg, final GLWindow glWindow) { isValid = false; this.glWindow = glWindow; + this.glWindow.addWindowListener(new WindowAdapter() { + // Closing action: back to parent! + @Override + public void windowDestroyNotify(WindowEvent e) { + if( WindowClosingProtocol.DO_NOTHING_ON_CLOSE == glWindow.getDefaultCloseOperation() ) { + if(null == glWindow.getParent()) { + // we may be called directly by the native EDT + new Thread(new Runnable() { + public void run() { + // try { Thread.sleep(10); } catch (InterruptedException e) { } + glWindow.reparentWindow(awtParent); + } + }).start(); + } + } + } } ); glEventListener = createInstance(glEventListenerClazzName); if(null == glEventListener) { @@ -277,6 +299,9 @@ public class JOGLNewtAppletBase implements KeyListener, GLEventListener { glWindow.reparentWindow(awtParent); } else { glWindow.reparentWindow(null); + if(glClosable) { + glWindow.setDefaultCloseOperation(WindowClosingProtocol.DISPOSE_ON_CLOSE); + } } } } |