aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-individual-store.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk/empathy-individual-store.c')
-rw-r--r--libempathy-gtk/empathy-individual-store.c118
1 files changed, 39 insertions, 79 deletions
diff --git a/libempathy-gtk/empathy-individual-store.c b/libempathy-gtk/empathy-individual-store.c
index d21a9d50b..a499bf1cc 100644
--- a/libempathy-gtk/empathy-individual-store.c
+++ b/libempathy-gtk/empathy-individual-store.c
@@ -73,9 +73,9 @@ typedef struct
GHashTable *status_icons;
/* List of owned GCancellables for each pending avatar load operation */
GList *avatar_cancellables;
- /* Hash: FolksIndividual* -> GQueue (GtkTreeRowReference) */
+ /* Hash: FolksIndividual* -> GQueue (GtkTreeIter *) */
GHashTable *folks_individual_cache;
- /* Hash: char *groupname -> GtkTreeRowReference *row */
+ /* Hash: char *groupname -> GtkTreeIter * */
GHashTable *empathy_group_cache;
} EmpathyIndividualStorePriv;
@@ -205,8 +205,6 @@ add_individual_to_store (GtkTreeStore *self,
EmpathyIndividualStorePriv *priv = GET_PRIV (self);
gboolean can_audio_call, can_video_call;
const gchar * const *types;
- GtkTreeRowReference *row_ref;
- GtkTreePath *path;
GQueue *queue;
individual_can_audio_video_call (individual, &can_audio_call,
@@ -225,21 +223,18 @@ add_individual_to_store (GtkTreeStore *self,
EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, types,
-1);
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), iter);
- row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (self), path);
queue = g_hash_table_lookup (priv->folks_individual_cache, individual);
if (queue)
{
- g_queue_push_tail (queue, row_ref);
+ g_queue_push_tail (queue, gtk_tree_iter_copy (iter));
}
else
{
queue = g_queue_new ();
- g_queue_push_tail (queue, row_ref);
+ g_queue_push_tail (queue, gtk_tree_iter_copy (iter));
g_hash_table_insert (priv->folks_individual_cache, individual,
queue);
}
- gtk_tree_path_free (path);
}
static void
@@ -254,15 +249,13 @@ individual_store_get_group (EmpathyIndividualStore *self,
GtkTreeModel *model;
GtkTreeIter iter_group;
GtkTreeIter iter_separator;
- GtkTreeRowReference *row_ref;
+ GtkTreeIter *iter;
model = GTK_TREE_MODEL (self);
- row_ref = g_hash_table_lookup (priv->empathy_group_cache, name);
+ iter = g_hash_table_lookup (priv->empathy_group_cache, name);
- if (row_ref == NULL)
+ if (iter == NULL)
{
- GtkTreePath *path;
-
if (created)
*created = TRUE;
@@ -276,11 +269,8 @@ individual_store_get_group (EmpathyIndividualStore *self,
EMPATHY_INDIVIDUAL_STORE_COL_IS_FAKE_GROUP, is_fake_group,
-1);
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter_group);
- row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (self), path);
- g_hash_table_insert (priv->empathy_group_cache,
- g_strdup (name), row_ref);
- gtk_tree_path_free (path);
+ g_hash_table_insert (priv->empathy_group_cache, g_strdup (name),
+ gtk_tree_iter_copy (&iter_group));
if (iter_group_to_set)
*iter_group_to_set = iter_group;
@@ -295,22 +285,13 @@ individual_store_get_group (EmpathyIndividualStore *self,
}
else
{
- GtkTreePath *path = gtk_tree_row_reference_get_path (row_ref);
- GtkTreeIter iter;
-
- if (!gtk_tree_model_get_iter (model, &iter, path)) {
- gtk_tree_path_free (path);
- return;
- }
- gtk_tree_path_free (path);
-
if (created)
*created = FALSE;
if (iter_group_to_set)
- *iter_group_to_set = iter;
+ *iter_group_to_set = *iter;
- iter_separator = iter;
+ iter_separator = *iter;
if (gtk_tree_model_iter_next (model, &iter_separator))
{
@@ -330,12 +311,10 @@ individual_store_find_contact (EmpathyIndividualStore *self,
FolksIndividual *individual)
{
EmpathyIndividualStorePriv *priv = GET_PRIV (self);
- GtkTreeModel *model;
GQueue *row_refs_queue;
GList *i;
GList *iters_list = NULL;
- model = GTK_TREE_MODEL (self);
row_refs_queue = g_hash_table_lookup (priv->folks_individual_cache,
individual);
if (!row_refs_queue)
@@ -343,16 +322,9 @@ individual_store_find_contact (EmpathyIndividualStore *self,
for (i = g_queue_peek_head_link (row_refs_queue) ; i != NULL ; i = i->next)
{
- GtkTreePath *path = gtk_tree_row_reference_get_path (i->data);
- GtkTreeIter iter;
- if (!gtk_tree_model_get_iter (model, &iter, path))
- {
- gtk_tree_path_free (path);
- continue;
- }
- gtk_tree_path_free (path);
- iters_list = g_list_prepend
- (iters_list, gtk_tree_iter_copy (&iter));
+ GtkTreeIter *iter = i->data;
+
+ iters_list = g_list_prepend (iters_list, gtk_tree_iter_copy (iter));
}
return iters_list;
@@ -383,23 +355,14 @@ individual_store_remove_individual (EmpathyIndividualStore *self,
for (l = g_queue_peek_head_link (row_refs); l; l = l->next)
{
- GtkTreePath *path = gtk_tree_row_reference_get_path (l->data);
- GtkTreeIter iter;
+ GtkTreeIter *iter = l->data;
GtkTreeIter parent;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (self), &iter,
- path))
- {
- gtk_tree_path_free (path);
- continue;
- }
- gtk_tree_path_free (path);
-
/* NOTE: it is only <= 2 here because we have
* separators after the group name, otherwise it
* should be 1.
*/
- if (gtk_tree_model_iter_parent (model, &parent, &iter) &&
+ if (gtk_tree_model_iter_parent (model, &parent, iter) &&
gtk_tree_model_iter_n_children (model, &parent) <= 2)
{
gchar *group_name;
@@ -412,7 +375,7 @@ individual_store_remove_individual (EmpathyIndividualStore *self,
}
else
{
- gtk_tree_store_remove (GTK_TREE_STORE (self), &iter);
+ gtk_tree_store_remove (GTK_TREE_STORE (self), iter);
}
}
@@ -954,6 +917,20 @@ individual_personas_changed_cb (FolksIndividual *individual,
g_clear_object (&iter);
}
+static void
+individual_store_favourites_changed_cb (FolksIndividual *individual,
+ GParamSpec *param,
+ EmpathyIndividualStore *self)
+{
+ DEBUG ("Individual %s is %s a favourite",
+ folks_individual_get_id (individual),
+ folks_favourite_details_get_is_favourite (
+ FOLKS_FAVOURITE_DETAILS (individual)) ? "now" : "no longer");
+
+ individual_store_remove_individual (self, individual);
+ individual_store_add_individual (self, individual);
+}
+
void
individual_store_add_individual_and_connect (EmpathyIndividualStore *self,
FolksIndividual *individual)
@@ -972,6 +949,8 @@ individual_store_add_individual_and_connect (EmpathyIndividualStore *self,
(GCallback) individual_store_individual_updated_cb, self);
g_signal_connect (individual, "personas-changed",
(GCallback) individual_personas_changed_cb, self);
+ g_signal_connect (individual, "notify::is-favourite",
+ (GCallback) individual_store_favourites_changed_cb, self);
/* provide an empty set so the callback can assume non-NULL sets */
individual_personas_changed_cb (individual,
@@ -994,6 +973,8 @@ individual_store_disconnect_individual (EmpathyIndividualStore *self,
(GCallback) individual_store_individual_updated_cb, self);
g_signal_handlers_disconnect_by_func (individual,
(GCallback) individual_personas_changed_cb, self);
+ g_signal_handlers_disconnect_by_func (individual,
+ (GCallback) individual_store_favourites_changed_cb, self);
}
void
@@ -1031,20 +1012,6 @@ individual_store_members_changed_cb (EmpathyIndividualManager *manager,
}
static void
-individual_store_favourites_changed_cb (EmpathyIndividualManager *manager,
- FolksIndividual *individual,
- gboolean is_favourite,
- EmpathyIndividualStore *self)
-{
- DEBUG ("Individual %s is %s a favourite",
- folks_individual_get_id (individual),
- is_favourite ? "now" : "no longer");
-
- individual_store_remove_individual (self, individual);
- individual_store_add_individual (self, individual);
-}
-
-static void
individual_store_groups_changed_cb (EmpathyIndividualManager *manager,
FolksIndividual *individual,
gchar *group,
@@ -1087,10 +1054,6 @@ individual_store_manager_setup (gpointer user_data)
G_CALLBACK (individual_store_members_changed_cb), self);
g_signal_connect (priv->manager,
- "favourites-changed",
- G_CALLBACK (individual_store_favourites_changed_cb), self);
-
- g_signal_connect (priv->manager,
"groups-changed",
G_CALLBACK (individual_store_groups_changed_cb), self);
@@ -1169,8 +1132,6 @@ individual_store_dispose (GObject *object)
g_signal_handlers_disconnect_by_func (priv->manager,
G_CALLBACK (individual_store_members_changed_cb), object);
g_signal_handlers_disconnect_by_func (priv->manager,
- G_CALLBACK (individual_store_favourites_changed_cb), object);
- g_signal_handlers_disconnect_by_func (priv->manager,
G_CALLBACK (individual_store_groups_changed_cb), object);
g_object_unref (priv->manager);
@@ -1624,10 +1585,10 @@ individual_store_inhibit_active_cb (EmpathyIndividualStore *self)
}
static void
-g_queue_free_full_row_ref (gpointer data)
+g_queue_free_full_iter (gpointer data)
{
GQueue *queue = (GQueue *) data;
- g_queue_foreach (queue, (GFunc) gtk_tree_row_reference_free, NULL);
+ g_queue_foreach (queue, (GFunc) gtk_tree_iter_free, NULL);
g_queue_free (queue);
}
@@ -1647,10 +1608,9 @@ empathy_individual_store_init (EmpathyIndividualStore *self)
priv->status_icons =
g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
priv->folks_individual_cache = g_hash_table_new_full (NULL, NULL, NULL,
- g_queue_free_full_row_ref);
+ g_queue_free_full_iter);
priv->empathy_group_cache = g_hash_table_new_full (g_str_hash,
- g_str_equal, g_free,
- (GDestroyNotify) gtk_tree_row_reference_free);
+ g_str_equal, g_free, (GDestroyNotify) gtk_tree_iter_free);
individual_store_setup (self);
}