classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] GTK button and label peer preferred size fixes


From: Thomas Fitzsimmons
Subject: [cp-patches] GTK button and label peer preferred size fixes
Date: Fri, 12 Aug 2005 18:53:30 -0400

Hi,

This patch fixes GtkButtonPeer and GtkLabelPeer's preferred size
methods.  We were retrieving incorrect natural sizes for these widgets
causing wrong layouts.  I committed this to mainline.

Tom

2005-08-12  Thomas Fitzsimmons  <address@hidden>

        * gnu/java/awt/peer/gtk/GtkButtonPeer.java,
        native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
        (gtkWidgetGetPreferredDimensions): New method.
        * gnu/java/awt/peer/gtk/GtkLabelPeer.java,
        native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
        (gtkWidgetGetPreferredDimensions): New method.
        * include/gnu_java_awt_peer_gtk_GtkLabelPeer.h: Regenerate.
        * include/gnu_java_awt_peer_gtk_GtkButtonPeer.h: Likewise.

Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v
retrieving revision 1.37
diff -u -u -r1.37 GtkButtonPeer.java
--- gnu/java/awt/peer/gtk/GtkButtonPeer.java    2 Jul 2005 20:32:12 -0000       
1.37
+++ gnu/java/awt/peer/gtk/GtkButtonPeer.java    12 Aug 2005 22:47:21 -0000
@@ -46,6 +46,9 @@
 import java.awt.event.MouseEvent;
 import java.awt.peer.ButtonPeer;
 
