Mercurial > pidgin
diff 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 |
line wrap: on
line diff
--- a/src/buddy.c Thu Apr 19 03:55:12 2001 +0000 +++ b/src/buddy.c Fri Apr 20 07:39:09 2001 +0000 @@ -93,6 +93,19 @@ /* Predefine some functions */ static void new_bp_callback(GtkWidget *w, char *name); +struct buddy_show { + GtkWidget *item; + GtkWidget *pix; + GtkWidget *label; + GtkWidget *warn; + GtkWidget *idle; + char *name; + char *show; + GSList *connlist; + guint log_timer; + gint sound; +}; + /* stuff for actual display of buddy list */ struct group_show { GtkWidget *item; @@ -111,8 +124,167 @@ static struct buddy_show *new_buddy_show(struct group_show *gs, struct buddy *buddy, char **xpm); static void remove_buddy_show(struct group_show *gs, struct buddy_show *bs); static struct group_show *find_gs_by_bs(struct buddy_show *b); +static void update_num_group(struct group_show *gs); static void redo_buddy_list(); +void handle_group_rename(struct group *g, char* prevname) { + struct group_show *gs, *new_gs; + struct buddy_show *bs; + struct buddy *b; + GSList *m; + GtkCTreeNode *c; + + c = gtk_ctree_find_by_row_data(GTK_CTREE(edittree), NULL, g); + gtk_ctree_node_set_text(GTK_CTREE(edittree), c, 0, g->name); + + gs = find_group_show(prevname); + if (!gs) { + return; + } + new_gs = find_group_show(g->name); + if (new_gs) { + /* transfer everything that was in gs and is in the same gaim_conn as g + * over to new_gs. */ + m = gs->members; + while (m) { + bs = (struct buddy_show *)m->data; + if (g_slist_index(bs->connlist, g->gc) >= 0) { + b = find_buddy(g->gc, bs->name); + m = g_slist_next(m); + bs->connlist = g_slist_remove(bs->connlist, g->gc); + if (!bs->connlist) { + gs->members = g_slist_remove(gs->members, bs); + if (bs->log_timer > 0) + gtk_timeout_remove(bs->log_timer); + bs->log_timer = 0; + remove_buddy_show(gs, bs); + g_free(bs->show); + g_free(bs->name); + g_free(bs); + } + if ((bs = find_buddy_show(new_gs, b->name)) == NULL) { + if (*g->gc->prpl->list_icon) { + bs = new_buddy_show(new_gs, b, + (*g->gc->prpl->list_icon)(b->uc)); + } else { + bs = new_buddy_show(new_gs, b, (char **)no_icon_xpm); + } + } + bs->connlist = g_slist_append(bs->connlist, g->gc); + } else { + m = g_slist_next(m); + } + } + if (!gs->members) { + /* we just transferred all of the members out of this group_show, + * so this group_show serves no purpose now. */ + shows = g_slist_remove(shows, gs); + gtk_tree_remove_item(GTK_TREE(buddies), gs->item); + g_free(gs->name); + g_free(gs); + } else { + update_num_group(gs); + } + } else { + /* two possible actions: if gs contains things that are only from g, + * just rename gs and fix the label. otherwise, move everything in g + * over to another group_show */ + for (m = gs->members; m != NULL; m = g_slist_next(m)) { + bs = (struct buddy_show *)m->data; + if (g_slist_index(bs->connlist, g->gc) < 0 || + g_slist_length(bs->connlist) > 1) { + break; + } + } + if (m) { + /* there's something from a different gaim_connection. */ + new_gs = new_group_show(g->name); + m = gs->members; + while (m) { + bs = (struct buddy_show *)m->data; + if (g_slist_index(bs->connlist, g->gc) >= 0) { + b = find_buddy(g->gc, bs->name); + m = g_slist_next(m); + bs->connlist = g_slist_remove(bs->connlist, g->gc); + if (!bs->connlist) { + gs->members = g_slist_remove(gs->members, bs); + if (bs->log_timer > 0) + gtk_timeout_remove(bs->log_timer); + bs->log_timer = 0; + remove_buddy_show(gs, bs); + g_free(bs->show); + g_free(bs->name); + g_free(bs); + } + if (*g->gc->prpl->list_icon) { + bs = new_buddy_show(new_gs, b, + (*g->gc->prpl->list_icon)(b->uc)); + } else { + bs = new_buddy_show(new_gs, b, (char **)no_icon_xpm); + } + bs->connlist = g_slist_append(NULL, g->gc); + } else { + m = g_slist_next(m); + } + } + update_num_group(gs); + update_num_group(new_gs); + } else { + g_free(gs->name); + gs->name = g_strdup(g->name); + update_num_group(gs); + } + } +} + +void handle_buddy_rename(struct buddy *b, char *prevname) { + struct buddy_show *bs; + struct group_show *gs; + struct group *g; + GtkCTreeNode *c; + char buf[256]; + + c = gtk_ctree_find_by_row_data(GTK_CTREE(edittree), NULL, b); + if (strcmp(b->show, b->name)) + g_snprintf(buf, sizeof(buf), "%s (%s)", b->name, b->show); + else + g_snprintf(buf, sizeof(buf), "%s", b->name); + gtk_ctree_node_set_text(GTK_CTREE(edittree), c, 0, buf); + + gs = find_group_show(prevname); + + g = find_group_by_buddy(b->gc, b->name); + if (!g) { + /* shouldn't happen */ + return; + } + gs = find_group_show(g->name); + if (!gs) { + return; + } + bs = find_buddy_show(gs, prevname); + if (!bs) { + /* buddy's offline */ + return; + } + + if (strcmp(b->name, prevname)) { + bs->connlist = g_slist_remove(bs->connlist, b->gc); + if (!bs->connlist) { + gs->members = g_slist_remove(gs->members, bs); + if (bs->log_timer > 0) + gtk_timeout_remove(bs->log_timer); + bs->log_timer = 0; + remove_buddy_show(gs, bs); + g_free(bs->show); + g_free(bs->name); + g_free(bs); + } + } else { + gtk_label_set_text(GTK_LABEL(bs->label), b->show); + } +} + void destroy_buddy() { if (blist) @@ -365,14 +537,14 @@ BuddyTickerSignoff(); } -void handle_click_group(GtkWidget *widget, GdkEventButton *event, gpointer func_data) +void handle_click_group(GtkWidget *widget, GdkEventButton *event, struct group *g) { if (event->type == GDK_2BUTTON_PRESS) { if (GTK_TREE_ITEM(widget)->expanded) gtk_tree_item_collapse(GTK_TREE_ITEM(widget)); else gtk_tree_item_expand(GTK_TREE_ITEM(widget)); - } else { + } else if ((event->type == GDK_BUTTON_PRESS) && (event->button == 3)) { } } @@ -419,9 +591,9 @@ } } -void pressed_alias_bs(GtkWidget *widget, struct buddy_show *b) +void pressed_alias_bs(GtkWidget *widget, struct buddy_show *bs) { - alias_dialog_bs(b); + alias_dialog_bud(find_buddy(bs->connlist->data, bs->name)); } void pressed_alias_bud(GtkWidget *widget, struct buddy *b) @@ -556,18 +728,17 @@ node = gtk_ctree_node_nth(GTK_CTREE(edittree), row); type = gtk_ctree_node_get_row_data(GTK_CTREE(edittree), node); if (*type == EDIT_GROUP) { - /*struct group *group = (struct group *)type; + struct group *group = (struct group *)type; menu = gtk_menu_new(); button = gtk_menu_item_new_with_label(_("Rename")); gtk_signal_connect(GTK_OBJECT(button), "activate", - GTK_SIGNAL_FUNC(rename_group), node); + GTK_SIGNAL_FUNC(show_rename_group), group); gtk_menu_append(GTK_MENU(menu), button); gtk_widget_show(button); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); - */ } else if (*type == EDIT_BUDDY) { struct buddy *b = (struct buddy *)type; menu = gtk_menu_new(); @@ -585,6 +756,12 @@ gtk_menu_append(GTK_MENU(menu), button); gtk_widget_show(button); } + + button = gtk_menu_item_new_with_label(_("Rename")); + gtk_signal_connect(GTK_OBJECT(button), "activate", + GTK_SIGNAL_FUNC(show_rename_buddy), b); + gtk_menu_append(GTK_MENU(menu), button); + gtk_widget_show(button); button = gtk_menu_item_new_with_label(_("Add Buddy Pounce")); gtk_signal_connect(GTK_OBJECT(button), "activate", @@ -1745,7 +1922,7 @@ g->item = gtk_tree_item_new(); gtk_tree_insert(GTK_TREE(buddies), g->item, pos); gtk_signal_connect(GTK_OBJECT(g->item), "button_press_event", - GTK_SIGNAL_FUNC(handle_click_group), NULL); + GTK_SIGNAL_FUNC(handle_click_group), g); gtk_widget_show(g->item); g->label = gtk_label_new(group); @@ -1787,7 +1964,7 @@ gtk_container_add(GTK_CONTAINER(b->item), box); gtk_widget_show(box); - pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, xpm); + pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm, NULL, xpm ? xpm : no_icon_xpm); b->pix = gtk_pixmap_new(pm, bm); gtk_box_pack_start(GTK_BOX(box), b->pix, FALSE, FALSE, 1); gtk_widget_show(b->pix);
