Mercurial > pidgin.yaz
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 |