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