2004-01-05 Thomas Fitzsimmons <fitzsim@redhat.com>
authorThomas Fitzsimmons <fitzsim@redhat.com>
Mon, 5 Jan 2004 21:41:21 +0000 (21:41 +0000)
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>
Mon, 5 Jan 2004 21:41:21 +0000 (21:41 +0000)
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
(pre_event_handler): Set all insets to 0 when a Configure event
is received for a GtkPlug.
* gnu/java/awt/EmbeddedWindow.java (window_id): Rename handle.
Make handle long, not int.
(EmbeddedWindow()): New constructor.
(EmbeddedWindow(int)): Rename window_id to handle.  Make handle
long, not int.
(setHandle): New method.
(getHandle): Return long, not int.
* gnu/java/awt/peer/EmbeddedWindowPeer.java (embed): New method
declaration.
* gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c:
(create(long)): Take long parameter, not int.  Cast gtk_plug_new
argument to GdkNativeWindow.
(construct): New method.
(embed): New method.

From-SVN: r75447

libjava/ChangeLog
libjava/gnu/java/awt/EmbeddedWindow.java
libjava/gnu/java/awt/peer/EmbeddedWindowPeer.java
libjava/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c

index a86cbb7..f19dd30 100644 (file)
@@ -1,5 +1,24 @@
 2004-01-05  Thomas Fitzsimmons  <fitzsim@redhat.com>
 
+       * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
+       (pre_event_handler): Set all insets to 0 when a Configure event
+       is received for a GtkPlug.
+       * gnu/java/awt/EmbeddedWindow.java (window_id): Rename handle.
+       Make handle long, not int.
+       (EmbeddedWindow()): New constructor.
+       (EmbeddedWindow(int)): Rename window_id to handle.  Make handle
+       long, not int.
+       (setHandle): New method.
+       (getHandle): Return long, not int.
+       * gnu/java/awt/peer/EmbeddedWindowPeer.java (embed): New method
+       declaration.
+       * gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java,
+       jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c:
+       (create(long)): Take long parameter, not int.  Cast gtk_plug_new
+       argument to GdkNativeWindow.
+       (construct): New method.
+       (embed): New method.
+
        * gnu/java/awt/peer/gtk/GtkScrollPanePeer.java,
        jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
        (create(int, int)): New method.
index fc64e21..24bd107 100644 (file)
@@ -50,18 +50,29 @@ import java.awt.Toolkit;
  */
 public class EmbeddedWindow extends Frame
 {
-  private int window_id;
+  private long handle;
   
   /**
-   * Creates an window to be embedded into another application.
+   * Creates a window to be embedded into another application.  The
+   * window will only be embedded after its setHandle method has been
+   * called.
+   */
+  public EmbeddedWindow ()
+  {
+    super();
+    this.handle = 0;
+  }
+  
+  /**
+   * Creates a 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 handle the native handle to the screen area where the AWT
+   * window should be embedded
    */
-  public EmbeddedWindow (int window_id)
+  public EmbeddedWindow (long handle)
   {
     super();
-    this.window_id = window_id;
+    this.handle = handle;
   }
   
   /**
@@ -84,13 +95,31 @@ public class EmbeddedWindow extends Frame
   native void setWindowPeer (EmbeddedWindowPeer peer);
 
   /**
+   * If the native peer for this embedded window has been created,
+   * then setHandle will embed the window.  If not, setHandle tells
+   * us where to embed ourselves when our peer is created.
+   *
+   * @param handle the native handle to the screen area where the AWT
+   * window should be embedded
+   */
+  public void setHandle(long handle)
+  {
+    if (this.handle != 0)
+      throw new RuntimeException ("EmbeddedWindow is already embedded");
+
+    this.handle = handle;
+    if (peer != null)
+      ((EmbeddedWindowPeer) peer).embed (this.handle);
+  }
+
+  /**
    * 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()
+  public long getHandle()
   {
-    return window_id;
+    return handle;
   }
 }
index a178768..95a56d1 100644 (file)
@@ -43,4 +43,5 @@ import java.awt.peer.FramePeer;
 
 public interface EmbeddedWindowPeer extends FramePeer
 {
+  void embed (long handle);
 }
index b9cdb66..9ee41c9 100644 (file)
@@ -45,11 +45,25 @@ import gnu.java.awt.peer.EmbeddedWindowPeer;
 public class GtkEmbeddedWindowPeer extends GtkFramePeer
   implements EmbeddedWindowPeer
 {
-  native void create(int window_id);
+  native void create (long socket_id);
 
   void create ()
   {
-    create (((EmbeddedWindow) awtComponent).getHandle());
+    create (((EmbeddedWindow) awtComponent).getHandle ());
+  }
+
+  native void construct (long socket_id);
+
+  // FIXME: embed doesn't work right now, though I believe it should.
+  // This means that you can't call setVisible (true) on an
+  // EmbeddedWindow before calling setHandle with a valid handle.  The
+  // problem is that somewhere after the call to
+  // GtkEmbeddedWindow.create and before the call to
+  // GtkEmbeddedWindow.construct, the GtkPlug peer is being realized.
+  // GtkSocket silently fails to embed an already-realized GtkPlug.
+  public void embed (long handle)
+  {
+    construct (handle);
   }
 
   public GtkEmbeddedWindowPeer (EmbeddedWindow w)
index bf4035d..c98473f 100644 (file)
@@ -42,7 +42,7 @@ exception statement from your version. */
 
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create
-  (JNIEnv *env, jobject obj, jint window_id)
+  (JNIEnv *env, jobject obj, jlong socket_id)
 {
   GtkWidget *window;
   GtkWidget *vbox, *layout;
@@ -51,8 +51,8 @@ Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create
   NSA_SET_GLOBAL_REF (env, obj);
 
   gdk_threads_enter ();
-  
-  window = gtk_plug_new (window_id);
+
+  window = gtk_plug_new ((GdkNativeWindow) socket_id);
 
   vbox = gtk_vbox_new (0, 0);
   layout = gtk_layout_new (NULL, NULL);
@@ -66,3 +66,21 @@ Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create
 
   NSA_SET_PTR (env, obj, window);
 }
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_construct
+  (JNIEnv *env, jobject obj, jlong socket_id)
+{
+  void *ptr;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  gdk_threads_enter ();
+
+  if (GTK_WIDGET_REALIZED (GTK_WIDGET (ptr)))
+    g_printerr ("ERROR: GtkPlug is already realized\n");
+
+  gtk_plug_construct (GTK_PLUG (ptr), (GdkNativeWindow) socket_id);
+
+  gdk_threads_leave ();
+}
index aa9fd17..e8b8702 100644 (file)
@@ -998,10 +998,20 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer)
            gdk_threads_leave ();
 
            /* FIXME: hard-code these values for now. */
-           top = 20;
-           left = 6;
-           bottom = 6;
-           right = 6;
+           if (GTK_IS_PLUG (widget))
+             {
+               top = 0;
+               left = 0;
+               bottom = 0;
+               right = 0;
+             }
+           else
+             {
+               top = 20;
+               left = 6;
+               bottom = 6;
+               right = 6;
+             }
 
            (*gdk_env)->CallVoidMethod (gdk_env, peer,
                                        postConfigureEventID,