+static void
+individual_added (EmpathyRosterView *self,
+ FolksIndividual *individual)
+{
+ GtkWidget *item;
+
+ item = g_hash_table_lookup (self->priv->items, individual);
+ if (item != NULL)
+ return;
+
+ item = empathy_roster_item_new (individual);
+
+ gtk_widget_show (item);
+ gtk_container_add (GTK_CONTAINER (self), item);
+
+ g_hash_table_insert (self->priv->items, individual, item);
+}
+
+static void
+individual_removed (EmpathyRosterView *self,
+ FolksIndividual *individual)
+{
+ GtkWidget *item;
+
+ item = g_hash_table_lookup (self->priv->items, individual);
+ if (item == NULL)
+ return;
+
+ gtk_container_remove (GTK_CONTAINER (self), item);
+
+ g_hash_table_remove (self->priv->items, individual);
+}
+
+static void
+members_changed_cb (EmpathyIndividualManager *manager,
+ const gchar *message,
+ GList *added,
+ GList *removed,
+ TpChannelGroupChangeReason reason,
+ EmpathyRosterView *self)
+{
+ GList *l;
+
+ for (l = added; l != NULL; l = g_list_next (l))
+ {
+ FolksIndividual *individual = l->data;
+
+ individual_added (self, individual);
+ }
+
+ for (l = removed; l != NULL; l = g_list_next (l))
+ {
+ FolksIndividual *individual = l->data;
+
+ individual_removed (self, individual);
+ }
+}
+