| 2529 } |
2529 } |
| 2530 |
2530 |
| 2531 return get_prpl_icon_list(account); |
2531 return get_prpl_icon_list(account); |
| 2532 } |
2532 } |
| 2533 |
2533 |
| |
2534 static const char * |
| |
2535 pidgin_conv_get_icon_stock(PurpleConversation *conv) |
| |
2536 { |
| |
2537 PurpleAccount *account = NULL; |
| |
2538 const char *stock = NULL; |
| |
2539 |
| |
2540 g_return_val_if_fail(conv != NULL, NULL); |
| |
2541 |
| |
2542 account = purple_conversation_get_account(conv); |
| |
2543 g_return_val_if_fail(account != NULL, NULL); |
| |
2544 |
| |
2545 /* Use the buddy icon, if possible */ |
| |
2546 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| |
2547 const char *name = NULL; |
| |
2548 PurpleBuddy *b; |
| |
2549 name = purple_conversation_get_name(conv); |
| |
2550 b = purple_find_buddy(account, name); |
| |
2551 if (b != NULL) { |
| |
2552 PurplePresence *p = purple_buddy_get_presence(b); |
| |
2553 PurpleStatus *active = purple_presence_get_active_status(p); |
| |
2554 PurpleStatusType *type = purple_status_get_type(active); |
| |
2555 PurpleStatusPrimitive prim = purple_status_type_get_primitive(type); |
| |
2556 stock = pidgin_stock_id_from_status_primitive(prim); |
| |
2557 } else { |
| |
2558 stock = PIDGIN_STOCK_STATUS_PERSON; |
| |
2559 } |
| |
2560 } else { |
| |
2561 stock = PIDGIN_STOCK_STATUS_CHAT; |
| |
2562 } |
| |
2563 |
| |
2564 return stock; |
| |
2565 } |
| |
2566 |
| 2534 static GdkPixbuf * |
2567 static GdkPixbuf * |
| 2535 pidgin_conv_get_icon(PurpleConversation *conv, GtkWidget *parent, const char *icon_size) |
2568 pidgin_conv_get_icon(PurpleConversation *conv, GtkWidget *parent, const char *icon_size) |
| 2536 { |
2569 { |
| 2537 PurpleAccount *account = NULL; |
2570 PurpleAccount *account = NULL; |
| 2538 const char *name = NULL; |
2571 const char *name = NULL; |
| |
2572 const char *stock = NULL; |
| 2539 GdkPixbuf *status = NULL; |
2573 GdkPixbuf *status = NULL; |
| 2540 PurpleBlistUiOps *ops = purple_blist_get_ui_ops(); |
2574 PurpleBlistUiOps *ops = purple_blist_get_ui_ops(); |
| |
2575 GtkIconSize size; |
| |
2576 |
| 2541 g_return_val_if_fail(conv != NULL, NULL); |
2577 g_return_val_if_fail(conv != NULL, NULL); |
| 2542 |
2578 |
| 2543 account = purple_conversation_get_account(conv); |
2579 account = purple_conversation_get_account(conv); |
| 2544 name = purple_conversation_get_name(conv); |
2580 name = purple_conversation_get_name(conv); |
| 2545 |
2581 |
| 2548 |
2584 |
| 2549 /* Use the buddy icon, if possible */ |
2585 /* Use the buddy icon, if possible */ |
| 2550 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
2586 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 2551 PurpleBuddy *b = purple_find_buddy(account, name); |
2587 PurpleBuddy *b = purple_find_buddy(account, name); |
| 2552 if (b != NULL) { |
2588 if (b != NULL) { |
| 2553 PurplePresence *p = purple_buddy_get_presence(b); |
|
| 2554 /* I hate this hack. It fixes a bug where the pending message icon |
2589 /* I hate this hack. It fixes a bug where the pending message icon |
| 2555 * displays in the conv tab even though it shouldn't. |
2590 * displays in the conv tab even though it shouldn't. |
| 2556 * A better solution would be great. */ |
2591 * A better solution would be great. */ |
| 2557 if (ops && ops->update) |
2592 if (ops && ops->update) |
| 2558 ops->update(NULL, (PurpleBlistNode*)b); |
2593 ops->update(NULL, (PurpleBlistNode*)b); |
| 2559 |
|
| 2560 /* XXX Seanegan: We really need a util function to return a pixbuf for a Presence to avoid all this switching */ |
|
| 2561 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AWAY)) |
|
| 2562 status = pidgin_create_status_icon(PURPLE_STATUS_AWAY, parent, icon_size); |
|
| 2563 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_EXTENDED_AWAY)) |
|
| 2564 status = pidgin_create_status_icon(PURPLE_STATUS_EXTENDED_AWAY, parent, icon_size); |
|
| 2565 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_OFFLINE)) |
|
| 2566 status = pidgin_create_status_icon(PURPLE_STATUS_OFFLINE, parent, icon_size); |
|
| 2567 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AVAILABLE)) |
|
| 2568 status = pidgin_create_status_icon(PURPLE_STATUS_AVAILABLE, parent, icon_size); |
|
| 2569 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_INVISIBLE)) |
|
| 2570 status = pidgin_create_status_icon(PURPLE_STATUS_INVISIBLE, parent, icon_size); |
|
| 2571 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) |
|
| 2572 status = pidgin_create_status_icon(PURPLE_STATUS_UNAVAILABLE, parent, icon_size); |
|
| 2573 } |
2594 } |
| 2574 } |
2595 } |
| 2575 |
2596 |
| 2576 /* If they don't have a buddy icon, then use the PRPL icon */ |
2597 stock = pidgin_conv_get_icon_stock(conv); |
| 2577 if (status == NULL) { |
2598 size = gtk_icon_size_from_name(icon_size); |
| 2578 GtkIconSize size = gtk_icon_size_from_name(icon_size); |
2599 status = gtk_widget_render_icon (parent, stock, size, "GtkWidget"); |
| 2579 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
|
| 2580 status = gtk_widget_render_icon (parent, PIDGIN_STOCK_STATUS_PERSON, |
|
| 2581 size, "GtkWidget"); |
|
| 2582 } else { |
|
| 2583 status = gtk_widget_render_icon (parent, PIDGIN_STOCK_STATUS_CHAT, |
|
| 2584 size, "GtkWidget"); |
|
| 2585 } |
|
| 2586 } |
|
| 2587 return status; |
2600 return status; |
| 2588 } |
2601 } |
| 2589 |
2602 |
| 2590 GdkPixbuf * |
2603 GdkPixbuf * |
| 2591 pidgin_conv_get_tab_icon(PurpleConversation *conv, gboolean small_icon) |
2604 pidgin_conv_get_tab_icon(PurpleConversation *conv, gboolean small_icon) |
| 2599 update_tab_icon(PurpleConversation *conv) |
2612 update_tab_icon(PurpleConversation *conv) |
| 2600 { |
2613 { |
| 2601 PidginConversation *gtkconv; |
2614 PidginConversation *gtkconv; |
| 2602 PidginWindow *win; |
2615 PidginWindow *win; |
| 2603 GList *l; |
2616 GList *l; |
| 2604 GdkPixbuf *status = NULL; |
|
| 2605 GdkPixbuf *infopane_status = NULL; |
|
| 2606 GdkPixbuf *emblem = NULL; |
2617 GdkPixbuf *emblem = NULL; |
| |
2618 const char *status = NULL; |
| |
2619 const char *infopane_status = NULL; |
| 2607 |
2620 |
| 2608 g_return_if_fail(conv != NULL); |
2621 g_return_if_fail(conv != NULL); |
| 2609 |
2622 |
| 2610 gtkconv = PIDGIN_CONVERSATION(conv); |
2623 gtkconv = PIDGIN_CONVERSATION(conv); |
| 2611 win = gtkconv->win; |
2624 win = gtkconv->win; |
| 2612 if (conv != gtkconv->active_conv) |
2625 if (conv != gtkconv->active_conv) |
| 2613 return; |
2626 return; |
| 2614 |
2627 |
| 2615 status = pidgin_conv_get_tab_icon(conv, TRUE); |
2628 status = infopane_status = pidgin_conv_get_icon_stock(conv); |
| 2616 infopane_status = pidgin_conv_get_tab_icon(conv, FALSE); |
|
| 2617 |
2629 |
| 2618 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
2630 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 2619 PurpleBuddy *b = purple_find_buddy(conv->account, conv->name); |
2631 PurpleBuddy *b = purple_find_buddy(conv->account, conv->name); |
| 2620 if (b) |
2632 if (b) |
| 2621 emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b); |
2633 emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b); |
| 2622 } |
2634 } |
| 2623 |
2635 |
| 2624 g_return_if_fail(status != NULL); |
2636 g_return_if_fail(status != NULL); |
| 2625 |
2637 |
| 2626 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status); |
2638 g_object_set(G_OBJECT(gtkconv->icon), "stock", status, NULL); |
| 2627 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status); |
2639 g_object_set(G_OBJECT(gtkconv->menu_icon), "stock", status, NULL); |
| 2628 |
2640 |
| 2629 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model), |
2641 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model), |
| 2630 &(gtkconv->infopane_iter), |
2642 &(gtkconv->infopane_iter), |
| 2631 CONV_ICON_COLUMN, infopane_status, -1); |
2643 CONV_ICON_COLUMN, infopane_status, -1); |
| 2632 |
2644 |
| 2649 g_object_unref(emblem); |
2661 g_object_unref(emblem); |
| 2650 |
2662 |
| 2651 /* XXX seanegan Why do I have to do this? */ |
2663 /* XXX seanegan Why do I have to do this? */ |
| 2652 gtk_widget_queue_resize(gtkconv->infopane); |
2664 gtk_widget_queue_resize(gtkconv->infopane); |
| 2653 gtk_widget_queue_draw(gtkconv->infopane); |
2665 gtk_widget_queue_draw(gtkconv->infopane); |
| 2654 |
|
| 2655 if (status != NULL) |
|
| 2656 g_object_unref(status); |
|
| 2657 |
2666 |
| 2658 if (pidgin_conv_window_is_active_conversation(conv) && |
2667 if (pidgin_conv_window_is_active_conversation(conv) && |
| 2659 (purple_conversation_get_type(conv) != PURPLE_CONV_TYPE_IM || |
2668 (purple_conversation_get_type(conv) != PURPLE_CONV_TYPE_IM || |
| 2660 gtkconv->u.im->anim == NULL)) |
2669 gtkconv->u.im->anim == NULL)) |
| 2661 { |
2670 { |
| 3088 |
3097 |
| 3089 for (l = convs; l != NULL ; l = l->next) { |
3098 for (l = convs; l != NULL ; l = l->next) { |
| 3090 PurpleConversation *conv = (PurpleConversation*)l->data; |
3099 PurpleConversation *conv = (PurpleConversation*)l->data; |
| 3091 PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); |
3100 PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); |
| 3092 |
3101 |
| 3093 GtkWidget *icon = gtk_image_new(); |
3102 GtkWidget *icon = gtk_image_new_from_stock(pidgin_conv_get_icon_stock(conv), |
| 3094 GdkPixbuf *pbuf = pidgin_conv_get_icon(conv, icon, PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC); |
3103 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC)); |
| 3095 GtkWidget *item; |
3104 GtkWidget *item; |
| 3096 gchar *text = g_strdup_printf("%s (%d)", |
3105 gchar *text = g_strdup_printf("%s (%d)", |
| 3097 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), |
3106 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), |
| 3098 gtkconv->unseen_count); |
3107 gtkconv->unseen_count); |
| 3099 |
|
| 3100 gtk_image_set_from_pixbuf(GTK_IMAGE(icon), pbuf); |
|
| 3101 g_object_unref(pbuf); |
|
| 3102 |
3108 |
| 3103 item = gtk_image_menu_item_new_with_label(text); |
3109 item = gtk_image_menu_item_new_with_label(text); |
| 3104 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), icon); |
3110 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), icon); |
| 3105 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(unseen_conv_menu_cb), conv); |
3111 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(unseen_conv_menu_cb), conv); |
| 3106 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); |
3112 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); |
| 3962 if (!group) |
3968 if (!group) |
| 3963 gtk_widget_set_sensitive(win->menu.send_to, FALSE); |
3969 gtk_widget_set_sensitive(win->menu.send_to, FALSE); |
| 3964 update_send_to_selection(win); |
3970 update_send_to_selection(win); |
| 3965 } |
3971 } |
| 3966 |
3972 |
| 3967 static GdkPixbuf * |
3973 static const char * |
| 3968 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) |
3974 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) |
| 3969 { |
3975 { |
| 3970 PidginConversation *gtkconv = PIDGIN_CONVERSATION(chat->conv); |
|
| 3971 GdkPixbuf *pixbuf, *scale, *scale2; |
|
| 3972 char *filename; |
|
| 3973 const char *image = NULL; |
3976 const char *image = NULL; |
| 3974 |
3977 |
| 3975 if (flags & PURPLE_CBFLAGS_FOUNDER) { |
3978 if (flags & PURPLE_CBFLAGS_FOUNDER) { |
| 3976 image = PIDGIN_STOCK_STATUS_FOUNDER; |
3979 image = PIDGIN_STOCK_STATUS_FOUNDER; |
| 3977 } else if (flags & PURPLE_CBFLAGS_OP) { |
3980 } else if (flags & PURPLE_CBFLAGS_OP) { |
| 3983 } else if ((!flags) && purple_conv_chat_is_user_ignored(chat, name)) { |
3986 } else if ((!flags) && purple_conv_chat_is_user_ignored(chat, name)) { |
| 3984 image = PIDGIN_STOCK_STATUS_IGNORED; |
3987 image = PIDGIN_STOCK_STATUS_IGNORED; |
| 3985 } else { |
3988 } else { |
| 3986 return NULL; |
3989 return NULL; |
| 3987 } |
3990 } |
| 3988 |
3991 return image; |
| 3989 pixbuf = gtk_widget_render_icon (gtkconv->tab_cont, image, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), |
|
| 3990 "GtkTreeView"); |
|
| 3991 |
|
| 3992 if (!pixbuf) |
|
| 3993 return NULL; |
|
| 3994 |
|
| 3995 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); |
|
| 3996 g_object_unref(pixbuf); |
|
| 3997 |
|
| 3998 if (flags && purple_conv_chat_is_user_ignored(chat, name)) { |
|
| 3999 /* TODO: the .../status/default directory isn't installed, should it be? */ |
|
| 4000 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "status", "default", "ignored.png", NULL); |
|
| 4001 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
|
| 4002 g_free(filename); |
|
| 4003 scale2 = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); |
|
| 4004 g_object_unref(pixbuf); |
|
| 4005 gdk_pixbuf_composite(scale2, scale, 0, 0, 16, 16, 0, 0, 1, 1, GDK_INTERP_BILINEAR, 192); |
|
| 4006 g_object_unref(scale2); |
|
| 4007 } |
|
| 4008 |
|
| 4009 return scale; |
|
| 4010 } |
3992 } |
| 4011 |
3993 |
| 4012 static void |
3994 static void |
| 4013 add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name) |
3995 add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name) |
| 4014 { |
3996 { |
| 4038 if (!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl))) |
4020 if (!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl))) |
| 4039 return; |
4021 return; |
| 4040 |
4022 |
| 4041 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); |
4023 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); |
| 4042 |
4024 |
| 4043 pixbuf = get_chat_buddy_status_icon(chat, name, flags); |
4025 stock = get_chat_buddy_status_icon(chat, name, flags); |
| 4044 |
4026 |
| 4045 if (!strcmp(chat->nick, purple_normalize(conv->account, old_name != NULL ? old_name : name))) |
4027 if (!strcmp(chat->nick, purple_normalize(conv->account, old_name != NULL ? old_name : name))) |
| 4046 is_me = TRUE; |
4028 is_me = TRUE; |
| 4047 |
4029 |
| 4048 is_buddy = cb->buddy; |
4030 is_buddy = cb->buddy; |
| 4055 GtkTextTag *tag = gtk_text_tag_table_lookup( |
4037 GtkTextTag *tag = gtk_text_tag_table_lookup( |
| 4056 gtk_text_buffer_get_tag_table(GTK_IMHTML(gtkconv->imhtml)->text_buffer), |
4038 gtk_text_buffer_get_tag_table(GTK_IMHTML(gtkconv->imhtml)->text_buffer), |
| 4057 "send-name"); |
4039 "send-name"); |
| 4058 g_object_get(tag, "foreground-gdk", &color, NULL); |
4040 g_object_get(tag, "foreground-gdk", &color, NULL); |
| 4059 } else { |
4041 } else { |
| |
4042 GtkTextTag *tag; |
| |
4043 if ((tag = get_buddy_tag(conv, name, 0, FALSE))) |
| |
4044 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_NORMAL, NULL); |
| |
4045 if ((tag = get_buddy_tag(conv, name, PURPLE_MESSAGE_NICK, FALSE))) |
| |
4046 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_NORMAL, NULL); |
| 4060 color = (GdkColor*)get_nick_color(gtkconv, name); |
4047 color = (GdkColor*)get_nick_color(gtkconv, name); |
| 4061 } |
4048 } |
| 4062 |
4049 |
| 4063 #if GTK_CHECK_VERSION(2,6,0) |
4050 #if GTK_CHECK_VERSION(2,6,0) |
| 4064 gtk_list_store_insert_with_values(ls, &iter, |
4051 gtk_list_store_insert_with_values(ls, &iter, |
| 4068 * It *might* be faster to search the gtk_list_store and set row accurately, |
4055 * It *might* be faster to search the gtk_list_store and set row accurately, |
| 4069 * but no one in #gtk+ seems to know anything about it either. |
4056 * but no one in #gtk+ seems to know anything about it either. |
| 4070 * Inserting in the "wrong" location has no visible ill effects. - F.P. |
4057 * Inserting in the "wrong" location has no visible ill effects. - F.P. |
| 4071 */ |
4058 */ |
| 4072 -1, /* "row" */ |
4059 -1, /* "row" */ |
| 4073 CHAT_USERS_ICON_COLUMN, pixbuf, |
4060 CHAT_USERS_ICON_STOCK_COLUMN, stock, |
| 4074 CHAT_USERS_ALIAS_COLUMN, alias, |
4061 CHAT_USERS_ALIAS_COLUMN, alias, |
| 4075 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, |
4062 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, |
| 4076 CHAT_USERS_NAME_COLUMN, name, |
4063 CHAT_USERS_NAME_COLUMN, name, |
| 4077 CHAT_USERS_FLAGS_COLUMN, flags, |
4064 CHAT_USERS_FLAGS_COLUMN, flags, |
| 4078 CHAT_USERS_COLOR_COLUMN, color, |
4065 CHAT_USERS_COLOR_COLUMN, color, |
| 4079 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, |
4066 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, |
| 4080 -1); |
4067 -1); |
| 4081 #else |
4068 #else |
| 4082 gtk_list_store_append(ls, &iter); |
4069 gtk_list_store_append(ls, &iter); |
| 4083 gtk_list_store_set(ls, &iter, |
4070 gtk_list_store_set(ls, &iter, |
| 4084 CHAT_USERS_ICON_COLUMN, pixbuf, |
4071 CHAT_USERS_ICON_STOCK_COLUMN, stock, |
| 4085 CHAT_USERS_ALIAS_COLUMN, alias, |
4072 CHAT_USERS_ALIAS_COLUMN, alias, |
| 4086 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, |
4073 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, |
| 4087 CHAT_USERS_NAME_COLUMN, name, |
4074 CHAT_USERS_NAME_COLUMN, name, |
| 4088 CHAT_USERS_FLAGS_COLUMN, flags, |
4075 CHAT_USERS_FLAGS_COLUMN, flags, |
| 4089 CHAT_USERS_COLOR_COLUMN, color, |
4076 CHAT_USERS_COLOR_COLUMN, color, |
| 4090 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, |
4077 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, |
| 4091 -1); |
4078 -1); |
| 4092 #endif |
4079 #endif |
| 4093 |
4080 |
| 4094 if (pixbuf) |
|
| 4095 g_object_unref(pixbuf); |
|
| 4096 if (is_me && color) |
4081 if (is_me && color) |
| 4097 gdk_color_free(color); |
4082 gdk_color_free(color); |
| 4098 g_free(alias_key); |
4083 g_free(alias_key); |
| 4099 } |
4084 } |
| 4100 |
4085 |
| 4737 gtk_box_pack_start(GTK_BOX(lbox), sw, TRUE, TRUE, 0); |
4722 gtk_box_pack_start(GTK_BOX(lbox), sw, TRUE, TRUE, 0); |
| 4738 gtk_widget_show(sw); |
4723 gtk_widget_show(sw); |
| 4739 |
4724 |
| 4740 ls = gtk_list_store_new(CHAT_USERS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, |
4725 ls = gtk_list_store_new(CHAT_USERS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, |
| 4741 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, |
4726 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, |
| 4742 GDK_TYPE_COLOR, G_TYPE_INT); |
4727 GDK_TYPE_COLOR, G_TYPE_INT, G_TYPE_STRING); |
| 4743 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN, |
4728 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN, |
| 4744 sort_chat_users, NULL, NULL); |
4729 sort_chat_users, NULL, NULL); |
| 4745 |
4730 |
| 4746 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); |
4731 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); |
| 4747 |
4732 |
| 4748 rend = gtk_cell_renderer_pixbuf_new(); |
4733 rend = gtk_cell_renderer_pixbuf_new(); |
| 4749 |
4734 g_object_set(G_OBJECT(rend), |
| |
4735 "stock-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), |
| |
4736 NULL); |
| 4750 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
4737 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
| 4751 "pixbuf", CHAT_USERS_ICON_COLUMN, NULL); |
4738 "stock-id", CHAT_USERS_ICON_STOCK_COLUMN, NULL); |
| 4752 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); |
4739 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); |
| 4753 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); |
4740 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); |
| 4754 ul_width = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/userlist_width"); |
4741 ul_width = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/userlist_width"); |
| 4755 gtk_widget_set_size_request(lbox, ul_width, -1); |
4742 gtk_widget_set_size_request(lbox, ul_width, -1); |
| 4756 |
4743 |
| 4773 rend = gtk_cell_renderer_text_new(); |
4760 rend = gtk_cell_renderer_text_new(); |
| 4774 g_object_set(rend, |
4761 g_object_set(rend, |
| 4775 "foreground-set", TRUE, |
4762 "foreground-set", TRUE, |
| 4776 "weight-set", TRUE, |
4763 "weight-set", TRUE, |
| 4777 NULL); |
4764 NULL); |
| 4778 g_object_set(G_OBJECT(rend), "editable", TRUE, NULL); |
4765 g_object_set(G_OBJECT(rend), "editable", TRUE, NULL); |
| 4779 |
4766 |
| 4780 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
4767 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
| 4781 "text", CHAT_USERS_ALIAS_COLUMN, |
4768 "text", CHAT_USERS_ALIAS_COLUMN, |
| 4782 "foreground-gdk", CHAT_USERS_COLOR_COLUMN, |
4769 "foreground-gdk", CHAT_USERS_COLOR_COLUMN, |
| 4783 "weight", CHAT_USERS_WEIGHT_COLUMN, |
4770 "weight", CHAT_USERS_WEIGHT_COLUMN, |
| 4864 |
4851 |
| 4865 pidgin_tooltip_setup_for_widget(event_box, gtkconv, |
4852 pidgin_tooltip_setup_for_widget(event_box, gtkconv, |
| 4866 pidgin_conv_create_tooltip, NULL); |
4853 pidgin_conv_create_tooltip, NULL); |
| 4867 |
4854 |
| 4868 gtkconv->infopane = gtk_cell_view_new(); |
4855 gtkconv->infopane = gtk_cell_view_new(); |
| 4869 gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); |
4856 gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); |
| 4870 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), |
4857 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), |
| 4871 GTK_TREE_MODEL(gtkconv->infopane_model)); |
4858 GTK_TREE_MODEL(gtkconv->infopane_model)); |
| 4872 g_object_unref(gtkconv->infopane_model); |
4859 g_object_unref(gtkconv->infopane_model); |
| 4873 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter)); |
4860 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter)); |
| 4874 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0); |
4861 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0); |
| 4887 gtk_widget_set_size_request(gtkconv->infopane_hbox, -1, buddyicon_size); |
4874 gtk_widget_set_size_request(gtkconv->infopane_hbox, -1, buddyicon_size); |
| 4888 gtk_widget_show(gtkconv->infopane); |
4875 gtk_widget_show(gtkconv->infopane); |
| 4889 |
4876 |
| 4890 rend = gtk_cell_renderer_pixbuf_new(); |
4877 rend = gtk_cell_renderer_pixbuf_new(); |
| 4891 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE); |
4878 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE); |
| 4892 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", CONV_ICON_COLUMN, NULL); |
4879 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "stock-id", CONV_ICON_COLUMN, NULL); |
| 4893 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); |
4880 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, |
| |
4881 "stock-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), |
| |
4882 NULL); |
| 4894 |
4883 |
| 4895 rend = gtk_cell_renderer_text_new(); |
4884 rend = gtk_cell_renderer_text_new(); |
| 4896 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE); |
4885 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE); |
| 4897 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", CONV_TEXT_COLUMN, NULL); |
4886 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", CONV_TEXT_COLUMN, NULL); |
| 4898 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
4887 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
| 6110 |
6100 |
| 6111 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); |
6101 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); |
| 6112 |
6102 |
| 6113 g_free(val); |
6103 g_free(val); |
| 6114 } |
6104 } |
| |
6105 |
| |
6106 if ((tag = get_buddy_tag(conv, old_name, 0, FALSE))) |
| |
6107 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL); |
| |
6108 if ((tag = get_buddy_tag(conv, old_name, PURPLE_MESSAGE_NICK, FALSE))) |
| |
6109 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL); |
| 6115 |
6110 |
| 6116 if (!purple_conv_chat_find_user(chat, old_name)) |
6111 if (!purple_conv_chat_find_user(chat, old_name)) |
| 6117 return; |
6112 return; |
| 6118 |
6113 |
| 6119 g_return_if_fail(new_alias != NULL); |
6114 g_return_if_fail(new_alias != NULL); |
| 6165 else |
6161 else |
| 6166 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); |
6162 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); |
| 6167 |
6163 |
| 6168 g_free(val); |
6164 g_free(val); |
| 6169 } while (f); |
6165 } while (f); |
| |
6166 |
| |
6167 if ((tag = get_buddy_tag(conv, l->data, 0, FALSE))) |
| |
6168 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL); |
| |
6169 if ((tag = get_buddy_tag(conv, l->data, PURPLE_MESSAGE_NICK, FALSE))) |
| |
6170 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL); |
| 6170 } |
6171 } |
| 6171 |
6172 |
| 6172 g_snprintf(tmp, sizeof(tmp), |
6173 g_snprintf(tmp, sizeof(tmp), |
| 6173 ngettext("%d person in room", "%d people in room", |
6174 ngettext("%d person in room", "%d people in room", |
| 6174 num_users), num_users); |
6175 num_users), num_users); |
| 9443 #endif |
9444 #endif |
| 9444 |
9445 |
| 9445 /* Status icon. */ |
9446 /* Status icon. */ |
| 9446 gtkconv->icon = gtk_image_new(); |
9447 gtkconv->icon = gtk_image_new(); |
| 9447 gtkconv->menu_icon = gtk_image_new(); |
9448 gtkconv->menu_icon = gtk_image_new(); |
| |
9449 g_object_set(G_OBJECT(gtkconv->icon), |
| |
9450 "icon-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC), |
| |
9451 NULL); |
| |
9452 g_object_set(G_OBJECT(gtkconv->menu_icon), |
| |
9453 "icon-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC), |
| |
9454 NULL); |
| 9448 gtk_widget_show(gtkconv->icon); |
9455 gtk_widget_show(gtkconv->icon); |
| 9449 update_tab_icon(conv); |
9456 update_tab_icon(conv); |
| 9450 |
9457 |
| 9451 /* Tab label. */ |
9458 /* Tab label. */ |
| 9452 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); |
9459 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); |