[libhandy] header-group: Introduce HdyHeaderGroupChild as the child type



commit a127175274844e1a773cb22c580f9d134b9be4b3
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Mon Jun 29 09:28:01 2020 +0200

    header-group: Introduce HdyHeaderGroupChild as the child type
    
    This will help introducing new child types.

 debian/libhandy-1-0.symbols    |   5 +
 glade/glade-hdy-header-group.c |   4 +-
 src/hdy-enums.c.in             |   1 +
 src/hdy-header-group.c         | 420 +++++++++++++++++++++++++++++++----------
 src/hdy-header-group.h         |  14 ++
 src/meson.build                |   1 +
 tests/test-header-group.c      |  21 +--
 7 files changed, 355 insertions(+), 111 deletions(-)
---
diff --git a/debian/libhandy-1-0.symbols b/debian/libhandy-1-0.symbols
index 3ee4d2c3..55e76aae 100644
--- a/debian/libhandy-1-0.symbols
+++ b/debian/libhandy-1-0.symbols
@@ -165,10 +165,15 @@ libhandy-1.so.0 libhandy-1-0 #MINVER#
  hdy_header_bar_set_title@LIBHANDY_1_0 0.0.10
  hdy_header_bar_set_transition_duration@LIBHANDY_1_0 0.0.10
  hdy_header_group_add_gtk_header_bar@LIBHANDY_1_0 0.83.0
+ hdy_header_group_child_get_child_type@LIBHANDY_1_0 0.83.0
+ hdy_header_group_child_get_gtk_header_bar@LIBHANDY_1_0 0.83.0
+ hdy_header_group_child_get_type@LIBHANDY_1_0 0.83.0
+ hdy_header_group_child_type_get_type@LIBHANDY_1_0 0.83.0
  hdy_header_group_get_children@LIBHANDY_1_0 0.83.0
  hdy_header_group_get_decorate_all@LIBHANDY_1_0 0.83.0
  hdy_header_group_get_type@LIBHANDY_1_0 0.0.3
  hdy_header_group_new@LIBHANDY_1_0 0.0.3
+ hdy_header_group_remove_child@LIBHANDY_1_0 0.83.0
  hdy_header_group_remove_gtk_header_bar@LIBHANDY_1_0 0.83.0
  hdy_header_group_set_decorate_all@LIBHANDY_1_0 0.83.0
  hdy_init@LIBHANDY_1_0 0.82.0
diff --git a/glade/glade-hdy-header-group.c b/glade/glade-hdy-header-group.c
index b4408ea6..9f7dce8e 100644
--- a/glade/glade-hdy-header-group.c
+++ b/glade/glade-hdy-header-group.c
@@ -144,8 +144,8 @@ glade_hdy_header_group_set_property (GladeWidgetAdaptor *adaptor,
       /* copy since we are modifying an internal list */
       sg_widgets = g_slist_copy (sg_widgets);
       for (slist = sg_widgets; slist; slist = slist->next)
-        hdy_header_group_remove_gtk_header_bar (HDY_HEADER_GROUP (object),
-                                                GTK_HEADER_BAR (slist->data));
+        hdy_header_group_remove_child (HDY_HEADER_GROUP (object),
+                                       HDY_HEADER_GROUP_CHILD (slist->data));
       g_slist_free (sg_widgets);
     }
 
diff --git a/src/hdy-enums.c.in b/src/hdy-enums.c.in
index 555d038f..9a9fe407 100644
--- a/src/hdy-enums.c.in
+++ b/src/hdy-enums.c.in
@@ -5,6 +5,7 @@
 #include "hdy-deck.h"
 #include "hdy-enums.h"
 #include "hdy-header-bar.h"
+#include "hdy-header-group.h"
 #include "hdy-leaflet.h"
 #include "hdy-navigation-direction.h"
 #include "hdy-squeezer.h"
diff --git a/src/hdy-header-group.c b/src/hdy-header-group.c
index 52d65ea8..6304abf2 100644
--- a/src/hdy-header-group.c
+++ b/src/hdy-header-group.c
@@ -9,11 +9,32 @@
 
 #include "hdy-header-group.h"
 
