diff options
author | Sven Gothel <[email protected]> | 2011-11-27 17:40:45 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-11-27 17:40:45 +0100 |
commit | d3df9b409a0b524497eadd92ccf749ac669b0825 (patch) | |
tree | 2340142350b016b170c79c19155cdb00283b2ad1 /src/newt | |
parent | 3602649d8e15d2272ac58e9d2abbf60e1e17ff0d (diff) |
MacWindow: Impl. DriverUpdatePosition; Alias position2TopLevel -> getLocationOnScreenImpl
Since the MacWindow position needs to be changed in concert with the parent,
we need to be triggered to update ours. AWTParentWindowAdapter issues 'updatePosition()'
if DriverUpdatePosition is implemented.
Diffstat (limited to 'src/newt')
3 files changed, 84 insertions, 70 deletions
diff --git a/src/newt/classes/com/jogamp/newt/event/awt/AWTWindowAdapter.java b/src/newt/classes/com/jogamp/newt/event/awt/AWTWindowAdapter.java index ae7474c73..69b0d0482 100644 --- a/src/newt/classes/com/jogamp/newt/event/awt/AWTWindowAdapter.java +++ b/src/newt/classes/com/jogamp/newt/event/awt/AWTWindowAdapter.java @@ -107,6 +107,9 @@ public class AWTWindowAdapter public void componentResized(java.awt.event.ComponentEvent e) { com.jogamp.newt.event.WindowEvent event = AWTNewtEventFactory.createWindowEvent(e, newtWindow); + if(DEBUG_IMPLEMENTATION) { + System.err.println("AWT: componentResized: "+event); + } if(null!=newtListener) { ((com.jogamp.newt.event.WindowListener)newtListener).windowResized(event); } else { @@ -116,6 +119,9 @@ public class AWTWindowAdapter public void componentMoved(java.awt.event.ComponentEvent e) { com.jogamp.newt.event.WindowEvent event = AWTNewtEventFactory.createWindowEvent(e, newtWindow); + if(DEBUG_IMPLEMENTATION) { + System.err.println("AWT: componentMoved: "+event); + } if(null!=newtListener) { ((com.jogamp.newt.event.WindowListener)newtListener).windowMoved(event); } else { diff --git a/src/newt/classes/jogamp/newt/awt/event/AWTParentWindowAdapter.java b/src/newt/classes/jogamp/newt/awt/event/AWTParentWindowAdapter.java index 313a5e868..8e9c028d4 100644 --- a/src/newt/classes/jogamp/newt/awt/event/AWTParentWindowAdapter.java +++ b/src/newt/classes/jogamp/newt/awt/event/AWTParentWindowAdapter.java @@ -30,6 +30,8 @@ package jogamp.newt.awt.event; import java.awt.KeyboardFocusManager; +import jogamp.newt.driver.DriverUpdatePosition; + import com.jogamp.newt.event.awt.AWTAdapter; import com.jogamp.newt.event.awt.AWTWindowAdapter; @@ -99,7 +101,12 @@ public class AWTParentWindowAdapter } public void componentMoved(java.awt.event.ComponentEvent e) { - // no propagation to NEWT child window + if(DEBUG_IMPLEMENTATION) { + System.err.println("AWT: componentMoved: "+e); + } + if(getNewtWindow().getDelegatedWindow() instanceof DriverUpdatePosition) { + ((DriverUpdatePosition)getNewtWindow().getDelegatedWindow()).updatePosition(); + } } public void windowActivated(java.awt.event.WindowEvent e) { @@ -113,11 +120,11 @@ public class AWTParentWindowAdapter public void hierarchyChanged(java.awt.event.HierarchyEvent e) { if( null == getNewtEventListener() ) { long bits = e.getChangeFlags(); - final java.awt.Component changed = e.getChanged(); + final java.awt.Component changed = e.getChanged(); if( 0 != ( java.awt.event.HierarchyEvent.SHOWING_CHANGED & bits ) ) { final boolean showing = changed.isShowing(); if(DEBUG_IMPLEMENTATION) { - System.err.println("AWT: hierarchyChanged SHOWING_CHANGED: showing "+showing+", "+changed); + System.err.println("AWT: hierarchyChanged SHOWING_CHANGED: showing "+showing+", "+changed+", source "+e.getComponent()); } getNewtWindow().runOnEDTIfAvail(false, new Runnable() { public void run() { diff --git a/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java b/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java index 277f7e6b9..4570abbfa 100644 --- a/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java +++ b/src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java @@ -46,10 +46,11 @@ import javax.media.nativewindow.util.PointImmutable; import jogamp.newt.WindowImpl; import jogamp.newt.driver.DriverClearFocus; +import jogamp.newt.driver.DriverUpdatePosition; import com.jogamp.newt.event.KeyEvent; -public class MacWindow extends WindowImpl implements SurfaceChangeable, DriverClearFocus { +public class MacWindow extends WindowImpl implements SurfaceChangeable, DriverClearFocus, DriverUpdatePosition { static { MacDisplay.initSingleton(); @@ -152,8 +153,21 @@ public class MacWindow extends WindowImpl implements SurfaceChangeable, DriverCl } } + public void updatePosition() { + final Point pS = getLocationOnScreenImpl(getX(), getY()); + if(DEBUG_IMPLEMENTATION) { + System.err.println("MacWindow: updatePosition() - isOffscreenInstance "+isOffscreenInstance+", new abs pos: pS "+pS); + } + if( !isOffscreenInstance ) { + setFrameTopLeftPoint0(getParentWindowHandle(), getWindowHandle(), pS.getX(), pS.getY()); + } // else no offscreen position + // no native event (fullscreen, some reparenting) + positionChanged(true, pS); + } + + protected boolean reconfigureWindowImpl(int x, int y, int width, int height, int flags) { - final PointImmutable pS = position2TopLevel(new Point(x, y)); + final Point pS = getLocationOnScreenImpl(x, y); isOffscreenInstance = 0 != sscSurfaceHandle || isOffscreenInstance(this, this.getParent()); if(DEBUG_IMPLEMENTATION) { @@ -162,57 +176,65 @@ public class MacWindow extends WindowImpl implements SurfaceChangeable, DriverCl ", "+getReconfigureFlagsAsString(null, flags)); } - if( getWindowHandle() == 0 ) { - if( 0 != ( FLAG_IS_VISIBLE & flags) ) { - createWindow(isOffscreenInstance, false, pS, width, height, 0 != ( FLAG_IS_FULLSCREEN & flags)); - // no native event .. - visibleChanged(true, true); - } /* else { ?? } */ - } else { - if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) && 0 == ( FLAG_IS_VISIBLE & flags) ) { - if ( !isOffscreenInstance ) { - orderOut0(getWindowHandle()); - } - // no native event .. - visibleChanged(true, false); - } - if( 0 != ( FLAG_CHANGE_DECORATION & flags) || - 0 != ( FLAG_CHANGE_PARENTING & flags) || - 0 != ( FLAG_CHANGE_FULLSCREEN & flags) ) { - createWindow(isOffscreenInstance, true, pS, width, height, 0 != ( FLAG_IS_FULLSCREEN & flags)); - if(isVisible()) { flags |= FLAG_CHANGE_VISIBILITY; } - } - if(x>=0 && y>=0) { - if( !isOffscreenInstance ) { - setFrameTopLeftPoint0(getParentWindowHandle(), getWindowHandle(), pS.getX(), pS.getY()); - } // else no offscreen position - // no native event (fullscreen, some reparenting) - positionChanged(true, getLocationOnScreenImpl(0, 0)); // incl. validation - } - if(width>0 && height>0) { - if( !isOffscreenInstance ) { - setContentSize0(getWindowHandle(), width, height); - } // else offscreen size is realized via recreation - // no native event (fullscreen, some reparenting) - sizeChanged(true, width, height, false); // incl. validation (incl. repositioning) + if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) && 0 == ( FLAG_IS_VISIBLE & flags) ) { + if ( !isOffscreenInstance ) { + orderOut0(getWindowHandle()); } - if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) && 0 != ( FLAG_IS_VISIBLE & flags) ) { - if( !isOffscreenInstance ) { - orderFront0(getWindowHandle()); - } - // no native event .. - visibleChanged(true, true); - } + // no native event .. + visibleChanged(true, false); + } + if( 0 == getWindowHandle() && 0 != ( FLAG_IS_VISIBLE & flags) || + 0 != ( FLAG_CHANGE_DECORATION & flags) || + 0 != ( FLAG_CHANGE_PARENTING & flags) || + 0 != ( FLAG_CHANGE_FULLSCREEN & flags) ) { + createWindow(isOffscreenInstance, 0 != getWindowHandle(), pS, width, height, 0 != ( FLAG_IS_FULLSCREEN & flags)); + if(isVisible()) { flags |= FLAG_CHANGE_VISIBILITY; } + } + if(x>=0 && y>=0) { + if( !isOffscreenInstance ) { + setFrameTopLeftPoint0(getParentWindowHandle(), getWindowHandle(), pS.getX(), pS.getY()); + } // else no offscreen position + // no native event (fullscreen, some reparenting) + positionChanged(true, pS); // incl. validation + } + if(width>0 && height>0) { + if( !isOffscreenInstance ) { + setContentSize0(getWindowHandle(), width, height); + } // else offscreen size is realized via recreation + // no native event (fullscreen, some reparenting) + sizeChanged(true, width, height, false); // incl. validation (incl. repositioning) + } + if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) && 0 != ( FLAG_IS_VISIBLE & flags) ) { if( !isOffscreenInstance ) { - setAlwaysOnTop0(getWindowHandle(), 0 != ( FLAG_IS_ALWAYSONTOP & flags)); + orderFront0(getWindowHandle()); } + // no native event .. + visibleChanged(true, true); + } + if( !isOffscreenInstance ) { + setAlwaysOnTop0(getWindowHandle(), 0 != ( FLAG_IS_ALWAYSONTOP & flags)); } return true; } protected Point getLocationOnScreenImpl(int x, int y) { - return position2TopLevel(new Point(x, y)); // allows offscreen .. - // return (Point) getLocationOnScreen0(getWindowHandle(), x, y); + Point p = new Point(x, y); + if(0<=p.getX() && 0<=p.getY()) { + final InsetsImmutable _insets = getInsets(); // zero if undecorated + // client position -> top-level window position + p.setX(p.getX() - _insets.getLeftWidth()) ; + p.setY(p.getY() - _insets.getTopHeight()) ; + } + // min val is 0 + p.setX(Math.max(p.getX(), 0)); + p.setY(Math.max(p.getY(), 0)); + + final NativeWindow parent = getParent(); + if( null != parent && 0 != parent.getWindowHandle() ) { + final Point plos = parent.getLocationOnScreen(null); + p.translate(plos); + } + return p; } protected void updateInsetsImpl(Insets insets) { @@ -222,7 +244,7 @@ public class MacWindow extends WindowImpl implements SurfaceChangeable, DriverCl @Override protected void sizeChanged(boolean defer, int newWidth, int newHeight, boolean force) { if(width != newWidth || height != newHeight) { - final Point p0S = position2TopLevel(new Point(x, y)); + final Point p0S = getLocationOnScreenImpl(x, y); setFrameTopLeftPoint0(getParentWindowHandle(), getWindowHandle(), p0S.getX(), p0S.getY()); } super.sizeChanged(defer, newWidth, newHeight, force); @@ -320,8 +342,6 @@ public class MacWindow extends WindowImpl implements SurfaceChangeable, DriverCl orderOut0(0!=getParentWindowHandle() ? getParentWindowHandle() : getWindowHandle()); } else { setTitle0(getWindowHandle(), getTitle()); - // need to revalidate real position - positionChanged(true, getLocationOnScreenImpl(0, 0)); // incl. validation } } catch (Exception ie) { ie.printStackTrace(); @@ -343,25 +363,6 @@ public class MacWindow extends WindowImpl implements SurfaceChangeable, DriverCl return absPos; } - private Point position2TopLevel(Point clientPos) { - if(0<=clientPos.getX() && 0<=clientPos.getY()) { - final InsetsImmutable _insets = getInsets(); // zero if undecorated - // client position -> top-level window position - clientPos.setX(clientPos.getX() - _insets.getLeftWidth()) ; - clientPos.setY(clientPos.getY() - _insets.getTopHeight()) ; - } - // min val is 0 - clientPos.setX(Math.max(clientPos.getX(), 0)); - clientPos.setY(Math.max(clientPos.getY(), 0)); - // On MacOSX the absolute position is required to position - // a window - even a child window! - final NativeWindow parent = getParent(); - if( null != parent && 0 != parent.getWindowHandle() ) { - clientPos.translate(parent.getLocationOnScreen(null)); - } - return clientPos; - } - protected static native boolean initIDs0(); private native long createWindow0(long parentWindowHandle, int x, int y, int w, int h, boolean opaque, boolean fullscreen, int windowStyle, |