Mercurial > pidgin.yaz
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; |