comparison src/buddy.c @ 4697:4be12ff42986

[gaim-migrate @ 5008] I hand merged patches from Ka-Hing Cheung (not Ha-King, as I accidentally slipped on last night) and Nathan Conrad and combined it with some of my own code. Thanks, guys. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Mon, 10 Mar 2003 22:07:59 +0000
parents abec345c8c92
children aa2ceea841b4
comparison
equal deleted inserted replaced
4696:abec345c8c92 4697:4be12ff42986
60 60
61 /*************************************************** 61 /***************************************************
62 * Callbacks * 62 * Callbacks *
63 ***************************************************/ 63 ***************************************************/
64 64
65 static void gtk_blist_menu_im_cb(GtkWidget *w, struct buddy *b)
66 {
67 gaim_conversation_new(GAIM_CONV_IM, b->account, b->name);
68 }
69
70 static void gtk_blist_menu_alias_cb(GtkWidget *w, struct buddy *b)
71 {
72 alias_dialog_bud(b);
73 }
74
75 static void gtk_blist_menu_bp_cb(GtkWidget *w, struct buddy *b)
76 {
77 show_new_bp(b->name, b->account->gc, b->idle,
78 b->uc & UC_UNAVAILABLE, NULL);
79 }
80
81 static void gtk_blist_menu_showlog_cb(GtkWidget *w, struct buddy *b)
82 {
83 show_log(b->name);
84 }
85
86 static void gtk_blist_show_systemlog_cb()
87 {
88 show_log(NULL);
89 }
90
65 static void gtk_blist_button_im_cb(GtkWidget *w, GtkTreeView *tv) 91 static void gtk_blist_button_im_cb(GtkWidget *w, GtkTreeView *tv)
66 { 92 {
67 GtkTreeIter iter; 93 GtkTreeIter iter;
68 GtkTreeModel *model = gtk_tree_view_get_model(tv); 94 GtkTreeModel *model = gtk_tree_view_get_model(tv);
69 GtkTreeSelection *sel = gtk_tree_view_get_selection(tv); 95 GtkTreeSelection *sel = gtk_tree_view_get_selection(tv);
116 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); 142 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
117 node = g_value_get_pointer(&val); 143 node = g_value_get_pointer(&val);
118 144
119 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { 145 if (GAIM_BLIST_NODE_IS_BUDDY(node)) {
120 gaim_conversation_new(GAIM_CONV_IM, ((struct buddy*)node)->account, ((struct buddy*)node)->name); 146 gaim_conversation_new(GAIM_CONV_IM, ((struct buddy*)node)->account, ((struct buddy*)node)->name);
147 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) {
148 if (gtk_tree_view_row_expanded(tv, path))
149 gtk_tree_view_collapse_row(tv, path);
150 else
151 gtk_tree_view_expand_row(tv,path,FALSE);
121 } 152 }
122 } 153 }
123 154
124 static void gaim_proto_menu_cb(GtkMenuItem *item, struct buddy *b) 155 static void gaim_proto_menu_cb(GtkMenuItem *item, struct buddy *b)
125 { 156 {
167 list = list->next; 198 list = list->next;
168 } 199 }
169 } 200 }
170 201
171 menuitem = gtk_image_menu_item_new_with_mnemonic("_IM"); 202 menuitem = gtk_image_menu_item_new_with_mnemonic("_IM");
172 image = gtk_image_new_from_stock(GAIM_STOCK_IM, GTK_ICON_SIZE_MENU); 203 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_im_cb), node);
204 image = gtk_image_new_from_stock(GAIM_STOCK_IM, GTK_ICON_SIZE_MENU);
173 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); 205 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
174 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 206 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
175 207
176 menuitem = gtk_image_menu_item_new_with_mnemonic("_Alias"); 208 menuitem = gtk_image_menu_item_new_with_mnemonic("_Alias");
209 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_alias_cb), node);
177 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 210 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
178 211
179 menuitem = gtk_image_menu_item_new_with_mnemonic("Add Buddy _Pounce"); 212 menuitem = gtk_image_menu_item_new_with_mnemonic("Add Buddy _Pounce");
213 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_bp_cb), node);
180 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 214 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
181 215
182 menuitem = gtk_image_menu_item_new_with_mnemonic("View _Log"); 216 menuitem = gtk_image_menu_item_new_with_mnemonic("View _Log");
217 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_showlog_cb), node);
183 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 218 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
184 219
185 gtk_widget_show_all(menu); 220 gtk_widget_show_all(menu);
186 221
187 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); 222 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time);
220 if (GAIM_BLIST_NODE_IS_BUDDY(node)) 255 if (GAIM_BLIST_NODE_IS_BUDDY(node))
221 show_add_buddy(NULL, NULL, ((struct group*)node->parent)->name, NULL); 256 show_add_buddy(NULL, NULL, ((struct group*)node->parent)->name, NULL);
222 else if (GAIM_BLIST_NODE_IS_GROUP(node)) 257 else if (GAIM_BLIST_NODE_IS_GROUP(node))
223 show_add_buddy(NULL, NULL, ((struct group*)node)->name, NULL); 258 show_add_buddy(NULL, NULL, ((struct group*)node)->name, NULL);
224 } 259 }
225 else{ 260 else {
226 show_add_buddy(NULL, NULL, NULL, NULL); 261 show_add_buddy(NULL, NULL, NULL, NULL);
227 } 262 }
228 } 263 }
229 264
265 static void gaim_gtk_blist_update_toolbar_icons (GtkWidget *widget, gpointer data) {
266 if (GTK_IS_IMAGE(widget)) {
267 if (blist_options & OPT_BLIST_SHOW_BUTTON_XPM)
268 gtk_widget_show(widget);
269 else
270 gtk_widget_hide(widget);
271 } else if (GTK_IS_CONTAINER(widget)) {
272 gtk_container_foreach(GTK_CONTAINER(widget), gaim_gtk_blist_update_toolbar_icons, NULL);
273 }
274 }
230 275
231 /*************************************************** 276 /***************************************************
232 * Crap * 277 * Crap *
233 ***************************************************/ 278 ***************************************************/
234 static GtkItemFactoryEntry blist_menu[] = 279 static GtkItemFactoryEntry blist_menu[] =
260 { N_("/Tools/_File Transfers"), NULL, NULL, 0, 305 { N_("/Tools/_File Transfers"), NULL, NULL, 0,
261 "<StockItem>", GTK_STOCK_REVERT_TO_SAVED }, 306 "<StockItem>", GTK_STOCK_REVERT_TO_SAVED },
262 { N_("/Tools/sep2"), NULL, NULL, 0, "<Separator>" }, 307 { N_("/Tools/sep2"), NULL, NULL, 0, "<Separator>" },
263 { N_("/Tools/P_rotocol Actions"), NULL, NULL, 0, "<Branch>" }, 308 { N_("/Tools/P_rotocol Actions"), NULL, NULL, 0, "<Branch>" },
264 { N_("/Tools/Pr_ivacy"), NULL, show_privacy_options, 0, NULL }, 309 { N_("/Tools/Pr_ivacy"), NULL, show_privacy_options, 0, NULL },
265 { N_("/Tools/View System _Log"), NULL, NULL, 0, NULL }, 310 { N_("/Tools/View System _Log"), NULL, gtk_blist_show_systemlog_cb, 0, NULL },
266 311
267 /* Help */ 312 /* Help */
268 { N_("/_Help"), NULL, NULL, 0, "<Branch>" }, 313 { N_("/_Help"), NULL, NULL, 0, "<Branch>" },
269 { N_("/Help/Online _Help"), "F1", NULL, 0, 314 { N_("/Help/Online _Help"), "F1", NULL, 0,
270 "<StockItem>", GTK_STOCK_HELP }, 315 "<StockItem>", GTK_STOCK_HELP },
271 { N_("/Help/_Debug Window"), NULL, NULL, 0, NULL }, 316 { N_("/Help/_Debug Window"), NULL, show_debug, 0, NULL },
272 { N_("/Help/_About"), NULL, show_about, 0, NULL }, 317 { N_("/Help/_About"), NULL, show_about, 0, NULL },
273 318
274 }; 319 };
275 320
276 /********************************************************* 321 /*********************************************************
581 button = gaim_pixbuf_button_from_stock(_("IM"), GAIM_STOCK_IM, GAIM_BUTTON_VERTICAL); 626 button = gaim_pixbuf_button_from_stock(_("IM"), GAIM_STOCK_IM, GAIM_BUTTON_VERTICAL);
582 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); 627 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0);
583 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); 628 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
584 gtk_size_group_add_widget(sg, button); 629 gtk_size_group_add_widget(sg, button);
585 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_im_cb), 630 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_im_cb),
586 gtkblist->treeview); 631 gtkblist->treeview);
587 632
588 button = gaim_pixbuf_button_from_stock(_("Get Info"), GAIM_STOCK_INFO, GAIM_BUTTON_VERTICAL); 633 button = gaim_pixbuf_button_from_stock(_("Get Info"), GAIM_STOCK_INFO, GAIM_BUTTON_VERTICAL);
589 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); 634 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0);
590 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); 635 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
591 gtk_size_group_add_widget(sg, button); 636 gtk_size_group_add_widget(sg, button);
592 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_info_cb), 637 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_info_cb),
593 gtkblist->treeview); 638 gtkblist->treeview);
594 639
595 button = gaim_pixbuf_button_from_stock(_("Chat"), GAIM_STOCK_CHAT, GAIM_BUTTON_VERTICAL); 640 button = gaim_pixbuf_button_from_stock(_("Chat"), GAIM_STOCK_CHAT, GAIM_BUTTON_VERTICAL);
596 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); 641 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0);
597 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); 642 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
598 gtk_size_group_add_widget(sg, button); 643 gtk_size_group_add_widget(sg, button);
599 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_chat_cb), NULL); 644 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_chat_cb), NULL);
605 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_away_cb), NULL); 650 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_away_cb), NULL);
606 651
607 /* OK... let's show this bad boy. */ 652 /* OK... let's show this bad boy. */
608 gaim_gtk_blist_refresh(list); 653 gaim_gtk_blist_refresh(list);
609 gtk_widget_show_all(gtkblist->window); 654 gtk_widget_show_all(gtkblist->window);
655
656 gaim_gtk_blist_update_toolbar();
657
610 } 658 }
611 659
612 void gaim_gtk_blist_refresh(struct gaim_buddy_list *list) 660 void gaim_gtk_blist_refresh(struct gaim_buddy_list *list)
613 { 661 {
614 GaimBlistNode *group = list->root; 662 GaimBlistNode *group = list->root;
621 gaim_gtk_blist_update(list, buddy); 669 gaim_gtk_blist_update(list, buddy);
622 buddy = buddy->next; 670 buddy = buddy->next;
623 } 671 }
624 group = group->next; 672 group = group->next;
625 } 673 }
674 }
675
676 void gaim_gtk_blist_update_toolbar() {
677 if (!gtkblist)
678 return;
679
680 gtk_container_foreach(GTK_CONTAINER(gtkblist->bbox), gaim_gtk_blist_update_toolbar_icons, NULL);
681
682 if (blist_options & OPT_BLIST_NO_BUTTONS)
683 gtk_widget_hide(gtkblist->bbox);
684 else
685 gtk_widget_show_all(gtkblist->bbox);
626 } 686 }
627 687
628 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node) 688 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node)
629 { 689 {
630 struct gaim_gtk_blist_node *gtknode; 690 struct gaim_gtk_blist_node *gtknode;
692 } 752 }
693 753
694 if (GAIM_BLIST_NODE_IS_BUDDY(node) && ((struct buddy*)node)->present) { 754 if (GAIM_BLIST_NODE_IS_BUDDY(node) && ((struct buddy*)node)->present) {
695 GdkPixbuf *status, *avatar; 755 GdkPixbuf *status, *avatar;
696 char *mark; 756 char *mark;
697 757 char *warning = NULL, *idle = NULL;
758
698 status = gaim_gtk_blist_get_status_icon((struct buddy*)node); 759 status = gaim_gtk_blist_get_status_icon((struct buddy*)node);
699 avatar = gaim_gtk_blist_get_buddy_icon((struct buddy*)node); 760 avatar = gaim_gtk_blist_get_buddy_icon((struct buddy*)node);
700 mark = gaim_gtk_blist_get_name_markup((struct buddy*)node); 761 mark = gaim_gtk_blist_get_name_markup((struct buddy*)node);
701 762
763 if ((((struct buddy*)node)->idle > 0) &&
764 (!(blist_options & OPT_BLIST_SHOW_ICONS) && (blist_options & OPT_BLIST_SHOW_IDLETIME))) {
765 time_t t;
766 int ihrs, imin;
767 time(&t);
768 ihrs = (t - ((struct buddy *)node)->idle) / 3600;
769 imin = ((t - ((struct buddy*)node)->idle) / 60) % 60;
770 idle = g_strdup_printf("%d:%02d", ihrs, imin);
771 }
772
773 if ((((struct buddy*)node)->evil > 0) &&
774 (!(blist_options & OPT_BLIST_SHOW_ICONS) && (blist_options & OPT_BLIST_SHOW_WARN))) {
775 warning = g_strdup_printf("%d%%", ((struct buddy*)node)->evil);
776 }
777
702 gtk_tree_store_set(gtkblist->treemodel, iter, 778 gtk_tree_store_set(gtkblist->treemodel, iter,
703 STATUS_ICON_COLUMN, status, 779 STATUS_ICON_COLUMN, status,
704 NAME_COLUMN, mark, 780 NAME_COLUMN, mark,
705 WARNING_COLUMN, "", 781 WARNING_COLUMN, warning,
706 IDLE_COLUMN, "", 782 IDLE_COLUMN, idle,
707 BUDDY_ICON_COLUMN, avatar, 783 BUDDY_ICON_COLUMN, avatar,
708 NODE_COLUMN, node, 784 NODE_COLUMN, node,
709 -1); 785 -1);
710 786
711 g_free(mark); 787 g_free(mark);
788 if (idle)
789 g_free(idle);
790 if (warning)
791 g_free(warning);
712 792
713 if (status != NULL) 793 if (status != NULL)
714 g_object_unref(status); 794 g_object_unref(status);
715 795
716 if (avatar != NULL) 796 if (avatar != NULL)