From 5d23323a7bf8a7a23908082771e3265ce93e6f7c Mon Sep 17 00:00:00 2001
From: Tristan Matthews <tristan.matthews@savoirfairelinux.com>
Date: Tue, 15 May 2012 11:49:55 -0400
Subject: [PATCH] * #10736: calltree: detach participants, don't detach
 non-participants

---
 gnome/src/contacts/calltree.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/gnome/src/contacts/calltree.c b/gnome/src/contacts/calltree.c
index 7063be4991..2be42dc81c 100644
--- a/gnome/src/contacts/calltree.c
+++ b/gnome/src/contacts/calltree.c
@@ -1166,20 +1166,24 @@ static void cleanup_popup_data(PopupData **data)
     }
 }
 
+static gboolean
+has_parent(GtkTreeModel *model, GtkTreeIter *child)
+{
+    GtkTreeIter parent;
+    return gtk_tree_model_iter_parent(model, &parent, child);
+}
 
 static gboolean try_detach(GtkTreeModel *model, GtkTreeIter *source_iter, GtkTreeIter *dest_iter)
 {
-    GValue source_val = G_VALUE_INIT;
-    gtk_tree_model_get_value(model, source_iter, COLUMN_ID, &source_val);
-    const gchar *source_ID = g_value_get_string(&source_val);
-    callable_obj_t *source_call = calllist_get_call(current_calls_tab, source_ID);
     gboolean result = FALSE;
-    GtkTreeIter iter_parent;
-    if (source_call && source_call->_confID && !gtk_tree_model_iter_parent(model, &iter_parent, dest_iter)) {
+    if (has_parent(model, source_iter) && !has_parent(model, dest_iter)) {
+        GValue source_val = G_VALUE_INIT;
+        gtk_tree_model_get_value(model, source_iter, COLUMN_ID, &source_val);
+        const gchar *source_ID = g_value_get_string(&source_val);
         sflphone_detach_participant(source_ID);
         result = TRUE;
+        g_value_unset(&source_val);
     }
-    g_value_unset(&source_val);
     return result;
 }
 
@@ -1194,9 +1198,12 @@ handle_drop_into(GtkTreeModel *model, GtkTreeIter *source_iter, GtkTreeIter *des
     gtk_tree_model_get_value(model, dest_iter, COLUMN_ID, &dest_val);
     const gchar *dest_ID = g_value_get_string(&dest_val);
 
-    GtkTreeIter iter_parent;
     gboolean result = FALSE;
-    if (!gtk_tree_model_iter_parent(model, &iter_parent, dest_iter)) {
+
+    if (has_parent(model, source_iter)) {
+        DEBUG("Source is participant, should only be detached");
+        result = FALSE;
+    } else if (!has_parent(model, dest_iter)) {
         if (is_conference(model, dest_iter)) {
             if (is_conference(model, source_iter)) {
                 DEBUG("dropped conference on conference, merging conferences");
-- 
GitLab