diff options
Diffstat (limited to 'src/newt/classes')
14 files changed, 63 insertions, 24 deletions
diff --git a/src/newt/classes/jogamp/newt/ScreenImpl.java b/src/newt/classes/jogamp/newt/ScreenImpl.java index c520d0d63..3c46814d2 100644 --- a/src/newt/classes/jogamp/newt/ScreenImpl.java +++ b/src/newt/classes/jogamp/newt/ScreenImpl.java @@ -100,7 +100,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener { return (Class<? extends Screen>)screenClass; } - public static Screen create(Display display, final int idx) { + public static Screen create(Display display, int idx) { try { if(usrWidth<0 || usrHeight<0) { synchronized (Screen.class) { @@ -114,18 +114,20 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener { } } synchronized(screenList) { + Class<? extends Screen> screenClass = getScreenClass(display.getType()); + ScreenImpl screen = (ScreenImpl) screenClass.newInstance(); + screen.display = (DisplayImpl) display; + idx = screen.validateScreenIndex(idx); { Screen screen0 = ScreenImpl.getLastScreenOf(display, idx, -1); if(null != screen0) { if(DEBUG) { System.err.println("Screen.create() REUSE: "+screen0+" "+Display.getThreadName()); } + screen = null; return screen0; } } - Class<? extends Screen> screenClass = getScreenClass(display.getType()); - ScreenImpl screen = (ScreenImpl) screenClass.newInstance(); - screen.display = (DisplayImpl) display; screen.screen_idx = idx; screen.fqname = (display.getFQName()+idx).intern(); screen.hashCode = screen.fqname.hashCode(); @@ -238,7 +240,8 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener { protected abstract void createNativeImpl(); protected abstract void closeNativeImpl(); - + protected abstract int validateScreenIndex(int idx); + public final String getFQName() { return fqname; } diff --git a/src/newt/classes/jogamp/newt/WindowImpl.java b/src/newt/classes/jogamp/newt/WindowImpl.java index a8e93d428..7c811c66a 100644 --- a/src/newt/classes/jogamp/newt/WindowImpl.java +++ b/src/newt/classes/jogamp/newt/WindowImpl.java @@ -92,7 +92,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer protected CapabilitiesChooser capabilitiesChooser = null; // default null -> default protected boolean fullscreen = false, hasFocus = false; protected int width = 128, height = 128; // client-area size w/o insets, default: may be overwritten by user - protected int x = -1, y = -1; // client-area pos w/o insets, default: undefined (allow WM to choose if not set by user) + protected int x = 64, y = 64; // client-area pos w/o insets + protected boolean autoPosition = true; // default: true (allow WM to choose if not set by user) protected Insets insets = new Insets(); // insets of decoration (if top-level && decorated) protected int nfs_width, nfs_height, nfs_x, nfs_y; // non fullscreen client-area size/pos w/o insets @@ -276,8 +277,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer NativeSurface.LOCK_SURFACE_NOT_READY >= parentWindow.lockSurface() ) { throw new NativeWindowException("Parent surface lock: not ready: "+parentWindow); } - if( ( 0>x || 0>y ) && ( isUndecorated() || null != parentWindow ) ) { - // default child/undecorated window position is 0/0, if not set by user + if( ( 0>x || 0>y ) && null != parentWindow ) { + // min. child window position is 0/0 x = 0; y = 0; } try { @@ -1643,6 +1644,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer } public void setPosition(int x, int y) { + autoPosition = false; runOnEDTIfAvail(true, new SetPositionActionImpl(x, y)); } @@ -2349,6 +2351,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer /** Triggered by implementation's WM events to update the position. */ protected void positionChanged(boolean defer, int newX, int newY) { + autoPosition = false; if ( x != newX || y != newY ) { if(DEBUG_IMPLEMENTATION) { System.err.println("Window.positionChanged: ("+getThreadName()+"): (defer: "+defer+") "+x+"/"+y+" -> "+newX+"/"+newY+" - windowHandle "+toHexString(windowHandle)+" parentWindowHandle "+toHexString(parentWindowHandle)); @@ -2414,8 +2417,6 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * Triggered by implementation's WM events to update the content */ protected void windowRepaint(boolean defer, int x, int y, int width, int height) { - x = ( 0 > x ) ? this.x : x; - y = ( 0 > y ) ? this.y : y; width = ( 0 >= width ) ? this.width : width; height = ( 0 >= height ) ? this.height : height; if(DEBUG_IMPLEMENTATION) { diff --git a/src/newt/classes/jogamp/newt/driver/android/AndroidScreen.java b/src/newt/classes/jogamp/newt/driver/android/AndroidScreen.java index ce6a9c594..79bf744fe 100644 --- a/src/newt/classes/jogamp/newt/driver/android/AndroidScreen.java +++ b/src/newt/classes/jogamp/newt/driver/android/AndroidScreen.java @@ -74,6 +74,10 @@ public class AndroidScreen extends jogamp.newt.ScreenImpl { return ScreenModeUtil.streamIn(props, 0); } + protected int validateScreenIndex(int idx) { + return 0; // FIXME: only one screen available ? + } + //---------------------------------------------------------------------- // Internals only // diff --git a/src/newt/classes/jogamp/newt/driver/awt/AWTScreen.java b/src/newt/classes/jogamp/newt/driver/awt/AWTScreen.java index 644c96391..a8aa2844d 100644 --- a/src/newt/classes/jogamp/newt/driver/awt/AWTScreen.java +++ b/src/newt/classes/jogamp/newt/driver/awt/AWTScreen.java @@ -62,4 +62,9 @@ public class AWTScreen extends ScreenImpl { } protected void closeNativeImpl() { } + + protected int validateScreenIndex(int idx) { + return idx; // FIXME: ??? + } + } diff --git a/src/newt/classes/jogamp/newt/driver/awt/AWTWindow.java b/src/newt/classes/jogamp/newt/driver/awt/AWTWindow.java index ca280fa8b..1cd98b068 100644 --- a/src/newt/classes/jogamp/newt/driver/awt/AWTWindow.java +++ b/src/newt/classes/jogamp/newt/driver/awt/AWTWindow.java @@ -188,11 +188,6 @@ public class AWTWindow extends WindowImpl { container.setVisible(0 != ( FLAG_IS_VISIBLE & flags)); } - x=(x>=0)?x:AWTWindow.this.x; - y=(x>=0)?y:AWTWindow.this.y; - width=(width>0)?width:AWTWindow.this.width; - height=(height>0)?height:AWTWindow.this.height; - container.setLocation(x, y); Insets insets = container.getInsets(); container.setSize(width + insets.left + insets.right, diff --git a/src/newt/classes/jogamp/newt/driver/broadcom/egl/Screen.java b/src/newt/classes/jogamp/newt/driver/broadcom/egl/Screen.java index 0a8453701..9d96ac5d6 100644 --- a/src/newt/classes/jogamp/newt/driver/broadcom/egl/Screen.java +++ b/src/newt/classes/jogamp/newt/driver/broadcom/egl/Screen.java @@ -52,6 +52,10 @@ public class Screen extends jogamp.newt.ScreenImpl { protected void closeNativeImpl() { } + protected int validateScreenIndex(int idx) { + return 0; // only one screen available + } + //---------------------------------------------------------------------- // Internals only // diff --git a/src/newt/classes/jogamp/newt/driver/intel/gdl/Screen.java b/src/newt/classes/jogamp/newt/driver/intel/gdl/Screen.java index 26b7120a9..62d9da4ed 100644 --- a/src/newt/classes/jogamp/newt/driver/intel/gdl/Screen.java +++ b/src/newt/classes/jogamp/newt/driver/intel/gdl/Screen.java @@ -53,6 +53,10 @@ public class Screen extends jogamp.newt.ScreenImpl { protected void closeNativeImpl() { } + protected int validateScreenIndex(int idx) { + return 0; // only one screen available + } + //---------------------------------------------------------------------- // Internals only // diff --git a/src/newt/classes/jogamp/newt/driver/intel/gdl/Window.java b/src/newt/classes/jogamp/newt/driver/intel/gdl/Window.java index 6fc76a12d..873d0a0c1 100644 --- a/src/newt/classes/jogamp/newt/driver/intel/gdl/Window.java +++ b/src/newt/classes/jogamp/newt/driver/intel/gdl/Window.java @@ -84,11 +84,6 @@ public class Window extends jogamp.newt.WindowImpl { protected boolean reconfigureWindowImpl(int x, int y, int width, int height, int flags) { Screen screen = (Screen) getScreen(); - x=(x>=0)?x:this.x; - y=(x>=0)?y:this.y; - width=(width>0)?width:this.width; - height=(height>0)?height:this.height; - if(width>screen.getWidth()) { width=screen.getWidth(); } diff --git a/src/newt/classes/jogamp/newt/driver/kd/KDScreen.java b/src/newt/classes/jogamp/newt/driver/kd/KDScreen.java index a11b08b5c..0bfe8a622 100644 --- a/src/newt/classes/jogamp/newt/driver/kd/KDScreen.java +++ b/src/newt/classes/jogamp/newt/driver/kd/KDScreen.java @@ -54,4 +54,8 @@ public class KDScreen extends ScreenImpl { protected void setScreenSize(int w, int h) { super.setScreenSize(w, h); } + + protected int validateScreenIndex(int idx) { + return 0; // only one screen available + } } diff --git a/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java b/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java index 7785a5078..1c8128a5a 100644 --- a/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java +++ b/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java @@ -106,6 +106,10 @@ public class MacScreen extends ScreenImpl { return setScreenMode0(screen_idx, nativeModeIdx); } + protected int validateScreenIndex(int idx) { + return idx; + } + private native int[] getScreenMode0(int screen_index, int mode_index); private native boolean setScreenMode0(int screen_index, int mode_idx); } diff --git a/src/newt/classes/jogamp/newt/driver/windows/WindowsScreen.java b/src/newt/classes/jogamp/newt/driver/windows/WindowsScreen.java index ef06667ce..b1cdc36b2 100644 --- a/src/newt/classes/jogamp/newt/driver/windows/WindowsScreen.java +++ b/src/newt/classes/jogamp/newt/driver/windows/WindowsScreen.java @@ -101,6 +101,10 @@ public class WindowsScreen extends ScreenImpl { sm.getRotation()); } + protected int validateScreenIndex(int idx) { + return 0; // big-desktop, only one screen available + } + // Native calls private native int getWidthImpl0(int scrn_idx); diff --git a/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java b/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java index 23206c29d..ca868f4ee 100644 --- a/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java +++ b/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java @@ -115,7 +115,7 @@ public class WindowsWindow extends WindowImpl { final int flags = getReconfigureFlags(0, true) & ( FLAG_IS_ALWAYSONTOP | FLAG_IS_UNDECORATED ) ; setWindowHandle(CreateWindow0(display.getHInstance(), display.getWindowClassName(), display.getWindowClassName(), - getParentWindowHandle(), x, y, width, height, flags)); + getParentWindowHandle(), x, y, width, height, autoPosition, flags)); if (getWindowHandle() == 0) { throw new NativeWindowException("Error creating window"); } @@ -287,7 +287,7 @@ public class WindowsWindow extends WindowImpl { private native long CreateWindow0(long hInstance, String wndClassName, String wndName, long parentWindowHandle, - int x, int y, int width, int height, int flags); + int x, int y, int width, int height, boolean autoPosition, int flags); private native long MonitorFromWindow0(long windowHandle); private native void reconfigureWindow0(long parentWindowHandle, long windowHandle, int x, int y, int width, int height, int flags); diff --git a/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java b/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java index 463c62eba..1c5388d2c 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java +++ b/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java @@ -33,6 +33,7 @@ */ package jogamp.newt.driver.x11; +import jogamp.nativewindow.x11.X11Lib; import jogamp.nativewindow.x11.X11Util; import jogamp.newt.DisplayImpl; import jogamp.newt.ScreenImpl; @@ -254,6 +255,21 @@ public class X11Screen extends ScreenImpl { return done; } + private class XineramaEnabledQuery implements DisplayImpl.DisplayRunnable<Boolean> { + public Boolean run(long dpy) { + return new Boolean(X11Lib.XineramaEnabled(dpy)); + } + } + private XineramaEnabledQuery xineramaEnabledQuery = new XineramaEnabledQuery(); + + protected int validateScreenIndex(final int idx) { + if(getDisplay().isNativeValid()) { + return runWithLockedDisplayHandle( xineramaEnabledQuery ).booleanValue() ? 0 : idx; + } else { + return runWithTempDisplayHandle( xineramaEnabledQuery ).booleanValue() ? 0 : idx; + } + } + //---------------------------------------------------------------------- // Internals only // diff --git a/src/newt/classes/jogamp/newt/driver/x11/X11Window.java b/src/newt/classes/jogamp/newt/driver/x11/X11Window.java index bfaf53f0d..0bcf45a8d 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/X11Window.java +++ b/src/newt/classes/jogamp/newt/driver/x11/X11Window.java @@ -79,7 +79,7 @@ public class X11Window extends WindowImpl { setWindowHandle(CreateWindow0(getParentWindowHandle(), display.getEDTHandle(), screen.getIndex(), visualID, display.getJavaObjectAtom(), display.getWindowDeleteAtom(), - x, y, width, height, flags)); + x, y, width, height, autoPosition, flags)); windowHandleClose = getWindowHandle(); if (0 == windowHandleClose) { throw new NativeWindowException("Error creating window"); @@ -239,7 +239,7 @@ public class X11Window extends WindowImpl { private native long CreateWindow0(long parentWindowHandle, long display, int screen_index, long visualID, long javaObjectAtom, long windowDeleteAtom, - int x, int y, int width, int height, int flags); + int x, int y, int width, int height, boolean autoPosition, int flags); private native void CloseWindow0(long display, long windowHandle, long javaObjectAtom, long windowDeleteAtom); private native void reconfigureWindow0(long display, int screen_index, long parentWindowHandle, long windowHandle, int x, int y, int width, int height, int flags); |