+/**
+ * HdyHeaderGroupChildType:
+ * @HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR: The child is a #GtkHeaderBar
+ *
+ * This enumeration value describes the child types handled by #HdyHeaderGroup.
+ *
+ * New values may be added to this enumeration over time.
+ *
+ * Since: 1.0
+ */
+
+struct _HdyHeaderGroupChild
+{
+  GObject parent_instance;
+
+  HdyHeaderGroupChildType type;
+  GObject *object;
+};
+
+G_DEFINE_TYPE (HdyHeaderGroupChild, hdy_header_group_child, G_TYPE_OBJECT)
+
 struct _HdyHeaderGroup
 {
   GObject parent_instance;
 
-  GSList *header_bars;
+  GSList *children;
   gboolean decorate_all;
 };
 
@@ -42,26 +63,144 @@ enum {
 
 static GParamSpec *props [N_PROPS];
 
-static gboolean
-contains (HdyHeaderGroup *self,
-          GtkHeaderBar   *header_bar)
+static void update_decoration_layouts (HdyHeaderGroup *self);
+
+static void
+object_destroyed_cb (HdyHeaderGroupChild *self,
+                     GObject             *object)
 {
-  GSList *header_bars;
+  g_assert (HDY_IS_HEADER_GROUP_CHILD (self));
 
-  for (header_bars = self->header_bars; header_bars != NULL; header_bars = header_bars->next)
-    if (header_bars->data == header_bar)
-      return TRUE;
+  self->object = NULL;
 
-  return FALSE;
+  g_object_unref (self);
+}
+
+static void
+forward_update_decoration_layouts (HdyHeaderGroupChild *self)
+{
+  HdyHeaderGroup *header_group;
+
+  g_assert (HDY_IS_HEADER_GROUP_CHILD (self));
+
+  header_group = HDY_HEADER_GROUP (g_object_get_data (G_OBJECT (self), "header-group"));
+
+  g_assert (HDY_IS_HEADER_GROUP (header_group));
+
+  update_decoration_layouts (header_group);
+}
+
+static void
+hdy_header_group_child_dispose (GObject *object)
+{
+  HdyHeaderGroupChild *self = (HdyHeaderGroupChild *)object;
+
+  if (self->object) {
+
+    switch (self->type) {
+    case HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR:
+      g_signal_handlers_disconnect_by_func (self->object, G_CALLBACK (object_destroyed_cb), self);
+      g_signal_handlers_disconnect_by_func (self->object, G_CALLBACK (forward_update_decoration_layouts), 
self);
+      break;
+    default:
+      g_assert_not_reached ();
+    }
+
+    self->object = NULL;
+  }
+
+  G_OBJECT_CLASS (hdy_header_group_child_parent_class)->dispose (object);
+}
+
+static HdyHeaderGroupChild *
+hdy_header_group_child_new_for_gtk_header_bar (GtkHeaderBar *header_bar)
+{
+  HdyHeaderGroupChild *self;
+  gpointer header_group;
+
+  g_return_val_if_fail (GTK_IS_HEADER_BAR (header_bar), NULL);
+
+  header_group = g_object_get_data (G_OBJECT (header_bar), "header-group");
+
+  g_return_val_if_fail (header_group == NULL, NULL);
+
+  self = g_object_new (HDY_TYPE_HEADER_GROUP_CHILD, NULL);
+  self->type = HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR;
+  self->object = G_OBJECT (header_bar);
+
+  g_signal_connect_swapped (header_bar, "destroy", G_CALLBACK (object_destroyed_cb), self);
+
+  g_signal_connect_swapped (header_bar, "map", G_CALLBACK (forward_update_decoration_layouts), self);
+  g_signal_connect_swapped (header_bar, "unmap", G_CALLBACK (forward_update_decoration_layouts), self);
+
+  return self;
+}
+
+static void
+hdy_header_group_child_class_init (HdyHeaderGroupChildClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->dispose = hdy_header_group_child_dispose;
+}
+
+static void
+hdy_header_group_child_init (HdyHeaderGroupChild *self)
+{
+}
+
+static void
+hdy_header_group_child_set_decoration_layout (HdyHeaderGroupChild *self,
+                                              const gchar         *layout)
+{
+  g_assert (HDY_IS_HEADER_GROUP_CHILD (self));
+
+  switch (self->type) {
+  case HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR:
+    gtk_header_bar_set_decoration_layout (GTK_HEADER_BAR (self->object), layout);
+    break;
+  default:
+    g_assert_not_reached ();
+  }
 }
 
+static gboolean
+hdy_header_group_child_get_mapped (HdyHeaderGroupChild *self)
+{
+  g_assert (HDY_IS_HEADER_GROUP_CHILD (self));
+
+  switch (self->type) {
+  case HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR:
+    return gtk_widget_get_mapped (GTK_WIDGET (self->object));
+  default:
+    g_assert_not_reached ();
+  }
+}
+
+static HdyHeaderGroupChild *
+get_child_for_object (HdyHeaderGroup *self,
+                      gpointer        object)
+{
+  GSList *children;
+
+  for (children = self->children; children != NULL; children = children->next) {
+    HdyHeaderGroupChild *child = HDY_HEADER_GROUP_CHILD (children->data);
+
+    g_assert (child);
+
+    if (child->object == object)
+      return child;
+  }
+
+  return NULL;
+}
 
 static void
 update_decoration_layouts (HdyHeaderGroup *self)
 {
-  GSList *header_bars;
+  GSList *children;
   GtkSettings *settings;
-  GtkHeaderBar *start_headerbar = NULL, *end_headerbar = NULL;
+  HdyHeaderGroupChild *start_child = NULL, *end_child = NULL;
   g_autofree gchar *layout = NULL;
   g_autofree gchar *start_layout = NULL;
   g_autofree gchar *end_layout = NULL;
@@ -69,9 +208,9 @@ update_decoration_layouts (HdyHeaderGroup *self)
 
   g_return_if_fail (HDY_IS_HEADER_GROUP (self));
 
-  header_bars = self->header_bars;
+  children = self->children;
 
-  if (header_bars == NULL)
+  if (children == NULL)
     return;
 
   settings = gtk_settings_get_default ();
@@ -80,29 +219,31 @@ update_decoration_layouts (HdyHeaderGroup *self)
     layout = g_strdup (":");
 
   if (self->decorate_all) {
-    for (; header_bars != NULL; header_bars = header_bars->next)
-      gtk_header_bar_set_decoration_layout (header_bars->data, layout);
+    for (; children != NULL; children = children->next)
+      hdy_header_group_child_set_decoration_layout (HDY_HEADER_GROUP_CHILD (children->data), layout);
 
     return;
   }
 
-  for (; header_bars != NULL; header_bars = header_bars->next) {
-    gtk_header_bar_set_decoration_layout (header_bars->data, ":");
+  for (; children != NULL; children = children->next) {
+    HdyHeaderGroupChild *child = HDY_HEADER_GROUP_CHILD (children->data);
 
-    if (!gtk_widget_get_mapped (header_bars->data))
+    hdy_header_group_child_set_decoration_layout (child, ":");
+
+    if (!hdy_header_group_child_get_mapped (child))
       continue;
 
-    /* The headerbars are in reverse order in the list.  */
-    start_headerbar = header_bars->data;
-    if (end_headerbar == NULL)
-      end_headerbar = header_bars->data;
+    /* The headerbars are in reverse order in the list. */
+    start_child = child;
+    if (end_child == NULL)
+      end_child = child;
   }
 
-  if (start_headerbar == NULL || end_headerbar == NULL)
+  if (start_child == NULL || end_child == NULL)
     return;
 
-  if (start_headerbar == end_headerbar) {
-    gtk_header_bar_set_decoration_layout (start_headerbar, layout);
+  if (start_child == end_child) {
+    hdy_header_group_child_set_decoration_layout (start_child, layout);
 
     return;
   }
@@ -115,16 +256,19 @@ update_decoration_layouts (HdyHeaderGroup *self)
     start_layout = g_strdup (":");
     end_layout = g_strdup (":");
   }
-  gtk_header_bar_set_decoration_layout (start_headerbar, start_layout);
-  gtk_header_bar_set_decoration_layout (end_headerbar, end_layout);
+  hdy_header_group_child_set_decoration_layout (start_child, start_layout);
+  hdy_header_group_child_set_decoration_layout (end_child, end_layout);
 }
 
 static void
-header_bar_destroyed (HdyHeaderGroup *self, GtkHeaderBar *header_bar)
+child_destroyed_cb (HdyHeaderGroup      *self,
+                    HdyHeaderGroupChild *child)
 {
-  g_return_if_fail (HDY_IS_HEADER_GROUP (self));
+  g_assert (HDY_IS_HEADER_GROUP (self));
+  g_assert (HDY_IS_HEADER_GROUP_CHILD (child));
+  g_assert (g_slist_find (self->children, child) != NULL);
 
-  self->header_bars = g_slist_remove (self->header_bars, header_bar);
+  self->children = g_slist_remove (self->children, child);
 
   g_object_unref (self);
 }
@@ -135,78 +279,46 @@ hdy_header_group_new (void)
   return g_object_new (HDY_TYPE_HEADER_GROUP, NULL);
 }
 
+static void
+hdy_header_group_add_child (HdyHeaderGroup      *self,
+                            HdyHeaderGroupChild *child)
+{
+  g_assert (HDY_IS_HEADER_GROUP (self));
+  g_assert (HDY_IS_HEADER_GROUP_CHILD (child));
+  g_assert (g_slist_find (self->children, child) == NULL);
+
+  self->children = g_slist_prepend (self->children, child);
+  g_object_weak_ref (G_OBJECT (child), (GWeakNotify) child_destroyed_cb, self);
+  g_object_ref (self);
+
+  update_decoration_layouts (self);
+
+  g_object_set_data (G_OBJECT (child), "header-group", self);
+}
+
 /**
  * hdy_header_group_add_gtk_header_bar:
  * @self: a #HdyHeaderGroup
  * @header_bar: the #GtkHeaderBar to add
  *
- * Adds a header bar to a #HdyHeaderGroup. The decoration layout of the
- * widgets will be edited depending on their position in the composite header
- * bar, the start widget displaying only the start of the user's decoration
- * layout and the end widget displaying only its end while widgets in the middle
- * won't display anything.
- * See gtk_header_bar_set_decoration_layout().
- *
+ * Adds @header_bar to @self.
  * When the widget is destroyed or no longer referenced elsewhere, it will
  * be removed from the header group.
+ *
+ * Since: 1.0
  */
 void
 hdy_header_group_add_gtk_header_bar (HdyHeaderGroup *self,
                                      GtkHeaderBar   *header_bar)
 {
-  g_return_if_fail (HDY_IS_HEADER_GROUP (self));
-  g_return_if_fail (GTK_IS_HEADER_BAR (header_bar));
-
-  g_signal_connect_swapped (header_bar, "map", G_CALLBACK (update_decoration_layouts), self);
-  g_signal_connect_swapped (header_bar, "unmap", G_CALLBACK (update_decoration_layouts), self);
-  self->header_bars = g_slist_prepend (self->header_bars, header_bar);
-
-  g_object_ref (self);
-
-  g_signal_connect_swapped (header_bar, "destroy", G_CALLBACK (header_bar_destroyed), self);
+  HdyHeaderGroupChild *child;
 
-  update_decoration_layouts (self);
-}
-
-
-/**
- * hdy_header_group_remove_gtk_header_bar:
- * @self: a #HdyHeaderGroup
- * @header_bar: the #GtkHeaderBar to remove
- *
- * Removes a widget from a #HdyHeaderGroup
- **/
-void
-hdy_header_group_remove_gtk_header_bar (HdyHeaderGroup *self,
-                                        GtkHeaderBar   *header_bar)
-{
   g_return_if_fail (HDY_IS_HEADER_GROUP (self));
   g_return_if_fail (GTK_IS_HEADER_BAR (header_bar));
-  g_return_if_fail (contains (self, header_bar));
+  g_return_if_fail (get_child_for_object (self, header_bar) == NULL);
 
-  self->header_bars = g_slist_remove (self->header_bars, header_bar);
-
-  g_signal_handlers_disconnect_by_data (header_bar, self);
-
-  g_object_unref (self);
-}
-
-
-/**
- * hdy_header_group_get_children:
- * @self: a #HdyHeaderGroup
- *
- * Returns the list of headerbars associated with @self.
- *
- * Returns:  (element-type GtkHeaderBar) (transfer none): a #GSList of
- *   headerbars. The list is owned by libhandy and should not be modified.
- **/
-GSList *
-hdy_header_group_get_children (HdyHeaderGroup *self)
-{
-  g_return_val_if_fail (HDY_IS_HEADER_GROUP (self), NULL);
-
-  return self->header_bars;
+  child = hdy_header_group_child_new_for_gtk_header_bar (header_bar);
+  hdy_header_group_add_child (self, child);
 }
 
 typedef struct {
@@ -235,8 +347,8 @@ hdy_header_group_dispose (GObject *object)
 {
   HdyHeaderGroup *self = (HdyHeaderGroup *)object;
 
-  g_slist_free_full (self->header_bars, (GDestroyNotify) g_object_unref);
-  self->header_bars = NULL;
+  g_slist_free_full (self->children, (GDestroyNotify) g_object_unref);
+  self->children = NULL;
 
   G_OBJECT_CLASS (hdy_header_group_parent_class)->dispose (object);
 }
@@ -475,7 +587,6 @@ hdy_header_group_buildable_custom_finished (GtkBuildable *buildable,
 {
   GSList *l;
   GSListSubParserData *data;
-  GObject *object;
 
   if (strcmp (tagname, "headerbars") != 0)
     return;
@@ -483,15 +594,18 @@ hdy_header_group_buildable_custom_finished (GtkBuildable *buildable,
   data = (GSListSubParserData*)user_data;
   data->items = g_slist_reverse (data->items);
 
-  for (l = data->items; l; l = l->next)
-    {
-      ItemData *item_data = l->data;
-      object = gtk_builder_get_object (builder, item_data->name);
-      if (!object)
-        continue;
+  for (l = data->items; l; l = l->next) {
+    ItemData *item_data = l->data;
+    GObject *object = gtk_builder_get_object (builder, item_data->name);
+
+    if (!object)
+      continue;
+
+    if (GTK_IS_HEADER_BAR (object))
       hdy_header_group_add_gtk_header_bar (HDY_HEADER_GROUP (data->object),
                                            GTK_HEADER_BAR (object));
-    }
+  }
+
   g_slist_free_full (data->items, item_data_free);
   g_slice_free (GSListSubParserData, data);
 }
@@ -540,6 +654,120 @@ hdy_header_group_buildable_init (GtkBuildableIface *iface)
   iface->custom_finished = hdy_header_group_buildable_custom_finished;
 }
 
+/**
+ * hdy_header_group_child_get_gtk_header_bar:
+ * @self: a #HdyHeaderGroupChild
+ *
+ * Gets the child #GtkHeaderBar.
+ * Use hdy_header_group_child_get_child_type() to check the child type.
+ *
+ * Returns: (transfer none): the child #GtkHeaderBar, or %NULL in case of error.
+ *
+ * Since: 1.0
+ */
+GtkHeaderBar *
+hdy_header_group_child_get_gtk_header_bar (HdyHeaderGroupChild *self)
+{
+  g_return_val_if_fail (HDY_IS_HEADER_GROUP_CHILD (self), NULL);
+  g_return_val_if_fail (self->type == HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR, NULL);
+
+  return GTK_HEADER_BAR (self->object);
+}
+
+/**
+ * hdy_header_group_child_get_child_type:
+ * @self: a #HdyHeaderGroupChild
+ *
+ * Gets the child type.
+ *
+ * Returns: the child type.
+ *
+ * Since: 1.0
+ */
+HdyHeaderGroupChildType
+hdy_header_group_child_get_child_type (HdyHeaderGroupChild *self)
+{
+  g_return_val_if_fail (HDY_IS_HEADER_GROUP_CHILD (self), HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR);
+
+  return self->type;
+}
+
+/**
+ * hdy_header_group_get_children:
+ * @self: a #HdyHeaderGroup
+ *
+ * Returns the list of children associated with @self.
+ *
+ * Returns: (element-type HdyHeaderGroupChild) (transfer none): the #GSList of
+ *   children. The list is owned by libhandy and should not be modified.
+ *
+ * Since: 1.0
+ */
+GSList *
+hdy_header_group_get_children (HdyHeaderGroup *self)
+{
+  g_return_val_if_fail (HDY_IS_HEADER_GROUP (self), NULL);
+
+  return self->children;
+}
+
+static void
+remove_child (HdyHeaderGroup      *self,
+              HdyHeaderGroupChild *child)
+{
+  self->children = g_slist_remove (self->children, child);
+
+  g_object_weak_unref (G_OBJECT (child), (GWeakNotify) child_destroyed_cb, self);
+
+  g_object_unref (self);
+  g_object_unref (child);
+}
+
+/**
+ * hdy_header_group_remove_gtk_header_bar:
+ * @self: a #HdyHeaderGroup
+ * @header_bar: the #GtkHeaderBar to remove
+ *
+ * Removes @header_bar from @self.
+ *
+ * Since: 1.0
+ */
+void
+hdy_header_group_remove_gtk_header_bar (HdyHeaderGroup *self,
+                                        GtkHeaderBar   *header_bar)
+{
+  HdyHeaderGroupChild *child;
+
+  g_return_if_fail (HDY_IS_HEADER_GROUP (self));
+  g_return_if_fail (GTK_IS_HEADER_BAR (header_bar));
+
+  child = get_child_for_object (self, header_bar);
+
+  g_return_if_fail (child != NULL);
+
+  remove_child (self, child);
+}
+
+/**
+ * hdy_header_group_remove_child:
+ * @self: a #HdyHeaderGroup
+ * @child: the #HdyHeaderGroupChild to remove
+ *
+ * Removes @child from @self.
+ *
+ * Since: 1.0
+ */
+void
+hdy_header_group_remove_child (HdyHeaderGroup      *self,
+                               HdyHeaderGroupChild *child)
+{
+  g_return_if_fail (HDY_IS_HEADER_GROUP (self));
+  g_return_if_fail (HDY_IS_HEADER_GROUP_CHILD (child));
+  g_return_if_fail (g_slist_find (self->children, child) != NULL);
+
+  remove_child (self, child);
+}
+
 /**
  * hdy_header_group_set_decorate_all:
  * @self: a #HdyHeaderGroup
diff --git a/src/hdy-header-group.h b/src/hdy-header-group.h
index af7ae412..50a3127a 100644
--- a/src/hdy-header-group.h
+++ b/src/hdy-header-group.h
@@ -14,10 +14,22 @@
 
 G_BEGIN_DECLS
 
+#define HDY_TYPE_HEADER_GROUP_CHILD (hdy_header_group_child_get_type())
+
+G_DECLARE_FINAL_TYPE (HdyHeaderGroupChild, hdy_header_group_child, HDY, HEADER_GROUP_CHILD, GObject)
+
 #define HDY_TYPE_HEADER_GROUP (hdy_header_group_get_type())
 
 G_DECLARE_FINAL_TYPE (HdyHeaderGroup, hdy_header_group, HDY, HEADER_GROUP, GObject)
 
+typedef enum {
+  HDY_HEADER_GROUP_CHILD_TYPE_GTK_HEADER_BAR,
+} HdyHeaderGroupChildType;
+
+GtkHeaderBar   *hdy_header_group_child_get_gtk_header_bar (HdyHeaderGroupChild *self);
+
+HdyHeaderGroupChildType hdy_header_group_child_get_child_type (HdyHeaderGroupChild *self);
+
 HdyHeaderGroup *hdy_header_group_new (void);
 
 void hdy_header_group_add_gtk_header_bar (HdyHeaderGroup *self,
@@ -27,6 +39,8 @@ GSList *hdy_header_group_get_children (HdyHeaderGroup *self);
 
 void hdy_header_group_remove_gtk_header_bar (HdyHeaderGroup *self,
                                              GtkHeaderBar   *header_bar);
+void hdy_header_group_remove_child          (HdyHeaderGroup      *self,
+                                             HdyHeaderGroupChild *child);
 
 gboolean hdy_header_group_get_decorate_all (HdyHeaderGroup *self);
 void     hdy_header_group_set_decorate_all (HdyHeaderGroup *self,
diff --git a/src/meson.build b/src/meson.build
index 2dfdd172..72f0efcb 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -11,6 +11,7 @@ hdy_public_enum_headers = [
   'hdy-carousel.h',
   'hdy-deck.h',
   'hdy-header-bar.h',
+  'hdy-header-group.h',
   'hdy-leaflet.h',
   'hdy-navigation-direction.h',
   'hdy-squeezer.h',
diff --git a/tests/test-header-group.c b/tests/test-header-group.c
index 5f5913b2..2a902a9f 100644
--- a/tests/test-header-group.c
+++ b/tests/test-header-group.c
@@ -35,29 +35,24 @@ test_hdy_header_group_decorate_all (void)
 static void
 test_hdy_header_group_add_remove (void)
 {
-  HdyHeaderGroup *hg;
-  GtkHeaderBar *bar1, *bar2;
-
-  hg = HDY_HEADER_GROUP (hdy_header_group_new ());
-
-  bar1 = GTK_HEADER_BAR (gtk_header_bar_new ());
-  bar2 = GTK_HEADER_BAR (gtk_header_bar_new ());
+  g_autoptr (HdyHeaderGroup) hg = HDY_HEADER_GROUP (hdy_header_group_new ());
+  g_autoptr (GtkHeaderBar) bar1 = GTK_HEADER_BAR (g_object_ref_sink (gtk_header_bar_new ()));
+  g_autoptr (GtkHeaderBar) bar2 = GTK_HEADER_BAR (g_object_ref_sink (gtk_header_bar_new ()));
 
   g_assert_cmpint (g_slist_length (hdy_header_group_get_children (hg)), ==, 0);
 
-  hdy_header_group_add_gtk_header_bar (hg, GTK_HEADER_BAR (bar1));
+  hdy_header_group_add_gtk_header_bar (hg, bar1);
   g_assert_cmpint (g_slist_length (hdy_header_group_get_children (hg)), ==, 1);
 
-  hdy_header_group_add_gtk_header_bar (hg, GTK_HEADER_BAR (bar2));
+  hdy_header_group_add_gtk_header_bar (hg, bar2);
   g_assert_cmpint (g_slist_length (hdy_header_group_get_children (hg)), ==, 2);
 
-  hdy_header_group_remove_gtk_header_bar (hg, GTK_HEADER_BAR (bar2));
+  hdy_header_group_remove_gtk_header_bar (hg, bar2);
   g_assert_cmpint (g_slist_length (hdy_header_group_get_children (hg)), ==, 1);
 
-  hdy_header_group_remove_gtk_header_bar (hg, GTK_HEADER_BAR (bar1));
-  g_assert_cmpint (g_slist_length (hdy_header_group_get_children (hg)), ==, 0);
+  hdy_header_group_remove_gtk_header_bar (hg, bar1);
 
-  g_object_unref (hg);
+  g_assert_cmpint (g_slist_length (hdy_header_group_get_children (hg)), ==, 0);
 }
 
 


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