]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkframe.c
do not avoid to queue for a resize if the container is not visible, we
[~andy/gtk] / gtk / gtkframe.c
index 5fc6aaea6d474ad47b5c8c78303e664ffa422955..7b1df57ce6806214895475d6cea18f9c2738cba9 100644 (file)
@@ -12,8 +12,9 @@
  * Library General Public License for more details.
  *
  * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
  */
 #include <string.h>
 #include "gtkframe.h"
@@ -46,15 +47,17 @@ static void gtk_frame_size_request  (GtkWidget      *widget,
                                     GtkRequisition *requisition);
 static void gtk_frame_size_allocate (GtkWidget      *widget,
                                     GtkAllocation  *allocation);
+static void gtk_frame_style_set     (GtkWidget      *widget,
+                                    GtkStyle       *previous_style);
 
 
 static GtkBinClass *parent_class = NULL;
 
 
-guint
-gtk_frame_get_type ()
+GtkType
+gtk_frame_get_type (void)
 {
-  static guint frame_type = 0;
+  static GtkType frame_type = 0;
 
   if (!frame_type)
     {
@@ -86,10 +89,10 @@ gtk_frame_class_init (GtkFrameClass *class)
 
   parent_class = gtk_type_class (gtk_bin_get_type ());
 
-  gtk_object_add_arg_type ("GtkFrame::label", GTK_TYPE_STRING, ARG_LABEL);
-  gtk_object_add_arg_type ("GtkFrame::label_xalign", GTK_TYPE_DOUBLE, ARG_LABEL_XALIGN);
-  gtk_object_add_arg_type ("GtkFrame::label_yalign", GTK_TYPE_DOUBLE, ARG_LABEL_YALIGN);
-  gtk_object_add_arg_type ("GtkFrame::shadow", GTK_TYPE_ENUM, ARG_SHADOW);
+  gtk_object_add_arg_type ("GtkFrame::label", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_LABEL);
+  gtk_object_add_arg_type ("GtkFrame::label_xalign", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_LABEL_XALIGN);
+  gtk_object_add_arg_type ("GtkFrame::label_yalign", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_LABEL_YALIGN);
+  gtk_object_add_arg_type ("GtkFrame::shadow", GTK_TYPE_SHADOW_TYPE, GTK_ARG_READWRITE, ARG_SHADOW);
 
   object_class->finalize = gtk_frame_finalize;
 
@@ -97,6 +100,7 @@ gtk_frame_class_init (GtkFrameClass *class)
   widget_class->expose_event = gtk_frame_expose;
   widget_class->size_request = gtk_frame_size_request;
   widget_class->size_allocate = gtk_frame_size_allocate;
+  widget_class->style_set = gtk_frame_style_set;
 }
 
 static void
@@ -132,7 +136,6 @@ gtk_frame_set_arg (GtkFrame       *frame,
       gtk_frame_set_shadow_type (frame, GTK_VALUE_ENUM (*arg));
       break;
     default:
-      arg->type = GTK_TYPE_INVALID;
       break;
     }
 }
@@ -174,6 +177,25 @@ gtk_frame_new (const gchar *label)
   return GTK_WIDGET (frame);
 }
 
+static void
+gtk_frame_style_set (GtkWidget      *widget,
+                    GtkStyle       *previous_style)
+{
+  GtkFrame *frame;
+
+  frame = GTK_FRAME (widget);
+
+  if (frame->label)
+    {
+      frame->label_width = gdk_string_measure (GTK_WIDGET (frame)->style->font, frame->label) + 7;
+      frame->label_height = (GTK_WIDGET (frame)->style->font->ascent +
+                            GTK_WIDGET (frame)->style->font->descent + 1);
+    }
+
+  if (GTK_WIDGET_CLASS (parent_class)->style_set)
+    GTK_WIDGET_CLASS (parent_class)->style_set (widget, previous_style);
+}
+
 void
 gtk_frame_set_label (GtkFrame *frame,
                     const gchar *label)
@@ -471,7 +493,7 @@ gtk_frame_size_allocate (GtkWidget     *widget,
 
       child_allocation.y = (GTK_CONTAINER (frame)->border_width +
                            MAX (frame->label_height, GTK_WIDGET (frame)->style->klass->ythickness));
-      child_allocation.height = MAX (0, (allocation->height - child_allocation.y -
+      child_allocation.height = MAX (1, (allocation->height - child_allocation.y -
                                         GTK_CONTAINER (frame)->border_width -
                                         GTK_WIDGET (frame)->style->klass->ythickness));