comparison src/buddy.c @ 1069:5d4926907b21

[gaim-migrate @ 1079] you can now safely remove groups and buddies from your buddy list. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sun, 05 Nov 2000 12:17:32 +0000
parents ed28707debdc
children b288f17c2fb2
comparison
equal deleted inserted replaced
1068:ed28707debdc 1069:5d4926907b21
97 GSList *members; 97 GSList *members;
98 char *name; 98 char *name;
99 }; 99 };
100 static GSList *shows = NULL; 100 static GSList *shows = NULL;
101 101
102 static struct group_show *find_group_show(char *group);
103 static struct buddy_show *find_buddy_show(struct group_show *gs, char *name);
104 static int group_number(char *group);
105 static int buddy_number(char *group, char *buddy);
106 static struct group_show *new_group_show(char *group);
107 static struct buddy_show *new_buddy_show(struct group_show *gs, struct buddy *buddy);
108 static struct group_show *find_gs_by_bs(struct buddy_show *b);
102 109
103 void destroy_buddy() 110 void destroy_buddy()
104 { 111 {
105 if (blist) 112 if (blist)
106 gtk_widget_destroy(blist); 113 gtk_widget_destroy(blist);
381 void remove_buddy(struct gaim_connection *gc, struct group *rem_g, struct buddy *rem_b) 388 void remove_buddy(struct gaim_connection *gc, struct group *rem_g, struct buddy *rem_b)
382 { 389 {
383 GSList *grp; 390 GSList *grp;
384 GSList *mem; 391 GSList *mem;
385 struct conversation *c; 392 struct conversation *c;
393 struct group_show *gs;
394 struct buddy_show *bs;
386 395
387 struct group *delg; 396 struct group *delg;
388 struct buddy *delb; 397 struct buddy *delb;
389 398
390 /* we assume that gc is not NULL and that the buddy exists somewhere within the 399 /* we assume that gc is not NULL and that the buddy exists somewhere within the
391 * gc's buddy list, therefore we can safely remove it. we need to ensure this 400 * gc's buddy list, therefore we can safely remove it. we need to ensure this
392 * via the UI 401 * via the UI
393 */ 402 */
403
404 gs = find_group_show(rem_g->name);
405 if (gs) {
406 bs = find_buddy_show(gs, rem_b->name);
407 if (bs) {
408 if (g_slist_find(bs->connlist, gc)) {
409 bs->connlist = g_slist_remove(bs->connlist, gc);
410 if (!g_slist_length(bs->connlist)) {
411 gs->members = g_slist_remove(gs->members, bs);
412 if (bs->log_timer > 0)
413 gtk_timeout_remove(bs->log_timer);
414 gtk_widget_destroy(bs->item);
415 g_free(bs->show);
416 g_free(bs->name);
417 g_free(bs);
418 if (!g_slist_length(gs->members)) {
419 shows = g_slist_remove(shows, gs);
420 gtk_widget_destroy(gs->item);
421 g_free(gs->name);
422 g_free(gs);
423 }
424 }
425 }
426 }
427 }
394 428
395 grp = g_slist_find(gc->groups, rem_g); 429 grp = g_slist_find(gc->groups, rem_g);
396 delg = (struct group *)grp->data; 430 delg = (struct group *)grp->data;
397 mem = delg->members; 431 mem = delg->members;
398 432
430 delg = (struct group *)grp->data; 464 delg = (struct group *)grp->data;
431 mem = delg->members; 465 mem = delg->members;
432 466
433 while(delg->members) { 467 while(delg->members) {
434 delb = (struct buddy *)delg->members->data; 468 delb = (struct buddy *)delg->members->data;
435 delg->members = g_slist_remove(delg->members, delb); 469 remove_buddy(gc, delg, delb);
436 c = find_conversation(delb->name);
437 if (c)
438 update_convo_add_button(c);
439 serv_remove_buddy(gc, delb->name); 470 serv_remove_buddy(gc, delb->name);
440 g_free(delb);
441 } 471 }
442 472
443 gc->groups = g_slist_remove(gc->groups, delg); 473 gc->groups = g_slist_remove(gc->groups, delg);
444 g_free(delg); 474 g_free(delg);
445 475
491 521
492 return FALSE; 522 return FALSE;
493 } 523 }
494 524
495 525
526 static void redo_buddy_list() {
527 /* so here we can safely assume that we don't have to add or delete anything, we
528 * just have to go through and reorder everything. remember, nothing is going to
529 * change connections, so we can assume that we don't have to change any user
530 * data or anything. this is just a simple reordering. so calm down. */
531 GSList *s = shows;
532 struct group_show *g;
533 GSList *m;
534 struct buddy_show *b;
535 struct gaim_connection *gc;
536 }
496 537
497 static void edit_tree_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent, 538 static void edit_tree_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
498 GtkCTreeNode *sibling, gpointer data) 539 GtkCTreeNode *sibling, gpointer data)
499 { 540 {
500 gboolean leaf; 541 gboolean leaf;
632 gc->groups = g_slist_append(gc->groups, g); 673 gc->groups = g_slist_append(gc->groups, g);
633 } 674 }
634 } 675 }
635 676
636 do_export( (GtkWidget *) NULL, 0 ); 677 do_export( (GtkWidget *) NULL, 0 );
678
679 redo_buddy_list();
637 } 680 }
638 681
639 682
640 683
641 void build_edit_tree() 684 void build_edit_tree()