This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: Embedding windows into native apps
- From: Michael Koch <konqueror at gmx dot de>
- To: java-patches at gcc dot gnu dot org
- Date: Wed, 23 Jul 2003 23:31:47 +0200
- Subject: Patch: Embedding windows into native apps
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi list,
Thomas Fitzsimmons (with some bad touch from me) wrote a really nice
patch to support embedding AWT windows into native apps. Currently
only the GTK peer supports this feature. The patch is attached.
Okay for trunk ?
Many thanks again to Thomas. He makes my plugin living ...
Michael
- --
Homepage: http://www.worldforge.org/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE/Hv7DWSOgCCdjSDsRAnmZAKCTdeJF7XKgjo25ZQQWfoT5iSE4uACfU6D1
bTA/yPVnJhao/+fffPYtegs=
=+dl8
-----END PGP SIGNATURE-----
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2049
diff -u -b -B -r1.2049 ChangeLog
--- ChangeLog 23 Jul 2003 15:31:42 -0000 1.2049
+++ ChangeLog 23 Jul 2003 21:21:57 -0000
@@ -1,3 +1,36 @@
+2003-07-23 Michael Koch <konqueror@gmx.de>
+
+ * gnu/java/awt/EmbeddedWindow.java
+ (EmbeddedWindow): Extends Frame instead of Window.
+ (window_id): New member variable to store the native window handle.
+ (create): Removed.
+ (EmbeddedWindow): New constructor.
+ (addNotify): New method.
+ (getHandler): Likewise.
+ (setWindowPeer): New native method.
+ * gnu/java/awt/EmbeddedWindowSupport.java
+ (EmbeddedWindowSupport): Fixed documentation.
+ (createEmbeddedWindow): Return EmbeddedWindowPeer instead of
+ WindowPeer, give it an EmbeddedWindow instance instead of the raw
+ window data.
+ * gnu/java/awt/natEmbeddedWindow.cc
+ (create): Removed.
+ (setWindowPeer): New method.
+ * gnu/java/awt/peer/EmbeddedWindowPeer.java,
+ gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java,
+ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c:
+ New files
+ * gnu/java/awt/peer/gtk/GtkToolkit.java
+ (GtkToolkit): Implements EmbeddedWindowSupport.
+ (createEmbeddedWindow): New method.
+ * java/awt/Window.java
+ (Window): Removed.
+ * Makefile.am
+ (java_source_files): Added EmbeddedWindowPeer.java.
+ (gtk_awt_peer_sources): Added GtkEmbeddedWindowPeer.java.
+ (gtk_c_source_files): Added gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c.
+ * Makefile.in: Regenerated.
+
2003-07-23 Tom Tromey <tromey@redhat.com>
* java/lang/natSystem.cc (arraycopy): Check for overflow.
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.308
diff -u -b -B -r1.308 Makefile.am
--- Makefile.am 13 Jul 2003 16:53:04 -0000 1.308
+++ Makefile.am 23 Jul 2003 21:21:57 -0000
@@ -165,6 +165,7 @@
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c \
+jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c \
@@ -205,6 +206,7 @@
gnu/java/awt/peer/gtk/GtkComponentPeer.java \
gnu/java/awt/peer/gtk/GtkContainerPeer.java \
gnu/java/awt/peer/gtk/GtkDialogPeer.java \
+gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java \
gnu/java/awt/peer/gtk/GtkFileDialogPeer.java \
gnu/java/awt/peer/gtk/GtkFontPeer.java \
gnu/java/awt/peer/gtk/GtkFramePeer.java \
@@ -757,6 +759,7 @@
gnu/java/awt/GLightweightPeer.java \
gnu/java/awt/image/ImageDecoder.java \
gnu/java/awt/image/XBMDecoder.java \
+gnu/java/awt/peer/EmbeddedWindowPeer.java \
gnu/java/beans/editors/ColorEditor.java \
gnu/java/beans/editors/FontEditor.java \
gnu/java/beans/editors/NativeBooleanEditor.java \
Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.in,v
retrieving revision 1.333
diff -u -b -B -r1.333 Makefile.in
--- Makefile.in 13 Jul 2003 16:53:04 -0000 1.333
+++ Makefile.in 23 Jul 2003 21:22:03 -0000
@@ -254,6 +254,7 @@
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c \
+jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c \
@@ -294,6 +295,7 @@
gnu/java/awt/peer/gtk/GtkComponentPeer.java \
gnu/java/awt/peer/gtk/GtkContainerPeer.java \
gnu/java/awt/peer/gtk/GtkDialogPeer.java \
+gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java \
gnu/java/awt/peer/gtk/GtkFileDialogPeer.java \
gnu/java/awt/peer/gtk/GtkFontPeer.java \
gnu/java/awt/peer/gtk/GtkFramePeer.java \
@@ -528,6 +530,7 @@
gnu/java/awt/GLightweightPeer.java \
gnu/java/awt/image/ImageDecoder.java \
gnu/java/awt/image/XBMDecoder.java \
+gnu/java/awt/peer/EmbeddedWindowPeer.java \
gnu/java/beans/editors/ColorEditor.java \
gnu/java/beans/editors/FontEditor.java \
gnu/java/beans/editors/NativeBooleanEditor.java \
@@ -2589,6 +2592,7 @@
gnu/java/awt/peer/gtk/GtkComponentPeer.lo \
gnu/java/awt/peer/gtk/GtkContainerPeer.lo \
gnu/java/awt/peer/gtk/GtkDialogPeer.lo \
+gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.lo \
gnu/java/awt/peer/gtk/GtkFileDialogPeer.lo \
gnu/java/awt/peer/gtk/GtkFontPeer.lo \
gnu/java/awt/peer/gtk/GtkFramePeer.lo \
@@ -2621,6 +2625,7 @@
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.lo \
+jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.lo \
@@ -2783,6 +2788,7 @@
.deps/gnu/java/awt/image/ImageDecoder.P \
.deps/gnu/java/awt/image/XBMDecoder.P \
.deps/gnu/java/awt/natEmbeddedWindow.P \
+.deps/gnu/java/awt/peer/EmbeddedWindowPeer.P \
.deps/gnu/java/awt/peer/gtk/GdkFontMetrics.P \
.deps/gnu/java/awt/peer/gtk/GdkGraphics.P \
.deps/gnu/java/awt/peer/gtk/GtkArg.P \
@@ -2797,6 +2803,7 @@
.deps/gnu/java/awt/peer/gtk/GtkComponentPeer.P \
.deps/gnu/java/awt/peer/gtk/GtkContainerPeer.P \
.deps/gnu/java/awt/peer/gtk/GtkDialogPeer.P \
+.deps/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.P \
.deps/gnu/java/awt/peer/gtk/GtkFileDialogPeer.P \
.deps/gnu/java/awt/peer/gtk/GtkFontPeer.P \
.deps/gnu/java/awt/peer/gtk/GtkFramePeer.P \
@@ -4223,6 +4230,7 @@
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.P \
+.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.P \
Index: gnu/java/awt/EmbeddedWindow.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/EmbeddedWindow.java,v
retrieving revision 1.1
diff -u -b -B -r1.1 EmbeddedWindow.java
--- gnu/java/awt/EmbeddedWindow.java 13 Jul 2003 14:39:41 -0000 1.1
+++ gnu/java/awt/EmbeddedWindow.java 23 Jul 2003 21:22:03 -0000
@@ -38,25 +38,59 @@
package gnu.java.awt;
-import java.awt.Window;
+import gnu.java.awt.peer.EmbeddedWindowPeer;
+import java.awt.Frame;
+import java.awt.Toolkit;
/**
- * This class represents an AWT window embedded into another graphical
- * toolkit or anther application.
+ * Represents an AWT window that can be embedded into another
+ * application.
*
* @author Michael Koch <konqueror@gmx.de>
*/
-public class EmbeddedWindow extends Window
+public class EmbeddedWindow extends Frame
{
+ private int window_id;
+
/**
- * Creates an window embedded into another application of graphical toolkit.
+ * Creates an window to be embedded into another application.
*
* @param window_id The native handle to the screen area where the AWT window
* should be embedded.
- * @param width The width of the screen area.
- * @param height The height of the screen area.
*/
+ public EmbeddedWindow (int window_id)
+ {
+ super();
+ this.window_id = window_id;
+ }
+
+ /**
+ * Creates the native peer for this embedded window.
+ */
+ public void addNotify()
+ {
+ Toolkit tk = getToolkit();
+
+ if (! (tk instanceof EmbeddedWindowSupport))
+ throw new UnsupportedOperationException
+ ("Embedded windows are not supported by the current peers: " + tk.getClass());
+
+ setWindowPeer (((EmbeddedWindowSupport) tk).createEmbeddedWindow (this));
+ super.addNotify();
+ }
+
// This method is only made native to circumvent the package-privateness of
- // an internal java.awt.Window constructor.
- public static native Window create (int window_id, int width, int height);
+ // an AWT internal java.awt.Component.peer member variable.
+ native void setWindowPeer (EmbeddedWindowPeer peer);
+
+ /**
+ * Gets the native handle of the screen area where the window will
+ * be embedded.
+ *
+ * @return The native handle that was passed to the constructor.
+ */
+ public int getHandle()
+ {
+ return window_id;
+ }
}
Index: gnu/java/awt/EmbeddedWindowSupport.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/EmbeddedWindowSupport.java,v
retrieving revision 1.1
diff -u -b -B -r1.1 EmbeddedWindowSupport.java
--- gnu/java/awt/EmbeddedWindowSupport.java 13 Jul 2003 14:39:41 -0000 1.1
+++ gnu/java/awt/EmbeddedWindowSupport.java 23 Jul 2003 21:22:03 -0000
@@ -38,14 +38,15 @@
package gnu.java.awt;
-import java.awt.peer.WindowPeer;
+import gnu.java.awt.peer.EmbeddedWindowPeer;
/**
- * This interface defines a method for creating embedded windows.
+ * Declares a method for creating native embedded window peers.
*
- * All classes inherited from java.awt.Toolkit that implement this interface
- * are assumed to support embedded windows. To embed the real embedded window
- * you need to use gnu.java.awt.EmbeddedWindow.
+ * All classes inherited from java.awt.Toolkit that implement this
+ * interface are assumed to support the creation of embedded window
+ * peers. To create an embedded window, use
+ * gnu.java.awt.EmbeddedWindow.
*
* @see gnu.java.awt.EmbeddedWindow
* @see java.awt.Toolkit
@@ -55,13 +56,10 @@
public interface EmbeddedWindowSupport
{
/**
- * This method creates an embedded window in an application.
+ * Creates an embedded window peer, and associates it with an
+ * EmbeddedWindow object.
*
- * @param window_id The native handle of a screen area to display an
- * AWT window in it.
- * @param width The width of the screen area.
- * @param height The height of the screen area.
+ * @param w The embedded window with which to associate a peer.
*/
- public WindowPeer createEmbeddedWindow (int window_id,
- int width, int height);
+ public EmbeddedWindowPeer createEmbeddedWindow (EmbeddedWindow w);
}
Index: gnu/java/awt/natEmbeddedWindow.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/natEmbeddedWindow.cc,v
retrieving revision 1.1
diff -u -b -B -r1.1 natEmbeddedWindow.cc
--- gnu/java/awt/natEmbeddedWindow.cc 13 Jul 2003 14:39:41 -0000 1.1
+++ gnu/java/awt/natEmbeddedWindow.cc 23 Jul 2003 21:22:03 -0000
@@ -7,10 +7,11 @@
details. */
#include <gnu/java/awt/EmbeddedWindow.h>
-#include <java/awt/Window.h>
+#include <gnu/java/awt/peer/EmbeddedWindowPeer.h>
-::java::awt::Window*
-gnu::java::awt::EmbeddedWindow::create (jint window_id, jint width, jint height)
+void
+gnu::java::awt::EmbeddedWindow::setWindowPeer (gnu::java::awt::peer::EmbeddedWindowPeer* w)
{
- return new ::java::awt::Window (window_id, width, height);
+ if (!peer)
+ (::java::lang::Object*) peer = (::java::lang::Object*) w;
}
Index: gnu/java/awt/peer/gtk/GtkToolkit.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java,v
retrieving revision 1.2
diff -u -b -B -r1.2 GtkToolkit.java
--- gnu/java/awt/peer/gtk/GtkToolkit.java 17 Jul 2003 20:26:51 -0000 1.2
+++ gnu/java/awt/peer/gtk/GtkToolkit.java 23 Jul 2003 21:22:03 -0000
@@ -52,6 +52,9 @@
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
+import gnu.java.awt.EmbeddedWindow;
+import gnu.java.awt.EmbeddedWindowSupport;
+import gnu.java.awt.peer.EmbeddedWindowPeer;
import gnu.classpath.Configuration;
/* This class uses a deprecated method java.awt.peer.ComponentPeer.getPeer().
@@ -61,7 +64,8 @@
this class. If getPeer() ever goes away, we can implement a hash table
that will keep up with every window's peer, but for now this is faster. */
-public class GtkToolkit extends java.awt.Toolkit
+public class GtkToolkit extends Toolkit
+ implements EmbeddedWindowSupport
{
GtkMainThread main;
Hashtable containers = new Hashtable();
@@ -297,6 +301,11 @@
protected WindowPeer createWindow (Window w)
{
return new GtkWindowPeer (w);
+ }
+
+ public EmbeddedWindowPeer createEmbeddedWindow (EmbeddedWindow w)
+ {
+ return new GtkEmbeddedWindowPeer (w);
}
protected FontPeer getFontPeer (String name, int style)
Index: java/awt/Window.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Window.java,v
retrieving revision 1.26
diff -u -b -B -r1.26 Window.java
--- java/awt/Window.java 23 Jul 2003 09:53:34 -0000 1.26
+++ java/awt/Window.java 23 Jul 2003 21:22:03 -0000
@@ -94,19 +94,6 @@
graphicsConfiguration = gc;
}
- Window(int window_id, int width, int height)
- {
- this();
-
- Toolkit tk = getToolkit();
- if (!(tk instanceof EmbeddedWindowSupport))
- throw new UnsupportedOperationException
- ("Embedded windows not supported by the current peers: " + tk.getClass());
-
- peer = ((EmbeddedWindowSupport) getToolkit())
- .createEmbeddedWindow (window_id, width, height);
- }
-
/**
* Initializes a new instance of <code>Window</code> with the specified
* parent. The window will initially be invisible.