comparison pidgin/gtkblist.c @ 21947:c6b408d16011

merge of '791803b6696dd26a5193ad76f80dbc7c6cb2687a' and 'e7dd3b30ece9f95dd95249583812659312c457e6'
author Stu Tomlinson <stu@nosnilmot.com>
date Fri, 28 Dec 2007 02:49:23 +0000
parents 3fc5862b834a
children d1f282dbbda1
comparison
equal deleted inserted replaced
21923:1981f277ab01 21947:c6b408d16011
407 407
408 #if GTK_CHECK_VERSION(2,6,0) 408 #if GTK_CHECK_VERSION(2,6,0)
409 static void gtk_blist_renderer_editing_cancelled_cb(GtkCellRenderer *renderer, PurpleBuddyList *list) 409 static void gtk_blist_renderer_editing_cancelled_cb(GtkCellRenderer *renderer, PurpleBuddyList *list)
410 { 410 {
411 editing_blist = FALSE; 411 editing_blist = FALSE;
412 g_object_set(G_OBJECT(renderer), "editable", FALSE, NULL);
412 pidgin_blist_refresh(list); 413 pidgin_blist_refresh(list);
413 } 414 }
414 415
415 static void gtk_blist_renderer_editing_started_cb(GtkCellRenderer *renderer, 416 static void gtk_blist_renderer_editing_started_cb(GtkCellRenderer *renderer,
416 GtkCellEditable *editable, 417 GtkCellEditable *editable,
532 533
533 node_alias = g_utf8_casefold(purple_buddy_get_alias((PurpleBuddy *)buddy), -1); 534 node_alias = g_utf8_casefold(purple_buddy_get_alias((PurpleBuddy *)buddy), -1);
534 if (node_alias && !g_utf8_collate(node_alias, a)) { 535 if (node_alias && !g_utf8_collate(node_alias, a)) {
535 merges = g_list_append(merges, buddy); 536 merges = g_list_append(merges, buddy);
536 i++; 537 i++;
538 g_free(node_alias);
539 break;
537 } 540 }
538 g_free(node_alias); 541 g_free(node_alias);
539 } 542 }
540 } 543 }
541 g_free(a); 544 g_free(a);
542 545
543 if (i > 1) 546 if (i > 1)
544 { 547 {
545 char *msg = g_strdup_printf(ngettext("You have %d contact named %s. Would you like to merge them?", "You currently have %d contacts named %s. Would you like to merge them?", i), i, alias); 548 char *msg = g_strdup_printf(ngettext("You have %d contact named %s. Would you like to merge them?", "You currently have %d contacts named %s. Would you like to merge them?", i), i, alias);
546 purple_request_action(NULL, NULL, msg, _("Merging these contacts will cause them to share a single entry on the buddy list and use a single conversation window. " 549 purple_request_action(NULL, NULL, msg, _("Merging these contacts will cause them to share a single entry on the buddy list and use a single conversation window. "
547 "You can separate them again by choosing 'Expand' from the contact's context menu"), 0, NULL, NULL, NULL, 550 "You can separate them again by choosing 'Expand' from the contact's context menu"), 0, NULL, NULL, NULL,
2573 int height; 2576 int height;
2574 }; 2577 };
2575 2578
2576 static struct tooltip_data * create_tip_for_node(PurpleBlistNode *node, gboolean full) 2579 static struct tooltip_data * create_tip_for_node(PurpleBlistNode *node, gboolean full)
2577 { 2580 {
2578 char *tooltip_text = NULL;
2579 struct tooltip_data *td = g_new0(struct tooltip_data, 1); 2581 struct tooltip_data *td = g_new0(struct tooltip_data, 1);
2580 PurpleAccount *account = NULL; 2582 PurpleAccount *account = NULL;
2581 char *tmp, *node_name; 2583 char *tmp = NULL, *node_name = NULL, *tooltip_text = NULL;
2582 2584
2583 if(PURPLE_BLIST_NODE_IS_BUDDY(node)) { 2585 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
2584 account = ((PurpleBuddy*)(node))->account; 2586 account = ((PurpleBuddy*)(node))->account;
2585 } else if(PURPLE_BLIST_NODE_IS_CHAT(node)) { 2587 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
2586 account = ((PurpleChat*)(node))->account; 2588 account = ((PurpleChat*)(node))->account;
2587 } 2589 }
2588 2590
2589 td->status_icon = pidgin_blist_get_status_icon(node, PIDGIN_STATUS_ICON_LARGE); 2591 td->status_icon = pidgin_blist_get_status_icon(node, PIDGIN_STATUS_ICON_LARGE);
2590 td->avatar = pidgin_blist_get_buddy_icon(node, !full, FALSE); 2592 td->avatar = pidgin_blist_get_buddy_icon(node, !full, FALSE);
2591 td->prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL); 2593 if (account != NULL) {
2594 td->prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
2595 }
2592 tooltip_text = pidgin_get_tooltip_text(node, full); 2596 tooltip_text = pidgin_get_tooltip_text(node, full);
2593 td->layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL); 2597 td->layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL);
2594 td->name_layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL); 2598 td->name_layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL);
2595 2599
2596 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) 2600 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
2597 tmp = g_markup_escape_text(purple_buddy_get_name((PurpleBuddy*)node), -1); 2601 tmp = g_markup_escape_text(purple_buddy_get_name((PurpleBuddy*)node), -1);
2598 else 2602 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
2599 tmp = g_markup_escape_text(purple_chat_get_name((PurpleChat*)node), -1); 2603 tmp = g_markup_escape_text(purple_chat_get_name((PurpleChat*)node), -1);
2604 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
2605 tmp = g_markup_escape_text(purple_group_get_name((PurpleGroup*)node), -1);
2606 } else {
2607 /* I don't believe this can happen currently, I think
2608 * everything that calls this function checks for one of the
2609 * above node types first. */
2610 tmp = g_strdup(_("Unknown node type"));
2611 }
2600 node_name = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", tmp); 2612 node_name = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", tmp);
2601 g_free(tmp); 2613 g_free(tmp);
2602 2614
2603 pango_layout_set_markup(td->layout, tooltip_text, -1); 2615 pango_layout_set_markup(td->layout, tooltip_text, -1);
2604 pango_layout_set_wrap(td->layout, PANGO_WRAP_WORD); 2616 pango_layout_set_wrap(td->layout, PANGO_WRAP_WORD);
2645 2657
2646 if(gtkblist->tooltipdata == NULL) 2658 if(gtkblist->tooltipdata == NULL)
2647 return FALSE; 2659 return FALSE;
2648 2660
2649 style = gtkblist->tipwindow->style; 2661 style = gtkblist->tipwindow->style;
2650 gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
2651 NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1);
2652 2662
2653 max_text_width = 0; 2663 max_text_width = 0;
2654 max_avatar_width = 0; 2664 max_avatar_width = 0;
2655 2665
2656 for(l = gtkblist->tooltipdata; l; l = l->next) 2666 for(l = gtkblist->tooltipdata; l; l = l->next)
2685 max_width - (td->avatar_width+ TOOLTIP_BORDER)-1, 2695 max_width - (td->avatar_width+ TOOLTIP_BORDER)-1,
2686 current_height-1,td->avatar_width+2, td->avatar_height+2); 2696 current_height-1,td->avatar_width+2, td->avatar_height+2);
2687 } 2697 }
2688 2698
2689 #if GTK_CHECK_VERSION(2,2,0) 2699 #if GTK_CHECK_VERSION(2,2,0)
2690 if (dir == GTK_TEXT_DIR_RTL) 2700 if (td->status_icon) {
2691 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon, 2701 if (dir == GTK_TEXT_DIR_RTL)
2692 0, 0, max_width - TOOLTIP_BORDER - STATUS_SIZE, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); 2702 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon,
2693 else 2703 0, 0, max_width - TOOLTIP_BORDER - STATUS_SIZE, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
2694 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon, 2704 else
2695 0, 0, TOOLTIP_BORDER, current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); 2705 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon,
2696 if(td->avatar) 2706 0, 0, TOOLTIP_BORDER, current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0);
2697 { 2707 }
2708
2709 if(td->avatar) {
2698 if (dir == GTK_TEXT_DIR_RTL) 2710 if (dir == GTK_TEXT_DIR_RTL)
2699 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 2711 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL,
2700 td->avatar, 0, 0, TOOLTIP_BORDER, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); 2712 td->avatar, 0, 0, TOOLTIP_BORDER, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
2701 else 2713 else
2702 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 2714 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL,
2703 td->avatar, 0, 0, max_width - (td->avatar_width + TOOLTIP_BORDER), 2715 td->avatar, 0, 0, max_width - (td->avatar_width + TOOLTIP_BORDER),
2704 current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); 2716 current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0);
2705 } 2717 }
2706 2718
2707 if (!td->avatar_is_prpl_icon) 2719 if (!td->avatar_is_prpl_icon && td->prpl_icon)
2708 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->prpl_icon, 2720 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->prpl_icon,
2709 0, 0, 2721 0, 0,
2710 prpl_col, 2722 prpl_col,
2711 current_height + ((td->name_height / 2) - (PRPL_SIZE / 2)), 2723 current_height + ((td->name_height / 2) - (PRPL_SIZE / 2)),
2712 -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); 2724 -1 , -1, GDK_RGB_DITHER_NONE, 0, 0);
2713 2725
2714 #else 2726 #else
2715 gdk_pixbuf_render_to_drawable(td->status_icon, GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 12, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); 2727 if (td->status_icon) {
2728 gdk_pixbuf_render_to_drawable(td->status_icon, GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 12, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
2729 }
2716 if(td->avatar) 2730 if(td->avatar)
2717 gdk_pixbuf_render_to_drawable(td->avatar, 2731 gdk_pixbuf_render_to_drawable(td->avatar,
2718 GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 2732 GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0,
2719 max_width - (td->avatar_width + TOOLTIP_BORDER), 2733 max_width - (td->avatar_width + TOOLTIP_BORDER),
2720 current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); 2734 current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
2775 pidgin_blist_create_tooltip_for_node(GtkWidget *widget, gpointer data, int *w, int *h) 2789 pidgin_blist_create_tooltip_for_node(GtkWidget *widget, gpointer data, int *w, int *h)
2776 { 2790 {
2777 PurpleBlistNode *node = data; 2791 PurpleBlistNode *node = data;
2778 int width, height; 2792 int width, height;
2779 2793
2794 if (gtkblist->tooltipdata) {
2795 gtkblist->tipwindow = NULL;
2796 pidgin_blist_destroy_tooltip_data();
2797 }
2798
2780 gtkblist->tipwindow = widget; 2799 gtkblist->tipwindow = widget;
2781 if(PURPLE_BLIST_NODE_IS_CHAT(node) || PURPLE_BLIST_NODE_IS_BUDDY(node)) { 2800 if(PURPLE_BLIST_NODE_IS_CHAT(node) ||
2801 PURPLE_BLIST_NODE_IS_BUDDY(node) ||
2802 PURPLE_BLIST_NODE_IS_GROUP(node)) {
2782 struct tooltip_data *td = create_tip_for_node(node, TRUE); 2803 struct tooltip_data *td = create_tip_for_node(node, TRUE);
2783 gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); 2804 gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td);
2784 width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + 2805 width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE +
2785 MAX(td->width, td->name_width) + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER; 2806 MAX(td->width, td->name_width) + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER;
2786 height = TOOLTIP_BORDER + MAX(td->height + td->name_height, MAX(STATUS_SIZE, td->avatar_height)) 2807 height = TOOLTIP_BORDER + MAX(td->height + td->name_height, MAX(STATUS_SIZE, td->avatar_height))
3269 tmp = purple_notify_user_info_get_text_with_newline(user_info, "\n"); 3290 tmp = purple_notify_user_info_get_text_with_newline(user_info, "\n");
3270 g_string_append(str, tmp); 3291 g_string_append(str, tmp);
3271 g_free(tmp); 3292 g_free(tmp);
3272 3293
3273 purple_notify_user_info_destroy(user_info); 3294 purple_notify_user_info_destroy(user_info);
3274 } 3295 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
3275 3296 GSList *accounts;
3276 purple_signal_emit(pidgin_blist_get_handle(), 3297 PurpleGroup *group = (PurpleGroup*)node;
3277 "drawing-tooltip", node, str, full); 3298 PurpleNotifyUserInfo *user_info;
3299
3300 user_info = purple_notify_user_info_new();
3301
3302 /* Total buddies (from online accounts) in group */
3303 tmp = g_strdup_printf("%d",
3304 purple_blist_get_group_size(group, FALSE));
3305 purple_notify_user_info_add_pair(user_info, _("Total Buddies"),
3306 tmp);
3307 g_free(tmp);
3308
3309 /* Online buddies in group */
3310 tmp = g_strdup_printf("%d",
3311 purple_blist_get_group_online_count(group));
3312 purple_notify_user_info_add_pair(user_info, _("Online Buddies"),
3313 tmp);
3314 g_free(tmp);
3315
3316 /* Accounts with buddies in group */
3317 accounts = purple_group_get_accounts(group);
3318 for (; accounts != NULL;
3319 accounts = g_slist_delete_link(accounts, accounts)) {
3320 PurpleAccount *account = accounts->data;
3321 purple_notify_user_info_add_pair(user_info, _("Account"), purple_account_get_username(account));
3322 }
3323
3324 tmp = purple_notify_user_info_get_text_with_newline(user_info, "\n");
3325 g_string_append(str, tmp);
3326 g_free(tmp);
3327
3328 purple_notify_user_info_destroy(user_info);
3329 }
3330
3331 purple_signal_emit(pidgin_blist_get_handle(), "drawing-tooltip",
3332 node, str, full);
3278 3333
3279 return g_string_free(str, FALSE); 3334 return g_string_free(str, FALSE);
3280 } 3335 }
3281 3336
3282 static GHashTable *cached_emblems; 3337 static GHashTable *cached_emblems;