[gtk+/wip/actor: 6/25] actors: Add GtkCssBox



commit 98052f5207d2bf8bcd2251e79bc31535170426b2
Author: Benjamin Otte <otte redhat com>
Date:   Fri Dec 7 12:29:13 2012 +0100

    actors: Add GtkCssBox
    
    GtkCssBox is an actor that does 2 things:
    (1) It manages the styles
    (2) It implements the CSS box model and provides for margin, padding and
        border
    
    And with this, GtkCssBox will be pretty much the most important layout
    element when creating widgets.

 gtk/actors/Makefile.am        |    2 +
 gtk/actors/gtkcssbox.c        |  553 +++++++++++++++++++++++++++++++++++++++++
 gtk/actors/gtkcssboxprivate.h |   69 +++++
 3 files changed, 624 insertions(+), 0 deletions(-)
---
diff --git a/gtk/actors/Makefile.am b/gtk/actors/Makefile.am
index 2b60c5d..86e00a2 100644
--- a/gtk/actors/Makefile.am
+++ b/gtk/actors/Makefile.am
@@ -4,10 +4,12 @@ noinst_LTLIBRARIES = libgtkactors.la
 
 gtkactors_c_sources =			\
 	gtkactor.c			\
+	gtkcssbox.c			\
 	gtklayoutmanager.c
 
 gtkactors_private_h_sources =		\
 	gtkactorprivate.h		\
+	gtkcssboxprivate.h		\
 	gtklayoutmanagerprivate.h
 
 libgtkactors_la_SOURCES = 		\
