diff --git a/gnome/src/actions.c b/gnome/src/actions.c index cf3cdcd9dd32c1bb98ed2e7a58404e0cda25ed7c..980b51306da83a7bf4bf82fc5722a5f473f04656 100644 --- a/gnome/src/actions.c +++ b/gnome/src/actions.c @@ -181,7 +181,7 @@ sflphone_hung_up(callable_obj_t * c) DEBUG("%s", __PRETTY_FUNCTION__); calllist_remove_call(current_calls_tab, c->_callID); - calltree_remove_call(current_calls_tab, c->_callID, FALSE); + calltree_remove_call(current_calls_tab, c->_callID); c->_state = CALL_STATE_DIALING; call_remove_all_errors(c); update_actions(); @@ -395,7 +395,8 @@ sflphone_pick_up() case CALL_STATE_TRANSFER: dbus_transfer(selectedCall); time(&selectedCall->_time_stop); - calltree_remove_call(current_calls_tab, selectedCall->_callID, TRUE); + calltree_remove_call(current_calls_tab, selectedCall->_callID); + update_actions(); calllist_remove_call(current_calls_tab, selectedCall->_callID); break; case CALL_STATE_CURRENT: @@ -694,7 +695,8 @@ sflphone_keypad(guint keyval, gchar * key) case GDK_KP_Enter: dbus_transfer(c); time(&c->_time_stop); - calltree_remove_call(current_calls_tab, c->_callID, TRUE); + calltree_remove_call(current_calls_tab, c->_callID); + update_actions(); break; case GDK_Escape: sflphone_unset_transfer(); @@ -820,7 +822,7 @@ sflphone_detach_participant(const gchar* callID) } im_widget_update_state(IM_WIDGET(selectedCall->_im_widget), TRUE); - calltree_remove_call(current_calls_tab, selectedCall->_callID, TRUE); + calltree_remove_call(current_calls_tab, selectedCall->_callID); calltree_add_call(current_calls_tab, selectedCall, NULL); dbus_detach_participant(selectedCall->_callID); } diff --git a/gnome/src/contacts/calllist.c b/gnome/src/contacts/calllist.c index 398b06a369936a55a9ca8ddda4cb7c0e010f5538..fb54e10cf06648dec203cf0d0deb37b297532644 100644 --- a/gnome/src/contacts/calllist.c +++ b/gnome/src/contacts/calllist.c @@ -136,7 +136,7 @@ calllist_clean_history(void) for (guint i = 0; i < size; i++) { callable_obj_t * c = calllist_get_nth(history_tab, i); if (c) - calltree_remove_call(history_tab, c->_callID, TRUE); + calltree_remove_call(history_tab, c->_callID); } calllist_reset(history_tab); @@ -146,7 +146,7 @@ void calllist_remove_from_history(callable_obj_t* c) { calllist_remove_call(history_tab, c->_callID); - calltree_remove_call(history_tab, c->_callID, TRUE); + calltree_remove_call(history_tab, c->_callID); } void diff --git a/gnome/src/contacts/calltree.c b/gnome/src/contacts/calltree.c index 3942b52f937debaafcf25039d7fb32c543187887..0c45b7c6e05eeb35007bf535c219ca13609b0df2 100644 --- a/gnome/src/contacts/calltree.c +++ b/gnome/src/contacts/calltree.c @@ -506,31 +506,28 @@ calltree_create(calltab_t* tab, int searchbar_type) gtk_widget_show(tab->tree); } +static gboolean +remove_element_if_match(GtkTreeModel *model, GtkTreePath *path UNUSED, GtkTreeIter *iter, gpointer data) +{ + const gchar *target_id = (const gchar *) data; + gchar *id; + gtk_tree_model_get(model, iter, COLUMN_ID, &id, -1); + gboolean result = FALSE; + if (g_strcmp0(id, target_id) == 0) { + gtk_tree_store_remove(GTK_TREE_STORE(model), iter); + result = TRUE; // stop iterating, we found it + } + g_free(id); -static void -calltree_remove_call_recursive(calltab_t* tab, const gchar *target_id, GtkTreeIter *parent) + return result; +} + +void +calltree_remove_call(calltab_t* tab, const gchar *target_id) { GtkTreeStore *store = tab->store; GtkTreeModel *model = GTK_TREE_MODEL(store); - - int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), parent); - - for (int i = 0; i < nbChild; i++) { - GtkTreeIter child; - - if (gtk_tree_model_iter_nth_child(model, &child, parent, i)) { - if (gtk_tree_model_iter_has_child(model, &child)) - calltree_remove_call_recursive(tab, target_id, &child); - - gchar *id; - gtk_tree_model_get(model, &child, COLUMN_ID, &id, -1); - - if (g_strcmp0(id, target_id) == 0) - gtk_tree_store_remove(store, &child); - - g_free(id); - } - } + gtk_tree_model_foreach(model, remove_element_if_match, (gpointer) target_id); /* invalidate selected call if it was our target */ callable_obj_t *sel = calltab_get_selected_call(tab); @@ -540,14 +537,6 @@ calltree_remove_call_recursive(calltab_t* tab, const gchar *target_id, GtkTreeIt statusbar_update_clock(""); } -void -calltree_remove_call(calltab_t* tab, const gchar *id, gboolean do_update_actions) -{ - calltree_remove_call_recursive(tab, id, NULL); - if (do_update_actions) - update_actions(); -} - GdkPixbuf *history_state_to_pixbuf(const gchar *history_state) { gchar *svg_filename = g_strconcat(ICONS_DIR, "/", history_state, ".svg", NULL); @@ -1004,7 +993,7 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) const gchar * const call_id = (gchar *) part->data; callable_obj_t *call = calllist_get_call(current_calls_tab, call_id); - calltree_remove_call(current_calls_tab, call->_callID, FALSE); + calltree_remove_call(current_calls_tab, call->_callID); calltree_add_call(current_calls_tab, call, &iter); } @@ -1209,7 +1198,7 @@ handle_drop_into(GtkTreeModel *model, GtkTreeIter *source_iter, GtkTreeIter *des result = TRUE; } else { DEBUG("dropped call on call, creating new conference or transferring"); - calltree_remove_call(current_calls_tab, source_ID, FALSE); + calltree_remove_call(current_calls_tab, source_ID); callable_obj_t *source_call = calllist_get_call(current_calls_tab, source_ID); calltree_add_call(current_calls_tab, source_call, NULL); cleanup_popup_data(&popup_data); @@ -1313,8 +1302,9 @@ menuitem_response(gchar * string) if (g_strcmp0(string, SFL_CREATE_CONFERENCE) == 0) { dbus_join_participant(popup_data->source_ID, popup_data->dest_ID); - calltree_remove_call(current_calls_tab, popup_data->source_ID, TRUE); - calltree_remove_call(current_calls_tab, popup_data->dest_ID, TRUE); + calltree_remove_call(current_calls_tab, popup_data->source_ID); + calltree_remove_call(current_calls_tab, popup_data->dest_ID); + update_actions(); } else if (g_strcmp0(string, SFL_TRANSFER_CALL) == 0) { callable_obj_t * source_call = calllist_get_call(current_calls_tab, popup_data->source_ID); callable_obj_t * dest_call = calllist_get_call(current_calls_tab, popup_data->dest_ID); @@ -1322,7 +1312,7 @@ menuitem_response(gchar * string) source_call->_peer_number, dest_call->_peer_number); dbus_attended_transfer(source_call, dest_call); - calltree_remove_call(current_calls_tab, popup_data->source_ID, TRUE); + calltree_remove_call(current_calls_tab, popup_data->source_ID); } else ERROR("Unknown option in menu %s", string); diff --git a/gnome/src/contacts/calltree.h b/gnome/src/contacts/calltree.h index 1389e22c18aaec31d7e012fae2125b5c73d97477..3191e26751fb0eb71757b66ab3d6f2d886eb33ff 100644 --- a/gnome/src/contacts/calltree.h +++ b/gnome/src/contacts/calltree.h @@ -83,7 +83,7 @@ calltree_update_call (calltab_t *, callable_obj_t *); * @param c The ID of the call to remove */ void -calltree_remove_call(calltab_t *, const gchar*, gboolean do_update_actions); +calltree_remove_call(calltab_t *, const gchar*); /** * Add a callable object to history treeview diff --git a/gnome/src/uimanager.c b/gnome/src/uimanager.c index 8010757981da22d18dd54e37c43bdbb0f2ab1c9a..eda8eef7ea7c5a5603644f3ee6188e2e0e0b7408 100644 --- a/gnome/src/uimanager.c +++ b/gnome/src/uimanager.c @@ -847,6 +847,7 @@ remove_from_history(void * foo UNUSED) } calllist_remove_from_history(call); + update_actions(); } static void