aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog19
-rw-r--r--libjava/gnu/java/awt/EmbeddedWindow.java45
-rw-r--r--libjava/gnu/java/awt/peer/EmbeddedWindowPeer.java1
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java18
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c24
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c18
6 files changed, 108 insertions, 17 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index a86cbb7..f19dd30 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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.
diff --git a/libjava/gnu/java/awt/EmbeddedWindow.java b/libjava/gnu/java/awt/EmbeddedWindow.java
index fc64e21..24bd107 100644
--- a/libjava/gnu/java/awt/EmbeddedWindow.java
+++ b/libjava/gnu/java/awt/EmbeddedWindow.java
@@ -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;
}
}
diff --git a/libjava/gnu/java/awt/peer/EmbeddedWindowPeer.java b/libjava/gnu/java/awt/peer/EmbeddedWindowPeer.java
index a178768..95a56d1 100644
--- a/libjava/gnu/java/awt/peer/EmbeddedWindowPeer.java
+++ b/libjava/gnu/java/awt/peer/EmbeddedWindowPeer.java
@@ -43,4 +43,5 @@ import java.awt.peer.FramePeer;
public interface EmbeddedWindowPeer extends FramePeer
{
+ void embed (long handle);
}
diff --git a/libjava/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java
index b9cdb66..9ee41c9 100644
--- a/libjava/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java
+++ b/libjava/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java
@@ -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)
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
index bf4035d..c98473f 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c
@@ -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 ();
+}
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
index aa9fd17b..e8b8702 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
@@ -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,