diff --git a/gtk/actors/gtkcssbox.c b/gtk/actors/gtkcssbox.c
new file mode 100644
index 0000000..25e583f
--- /dev/null
+++ b/gtk/actors/gtkcssbox.c
@@ -0,0 +1,553 @@
+/*
+ * Copyright  2012 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Benjamin Otte <otte gnome org>
+ */
+
+#include "config.h"
+
+#include "gtkcssboxprivate.h"
+
+#include "gtkcssenumvalueprivate.h"
+#include "gtkcssnumbervalueprivate.h"
+#include "gtkcsstypesprivate.h"
+#include "gtkdebug.h"
+#include "gtkintl.h"
+#include "gtkprivate.h"
+#include "gtkstylecontext.h"
+#include "gtkstylecontextprivate.h"
+#include "gtktypebuiltins.h"
+
+/* state flags that when set will automatically be set on all parents */
+#define GTK_STATE_FLAGS_PROPAGATE_TO_PARENT (GTK_STATE_FLAG_PRELIGHT)
+
+/* state flags that when set will automatically propagate to all children */
+#define GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN (GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_BACKDROP)
+
+G_STATIC_ASSERT((GTK_STATE_FLAGS_PROPAGATE_TO_PARENT & GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN) == 0);
+
+#define GTK_STATE_FLAGS_NO_PROPAGATE (~(GTK_STATE_FLAGS_PROPAGATE_TO_PARENT | GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN))
+
+struct _GtkCssBoxPrivate {
+  GtkStyleContext *context;
+
+  GtkStateFlags    state;
+
+};
+
+enum
+{
+  PROP_0,
+
+  PROP_EFFECTIVE_STATE,
+  PROP_STATE,
+
+  PROP_LAST
+};
+
+static GParamSpec *obj_props[PROP_LAST];
+
+G_DEFINE_TYPE (GtkCssBox, _gtk_css_box, GTK_TYPE_ACTOR)
+
+static void
+gtk_css_box_set_effective_state (GtkCssBox     *box,
+                                 GtkStateFlags  state)
+{
+  gtk_style_context_set_state (box->priv->context, state);
+  g_object_notify_by_pspec (G_OBJECT (box), obj_props[PROP_EFFECTIVE_STATE]);
+}
+
+GtkStateFlags
+_gtk_css_box_get_effective_state (GtkCssBox *self)
+{
+  g_return_val_if_fail (GTK_IS_CSS_BOX (self), 0);
+
+  return gtk_style_context_get_state (self->priv->context);
+}
+
+static void
+gtk_css_box_update_state_on_parent (GtkCssBox     *box,
+                                    GtkStateFlags  state_to_set,
+                                    GtkStateFlags  state_to_unset)
+{
+  GtkStateFlags effective;
+  GtkActor *iter, *parent;
+
+  effective = _gtk_css_box_get_effective_state (box);
+  state_to_set = ~effective & state_to_set;
+  state_to_unset = effective & state_to_unset;
+
+  for (iter = _gtk_actor_get_first_child (GTK_ACTOR (box));
+       iter && state_to_unset != 0;
+       iter = _gtk_actor_get_next_sibling (iter))
+    {
+      if (!GTK_IS_CSS_BOX (iter))
+        continue;
+
+      state_to_unset &= ~_gtk_css_box_get_effective_state (GTK_CSS_BOX (iter));
+    }
+
+  if (state_to_set == 0 && state_to_unset == 0)
+    return;
+
+  gtk_css_box_set_effective_state (box, (effective | state_to_set) & ~state_to_unset);
+
+  parent = _gtk_actor_get_parent (GTK_ACTOR (box));
+  if (GTK_IS_CSS_BOX (parent))
+    gtk_css_box_update_state_on_parent (GTK_CSS_BOX (parent), state_to_set, state_to_unset);
+}
+
+static void
+gtk_css_box_update_state_on_children (GtkCssBox     *box,
+                                      GtkStateFlags  state_to_set,
+                                      GtkStateFlags  state_to_unset)
+{
+  GtkStateFlags effective;
+  GtkActor *iter;
+
+  effective = _gtk_css_box_get_effective_state (box);
+  state_to_set = ~effective & state_to_set;
+  state_to_unset = effective & state_to_unset;
+  
+  gtk_css_box_set_effective_state (box, (effective | state_to_set) & ~state_to_unset);
+
+  if (state_to_set == 0 && state_to_unset == 0)
+    return;
+  
+  for (iter = _gtk_actor_get_first_child (GTK_ACTOR (box));
+       iter;
+       iter = _gtk_actor_get_next_sibling (iter))
+    {
+      if (!GTK_IS_CSS_BOX (iter))
+        continue;
+
+      gtk_css_box_update_state_on_children (GTK_CSS_BOX (iter), state_to_set, state_to_unset);
+    }
+}
+
+static void
+gtk_css_box_finalize (GObject *object)
+{
+  GtkCssBox *self = GTK_CSS_BOX (object);
+  GtkCssBoxPrivate *priv = self->priv;
+
+  g_object_unref (priv->context);
+  priv->context = NULL;
+
+  G_OBJECT_CLASS (_gtk_css_box_parent_class)->finalize (object);
+}
+
+static void
+gtk_css_box_set_property (GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+  GtkCssBox *css_box = GTK_CSS_BOX (object);
+
+  switch (prop_id)
+    {
+    case PROP_STATE:
+      _gtk_css_box_set_state (css_box, g_value_get_enum (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gtk_css_box_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+  GtkCssBox *css_box = GTK_CSS_BOX (object);
+
+  switch (prop_id)
+    {
+    case PROP_EFFECTIVE_STATE:
+      g_value_set_enum (value, _gtk_css_box_get_effective_state (css_box));
+      break;
+
+    case PROP_STATE:
+      g_value_set_enum (value, _gtk_css_box_get_state (css_box));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gtk_css_box_queue_restyle (GtkCssBox    *self,
+                           GtkCssChange  change)
+{
+  _gtk_style_context_queue_invalidate (self->priv->context, change);
+}
+
+static void
+gtk_css_box_queue_restyle_siblings (GtkCssBox    *self,
+                                    GtkCssChange  change)
+{
+  GtkActor *iter;
+
+  for (iter = _gtk_actor_get_previous_sibling (GTK_ACTOR (self));
+       iter;
+       iter = _gtk_actor_get_previous_sibling (iter))
+    {
+      if (GTK_IS_CSS_BOX (iter))
+        gtk_css_box_queue_restyle (GTK_CSS_BOX (iter), change);
+    }
+
+  for (iter = _gtk_actor_get_next_sibling (GTK_ACTOR (self));
+       iter;
+       iter = _gtk_actor_get_next_sibling (iter))
+    {
+      if (GTK_IS_CSS_BOX (iter))
+        gtk_css_box_queue_restyle (GTK_CSS_BOX (iter), change);
+    }
+}
+
+static void
+gtk_css_box_real_show (GtkActor *self)
+{
+  GtkCssBox *box = GTK_CSS_BOX (self);
+
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->show (self);
+
+  gtk_css_box_queue_restyle_siblings (box, GTK_CSS_CHANGE_ANY_SIBLING);
+}
+
+static void
+gtk_css_box_real_hide (GtkActor *self)
+{
+  GtkCssBox *box = GTK_CSS_BOX (self);
+
+  gtk_css_box_queue_restyle_siblings (box, GTK_CSS_CHANGE_ANY_SIBLING);
+
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->hide (self);
+}
+
+static void
+gtk_css_box_real_map (GtkActor *self)
+{
+  GtkCssBox *box = GTK_CSS_BOX (self);
+  GtkCssBoxPrivate *priv = box->priv;
+
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->map (self);
+  
+  _gtk_style_context_update_animating (priv->context);
+}
+
+static void
+gtk_css_box_real_unmap (GtkActor *self)
+{
+  GtkCssBox *box = GTK_CSS_BOX (self);
+  GtkCssBoxPrivate *priv = box->priv;
+
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->map (self);
+  
+  _gtk_style_context_update_animating (priv->context);
+}
+
+static void 
+gtk_css_box_real_parent_set (GtkActor *self,
+                             GtkActor *old_parent)
+{
+  GtkCssBox *box = GTK_CSS_BOX (self);
+  GtkCssBoxPrivate *priv = box->priv;
+  GtkActor *parent;
+
+  parent = _gtk_actor_get_parent (self);
+
+  if (old_parent == NULL)
+    {
+      g_warn_if_fail (GTK_IS_CSS_BOX (parent));
+    }
+
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->parent_set (self, old_parent);
+
+  gtk_style_context_set_parent (priv->context, parent ? GTK_CSS_BOX (parent)->priv->context : NULL);
+
+  if (parent)
+    {
+      gtk_css_box_update_state_on_children (box, 
+                                            _gtk_css_box_get_effective_state (GTK_CSS_BOX (parent)) & GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN,
+                                            0);
+      gtk_css_box_update_state_on_parent (GTK_CSS_BOX (parent), 
+                                          _gtk_css_box_get_effective_state (box) & GTK_STATE_FLAGS_PROPAGATE_TO_PARENT,
+                                          0);
+    }
+  else
+    {
+      gtk_css_box_update_state_on_children (box, 
+                                            0,
+                                            _gtk_css_box_get_effective_state (GTK_CSS_BOX (old_parent)) & GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN);
+      gtk_css_box_update_state_on_parent (GTK_CSS_BOX (old_parent), 
+                                          0,
+                                          _gtk_css_box_get_effective_state (box) & GTK_STATE_FLAGS_PROPAGATE_TO_PARENT);
+    }
+}
+
+static double
+gtk_css_box_get_edge (GtkCssBox  *box,
+                      GtkCssSide  side)
+{
+  const struct {
+    guint margin;
+    guint border;
+    guint border_style;
+    guint padding;
+  } properties[] = {
+    /* [GTK_CSS_TOP]    = */ { GTK_CSS_PROPERTY_MARGIN_TOP,
+                               GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
+                               GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
+                               GTK_CSS_PROPERTY_PADDING_TOP },
+    /* [GTK_CSS_RIGHT]  = */ { GTK_CSS_PROPERTY_MARGIN_RIGHT,
+                               GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
+                               GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
+                               GTK_CSS_PROPERTY_PADDING_RIGHT },
+    /* [GTK_CSS_BOTTOM] = */ { GTK_CSS_PROPERTY_MARGIN_BOTTOM,
+                               GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+                               GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+                               GTK_CSS_PROPERTY_PADDING_BOTTOM },
+    /* [GTK_CSS_LEFT]   = */ { GTK_CSS_PROPERTY_MARGIN_LEFT,
+                               GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
+                               GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
+                               GTK_CSS_PROPERTY_PADDING_LEFT }
+  };
+  GtkStyleContext *context;
+  GtkBorderStyle border_style;
+  double result;
+
+  context = box->priv->context;
+
+  result = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, properties[side].margin), 100);
+           + _gtk_css_number_value_get (_gtk_style_context_peek_property (context, properties[side].padding), 100);
+
+  border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, properties[side].border_style));
+  if (border_style != GTK_BORDER_STYLE_NONE && border_style != GTK_BORDER_STYLE_HIDDEN)
+    result = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, properties[side].border), 100);
+
+  if (result < 0.0)
+    return 0.0;
+
+  return result;
+}
+
+static void
+gtk_css_box_real_get_preferred_size (GtkActor       *self,
+                                     GtkOrientation  orientation,
+                                     gfloat          for_size,
+                                     gfloat         *min_size_p,
+                                     gfloat         *natural_size_p)
+{
+  GtkCssBox *box = GTK_CSS_BOX (self);
+  float extra_size;
+
+  *min_size_p = 0;
+  *natural_size_p = 0;
+  if (for_size >= 0)
+    {
+      if (orientation == GTK_ORIENTATION_VERTICAL)
+        extra_size = gtk_css_box_get_edge (box, GTK_CSS_LEFT) + gtk_css_box_get_edge (box, GTK_CSS_RIGHT);
+      else
+        extra_size = gtk_css_box_get_edge (box, GTK_CSS_TOP) + gtk_css_box_get_edge (box, GTK_CSS_BOTTOM);
+
+      for_size = MAX (0, for_size - extra_size);
+    }
+
+  if (orientation == GTK_ORIENTATION_HORIZONTAL)
+    extra_size = gtk_css_box_get_edge (box, GTK_CSS_LEFT) + gtk_css_box_get_edge (box, GTK_CSS_RIGHT);
+  else
+    extra_size = gtk_css_box_get_edge (box, GTK_CSS_TOP) + gtk_css_box_get_edge (box, GTK_CSS_BOTTOM);
+
+  *min_size_p = MAX (0, *min_size_p + extra_size);
+  *natural_size_p = MAX (0, *natural_size_p + extra_size);
+}
+
+static void
+gtk_css_box_real_draw (GtkActor *self,
+                       cairo_t  *cr)
+{
+  GtkCssBox *box = GTK_CSS_BOX (self);
+  GtkCssBoxPrivate *priv = box->priv;
+
+  gtk_render_background (priv->context,
+                         cr,
+                         0, 0,
+                         _gtk_actor_get_width (self),
+                         _gtk_actor_get_height (self));
+  gtk_render_frame (priv->context,
+                    cr,
+                    0, 0,
+                    _gtk_actor_get_width (self),
+                    _gtk_actor_get_height (self));
+
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->draw (self, cr);
+}
+
+static void
+_gtk_css_box_class_init (GtkCssBoxClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkActorClass *actor_class = GTK_ACTOR_CLASS (klass);
+
+  object_class->finalize = gtk_css_box_finalize;
+  object_class->set_property = gtk_css_box_set_property;
+  object_class->get_property = gtk_css_box_get_property;
+
+  actor_class->show = gtk_css_box_real_show;
+  actor_class->hide = gtk_css_box_real_hide;
+  actor_class->map = gtk_css_box_real_map;
+  actor_class->unmap = gtk_css_box_real_unmap;
+  actor_class->draw = gtk_css_box_real_draw;
+  actor_class->parent_set = gtk_css_box_real_parent_set;
+  actor_class->get_preferred_size = gtk_css_box_real_get_preferred_size;
+
+  /**
+   * GtkCssBox:state:
+   *
+   * The state flags explicitly set on the box.
+   *
+   * See also GtkCssBox:effective-state.
+   */
+  obj_props[PROP_STATE] =
+    g_param_spec_flags ("state",
+                        P_("State"),
+                        P_("State flags set on the box"),
+                        GTK_TYPE_STATE_FLAGS,
+                        0,
+                        GTK_PARAM_READWRITE);
+
+  /**
+   * GtkCssBox:effective-state:
+   *
+   * The state flags explicitly set on the box. These are the flags cpomputed
+   * from the box's own state and propagated state from parent or children boxes.
+   *
+   * See also GtkCssBox:state.
+   */
+  obj_props[PROP_EFFECTIVE_STATE] =
+    g_param_spec_flags ("effective-state",
+                        P_("Effective State"),
+                        P_("Effective state computed for the box"),
+                        GTK_TYPE_STATE_FLAGS,
+                        0,
+                        GTK_PARAM_READWRITE);
+
+  g_type_class_add_private (klass, sizeof (GtkCssBoxPrivate));
+}
+
+static void
+_gtk_css_box_init (GtkCssBox *box)
+{
+  GtkCssBoxPrivate *priv;
+  GtkActor *actor = GTK_ACTOR (box);
+
+  box->priv = G_TYPE_INSTANCE_GET_PRIVATE (box,
+                                           GTK_TYPE_CSS_BOX,
+                                           GtkCssBoxPrivate);
+  priv = box->priv;
+
+  priv->context = gtk_style_context_new ();
+  gtk_style_context_set_screen (priv->context, _gtk_actor_get_screen (actor));
+  //_gtk_style_context_set_actor (priv->context, actor);
+}
+
+GtkActor *
+_gtk_css_box_new (void)
+{
+  return g_object_new (GTK_TYPE_CSS_BOX, NULL);
+}
+
+void
+_gtk_css_box_set_state (GtkCssBox     *self,
+                        GtkStateFlags  state)
+{
+  GtkCssBoxPrivate *priv;
+  GtkStateFlags changed;
+
+  g_return_if_fail (GTK_IS_CSS_BOX (self));
+
+  priv = self->priv;
+
+  if (priv->state == state)
+    return;
+
+  g_object_freeze_notify (G_OBJECT (self));
+
+  changed = priv->state ^ state;
+
+  priv->state = state;
+  g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_STATE]);
+
+  if (changed & GTK_STATE_FLAGS_PROPAGATE_TO_PARENT)
+    gtk_css_box_update_state_on_parent (self,
+                                        state & changed & GTK_STATE_FLAGS_PROPAGATE_TO_PARENT,
+                                        ~state & changed & GTK_STATE_FLAGS_PROPAGATE_TO_PARENT);
+  if (changed & GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN)
+    gtk_css_box_update_state_on_children (self,
+                                          state & changed & GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN,
+                                          ~state & changed & GTK_STATE_FLAGS_PROPAGATE_TO_CHILDREN);
+
+  gtk_css_box_set_effective_state (self,
+                                   (_gtk_css_box_get_effective_state (self) & GTK_STATE_FLAGS_NO_PROPAGATE)
+                                   | (state & ~GTK_STATE_FLAGS_NO_PROPAGATE));
+
+  g_object_thaw_notify (G_OBJECT (self));
+}
+
+GtkStateFlags
+_gtk_css_box_get_state (GtkCssBox *self)
+{
+  g_return_val_if_fail (GTK_IS_CSS_BOX (self), 0);
+
+  return self->priv->state;
+}
+
+void
+_gtk_css_box_add_class (GtkCssBox   *self,
+                        const gchar *class_name)
+{
+  g_return_if_fail (GTK_IS_CSS_BOX (self));
+  g_return_if_fail (class_name != NULL);
+
+  gtk_style_context_add_class (self->priv->context, class_name);
+}
+
+void
+_gtk_css_box_remove_class (GtkCssBox   *self,
+                           const gchar *class_name)
+{
+  g_return_if_fail (GTK_IS_CSS_BOX (self));
+  g_return_if_fail (class_name != NULL);
+
+  gtk_style_context_remove_class (self->priv->context, class_name);
+}
+
+gboolean
+_gtk_css_box_has_class (GtkCssBox   *self,
+                        const gchar *class_name)
+{
+  g_return_val_if_fail (GTK_IS_CSS_BOX (self), FALSE);
+  g_return_val_if_fail (class_name != NULL, FALSE);
+
+  return gtk_style_context_has_class (self->priv->context, class_name);
+}
diff --git a/gtk/actors/gtkcssboxprivate.h b/gtk/actors/gtkcssboxprivate.h
new file mode 100644
index 0000000..ddc5a81
--- /dev/null
+++ b/gtk/actors/gtkcssboxprivate.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright  2012 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Benjamin Otte <otte gnome org>
+ */
+
+#ifndef __GTK_CSS_BOX_PRIVATE_H__
+#define __GTK_CSS_BOX_PRIVATE_H__
+
+#include <gtk/actors/gtkactorprivate.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_CSS_BOX           (_gtk_css_box_get_type ())
+#define GTK_CSS_BOX(obj)           (G_TYPE_CHECK_INSTANCE_CAST (obj, GTK_TYPE_CSS_BOX, GtkCssBox))
+#define GTK_CSS_BOX_CLASS(cls)     (G_TYPE_CHECK_CLASS_CAST (cls, GTK_TYPE_CSS_BOX, GtkCssBoxClass))
+#define GTK_IS_CSS_BOX(obj)        (G_TYPE_CHECK_INSTANCE_TYPE (obj, GTK_TYPE_CSS_BOX))
+#define GTK_IS_CSS_BOX_CLASS(obj)  (G_TYPE_CHECK_CLASS_TYPE (obj, GTK_TYPE_CSS_BOX))
+#define GTK_CSS_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CSS_BOX, GtkCssBoxClass))
+
+typedef struct _GtkCssBox           GtkCssBox;
+typedef struct _GtkCssBoxPrivate    GtkCssBoxPrivate;
+typedef struct _GtkCssBoxClass      GtkCssBoxClass;
+typedef struct _GtkCssBoxIter       GtkCssBoxIter;
+
+struct _GtkCssBox
+{
+  GtkActor            parent;
+
+  GtkCssBoxPrivate    *priv;
+};
+
+struct _GtkCssBoxClass
+{
+  GtkActorClass       parent_class;
+};
+
+GType                           _gtk_css_box_get_type                           (void) G_GNUC_CONST;
+
+GtkActor *                      _gtk_css_box_new                                (void);
+
+void                            _gtk_css_box_set_state                          (GtkCssBox                  *self,
+                                                                                 GtkStateFlags               state);
+GtkStateFlags                   _gtk_css_box_get_state                          (GtkCssBox                  *self);
+GtkStateFlags                   _gtk_css_box_get_effective_state                (GtkCssBox                  *self);
+
+void                            _gtk_css_box_add_class                          (GtkCssBox                  *self,
+                                                                                 const gchar                *class_name);
+void                            _gtk_css_box_remove_class                       (GtkCssBox                  *self,
+                                                                                 const gchar                *class_name);
+gboolean                        _gtk_css_box_has_class                          (GtkCssBox                  *self,
+                                                                                 const gchar                *class_name);
+
+G_END_DECLS
+
+#endif /* __GTK_CSS_BOX_PRIVATE_H__ */



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