diff options
-rw-r--r-- | src/nativewindow/native/x11/Xmisc.c | 6 | ||||
-rw-r--r-- | src/newt/classes/com/jogamp/newt/Display.java | 27 | ||||
-rw-r--r-- | src/newt/classes/com/jogamp/newt/Screen.java | 23 | ||||
-rw-r--r-- | src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java | 5 | ||||
-rw-r--r-- | src/newt/classes/com/jogamp/newt/impl/DisplayImpl.java | 21 | ||||
-rw-r--r-- | src/newt/classes/com/jogamp/newt/impl/ScreenImpl.java | 10 |
6 files changed, 66 insertions, 26 deletions
diff --git a/src/nativewindow/native/x11/Xmisc.c b/src/nativewindow/native/x11/Xmisc.c index 831d94636..290ec14cf 100644 --- a/src/nativewindow/native/x11/Xmisc.c +++ b/src/nativewindow/native/x11/Xmisc.c @@ -185,8 +185,14 @@ static int errorHandlerBlocked = 0 ; static int x11ErrorHandler(Display *dpy, XErrorEvent *e) { + fprintf(stderr, "Info: Nativewindow X11 Error: Display %p, Code 0x%X, errno %s", dpy, e->error_code, strerror(errno)); +#if 0 + // Since the X11 Error may happen anytime, a exception could mess up the JVM completely. + // Experienced this for remote displays issuing non supported commands, eg. glXCreateContextAttribsARB(..) + // _throwNewRuntimeException(NULL, x11ErrorHandlerJNIEnv, "Info: Nativewindow X11 Error: Display %p, Code 0x%X, errno %s", dpy, e->error_code, strerror(errno)); +#endif #if 0 if(NULL!=origErrorHandler) { diff --git a/src/newt/classes/com/jogamp/newt/Display.java b/src/newt/classes/com/jogamp/newt/Display.java index bec014c0b..19733723e 100644 --- a/src/newt/classes/com/jogamp/newt/Display.java +++ b/src/newt/classes/com/jogamp/newt/Display.java @@ -35,6 +35,7 @@ import com.jogamp.newt.impl.DisplayImpl; import java.util.*; import javax.media.nativewindow.AbstractGraphicsDevice; +import javax.media.nativewindow.NativeWindowException; public abstract class Display { public static final boolean DEBUG = Debug.debug("Display"); @@ -53,6 +54,17 @@ public abstract class Display { } /** + * Manual trigger the native creation.<br> + * This is useful to be able to request the {@link javax.media.nativewindow.AbstractGraphicsDevice}, via + * {@link #getGraphicsDevice()}. Otherwise the abstract device won't be available before the dependent components (Screen and Window) + * are realized. + * @throws NativeWindowException if the native creation failed. + */ + public abstract void createNative() throws NativeWindowException; + + public abstract void destroy(); + + /** * @return true if the native display handle is valid and ready to operate, * otherwise false. * @@ -61,13 +73,6 @@ public abstract class Display { public abstract boolean isNativeValid(); /** - * @return number of references by Screen - */ - public abstract int getReferenceCount(); - - public abstract void destroy(); - - /** * @return the value set by {@link #setDestroyWhenUnused(boolean)} * or the default <code>false</code>. * @@ -88,13 +93,19 @@ public abstract class Display { public abstract void setDestroyWhenUnused(boolean v); /** + * @return number of references by Screen + */ + public abstract int getReferenceCount(); + + /** * The 1st call will initiate native creation, * since we follow the lazy creation pattern. * * @return number of references after adding one + * @throws NativeWindowException if the native creation failed. * @see #removeReference() */ - public abstract int addReference(); + public abstract int addReference() throws NativeWindowException ; /** * The last call may destroy this instance, diff --git a/src/newt/classes/com/jogamp/newt/Screen.java b/src/newt/classes/com/jogamp/newt/Screen.java index d7d6baea7..a6d45d789 100644 --- a/src/newt/classes/com/jogamp/newt/Screen.java +++ b/src/newt/classes/com/jogamp/newt/Screen.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.media.nativewindow.AbstractGraphicsScreen; +import javax.media.nativewindow.NativeWindowException; public abstract class Screen { @@ -56,17 +57,20 @@ public abstract class Screen { } return false; } - - public abstract boolean isNativeValid(); /** - * - * @return number of references by Window + * Manual trigger the native creation.<br> + * This is useful to be able to request the {@link javax.media.nativewindow.AbstractGraphicsScreen}, via + * {@link #getGraphicsScreen()}. Otherwise the abstract device won't be available before the dependent component (Window) + * is realized. + * @throws NativeWindowException if the native creation failed. */ - public abstract int getReferenceCount(); + public abstract void createNative() throws NativeWindowException; public abstract void destroy(); + public abstract boolean isNativeValid(); + /** * @return {@link Display#getDestroyWhenUnused()} * @@ -86,13 +90,20 @@ public abstract class Screen { public abstract void setDestroyWhenUnused(boolean v); /** + * + * @return number of references by Window + */ + public abstract int getReferenceCount(); + + /** * See {@link Display#addReference()} * + * @throws NativeWindowException if the native creation failed. * @see #removeReference() * @see #setDestroyWhenUnused(boolean) * @see #getDestroyWhenUnused() */ - public abstract int addReference(); + public abstract int addReference() throws NativeWindowException; /** * See {@link Display#removeReference()} diff --git a/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java b/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java index d7a22b92c..e2b3b81ef 100644 --- a/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java +++ b/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java @@ -38,9 +38,9 @@ package com.jogamp.newt.impl; import com.jogamp.common.util.RunnableTask; -import com.jogamp.newt.Display; import com.jogamp.newt.util.EDTUtil; import java.util.*; +import javax.media.nativewindow.NativeWindowException; public class DefaultEDTUtil implements EDTUtil { public static final boolean DEBUG = Debug.debug("EDT"); @@ -177,6 +177,9 @@ public class DefaultEDTUtil implements EDTUtil { throwable = rTask.getThrowable(); } if(null!=throwable) { + if(throwable instanceof NativeWindowException) { + throw (NativeWindowException)throwable; + } throw new RuntimeException(throwable); } } diff --git a/src/newt/classes/com/jogamp/newt/impl/DisplayImpl.java b/src/newt/classes/com/jogamp/newt/impl/DisplayImpl.java index d22e9c7c4..7983a1118 100644 --- a/src/newt/classes/com/jogamp/newt/impl/DisplayImpl.java +++ b/src/newt/classes/com/jogamp/newt/impl/DisplayImpl.java @@ -43,6 +43,7 @@ import com.jogamp.newt.util.EDTUtil; import com.jogamp.newt.util.MainThread; import java.util.ArrayList; import javax.media.nativewindow.AbstractGraphicsDevice; +import javax.media.nativewindow.NativeWindowException; import javax.media.nativewindow.NativeWindowFactory; public abstract class DisplayImpl extends Display { @@ -111,18 +112,24 @@ public abstract class DisplayImpl extends Display { return hashCode; } - protected synchronized final void createNative() { + public synchronized final void createNative() + throws NativeWindowException + { if(null==aDevice) { if(DEBUG) { System.err.println("Display.createNative() START ("+getThreadName()+", "+this+")"); } final DisplayImpl f_dpy = this; - runOnEDTIfAvail(true, new Runnable() { - public void run() { - f_dpy.createNativeImpl(); - }}); + try { + runOnEDTIfAvail(true, new Runnable() { + public void run() { + f_dpy.createNativeImpl(); + }}); + } catch (Throwable t) { + throw new NativeWindowException(t); + } if(null==aDevice) { - throw new RuntimeException("Display.createNative() failed to instanciate an AbstractGraphicsDevice"); + throw new NativeWindowException("Display.createNative() failed to instanciate an AbstractGraphicsDevice"); } if(DEBUG) { System.err.println("Display.createNative() END ("+getThreadName()+", "+this+")"); @@ -216,7 +223,7 @@ public abstract class DisplayImpl extends Display { createNative(); } if(null == aDevice) { - throw new RuntimeException("Display.addReference() (refCount "+refCount+") null AbstractGraphicsDevice"); + throw new NativeWindowException ("Display.addReference() (refCount "+refCount+") null AbstractGraphicsDevice"); } return ++refCount; } diff --git a/src/newt/classes/com/jogamp/newt/impl/ScreenImpl.java b/src/newt/classes/com/jogamp/newt/impl/ScreenImpl.java index ebb496988..c9d1a9c32 100644 --- a/src/newt/classes/com/jogamp/newt/impl/ScreenImpl.java +++ b/src/newt/classes/com/jogamp/newt/impl/ScreenImpl.java @@ -129,7 +129,9 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener { return hashCode; } - protected synchronized final void createNative() { + public synchronized final void createNative() + throws NativeWindowException + { if(null == aScreen) { if(DEBUG) { System.err.println("Screen.createNative() START ("+DisplayImpl.getThreadName()+", "+this+")"); @@ -138,7 +140,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener { display.addReference(); createNativeImpl(); if(null == aScreen) { - throw new RuntimeException("Screen.createNative() failed to instanciate an AbstractGraphicsScreen"); + throw new NativeWindowException("Screen.createNative() failed to instanciate an AbstractGraphicsScreen"); } if(DEBUG) { System.err.println("Screen.createNative() END ("+DisplayImpl.getThreadName()+", "+this+")"); @@ -166,7 +168,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener { display.removeReference(); } - public synchronized final int addReference() { + public synchronized final int addReference() throws NativeWindowException { if(DEBUG) { System.err.println("Screen.addReference() ("+DisplayImpl.getThreadName()+"): "+refCount+" -> "+(refCount+1)); } @@ -174,7 +176,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener { createNative(); } if(null == aScreen) { - throw new RuntimeException("Screen.addReference() (refCount "+refCount+") null AbstractGraphicsScreen"); + throw new NativeWindowException("Screen.addReference() (refCount "+refCount+") null AbstractGraphicsScreen"); } return ++refCount; } |