From d5c9fbd953debfa9265a1b03dec02aad2c013e14 Mon Sep 17 00:00:00 2001 From: Thomas Fitzsimmons Date: Tue, 22 Feb 2005 06:13:04 +0000 Subject: [PATCH] re PR awt/17952 (Windows don't show with window manager that supports _NET_REQUEST_FRAME_EXTENTS) 2005-02-22 Thomas Fitzsimmons PR libgcj/17952: * gnu/java/awt/peer/gtk/GtkWindowPeer.java, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (getWidth): New method. (getHeight): Likewise. (create): Remove width, height and insets parameters. Move size setup ... (realize_cb): ... here. New function. (connectSignals): Connect realize_cb. (request_frame_extents): Remove FIXME. Move postInsetsChangedEvent lookup ... * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (gtkInit): ... here. Look up GtkWindowPeer getWidth and getHeight methods. * jni/gtk-peer/gtkpeer.h (postInsetsChangedEventID): Declare jmethodID. (windowGetWidthID): Likewise. (windowGetHeightID): Likewise. From-SVN: r95383 --- libjava/ChangeLog | 20 ++++ .../gnu/java/awt/peer/gtk/GtkWindowPeer.java | 27 +++--- .../gnu_java_awt_peer_gtk_GtkToolkit.c | 11 +++ .../gnu_java_awt_peer_gtk_GtkWindowPeer.c | 92 +++++++++---------- libjava/jni/gtk-peer/gtkpeer.h | 4 + 5 files changed, 88 insertions(+), 66 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 3ecbf8f3d7a..904e5b828ab 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,23 @@ +2005-02-22 Thomas Fitzsimmons + + PR libgcj/17952: + * gnu/java/awt/peer/gtk/GtkWindowPeer.java, + jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c + (getWidth): New method. + (getHeight): Likewise. + (create): Remove width, height and insets parameters. Move size + setup ... + (realize_cb): ... here. New function. + (connectSignals): Connect realize_cb. + (request_frame_extents): Remove FIXME. Move + postInsetsChangedEvent lookup ... + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (gtkInit): + ... here. Look up GtkWindowPeer getWidth and getHeight methods. + * jni/gtk-peer/gtkpeer.h (postInsetsChangedEventID): Declare + jmethodID. + (windowGetWidthID): Likewise. + (windowGetHeightID): Likewise. + 2005-02-21 Thomas Fitzsimmons PR libgcj/19842 diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 353bc94aee6..eabe59140a6 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -63,30 +63,27 @@ public class GtkWindowPeer extends GtkContainerPeer native void gtkWindowSetResizable (boolean resizable); native void gtkWindowSetModal (boolean modal); - native void create (int type, boolean decorated, - int width, int height, - GtkWindowPeer parent, - int[] insets); + int getWidth () + { + return awtComponent.getWidth(); + } + + int getHeight () + { + return awtComponent.getHeight(); + } + + native void create (int type, boolean decorated, GtkWindowPeer parent); void create (int type, boolean decorated) { GtkWindowPeer parent_peer = null; Component parent = awtComponent.getParent(); - int[] insets = new int [] { 0, 0, 0, 0 }; if (parent != null) parent_peer = (GtkWindowPeer) awtComponent.getParent().getPeer(); - create (type, decorated, - awtComponent.getWidth(), - awtComponent.getHeight(), - parent_peer, - insets); - - this.insets.top = insets [0]; - this.insets.left = insets [1]; - this.insets.bottom = insets [2]; - this.insets.right = insets [3]; + create (type, decorated, parent_peer); } void create () diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c index 81857c42b1b..8cb9e2f5d68 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c @@ -62,6 +62,9 @@ jmethodID choicePostItemEventID; jmethodID postListItemEventID; jmethodID postTextEventID; jmethodID postWindowEventID; +jmethodID postInsetsChangedEventID; +jmethodID windowGetWidthID; +jmethodID windowGetHeightID; jmethodID beginNativeRepaintID; jmethodID endNativeRepaintID; @@ -212,6 +215,14 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit (JNIEnv *env, postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer, "postWindowEvent", "(ILjava/awt/Window;I)V"); + postInsetsChangedEventID = (*env)->GetMethodID (env, gtkwindowpeer, + "postInsetsChangedEvent", + "(IIII)V"); + windowGetWidthID = (*env)->GetMethodID (env, gtkwindowpeer, + "getWidth", "()I"); + windowGetHeightID = (*env)->GetMethodID (env, gtkwindowpeer, + "getHeight", "()I"); + postExposeEventID = (*env)->GetMethodID (env, gtkcomponentpeer, "postExposeEvent", "(IIII)V"); postKeyEventID = (*env)->GetMethodID (env, gtkcomponentpeer, diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index 2ca7f83988c..b0177c90a47 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -80,6 +80,7 @@ static jint window_get_new_state (GtkWidget *widget); static gboolean window_property_changed_cb (GtkWidget *widget, GdkEventProperty *event, jobject peer); +static void realize_cb (GtkWidget *widget, jobject peer); /* Union used for type punning. */ union extents_union @@ -94,23 +95,14 @@ union atom_list_union Atom **atom_list; }; -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create - (JNIEnv *env, jobject obj, jint type, jboolean decorated, - jint width, jint height, jobject parent, jintArray jinsets) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create + (JNIEnv *env, jobject obj, jint type, jboolean decorated, jobject parent) { GtkWidget *window_widget; GtkWindow *window; void *window_parent; GtkWidget *fixed; - int top = 0; - int left = 0; - int bottom = 0; - int right = 0; - jint *insets; - - insets = (*env)->GetIntArrayElements (env, jinsets, 0); - insets[0] = insets[1] = insets[2] = insets[3] = 0; NSA_SET_GLOBAL_REF (env, obj); @@ -137,31 +129,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create gtk_widget_show (fixed); - if (decorated) - window_get_frame_extents (window_widget, &top, &left, &bottom, &right); - - gtk_window_set_default_size (window, - MAX (1, width - left - right), - MAX (1, height - top - bottom)); - - /* We must set this window's size requisition. Otherwise when a - resize is queued (when gtk_widget_queue_resize is called) the - window will snap to its default requisition of 0x0. If we omit - this call, Frames and Dialogs shrink to degenerate 1x1 windows - when their resizable property changes. */ - gtk_widget_set_size_request (window_widget, - MAX (1, width - left - right), - MAX (1, height - top - bottom)); - - insets[0] = top; - insets[1] = left; - insets[2] = bottom; - insets[3] = right; - gdk_threads_leave (); - (*env)->ReleaseIntArrayElements (env, jinsets, insets, 0); - NSA_SET_PTR (env, obj, window_widget); } @@ -277,6 +246,9 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals g_signal_connect (G_OBJECT (ptr), "property-notify-event", G_CALLBACK (window_property_changed_cb), *gref); + g_signal_connect_after (G_OBJECT (ptr), "realize", + G_CALLBACK (realize_cb), *gref); + g_signal_connect_after (G_OBJECT (ptr), "realize", G_CALLBACK (connect_awt_hook_cb), *gref); @@ -428,9 +400,7 @@ request_frame_extents (GtkWidget *window) /* Check if the current window manager supports _NET_REQUEST_FRAME_EXTENTS. */ - /* FIXME: The window->window != NULL check is a workaround for bug - http://bugzilla.gnome.org/show_bug.cgi?id=17952. */ - if (gdk_net_wm_supports (request_extents) && window->window != NULL) + if (gdk_net_wm_supports (request_extents)) { GdkDisplay *display = gtk_widget_get_display (window); Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); @@ -700,19 +670,6 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), unsigned long *extents; union extents_union gu_ex; - static int id_set = 0; - static jmethodID postInsetsChangedEventID; - - if (!id_set) - { - jclass gtkwindowpeer = (*gdk_env())->FindClass (gdk_env(), - "gnu/java/awt/peer/gtk/GtkWindowPeer"); - postInsetsChangedEventID = (*gdk_env())->GetMethodID (gdk_env(), - gtkwindowpeer, - "postInsetsChangedEvent", - "(IIII)V"); - id_set = 1; - } gu_ex.extents = &extents; if (gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE) == event->atom && gdk_property_get (event->window, @@ -739,3 +696,36 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), return FALSE; } + +static void +realize_cb (GtkWidget *widget, jobject peer) +{ + jint top = 0; + jint left = 0; + jint bottom = 0; + jint right = 0; + jint width = 0; + jint height = 0; + + width = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetWidthID); + height = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetHeightID); + + window_get_frame_extents (widget, &top, &left, &bottom, &right); + + (*gdk_env())->CallVoidMethod (gdk_env(), peer, + postInsetsChangedEventID, + top, left, bottom, right); + + gtk_window_set_default_size (GTK_WINDOW (widget), + MAX (1, width - left - right), + MAX (1, height - top - bottom)); + + /* set the size like we do in nativeSetBounds */ + gtk_widget_set_size_request (widget, + MAX (1, width - left - right), + MAX (1, height - top - bottom)); + + gtk_window_resize (GTK_WINDOW (widget), + MAX (1, width - left - right), + MAX (1, height - top - bottom)); +} diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index 9b04bb116ac..02613c4e3c2 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -465,6 +465,10 @@ extern jmethodID syncAttrsID; extern jclass gdkColor; extern jmethodID gdkColorID; +extern jmethodID postInsetsChangedEventID; +extern jmethodID windowGetWidthID; +extern jmethodID windowGetHeightID; + JNIEnv *gdk_env(void); extern double dpi_conversion_factor; -- 2.30.2