static void
place_separator_func (GtkWidget **separator,
                      GtkWidget *child,
                      GtkWidget *before,
                      gpointer user_data)
{
  gboolean need_separator;
  Place *place, *place_before;
  gchar *text;
  GtkWidget *w;

  need_separator = FALSE;
  place = g_object_get_data (G_OBJECT (child), "place");

  if (before != NULL)
    {
      place_before = g_object_get_data (G_OBJECT (before), "place");
      if (place_before->place_type < place->place_type)
        /* use a separator before the first item of a new type */
        need_separator = TRUE;
    }
  else
    {
      /* always put a separator before the first item */
      need_separator = TRUE;
    }

  if (need_separator && *separator == NULL)
    {
      text = g_strdup_printf ("<b>%s</b>", get_heading_name (place->place_type));
      w = gtk_label_new (NULL);
      g_object_set (w,
                    "margin-top", 6,
                    "margin-right", 10,
                    "margin-bottom", 6,
                    "margin-left", 10,
                    NULL);
      gtk_label_set_markup (GTK_LABEL (w), text);
      gtk_widget_set_halign (w, GTK_ALIGN_START);
      gtk_style_context_add_class (gtk_widget_get_style_context (w), "dim-label");

      g_object_ref_sink (w);
      *separator = w;

      g_free (text);
    }
  else if (!need_separator && *separator != NULL)
    {
      gtk_widget_destroy (*separator);
    }
}
static void
place_header_func (GtkListBoxRow *row,
                   GtkListBoxRow *before,
                   gpointer user_data)
{
  gboolean need_separator;
  GtkWidget *current;
  Place *place, *place_before;
  gchar *text;
  GtkWidget *w;

  need_separator = FALSE;
  place = g_object_get_data (G_OBJECT (row), "place");

  if (before != NULL)
    {
      place_before = g_object_get_data (G_OBJECT (before), "place");
      if (place_before->place_type < place->place_type)
        /* use a separator before the first item of a new type */
        need_separator = TRUE;
    }
  else
    {
      /* always put a separator before the first item */
      need_separator = TRUE;
    }

  current = gtk_list_box_row_get_header (row);
  if (need_separator && current == NULL)
    {
      text = g_strdup_printf ("<b>%s</b>", get_heading_name (place->place_type));
      w = gtk_label_new (NULL);
      g_object_set (w,
                    "margin-top", 6,
                    "margin-end", 10,
                    "margin-bottom", 6,
                    "margin-start", 10,
                    NULL);
      gtk_label_set_markup (GTK_LABEL (w), text);
      gtk_widget_set_halign (w, GTK_ALIGN_START);
      gtk_style_context_add_class (gtk_widget_get_style_context (w), "dim-label");

      gtk_list_box_row_set_header (row, w);

      g_free (text);
    }
  else if (!need_separator && current != NULL)
    {
      gtk_list_box_row_set_header (row, NULL);
    }
}