pidgin/gtkconv.c

branch
cpw.attention_ui
changeset 26899
ccfb024e7e5e
parent 26795
e09a6fd69ee7
parent 26848
7a6bf1726f4a
child 27207
b2c81a32c208
equal deleted inserted replaced
26837:2c3279eb393d 26899:ccfb024e7e5e
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 {
4016 PidginChatPane *gtkchat; 3998 PidginChatPane *gtkchat;
4017 PurpleConvChat *chat; 3999 PurpleConvChat *chat;
4018 PurpleConnection *gc; 4000 PurpleConnection *gc;
4019 PurplePluginProtocolInfo *prpl_info; 4001 PurplePluginProtocolInfo *prpl_info;
4020 GtkListStore *ls; 4002 GtkListStore *ls;
4021 GdkPixbuf *pixbuf; 4003 const char *stock;
4022 GtkTreeIter iter; 4004 GtkTreeIter iter;
4023 gboolean is_me = FALSE; 4005 gboolean is_me = FALSE;
4024 gboolean is_buddy; 4006 gboolean is_buddy;
4025 gchar *tmp, *alias_key, *name, *alias; 4007 gchar *tmp, *alias_key, *name, *alias;
4026 int flags; 4008 int flags;
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);
6084 PidginChatPane *gtkchat; 6073 PidginChatPane *gtkchat;
6085 PurpleConvChatBuddyFlags flags; 6074 PurpleConvChatBuddyFlags flags;
6086 PurpleConvChatBuddy *cbuddy; 6075 PurpleConvChatBuddy *cbuddy;
6087 GtkTreeIter iter; 6076 GtkTreeIter iter;
6088 GtkTreeModel *model; 6077 GtkTreeModel *model;
6078 GtkTextTag *tag;
6089 int f = 1; 6079 int f = 1;
6090 6080
6091 chat = PURPLE_CONV_CHAT(conv); 6081 chat = PURPLE_CONV_CHAT(conv);
6092 gtkconv = PIDGIN_CONVERSATION(conv); 6082 gtkconv = PIDGIN_CONVERSATION(conv);
6093 gtkchat = gtkconv->u.chat; 6083 gtkchat = gtkconv->u.chat;
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);
6133 GtkTreeModel *model; 6128 GtkTreeModel *model;
6134 GList *l; 6129 GList *l;
6135 char tmp[BUF_LONG]; 6130 char tmp[BUF_LONG];
6136 int num_users; 6131 int num_users;
6137 gboolean f; 6132 gboolean f;
6133 GtkTextTag *tag;
6138 6134
6139 chat = PURPLE_CONV_CHAT(conv); 6135 chat = PURPLE_CONV_CHAT(conv);
6140 gtkconv = PIDGIN_CONVERSATION(conv); 6136 gtkconv = PIDGIN_CONVERSATION(conv);
6141 gtkchat = gtkconv->u.chat; 6137 gtkchat = gtkconv->u.chat;
6142 6138
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));

mercurial