This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]