comparison pidgin/gtkconv.c @ 26817:3912f55a1633

propagate from branch 'im.pidgin.pidgin' (head fbb4fe5da444943eecc76bdcd6c8ba967790b6c8) to branch 'im.pidgin.cpw.darkrain42.xmpp.bosh' (head 601bc627c9430320848361f0ed81c6c4c6ee53e0)
author Paul Aurich <paul@darkrain42.org>
date Tue, 28 Apr 2009 18:43:57 +0000
parents dbe2731f0a35
children 0924698e2362 684690dbda4a 4548c114e953
comparison
equal deleted inserted replaced
26743:de9816c970fe 26817:3912f55a1633
2510 } 2510 }
2511 2511
2512 return get_prpl_icon_list(account); 2512 return get_prpl_icon_list(account);
2513 } 2513 }
2514 2514
2515 static const char *
2516 pidgin_conv_get_icon_stock(PurpleConversation *conv)
2517 {
2518 PurpleAccount *account = NULL;
2519 const char *stock = NULL;
2520
2521 g_return_val_if_fail(conv != NULL, NULL);
2522
2523 account = purple_conversation_get_account(conv);
2524 g_return_val_if_fail(account != NULL, NULL);
2525
2526 /* Use the buddy icon, if possible */
2527 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
2528 const char *name = NULL;
2529 PurpleBuddy *b;
2530 name = purple_conversation_get_name(conv);
2531 b = purple_find_buddy(account, name);
2532 if (b != NULL) {
2533 PurplePresence *p = purple_buddy_get_presence(b);
2534 PurpleStatus *active = purple_presence_get_active_status(p);
2535 PurpleStatusType *type = purple_status_get_type(active);
2536 PurpleStatusPrimitive prim = purple_status_type_get_primitive(type);
2537 stock = pidgin_stock_id_from_status_primitive(prim);
2538 } else {
2539 stock = PIDGIN_STOCK_STATUS_PERSON;
2540 }
2541 } else {
2542 stock = PIDGIN_STOCK_STATUS_CHAT;
2543 }
2544
2545 return stock;
2546 }
2547
2515 static GdkPixbuf * 2548 static GdkPixbuf *
2516 pidgin_conv_get_icon(PurpleConversation *conv, GtkWidget *parent, const char *icon_size) 2549 pidgin_conv_get_icon(PurpleConversation *conv, GtkWidget *parent, const char *icon_size)
2517 { 2550 {
2518 PurpleAccount *account = NULL; 2551 PurpleAccount *account = NULL;
2519 const char *name = NULL; 2552 const char *name = NULL;
2553 const char *stock = NULL;
2520 GdkPixbuf *status = NULL; 2554 GdkPixbuf *status = NULL;
2521 PurpleBlistUiOps *ops = purple_blist_get_ui_ops(); 2555 PurpleBlistUiOps *ops = purple_blist_get_ui_ops();
2556 GtkIconSize size;
2557
2522 g_return_val_if_fail(conv != NULL, NULL); 2558 g_return_val_if_fail(conv != NULL, NULL);
2523 2559
2524 account = purple_conversation_get_account(conv); 2560 account = purple_conversation_get_account(conv);
2525 name = purple_conversation_get_name(conv); 2561 name = purple_conversation_get_name(conv);
2526 2562
2529 2565
2530 /* Use the buddy icon, if possible */ 2566 /* Use the buddy icon, if possible */
2531 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { 2567 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
2532 PurpleBuddy *b = purple_find_buddy(account, name); 2568 PurpleBuddy *b = purple_find_buddy(account, name);
2533 if (b != NULL) { 2569 if (b != NULL) {
2534 PurplePresence *p = purple_buddy_get_presence(b);
2535 /* I hate this hack. It fixes a bug where the pending message icon 2570 /* I hate this hack. It fixes a bug where the pending message icon
2536 * displays in the conv tab even though it shouldn't. 2571 * displays in the conv tab even though it shouldn't.
2537 * A better solution would be great. */ 2572 * A better solution would be great. */
2538 if (ops && ops->update) 2573 if (ops && ops->update)
2539 ops->update(NULL, (PurpleBlistNode*)b); 2574 ops->update(NULL, (PurpleBlistNode*)b);
2540
2541 /* XXX Seanegan: We really need a util function to return a pixbuf for a Presence to avoid all this switching */
2542 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AWAY))
2543 status = pidgin_create_status_icon(PURPLE_STATUS_AWAY, parent, icon_size);
2544 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_EXTENDED_AWAY))
2545 status = pidgin_create_status_icon(PURPLE_STATUS_EXTENDED_AWAY, parent, icon_size);
2546 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_OFFLINE))
2547 status = pidgin_create_status_icon(PURPLE_STATUS_OFFLINE, parent, icon_size);
2548 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AVAILABLE))
2549 status = pidgin_create_status_icon(PURPLE_STATUS_AVAILABLE, parent, icon_size);
2550 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_INVISIBLE))
2551 status = pidgin_create_status_icon(PURPLE_STATUS_INVISIBLE, parent, icon_size);
2552 else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE))
2553 status = pidgin_create_status_icon(PURPLE_STATUS_UNAVAILABLE, parent, icon_size);
2554 } 2575 }
2555 } 2576 }
2556 2577
2557 /* If they don't have a buddy icon, then use the PRPL icon */ 2578 stock = pidgin_conv_get_icon_stock(conv);
2558 if (status == NULL) { 2579 size = gtk_icon_size_from_name(icon_size);
2559 GtkIconSize size = gtk_icon_size_from_name(icon_size); 2580 status = gtk_widget_render_icon (parent, stock, size, "GtkWidget");
2560 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
2561 status = gtk_widget_render_icon (parent, PIDGIN_STOCK_STATUS_PERSON,
2562 size, "GtkWidget");
2563 } else {
2564 status = gtk_widget_render_icon (parent, PIDGIN_STOCK_STATUS_CHAT,
2565 size, "GtkWidget");
2566 }
2567 }
2568 return status; 2581 return status;
2569 } 2582 }
2570 2583
2571 GdkPixbuf * 2584 GdkPixbuf *
2572 pidgin_conv_get_tab_icon(PurpleConversation *conv, gboolean small_icon) 2585 pidgin_conv_get_tab_icon(PurpleConversation *conv, gboolean small_icon)
2580 update_tab_icon(PurpleConversation *conv) 2593 update_tab_icon(PurpleConversation *conv)
2581 { 2594 {
2582 PidginConversation *gtkconv; 2595 PidginConversation *gtkconv;
2583 PidginWindow *win; 2596 PidginWindow *win;
2584 GList *l; 2597 GList *l;
2585 GdkPixbuf *status = NULL;
2586 GdkPixbuf *infopane_status = NULL;
2587 GdkPixbuf *emblem = NULL; 2598 GdkPixbuf *emblem = NULL;
2599 const char *status = NULL;
2600 const char *infopane_status = NULL;
2588 2601
2589 g_return_if_fail(conv != NULL); 2602 g_return_if_fail(conv != NULL);
2590 2603
2591 gtkconv = PIDGIN_CONVERSATION(conv); 2604 gtkconv = PIDGIN_CONVERSATION(conv);
2592 win = gtkconv->win; 2605 win = gtkconv->win;
2593 if (conv != gtkconv->active_conv) 2606 if (conv != gtkconv->active_conv)
2594 return; 2607 return;
2595 2608
2596 status = pidgin_conv_get_tab_icon(conv, TRUE); 2609 status = infopane_status = pidgin_conv_get_icon_stock(conv);
2597 infopane_status = pidgin_conv_get_tab_icon(conv, FALSE);
2598 2610
2599 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { 2611 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
2600 PurpleBuddy *b = purple_find_buddy(conv->account, conv->name); 2612 PurpleBuddy *b = purple_find_buddy(conv->account, conv->name);
2601 if (b) 2613 if (b)
2602 emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b); 2614 emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b);
2603 } 2615 }
2604 2616
2605 g_return_if_fail(status != NULL); 2617 g_return_if_fail(status != NULL);
2606 2618
2607 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status); 2619 g_object_set(G_OBJECT(gtkconv->icon), "stock", status, NULL);
2608 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status); 2620 g_object_set(G_OBJECT(gtkconv->menu_icon), "stock", status, NULL);
2609 2621
2610 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model), 2622 gtk_list_store_set(GTK_LIST_STORE(gtkconv->infopane_model),
2611 &(gtkconv->infopane_iter), 2623 &(gtkconv->infopane_iter),
2612 CONV_ICON_COLUMN, infopane_status, -1); 2624 CONV_ICON_COLUMN, infopane_status, -1);
2613 2625
2630 g_object_unref(emblem); 2642 g_object_unref(emblem);
2631 2643
2632 /* XXX seanegan Why do I have to do this? */ 2644 /* XXX seanegan Why do I have to do this? */
2633 gtk_widget_queue_resize(gtkconv->infopane); 2645 gtk_widget_queue_resize(gtkconv->infopane);
2634 gtk_widget_queue_draw(gtkconv->infopane); 2646 gtk_widget_queue_draw(gtkconv->infopane);
2635
2636 if (status != NULL)
2637 g_object_unref(status);
2638 2647
2639 if (pidgin_conv_window_is_active_conversation(conv) && 2648 if (pidgin_conv_window_is_active_conversation(conv) &&
2640 (purple_conversation_get_type(conv) != PURPLE_CONV_TYPE_IM || 2649 (purple_conversation_get_type(conv) != PURPLE_CONV_TYPE_IM ||
2641 gtkconv->u.im->anim == NULL)) 2650 gtkconv->u.im->anim == NULL))
2642 { 2651 {
3069 3078
3070 for (l = convs; l != NULL ; l = l->next) { 3079 for (l = convs; l != NULL ; l = l->next) {
3071 PurpleConversation *conv = (PurpleConversation*)l->data; 3080 PurpleConversation *conv = (PurpleConversation*)l->data;
3072 PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); 3081 PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv);
3073 3082
3074 GtkWidget *icon = gtk_image_new(); 3083 GtkWidget *icon = gtk_image_new_from_stock(pidgin_conv_get_icon_stock(conv),
3075 GdkPixbuf *pbuf = pidgin_conv_get_icon(conv, icon, PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC); 3084 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC));
3076 GtkWidget *item; 3085 GtkWidget *item;
3077 gchar *text = g_strdup_printf("%s (%d)", 3086 gchar *text = g_strdup_printf("%s (%d)",
3078 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), 3087 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)),
3079 gtkconv->unseen_count); 3088 gtkconv->unseen_count);
3080
3081 gtk_image_set_from_pixbuf(GTK_IMAGE(icon), pbuf);
3082 g_object_unref(pbuf);
3083 3089
3084 item = gtk_image_menu_item_new_with_label(text); 3090 item = gtk_image_menu_item_new_with_label(text);
3085 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), icon); 3091 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), icon);
3086 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(unseen_conv_menu_cb), conv); 3092 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(unseen_conv_menu_cb), conv);
3087 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); 3093 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3939 if (!group) 3945 if (!group)
3940 gtk_widget_set_sensitive(win->menu.send_to, FALSE); 3946 gtk_widget_set_sensitive(win->menu.send_to, FALSE);
3941 update_send_to_selection(win); 3947 update_send_to_selection(win);
3942 } 3948 }
3943 3949
3944 static GdkPixbuf * 3950 static const char *
3945 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) 3951 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags)
3946 { 3952 {
3947 PidginConversation *gtkconv = PIDGIN_CONVERSATION(chat->conv);
3948 GdkPixbuf *pixbuf, *scale, *scale2;
3949 char *filename;
3950 const char *image = NULL; 3953 const char *image = NULL;
3951 3954
3952 if (flags & PURPLE_CBFLAGS_FOUNDER) { 3955 if (flags & PURPLE_CBFLAGS_FOUNDER) {
3953 image = PIDGIN_STOCK_STATUS_FOUNDER; 3956 image = PIDGIN_STOCK_STATUS_FOUNDER;
3954 } else if (flags & PURPLE_CBFLAGS_OP) { 3957 } else if (flags & PURPLE_CBFLAGS_OP) {
3960 } else if ((!flags) && purple_conv_chat_is_user_ignored(chat, name)) { 3963 } else if ((!flags) && purple_conv_chat_is_user_ignored(chat, name)) {
3961 image = PIDGIN_STOCK_STATUS_IGNORED; 3964 image = PIDGIN_STOCK_STATUS_IGNORED;
3962 } else { 3965 } else {
3963 return NULL; 3966 return NULL;
3964 } 3967 }
3965 3968 return image;
3966 pixbuf = gtk_widget_render_icon (gtkconv->tab_cont, image, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL),
3967 "GtkTreeView");
3968
3969 if (!pixbuf)
3970 return NULL;
3971
3972 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR);
3973 g_object_unref(pixbuf);
3974
3975 if (flags && purple_conv_chat_is_user_ignored(chat, name)) {
3976 /* TODO: the .../status/default directory isn't installed, should it be? */
3977 filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "status", "default", "ignored.png", NULL);
3978 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
3979 g_free(filename);
3980 scale2 = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR);
3981 g_object_unref(pixbuf);
3982 gdk_pixbuf_composite(scale2, scale, 0, 0, 16, 16, 0, 0, 1, 1, GDK_INTERP_BILINEAR, 192);
3983 g_object_unref(scale2);
3984 }
3985
3986 return scale;
3987 } 3969 }
3988 3970
3989 static void 3971 static void
3990 add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name) 3972 add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name)
3991 { 3973 {
3993 PidginChatPane *gtkchat; 3975 PidginChatPane *gtkchat;
3994 PurpleConvChat *chat; 3976 PurpleConvChat *chat;
3995 PurpleConnection *gc; 3977 PurpleConnection *gc;
3996 PurplePluginProtocolInfo *prpl_info; 3978 PurplePluginProtocolInfo *prpl_info;
3997 GtkListStore *ls; 3979 GtkListStore *ls;
3998 GdkPixbuf *pixbuf; 3980 const char *stock;
3999 GtkTreeIter iter; 3981 GtkTreeIter iter;
4000 gboolean is_me = FALSE; 3982 gboolean is_me = FALSE;
4001 gboolean is_buddy; 3983 gboolean is_buddy;
4002 gchar *tmp, *alias_key, *name, *alias; 3984 gchar *tmp, *alias_key, *name, *alias;
4003 int flags; 3985 int flags;
4015 if (!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl))) 3997 if (!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)))
4016 return; 3998 return;
4017 3999
4018 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); 4000 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)));
4019 4001
4020 pixbuf = get_chat_buddy_status_icon(chat, name, flags); 4002 stock = get_chat_buddy_status_icon(chat, name, flags);
4021 4003
4022 if (!strcmp(chat->nick, purple_normalize(conv->account, old_name != NULL ? old_name : name))) 4004 if (!strcmp(chat->nick, purple_normalize(conv->account, old_name != NULL ? old_name : name)))
4023 is_me = TRUE; 4005 is_me = TRUE;
4024 4006
4025 is_buddy = cb->buddy; 4007 is_buddy = cb->buddy;
4032 GtkTextTag *tag = gtk_text_tag_table_lookup( 4014 GtkTextTag *tag = gtk_text_tag_table_lookup(
4033 gtk_text_buffer_get_tag_table(GTK_IMHTML(gtkconv->imhtml)->text_buffer), 4015 gtk_text_buffer_get_tag_table(GTK_IMHTML(gtkconv->imhtml)->text_buffer),
4034 "send-name"); 4016 "send-name");
4035 g_object_get(tag, "foreground-gdk", &color, NULL); 4017 g_object_get(tag, "foreground-gdk", &color, NULL);
4036 } else { 4018 } else {
4019 GtkTextTag *tag;
4020 if ((tag = get_buddy_tag(conv, name, 0, FALSE)))
4021 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_NORMAL, NULL);
4022 if ((tag = get_buddy_tag(conv, name, PURPLE_MESSAGE_NICK, FALSE)))
4023 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_NORMAL, NULL);
4037 color = (GdkColor*)get_nick_color(gtkconv, name); 4024 color = (GdkColor*)get_nick_color(gtkconv, name);
4038 } 4025 }
4039 4026
4040 #if GTK_CHECK_VERSION(2,6,0) 4027 #if GTK_CHECK_VERSION(2,6,0)
4041 gtk_list_store_insert_with_values(ls, &iter, 4028 gtk_list_store_insert_with_values(ls, &iter,
4045 * It *might* be faster to search the gtk_list_store and set row accurately, 4032 * It *might* be faster to search the gtk_list_store and set row accurately,
4046 * but no one in #gtk+ seems to know anything about it either. 4033 * but no one in #gtk+ seems to know anything about it either.
4047 * Inserting in the "wrong" location has no visible ill effects. - F.P. 4034 * Inserting in the "wrong" location has no visible ill effects. - F.P.
4048 */ 4035 */
4049 -1, /* "row" */ 4036 -1, /* "row" */
4050 CHAT_USERS_ICON_COLUMN, pixbuf, 4037 CHAT_USERS_ICON_STOCK_COLUMN, stock,
4051 CHAT_USERS_ALIAS_COLUMN, alias, 4038 CHAT_USERS_ALIAS_COLUMN, alias,
4052 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, 4039 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key,
4053 CHAT_USERS_NAME_COLUMN, name, 4040 CHAT_USERS_NAME_COLUMN, name,
4054 CHAT_USERS_FLAGS_COLUMN, flags, 4041 CHAT_USERS_FLAGS_COLUMN, flags,
4055 CHAT_USERS_COLOR_COLUMN, color, 4042 CHAT_USERS_COLOR_COLUMN, color,
4056 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, 4043 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
4057 -1); 4044 -1);
4058 #else 4045 #else
4059 gtk_list_store_append(ls, &iter); 4046 gtk_list_store_append(ls, &iter);
4060 gtk_list_store_set(ls, &iter, 4047 gtk_list_store_set(ls, &iter,
4061 CHAT_USERS_ICON_COLUMN, pixbuf, 4048 CHAT_USERS_ICON_STOCK_COLUMN, stock,
4062 CHAT_USERS_ALIAS_COLUMN, alias, 4049 CHAT_USERS_ALIAS_COLUMN, alias,
4063 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, 4050 CHAT_USERS_ALIAS_KEY_COLUMN, alias_key,
4064 CHAT_USERS_NAME_COLUMN, name, 4051 CHAT_USERS_NAME_COLUMN, name,
4065 CHAT_USERS_FLAGS_COLUMN, flags, 4052 CHAT_USERS_FLAGS_COLUMN, flags,
4066 CHAT_USERS_COLOR_COLUMN, color, 4053 CHAT_USERS_COLOR_COLUMN, color,
4067 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, 4054 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
4068 -1); 4055 -1);
4069 #endif 4056 #endif
4070 4057
4071 if (pixbuf)
4072 g_object_unref(pixbuf);
4073 if (is_me && color) 4058 if (is_me && color)
4074 gdk_color_free(color); 4059 gdk_color_free(color);
4075 g_free(alias_key); 4060 g_free(alias_key);
4076 } 4061 }
4077 4062
4714 gtk_box_pack_start(GTK_BOX(lbox), sw, TRUE, TRUE, 0); 4699 gtk_box_pack_start(GTK_BOX(lbox), sw, TRUE, TRUE, 0);
4715 gtk_widget_show(sw); 4700 gtk_widget_show(sw);
4716 4701
4717 ls = gtk_list_store_new(CHAT_USERS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, 4702 ls = gtk_list_store_new(CHAT_USERS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING,
4718 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, 4703 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT,
4719 GDK_TYPE_COLOR, G_TYPE_INT); 4704 GDK_TYPE_COLOR, G_TYPE_INT, G_TYPE_STRING);
4720 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN, 4705 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN,
4721 sort_chat_users, NULL, NULL); 4706 sort_chat_users, NULL, NULL);
4722 4707
4723 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); 4708 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls));
4724 4709
4725 rend = gtk_cell_renderer_pixbuf_new(); 4710 rend = gtk_cell_renderer_pixbuf_new();
4726 4711 g_object_set(G_OBJECT(rend),
4712 "stock-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL),
4713 NULL);
4727 col = gtk_tree_view_column_new_with_attributes(NULL, rend, 4714 col = gtk_tree_view_column_new_with_attributes(NULL, rend,
4728 "pixbuf", CHAT_USERS_ICON_COLUMN, NULL); 4715 "stock-id", CHAT_USERS_ICON_STOCK_COLUMN, NULL);
4729 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); 4716 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
4730 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); 4717 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col);
4731 ul_width = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/userlist_width"); 4718 ul_width = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/userlist_width");
4732 gtk_widget_set_size_request(lbox, ul_width, -1); 4719 gtk_widget_set_size_request(lbox, ul_width, -1);
4733 4720
4750 rend = gtk_cell_renderer_text_new(); 4737 rend = gtk_cell_renderer_text_new();
4751 g_object_set(rend, 4738 g_object_set(rend,
4752 "foreground-set", TRUE, 4739 "foreground-set", TRUE,
4753 "weight-set", TRUE, 4740 "weight-set", TRUE,
4754 NULL); 4741 NULL);
4755 g_object_set(G_OBJECT(rend), "editable", TRUE, NULL); 4742 g_object_set(G_OBJECT(rend), "editable", TRUE, NULL);
4756 4743
4757 col = gtk_tree_view_column_new_with_attributes(NULL, rend, 4744 col = gtk_tree_view_column_new_with_attributes(NULL, rend,
4758 "text", CHAT_USERS_ALIAS_COLUMN, 4745 "text", CHAT_USERS_ALIAS_COLUMN,
4759 "foreground-gdk", CHAT_USERS_COLOR_COLUMN, 4746 "foreground-gdk", CHAT_USERS_COLOR_COLUMN,
4760 "weight", CHAT_USERS_WEIGHT_COLUMN, 4747 "weight", CHAT_USERS_WEIGHT_COLUMN,
4841 4828
4842 pidgin_tooltip_setup_for_widget(event_box, gtkconv, 4829 pidgin_tooltip_setup_for_widget(event_box, gtkconv,
4843 pidgin_conv_create_tooltip, NULL); 4830 pidgin_conv_create_tooltip, NULL);
4844 4831
4845 gtkconv->infopane = gtk_cell_view_new(); 4832 gtkconv->infopane = gtk_cell_view_new();
4846 gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); 4833 gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF);
4847 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), 4834 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane),
4848 GTK_TREE_MODEL(gtkconv->infopane_model)); 4835 GTK_TREE_MODEL(gtkconv->infopane_model));
4849 g_object_unref(gtkconv->infopane_model); 4836 g_object_unref(gtkconv->infopane_model);
4850 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter)); 4837 gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter));
4851 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0); 4838 gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0);
4864 gtk_widget_set_size_request(gtkconv->infopane_hbox, -1, buddyicon_size); 4851 gtk_widget_set_size_request(gtkconv->infopane_hbox, -1, buddyicon_size);
4865 gtk_widget_show(gtkconv->infopane); 4852 gtk_widget_show(gtkconv->infopane);
4866 4853
4867 rend = gtk_cell_renderer_pixbuf_new(); 4854 rend = gtk_cell_renderer_pixbuf_new();
4868 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE); 4855 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE);
4869 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", CONV_ICON_COLUMN, NULL); 4856 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "stock-id", CONV_ICON_COLUMN, NULL);
4870 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); 4857 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0,
4858 "stock-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL),
4859 NULL);
4871 4860
4872 rend = gtk_cell_renderer_text_new(); 4861 rend = gtk_cell_renderer_text_new();
4873 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE); 4862 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE);
4874 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", CONV_TEXT_COLUMN, NULL); 4863 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", CONV_TEXT_COLUMN, NULL);
4875 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); 4864 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL);
6061 PidginChatPane *gtkchat; 6050 PidginChatPane *gtkchat;
6062 PurpleConvChatBuddyFlags flags; 6051 PurpleConvChatBuddyFlags flags;
6063 PurpleConvChatBuddy *cbuddy; 6052 PurpleConvChatBuddy *cbuddy;
6064 GtkTreeIter iter; 6053 GtkTreeIter iter;
6065 GtkTreeModel *model; 6054 GtkTreeModel *model;
6055 GtkTextTag *tag;
6066 int f = 1; 6056 int f = 1;
6067 6057
6068 chat = PURPLE_CONV_CHAT(conv); 6058 chat = PURPLE_CONV_CHAT(conv);
6069 gtkconv = PIDGIN_CONVERSATION(conv); 6059 gtkconv = PIDGIN_CONVERSATION(conv);
6070 gtkchat = gtkconv->u.chat; 6060 gtkchat = gtkconv->u.chat;
6087 6077
6088 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); 6078 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
6089 6079
6090 g_free(val); 6080 g_free(val);
6091 } 6081 }
6082
6083 if ((tag = get_buddy_tag(conv, old_name, 0, FALSE)))
6084 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL);
6085 if ((tag = get_buddy_tag(conv, old_name, PURPLE_MESSAGE_NICK, FALSE)))
6086 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL);
6092 6087
6093 if (!purple_conv_chat_find_user(chat, old_name)) 6088 if (!purple_conv_chat_find_user(chat, old_name))
6094 return; 6089 return;
6095 6090
6096 g_return_if_fail(new_alias != NULL); 6091 g_return_if_fail(new_alias != NULL);
6110 GtkTreeModel *model; 6105 GtkTreeModel *model;
6111 GList *l; 6106 GList *l;
6112 char tmp[BUF_LONG]; 6107 char tmp[BUF_LONG];
6113 int num_users; 6108 int num_users;
6114 gboolean f; 6109 gboolean f;
6110 GtkTextTag *tag;
6115 6111
6116 chat = PURPLE_CONV_CHAT(conv); 6112 chat = PURPLE_CONV_CHAT(conv);
6117 gtkconv = PIDGIN_CONVERSATION(conv); 6113 gtkconv = PIDGIN_CONVERSATION(conv);
6118 gtkchat = gtkconv->u.chat; 6114 gtkchat = gtkconv->u.chat;
6119 6115
6142 else 6138 else
6143 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); 6139 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
6144 6140
6145 g_free(val); 6141 g_free(val);
6146 } while (f); 6142 } while (f);
6143
6144 if ((tag = get_buddy_tag(conv, l->data, 0, FALSE)))
6145 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL);
6146 if ((tag = get_buddy_tag(conv, l->data, PURPLE_MESSAGE_NICK, FALSE)))
6147 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL);
6147 } 6148 }
6148 6149
6149 g_snprintf(tmp, sizeof(tmp), 6150 g_snprintf(tmp, sizeof(tmp),
6150 ngettext("%d person in room", "%d people in room", 6151 ngettext("%d person in room", "%d people in room",
6151 num_users), num_users); 6152 num_users), num_users);
9415 #endif 9416 #endif
9416 9417
9417 /* Status icon. */ 9418 /* Status icon. */
9418 gtkconv->icon = gtk_image_new(); 9419 gtkconv->icon = gtk_image_new();
9419 gtkconv->menu_icon = gtk_image_new(); 9420 gtkconv->menu_icon = gtk_image_new();
9421 g_object_set(G_OBJECT(gtkconv->icon),
9422 "icon-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC),
9423 NULL);
9424 g_object_set(G_OBJECT(gtkconv->menu_icon),
9425 "icon-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC),
9426 NULL);
9420 gtk_widget_show(gtkconv->icon); 9427 gtk_widget_show(gtkconv->icon);
9421 update_tab_icon(conv); 9428 update_tab_icon(conv);
9422 9429
9423 /* Tab label. */ 9430 /* Tab label. */
9424 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); 9431 gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv));