This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: GtkComponentPeer preferredSize fixes
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Mon, 29 Dec 2003 16:19:21 -0500
- Subject: Patch: GtkComponentPeer preferredSize fixes
Hello,
This patch changes GtkComponentPeer's minimumSize and preferredSize
methods to return the GTK peer widget's "natural" size request.
Previously a peer would return its current size as its preferred size,
which is wrong.
OK to commit?
Tom
2003-12-29 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkComponentPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(getPreferredSize): Call preferredSize.
(preferredSize): Call gtkWidgetGetPreferredDimensions.
(getMinimumSize): Call minimumSize.
(minimumSize): Call gtkWidgetGetPreferredDimensions.
(gtkWidgetGetDimensions): Return the peer widget's current size
request.
(gtkWidgetGetPreferredDimensions): Return the peer widget's
natural size request.
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.10
diff -u -r1.10 GtkComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java 11 Dec 2003 13:50:50 -0000 1.10
+++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 29 Dec 2003 21:14:47 -0000
@@ -83,8 +83,9 @@
native int[] gtkWidgetGetForeground ();
native int[] gtkWidgetGetBackground ();
native void gtkWidgetSetVisible (boolean b);
- native void gtkWidgetGetDimensions(int[] dim);
- native void gtkWidgetGetLocationOnScreen(int[] point);
+ native void gtkWidgetGetDimensions (int[] dim);
+ native void gtkWidgetGetPreferredDimensions (int[] dim);
+ native void gtkWidgetGetLocationOnScreen (int[] point);
native void gtkWidgetSetCursor (int type);
native void gtkWidgetSetBackground (int red, int green, int blue);
native void gtkWidgetSetForeground (int red, int green, int blue);
@@ -186,18 +187,12 @@
public Dimension getMinimumSize ()
{
- int dim[]=new int[2];
- gtkWidgetGetDimensions (dim);
- Dimension d = new Dimension (dim[0],dim[1]);
- return (d);
+ return minimumSize ();
}
public Dimension getPreferredSize ()
{
- int dim[]=new int[2];
- gtkWidgetGetDimensions (dim);
- Dimension d = new Dimension (dim[0],dim[1]);
- return (d);
+ return preferredSize ();
}
public Toolkit getToolkit ()
@@ -216,7 +211,11 @@
public Dimension minimumSize ()
{
- return getMinimumSize();
+ int dim[] = new int[2];
+
+ gtkWidgetGetPreferredDimensions (dim);
+
+ return new Dimension (dim[0], dim[1]);
}
public void paint (Graphics g)
@@ -224,9 +223,13 @@
awtComponent.paint (g);
}
- public Dimension preferredSize()
+ public Dimension preferredSize ()
{
- return getPreferredSize();
+ int dim[] = new int[2];
+
+ gtkWidgetGetPreferredDimensions (dim);
+
+ return new Dimension (dim[0], dim[1]);
}
public boolean prepareImage (Image image, int width, int height,
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.11
diff -u -r1.11 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 13 Dec 2003 01:15:47 -0000 1.11
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 29 Dec 2003 21:14:47 -0000
@@ -169,29 +169,69 @@
}
/*
- * Find the preferred size of a widget.
+ * Find this widget's current size.
*/
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetDimensions
- (JNIEnv *env, jobject obj, jintArray jdims)
+ (JNIEnv *env, jobject obj, jintArray jdims)
{
- void *ptr;
- jint *dims;
- GtkRequisition req;
+ void *ptr;
+ jint *dims;
+ GtkRequisition requisition;
- ptr = NSA_GET_PTR (env, obj);
- dims = (*env)->GetIntArrayElements (env, jdims, 0);
+ ptr = NSA_GET_PTR (env, obj);
- gdk_threads_enter ();
+ dims = (*env)->GetIntArrayElements (env, jdims, 0);
+ dims[0] = dims[1] = 0;
- gtk_signal_emit_by_name (GTK_OBJECT (ptr), "size_request", &req);
+ gdk_threads_enter ();
- dims[0] = req.width;
- dims[1] = req.height;
+ gtk_widget_size_request (GTK_WIDGET (ptr), &requisition);
- gdk_threads_leave ();
+ dims[0] = requisition.width;
+ dims[1] = requisition.height;
- (*env)->ReleaseIntArrayElements(env, jdims, dims, 0);
+ gdk_threads_leave ();
+
+ (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
+}
+
+/*
+ * Find this widget's preferred size.
+ */
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions
+ (JNIEnv *env, jobject obj, jintArray jdims)
+{
+ void *ptr;
+ jint *dims;
+ GtkRequisition current_req;
+ GtkRequisition natural_req;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ dims = (*env)->GetIntArrayElements (env, jdims, 0);
+ dims[0] = dims[1] = 0;
+
+ gdk_threads_enter ();
+
+ /* Save the widget's current size request. */
+ gtk_widget_size_request (GTK_WIDGET (ptr), ¤t_req);
+
+ /* Get the widget's "natural" size request. */
+ gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1);
+ gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req);
+
+ /* Reset the widget's size request. */
+ gtk_widget_set_size_request (GTK_WIDGET (ptr),
+ current_req.width, current_req.height);
+
+ dims[0] = natural_req.width;
+ dims[1] = natural_req.height;
+
+ gdk_threads_leave ();
+
+ (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
}
JNIEXPORT void JNICALL