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