comparison src/buddy.c @ 4695:4bdd9a5fd026

[gaim-migrate @ 5006] This may very well have issues, but it's a slightly better core/ui split, removing global variables and fixing some GTK+ runtime errors and a couple segfaults. It's some progress. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Mon, 10 Mar 2003 18:16:29 +0000
parents 8f523dbb970e
children abec345c8c92
comparison
equal deleted inserted replaced
4694:8f523dbb970e 4695:4bdd9a5fd026
52 52
53 #ifdef _WIN32 53 #ifdef _WIN32
54 #include "win32dep.h" 54 #include "win32dep.h"
55 #endif 55 #endif
56 56
57 static struct gaim_gtk_buddy_list *gtkblist = NULL;
58
57 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node); 59 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node);
58 60
59 /*************************************************** 61 /***************************************************
60 * Callbacks * 62 * Callbacks *
61 ***************************************************/ 63 ***************************************************/
480 } 482 }
481 483
482 /********************************************************************************** 484 /**********************************************************************************
483 * Public API Functions * 485 * Public API Functions *
484 **********************************************************************************/ 486 **********************************************************************************/
487 static void gaim_gtk_blist_new_list(struct gaim_buddy_list *blist)
488 {
489 blist->ui_data = g_new0(struct gaim_gtk_buddy_list, 1);
490 }
491
492 static void gaim_gtk_blist_new_node(GaimBlistNode *node)
493 {
494 node->ui_data = g_new0(struct gaim_gtk_blist_node, 1);
495 }
496
485 static void gaim_gtk_blist_show(struct gaim_buddy_list *list) 497 static void gaim_gtk_blist_show(struct gaim_buddy_list *list)
486 { 498 {
487 GtkItemFactory *ift; 499 GtkItemFactory *ift;
488 GtkCellRenderer *rend; 500 GtkCellRenderer *rend;
489 GtkTreeViewColumn *column; 501 GtkTreeViewColumn *column;
494 if (gtkblist) { 506 if (gtkblist) {
495 gtk_widget_show(gtkblist->window); 507 gtk_widget_show(gtkblist->window);
496 return; 508 return;
497 } 509 }
498 510
499 gtkblist = g_new0(struct gaim_gtk_buddy_list , 1); 511 gtkblist = GAIM_GTK_BLIST(list);
512
500 gtkblist->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 513 gtkblist->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
501 gtk_window_set_title(GTK_WINDOW(gtkblist->window), _("Buddy List")); 514 gtk_window_set_title(GTK_WINDOW(gtkblist->window), _("Buddy List"));
502 515
503 gtkblist->vbox = gtk_vbox_new(FALSE, 6); 516 gtkblist->vbox = gtk_vbox_new(FALSE, 6);
504 gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->vbox); 517 gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->vbox);
606 } 619 }
607 } 620 }
608 621
609 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node) 622 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node)
610 { 623 {
611 GtkTreeIter *iter = node->ui_data; 624 struct gaim_gtk_blist_node *gtknode;
625 GtkTreeIter *iter;
612 gboolean expand = FALSE; 626 gboolean expand = FALSE;
613 627
614 if (!gtkblist) 628 if (!gtkblist)
615 return; 629 return;
630
631 gtknode = GAIM_GTK_BLIST_NODE(node);
632 iter = gtknode->iter;
633
616 634
617 if (!iter) { /* This is a newly added node */ 635 if (!iter) { /* This is a newly added node */
618 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { 636 if (GAIM_BLIST_NODE_IS_BUDDY(node)) {
619 if (((struct buddy*)node)->present) { 637 if (((struct buddy*)node)->present) {
620 if(node->parent && node->parent && !node->parent->ui_data) { 638 if(node->parent && node->parent &&
621 639 !GAIM_GTK_BLIST_NODE(node->parent)->iter) {
640
622 /* This buddy's group has not yet been added. We do that here */ 641 /* This buddy's group has not yet been added. We do that here */
623 642
624 char *mark = g_strdup_printf("<span weight='bold'>%s</span>", ((struct group*)node->parent)->name); 643 char *mark = g_strdup_printf("<span weight='bold'>%s</span>", ((struct group*)node->parent)->name);
625 GtkTreeIter *iter2 = g_new0(GtkTreeIter, 1); 644 GtkTreeIter *iter2 = g_new0(GtkTreeIter, 1);
626 GaimBlistNode *insertat = node->parent->prev; 645 GaimBlistNode *insertat = node->parent->prev;
627 GtkTreeIter *insertatiter = NULL; 646 GtkTreeIter *insertatiter = NULL;
628 647
629 /* We traverse backwards through the buddy list to find the node in the tree to insert it after */ 648 /* We traverse backwards through the buddy list to find the node in the tree to insert it after */
630 while (insertat && !insertat->ui_data) 649 while (insertat && !GAIM_GTK_BLIST_NODE(insertat)->iter)
631 insertat = insertat->prev; 650 insertat = insertat->prev;
651
632 if (insertat) 652 if (insertat)
633 insertatiter = insertat->ui_data; 653 insertatiter = GAIM_GTK_BLIST_NODE(insertat)->iter;
634 654
635 /* This is where we create the node and add it. */ 655 /* This is where we create the node and add it. */
636 gtk_tree_store_insert_after(gtkblist->treemodel, iter2, 656 gtk_tree_store_insert_after(gtkblist->treemodel, iter2,
637 node->parent->parent ? node->parent->parent->ui_data : NULL, insertatiter); 657 node->parent->parent ?
658 GAIM_GTK_BLIST_NODE(node->parent->parent)->iter : NULL, insertatiter);
638 gtk_tree_store_set(gtkblist->treemodel, iter2, 659 gtk_tree_store_set(gtkblist->treemodel, iter2,
639 STATUS_ICON_COLUMN, gtk_widget_render_icon 660 STATUS_ICON_COLUMN, gtk_widget_render_icon
640 (gtkblist->treeview,GTK_STOCK_OPEN,GTK_ICON_SIZE_SMALL_TOOLBAR,NULL), 661 (gtkblist->treeview,GTK_STOCK_OPEN,GTK_ICON_SIZE_SMALL_TOOLBAR,NULL),
641 NAME_COLUMN, mark, 662 NAME_COLUMN, mark,
642 NODE_COLUMN, node->parent, 663 NODE_COLUMN, node->parent,
643 -1); 664 -1);
644 node->parent->ui_data = iter2; 665
666 GAIM_GTK_BLIST_NODE(node->parent)->iter = iter2;
645 expand = TRUE; 667 expand = TRUE;
646 } 668 }
647 iter = g_new0(GtkTreeIter, 1); 669 iter = g_new0(GtkTreeIter, 1);
648 node->ui_data = iter; 670
649 671 GAIM_GTK_BLIST_NODE(node)->iter = iter;
650 gtk_tree_store_insert_after (gtkblist->treemodel, iter, node->parent ? node->parent->ui_data : NULL, 672
651 node->prev ? node->prev->ui_data : NULL); 673 gtk_tree_store_insert_after (gtkblist->treemodel, iter, node->parent ? GAIM_GTK_BLIST_NODE(node->parent)->iter : NULL,
674 node->prev ? GAIM_GTK_BLIST_NODE(node->prev)->iter : NULL);
652 675
653 676
654 if (expand) { /* expand was set to true if this is the first element added to a group. In such case 677 if (expand) { /* expand was set to true if this is the first element added to a group. In such case
655 * we expand the group node */ 678 * we expand the group node */
656 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), node->parent->ui_data); 679 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), GAIM_GTK_BLIST_NODE(node->parent)->iter);
657 gtk_tree_view_expand_row(GTK_TREE_VIEW(gtkblist->treeview), path, TRUE); 680 gtk_tree_view_expand_row(GTK_TREE_VIEW(gtkblist->treeview), path, TRUE);
658 } 681 }
659 node->ui_data = iter; 682
683 GAIM_GTK_BLIST_NODE(node)->iter = iter;
660 } 684 }
661 } 685 }
662 } 686 }
663 687
664 if (GAIM_BLIST_NODE_IS_BUDDY(node) && ((struct buddy*)node)->present) { 688 if (GAIM_BLIST_NODE_IS_BUDDY(node) && ((struct buddy*)node)->present) {
677 BUDDY_ICON_COLUMN, avatar, 701 BUDDY_ICON_COLUMN, avatar,
678 NODE_COLUMN, node, 702 NODE_COLUMN, node,
679 -1); 703 -1);
680 704
681 g_free(mark); 705 g_free(mark);
682 g_object_unref(status); 706
683 if (avatar) { 707 if (status != NULL)
684 g_object_unref(avatar); 708 g_object_unref(status);
685 } 709
686 } else if (GAIM_BLIST_NODE_IS_BUDDY(node) && node->ui_data){ 710 if (avatar != NULL)
687 gtk_tree_store_remove(GTK_TREE_STORE(gtkblist->treemodel), (GtkTreeIter*)(node->ui_data)); 711 g_object_unref(avatar);
688 g_free(node->ui_data); 712
689 node->ui_data = NULL; 713 } else if (GAIM_BLIST_NODE_IS_BUDDY(node) && GAIM_GTK_BLIST_NODE(node)->iter){
714 gtk_tree_store_remove(GTK_TREE_STORE(gtkblist->treemodel), GAIM_GTK_BLIST_NODE(node)->iter);
715
716 g_free(GAIM_GTK_BLIST_NODE(node)->iter);
717 GAIM_GTK_BLIST_NODE(node)->iter = NULL;
690 } 718 }
691 719
692 } 720 }
693 721
694 static void gaim_gtk_blist_remove(struct gaim_buddy_list *list, GaimBlistNode *node) 722 static void gaim_gtk_blist_remove(struct gaim_buddy_list *list, GaimBlistNode *node)
695 { 723 {
724 struct gaim_gtk_blist_node *gtknode;
725
696 if (!node->ui_data) 726 if (!node->ui_data)
697 return; 727 return;
698 gtk_tree_store_remove(gtkblist->treemodel, (GtkTreeIter*)(node->ui_data)); 728
729 gtknode = (struct gaim_gtk_blist_node *)node->ui_data;
730
731 if (gtknode->timer > 0)
732 g_source_remove(gtknode->timer);
733
734 if (gtknode->iter != NULL)
735 gtk_tree_store_remove(gtkblist->treemodel, gtknode->iter);
699 } 736 }
700 737
701 static void gaim_gtk_blist_destroy(struct gaim_buddy_list *list) 738 static void gaim_gtk_blist_destroy(struct gaim_buddy_list *list)
702 { 739 {
703 gtk_widget_destroy(gtkblist->window); 740 gtk_widget_destroy(gtkblist->window);
711 gtk_widget_hide(gtkblist->window); 748 gtk_widget_hide(gtkblist->window);
712 } 749 }
713 750
714 static struct gaim_blist_ui_ops blist_ui_ops = 751 static struct gaim_blist_ui_ops blist_ui_ops =
715 { 752 {
753 gaim_gtk_blist_new_list,
754 gaim_gtk_blist_new_node,
716 gaim_gtk_blist_show, 755 gaim_gtk_blist_show,
717 gaim_gtk_blist_update, 756 gaim_gtk_blist_update,
718 gaim_gtk_blist_remove, 757 gaim_gtk_blist_remove,
719 gaim_gtk_blist_destroy, 758 gaim_gtk_blist_destroy,
720 gaim_gtk_blist_set_visible 759 gaim_gtk_blist_set_visible