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);