diff options
author | Sven Gothel <[email protected]> | 2009-09-12 15:16:59 -0700 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2009-09-12 15:16:59 -0700 |
commit | 4fe426caf55889d17b387efa06551c1af8f0dabe (patch) | |
tree | ccd41a542053de870339485b902d180d4029ebb0 /src/newt/classes/com/sun | |
parent | 3cc7335e94df9daaab5250487b9f03e19aaa292a (diff) |
NEWT: Native window parenting (X11: OK); AWTWindow external Frame OK
Diffstat (limited to 'src/newt/classes/com/sun')
4 files changed, 73 insertions, 16 deletions
diff --git a/src/newt/classes/com/sun/javafx/newt/NewtFactory.java b/src/newt/classes/com/sun/javafx/newt/NewtFactory.java index 8665aff6f..2f719110d 100755 --- a/src/newt/classes/com/sun/javafx/newt/NewtFactory.java +++ b/src/newt/classes/com/sun/javafx/newt/NewtFactory.java @@ -80,26 +80,43 @@ public abstract class NewtFactory { * Create a Window entity, incl native creation */ public static Window createWindow(Screen screen, Capabilities caps) { - return Window.create(0, NativeWindowFactory.getNativeWindowType(true), screen, caps, false); + return Window.create(NativeWindowFactory.getNativeWindowType(true), 0, screen, caps, false); } public static Window createWindow(Screen screen, Capabilities caps, boolean undecorated) { - return Window.create(0, NativeWindowFactory.getNativeWindowType(true), screen, caps, undecorated); + return Window.create(NativeWindowFactory.getNativeWindowType(true), 0, screen, caps, undecorated); } public static Window createWindow(long parentWindowHandle, Screen screen, Capabilities caps, boolean undecorated) { - return Window.create(parentWindowHandle, NativeWindowFactory.getNativeWindowType(true), screen, caps, undecorated); + return Window.create(NativeWindowFactory.getNativeWindowType(true), parentWindowHandle, screen, caps, undecorated); + } + + /** + * Ability to try a Window type with a construnctor argument, if supported ..<p> + * Currently only valid is <code> AWTWindow(Frame frame) </code>, + * to support an external created AWT Frame, ie the browsers embedded frame. + */ + public static Window createWindow(Object[] cstrArguments, Screen screen, Capabilities caps, boolean undecorated) { + return Window.create(NativeWindowFactory.getNativeWindowType(true), cstrArguments, screen, caps, undecorated); } /** * Create a Window entity using the given implementation type, incl native creation */ public static Window createWindow(String type, Screen screen, Capabilities caps) { - return Window.create(0, type, screen, caps, false); + return Window.create(type, 0, screen, caps, false); + } + + public static Window createWindow(String type, Screen screen, Capabilities caps, boolean undecorated) { + return Window.create(type, 0, screen, caps, undecorated); + } + + public static Window createWindow(String type, long parentWindowHandle, Screen screen, Capabilities caps, boolean undecorated) { + return Window.create(type, parentWindowHandle, screen, caps, undecorated); } - public static Window createWindow(long parentWindowHandle, String type, Screen screen, Capabilities caps, boolean undecorated) { - return Window.create(parentWindowHandle, type, screen, caps, undecorated); + public static Window createWindow(String type, Object[] cstrArguments, Screen screen, Capabilities caps, boolean undecorated) { + return Window.create(type, cstrArguments, screen, caps, undecorated); } /** diff --git a/src/newt/classes/com/sun/javafx/newt/Window.java b/src/newt/classes/com/sun/javafx/newt/Window.java index 3321715c3..918e54e1f 100755 --- a/src/newt/classes/com/sun/javafx/newt/Window.java +++ b/src/newt/classes/com/sun/javafx/newt/Window.java @@ -34,7 +34,9 @@ package com.sun.javafx.newt; import com.sun.javafx.newt.impl.Debug; + import javax.media.nativewindow.*; +import com.sun.nativewindow.impl.NWReflection; import java.util.ArrayList; import java.util.Iterator; @@ -82,7 +84,7 @@ public abstract class Window implements NativeWindow return windowClass; } - protected static Window create(long parentWindowHandle, String type, Screen screen, Capabilities caps, boolean undecorated) { + protected static Window create(String type, long parentWindowHandle, Screen screen, Capabilities caps, boolean undecorated) { try { Class windowClass = getWindowClass(type); Window window = (Window) windowClass.newInstance(); @@ -97,6 +99,21 @@ public abstract class Window implements NativeWindow } } + protected static Window create(String type, Object[] cstrArguments, Screen screen, Capabilities caps, boolean undecorated) { + try { + Class windowClass = getWindowClass(type); + Window window = (Window) NWReflection.createInstance( windowClass, cstrArguments ) ; + window.invalidate(); + window.screen = screen; + window.setUndecorated(undecorated); + window.createNative(0, caps); + return window; + } catch (Throwable t) { + t.printStackTrace(); + throw new NativeWindowException(t); + } + } + protected static Window wrapHandle(String type, Screen screen, AbstractGraphicsConfiguration config, long windowHandle, boolean fullscreen, boolean visible, int x, int y, int width, int height) @@ -146,6 +163,8 @@ public abstract class Window implements NativeWindow ", surfaceHandle 0x"+Long.toHexString(getSurfaceHandle())+ ", pos "+getX()+"/"+getY()+", size "+getWidth()+"x"+getHeight()+ ", visible "+isVisible()+ + ", undecorated "+undecorated+ + ", fullscreen "+fullscreen+ ", "+screen+ ", wrappedWindow "+getWrappedWindow()); diff --git a/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java b/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java index 1682181f5..c7f4d5e5d 100644 --- a/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java +++ b/src/newt/classes/com/sun/javafx/newt/awt/AWTWindow.java @@ -58,11 +58,17 @@ import javax.media.nativewindow.awt.*; public class AWTWindow extends Window { public AWTWindow() { + this(null); + } + + public AWTWindow(Frame frame) { super(); title = "AWT NewtWindow"; + this.frame = frame; } - private Frame frame; + private boolean owningFrame; + private Frame frame = null; private AWTCanvas canvas; // non fullscreen dimensions .. private int nfs_width, nfs_height, nfs_x, nfs_y; @@ -80,12 +86,21 @@ public class AWTWindow extends Window { protected void createNative(long parentWindowHandle, final Capabilities caps) { + if(0!=parentWindowHandle) { + throw new RuntimeException("Window parenting not supported in AWT, use AWTWindow(Frame) cstr for wrapping instead"); + } + final AWTWindow awtWindow = this; runOnEDT(true, new Runnable() { public void run() { - frame = new Frame(getTitle()); - frame.setUndecorated(isUndecorated()); + if(null==frame) { + frame = new Frame(); + owningFrame=true; + } else { + owningFrame=false; + } + frame.setTitle(getTitle()); frame.setLayout(new BorderLayout()); canvas = new AWTCanvas(caps); Listener listener = new Listener(awtWindow); @@ -96,6 +111,7 @@ public class AWTWindow extends Window { frame.add(canvas, BorderLayout.CENTER); frame.setSize(width, height); frame.setLocation(x, y); + frame.setUndecorated(undecorated||fullscreen); frame.addComponentListener(new MoveListener(awtWindow)); frame.addWindowListener(new WindowEventListener(awtWindow)); } @@ -105,7 +121,10 @@ public class AWTWindow extends Window { protected void closeNative() { runOnEDT(true, new Runnable() { public void run() { - frame.dispose(); + if(owningFrame) { + frame.dispose(); + owningFrame=false; + } frame = null; } }); @@ -217,7 +236,7 @@ public class AWTWindow extends Window { runOnEDT(false, new Runnable() { public void run() { if(!frame.isDisplayable()) { - frame.setUndecorated(fullscreen); + frame.setUndecorated(undecorated||fullscreen); } else { if(DEBUG_IMPLEMENTATION || DEBUG_WINDOW_EVENT) { System.err.println("AWTWindow can't undecorate already created frame"); diff --git a/src/newt/classes/com/sun/javafx/newt/x11/X11Window.java b/src/newt/classes/com/sun/javafx/newt/x11/X11Window.java index 3d6104789..aaea78589 100755 --- a/src/newt/classes/com/sun/javafx/newt/x11/X11Window.java +++ b/src/newt/classes/com/sun/javafx/newt/x11/X11Window.java @@ -65,6 +65,7 @@ public class X11Window extends Window { if (w == 0 || w!=windowHandle) { throw new NativeWindowException("Error creating window: "+w); } + this.parentWindowHandle = parentWindowHandle; windowHandleClose = windowHandle; displayHandleClose = display.getHandle(); } @@ -102,7 +103,7 @@ public class X11Window extends Window { nfs_width=width; nfs_height=height; } - setSize0(getDisplayHandle(), getScreenIndex(), windowHandle, x, y, width, height, 0, visible); + setSize0(parentWindowHandle, getDisplayHandle(), getScreenIndex(), windowHandle, x, y, width, height, (undecorated||fullscreen)?-1:1, false); } public void setPosition(int x, int y) { @@ -131,7 +132,7 @@ public class X11Window extends Window { if(DEBUG_IMPLEMENTATION || DEBUG_WINDOW_EVENT) { System.err.println("X11Window fs: "+fullscreen+" "+x+"/"+y+" "+w+"x"+h); } - setSize0(getDisplayHandle(), getScreenIndex(), windowHandle, x, y, w, h, fullscreen?-1:1, visible); + setSize0(parentWindowHandle, getDisplayHandle(), getScreenIndex(), windowHandle, x, y, w, h, (undecorated||fullscreen)?-1:1, false); } return fullscreen; } @@ -145,8 +146,8 @@ public class X11Window extends Window { long visualID, long javaObjectAtom, long windowDeleteAtom, int x, int y, int width, int height); private native void CloseWindow(long display, long windowHandle, long javaObjectAtom); private native void setVisible0(long display, long windowHandle, boolean visible); - private native void setSize0(long display, int screen_index, long windowHandle, - int x, int y, int width, int height, int decorationToggle, boolean isVisible); + private native void setSize0(long parentWindowHandle, long display, int screen_index, long windowHandle, + int x, int y, int width, int height, int decorationToggle, boolean setVisible); private native void setPosition0(long display, long windowHandle, int x, int y); private void sizeChanged(int newWidth, int newHeight) { @@ -175,4 +176,5 @@ public class X11Window extends Window { private long windowHandleClose; private long displayHandleClose; + private long parentWindowHandle; } |