]> Pileus Git - ~andy/gtk/commitdiff
widget: Give some meaning to "visible"
authorBenjamin Otte <otte@redhat.com>
Tue, 8 Jan 2013 13:56:02 +0000 (14:56 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 8 Jan 2013 13:56:02 +0000 (14:56 +0100)
GtkWidget::visible is required for the widget to:
- have a preferred size other than 0/0
- have a size allocated
- return other values than { -1, -1, 1, 1 } from get_allocation()

This is an experimental patch aiming to make concepts and behaviors
inside GTK more concreate. GtkWidget::visible is now essentially what
CSS does for "display: none".

Note that if you want the effect of CSS's "visibility: hidden", you'll
have to use a GtkNotebook with an empty page as the concept of reserving
space but not drawing anything isn't supported natively in GTK.

gtk/gtkwidget.c

index 53f5048dc9969205dbf4730e70d8696c8c4ba3e8..35fa755a716f4f51e3386b17deee25305a0c9e46 100644 (file)
@@ -4817,6 +4817,12 @@ gtk_widget_size_allocate (GtkWidget      *widget,
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  if (!priv->visible)
+    {
+      g_print ("woot, invisible widget allocated!\n");
+      return;
+    }
+
   gtk_widget_push_verify_invariants (widget);
 
 #ifdef G_ENABLE_DEBUG
@@ -7494,7 +7500,17 @@ void
 _gtk_widget_set_visible_flag (GtkWidget *widget,
                               gboolean   visible)
 {
-  widget->priv->visible = visible;
+  GtkWidgetPrivate *priv = widget->priv;
+
+  priv->visible = visible;
+
+  if (!visible)
+    {
+      priv->allocation.x = -1;
+      priv->allocation.y = -1;
+      priv->allocation.width = 1;
+      priv->allocation.height = 1;
+    }
 }
 
 /**
@@ -13513,6 +13529,7 @@ gtk_widget_set_allocation (GtkWidget           *widget,
   GtkWidgetPrivate *priv;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (gtk_widget_get_visible (widget));
   g_return_if_fail (allocation != NULL);
 
   priv = widget->priv;