| 73 gaim_blist_set_visible(FALSE); |
73 gaim_blist_set_visible(FALSE); |
| 74 else |
74 else |
| 75 do_quit(); |
75 do_quit(); |
| 76 } |
76 } |
| 77 |
77 |
| |
78 static void gtk_blist_menu_info_cb(GtkWidget *w, struct buddy *b) |
| |
79 { |
| |
80 serv_get_info(b->account->gc, b->name); |
| |
81 } |
| |
82 |
| 78 static void gtk_blist_menu_im_cb(GtkWidget *w, struct buddy *b) |
83 static void gtk_blist_menu_im_cb(GtkWidget *w, struct buddy *b) |
| 79 { |
84 { |
| 80 gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); |
85 gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); |
| 81 } |
86 } |
| 82 |
87 |
| 201 |
206 |
| 202 menu = gtk_menu_new(); |
207 menu = gtk_menu_new(); |
| 203 |
208 |
| 204 /* Protocol specific options */ |
209 /* Protocol specific options */ |
| 205 prpl = find_prpl(((struct buddy*)node)->account->protocol); |
210 prpl = find_prpl(((struct buddy*)node)->account->protocol); |
| |
211 |
| |
212 if(prpl && prpl->get_info) { |
| |
213 menuitem = gtk_image_menu_item_new_with_mnemonic("_Get Info"); |
| |
214 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_info_cb), node); |
| |
215 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| |
216 } |
| |
217 |
| |
218 menuitem = gtk_image_menu_item_new_with_mnemonic("_IM"); |
| |
219 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_im_cb), node); |
| |
220 image = gtk_image_new_from_stock(GAIM_STOCK_IM, GTK_ICON_SIZE_MENU); |
| |
221 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); |
| |
222 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| |
223 |
| |
224 menuitem = gtk_image_menu_item_new_with_mnemonic("_Alias"); |
| |
225 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_alias_cb), node); |
| |
226 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| |
227 |
| |
228 menuitem = gtk_image_menu_item_new_with_mnemonic("Add Buddy _Pounce"); |
| |
229 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_bp_cb), node); |
| |
230 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| |
231 |
| |
232 menuitem = gtk_image_menu_item_new_with_mnemonic("View _Log"); |
| |
233 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_showlog_cb), node); |
| |
234 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| |
235 |
| 206 if (prpl) { |
236 if (prpl) { |
| 207 list = prpl->buddy_menu(((struct buddy*)node)->account->gc, ((struct buddy*)node)->name); |
237 list = prpl->buddy_menu(((struct buddy*)node)->account->gc, ((struct buddy*)node)->name); |
| 208 while (list) { |
238 while (list) { |
| 209 struct proto_buddy_menu *pbm = list->data; |
239 struct proto_buddy_menu *pbm = list->data; |
| 210 menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); |
240 menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); |
| 212 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gaim_proto_menu_cb), node); |
242 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gaim_proto_menu_cb), node); |
| 213 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
243 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| 214 list = list->next; |
244 list = list->next; |
| 215 } |
245 } |
| 216 } |
246 } |
| 217 |
|
| 218 menuitem = gtk_image_menu_item_new_with_mnemonic("_IM"); |
|
| 219 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_im_cb), node); |
|
| 220 image = gtk_image_new_from_stock(GAIM_STOCK_IM, GTK_ICON_SIZE_MENU); |
|
| 221 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); |
|
| 222 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 223 |
|
| 224 menuitem = gtk_image_menu_item_new_with_mnemonic("_Alias"); |
|
| 225 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_alias_cb), node); |
|
| 226 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 227 |
|
| 228 menuitem = gtk_image_menu_item_new_with_mnemonic("Add Buddy _Pounce"); |
|
| 229 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_bp_cb), node); |
|
| 230 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 231 |
|
| 232 menuitem = gtk_image_menu_item_new_with_mnemonic("View _Log"); |
|
| 233 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_blist_menu_showlog_cb), node); |
|
| 234 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
| 235 |
247 |
| 236 gtk_widget_show_all(menu); |
248 gtk_widget_show_all(menu); |
| 237 |
249 |
| 238 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); |
250 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); |
| 239 |
251 |
| 342 { |
354 { |
| 343 GtkStyle *style; |
355 GtkStyle *style; |
| 344 GdkPixbuf *pixbuf = gaim_gtk_blist_get_status_icon(b, GAIM_STATUS_ICON_LARGE); |
356 GdkPixbuf *pixbuf = gaim_gtk_blist_get_status_icon(b, GAIM_STATUS_ICON_LARGE); |
| 345 PangoLayout *layout; |
357 PangoLayout *layout; |
| 346 char *tooltiptext = gaim_get_tooltip_text(b); |
358 char *tooltiptext = gaim_get_tooltip_text(b); |
| |
359 int width; |
| 347 |
360 |
| 348 layout = gtk_widget_create_pango_layout (gtkblist->tipwindow, NULL); |
361 layout = gtk_widget_create_pango_layout (gtkblist->tipwindow, NULL); |
| 349 pango_layout_set_markup(layout, tooltiptext, strlen(tooltiptext)); |
362 pango_layout_set_markup(layout, tooltiptext, strlen(tooltiptext)); |
| |
363 pango_layout_set_wrap(layout, PANGO_WRAP_WORD); |
| 350 style = gtkblist->tipwindow->style; |
364 style = gtkblist->tipwindow->style; |
| 351 |
365 |
| 352 gtk_paint_flat_box (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, |
366 gtk_paint_flat_box (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, |
| 353 NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1); |
367 NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1); |
| 354 |
368 |
| 355 #if GTK_CHECK_VERSION(2,2,0) |
369 #if GTK_CHECK_VERSION(2,2,0) |
| 356 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, pixbuf, |
370 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, pixbuf, |
| 437 { |
451 { |
| 438 GtkTreePath *path; |
452 GtkTreePath *path; |
| 439 |
453 |
| 440 if (gtkblist->timeout) { |
454 if (gtkblist->timeout) { |
| 441 if ((event->y > gtkblist->rect.y) && ((event->y - gtkblist->rect.height) < gtkblist->rect.y)) |
455 if ((event->y > gtkblist->rect.y) && ((event->y - gtkblist->rect.height) < gtkblist->rect.y)) |
| 442 return; |
456 return FALSE; |
| 443 /* We've left the cell. Remove the timeout and create a new one below */ |
457 /* We've left the cell. Remove the timeout and create a new one below */ |
| 444 if (gtkblist->tipwindow) { |
458 if (gtkblist->tipwindow) { |
| 445 gtk_widget_destroy(gtkblist->tipwindow); |
459 gtk_widget_destroy(gtkblist->tipwindow); |
| 446 gtkblist->tipwindow = NULL; |
460 gtkblist->tipwindow = NULL; |
| 447 } |
461 } |
| 524 struct prpl* prpl = find_prpl(b->account->protocol); |
538 struct prpl* prpl = find_prpl(b->account->protocol); |
| 525 char *statustext = NULL; |
539 char *statustext = NULL; |
| 526 char *warning = NULL, *idletime = NULL; |
540 char *warning = NULL, *idletime = NULL; |
| 527 |
541 |
| 528 if (prpl->tooltip_text) { |
542 if (prpl->tooltip_text) { |
| 529 char *tmp = prpl->tooltip_text(b); |
543 statustext = prpl->tooltip_text(b); |
| 530 if (tmp) { |
544 } |
| 531 statustext = g_markup_escape_text(tmp, strlen(tmp)); |
545 |
| 532 g_free(tmp); |
|
| 533 } |
|
| 534 } |
|
| 535 |
|
| 536 if (b->idle) { |
546 if (b->idle) { |
| 537 int ihrs, imin; |
547 int ihrs, imin; |
| 538 time_t t; |
548 time_t t; |
| 539 time(&t); |
549 time(&t); |
| 540 ihrs = (t - b->idle) / 3600; |
550 ihrs = (t - b->idle) / 3600; |
| 541 imin = ((t - b->idle) / 60) % 60; |
551 imin = ((t - b->idle) / 60) % 60; |
| 542 if (ihrs) |
552 if (ihrs) |
| 543 idletime = g_strdup_printf(_("<b>Idle</b> %dh%02dm"), ihrs, imin); |
553 idletime = g_strdup_printf(_("<b>Idle:</b> %dh%02dm"), ihrs, imin); |
| 544 else |
554 else |
| 545 idletime = g_strdup_printf(_("<b>Idle</b> %dm"), imin); |
555 idletime = g_strdup_printf(_("<b>Idle:</b> %dm"), imin); |
| 546 } |
556 } |
| 547 |
557 |
| 548 if (b->evil > 0) |
558 if (b->evil > 0) |
| 549 warning = g_strdup_printf(_("<b>Warned</b> %d%%"), b->evil); |
559 warning = g_strdup_printf(_("<b>Warned:</b> %d%%"), b->evil); |
| 550 |
560 |
| 551 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>" |
561 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>" |
| 552 "%s %s %s" /* Alias */ |
562 "%s %s %s" /* Alias */ |
| 553 "%s %s %s" /* Nickname */ |
563 "%s %s %s" /* Nickname */ |
| 554 "%s %s" /* Idle */ |
564 "%s %s" /* Idle */ |
| 555 "%s %s" /* Warning */ |
565 "%s %s" /* Warning */ |
| 556 "%s %s", /* Status */ |
566 "%s %s", /* Status */ |
| 557 b->name, |
567 b->name, |
| 558 b->alias && b->alias[0] ? "\n" : "", b->alias && b->alias[0] ? _("<b>Alias</b> ") : "", b->alias ? b->alias : "", |
568 b->alias && b->alias[0] ? "\n" : "", b->alias && b->alias[0] ? _("<b>Alias:</b> ") : "", b->alias ? b->alias : "", |
| 559 b->server_alias ? "\n" : "", b->server_alias ? _("<b>Nickname</b> ") : "", b->server_alias ? b->server_alias : "", |
569 b->server_alias ? "\n" : "", b->server_alias ? _("<b>Nickname:</b> ") : "", b->server_alias ? b->server_alias : "", |
| 560 b->idle ? "\n" : "", b->idle ? idletime : "", |
570 b->idle ? "\n" : "", b->idle ? idletime : "", |
| 561 b->evil ? "\n" : "", b->evil ? warning : "", |
571 b->evil ? "\n" : "", b->evil ? warning : "", |
| 562 statustext ? "\n" : "", statustext ? statustext : ""); |
572 statustext ? "\n" : "", statustext ? statustext : ""); |
| 563 return text; |
573 return text; |
| 564 |
574 |
| 728 |
738 |
| 729 /* XXX Clean up this crap */ |
739 /* XXX Clean up this crap */ |
| 730 |
740 |
| 731 int ihrs, imin; |
741 int ihrs, imin; |
| 732 char *idletime = NULL, *warning = NULL, *statustext = NULL; |
742 char *idletime = NULL, *warning = NULL, *statustext = NULL; |
| 733 time_t t; |
743 time_t t; |
| 734 |
744 |
| 735 if (!(blist_options & OPT_BLIST_SHOW_ICONS)) { |
745 if (!(blist_options & OPT_BLIST_SHOW_ICONS)) { |
| 736 if (b->idle > 0 && blist_options & OPT_BLIST_GREY_IDLERS) { |
746 if (b->idle > 0 && blist_options & OPT_BLIST_GREY_IDLERS) { |
| 737 text = g_strdup_printf("<span color='dim grey'>%s</span>", |
747 text = g_strdup_printf("<span color='dim grey'>%s</span>", |
| 738 esc); |
748 esc); |
| 746 time(&t); |
756 time(&t); |
| 747 ihrs = (t - b->idle) / 3600; |
757 ihrs = (t - b->idle) / 3600; |
| 748 imin = ((t - b->idle) / 60) % 60; |
758 imin = ((t - b->idle) / 60) % 60; |
| 749 |
759 |
| 750 if (prpl->status_text) { |
760 if (prpl->status_text) { |
| 751 const char *tmp = prpl->status_text(b); |
761 char *tmp = prpl->status_text(b); |
| 752 if (tmp) |
762 |
| 753 statustext = g_markup_escape_text(tmp, strlen(tmp)); |
763 if(tmp) { |
| 754 } |
764 if(strlen(tmp) > 20) |
| 755 |
765 statustext = g_strdup_printf("%.16s...", tmp); |
| |
766 else |
| |
767 statustext = g_strdup(tmp); |
| |
768 g_free(tmp); |
| |
769 } |
| |
770 } |
| |
771 |
| 756 if (b->idle) { |
772 if (b->idle) { |
| 757 if (ihrs) |
773 if (ihrs) |
| 758 idletime = g_strdup_printf(_("Idle (%dh%02dm)"), ihrs, imin); |
774 idletime = g_strdup_printf(_("Idle (%dh%02dm)"), ihrs, imin); |
| 759 else |
775 else |
| 760 idletime = g_strdup_printf(_("Idle (%dm)"), imin); |
776 idletime = g_strdup_printf(_("Idle (%dm)"), imin); |