This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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), &current_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 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]