# HG changeset patch # User Nathan Walp # Date 1062700840 0 # Node ID d93c6a1fadf264d2564b5cff4890e1295a4650c0 # Parent b3a0b79131dd3476c4504a3e2807512d00304b89 [gaim-migrate @ 7274] this should let you delete contacts, and should make ChipX86 happy by telling the prpls when we move buddies around committer: Tailor Script diff -r b3a0b79131dd -r d93c6a1fadf2 src/blist.c --- a/src/blist.c Thu Sep 04 15:47:09 2003 +0000 +++ b/src/blist.c Thu Sep 04 18:40:40 2003 +0000 @@ -73,6 +73,12 @@ return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); } +static void _gaim_blist_hbuddy_free_key(struct _gaim_hbuddy *hb) +{ + g_free(hb->name); + g_free(hb); +} + static void blist_pref_cb(const char *name, GaimPrefType typ, gpointer value, gpointer data) { struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; @@ -108,8 +114,9 @@ gbl->ui_ops = gaim_get_blist_ui_ops(); - gbl->buddies = g_hash_table_new ((GHashFunc)_gaim_blist_hbuddy_hash, - (GEqualFunc)_gaim_blist_hbuddy_equal); + gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, + (GEqualFunc)_gaim_blist_hbuddy_equal, + (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) gbl->ui_ops->new_list(gbl); @@ -590,6 +597,15 @@ ops->remove(gaimbuddylist, bnode); save = TRUE; + + if(bnode->parent->parent != (GaimBlistNode*)g) { + hb = g_new(struct _gaim_hbuddy, 1); + hb->name = normalize(buddy->name); + hb->account = buddy->account; + hb->group = bnode->parent->parent; + g_hash_table_remove(gaimbuddylist->buddies, &hb); + g_free(hb); + } } if(node && GAIM_BLIST_NODE_IS_BUDDY(node)) { @@ -621,18 +637,12 @@ ((GaimContact*)bnode->parent)->totalsize++; - hb = g_malloc(sizeof(struct _gaim_hbuddy)); + hb = g_new(struct _gaim_hbuddy, 1); hb->name = g_strdup(normalize(buddy->name)); hb->account = buddy->account; hb->group = ((GaimBlistNode*)buddy)->parent->parent; - if (g_hash_table_lookup(gaimbuddylist->buddies, (gpointer)hb)) { - /* This guy already exists */ - g_free(hb->name); - g_free(hb); - } else { - g_hash_table_insert(gaimbuddylist->buddies, (gpointer)hb, (gpointer)buddy); - } + g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); if (ops) ops->update(gaimbuddylist, (GaimBlistNode*)buddy); @@ -683,7 +693,7 @@ { struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; GaimGroup *g; - GaimBlistNode *gnode, *cnode; + GaimBlistNode *gnode, *cnode, *bnode; gboolean save = FALSE; if(!contact) @@ -721,6 +731,25 @@ ops->remove(gaimbuddylist, cnode); save = TRUE; + + if(cnode->parent != gnode) { + for(bnode = cnode->child; bnode; bnode = bnode->next) { + GaimBuddy *b = (GaimBuddy*)bnode; + + struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); + hb->name = g_strdup(normalize(b->name)); + hb->account = b->account; + hb->group = cnode->parent; + + g_hash_table_remove(gaimbuddylist->buddies, &hb); + + hb->group = gnode; + g_hash_table_replace(gaimbuddylist->buddies, hb, b); + + if(b->account->gc) + serv_move_buddy(b, (GaimGroup*)cnode->parent, g); + } + } } if(node && (GAIM_BLIST_NODE_IS_CONTACT(node) || @@ -836,14 +865,13 @@ } } -void gaim_blist_remove_buddy (GaimBuddy *buddy) +void gaim_blist_remove_buddy (GaimBuddy *buddy) { struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; GaimBlistNode *cnode, *node = (GaimBlistNode*)buddy; GaimGroup *group; - struct _gaim_hbuddy hb, *key; - struct buddy *val; + struct _gaim_hbuddy hb; cnode = node->parent; group = (GaimGroup *)cnode->parent; @@ -873,11 +901,7 @@ hb.name = normalize(buddy->name); hb.account = buddy->account; hb.group = ((GaimBlistNode*)buddy)->parent->parent; - if (g_hash_table_lookup_extended(gaimbuddylist->buddies, &hb, (gpointer *)&key, (gpointer *)&val)) { - g_hash_table_remove(gaimbuddylist->buddies, &hb); - g_free(key->name); - g_free(key); - } + g_hash_table_remove(gaimbuddylist->buddies, &hb); if(buddy->timer > 0) g_source_remove(buddy->timer); diff -r b3a0b79131dd -r d93c6a1fadf2 src/dialogs.c --- a/src/dialogs.c Thu Sep 04 15:47:09 2003 +0000 +++ b/src/dialogs.c Thu Sep 04 18:40:40 2003 +0000 @@ -414,6 +414,24 @@ g_free(name); } +static void do_remove_contact(GaimContact *c) +{ + GaimBlistNode *bnode, *cnode; + GaimGroup *g; + + if(!c) + return; + + cnode = (GaimBlistNode *)c; + g = (GaimGroup*)cnode->parent; + for(bnode = cnode->child; bnode; bnode = bnode->next) { + GaimBuddy *b = (GaimBuddy*)bnode; + if(b->account->gc) + serv_remove_buddy(b->account->gc, b->name, g->name); + } + gaim_blist_remove_contact(c); +} + void do_remove_group(GaimGroup *g) { GaimBlistNode *cnode, *bnode; @@ -492,6 +510,28 @@ g_free(text); } +void show_confirm_del_contact(GaimContact *c) +{ + GaimBuddy *b = gaim_contact_get_priority_buddy(c); + + if(!b) + return; + + if(((GaimBlistNode*)c)->child == (GaimBlistNode*)b && + !((GaimBlistNode*)b)->next) { + show_confirm_del(b); + } else { + char *text = g_strdup_printf(_("You are about to remove the contact containing %s and %d other buddies from your buddy list. Do you want to continue?"), + b->name, c->totalsize - 1); + + gaim_request_action(NULL, NULL, _("Remove Contact"), text, -1, c, 2, + _("Remove Contact"), G_CALLBACK(do_remove_contact), + _("Cancel"), NULL); + + g_free(text); + } +} + /*------------------------------------------------------------------------*/ /* The dialog for getting an error */ /*------------------------------------------------------------------------*/ diff -r b3a0b79131dd -r d93c6a1fadf2 src/gaim.h --- a/src/gaim.h Thu Sep 04 15:47:09 2003 +0000 +++ b/src/gaim.h Thu Sep 04 18:40:40 2003 +0000 @@ -46,6 +46,7 @@ extern void show_confirm_del(GaimBuddy *); extern void show_confirm_del_group(GaimGroup *); extern void show_confirm_del_blist_chat(GaimBlistChat *); +extern void show_confirm_del_contact(GaimContact *); /* Functions in gaimrc.c */ extern gint sort_awaymsg_list(gconstpointer, gconstpointer);