diff options
author | Sven Gothel <[email protected]> | 2010-11-17 10:46:01 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-11-17 10:46:01 +0100 |
commit | b0b1e3fb9c0f915cdf8d237c0f61a9d08ca83b01 (patch) | |
tree | 97679e79ff3fc80f968728556928b684edcfdee4 /src/nativewindow/classes | |
parent | 984d1ef68ce7e353e9192fe3a4c3ec4ad7a2929c (diff) |
JAWTWindow: Avoid AWTTreeLock, cleanup.
Use native implementation for getLocationOnScreen() if available.
If unavailable call AWT's implementation only in case the AWT TreeLock is hold by this thread.
Finalize methods ..
Diffstat (limited to 'src/nativewindow/classes')
4 files changed, 83 insertions, 31 deletions
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java index 8ef2ba227..de6360212 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTWindow.java @@ -41,7 +41,10 @@ import com.jogamp.common.util.locks.RecursiveLock; import java.awt.Component; import java.awt.Window; -import javax.media.nativewindow.*; +import javax.media.nativewindow.AbstractGraphicsConfiguration; +import javax.media.nativewindow.NativeSurface; +import javax.media.nativewindow.NativeWindow; +import javax.media.nativewindow.NativeWindowException; import javax.media.nativewindow.util.Point; import javax.media.nativewindow.util.Rectangle; @@ -64,12 +67,11 @@ public abstract class JAWTWindow implements NativeWindow { init((Component)comp); } - protected void init(Component windowObject) throws NativeWindowException { + private final void init(Component windowObject) throws NativeWindowException { invalidate(); this.component = windowObject; validateNative(); } - protected abstract void validateNative() throws NativeWindowException; protected synchronized void invalidate() { @@ -78,7 +80,7 @@ public abstract class JAWTWindow implements NativeWindow { bounds = new Rectangle(); } - protected void updateBounds(JAWT_Rectangle jawtBounds) { + protected final void updateBounds(JAWT_Rectangle jawtBounds) { bounds.setX(jawtBounds.getX()); bounds.setY(jawtBounds.getY()); bounds.setWidth(jawtBounds.getWidth()); @@ -86,9 +88,9 @@ public abstract class JAWTWindow implements NativeWindow { } /** @return the JAWT_DrawingSurfaceInfo's (JAWT_Rectangle) bounds, updated with lock */ - public Rectangle getBounds() { return bounds; } + public final Rectangle getBounds() { return bounds; } - public Component getAWTComponent() { + public final Component getAWTComponent() { return component; } @@ -96,7 +98,7 @@ public abstract class JAWTWindow implements NativeWindow { // SurfaceUpdateListener // - public void surfaceUpdated(Object updater, NativeSurface ns, long when) { + public final void surfaceUpdated(Object updater, NativeSurface ns, long when) { // nop } @@ -158,36 +160,36 @@ public abstract class JAWTWindow implements NativeWindow { return recurLock.getOwner(); } - public boolean surfaceSwap() { + public final boolean surfaceSwap() { return false; } - public void surfaceUpdated(Object updater, NativeWindow window, long when) { } + public final void surfaceUpdated(Object updater, NativeWindow window, long when) { } - public long getSurfaceHandle() { + public final long getSurfaceHandle() { return drawable; } - public AbstractGraphicsConfiguration getGraphicsConfiguration() { + public final AbstractGraphicsConfiguration getGraphicsConfiguration() { return config; } - public long getDisplayHandle() { + public final long getDisplayHandle() { return config.getScreen().getDevice().getHandle(); } - public int getScreenIndex() { + public final int getScreenIndex() { return config.getScreen().getIndex(); } - public void setSize(int width, int height) { + public final void setSize(int width, int height) { component.setSize(width, height); } - public int getWidth() { + public final int getWidth() { return component.getWidth(); } - public int getHeight() { + public final int getHeight() { return component.getHeight(); } @@ -204,7 +206,7 @@ public abstract class JAWTWindow implements NativeWindow { invalidate(); } - public NativeWindow getParent() { + public final NativeWindow getParent() { return null; } @@ -212,23 +214,45 @@ public abstract class JAWTWindow implements NativeWindow { return drawable; } - public int getX() { + public final int getX() { return component.getX(); } - public int getY() { + public final int getY() { return component.getY(); } - public Point getLocationOnScreen(Point point) { + public Point getLocationOnScreen(Point storage) { + if( 0 != getWindowHandle() ) { + Point d; + // windowLock.lock(); + try { + d = getLocationOnScreenImpl(0, 0); + } finally { + // windowLock.unlock(); + } + if(null!=d) { + if(null!=storage) { + storage.translate(d.getX(),d.getY()); + return storage; + } + return d; + } + // fall through intended .. + } + + if(!Thread.holdsLock(component.getTreeLock())) { + return null; // avoid deadlock .. + } java.awt.Point awtLOS = component.getLocationOnScreen(); int dx = (int) ( awtLOS.getX() + .5 ) ; int dy = (int) ( awtLOS.getY() + .5 ) ; - if(null!=point) { - return point.translate(dx, dy); + if(null!=storage) { + return storage.translate(dx, dy); } return new Point(dx, dy); } + protected abstract Point getLocationOnScreenImpl(int x, int y); public String toString() { StringBuffer sb = new StringBuffer(); diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/macosx/MacOSXJAWTWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/macosx/MacOSXJAWTWindow.java index bcaa66847..f511c7082 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/macosx/MacOSXJAWTWindow.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/macosx/MacOSXJAWTWindow.java @@ -47,6 +47,7 @@ import java.awt.GraphicsEnvironment; import javax.media.nativewindow.*; import java.security.*; +import javax.media.nativewindow.util.Point; public class MacOSXJAWTWindow extends JAWTWindow { @@ -125,6 +126,10 @@ public class MacOSXJAWTWindow extends JAWTWindow { macosxdsi = null; } + protected Point getLocationOnScreenImpl(int x, int y) { + return null; // FIXME + } + // Variables for lockSurface/unlockSurface private JAWT_DrawingSurface ds; private boolean dsLocked; diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/windows/WindowsJAWTWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/windows/WindowsJAWTWindow.java index d19a11f66..14d6eebcd 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/windows/WindowsJAWTWindow.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/windows/WindowsJAWTWindow.java @@ -40,10 +40,17 @@ package com.jogamp.nativewindow.impl.jawt.windows; -import com.jogamp.nativewindow.impl.*; -import com.jogamp.nativewindow.impl.jawt.*; +import com.jogamp.nativewindow.impl.jawt.JAWT; +import com.jogamp.nativewindow.impl.jawt.JAWTFactory; +import com.jogamp.nativewindow.impl.jawt.JAWTWindow; +import com.jogamp.nativewindow.impl.jawt.JAWT_DrawingSurface; +import com.jogamp.nativewindow.impl.jawt.JAWT_DrawingSurfaceInfo; +import com.jogamp.nativewindow.impl.windows.GDI; -import javax.media.nativewindow.*; +import javax.media.nativewindow.AbstractGraphicsConfiguration; +import javax.media.nativewindow.NativeWindow; +import javax.media.nativewindow.NativeWindowException; +import javax.media.nativewindow.util.Point; public class WindowsJAWTWindow extends JAWTWindow { @@ -152,6 +159,10 @@ public class WindowsJAWTWindow extends JAWTWindow { return windowHandle; } + protected Point getLocationOnScreenImpl(int x, int y) { + return GDI.GetRelativeLocation( getWindowHandle(), 0 /*root win*/, x, y); + } + // Variables for lockSurface/unlockSurface private JAWT_DrawingSurface ds; private boolean dsLocked; diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/x11/X11JAWTWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/x11/X11JAWTWindow.java index a5d36b6dd..1324bd199 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/x11/X11JAWTWindow.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/x11/X11JAWTWindow.java @@ -37,12 +37,20 @@ package com.jogamp.nativewindow.impl.jawt.x11; -import javax.media.nativewindow.*; -import javax.media.nativewindow.awt.*; - -import com.jogamp.nativewindow.impl.x11.*; -import com.jogamp.nativewindow.impl.jawt.*; - +import com.jogamp.nativewindow.impl.jawt.JAWT; +import com.jogamp.nativewindow.impl.jawt.JAWTFactory; +import com.jogamp.nativewindow.impl.jawt.JAWTWindow; +import com.jogamp.nativewindow.impl.jawt.JAWT_DrawingSurface; +import com.jogamp.nativewindow.impl.jawt.JAWT_DrawingSurfaceInfo; +import com.jogamp.nativewindow.impl.x11.X11Util; +import javax.media.nativewindow.AbstractGraphicsConfiguration; +import javax.media.nativewindow.AbstractGraphicsDevice; +import javax.media.nativewindow.AbstractGraphicsScreen; +import javax.media.nativewindow.NativeWindow; +import javax.media.nativewindow.NativeWindowException; +import javax.media.nativewindow.NativeWindowFactory; +import javax.media.nativewindow.awt.AWTGraphicsDevice; +import javax.media.nativewindow.util.Point; public class X11JAWTWindow extends JAWTWindow { @@ -134,6 +142,10 @@ public class X11JAWTWindow extends JAWTWindow { x11dsi = null; } + protected Point getLocationOnScreenImpl(int x, int y) { + return X11Util.GetRelativeLocation( getDisplayHandle(), getScreenIndex(), getWindowHandle(), 0 /*root win*/, x, y); + } + // Variables for lockSurface/unlockSurface private JAWT_DrawingSurface ds; private boolean dsLocked; |