diff options
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 19 | ||||
-rw-r--r-- | libjava/gnu/java/awt/EmbeddedWindow.java | 45 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/EmbeddedWindowPeer.java | 1 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkEmbeddedWindowPeer.java | 18 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c | 24 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c | 18 |
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, |