diff options
author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2005-02-22 06:13:04 +0000 |
---|---|---|
committer | Thomas Fitzsimmons <fitzsim@gcc.gnu.org> | 2005-02-22 06:13:04 +0000 |
commit | d5c9fbd953debfa9265a1b03dec02aad2c013e14 (patch) | |
tree | d3aea0a3bc302b097583adb38c7236d17b0d81bc /libjava | |
parent | cb635293c7defc3babab65388569f909452808da (diff) | |
download | gcc-d5c9fbd953debfa9265a1b03dec02aad2c013e14.zip gcc-d5c9fbd953debfa9265a1b03dec02aad2c013e14.tar.gz gcc-d5c9fbd953debfa9265a1b03dec02aad2c013e14.tar.bz2 |
re PR awt/17952 (Windows don't show with window manager that supports _NET_REQUEST_FRAME_EXTENTS)
2005-02-22 Thomas Fitzsimmons <fitzsim@redhat.com>
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
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 20 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java | 27 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c | 11 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c | 92 | ||||
-rw-r--r-- | libjava/jni/gtk-peer/gtkpeer.h | 4 |
5 files changed, 88 insertions, 66 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 3ecbf8f..904e5b8 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,23 @@ +2005-02-22 Thomas Fitzsimmons <fitzsim@redhat.com> + + 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 <fitzsim@redhat.com> PR libgcj/19842 diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 353bc94..eabe591 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 81857c4..8cb9e2f 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 2ca7f83..b0177c9 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); } @@ -278,6 +247,9 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals 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); gdk_threads_leave (); @@ -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 9b04bb1..02613c4 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; |