aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/junit/com/jogamp/test/junit/jogl/awt/TestAWT02WindowClosing.java103
-rw-r--r--src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java6
-rw-r--r--src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01NEWT.java6
-rw-r--r--src/newt/classes/com/jogamp/newt/Window.java15
-rw-r--r--src/newt/native/X11Window.c53
5 files changed, 147 insertions, 36 deletions
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<args.length; i++) {
+ if(args[i].equals("-time")) {
+ durationPerTest = atoi(args[++i]);
+ }
+ }
+ System.out.println("durationPerTest: "+durationPerTest);
+ org.junit.runner.JUnitCore.main(TestAWT02WindowClosing.class.getName());
+ }
+}
diff --git a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java
index 3a36a1132..3e7228aba 100644
--- a/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java
+++ b/src/junit/com/jogamp/test/junit/newt/TestGLWindows01NEWT.java
@@ -107,8 +107,10 @@ public class TestGLWindows01NEWT {
glWindow.setVisible(true);
Assert.assertEquals(true,glWindow.isVisible());
Assert.assertEquals(true,glWindow.isNativeWindowValid());
- while(glWindow.getTotalFrames()<1) { Thread.sleep(100); }
- Assert.assertEquals(1,glWindow.getTotalFrames()); // native expose ..
+ 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<glWindow.getTotalFrames()); // native expose ..
// Assert.assertEquals(width,glWindow.getWidth());
// Assert.assertEquals(height,glWindow.getHeight());
// System.out.println("Created: "+glWindow);
diff --git a/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01NEWT.java b/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01NEWT.java
index 421f74aa4..68dfa2c06 100644
--- a/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01NEWT.java
+++ b/src/junit/com/jogamp/test/junit/newt/parenting/TestParenting01NEWT.java
@@ -185,12 +185,14 @@ public class TestParenting01NEWT {
Thread.sleep(durationPerTest);
switch(state) {
case 0:
+ Assert.assertEquals(true, glWindow2.isVisible());
glWindow2.reparentWindow(glWindow1, null);
Assert.assertEquals(true, glWindow2.isVisible());
Assert.assertEquals(true, glWindow2.isNativeWindowValid());
Assert.assertEquals(glWindow1,glWindow2.getParentNativeWindow());
break;
case 1:
+ Assert.assertEquals(true, glWindow2.isVisible());
glWindow2.reparentWindow(null, null);
Assert.assertEquals(true, glWindow2.isVisible());
Assert.assertEquals(true, glWindow2.isNativeWindowValid());
@@ -244,12 +246,14 @@ public class TestParenting01NEWT {
Thread.sleep(durationPerTest);
switch(state) {
case 0:
- glWindow2.reparentWindow(null, null);
+ Assert.assertEquals(true, glWindow2.isVisible());
+ glWindow2.reparentWindow(null, null);
Assert.assertEquals(true, glWindow2.isVisible());
Assert.assertEquals(true, glWindow2.isNativeWindowValid());
Assert.assertNull(glWindow2.getParentNativeWindow());
break;
case 1:
+ Assert.assertEquals(true, glWindow2.isVisible());
glWindow2.reparentWindow(glWindow1, null);
Assert.assertEquals(true, glWindow2.isVisible());
Assert.assertEquals(true, glWindow2.isNativeWindowValid());
diff --git a/src/newt/classes/com/jogamp/newt/Window.java b/src/newt/classes/com/jogamp/newt/Window.java
index 9c724314e..0ec8a109b 100644
--- a/src/newt/classes/com/jogamp/newt/Window.java
+++ b/src/newt/classes/com/jogamp/newt/Window.java
@@ -674,12 +674,11 @@ public abstract class Window implements NativeWindow, NEWTEventConsumer
if( 0 != windowHandle ) {
destroy(false);
}
- } else {
- if(wasVisible) {
- Window.this.visible = true;
- setVisibleImpl(true);
- getScreen().getDisplay().dispatchMessages(); // status up2date
- }
+ } else if(wasVisible) {
+ Window.this.visible = true;
+ setVisibleImpl(true);
+ requestFocusImpl();
+ getScreen().getDisplay().dispatchMessages(); // status up2date
}
}
@@ -1461,7 +1460,9 @@ public abstract class Window implements NativeWindow, NEWTEventConsumer
protected void visibleChanged(boolean visible) {
if(DEBUG_IMPLEMENTATION) {
- System.out.println("Window.visibleChanged: "+this.visible+" -> "+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 <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
+#include <X11/Xatom.h>
#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);
}
/*