From 95a92192fe4da2f7baa59eece08a6a6e2d71a331 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Fri, 16 Jul 2010 05:03:52 +0200 Subject: Add AWT WindowClosing JUnit test --- .../junit/jogl/awt/TestAWT02WindowClosing.java | 103 +++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/junit/com/jogamp/test/junit/jogl/awt/TestAWT02WindowClosing.java (limited to 'src') diff --git a/src/junit/com/jogamp/test/junit/jogl/awt/TestAWT02WindowClosing.java b/src/junit/com/jogamp/test/junit/jogl/awt/TestAWT02WindowClosing.java new file mode 100644 index 000000000..e837e45d3 --- /dev/null +++ b/src/junit/com/jogamp/test/junit/jogl/awt/TestAWT02WindowClosing.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2010 Sven Gothel. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * Neither the name Sven Gothel or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +package com.jogamp.test.junit.jogl.awt; + +import javax.media.opengl.GLProfile; + +import java.awt.*; +import java.awt.event.*; + +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.After; +import org.junit.Test; + +public class TestAWT02WindowClosing { + static { + GLProfile.initSingleton(); + } + + static long durationPerTest = 200; // ms + + @Test + public void test01WindowClosing() throws InterruptedException { + Frame frame = new Frame(); + frame.setSize(500, 500); + ClosingWindowAdapter closingWindowAdapter = new ClosingWindowAdapter(frame); + frame.addWindowListener(closingWindowAdapter); + frame.setVisible(true); + + Thread.sleep(durationPerTest); + if(!closingWindowAdapter.closingCalled) { + // programatically issue windowClosing + Toolkit tk = Toolkit.getDefaultToolkit(); + EventQueue evtQ = tk.getSystemEventQueue(); + evtQ.postEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING)); + Thread.sleep(200); + } + Assert.assertEquals(true, closingWindowAdapter.closingCalled); + } + + static class ClosingWindowAdapter extends WindowAdapter { + boolean closingCalled = false; + Frame frame; + public ClosingWindowAdapter(Frame frame) { + this.frame = frame; + } + public void windowClosing(WindowEvent ev) { + System.out.println("windowClosing() called .."); + closingCalled = true; + frame.dispose(); + } + } + + static int atoi(String a) { + int i=0; + try { + i = Integer.parseInt(a); + } catch (Exception ex) { ex.printStackTrace(); } + return i; + } + + public static void main(String args[]) { + for(int i=0; i Date: Fri, 16 Jul 2010 12:27:26 +0200 Subject: Junit: Relax assertions NEWT/Reparent --- src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java | 2 +- .../com/jogamp/test/junit/newt/parenting/TestParenting01NEWT.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java index 3a36a1132..52c125998 100644 --- a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java +++ b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java @@ -108,7 +108,7 @@ public class TestGLWindows01NEWT { Assert.assertEquals(true,glWindow.isVisible()); Assert.assertEquals(true,glWindow.isNativeWindowValid()); while(glWindow.getTotalFrames()<1) { Thread.sleep(100); } - Assert.assertEquals(1,glWindow.getTotalFrames()); // native expose .. + Assert.assertTrue(0 Date: Sat, 17 Jul 2010 03:45:19 +0200 Subject: Newt: X11 ICC window properties ; Still bugs with composite manager and Newt reparenting Set _NET_WM_WINDOW_TYPE to specify decoration etc. On KDE4 having compositing enabled the reparent window is sometimes made invisible (UnmapWindow happened). FIXME. --- make/scripts/java-run-all.sh | 2 +- .../test/junit/newt/TestGLWindows01NEWT.java | 1 + .../junit/newt/parenting/TestParenting01NEWT.java | 10 ++-- src/newt/classes/com/jogamp/newt/Window.java | 15 +++--- src/newt/native/X11Window.c | 53 +++++++++++----------- 5 files changed, 42 insertions(+), 39 deletions(-) (limited to 'src') diff --git a/make/scripts/java-run-all.sh b/make/scripts/java-run-all.sh index 0188ae5d2..f99a49617 100755 --- a/make/scripts/java-run-all.sh +++ b/make/scripts/java-run-all.sh @@ -44,7 +44,7 @@ uname -a | grep -i Darwin && MOSX=1 # D_ARGS="-Dnewt.debug=all -Dnativewindow.debug=all" # D_ARGS="-Djogl.debug=all -Dnewt.debug=all -Dnativewindow.debug=all" # D_ARGS="-Dnewt.debug=all" -# D_ARGS="-Dnewt.debug.Window" +D_ARGS="-Dnewt.debug.Window" # D_ARGS="-Dnewt.debug.Display" # D_ARGS="-Djogl.debug=all -Djogl.debug.DynamicLookup=true -Djogamp.debug.NativeLibrary=true" # D_ARGS="-Djogl.debug=all" diff --git a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java index 52c125998..53100eca7 100644 --- a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java +++ b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java @@ -108,6 +108,7 @@ public class TestGLWindows01NEWT { Assert.assertEquals(true,glWindow.isVisible()); Assert.assertEquals(true,glWindow.isNativeWindowValid()); while(glWindow.getTotalFrames()<1) { Thread.sleep(100); } + System.out.println("Frames for initial setVisible(true): "+glWindow.getTotalFrames()); Assert.assertTrue(0 "+visible); + System.out.println("Window.visibleChanged ("+getThreadName()+"): "+this.visible+" -> "+visible+" - windowHandle "+toHexString(windowHandle)+" parentWindowHandle "+toHexString(parentWindowHandle)); + // Exception e = new Exception("Window.visibleChanged ("+getThreadName()+"): "+this.visible+" -> "+visible+" - windowHandle "+toHexString(windowHandle)+" parentWindowHandle "+toHexString(parentWindowHandle)); + // e.printStackTrace(); } this.visible = visible ; } diff --git a/src/newt/native/X11Window.c b/src/newt/native/X11Window.c index 60caab662..11c11915d 100644 --- a/src/newt/native/X11Window.c +++ b/src/newt/native/X11Window.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "com_jogamp_newt_impl_x11_X11Window.h" @@ -441,14 +442,24 @@ static Bool NewtWindows_setOverrideRedirect1 (Display *dpy, Window w, Bool newVa #define MWM_HINTS_DECORATIONS (1L << 1) #define PROP_MWM_HINTS_ELEMENTS 5 -static void NewtWindows_setDecorations (Display *dpy, Window w, Bool val) { +static void NewtWindows_setDecorations (Display *dpy, Window w, Bool decorated) { unsigned long mwmhints[PROP_MWM_HINTS_ELEMENTS] = { 0, 0, 0, 0, 0 }; // flags, functions, decorations, input_mode, status - Atom prop; + Atom _MOTIF_WM_HINTS_DECORATIONS = XInternAtom( dpy, "_MOTIF_WM_HINTS", False ); + Atom _NET_WM_WINDOW_TYPE = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE", False ); + Atom types[3]={0}; + int ntypes=0; + if(True==decorated) { + types[ntypes++] = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE_NORMAL", False ); + } else { + types[ntypes++] = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE_POPUP_MENU", False ); + types[ntypes++] = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE_NORMAL", False ); + } mwmhints[0] = MWM_HINTS_DECORATIONS; - mwmhints[2] = val ; - prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", False ); - XChangeProperty( dpy, w, prop, prop, 32, PropModeReplace, (unsigned char *)&mwmhints, PROP_MWM_HINTS_ELEMENTS); + mwmhints[2] = decorated ; + + XChangeProperty( dpy, w, _MOTIF_WM_HINTS_DECORATIONS, _MOTIF_WM_HINTS_DECORATIONS, 32, PropModeReplace, (unsigned char *)&mwmhints, PROP_MWM_HINTS_ELEMENTS); + XChangeProperty( dpy, w, _NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *)&types, ntypes); } /* @@ -612,12 +623,14 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Display_DispatchMessages break; case MapNotify: - DBG_PRINT( "X11: event . MapNotify call 0x%X\n", (unsigned int)evt.xunmap.window); + DBG_PRINT( "X11: event . MapNotify call Event 0x%X, Window 0x%X, override_redirect %d\n", + (unsigned int)evt.xmap.event, (unsigned int)evt.xmap.window, (int)evt.xmap.override_redirect); (*env)->CallVoidMethod(env, jwindow, visibleChangedID, JNI_TRUE); break; case UnmapNotify: - DBG_PRINT( "X11: event . UnmapNotify call 0x%X\n", (unsigned int)evt.xunmap.window); + DBG_PRINT( "X11: event . UnmapNotify call Event 0x%X, Window 0x%X, from_configure %d\n", + (unsigned int)evt.xunmap.event, (unsigned int)evt.xunmap.window, (int)evt.xunmap.from_configure); (*env)->CallVoidMethod(env, jwindow, visibleChangedID, JNI_FALSE); break; @@ -977,10 +990,10 @@ static void NewtWindows_reparentWindow DBG_PRINT( "X11: reparentWindow dpy %p, parent %p/%p, win %p, %d/%d undec %d\n", (void*)dpy, (void*) jparent, (void*)parent, (void*)w, x, y, undecorated); - // don't propagate events during reparenting - // long orig_xevent_mask = xwa->your_event_mask ; - /* XSelectInput(dpy, w, orig_xevent_mask & ~ ( StructureNotifyMask ) ); - XSync(dpy, False); */ + if(JNI_TRUE == isVisible) { + XUnmapWindow(dpy, w); + XSync(dpy, False); + } if(0 != jparent) { // move into parent .. @@ -990,35 +1003,22 @@ static void NewtWindows_reparentWindow XSync(dpy, False); } - if(JNI_TRUE == isVisible) { - XUnmapWindow(dpy, w); - XSync(dpy, False); - } - XReparentWindow( dpy, w, parent, x, y ); XSync(dpy, False); if(0 == jparent) { // move out of parent .. - NewtWindows_setOverrideRedirect0 (dpy, w, xwa, (0 == jparent) ? False : True); + NewtWindows_setOverrideRedirect0 (dpy, w, xwa, False); XSync(dpy, False); NewtWindows_setDecorations (dpy, w, (JNI_TRUE == undecorated) ? False : True); XSync(dpy, False); } if(JNI_TRUE == isVisible) { - XRaiseWindow(dpy, w); + XMapRaised(dpy, w); XSync(dpy, False); - XMapWindow(dpy, w); - XSync(dpy, False); - } - - /* XSelectInput(dpy, w, orig_xevent_mask); - XSync(dpy, False); */ - - if(JNI_TRUE == isVisible) { NewtWindows_requestFocus0 ( env, obj, dpy, w, xwa ); XSync(dpy, False); } @@ -1061,6 +1061,7 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Window_setPosSizeDecor0 xwc.width=width; xwc.height=height; XConfigureWindow(dpy, w, CWX|CWY|CWWidth|CWHeight, &xwc); + XSync(dpy, False); } /* -- cgit v1.2.3 From 932005c606cda7ab5aed364ff8de803fdc7b852c Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sat, 17 Jul 2010 04:26:43 +0200 Subject: Junit: Avoid possible forever loop in test --- src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java index 53100eca7..3e7228aba 100644 --- a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java +++ b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java @@ -107,7 +107,8 @@ public class TestGLWindows01NEWT { glWindow.setVisible(true); Assert.assertEquals(true,glWindow.isVisible()); Assert.assertEquals(true,glWindow.isNativeWindowValid()); - while(glWindow.getTotalFrames()<1) { Thread.sleep(100); } + int wait=0; + while(wait<10 && glWindow.getTotalFrames()<1) { Thread.sleep(100); wait++; } System.out.println("Frames for initial setVisible(true): "+glWindow.getTotalFrames()); Assert.assertTrue(0