Mercurial > pidgin
comparison src/buddy.c @ 1729:251c19bf5763
[gaim-migrate @ 1739]
nsanch's rename patch. slightly modified.
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Fri, 20 Apr 2001 07:39:09 +0000 |
| parents | 8987160e446b |
| children | 00f74db70f2d |
comparison
equal
deleted
inserted
replaced
| 1728:467a3b36623a | 1729:251c19bf5763 |
|---|---|
| 91 void BuddyTickerLogoutTimeout( gpointer data ); | 91 void BuddyTickerLogoutTimeout( gpointer data ); |
| 92 | 92 |
| 93 /* Predefine some functions */ | 93 /* Predefine some functions */ |
| 94 static void new_bp_callback(GtkWidget *w, char *name); | 94 static void new_bp_callback(GtkWidget *w, char *name); |
| 95 | 95 |
| 96 struct buddy_show { | |
| 97 GtkWidget *item; | |
| 98 GtkWidget *pix; | |
| 99 GtkWidget *label; | |
| 100 GtkWidget *warn; | |
| 101 GtkWidget *idle; | |
| 102 char *name; | |
| 103 char *show; | |
| 104 GSList *connlist; | |
| 105 guint log_timer; | |
| 106 gint sound; | |
| 107 }; | |
| 108 | |
| 96 /* stuff for actual display of buddy list */ | 109 /* stuff for actual display of buddy list */ |
| 97 struct group_show { | 110 struct group_show { |
| 98 GtkWidget *item; | 111 GtkWidget *item; |
| 99 GtkWidget *label; | 112 GtkWidget *label; |
| 100 GtkWidget *tree; | 113 GtkWidget *tree; |
| 109 static int buddy_number(char *group, char *buddy); | 122 static int buddy_number(char *group, char *buddy); |
| 110 static struct group_show *new_group_show(char *group); | 123 static struct group_show *new_group_show(char *group); |
| 111 static struct buddy_show *new_buddy_show(struct group_show *gs, struct buddy *buddy, char **xpm); | 124 static struct buddy_show *new_buddy_show(struct group_show *gs, struct buddy *buddy, char **xpm); |
| 112 static void remove_buddy_show(struct group_show *gs, struct buddy_show *bs); | 125 static void remove_buddy_show(struct group_show *gs, struct buddy_show *bs); |
| 113 static struct group_show *find_gs_by_bs(struct buddy_show *b); | 126 static struct group_show *find_gs_by_bs(struct buddy_show *b); |
| 127 static void update_num_group(struct group_show *gs); | |
| 114 static void redo_buddy_list(); | 128 static void redo_buddy_list(); |
| 129 | |
| 130 void handle_group_rename(struct group *g, char* prevname) { | |
| 131 struct group_show *gs, *new_gs; | |
| 132 struct buddy_show *bs; | |
| 133 struct buddy *b; | |
| 134 GSList *m; | |
| 135 GtkCTreeNode *c; | |
| 136 | |
| 137 c = gtk_ctree_find_by_row_data(GTK_CTREE(edittree), NULL, g); | |
| 138 gtk_ctree_node_set_text(GTK_CTREE(edittree), c, 0, g->name); | |
| 139 | |
| 140 gs = find_group_show(prevname); | |
| 141 if (!gs) { | |
| 142 return; | |
| 143 } | |
| 144 new_gs = find_group_show(g->name); | |
| 145 if (new_gs) { | |
| 146 /* transfer everything that was in gs and is in the same gaim_conn as g | |
| 147 * over to new_gs. */ | |
| 148 m = gs->members; | |
| 149 while (m) { | |
| 150 bs = (struct buddy_show *)m->data; | |
| 151 if (g_slist_index(bs->connlist, g->gc) >= 0) { | |
| 152 b = find_buddy(g->gc, bs->name); | |
| 153 m = g_slist_next(m); | |
| 154 bs->connlist = g_slist_remove(bs->connlist, g->gc); | |
| 155 if (!bs->connlist) { | |
| 156 gs->members = g_slist_remove(gs->members, bs); | |
| 157 if (bs->log_timer > 0) | |
| 158 gtk_timeout_remove(bs->log_timer); | |
| 159 bs->log_timer = 0; | |
| 160 remove_buddy_show(gs, bs); | |
| 161 g_free(bs->show); | |
| 162 g_free(bs->name); | |
| 163 g_free(bs); | |
| 164 } | |
| 165 if ((bs = find_buddy_show(new_gs, b->name)) == NULL) { | |
| 166 if (*g->gc->prpl->list_icon) { | |
| 167 bs = new_buddy_show(new_gs, b, | |
| 168 (*g->gc->prpl->list_icon)(b->uc)); | |
| 169 } else { | |
| 170 bs = new_buddy_show(new_gs, b, (char **)no_icon_xpm); | |
| 171 } | |
| 172 } | |
| 173 bs->connlist = g_slist_append(bs->connlist, g->gc); | |
| 174 } else { | |
| 175 m = g_slist_next(m); | |
| 176 } | |
| 177 } | |
| 178 if (!gs->members) { | |
| 179 /* we just transferred all of the members out of this group_show, | |
| 180 * so this group_show serves no purpose now. */ | |
| 181 shows = g_slist_remove(shows, gs); | |
| 182 gtk_tree_remove_item(GTK_TREE(buddies), gs->item); | |
| 183 g_free(gs->name); | |
| 184 g_free(gs); | |
| 185 } else { | |
| 186 update_num_group(gs); | |
| 187 } | |
| 188 } else { | |
| 189 /* two possible actions: if gs contains things that are only from g, | |
| 190 * just rename gs and fix the label. otherwise, move everything in g | |
| 191 * over to another group_show */ | |
| 192 for (m = gs->members; m != NULL; m = g_slist_next(m)) { | |
| 193 bs = (struct buddy_show *)m->data; | |
| 194 if (g_slist_index(bs->connlist, g->gc) < 0 || | |
| 195 g_slist_length(bs->connlist) > 1) { | |
| 196 break; | |
| 197 } | |
| 198 } | |
| 199 if (m) { | |
| 200 /* there's something from a different gaim_connection. */ | |
| 201 new_gs = new_group_show(g->name); | |
| 202 m = gs->members; | |
| 203 while (m) { | |
| 204 bs = (struct buddy_show *)m->data; | |
| 205 if (g_slist_index(bs->connlist, g->gc) >= 0) { | |
| 206 b = find_buddy(g->gc, bs->name); | |
| 207 m = g_slist_next(m); | |
| 208 bs->connlist = g_slist_remove(bs->connlist, g->gc); | |
| 209 if (!bs->connlist) { | |
| 210 gs->members = g_slist_remove(gs->members, bs); | |
| 211 if (bs->log_timer > 0) | |
| 212 gtk_timeout_remove(bs->log_timer); | |
| 213 bs->log_timer = 0; | |
| 214 remove_buddy_show(gs, bs); | |
| 215 g_free(bs->show); | |
| 216 g_free(bs->name); | |
| 217 g_free(bs); | |
| 218 } | |
| 219 if (*g->gc->prpl->list_icon) { | |
| 220 bs = new_buddy_show(new_gs, b, | |
| 221 (*g->gc->prpl->list_icon)(b->uc)); | |
| 222 } else { | |
| 223 bs = new_buddy_show(new_gs, b, (char **)no_icon_xpm); | |
| 224 } | |
| 225 bs->connlist = g_slist_append(NULL, g->gc); | |
| 226 } else { | |
| 227 m = g_slist_next(m); | |
| 228 } | |
| 229 } | |
| 230 update_num_group(gs); | |
| 231 update_num_group(new_gs); | |
| 232 } else { | |
| 233 g_free(gs->name); | |
| 234 gs->name = g_strdup(g->name); | |
| 235 update_num_group(gs); | |
| 236 } | |
| 237 } | |
| 238 } | |
| 239 | |
| 240 void handle_buddy_rename(struct buddy *b, char *prevname) { | |
| 241 struct buddy_show *bs; | |
| 242 struct group_show *gs; | |
| 243 struct group *g; | |
| 244 GtkCTreeNode *c; | |
| 245 char buf[256]; | |
| 246 | |
| 247 c = gtk_ctree_find_by_row_data(GTK_CTREE(edittree), NULL, b); | |
| 248 if (strcmp(b->show, b->name)) | |
| 249 g_snprintf(buf, sizeof(buf), "%s (%s)", b->name, b->show); | |
| 250 else | |
| 251 g_snprintf(buf, sizeof(buf), "%s", b->name); | |
| 252 gtk_ctree_node_set_text(GTK_CTREE(edittree), c, 0, buf); | |
| 253 | |
| 254 gs = find_group_show(prevname); | |
| 255 | |
| 256 g = find_group_by_buddy(b->gc, b->name); | |
| 257 if (!g) { | |
| 258 /* shouldn't happen */ | |
| 259 return; | |
| 260 } | |
| 261 gs = find_group_show(g->name); | |
| 262 if (!gs) { | |
| 263 return; | |
| 264 } | |
| 265 bs = find_buddy_show(gs, prevname); | |
| 266 if (!bs) { | |
| 267 /* buddy's offline */ | |
| 268 return; | |
| 269 } | |
| 270 | |
| 271 if (strcmp(b->name, prevname)) { | |
| 272 bs->connlist = g_slist_remove(bs->connlist, b->gc); | |
| 273 if (!bs->connlist) { | |
| 274 gs->members = g_slist_remove(gs->members, bs); | |
| 275 if (bs->log_timer > 0) | |
| 276 gtk_timeout_remove(bs->log_timer); | |
| 277 bs->log_timer = 0; | |
| 278 remove_buddy_show(gs, bs); | |
| 279 g_free(bs->show); | |
| 280 g_free(bs->name); | |
| 281 g_free(bs); | |
| 282 } | |
| 283 } else { | |
| 284 gtk_label_set_text(GTK_LABEL(bs->label), b->show); | |
| 285 } | |
| 286 } | |
| 115 | 287 |
| 116 void destroy_buddy() | 288 void destroy_buddy() |
| 117 { | 289 { |
| 118 if (blist) | 290 if (blist) |
| 119 gtk_widget_destroy(blist); | 291 gtk_widget_destroy(blist); |
| 363 #endif /* USE_APPLET */ | 535 #endif /* USE_APPLET */ |
| 364 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) | 536 if ( ticker_prefs & OPT_DISP_SHOW_BUDDYTICKER ) |
| 365 BuddyTickerSignoff(); | 537 BuddyTickerSignoff(); |
| 366 } | 538 } |
| 367 | 539 |
| 368 void handle_click_group(GtkWidget *widget, GdkEventButton *event, gpointer func_data) | 540 void handle_click_group(GtkWidget *widget, GdkEventButton *event, struct group *g) |
| 369 { | 541 { |
| 370 if (event->type == GDK_2BUTTON_PRESS) { | 542 if (event->type == GDK_2BUTTON_PRESS) { |
| 371 if (GTK_TREE_ITEM(widget)->expanded) | 543 if (GTK_TREE_ITEM(widget)->expanded) |
| 372 gtk_tree_item_collapse(GTK_TREE_ITEM(widget)); | 544 gtk_tree_item_collapse(GTK_TREE_ITEM(widget)); |
| 373 else | 545 else |
| 374 gtk_tree_item_expand(GTK_TREE_ITEM(widget)); | 546 gtk_tree_item_expand(GTK_TREE_ITEM(widget)); |
| 375 } else { | 547 } else if ((event->type == GDK_BUTTON_PRESS) && (event->button == 3)) { |
| 376 } | 548 } |
| 377 } | 549 } |
| 378 | 550 |
| 379 void pressed_im(GtkWidget *widget, struct buddy_show *b) | 551 void pressed_im(GtkWidget *widget, struct buddy_show *b) |
| 380 { | 552 { |
| 417 } else { | 589 } else { |
| 418 c = new_conversation(buddy); | 590 c = new_conversation(buddy); |
| 419 } | 591 } |
| 420 } | 592 } |
| 421 | 593 |
| 422 void pressed_alias_bs(GtkWidget *widget, struct buddy_show *b) | 594 void pressed_alias_bs(GtkWidget *widget, struct buddy_show *bs) |
| 423 { | 595 { |
| 424 alias_dialog_bs(b); | 596 alias_dialog_bud(find_buddy(bs->connlist->data, bs->name)); |
| 425 } | 597 } |
| 426 | 598 |
| 427 void pressed_alias_bud(GtkWidget *widget, struct buddy *b) | 599 void pressed_alias_bud(GtkWidget *widget, struct buddy *b) |
| 428 { | 600 { |
| 429 alias_dialog_bud(b); | 601 alias_dialog_bud(b); |
| 554 return TRUE; | 726 return TRUE; |
| 555 | 727 |
| 556 node = gtk_ctree_node_nth(GTK_CTREE(edittree), row); | 728 node = gtk_ctree_node_nth(GTK_CTREE(edittree), row); |
| 557 type = gtk_ctree_node_get_row_data(GTK_CTREE(edittree), node); | 729 type = gtk_ctree_node_get_row_data(GTK_CTREE(edittree), node); |
| 558 if (*type == EDIT_GROUP) { | 730 if (*type == EDIT_GROUP) { |
| 559 /*struct group *group = (struct group *)type; | 731 struct group *group = (struct group *)type; |
| 560 menu = gtk_menu_new(); | 732 menu = gtk_menu_new(); |
| 561 | 733 |
| 562 button = gtk_menu_item_new_with_label(_("Rename")); | 734 button = gtk_menu_item_new_with_label(_("Rename")); |
| 563 gtk_signal_connect(GTK_OBJECT(button), "activate", | 735 gtk_signal_connect(GTK_OBJECT(button), "activate", |
| 564 GTK_SIGNAL_FUNC(rename_group), node); | 736 GTK_SIGNAL_FUNC(show_rename_group), group); |
| 565 gtk_menu_append(GTK_MENU(menu), button); | 737 gtk_menu_append(GTK_MENU(menu), button); |
| 566 gtk_widget_show(button); | 738 gtk_widget_show(button); |
| 567 | 739 |
| 568 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, | 740 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, |
| 569 event->button, event->time); | 741 event->button, event->time); |
| 570 */ | |
| 571 } else if (*type == EDIT_BUDDY) { | 742 } else if (*type == EDIT_BUDDY) { |
| 572 struct buddy *b = (struct buddy *)type; | 743 struct buddy *b = (struct buddy *)type; |
| 573 menu = gtk_menu_new(); | 744 menu = gtk_menu_new(); |
| 574 | 745 |
| 575 button = gtk_menu_item_new_with_label(_("Alias")); | 746 button = gtk_menu_item_new_with_label(_("Alias")); |
| 583 gtk_signal_connect(GTK_OBJECT(button), "activate", | 754 gtk_signal_connect(GTK_OBJECT(button), "activate", |
| 584 GTK_SIGNAL_FUNC(un_alias), b); | 755 GTK_SIGNAL_FUNC(un_alias), b); |
| 585 gtk_menu_append(GTK_MENU(menu), button); | 756 gtk_menu_append(GTK_MENU(menu), button); |
| 586 gtk_widget_show(button); | 757 gtk_widget_show(button); |
| 587 } | 758 } |
| 759 | |
| 760 button = gtk_menu_item_new_with_label(_("Rename")); | |
| 761 gtk_signal_connect(GTK_OBJECT(button), "activate", | |
| 762 GTK_SIGNAL_FUNC(show_rename_buddy), b); | |
| 763 gtk_menu_append(GTK_MENU(menu), button); | |
| 764 gtk_widget_show(button); | |
| 588 | 765 |
| 589 button = gtk_menu_item_new_with_label(_("Add Buddy Pounce")); | 766 button = gtk_menu_item_new_with_label(_("Add Buddy Pounce")); |
| 590 gtk_signal_connect(GTK_OBJECT(button), "activate", | 767 gtk_signal_connect(GTK_OBJECT(button), "activate", |
| 591 GTK_SIGNAL_FUNC(new_bp_callback), b->name); | 768 GTK_SIGNAL_FUNC(new_bp_callback), b->name); |
| 592 gtk_menu_append(GTK_MENU(menu), button); | 769 gtk_menu_append(GTK_MENU(menu), button); |
| 1743 g->name = g_strdup(group); | 1920 g->name = g_strdup(group); |
| 1744 | 1921 |
| 1745 g->item = gtk_tree_item_new(); | 1922 g->item = gtk_tree_item_new(); |
| 1746 gtk_tree_insert(GTK_TREE(buddies), g->item, pos); | 1923 gtk_tree_insert(GTK_TREE(buddies), g->item, pos); |
| 1747 gtk_signal_connect(GTK_OBJECT(g->item), "button_press_event", | 1924 gtk_signal_connect(GTK_OBJECT(g->item), "button_press_event", |
| 1748 GTK_SIGNAL_FUNC(handle_click_group), NULL); | 1925 GTK_SIGNAL_FUNC(handle_click_group), g); |
| 1749 gtk_widget_show(g->item); | 1926 gtk_widget_show(g->item); |
| 1750 | 1927 |
| 1751 g->label = gtk_label_new(group); | 1928 g->label = gtk_label_new(group); |
| 1752 gtk_misc_set_alignment(GTK_MISC(g->label), 0.0, 0.5); | 1929 gtk_misc_set_alignment(GTK_MISC(g->label), 0.0, 0.5); |
| 1753 gtk_container_add(GTK_CONTAINER(g->item), g->label); | 1930 gtk_container_add(GTK_CONTAINER(g->item), g->label); |
| 1785 | 1962 |
| 1786 box = gtk_hbox_new(FALSE, 1); | 1963 box = gtk_hbox_new(FALSE, 1); |
| 1787 gtk_container_add(GTK_CONTAINER(b->item), box); | 1964 gtk_container_add(GTK_CONTAINER(b->item), box); |
| 1788 gtk_widget_show(box); | 1965 gtk_widget_show(box); |
| 1789 | 1966 |
| 1790 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, xpm); | 1967 pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, xpm ? xpm : no_icon_xpm); |
| 1791 b->pix = gtk_pixmap_new(pm, bm); | 1968 b->pix = gtk_pixmap_new(pm, bm); |
| 1792 gtk_box_pack_start(GTK_BOX(box), b->pix, FALSE, FALSE, 1); | 1969 gtk_box_pack_start(GTK_BOX(box), b->pix, FALSE, FALSE, 1); |
| 1793 gtk_widget_show(b->pix); | 1970 gtk_widget_show(b->pix); |
| 1794 if (!(display_options & OPT_DISP_SHOW_PIXMAPS)) | 1971 if (!(display_options & OPT_DISP_SHOW_PIXMAPS)) |
| 1795 gtk_widget_hide(b->pix); | 1972 gtk_widget_hide(b->pix); |
