| 545 |
435 |
| 546 gboolean edit_drag_compare_func (GtkCTree *ctree, GtkCTreeNode *source_node, |
436 gboolean edit_drag_compare_func (GtkCTree *ctree, GtkCTreeNode *source_node, |
| 547 GtkCTreeNode *new_parent, GtkCTreeNode *new_sibling) |
437 GtkCTreeNode *new_parent, GtkCTreeNode *new_sibling) |
| 548 { |
438 { |
| 549 gboolean leaf; |
439 gboolean leaf; |
| 550 |
440 struct gaim_connection *gc, *pc; |
| 551 gtk_ctree_get_node_info (ctree, source_node, NULL, |
441 char *source; |
| |
442 char *parent; |
| |
443 |
| |
444 gtk_ctree_get_node_info (ctree, source_node, &source, |
| 552 NULL, NULL, NULL, NULL, NULL, &leaf, NULL); |
445 NULL, NULL, NULL, NULL, NULL, &leaf, NULL); |
| 553 |
446 |
| 554 |
447 gc = (struct gaim_connection *)gtk_ctree_node_get_row_data(GTK_CTREE(ctree), source_node); |
| 555 if (leaf) { |
448 |
| |
449 if (!strcmp(gc->username, source)) { |
| 556 if (!new_parent) |
450 if (!new_parent) |
| 557 return FALSE; |
451 return TRUE; |
| 558 } else { |
452 } else if (leaf) { |
| 559 |
453 if (new_parent) { |
| 560 if (new_parent) |
454 gtk_ctree_get_node_info (ctree, new_parent, &parent, |
| 561 return FALSE; |
455 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| 562 |
456 pc = (struct gaim_connection *)gtk_ctree_node_get_row_data(GTK_CTREE(ctree), |
| 563 } |
457 new_parent); |
| 564 |
458 if (strcmp(parent, pc->username)) |
| 565 return TRUE; |
459 return TRUE; |
| |
460 } |
| |
461 } else /* group */ { |
| |
462 if (g_slist_length(connections) > 1 && new_parent) { |
| |
463 gtk_ctree_get_node_info (ctree, new_parent, &parent, |
| |
464 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| |
465 pc = (struct gaim_connection *)gtk_ctree_node_get_row_data(GTK_CTREE(ctree), |
| |
466 new_parent); |
| |
467 if (!strcmp(parent, pc->username)) |
| |
468 return TRUE; |
| |
469 } else if (g_slist_length(connections) == 1 && !new_parent) |
| |
470 return TRUE; |
| |
471 } |
| |
472 |
| |
473 return FALSE; |
| 566 } |
474 } |
| 567 |
475 |
| 568 |
476 |
| 569 |
477 |
| 570 static void edit_tree_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent, |
478 static void edit_tree_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent, |
| 571 GtkCTreeNode *sibling, gpointer data) |
479 GtkCTreeNode *sibling, gpointer data) |
| 572 { |
480 { |
| 573 char *source; |
481 gboolean leaf; |
| 574 char *target1; |
482 char *source = ""; |
| 575 char *target2; |
483 char *target1 = ""; |
| |
484 char *target2 = ""; |
| |
485 struct gaim_connection *gc, *pc = NULL, *sc = NULL; |
| |
486 |
| |
487 gc = (struct gaim_connection *)gtk_ctree_node_get_row_data(GTK_CTREE(ctree), child); |
| 576 |
488 |
| 577 gtk_ctree_get_node_info (ctree, child, &source, |
489 gtk_ctree_get_node_info (ctree, child, &source, |
| 578 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
490 NULL, NULL, NULL, NULL, NULL, &leaf, NULL); |
| 579 if (parent) |
491 if (parent) { |
| 580 gtk_ctree_get_node_info (ctree, parent, &target1, |
492 gtk_ctree_get_node_info (ctree, parent, &target1, |
| 581 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
493 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| 582 if (sibling) |
494 pc = (struct gaim_connection *)gtk_ctree_node_get_row_data(GTK_CTREE(ctree), parent); |
| |
495 } |
| |
496 |
| |
497 if (sibling) { |
| 583 gtk_ctree_get_node_info (ctree, sibling, &target2, |
498 gtk_ctree_get_node_info (ctree, sibling, &target2, |
| 584 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
499 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| 585 |
500 sc = (struct gaim_connection *)gtk_ctree_node_get_row_data(GTK_CTREE(ctree), sibling); |
| 586 |
501 } |
| 587 if (!parent) { |
502 |
| 588 GSList *grps; |
503 if (!strcmp(source, gc->username)) { |
| 589 GList *buds; |
504 /* not that it particularly matters which order the connections |
| |
505 * are in, but just for debugging sake, i guess.... */ |
| |
506 connections = g_slist_remove(connections, gc); |
| |
507 if (sibling) { |
| |
508 int pos = g_slist_index(connections, sc); |
| |
509 if (pos) |
| |
510 connections = g_slist_insert(connections, gc, pos); |
| |
511 else |
| |
512 connections = g_slist_prepend(connections, gc); |
| |
513 } else |
| |
514 connections = g_slist_append(connections, gc); |
| |
515 } else if (leaf) { |
| |
516 /* we moved a buddy. hopefully we just changed groups or positions or something. |
| |
517 * if we changed connections, we copy the buddy to the new connection. if the new |
| |
518 * connection already had the buddy in its buddy list but in a different group, |
| |
519 * we change the group that the buddy is in */ |
| |
520 struct group *new_g, *old_g; |
| |
521 struct buddy *b, *s = NULL; |
| |
522 int pos; |
| |
523 |
| |
524 if (gc != pc) { |
| |
525 /* we changed connections */ |
| |
526 struct buddy *a; |
| |
527 |
| |
528 a = find_buddy(pc, source); |
| |
529 |
| |
530 if (a) { |
| |
531 /* the buddy is in the new connection, so we'll remove it from |
| |
532 * its current group and add it to the proper group below */ |
| |
533 struct group *og; |
| |
534 og = find_group_by_buddy(pc, source); |
| |
535 og->members = g_slist_remove(og->members, a); |
| |
536 } else { |
| |
537 /* we don't have this buddy yet; let's add him */ |
| |
538 serv_add_buddy(pc, source); |
| |
539 } |
| |
540 } |
| |
541 |
| |
542 b = find_buddy(gc, source); |
| |
543 new_g = find_group(pc, target1); |
| |
544 old_g = find_group_by_buddy(gc, source); |
| |
545 |
| |
546 if (gc == pc) /* this is the same connection, so we'll remove it from its old group */ |
| |
547 old_g->members = g_slist_remove(old_g->members, b); |
| |
548 |
| |
549 if (sibling) { |
| |
550 s = find_buddy(sc, target2); |
| |
551 pos = g_slist_index(new_g->members, s); |
| |
552 if (pos) |
| |
553 new_g->members = g_slist_insert(new_g->members, b, pos); |
| |
554 else |
| |
555 new_g->members = g_slist_prepend(new_g->members, b); |
| |
556 } else |
| |
557 new_g->members = g_slist_append(new_g->members, b); |
| |
558 |
| |
559 if (pc != gc) |
| |
560 build_edit_tree(); |
| |
561 } else /* group */ { |
| |
562 /* move the group. if moving connections, copy the group, and each buddy in the |
| |
563 * group. if the buddy exists in the new connection, leave it where it is. */ |
| |
564 |
| 590 struct group *g, *g2; |
565 struct group *g, *g2; |
| 591 GList *tmp, *mem; |
566 int pos; |
| 592 int pos, count; |
567 |
| 593 struct buddy *b; |
568 if (g_slist_length(connections) > 1) { |
| 594 /* Okay we've moved group order... */ |
569 g = find_group(pc, source); |
| 595 |
570 if (!g) |
| 596 g = find_group(source); |
571 g = add_group(pc, source); |
| 597 |
572 |
| 598 gtk_widget_ref(g->tree); |
573 pc->groups = g_slist_remove(pc->groups, g); |
| 599 |
574 |
| 600 buds = g->members; |
575 if (sibling) { |
| 601 while(buds) { |
576 g2 = find_group(pc, target2); |
| 602 b = (struct buddy *)buds->data; |
577 pos = g_slist_index(pc->groups, g2); |
| 603 gtk_widget_ref(b->item); |
578 if (pos) |
| 604 gtk_widget_ref(b->label); |
579 pc->groups = g_slist_insert(pc->groups, g, pos); |
| 605 gtk_widget_ref(b->idletime); |
580 else |
| 606 gtk_widget_ref(b->pix); |
581 pc->groups = g_slist_prepend(pc->groups, g); |
| 607 buds = buds->next; |
582 } else |
| |
583 pc->groups = g_slist_append(pc->groups, g); |
| |
584 |
| |
585 if (pc != gc) { |
| |
586 GSList *mem; |
| |
587 struct buddy *b; |
| |
588 g2 = find_group(gc, source); |
| |
589 |
| |
590 mem = g2->members; |
| |
591 while (mem) { |
| |
592 b = (struct buddy *)mem->data; |
| |
593 if (!find_buddy(pc, b->name)) |
| |
594 add_buddy(pc, g->name, b->name, b->show); |
| |
595 mem = mem->next; |
| |
596 } |
| |
597 |
| |
598 build_edit_tree(); |
| |
599 } |
| |
600 } else { |
| |
601 g = find_group(gc, source); |
| |
602 |
| |
603 gc->groups = g_slist_remove(gc->groups, g); |
| |
604 |
| |
605 if (sibling) { |
| |
606 g2 = find_group(gc, target2); |
| |
607 pos = g_slist_index(gc->groups, g2); |
| |
608 if (pos) |
| |
609 gc->groups = g_slist_insert(gc->groups, g, pos); |
| |
610 else |
| |
611 gc->groups = g_slist_prepend(gc->groups, g); |
| |
612 } else |
| |
613 gc->groups = g_slist_append(gc->groups, g); |
| 608 } |
614 } |
| 609 |
615 } |
| 610 |
616 |
| 611 |
617 do_export( (GtkWidget *) NULL, 0 ); |
| 612 |
|
| 613 pos = g_list_index(GTK_TREE(buddies)->children, g->item); |
|
| 614 |
|
| 615 tmp = g_list_append(NULL, g->item); |
|
| 616 gtk_tree_remove_items(GTK_TREE(buddies), tmp); |
|
| 617 g_list_free(tmp); |
|
| 618 |
|
| 619 groups = g_slist_remove(groups, g); |
|
| 620 |
|
| 621 g->item = gtk_tree_item_new_with_label(g->name); |
|
| 622 mem = g->members; count = 0; |
|
| 623 while (mem && !count) { |
|
| 624 b = (struct buddy *)mem->data; |
|
| 625 if (b->present) count++; |
|
| 626 mem = mem->next; |
|
| 627 } |
|
| 628 if (!count) gtk_widget_show(g->item); |
|
| 629 |
|
| 630 if (sibling) { |
|
| 631 g2 = find_group(target2); |
|
| 632 pos = g_slist_index(groups, g2); |
|
| 633 if (pos == 0) { |
|
| 634 groups = g_slist_prepend(groups, g); |
|
| 635 gtk_tree_prepend(GTK_TREE(buddies), g->item); |
|
| 636 } else { |
|
| 637 groups = g_slist_insert(groups, g, pos); |
|
| 638 gtk_tree_insert(GTK_TREE(buddies), g->item, pos); |
|
| 639 } |
|
| 640 |
|
| 641 } else { |
|
| 642 groups = g_slist_append(groups, g); |
|
| 643 gtk_tree_append(GTK_TREE(buddies), g->item); |
|
| 644 |
|
| 645 } |
|
| 646 |
|
| 647 gtk_tree_item_set_subtree (GTK_TREE_ITEM(g->item), g->tree); |
|
| 648 gtk_tree_item_expand (GTK_TREE_ITEM(g->item)); |
|
| 649 gtk_signal_connect(GTK_OBJECT(g->item), "button_press_event", |
|
| 650 GTK_SIGNAL_FUNC(handle_click_group), |
|
| 651 NULL); |
|
| 652 gtk_object_set_user_data(GTK_OBJECT(g->item), NULL); |
|
| 653 |
|
| 654 gtk_widget_unref(g->tree); |
|
| 655 |
|
| 656 update_num_groups(); |
|
| 657 |
|
| 658 buds = g->members; |
|
| 659 |
|
| 660 while(buds) { |
|
| 661 b = (struct buddy *)buds->data; |
|
| 662 set_buddy(b); |
|
| 663 buds = buds->next; |
|
| 664 } |
|
| 665 |
|
| 666 grps = groups; |
|
| 667 while(grps) { |
|
| 668 g = (struct group *)grps->data; |
|
| 669 grps = g_slist_next(grps); |
|
| 670 } |
|
| 671 |
|
| 672 } else { |
|
| 673 struct group *new_g, *old_g; |
|
| 674 struct buddy *b, *s; |
|
| 675 GtkWidget *gtree; |
|
| 676 GtkWidget *owner; |
|
| 677 GList *temp; |
|
| 678 int pos; |
|
| 679 |
|
| 680 b = find_buddy(source); |
|
| 681 new_g = find_group(target1); |
|
| 682 old_g = find_group_by_buddy(source); |
|
| 683 gtree = old_g->tree; |
|
| 684 if (sibling) |
|
| 685 s = find_buddy(target2); |
|
| 686 else |
|
| 687 s = NULL; |
|
| 688 |
|
| 689 old_g->members = g_list_remove(old_g->members, b); |
|
| 690 |
|
| 691 gtk_widget_ref(b->item); |
|
| 692 gtk_widget_ref(b->label); |
|
| 693 gtk_widget_ref(b->pix); |
|
| 694 gtk_widget_ref(b->idletime); |
|
| 695 gtk_widget_ref(gtree); |
|
| 696 |
|
| 697 owner = GTK_TREE(gtree)->tree_owner; |
|
| 698 |
|
| 699 temp = g_list_append(NULL, b->item); |
|
| 700 gtk_tree_remove_items(GTK_TREE(old_g->tree), temp); |
|
| 701 g_list_free(temp); |
|
| 702 |
|
| 703 if (gtree->parent == NULL){ |
|
| 704 gtk_tree_item_set_subtree (GTK_TREE_ITEM(owner), gtree); |
|
| 705 gtk_tree_item_expand (GTK_TREE_ITEM(owner)); |
|
| 706 } |
|
| 707 |
|
| 708 if (!sibling) { |
|
| 709 gtk_tree_append(GTK_TREE(new_g->tree), b->item); |
|
| 710 new_g->members = g_list_append(new_g->members, b); |
|
| 711 } else { |
|
| 712 pos = g_list_index(new_g->members, s); |
|
| 713 if (pos != 0) { |
|
| 714 new_g->members = g_list_insert(new_g->members, b, pos); |
|
| 715 gtk_tree_insert(GTK_TREE(new_g->tree), b->item, pos); |
|
| 716 } else { |
|
| 717 new_g->members = g_list_prepend(new_g->members, b); |
|
| 718 gtk_tree_prepend(GTK_TREE(new_g->tree), b->item); |
|
| 719 |
|
| 720 } |
|
| 721 } |
|
| 722 |
|
| 723 gtk_widget_unref(b->item); |
|
| 724 gtk_widget_unref(b->label); |
|
| 725 gtk_widget_unref(b->pix); |
|
| 726 gtk_widget_unref(b->idletime); |
|
| 727 gtk_widget_unref(gtree); |
|
| 728 |
|
| 729 gtk_ctree_expand(ctree, parent); |
|
| 730 |
|
| 731 update_num_groups(); |
|
| 732 update_show_idlepix(); |
|
| 733 if (b->present) { |
|
| 734 GList *mem = old_g->members; |
|
| 735 struct buddy *bt; |
|
| 736 int count = 0; |
|
| 737 while (mem && !count) { |
|
| 738 bt = (struct buddy *)mem->data; |
|
| 739 if (bt->present || GTK_WIDGET_VISIBLE(b->item)) count++; |
|
| 740 mem = mem->next; |
|
| 741 } |
|
| 742 if (!count && (display_options & OPT_DISP_NO_MT_GRP)) |
|
| 743 gtk_widget_hide(old_g->item); |
|
| 744 gtk_widget_show(new_g->item); |
|
| 745 } |
|
| 746 set_buddy(b); |
|
| 747 |
|
| 748 |
|
| 749 |
|
| 750 |
|
| 751 |
|
| 752 } |
|
| 753 |
|
| 754 serv_save_config(); |
|
| 755 |
|
| 756 // flush buddy list to cache |
|
| 757 |
|
| 758 do_export( (GtkWidget *) NULL, 0 ); |
|
| 759 } |
618 } |
| 760 |
619 |
| 761 |
620 |
| 762 |
621 |
| 763 void build_edit_tree() |
622 void build_edit_tree() |
| 764 { |
623 { |
| 765 GtkCTreeNode *p = NULL, *n; |
624 GtkCTreeNode *c = NULL, *p = NULL, *n; |
| 766 GSList *grp = groups; |
625 GSList *con = connections; |
| 767 GList *mem; |
626 GSList *grp; |
| |
627 GSList *mem; |
| |
628 struct gaim_connection *z; |
| 768 struct group *g; |
629 struct group *g; |
| 769 struct buddy *b; |
630 struct buddy *b; |
| 770 char *text[1]; |
631 char *text[1]; |
| 771 |
632 |
| 772 gtk_clist_freeze(GTK_CLIST(edittree)); |
633 gtk_clist_freeze(GTK_CLIST(edittree)); |
| 773 gtk_clist_clear(GTK_CLIST(edittree)); |
634 gtk_clist_clear(GTK_CLIST(edittree)); |
| 774 |
635 |
| 775 |
636 |
| 776 while(grp) { |
637 while (con) { |
| 777 g = (struct group *)grp->data; |
638 z = (struct gaim_connection *)con->data; |
| 778 |
639 |
| 779 text[0] = g->name; |
640 if (g_slist_length(connections) > 1) { |
| 780 |
641 text[0] = z->username; |
| 781 p = gtk_ctree_insert_node(GTK_CTREE(edittree), NULL, |
642 |
| 782 NULL, text, 5, NULL, NULL, |
643 c = gtk_ctree_insert_node(GTK_CTREE(edittree), NULL, |
| 783 NULL, NULL, 0, 1); |
644 NULL, text, 5, NULL, NULL, |
| 784 |
645 NULL, NULL, 0, 1); |
| 785 n = NULL; |
646 |
| 786 |
647 gtk_ctree_node_set_row_data(GTK_CTREE(edittree), c, z); |
| 787 mem = g->members; |
648 } else |
| 788 |
649 c = NULL; |
| 789 while(mem) { |
650 |
| 790 b = (struct buddy *)mem->data; |
651 grp = z->groups; |
| 791 |
652 |
| 792 text[0] = b->name; |
653 while(grp) { |
| 793 |
654 g = (struct group *)grp->data; |
| 794 n = gtk_ctree_insert_node(GTK_CTREE(edittree), |
655 |
| 795 p, NULL, text, 5, |
656 text[0] = g->name; |
| 796 NULL, NULL, |
657 |
| 797 NULL, NULL, 1, 1); |
658 p = gtk_ctree_insert_node(GTK_CTREE(edittree), c, |
| 798 |
659 NULL, text, 5, NULL, NULL, |
| 799 mem = mem->next; |
660 NULL, NULL, 0, 1); |
| 800 |
661 |
| 801 } |
662 gtk_ctree_node_set_row_data(GTK_CTREE(edittree), p, z); |
| 802 grp = g_slist_next(grp); |
663 |
| |
664 n = NULL; |
| |
665 |
| |
666 mem = g->members; |
| |
667 |
| |
668 while(mem) { |
| |
669 b = (struct buddy *)mem->data; |
| |
670 |
| |
671 text[0] = b->name; |
| |
672 |
| |
673 n = gtk_ctree_insert_node(GTK_CTREE(edittree), |
| |
674 p, NULL, text, 5, |
| |
675 NULL, NULL, |
| |
676 NULL, NULL, 1, 1); |
| |
677 |
| |
678 gtk_ctree_node_set_row_data(GTK_CTREE(edittree), n, z); |
| |
679 |
| |
680 mem = mem->next; |
| |
681 |
| |
682 } |
| |
683 grp = g_slist_next(grp); |
| |
684 } |
| |
685 con = g_slist_next(con); |
| 803 } |
686 } |
| 804 |
687 |
| 805 gtk_clist_thaw(GTK_CLIST(edittree)); |
688 gtk_clist_thaw(GTK_CLIST(edittree)); |
| 806 |
689 |
| 807 } |
690 } |
| 808 |
691 |
| 809 struct buddy *add_buddy(char *group, char *buddy, char *show) |
692 struct buddy *add_buddy(struct gaim_connection *gc, char *group, char *buddy, char *show) |
| 810 { |
693 { |
| 811 struct buddy *b; |
694 struct buddy *b; |
| 812 struct group *g; |
695 struct group *g; |
| 813 GdkPixmap *pm; |
696 |
| 814 GdkBitmap *bm; |
697 if ((b = find_buddy(gc, buddy)) != NULL) |
| 815 GtkWidget *box; |
|
| 816 |
|
| 817 |
|
| 818 if ((b = find_buddy(buddy)) != NULL) |
|
| 819 return b; |
698 return b; |
| 820 |
699 |
| 821 g = find_group(group); |
700 g = find_group(gc, group); |
| 822 |
701 |
| 823 if (g == NULL) |
702 if (g == NULL) |
| 824 g = add_group(group); |
703 g = add_group(gc, group); |
| 825 |
704 |
| 826 b = (struct buddy *)g_new0(struct buddy, 1); |
705 b = (struct buddy *)g_new0(struct buddy, 1); |
| 827 |
706 |
| 828 if (!b) |
707 if (!b) |
| 829 return NULL; |
708 return NULL; |
| 830 |
709 |
| 831 b->present = 0; |
710 b->present = 0; |
| 832 b->item = gtk_tree_item_new(); |
|
| 833 |
711 |
| 834 g_snprintf(b->name, sizeof(b->name), "%s", buddy); |
712 g_snprintf(b->name, sizeof(b->name), "%s", buddy); |
| 835 g_snprintf(b->show, sizeof(b->show), "%s", show ? (show[0] ? show : buddy) : buddy); |
713 g_snprintf(b->show, sizeof(b->show), "%s", show ? (show[0] ? show : buddy) : buddy); |
| 836 |
714 |
| 837 g->members = g_list_append(g->members, b); |
715 g->members = g_slist_append(g->members, b); |
| 838 |
|
| 839 |
|
| 840 if (blist == NULL) |
|
| 841 return b; |
|
| 842 |
|
| 843 box = gtk_hbox_new(FALSE, 1); |
|
| 844 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 845 NULL, (gchar **)login_icon_xpm); |
|
| 846 b->pix = gtk_pixmap_new(pm, bm); |
|
| 847 |
716 |
| 848 b->idle = 0; |
717 b->idle = 0; |
| 849 b->caps = 0; |
718 b->caps = 0; |
| 850 |
719 |
| 851 gtk_widget_show(b->pix); |
|
| 852 gdk_pixmap_unref(pm); |
|
| 853 gdk_bitmap_unref(bm); |
|
| 854 |
|
| 855 b->label = gtk_label_new(buddy); |
|
| 856 gtk_misc_set_alignment(GTK_MISC(b->label), 0.0, 0.5); |
|
| 857 |
|
| 858 b->idletime = gtk_label_new(""); |
|
| 859 |
|
| 860 gtk_tree_append(GTK_TREE(g->tree),b->item); |
|
| 861 gtk_container_add(GTK_CONTAINER(b->item), box); |
|
| 862 |
|
| 863 gtk_box_pack_start(GTK_BOX(box), b->pix, FALSE, FALSE, 1); |
|
| 864 gtk_box_pack_start(GTK_BOX(box), b->label, TRUE, TRUE, 1); |
|
| 865 gtk_box_pack_start(GTK_BOX(box), b->idletime, FALSE, FALSE, 1); |
|
| 866 |
|
| 867 gtk_widget_show(b->label); |
|
| 868 gtk_widget_show(box); |
|
| 869 |
|
| 870 gtk_object_set_user_data(GTK_OBJECT(b->item), b); |
|
| 871 |
|
| 872 gtk_signal_connect(GTK_OBJECT(b->item), "button_press_event", |
|
| 873 GTK_SIGNAL_FUNC(handle_click_buddy), b); |
|
| 874 |
|
| 875 return b; |
720 return b; |
| 876 } |
721 } |
| 877 |
722 |
| 878 |
723 |
| 879 struct group *add_group(char *group) |
724 struct group *add_group(struct gaim_connection *gc, char *group) |
| 880 { |
725 { |
| 881 struct group *g = find_group(group); |
726 struct group *g = find_group(gc, group); |
| 882 if (g) |
727 if (g) |
| 883 return g; |
728 return g; |
| 884 g = (struct group *)g_new0(struct group, 1); |
729 g = (struct group *)g_new0(struct group, 1); |
| 885 if (!g) |
730 if (!g) |
| 886 return NULL; |
731 return NULL; |
| 887 |
732 |
| 888 strncpy(g->name, group, sizeof(g->name)); |
733 strncpy(g->name, group, sizeof(g->name)); |
| 889 groups = g_slist_append(groups, g); |
734 gc->groups = g_slist_append(gc->groups, g); |
| 890 |
735 |
| 891 if (blist == NULL) |
|
| 892 return g; |
|
| 893 |
|
| 894 g->item = gtk_tree_item_new(); |
|
| 895 g->label = gtk_label_new(g->name); |
|
| 896 gtk_misc_set_alignment(GTK_MISC(g->label), 0.0, 0.5); |
|
| 897 gtk_widget_show(g->label); |
|
| 898 gtk_container_add(GTK_CONTAINER(g->item), g->label); |
|
| 899 g->tree = gtk_tree_new(); |
|
| 900 gtk_widget_show(g->item); |
|
| 901 gtk_widget_show(g->tree); |
|
| 902 gtk_tree_append(GTK_TREE(buddies), g->item); |
|
| 903 gtk_tree_item_set_subtree(GTK_TREE_ITEM(g->item), g->tree); |
|
| 904 gtk_tree_item_expand(GTK_TREE_ITEM(g->item)); |
|
| 905 gtk_signal_connect(GTK_OBJECT(g->item), "button_press_event", |
|
| 906 GTK_SIGNAL_FUNC(handle_click_group), |
|
| 907 NULL); |
|
| 908 gtk_object_set_user_data(GTK_OBJECT(g->item), NULL); |
|
| 909 g->members = NULL; |
736 g->members = NULL; |
| 910 if (display_options & OPT_DISP_NO_MT_GRP) |
737 |
| 911 gtk_widget_hide(g->item); |
|
| 912 |
|
| 913 |
|
| 914 build_edit_tree(); |
738 build_edit_tree(); |
| 915 |
739 |
| 916 return g; |
740 return g; |
| 917 |
|
| 918 } |
741 } |
| 919 |
742 |
| 920 |
743 |
| 921 static void do_del_buddy(GtkWidget *w, GtkCTree *ctree) |
744 static void do_del_buddy(GtkWidget *w, GtkCTree *ctree) |
| 922 { |
745 { |
| 923 GtkCTreeNode *node; |
746 GtkCTreeNode *node; |
| 924 char *bud, *grp; |
747 char *bud, *grp; |
| 925 struct buddy *b; |
748 struct buddy *b; |
| 926 struct group *g; |
749 struct group *g; |
| |
750 struct gaim_connection *gc; |
| 927 GList *i; |
751 GList *i; |
| 928 |
752 |
| 929 i = GTK_CLIST(edittree)->selection; |
753 i = GTK_CLIST(edittree)->selection; |
| 930 if (i) { |
754 if (i) { |
| 931 node = i->data; |
755 node = i->data; |
| |
756 gc = (struct gaim_connection *)gtk_ctree_node_get_row_data(GTK_CTREE(edittree), node); |
| 932 |
757 |
| 933 if (GTK_CTREE_ROW(node)->is_leaf) { |
758 if (GTK_CTREE_ROW(node)->is_leaf) { |
| 934 gtk_ctree_get_node_info (GTK_CTREE(edittree), node, &bud, |
759 gtk_ctree_get_node_info (GTK_CTREE(edittree), node, &bud, |
| 935 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
760 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| 936 |
761 |
| 937 b = find_buddy(bud); |
762 b = find_buddy(gc, bud); |
| 938 g = find_group_by_buddy(bud); |
763 g = find_group_by_buddy(gc, bud); |
| 939 remove_buddy(g, b); |
764 remove_buddy(gc, g, b); |
| 940 } else { |
765 } else { |
| 941 gtk_ctree_get_node_info (ctree, node, &grp, |
766 gtk_ctree_get_node_info (ctree, node, &grp, |
| 942 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
767 NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
| 943 g = find_group(grp); |
768 if (strcmp(gc->username, grp)) { |
| 944 remove_group(g); |
769 g = find_group(gc, grp); |
| |
770 remove_group(gc, g); |
| |
771 } |
| 945 } |
772 } |
| 946 |
773 |
| 947 build_edit_tree(); |
774 build_edit_tree(); |
| 948 serv_save_config(); |
|
| 949 |
775 |
| 950 // flush buddy list to cache |
776 // flush buddy list to cache |
| 951 |
777 |
| 952 do_export( (GtkWidget *) NULL, 0 ); |
778 do_export( (GtkWidget *) NULL, 0 ); |
| 953 |
779 |
| 954 } else { |
780 } else { |
| 955 /* Nothing selected. */ |
781 /* Nothing selected. */ |
| 956 } |
782 } |
| 957 update_num_groups(); |
|
| 958 } |
783 } |
| 959 |
784 |
| 960 |
785 |
| 961 void import_callback(GtkWidget *widget, void *null) |
786 void import_callback(GtkWidget *widget, void *null) |
| 962 { |
787 { |
| 1368 } |
1243 } |
| 1369 return buf; |
1244 return buf; |
| 1370 } |
1245 } |
| 1371 |
1246 |
| 1372 |
1247 |
| 1373 void set_buddy(struct buddy *b) |
1248 static struct group_show *find_group_show(char *group) { |
| 1374 { |
1249 GSList *m = shows; |
| 1375 char infotip[256]; |
1250 struct group_show *g = NULL; |
| 1376 char idlet[16]; |
1251 |
| 1377 char warn[256]; |
1252 while (m) { |
| 1378 char caps[256]; |
1253 g = (struct group_show *)m->data; |
| 1379 char *who; |
1254 if (!strcmp(g->name, group)) |
| 1380 int i; |
1255 break; |
| 1381 int ihrs, imin; |
1256 g = NULL; |
| 1382 time_t t; |
1257 m = m->next; |
| |
1258 } |
| |
1259 |
| |
1260 return g; |
| |
1261 } |
| |
1262 |
| |
1263 static struct buddy_show *find_buddy_show(struct group_show *gs, char *name) { |
| |
1264 GSList *m = gs->members; |
| |
1265 struct buddy_show *b = NULL; |
| |
1266 |
| |
1267 while (m) { |
| |
1268 b = (struct buddy_show *)m->data; |
| |
1269 if (!strcmp(b->name, name)) |
| |
1270 break; |
| |
1271 b = NULL; |
| |
1272 m = m->next; |
| |
1273 } |
| |
1274 |
| |
1275 return b; |
| |
1276 } |
| |
1277 |
| |
1278 static struct group_show *new_group_show(char *group) { |
| |
1279 struct group_show *g = g_new0(struct group_show, 1); |
| |
1280 |
| |
1281 g->name = g_strdup(group); |
| |
1282 |
| |
1283 g->item = gtk_tree_item_new(); |
| |
1284 /* FIXME */ |
| |
1285 gtk_tree_append(GTK_TREE(buddies), g->item); |
| |
1286 gtk_signal_connect(GTK_OBJECT(g->item), "button_press_event", |
| |
1287 GTK_SIGNAL_FUNC(handle_click_group), NULL); |
| |
1288 gtk_widget_show(g->item); |
| |
1289 |
| |
1290 g->label = gtk_label_new(group); |
| |
1291 gtk_misc_set_alignment(GTK_MISC(g->label), 0.0, 0.5); |
| |
1292 gtk_container_add(GTK_CONTAINER(g->item), g->label); |
| |
1293 gtk_widget_show(g->label); |
| |
1294 |
| |
1295 g->tree = gtk_tree_new(); |
| |
1296 gtk_tree_item_set_subtree(GTK_TREE_ITEM(g->item), g->tree); |
| |
1297 gtk_tree_item_expand(GTK_TREE_ITEM(g->item)); |
| |
1298 gtk_widget_show(g->tree); |
| |
1299 |
| |
1300 /* FIXME */ |
| |
1301 shows = g_slist_append(shows, g); |
| |
1302 return g; |
| |
1303 } |
| |
1304 |
| |
1305 static struct buddy_show *new_buddy_show(struct group_show *gs, char *buddy) { |
| |
1306 struct buddy_show *b = g_new0(struct buddy_show, 1); |
| |
1307 GtkWidget *box; |
| 1383 GdkPixmap *pm; |
1308 GdkPixmap *pm; |
| 1384 GdkBitmap *bm; |
1309 GdkBitmap *bm; |
| 1385 char *itime, *sotime; |
1310 |
| 1386 |
1311 b->name = g_strdup(buddy); |
| 1387 if (b->present) { |
1312 |
| 1388 time(&t); |
1313 b->item = gtk_tree_item_new(); |
| 1389 |
1314 /* FIXME */ |
| 1390 ihrs = (t - b->idle) / 3600; |
1315 gtk_tree_append(GTK_TREE(gs->tree), b->item); |
| 1391 imin = ((t - b->idle) / 60) % 60; |
1316 gtk_object_set_user_data(GTK_OBJECT(b->item), b); |
| 1392 |
1317 gtk_signal_connect(GTK_OBJECT(b->item), "button_press_event", |
| 1393 if (ihrs) |
1318 GTK_SIGNAL_FUNC(handle_click_buddy), b); |
| 1394 g_snprintf(idlet, sizeof(idlet), "(%d:%02d)", ihrs, imin); |
1319 gtk_widget_show(b->item); |
| 1395 else |
1320 |
| 1396 g_snprintf(idlet, sizeof(idlet), "(%02d)", imin); |
1321 box = gtk_hbox_new(FALSE, 1); |
| 1397 |
1322 gtk_container_add(GTK_CONTAINER(b->item), box); |
| 1398 gtk_widget_hide(b->idletime); |
1323 gtk_widget_show(box); |
| 1399 |
1324 |
| 1400 if (b->idle) |
1325 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, (char **)login_icon_xpm); |
| 1401 gtk_label_set(GTK_LABEL(b->idletime), idlet); |
1326 b->pix = gtk_pixmap_new(pm, bm); |
| 1402 else |
1327 gtk_box_pack_start(GTK_BOX(box), b->pix, FALSE, FALSE, 1); |
| 1403 gtk_label_set(GTK_LABEL(b->idletime), ""); |
1328 gtk_widget_show(b->pix); |
| 1404 if (display_options & OPT_DISP_SHOW_IDLETIME) |
1329 gdk_pixmap_unref(pm); |
| 1405 gtk_widget_show(b->idletime); |
1330 gdk_bitmap_unref(bm); |
| 1406 |
1331 |
| 1407 |
1332 b->label = gtk_label_new(buddy); |
| 1408 sotime = sec_to_text(t - b->signon + correction_time); |
1333 gtk_misc_set_alignment(GTK_MISC(b->label), 0.0, 0.5); |
| 1409 if (b->idle) { |
1334 gtk_box_pack_start(GTK_BOX(box), b->label, TRUE, TRUE, 1); |
| 1410 itime = sec_to_text(t - b->idle); |
1335 gtk_widget_show(b->label); |
| 1411 } else { |
1336 |
| 1412 itime = g_malloc(1); |
1337 /* FIXME */ |
| 1413 itime[0] = 0; |
1338 gs->members = g_slist_append(gs->members, b); |
| 1414 } |
1339 return b; |
| 1415 |
1340 } |
| 1416 if (b->evil) { |
1341 |
| 1417 g_snprintf(warn, sizeof(warn), _("Warnings: %d%%\n"), b->evil); |
1342 static struct group_show *find_gs_by_bs(struct buddy_show *b) { |
| 1418 |
1343 GSList *m, *n; |
| 1419 } else |
1344 struct group_show *g = NULL; |
| 1420 warn[0] = '\0'; |
1345 struct buddy_show *h; |
| 1421 |
1346 |
| 1422 if (b->caps) { |
1347 m = shows; |
| 1423 g_snprintf(caps, sizeof(caps), _("Capabilities: %s\n"), caps_string(b->caps)); |
1348 while (m) { |
| 1424 } else |
1349 g = (struct group_show *)m->data; |
| 1425 caps[0] = '\0'; |
1350 n = g->members; |
| 1426 |
1351 while (n) { |
| 1427 i = g_snprintf(infotip, sizeof(infotip), _("Alias: %s \nScreen Name: %s\nLogged in: %s\n%s%s%s%s%s"), b->show, b->name, sotime, warn, ((b->idle) ? _("Idle: ") : ""), itime, ((b->idle) ? "\n" : ""), caps); |
1352 h = (struct buddy_show *)n->data; |
| 1428 |
1353 if (h == b) |
| 1429 gtk_tooltips_set_tip(tips, GTK_WIDGET(b->item), infotip, ""); |
1354 return g; |
| 1430 |
1355 n = n->next; |
| 1431 g_free(sotime); |
1356 } |
| 1432 g_free(itime); |
1357 g = NULL; |
| 1433 |
1358 m = m->next; |
| 1434 |
1359 } |
| 1435 |
1360 |
| 1436 /* this check should also depend on whether they left, |
1361 return g; |
| 1437 * and signed on again before they got erased */ |
1362 } |
| 1438 if (!GTK_WIDGET_VISIBLE(b->item) || b->present == 1) { |
1363 |
| 1439 plugin_event(event_buddy_signon, b->name, 0, 0, 0); |
1364 static int log_timeout(struct buddy_show *b) { |
| 1440 |
1365 if (!b->connlist) { |
| |
1366 struct group_show *g = find_gs_by_bs(b); |
| |
1367 g->members = g_slist_remove(g->members, b); |
| |
1368 gtk_widget_destroy(b->item); |
| |
1369 if (g->members == NULL && (display_options & OPT_DISP_NO_MT_GRP)) { |
| |
1370 shows = g_slist_remove(shows, g); |
| |
1371 gtk_widget_destroy(g->item); |
| |
1372 g_free(g->name); |
| |
1373 g_free(g); |
| |
1374 } |
| |
1375 g_free(b->name); |
| |
1376 g_free(b); |
| |
1377 } else { |
| |
1378 /* um.... what do we have to do here? just update the pixmap? */ |
| |
1379 GdkPixmap *pm; |
| |
1380 GdkBitmap *bm; |
| |
1381 gchar **xpm = NULL; |
| |
1382 struct buddy *light = find_buddy(b->connlist->data, b->name); |
| |
1383 if (((struct gaim_connection *)b->connlist->data)->prpl->list_icon) |
| |
1384 xpm = (*((struct gaim_connection *)b->connlist->data)->prpl->list_icon)(light->uc); |
| |
1385 if (xpm == NULL) |
| |
1386 xpm = (char **)no_icon_xpm; |
| |
1387 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, xpm); |
| |
1388 gtk_widget_hide(b->pix); |
| |
1389 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
| |
1390 gtk_widget_show(b->pix); |
| |
1391 if (ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER) |
| |
1392 BuddyTickerSetPixmap(b->name, pm, bm); |
| |
1393 gdk_pixmap_unref(pm); |
| |
1394 gdk_bitmap_unref(bm); |
| |
1395 } |
| |
1396 b->log_timer = -1; |
| |
1397 return FALSE; |
| |
1398 } |
| |
1399 |
| |
1400 void set_buddy(struct gaim_connection *gc, struct buddy *b) |
| |
1401 { |
| |
1402 time_t t; |
| |
1403 struct group *g = find_group_by_buddy(gc, b->name); |
| |
1404 struct group_show *gs; |
| |
1405 struct buddy_show *bs; |
| |
1406 GdkPixmap *pm; |
| |
1407 GdkBitmap *bm; |
| |
1408 char **xpm = NULL; |
| |
1409 if (b->present) { |
| |
1410 if ((gs = find_group_show(g->name)) == NULL) |
| |
1411 gs = new_group_show(g->name); |
| |
1412 if ((bs = find_buddy_show(gs, b->name)) == NULL) |
| |
1413 bs = new_buddy_show(gs, b->name); |
| |
1414 if (b->present == 1) { |
| 1441 play_sound(BUDDY_ARRIVE); |
1415 play_sound(BUDDY_ARRIVE); |
| 1442 b->present = 2; |
1416 b->present = 2; |
| 1443 |
1417 if (b->log_timer > 0) |
| 1444 who = g_malloc(sizeof(b->show) + 10); |
1418 gtk_timeout_remove(b->log_timer); |
| 1445 strcpy(who, b->show); |
1419 if (!g_slist_find(bs->connlist, gc)) |
| 1446 gtk_label_set(GTK_LABEL(b->label), who); |
1420 bs->connlist = g_slist_append(bs->connlist, gc); |
| 1447 g_free(who); |
1421 b->log_timer = gtk_timeout_add(10000, (GtkFunction)log_timeout, bs); |
| 1448 |
1422 } else { |
| 1449 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
1423 if (gc->prpl->list_icon) |
| 1450 NULL, (gchar **)login_icon_xpm); |
1424 xpm = (*gc->prpl->list_icon)(b->uc); |
| 1451 gtk_widget_hide(b->pix); |
1425 if (xpm == NULL) |
| 1452 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
1426 xpm = (char **)no_icon_xpm; |
| 1453 if (display_options & OPT_DISP_SHOW_PIXMAPS) |
1427 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, xpm); |
| 1454 gtk_widget_show(b->pix); |
1428 gtk_widget_hide(bs->pix); |
| |
1429 gtk_pixmap_set(GTK_PIXMAP(bs->pix), pm, bm); |
| |
1430 gtk_widget_show(bs->pix); |
| |
1431 if (ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER) |
| |
1432 BuddyTickerSetPixmap(b->name, pm, bm); |
| 1455 gdk_pixmap_unref(pm); |
1433 gdk_pixmap_unref(pm); |
| 1456 gdk_bitmap_unref(bm); |
1434 gdk_bitmap_unref(bm); |
| 1457 |
1435 } |
| 1458 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1459 NULL, (gchar **)login_icon_xpm); |
|
| 1460 |
|
| 1461 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1462 BuddyTickerAddUser( b->name, pm, bm ); |
|
| 1463 gdk_pixmap_unref(pm); |
|
| 1464 gdk_bitmap_unref(bm); |
|
| 1465 |
|
| 1466 if (display_options & OPT_DISP_SHOW_LOGON) { |
|
| 1467 struct conversation *c = find_conversation(b->name); |
|
| 1468 if (c) { |
|
| 1469 char tmp[1024]; |
|
| 1470 |
|
| 1471 |
|
| 1472 g_snprintf(tmp, sizeof(tmp), _("<HR><B>%s logged in%s%s.</B><BR><HR>"), b->name, |
|
| 1473 ((display_options & OPT_DISP_SHOW_TIME) ? " @ " : ""), |
|
| 1474 ((display_options & OPT_DISP_SHOW_TIME) ? date() : "")); |
|
| 1475 |
|
| 1476 |
|
| 1477 write_to_conv(c, tmp, WFLAG_SYSTEM, NULL); |
|
| 1478 |
|
| 1479 } |
|
| 1480 } |
|
| 1481 |
|
| 1482 |
|
| 1483 { struct group *g = find_group_by_buddy(b->name); |
|
| 1484 gtk_widget_show(g->item); } |
|
| 1485 gtk_widget_show(b->item); |
|
| 1486 gtk_widget_show(b->label); |
|
| 1487 b->log_timer = gtk_timeout_add(10000, (GtkFunction) log_timeout, b->name); |
|
| 1488 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1489 gtk_timeout_add(10000, (GtkFunction) BuddyTickerLogonTimeout, b->name); |
|
| 1490 update_num_groups(); |
|
| 1491 update_show_idlepix(); |
|
| 1492 setup_buddy_chats(); |
|
| 1493 return; |
|
| 1494 } |
|
| 1495 |
|
| 1496 |
|
| 1497 |
|
| 1498 if (!b->log_timer) { |
|
| 1499 gtk_widget_hide(b->pix); |
|
| 1500 if (b->uc & UC_UNAVAILABLE) { |
|
| 1501 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1502 NULL, (gchar **)away_icon_xpm); |
|
| 1503 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
|
| 1504 gdk_pixmap_unref(pm); |
|
| 1505 gdk_bitmap_unref(bm); |
|
| 1506 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1507 { |
|
| 1508 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1509 NULL, (gchar **)away_icon_xpm); |
|
| 1510 BuddyTickerSetPixmap(b->name, pm, bm); |
|
| 1511 gdk_pixmap_unref(pm); |
|
| 1512 gdk_bitmap_unref(bm); |
|
| 1513 } |
|
| 1514 } else if (b->uc & UC_AOL) { |
|
| 1515 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1516 NULL, (gchar **)aol_icon_xpm); |
|
| 1517 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
|
| 1518 gdk_pixmap_unref(pm); |
|
| 1519 gdk_bitmap_unref(bm); |
|
| 1520 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1521 { |
|
| 1522 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1523 NULL, (gchar **)aol_icon_xpm); |
|
| 1524 BuddyTickerSetPixmap(b->name, pm, bm); |
|
| 1525 gdk_pixmap_unref(pm); |
|
| 1526 gdk_bitmap_unref(bm); |
|
| 1527 } |
|
| 1528 } else if (b->uc & UC_NORMAL) { |
|
| 1529 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1530 NULL, (gchar **)free_icon_xpm); |
|
| 1531 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
|
| 1532 gdk_pixmap_unref(pm); |
|
| 1533 gdk_bitmap_unref(bm); |
|
| 1534 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1535 { |
|
| 1536 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1537 NULL, (gchar **)free_icon_xpm); |
|
| 1538 BuddyTickerSetPixmap(b->name, pm, bm); |
|
| 1539 gdk_pixmap_unref(pm); |
|
| 1540 gdk_bitmap_unref(bm); |
|
| 1541 } |
|
| 1542 } else if (b->uc & UC_ADMIN) { |
|
| 1543 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1544 NULL, (gchar **)admin_icon_xpm); |
|
| 1545 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
|
| 1546 gdk_pixmap_unref(pm); |
|
| 1547 gdk_bitmap_unref(bm); |
|
| 1548 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1549 { |
|
| 1550 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1551 NULL, (gchar **)admin_icon_xpm); |
|
| 1552 BuddyTickerSetPixmap(b->name, pm, bm); |
|
| 1553 gdk_pixmap_unref(pm); |
|
| 1554 gdk_bitmap_unref(bm); |
|
| 1555 } |
|
| 1556 } else if (b->uc & UC_UNCONFIRMED) { |
|
| 1557 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1558 NULL, (gchar **)dt_icon_xpm); |
|
| 1559 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
|
| 1560 gdk_pixmap_unref(pm); |
|
| 1561 gdk_bitmap_unref(bm); |
|
| 1562 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1563 { |
|
| 1564 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1565 NULL, (gchar **)dt_icon_xpm); |
|
| 1566 BuddyTickerSetPixmap(b->name, pm, bm); |
|
| 1567 gdk_pixmap_unref(pm); |
|
| 1568 gdk_bitmap_unref(bm); |
|
| 1569 } |
|
| 1570 } else { |
|
| 1571 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1572 NULL, (gchar **)no_icon_xpm); |
|
| 1573 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
|
| 1574 gdk_pixmap_unref(pm); |
|
| 1575 gdk_bitmap_unref(bm); |
|
| 1576 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1577 { |
|
| 1578 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
|
| 1579 NULL, (gchar **)no_icon_xpm); |
|
| 1580 BuddyTickerSetPixmap(b->name, pm, bm); |
|
| 1581 gdk_pixmap_unref(pm); |
|
| 1582 gdk_bitmap_unref(bm); |
|
| 1583 } |
|
| 1584 } |
|
| 1585 if (display_options & OPT_DISP_SHOW_PIXMAPS) |
|
| 1586 gtk_widget_show(b->pix); |
|
| 1587 } |
|
| 1588 |
|
| 1589 |
|
| 1590 |
|
| 1591 } else { |
1436 } else { |
| 1592 if (GTK_WIDGET_VISIBLE(b->item)) { |
1437 play_sound(BUDDY_LEAVE); |
| 1593 plugin_event(event_buddy_signoff, b->name, 0, 0, 0); |
1438 gs = find_group_show(g->name); |
| 1594 play_sound(BUDDY_LEAVE); |
1439 bs = find_buddy_show(gs, b->name); |
| 1595 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
1440 bs->connlist = g_slist_remove(bs->connlist, gc); |
| 1596 NULL, (gchar **)logout_icon_xpm); |
1441 if (b->log_timer > 0) |
| 1597 gtk_widget_hide(b->pix); |
1442 gtk_timeout_remove(b->log_timer); |
| 1598 gtk_pixmap_set(GTK_PIXMAP(b->pix), pm, bm); |
1443 b->log_timer = gtk_timeout_add(10000, (GtkFunction)log_timeout, bs); |
| 1599 if (display_options & OPT_DISP_SHOW_PIXMAPS) |
1444 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, logout_icon_xpm); |
| 1600 gtk_widget_show(b->pix); |
1445 gtk_widget_hide(bs->pix); |
| 1601 gdk_pixmap_unref(pm); |
1446 gtk_pixmap_set(GTK_PIXMAP(bs->pix), pm, bm); |
| 1602 gdk_bitmap_unref(bm); |
1447 gtk_widget_show(bs->pix); |
| 1603 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, |
1448 if (ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER) |
| 1604 NULL, (gchar **)logout_icon_xpm); |
1449 BuddyTickerSetPixmap(b->name, pm, bm); |
| 1605 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
1450 gdk_pixmap_unref(pm); |
| 1606 BuddyTickerSetPixmap( b->name, pm, bm ); |
1451 gdk_bitmap_unref(bm); |
| 1607 gdk_pixmap_unref(pm); |
1452 } |
| 1608 gdk_bitmap_unref(bm); |
|
| 1609 if (display_options & OPT_DISP_SHOW_LOGON) { |
|
| 1610 struct conversation *c = find_conversation(b->name); |
|
| 1611 if (c) { |
|
| 1612 char tmp[1024]; |
|
| 1613 |
|
| 1614 |
|
| 1615 g_snprintf(tmp, sizeof(tmp), _("<HR><B>%s logged out%s%s.</B><BR><HR>"), b->name, |
|
| 1616 ((display_options & OPT_DISP_SHOW_TIME) ? " @ " : ""), |
|
| 1617 ((display_options & OPT_DISP_SHOW_TIME) ? date() : "")); |
|
| 1618 |
|
| 1619 |
|
| 1620 write_to_conv(c, tmp, WFLAG_SYSTEM, NULL); |
|
| 1621 |
|
| 1622 } |
|
| 1623 } |
|
| 1624 b->log_timer = gtk_timeout_add(10000, (GtkFunction)log_timeout, b->name); |
|
| 1625 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
|
| 1626 gtk_timeout_add(10000, (GtkFunction)BuddyTickerLogoutTimeout, b->name); |
|
| 1627 update_num_groups(); |
|
| 1628 update_show_idlepix(); |
|
| 1629 } |
|
| 1630 } |
|
| 1631 setup_buddy_chats(); |
|
| 1632 } |
1453 } |
| 1633 |
1454 |
| 1634 |
1455 |
| 1635 static void move_blist_window(GtkWidget *w, GdkEventConfigure *e, void *dummy) |
1456 static void move_blist_window(GtkWidget *w, GdkEventConfigure *e, void *dummy) |
| 1636 { |
1457 { |