+// A composite widget.  GtkButtons have transparent backgrounds.  An
+// AWT Button is opaque.  To compensate, a GtkButtonPeer is a
+// GtkButton packed in a GtkEventBox.
 public class GtkButtonPeer extends GtkComponentPeer
     implements ButtonPeer
 {
@@ -60,6 +63,11 @@
   native void gtkActivate ();
   native void gtkWidgetRequestFocus ();
   native void setNativeBounds (int x, int y, int width, int height);
+
+  // Because this is a composite widget, we need to retrieve the
+  // GtkButton's preferred dimensions, not the enclosing
+  // GtkEventBox's.
+  native void gtkWidgetGetPreferredDimensions (int[] dim);
 
   public GtkButtonPeer (Button b)
   {
Index: gnu/java/awt/peer/gtk/GtkLabelPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkLabelPeer.java,v
retrieving revision 1.23
diff -u -u -r1.23 GtkLabelPeer.java
--- gnu/java/awt/peer/gtk/GtkLabelPeer.java     2 Jul 2005 20:32:12 -0000       
1.23
+++ gnu/java/awt/peer/gtk/GtkLabelPeer.java     12 Aug 2005 22:47:21 -0000
@@ -41,6 +41,9 @@
 import java.awt.Label;
 import java.awt.peer.LabelPeer;
 
+// A composite widget.  GtkLabels have transparent backgrounds.  An
+// AWT Label is opaque.  To compensate, a GtkLabelPeer is a GtkLabel
+// packed in a GtkEventBox.
 public class GtkLabelPeer extends GtkComponentPeer
     implements LabelPeer
 {
@@ -50,6 +53,10 @@
 
   public native void setText(String text);
   native void setNativeBounds (int x, int y, int width, int height);
+
+  // Because this is a composite widget, we need to retrieve the
+  // GtkLabel's preferred dimensions, not the enclosing GtkEventBox's.
+  native void gtkWidgetGetPreferredDimensions (int[] dim);
 
   void create ()
   {
Index: include/gnu_java_awt_peer_gtk_GtkButtonPeer.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkButtonPeer.h,v
retrieving revision 1.12
diff -u -u -r1.12 gnu_java_awt_peer_gtk_GtkButtonPeer.h
--- include/gnu_java_awt_peer_gtk_GtkButtonPeer.h       22 Oct 2004 10:11:11 
-0000      1.12
+++ include/gnu_java_awt_peer_gtk_GtkButtonPeer.h       12 Aug 2005 22:47:23 
-0000
@@ -19,6 +19,7 @@
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkActivate 
(JNIEnv *env, jobject);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetRequestFocus (JNIEnv *env, 
jobject);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_setNativeBounds (JNIEnv *env, jobject, 
jint, jint, jint, jint);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetGetPreferredDimensions 
(JNIEnv *env, jobject, jintArray);
 
 #ifdef __cplusplus
 }
Index: include/gnu_java_awt_peer_gtk_GtkLabelPeer.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkLabelPeer.h,v
retrieving revision 1.8
diff -u -u -r1.8 gnu_java_awt_peer_gtk_GtkLabelPeer.h
--- include/gnu_java_awt_peer_gtk_GtkLabelPeer.h        22 Oct 2004 10:11:11 
-0000      1.8
+++ include/gnu_java_awt_peer_gtk_GtkLabelPeer.h        12 Aug 2005 22:47:23 
-0000
@@ -15,6 +15,7 @@
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkLabelPeer_nativeSetAlignment (JNIEnv *env, 
jobject, jfloat);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setText (JNIEnv 
*env, jobject, jstring);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setNativeBounds 
(JNIEnv *env, jobject, jint, jint, jint, jint);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkWidgetGetPreferredDimensions (JNIEnv 
*env, jobject, jintArray);
 
 #ifdef __cplusplus
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.26
diff -u -u -r1.26 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   14 Jul 2005 
22:07:02 -0000      1.26
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   12 Aug 2005 
22:47:23 -0000
@@ -86,6 +86,56 @@
   gdk_threads_leave ();
 }
 
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetGetPreferredDimensions
+  (JNIEnv *env, jobject obj, jintArray jdims)
+{
+  void *ptr;
+  jint *dims;
+  GtkWidget *button;
+  GtkWidget *label;
+  GtkRequisition current_req;
+  GtkRequisition current_label_req;
+  GtkRequisition natural_req;
+
+  gdk_threads_enter ();
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  button = gtk_bin_get_child (GTK_BIN (ptr));
+  label = gtk_bin_get_child (GTK_BIN (button));
+
+  dims = (*env)->GetIntArrayElements (env, jdims, 0);
+  dims[0] = dims[1] = 0;
+
+  /* Save the button's current size request. */
+  gtk_widget_size_request (GTK_WIDGET (button), &current_req);
+
+  /* Save the label's current size request. */
+  gtk_widget_size_request (GTK_WIDGET (label), &current_label_req);
+
+  /* Get the widget's "natural" size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (button), -1, -1);
+  gtk_widget_set_size_request (GTK_WIDGET (label), -1, -1);
+
+  gtk_widget_size_request (GTK_WIDGET (button), &natural_req);
+
+  /* Reset the button's size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (button),
+                               current_req.width, current_req.height);
+
+  /* Reset the label's size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (label),
+                               current_label_req.width, 
current_label_req.height);
+
+  dims[0] = natural_req.width;
+  dims[1] = natural_req.height;
+
+  (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
+
+  gdk_threads_leave ();
+}
+
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals
   (JNIEnv *env, jobject obj)
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v
retrieving revision 1.16
diff -u -u -r1.16 gnu_java_awt_peer_gtk_GtkLabelPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c    14 Jul 2005 
22:07:02 -0000      1.16
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c    12 Aug 2005 
22:47:23 -0000
@@ -66,6 +66,44 @@
   gdk_threads_leave ();
 }
 
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkWidgetGetPreferredDimensions
+  (JNIEnv *env, jobject obj, jintArray jdims)
+{
+  void *ptr;
+  jint *dims;
+  GtkWidget *label;
+  GtkRequisition current_req;
+  GtkRequisition natural_req;
+
+  gdk_threads_enter ();
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  label = gtk_bin_get_child (GTK_BIN (ptr));
+
+  dims = (*env)->GetIntArrayElements (env, jdims, 0);  
+  dims[0] = dims[1] = 0;
+
+  /* Save the widget's current size request. */
+  gtk_widget_size_request (GTK_WIDGET (label), &current_req);
+
+  /* Get the widget's "natural" size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (label), -1, -1);
+  gtk_widget_size_request (GTK_WIDGET (label), &natural_req);
+
+  /* Reset the widget's size request. */
+  gtk_widget_set_size_request (GTK_WIDGET (label),
+                               current_req.width, current_req.height);
+
+  dims[0] = natural_req.width;
+  dims[1] = natural_req.height;
+
+  (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
+
+  gdk_threads_leave ();
+}
+
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkWidgetModifyFont
   (JNIEnv *env, jobject obj, jstring name, jint style, jint size)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]