aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2023-09-29 03:22:28 +0200
committerSven Gothel <[email protected]>2023-09-29 03:22:28 +0200
commit2e46eb1bf06ef07801062122716aa99a6c871646 (patch)
tree0ef44b49991e270b5e956240056d6ce6a392871f /src
parenta0e6d5883de009d4649d011633090d7660fa229a (diff)
Bug 1430 - Fix Background erase not disabled with AWT GLCanvas and NewtCanvasAWT
Commit c5431f46b7bf64f109315ec78461859dd88f202a reduced the disableBackgroundErase(..) to SunToolkit's variation which doesn't work on Windows as it does not act upon the java.awt.Canvas peer post addNotify(). This re-introduces the java.awt.Canvas method via class JAWTUtil.BackgroundEraseControl and its called only after addNotify() on Windows and ASAP for everyone else. Method also calles the SunTookit variation just to be sure.
Diffstat (limited to 'src')
-rw-r--r--src/jogl/classes/com/jogamp/opengl/awt/GLCanvas.java12
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java103
-rw-r--r--src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java12
-rw-r--r--src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java12
4 files changed, 125 insertions, 14 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/awt/GLCanvas.java b/src/jogl/classes/com/jogamp/opengl/awt/GLCanvas.java
index 735a2a21c..97a3321d5 100644
--- a/src/jogl/classes/com/jogamp/opengl/awt/GLCanvas.java
+++ b/src/jogl/classes/com/jogamp/opengl/awt/GLCanvas.java
@@ -86,6 +86,8 @@ import com.jogamp.opengl.GLSharedContextSetter;
import com.jogamp.opengl.Threading;
import com.jogamp.common.GlueGenVersion;
+import com.jogamp.common.os.Platform;
+import com.jogamp.common.os.Platform.OSType;
import com.jogamp.common.util.VersionUtil;
import com.jogamp.common.util.awt.AWTEDTExecutor;
import com.jogamp.common.util.locks.LockFactory;
@@ -169,6 +171,8 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
private static final boolean DEBUG = Debug.debug("GLCanvas");
+ private static JAWTUtil.BackgroundEraseControl backgroundEraseControl = new JAWTUtil.BackgroundEraseControl();
+
private final RecursiveLock lock = LockFactory.createRecursiveLock();
private final GLDrawableHelper helper = new GLDrawableHelper();
private volatile GLDrawableImpl drawable; // volatile: avoid locking for read-only access
@@ -589,7 +593,9 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
*/
// before native peer is valid: X11
- JAWTUtil.disableBackgroundErase(this);
+ if( OSType.WINDOWS != Platform.getOSType() ) {
+ backgroundEraseControl.disable(this);
+ }
final GraphicsDevice awtDevice;
if(null==awtDeviceReq) {
@@ -614,7 +620,9 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
super.addNotify();
// after native peer is valid: Windows
- JAWTUtil.disableBackgroundErase(this);
+ if( OSType.WINDOWS == Platform.getOSType() ) {
+ backgroundEraseControl.disable(this);
+ }
createJAWTDrawableAndContext();
diff --git a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
index 86de6e30d..f3c3da286 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
@@ -109,7 +109,7 @@ public class JAWTUtil {
// default initialization to null, false
Method awtLockMID;
Method awtUnlockMID;
- Method disableBackgroundEraseMID;
+ Method stkDisableBackgroundEraseMID;
boolean ok;
}
private static class GraphicsDeviceData {
@@ -117,7 +117,6 @@ public class JAWTUtil {
// default initialization to null, false
Method getScaleFactorMID;
Method getCGDisplayIDMIDOnOSX;
- boolean ok;
}
/**
@@ -381,8 +380,8 @@ public class JAWTUtil {
d.awtLockMID.setAccessible(true);
d.awtUnlockMID = sunToolkitClass.getDeclaredMethod("awtUnlock");
d.awtUnlockMID.setAccessible(true);
- d.disableBackgroundEraseMID = sunToolkitClass.getDeclaredMethod("disableBackgroundErase", java.awt.Component.class);
- d.disableBackgroundEraseMID.setAccessible(true);
+ d.stkDisableBackgroundEraseMID = sunToolkitClass.getDeclaredMethod("disableBackgroundErase", java.awt.Component.class);
+ d.stkDisableBackgroundEraseMID.setAccessible(true);
d.ok=true;
} catch (final Exception e) {
// Either not a Sun JDK or the interfaces have changed since [Java 1.4.2 / 1.5 -> Java 11]
@@ -394,7 +393,7 @@ public class JAWTUtil {
}}); }});
stkAWTLockMID = std.awtLockMID;
stkAWTUnlockMID = std.awtUnlockMID;
- stkDisableBackgroundEraseMID = std.disableBackgroundEraseMID;
+ stkDisableBackgroundEraseMID = std.stkDisableBackgroundEraseMID;
boolean _hasSunToolkitAWTLock = false;
if ( std.ok ) {
try {
@@ -489,7 +488,7 @@ public class JAWTUtil {
}
if (DEBUG) {
- System.err.println("JAWTUtil: Has sun.awt.SunToolkit: awtLock/awtUnlock " + hasSTKAWTLock + ", disableBackgroundErase "+(null!=stkDisableBackgroundEraseMID));
+ System.err.println("JAWTUtil: Has sun.awt.SunToolkit: awtLock/awtUnlock " + hasSTKAWTLock + ", stkDisableBackgroundErase "+(null!=stkDisableBackgroundEraseMID));
System.err.println("JAWTUtil: Has Java2D " + j2dExist);
System.err.println("JAWTUtil: Is headless " + headlessMode);
final int hints = ( null != desktophints ) ? desktophints.size() : 0 ;
@@ -604,19 +603,27 @@ public class JAWTUtil {
* @param component
* @return {@code true} if available and successful, otherwise {@code false}
*/
- public static boolean disableBackgroundErase(final java.awt.Component component) {
+ public static boolean disableBackgroundEraseSTK(final java.awt.Component component) {
if( null != stkDisableBackgroundEraseMID ) {
try {
stkDisableBackgroundEraseMID.invoke(component.getToolkit(), component);
+ if( DEBUG ) {
+ System.err.println(getThreadName()+dbe_msg+" OK");
+ }
return true;
} catch (final Exception e) {
if( DEBUG ) {
- ExceptionUtils.dumpThrowable("JAWTUtil", e);
+ System.err.println(getThreadName()+dbe_msg+" failed, error "+e);
+ ExceptionUtils.dumpThrowable(dbe_msg, e);
}
}
}
+ if( DEBUG ) {
+ System.err.println(getThreadName()+dbe_msg+" failed, no method");
+ }
return false;
}
+ private static final String dbe_msg = ": java.awt.Component: STK disableBackgroundErase";
/**
* Queries the Monitor's display ID of the given device
@@ -800,5 +807,85 @@ public class JAWTUtil {
return NativeWindowFactory.createScreen(adevice, AWTGraphicsScreen.findScreenIndex(awtComp.getGraphicsConfiguration().getDevice()));
}
+
+ /**
+ * Disables the AWT's erasing of this Canvas's background on Windows in Java SE 6.
+ * <p>
+ * Utilize this class as a static instance within your AWT Canvas override.
+ * </p>
+ * <p>
+ * Implementation also calls {@link JAWTUtil#disableBackgroundEraseSTK(java.awt.Component)} just in case.
+ * </p>
+ * <p>
+ * This internal API is not available in previous releases,
+ * but the system property {@code -Dsun.awt.noerasebackground=true}
+ * can be specified to get similar results globally in previous releases.
+ * </p>
+ */
+ public static class BackgroundEraseControl {
+ private boolean disableBackgroundEraseInitialized = false;
+ private Method disableBackgroundEraseMethod = null;
+ private static final String msg = ": java.awt.Canvas: TK disableBackgroundErase";
+
+ /**
+ * Disables the AWT's erasing of this Canvas's background on Windows in Java SE 6.
+ * <p>
+ * Method also calls {@link JAWTUtil#disableBackgroundEraseSTK(java.awt.Component)} just in case.
+ * </p>
+ */
+ public boolean disable(final java.awt.Canvas canvas) {
+ if (!disableBackgroundEraseInitialized) {
+ try {
+ SecurityUtil.doPrivileged(new PrivilegedAction<Object>() {
+ @Override
+ public Object run() {
+ try {
+ Class<?> clazz = canvas.getToolkit().getClass();
+ while (clazz != null && disableBackgroundEraseMethod == null) {
+ try {
+ disableBackgroundEraseMethod =
+ clazz.getDeclaredMethod("disableBackgroundErase",
+ new Class[] { java.awt.Canvas.class });
+ disableBackgroundEraseMethod.setAccessible(true);
+ } catch (final Exception e) {
+ clazz = clazz.getSuperclass();
+ }
+ }
+ } catch (final Exception e) {
+ }
+ return null;
+ }
+ });
+ } catch (final Exception e) {
+ }
+ disableBackgroundEraseInitialized = true;
+ if(DEBUG) {
+ System.err.println(getThreadName()+msg+" method found: "+
+ (null!=disableBackgroundEraseMethod));
+ }
+ }
+ boolean res = false;
+ if (disableBackgroundEraseMethod != null) {
+ Throwable t=null;
+ try {
+ disableBackgroundEraseMethod.invoke(canvas.getToolkit(), new Object[] { canvas });
+ res = true;
+ } catch (final Exception e) {
+ t = e;
+ }
+ if(DEBUG) {
+ System.err.println(getThreadName()+msg+" res "+res+", error: "+t);
+ if( null != t ) {
+ ExceptionUtils.dumpThrowable(msg, t);
+ }
+ }
+ } else if(DEBUG) {
+ System.err.println(getThreadName()+msg+" failed, no method");
+ }
+ JAWTUtil.disableBackgroundEraseSTK(canvas);
+ return res;
+ }
+ }
+
}
diff --git a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
index 783bc6857..fc885e591 100644
--- a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
+++ b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
@@ -69,6 +69,8 @@ import jogamp.newt.driver.DriverClearFocus;
import jogamp.opengl.awt.AWTTilePainter;
import com.jogamp.common.ExceptionUtils;
+import com.jogamp.common.os.Platform;
+import com.jogamp.common.os.Platform.OSType;
import com.jogamp.common.util.awt.AWTEDTExecutor;
import com.jogamp.nativewindow.awt.AWTGraphicsConfiguration;
import com.jogamp.nativewindow.awt.AWTPrintLifecycle;
@@ -100,6 +102,8 @@ import com.jogamp.opengl.util.TileRenderer;
public class NewtCanvasAWT extends java.awt.Canvas implements NativeWindowHolder, WindowClosingProtocol, OffscreenLayerOption, AWTPrintLifecycle {
public static final boolean DEBUG = Debug.debug("Window");
+ private static JAWTUtil.BackgroundEraseControl backgroundEraseControl = new JAWTUtil.BackgroundEraseControl();
+
private final Object sync = new Object();
private volatile JAWTWindow jawtWindow = null; // the JAWTWindow presentation of this AWT Canvas, bound to the 'drawable' lifecycle
private boolean isApplet = false;
@@ -589,7 +593,9 @@ public class NewtCanvasAWT extends java.awt.Canvas implements NativeWindowHolder
* This code order also allows recreation, ie re-adding the GLCanvas.
*/
// before native peer is valid: X11
- JAWTUtil.disableBackgroundErase(this);
+ if( OSType.WINDOWS != Platform.getOSType() ) {
+ backgroundEraseControl.disable(this);
+ }
// Query AWT GraphicsDevice from parent tree, default
final GraphicsConfiguration gc = super.getGraphicsConfiguration();
@@ -607,7 +613,9 @@ public class NewtCanvasAWT extends java.awt.Canvas implements NativeWindowHolder
super.addNotify();
// after native peer is valid: Windows
- JAWTUtil.disableBackgroundErase(this);
+ if( OSType.WINDOWS == Platform.getOSType() ) {
+ backgroundEraseControl.disable(this);
+ }
synchronized(sync) {
determineIfApplet();
diff --git a/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java b/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java
index b81bd7544..11eb1dba0 100644
--- a/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java
+++ b/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java
@@ -39,6 +39,8 @@ import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsConfiguration;
+import com.jogamp.common.os.Platform;
+import com.jogamp.common.os.Platform.OSType;
import com.jogamp.nativewindow.AbstractGraphicsDevice;
import com.jogamp.nativewindow.AbstractGraphicsScreen;
import com.jogamp.nativewindow.CapabilitiesChooser;
@@ -59,6 +61,8 @@ import jogamp.nativewindow.jawt.JAWTUtil;
@SuppressWarnings("serial")
public class AWTCanvas extends Canvas {
+ private static JAWTUtil.BackgroundEraseControl backgroundEraseControl = new JAWTUtil.BackgroundEraseControl();
+
private final WindowDriver driver;
private final CapabilitiesImmutable capabilities;
private final CapabilitiesChooser chooser;
@@ -121,7 +125,9 @@ public class AWTCanvas extends Canvas {
public void addNotify() {
// before native peer is valid: X11
- JAWTUtil.disableBackgroundErase(this);
+ if( OSType.WINDOWS != Platform.getOSType() ) {
+ backgroundEraseControl.disable(this);
+ }
/**
* 'super.addNotify()' determines the GraphicsConfiguration,
@@ -146,7 +152,9 @@ public class AWTCanvas extends Canvas {
super.addNotify();
// after native peer is valid: Windows
- JAWTUtil.disableBackgroundErase(this);
+ if( OSType.WINDOWS == Platform.getOSType() ) {
+ backgroundEraseControl.disable(this);
+ }
{
jawtWindow = (JAWTWindow) NativeWindowFactory.getNativeWindow(this, awtConfig);