diff options
author | Sven Gothel <[email protected]> | 2011-09-09 15:56:44 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-09-09 15:56:44 +0200 |
commit | de0fe22e6f08de6430cf3219bd6e31b52f7da8d1 (patch) | |
tree | 0c89b80aa53190700871c40861d35fc9d0b12513 /src/newt/classes | |
parent | 8def3e243401a0fe8ce606de6a54381a65626f15 (diff) |
NEWT: Window default pos ; FullScreen
- FullScreen
- lock parent window if child
- X11: more sophisticated EWMH FS usage
- X11: set window 'Above' before FS and at focus
- allow window WM default position at window creation
- default position { -1, -1 } as hint to native WM
to gather a suitable default position
- wait until user-pos or WM-pos reached
- reconfigureWindow*
- allow -1 values for pos/size to mark no-change
Diffstat (limited to 'src/newt/classes')
-rw-r--r-- | src/newt/classes/jogamp/newt/WindowImpl.java | 104 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java | 18 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/x11/X11Window.java | 22 |
3 files changed, 104 insertions, 40 deletions
diff --git a/src/newt/classes/jogamp/newt/WindowImpl.java b/src/newt/classes/jogamp/newt/WindowImpl.java index 7c8174a6f..75c3510b7 100644 --- a/src/newt/classes/jogamp/newt/WindowImpl.java +++ b/src/newt/classes/jogamp/newt/WindowImpl.java @@ -87,7 +87,8 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer protected CapabilitiesImmutable capsRequested = null; protected CapabilitiesChooser capabilitiesChooser = null; // default null -> default protected boolean fullscreen = false, hasFocus = false; - protected int width = 128, height = 128, x = 0, y = 0; // client-area size/pos w/o insets + 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 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 @@ -257,9 +258,15 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer if(DEBUG_IMPLEMENTATION) { System.err.println("Window.createNative() START ("+getThreadName()+", "+this+")"); } + final boolean userPos = 0<=x && 0<=y; // user has specified a position + if( null != parentWindow && NativeSurface.LOCK_SURFACE_NOT_READY >= parentWindow.lockSurface() ) { - throw new NativeWindowException("Parent surface lock: not ready: "+parentWindow); + throw new NativeWindowException("Parent surface lock: not ready: "+parentWindow); + } + if( !userPos && ( isUndecorated() || null != parentWindow ) ) { + // default child/undecorated window position is 0/0, if not set by user + x = 0; y = 0; } try { if(validateParentWindowHandle()) { @@ -267,11 +274,19 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer throw new InternalError("XXX"); } if(canCreateNativeImpl()) { + final int _x = x, _y = y; // orig req pos screen.addReference(); screenReferenceAdded = true; createNativeImpl(); screen.addScreenModeListener(screenModeListenerImpl); setTitleImpl(title); + waitForVisible(true, false); + if(userPos) { + // wait for user req position + waitForPosSize(_x, _y, -1, -1, false, TIMEOUT_NATIVEWINDOW); + } else { + waitForAnyPos(false, TIMEOUT_NATIVEWINDOW); + } } // always flag visible, // allowing to retry if visible && !isNativeValid() @@ -413,10 +428,10 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer * to insets and positioning a decorated window to 0/0, which would place the frame * outside of the screen.</p> * - * @param x client-area position - * @param y client-area position - * @param width client-area size - * @param height client-area size + * @param x client-area position, or <0 if unchanged + * @param y client-area position, or <0 if unchanged + * @param width client-area size, or <=0 if unchanged + * @param height client-area size, or <=0 if unchanged * @param flags bitfield of change and status flags * * @see #sizeChanged(int,int) @@ -1488,21 +1503,33 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer display.dispatchMessagesNative(); // status up2date boolean wasVisible = isVisible(); - reconfigureWindowImpl(x, y, w, h, - getReconfigureFlags( ( ( 0 != parentWindowHandle ) ? FLAG_CHANGE_PARENTING : 0 ) | - FLAG_CHANGE_FULLSCREEN | FLAG_CHANGE_DECORATION, wasVisible) ); + // Lock parentWindow only during reparenting (attempt) + final NativeWindow parentWindowLocked; + if( null != parentWindow ) { + parentWindowLocked = parentWindow; + if( NativeSurface.LOCK_SURFACE_NOT_READY >= parentWindowLocked.lockSurface() ) { + throw new NativeWindowException("Parent surface lock: not ready: "+parentWindow); + } + } else { + parentWindowLocked = null; + } + try { + reconfigureWindowImpl(x, y, w, h, + getReconfigureFlags( ( ( null != parentWindowLocked ) ? FLAG_CHANGE_PARENTING : 0 ) | + FLAG_CHANGE_FULLSCREEN | FLAG_CHANGE_DECORATION, wasVisible) ); + } finally { + if(null!=parentWindowLocked) { + parentWindowLocked.unlockSurface(); + } + } display.dispatchMessagesNative(); // status up2date - + if(wasVisible) { - // visibility should be implicit if needed by native impl, - // however .. this is a little fallback code - if(!WindowImpl.this.waitForVisible(true, true, TIMEOUT_NATIVEWINDOW)) { - setVisibleImpl(true, x, y, w, h); - WindowImpl.this.waitForVisible(true, true, TIMEOUT_NATIVEWINDOW); - display.dispatchMessagesNative(); // status up2date - } - // ensure size is set, request focus .. and done + setVisibleImpl(true, x, y, w, h); + WindowImpl.this.waitForVisible(true, false); + display.dispatchMessagesNative(); // status up2date WindowImpl.this.waitForPosSize(-1, -1, w, h, false, TIMEOUT_NATIVEWINDOW); + display.dispatchMessagesNative(); // status up2date requestFocusImpl(true); display.dispatchMessagesNative(); // status up2date @@ -2047,16 +2074,15 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer DisplayImpl display = (DisplayImpl) screen.getDisplay(); for(long sleep = timeOut; 0<sleep && this.visible != visible; sleep-=10 ) { display.dispatchMessagesNative(); // status up2date - try { - Thread.sleep(10); - } catch (InterruptedException ie) {} + try { Thread.sleep(10); } catch (InterruptedException ie) {} sleep -=10; } if(this.visible != visible) { + final String msg = "Visibility not reached as requested within "+timeOut+"ms : requested "+visible+", is "+this.visible; if(failFast) { - throw new NativeWindowException("Visibility not reached as requested within "+timeOut+"ms : requested "+visible+", is "+this.visible); + throw new NativeWindowException(msg); } else if (DEBUG_IMPLEMENTATION) { - System.err.println("******* Visibility not reached as requested within "+timeOut+"ms : requested "+visible+", is "+this.visible); + System.err.println(msg); } } return this.visible == visible; @@ -2091,17 +2117,39 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer reached = true; } else { display.dispatchMessagesNative(); // status up2date - try { - Thread.sleep(10); - } catch (InterruptedException ie) {} + try { Thread.sleep(10); } catch (InterruptedException ie) {} + sleep -=10; + } + } + if(!reached) { + final String msg = "Size/Pos not reached as requested within "+timeOut+"ms : requested "+x+"/"+y+" "+w+"x"+h+", is "+getX()+"/"+getY()+" "+getWidth()+"x"+getHeight(); + if(failFast) { + throw new NativeWindowException(msg); + } else if (DEBUG_IMPLEMENTATION) { + System.err.println(msg); + } + } + return reached; + } + + private boolean waitForAnyPos(boolean failFast, long timeOut) { + DisplayImpl display = (DisplayImpl) screen.getDisplay(); + boolean reached = false; + for(long sleep = timeOut; !reached && 0<sleep; sleep-=10 ) { + if( 0<=getX() && 0<=getY() ) { + reached = true; + } else { + display.dispatchMessagesNative(); // status up2date + try { Thread.sleep(10); } catch (InterruptedException ie) {} sleep -=10; } } if(!reached) { + final String msg = "Any Pos not reached as requested within "+timeOut+"ms : is "+getX()+"/"+getY(); if(failFast) { - throw new NativeWindowException("Size/Pos not reached as requested within "+timeOut+"ms : requested "+x+"/"+y+" "+w+"x"+h+", is "+getX()+"/"+getY()+" "+getWidth()+"x"+getHeight()); + throw new NativeWindowException(msg); } else if (DEBUG_IMPLEMENTATION) { - System.err.println("********** Size/Pos not reached as requested within "+timeOut+"ms : requested "+x+"/"+y+" "+w+"x"+h+", is "+getX()+"/"+getY()+" "+getWidth()+"x"+getHeight()); + System.err.println(msg); } } return reached; diff --git a/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java b/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java index a78014468..7dd67e62b 100644 --- a/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java +++ b/src/newt/classes/jogamp/newt/driver/windows/WindowsWindow.java @@ -156,14 +156,18 @@ public class WindowsWindow extends WindowImpl { final InsetsImmutable i = getInsets(); // client position -> top-level window position - x -= i.getLeftWidth() ; - y -= i.getTopHeight() ; - if( 0 > x ) { x = 0; } - if( 0 > y ) { y = 0; } + if(0<=x && 0<=y) { + x -= i.getLeftWidth() ; + y -= i.getTopHeight() ; + if( 0 > x ) { x = 0; } + if( 0 > y ) { y = 0; } + } - // client size -> top-level window size - width += i.getTotalWidth(); - height += i.getTotalHeight(); + if(0<width && 0<height) { + // client size -> top-level window size + width += i.getTotalWidth(); + height += i.getTotalHeight(); + } } reconfigureWindow0( getParentWindowHandle(), getWindowHandle(), x, y, width, height, flags); diff --git a/src/newt/classes/jogamp/newt/driver/x11/X11Window.java b/src/newt/classes/jogamp/newt/driver/x11/X11Window.java index 416bdbdf0..3c48ba4bf 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/X11Window.java +++ b/src/newt/classes/jogamp/newt/driver/x11/X11Window.java @@ -34,6 +34,8 @@ package jogamp.newt.driver.x11; import jogamp.nativewindow.x11.X11Util; +import jogamp.newt.DisplayImpl; +import jogamp.newt.DisplayImpl.DisplayRunnable; import jogamp.newt.WindowImpl; import javax.media.nativewindow.*; import javax.media.nativewindow.x11.*; @@ -99,7 +101,7 @@ public class X11Window extends WindowImpl { getReconfigureFlagsAsString(null, flags)); } - if(0 == ( FLAG_IS_UNDECORATED & flags)) { + if(0 == ( FLAG_IS_UNDECORATED & flags) && 0<=x && 0<=y) { final InsetsImmutable i = getInsets(); // client position -> top-level window position @@ -119,12 +121,18 @@ public class X11Window extends WindowImpl { } @Override - protected void setTitleImpl(String title) { - setTitle0(getDisplayEDTHandle(), getWindowHandle(), title); + protected void setTitleImpl(final String title) { + runWithLockedDisplayHandle( new DisplayImpl.DisplayRunnable() { + public Object run(long dpy) { + setTitle0(dpy, getWindowHandle(), title); + return null; + } + }); } - protected Point getLocationOnScreenImpl(int x, int y) { - return X11Util.GetRelativeLocation( getDisplayEDTHandle(), getScreenIndex(), getWindowHandle(), 0 /*root win*/, x, y); + protected Point getLocationOnScreenImpl(final int x, final int y) { + // X11Util.GetRelativeLocation: locks display already ! + return X11Util.GetRelativeLocation( getScreen().getDisplay().getHandle(), getScreenIndex(), getWindowHandle(), 0 /*root win*/, x, y); } protected void updateInsetsImpl(Insets insets) { @@ -138,6 +146,10 @@ public class X11Window extends WindowImpl { private final long getDisplayEDTHandle() { return ((X11Display) getScreen().getDisplay()).getEDTHandle(); } + private final Object runWithLockedDisplayHandle(DisplayRunnable action) { + return ((DisplayImpl) getScreen().getDisplay()).runWithLockedDisplayHandle(action); + // return runWithTempDisplayHandle(action); + } protected static native boolean initIDs0(); private native long CreateWindow0(long parentWindowHandle, long display, int screen_index, |