aboutsummaryrefslogtreecommitdiffstats
path: root/src/newt/classes/jogamp
diff options
context:
space:
mode:
authorSven Gothel <sgothel@jausoft.com>2011-11-27 17:40:45 +0100
committerSven Gothel <sgothel@jausoft.com>2011-11-27 17:40:45 +0100
commitd3df9b409a0b524497eadd92ccf749ac669b0825 (patch)
tree2340142350b016b170c79c19155cdb00283b2ad1 /src/newt/classes/jogamp
parent3602649d8e15d2272ac58e9d2abbf60e1e17ff0d (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/classes/jogamp')
-rw-r--r--src/newt/classes/jogamp/newt/awt/event/AWTParentWindowAdapter.java13
-rw-r--r--src/newt/classes/jogamp/newt/driver/macosx/MacWindow.java135
2 files changed, 78 insertions, 70 deletions
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,