comparison pidgin/gtkconv.c @ 32335:98ae4b8b592f

propagate from branch 'im.pidgin.pidgin' (head b55fa7e527d663bdb8c0320d6d035488e8446978) to branch 'im.pidgin.pidgin.mxit' (head 62c1402a9d54bdc07737fbefdfeb664eb5f01d81)
author pieter.loubser@mxit.com
date Thu, 11 Aug 2011 15:01:34 +0000
parents a8f62638417e
children 9aee8493db7f e8d4755ef84b e1cc8d07fe07
comparison
equal deleted inserted replaced
32334:3951afa56940 32335:98ae4b8b592f
3976 } 3976 }
3977 return image; 3977 return image;
3978 } 3978 }
3979 3979
3980 static void 3980 static void
3981 deleting_chat_buddy_cb(PurpleConvChatBuddy *cb)
3982 {
3983 if (cb->ui_data) {
3984 GtkTreeRowReference *ref = cb->ui_data;
3985 gtk_tree_row_reference_free(ref);
3986 cb->ui_data = NULL;
3987 }
3988 }
3989
3990 static void
3981 add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name) 3991 add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name)
3982 { 3992 {
3983 PidginConversation *gtkconv; 3993 PidginConversation *gtkconv;
3984 PidginChatPane *gtkchat; 3994 PidginChatPane *gtkchat;
3985 PurpleConvChat *chat; 3995 PurpleConvChat *chat;
3986 PurpleConnection *gc; 3996 PurpleConnection *gc;
3987 PurplePluginProtocolInfo *prpl_info; 3997 PurplePluginProtocolInfo *prpl_info;
3998 GtkTreeModel *tm;
3988 GtkListStore *ls; 3999 GtkListStore *ls;
4000 GtkTreePath *newpath;
3989 const char *stock; 4001 const char *stock;
3990 GtkTreeIter iter; 4002 GtkTreeIter iter;
3991 gboolean is_me = FALSE; 4003 gboolean is_me = FALSE;
3992 gboolean is_buddy; 4004 gboolean is_buddy;
3993 gchar *tmp, *alias_key, *name, *alias; 4005 gchar *tmp, *alias_key, *name, *alias;
3994 int flags; 4006 PurpleConvChatBuddyFlags flags;
3995 GdkColor *color = NULL; 4007 GdkColor *color = NULL;
3996 4008
3997 alias = cb->alias; 4009 alias = cb->alias;
3998 name = cb->name; 4010 name = cb->name;
3999 flags = GPOINTER_TO_INT(cb->flags); 4011 flags = cb->flags;
4000 4012
4001 chat = PURPLE_CONV_CHAT(conv); 4013 chat = PURPLE_CONV_CHAT(conv);
4002 gtkconv = PIDGIN_CONVERSATION(conv); 4014 gtkconv = PIDGIN_CONVERSATION(conv);
4003 gtkchat = gtkconv->u.chat; 4015 gtkchat = gtkconv->u.chat;
4004 gc = purple_conversation_get_gc(conv); 4016 gc = purple_conversation_get_gc(conv);
4005 4017
4006 if (!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl))) 4018 if (!gc || !(prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)))
4007 return; 4019 return;
4008 4020
4009 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); 4021 tm = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list));
4022 ls = GTK_LIST_STORE(tm);
4010 4023
4011 stock = get_chat_buddy_status_icon(chat, name, flags); 4024 stock = get_chat_buddy_status_icon(chat, name, flags);
4012 4025
4013 if (!strcmp(chat->nick, purple_normalize(conv->account, old_name != NULL ? old_name : name))) 4026 if (!strcmp(chat->nick, purple_normalize(conv->account, old_name != NULL ? old_name : name)))
4014 is_me = TRUE; 4027 is_me = TRUE;
4048 CHAT_USERS_NAME_COLUMN, name, 4061 CHAT_USERS_NAME_COLUMN, name,
4049 CHAT_USERS_FLAGS_COLUMN, flags, 4062 CHAT_USERS_FLAGS_COLUMN, flags,
4050 CHAT_USERS_COLOR_COLUMN, color, 4063 CHAT_USERS_COLOR_COLUMN, color,
4051 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, 4064 CHAT_USERS_WEIGHT_COLUMN, is_buddy ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
4052 -1); 4065 -1);
4066
4067 if (cb->ui_data) {
4068 GtkTreeRowReference *ref = cb->ui_data;
4069 gtk_tree_row_reference_free(ref);
4070 }
4071
4072 newpath = gtk_tree_model_get_path(tm, &iter);
4073 cb->ui_data = gtk_tree_row_reference_new(tm, newpath);
4074 gtk_tree_path_free(newpath);
4053 4075
4054 if (is_me && color) 4076 if (is_me && color)
4055 gdk_color_free(color); 4077 gdk_color_free(color);
4056 g_free(alias_key); 4078 g_free(alias_key);
4057 } 4079 }
4343 gtk_tree_model_get(model, b, 4365 gtk_tree_model_get(model, b,
4344 CHAT_USERS_ALIAS_KEY_COLUMN, &user2, 4366 CHAT_USERS_ALIAS_KEY_COLUMN, &user2,
4345 CHAT_USERS_FLAGS_COLUMN, &f2, 4367 CHAT_USERS_FLAGS_COLUMN, &f2,
4346 CHAT_USERS_WEIGHT_COLUMN, &buddy2, 4368 CHAT_USERS_WEIGHT_COLUMN, &buddy2,
4347 -1); 4369 -1);
4370
4371 /* Only sort by membership levels */
4372 f1 &= PURPLE_CBFLAGS_VOICE | PURPLE_CBFLAGS_HALFOP | PURPLE_CBFLAGS_OP |
4373 PURPLE_CBFLAGS_FOUNDER;
4374 f2 &= PURPLE_CBFLAGS_VOICE | PURPLE_CBFLAGS_HALFOP | PURPLE_CBFLAGS_OP |
4375 PURPLE_CBFLAGS_FOUNDER;
4348 4376
4349 if (user1 == NULL || user2 == NULL) { 4377 if (user1 == NULL || user2 == NULL) {
4350 if (!(user1 == NULL && user2 == NULL)) 4378 if (!(user1 == NULL && user2 == NULL))
4351 ret = (user1 == NULL) ? -1: 1; 4379 ret = (user1 == NULL) ? -1: 1;
4352 } else if (f1 != f2) { 4380 } else if (f1 != f2) {
6100 account, name, displaying, conv, flags); 6128 account, name, displaying, conv, flags);
6101 g_free(displaying); 6129 g_free(displaying);
6102 update_typing_message(gtkconv, NULL); 6130 update_typing_message(gtkconv, NULL);
6103 } 6131 }
6104 6132
6133 static gboolean get_iter_from_chatbuddy(PurpleConvChatBuddy *cb, GtkTreeIter *iter)
6134 {
6135 GtkTreeRowReference *ref = cb->ui_data;
6136 GtkTreePath *path;
6137 GtkTreeModel *model;
6138
6139 if (!ref)
6140 return FALSE;
6141
6142 if ((path = gtk_tree_row_reference_get_path(ref)) == NULL)
6143 return FALSE;
6144
6145 model = gtk_tree_row_reference_get_model(ref);
6146 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(model), iter, path)) {
6147 gtk_tree_path_free(path);
6148 return FALSE;
6149 }
6150
6151 gtk_tree_path_free(path);
6152 return TRUE;
6153 }
6154
6105 static void 6155 static void
6106 pidgin_conv_chat_add_users(PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals) 6156 pidgin_conv_chat_add_users(PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals)
6107 { 6157 {
6108 PurpleConvChat *chat; 6158 PurpleConvChat *chat;
6109 PidginConversation *gtkconv; 6159 PidginConversation *gtkconv;
6150 const char *new_name, const char *new_alias) 6200 const char *new_name, const char *new_alias)
6151 { 6201 {
6152 PurpleConvChat *chat; 6202 PurpleConvChat *chat;
6153 PidginConversation *gtkconv; 6203 PidginConversation *gtkconv;
6154 PidginChatPane *gtkchat; 6204 PidginChatPane *gtkchat;
6155 PurpleConvChatBuddyFlags flags; 6205 PurpleConvChatBuddy *old_cbuddy, *new_cbuddy;
6156 PurpleConvChatBuddy *cbuddy;
6157 GtkTreeIter iter; 6206 GtkTreeIter iter;
6158 GtkTreeModel *model; 6207 GtkTreeModel *model;
6159 GtkTextTag *tag; 6208 GtkTextTag *tag;
6160 int f = 1;
6161 6209
6162 chat = PURPLE_CONV_CHAT(conv); 6210 chat = PURPLE_CONV_CHAT(conv);
6163 gtkconv = PIDGIN_CONVERSATION(conv); 6211 gtkconv = PIDGIN_CONVERSATION(conv);
6164 gtkchat = gtkconv->u.chat; 6212 gtkchat = gtkconv->u.chat;
6165 6213
6166 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); 6214 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list));
6167 6215
6168 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) 6216 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter))
6169 return; 6217 return;
6170 6218
6171 while (f != 0) { 6219 old_cbuddy = purple_conv_chat_cb_find(chat, old_name);
6172 char *val; 6220 if (get_iter_from_chatbuddy(old_cbuddy, &iter)) {
6173 6221 GtkTreeRowReference *ref = old_cbuddy->ui_data;
6174 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, CHAT_USERS_FLAGS_COLUMN, &flags, -1); 6222
6175 6223 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
6176 if (!purple_utf8_strcasecmp(old_name, val)) { 6224 gtk_tree_row_reference_free(ref);
6177 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); 6225 old_cbuddy->ui_data = NULL;
6178 g_free(val);
6179 break;
6180 }
6181
6182 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
6183
6184 g_free(val);
6185 } 6226 }
6186 6227
6187 if ((tag = get_buddy_tag(conv, old_name, 0, FALSE))) 6228 if ((tag = get_buddy_tag(conv, old_name, 0, FALSE)))
6188 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL); 6229 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL);
6189 if ((tag = get_buddy_tag(conv, old_name, PURPLE_MESSAGE_NICK, FALSE))) 6230 if ((tag = get_buddy_tag(conv, old_name, PURPLE_MESSAGE_NICK, FALSE)))
6190 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL); 6231 g_object_set(G_OBJECT(tag), "style", PANGO_STYLE_ITALIC, NULL);
6191 6232
6192 if (!purple_conv_chat_find_user(chat, old_name)) 6233 if (!old_cbuddy)
6193 return; 6234 return;
6194 6235
6195 g_return_if_fail(new_alias != NULL); 6236 g_return_if_fail(new_alias != NULL);
6196 6237
6197 cbuddy = purple_conv_chat_cb_find(chat, new_name); 6238 new_cbuddy = purple_conv_chat_cb_find(chat, new_name);
6198 6239
6199 add_chat_buddy_common(conv, cbuddy, old_name); 6240 add_chat_buddy_common(conv, new_cbuddy, old_name);
6200 } 6241 }
6201 6242
6202 static void 6243 static void
6203 pidgin_conv_chat_remove_users(PurpleConversation *conv, GList *users) 6244 pidgin_conv_chat_remove_users(PurpleConversation *conv, GList *users)
6204 { 6245 {
6221 6262
6222 for (l = users; l != NULL; l = l->next) { 6263 for (l = users; l != NULL; l = l->next) {
6223 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); 6264 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list));
6224 6265
6225 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) 6266 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter))
6267 /* XXX: Break? */
6226 continue; 6268 continue;
6227 6269
6228 do { 6270 do {
6229 char *val; 6271 char *val;
6230 6272
6260 PurpleConvChatBuddy *cbuddy; 6302 PurpleConvChatBuddy *cbuddy;
6261 PidginConversation *gtkconv; 6303 PidginConversation *gtkconv;
6262 PidginChatPane *gtkchat; 6304 PidginChatPane *gtkchat;
6263 GtkTreeIter iter; 6305 GtkTreeIter iter;
6264 GtkTreeModel *model; 6306 GtkTreeModel *model;
6265 int f = 1;
6266 char *alias = NULL;
6267 6307
6268 chat = PURPLE_CONV_CHAT(conv); 6308 chat = PURPLE_CONV_CHAT(conv);
6269 gtkconv = PIDGIN_CONVERSATION(conv); 6309 gtkconv = PIDGIN_CONVERSATION(conv);
6270 gtkchat = gtkconv->u.chat; 6310 gtkchat = gtkconv->u.chat;
6271 6311
6272 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); 6312 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list));
6273 6313
6274 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) 6314 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter))
6275 return; 6315 return;
6276 6316
6277 while (f != 0) {
6278 char *val;
6279
6280 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, -1);
6281
6282 if (!purple_utf8_strcasecmp(user, val)) {
6283 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_ALIAS_COLUMN, &alias, -1);
6284 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
6285 g_free(val);
6286 break;
6287 }
6288
6289 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
6290
6291 g_free(val);
6292 }
6293
6294 if (!purple_conv_chat_find_user(chat, user))
6295 {
6296 g_free(alias);
6297 return;
6298 }
6299
6300 g_return_if_fail(alias != NULL);
6301
6302 cbuddy = purple_conv_chat_cb_find(chat, user); 6317 cbuddy = purple_conv_chat_cb_find(chat, user);
6318 if (get_iter_from_chatbuddy(cbuddy, &iter)) {
6319 GtkTreeRowReference *ref = cbuddy->ui_data;
6320 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
6321 gtk_tree_row_reference_free(ref);
6322 cbuddy->ui_data = NULL;
6323 }
6324
6303 if (cbuddy) 6325 if (cbuddy)
6304 add_chat_buddy_common(conv, cbuddy, NULL); 6326 add_chat_buddy_common(conv, cbuddy, NULL);
6305 g_free(alias);
6306 } 6327 }
6307 6328
6308 gboolean 6329 gboolean
6309 pidgin_conv_has_focus(PurpleConversation *conv) 6330 pidgin_conv_has_focus(PurpleConversation *conv)
6310 { 6331 {
6385 pidgin_conv_custom_smiley_write(PurpleConversation *conv, const char *smile, 6406 pidgin_conv_custom_smiley_write(PurpleConversation *conv, const char *smile,
6386 const guchar *data, gsize size) 6407 const guchar *data, gsize size)
6387 { 6408 {
6388 PidginConversation *gtkconv; 6409 PidginConversation *gtkconv;
6389 GtkIMHtmlSmiley *smiley; 6410 GtkIMHtmlSmiley *smiley;
6390 GdkPixbufLoader *loader;
6391 const char *sml; 6411 const char *sml;
6412 GError *error = NULL;
6392 6413
6393 sml = purple_account_get_protocol_name(conv->account); 6414 sml = purple_account_get_protocol_name(conv->account);
6394 gtkconv = PIDGIN_CONVERSATION(conv); 6415 gtkconv = PIDGIN_CONVERSATION(conv);
6395 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); 6416 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile);
6396 6417
6399 6420
6400 smiley->data = g_realloc(smiley->data, smiley->datasize + size); 6421 smiley->data = g_realloc(smiley->data, smiley->datasize + size);
6401 g_memmove((guchar *)smiley->data + smiley->datasize, data, size); 6422 g_memmove((guchar *)smiley->data + smiley->datasize, data, size);
6402 smiley->datasize += size; 6423 smiley->datasize += size;
6403 6424
6404 loader = smiley->loader; 6425 if (!smiley->loader)
6405 if (!loader)
6406 return; 6426 return;
6407 6427
6408 gdk_pixbuf_loader_write(loader, data, size, NULL); 6428 if (!gdk_pixbuf_loader_write(smiley->loader, data, size, &error) || error) {
6429 purple_debug_warning("gtkconv", "gdk_pixbuf_loader_write() "
6430 "failed with size=%zu: %s\n", size,
6431 error ? error->message : "(no error message)");
6432 if (error)
6433 g_error_free(error);
6434 /* We must stop using the GdkPixbufLoader because trying to load
6435 certain invalid GIFs with at least gdk-pixbuf 2.23.3 can return
6436 a GdkPixbuf that will cause some operations (like
6437 gdk_pixbuf_scale_simple()) to consume memory in an infinite loop.
6438 But we also don't want to set smiley->loader to NULL because our
6439 code might expect it to be set. So create a new loader. */
6440 g_object_unref(G_OBJECT(smiley->loader));
6441 smiley->loader = gdk_pixbuf_loader_new();
6442 }
6409 } 6443 }
6410 6444
6411 static void 6445 static void
6412 pidgin_conv_custom_smiley_close(PurpleConversation *conv, const char *smile) 6446 pidgin_conv_custom_smiley_close(PurpleConversation *conv, const char *smile)
6413 { 6447 {
6414 PidginConversation *gtkconv; 6448 PidginConversation *gtkconv;
6415 GtkIMHtmlSmiley *smiley; 6449 GtkIMHtmlSmiley *smiley;
6416 GdkPixbufLoader *loader;
6417 const char *sml; 6450 const char *sml;
6451 GError *error = NULL;
6418 6452
6419 g_return_if_fail(conv != NULL); 6453 g_return_if_fail(conv != NULL);
6420 g_return_if_fail(smile != NULL); 6454 g_return_if_fail(smile != NULL);
6421 6455
6422 sml = purple_account_get_protocol_name(conv->account); 6456 sml = purple_account_get_protocol_name(conv->account);
6424 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); 6458 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile);
6425 6459
6426 if (!smiley) 6460 if (!smiley)
6427 return; 6461 return;
6428 6462
6429 loader = smiley->loader; 6463 if (!smiley->loader)
6430
6431 if (!loader)
6432 return; 6464 return;
6433 6465
6434
6435
6436 purple_debug_info("gtkconv", "About to close the smiley pixbuf\n"); 6466 purple_debug_info("gtkconv", "About to close the smiley pixbuf\n");
6437 6467
6438 gdk_pixbuf_loader_close(loader, NULL); 6468 if (!gdk_pixbuf_loader_close(smiley->loader, &error) || error) {
6439 6469 purple_debug_warning("gtkconv", "gdk_pixbuf_loader_close() "
6470 "failed: %s\n",
6471 error ? error->message : "(no error message)");
6472 if (error)
6473 g_error_free(error);
6474 /* We must stop using the GdkPixbufLoader because if we tried to
6475 load certain invalid GIFs with all current versions of GDK (as
6476 of 2011-06-15) then it's possible the loader will contain data
6477 that could cause some operations (like gdk_pixbuf_scale_simple())
6478 to consume memory in an infinite loop. But we also don't want
6479 to set smiley->loader to NULL because our code might expect it
6480 to be set. So create a new loader. */
6481 g_object_unref(G_OBJECT(smiley->loader));
6482 smiley->loader = gdk_pixbuf_loader_new();
6483 }
6440 } 6484 }
6441 6485
6442 static void 6486 static void
6443 pidgin_conv_send_confirm(PurpleConversation *conv, const char *message) 6487 pidgin_conv_send_confirm(PurpleConversation *conv, const char *message)
6444 { 6488 {
6934 PidginConversation *gtkconv; 6978 PidginConversation *gtkconv;
6935 PidginWindow *win; 6979 PidginWindow *win;
6936 6980
6937 PurpleBuddy *buddy; 6981 PurpleBuddy *buddy;
6938 6982
6939 GdkPixbufLoader *loader;
6940 GdkPixbufAnimation *anim;
6941 GError *err = NULL;
6942
6943 PurpleStoredImage *custom_img = NULL; 6983 PurpleStoredImage *custom_img = NULL;
6944 gconstpointer data = NULL; 6984 gconstpointer data = NULL;
6945 size_t len; 6985 size_t len;
6946 6986
6947 GdkPixbuf *buf; 6987 GdkPixbuf *buf;
7015 } 7055 }
7016 } 7056 }
7017 7057
7018 if (data == NULL) { 7058 if (data == NULL) {
7019 icon = purple_conv_im_get_icon(PURPLE_CONV_IM(conv)); 7059 icon = purple_conv_im_get_icon(PURPLE_CONV_IM(conv));
7020
7021 if (icon == NULL) 7060 if (icon == NULL)
7022 { 7061 {
7023 gtk_widget_set_size_request(gtkconv->u.im->icon_container, 7062 gtk_widget_set_size_request(gtkconv->u.im->icon_container,
7024 -1, BUDDYICON_SIZE_MIN); 7063 -1, BUDDYICON_SIZE_MIN);
7025 return; 7064 return;
7026 } 7065 }
7027 7066
7028 data = purple_buddy_icon_get_data(icon, &len); 7067 data = purple_buddy_icon_get_data(icon, &len);
7029
7030 if (data == NULL) 7068 if (data == NULL)
7031 { 7069 {
7032 gtk_widget_set_size_request(gtkconv->u.im->icon_container, 7070 gtk_widget_set_size_request(gtkconv->u.im->icon_container,
7033 -1, BUDDYICON_SIZE_MIN); 7071 -1, BUDDYICON_SIZE_MIN);
7034 return; 7072 return;
7035 } 7073 }
7036 } 7074 }
7037 7075
7038 loader = gdk_pixbuf_loader_new(); 7076 gtkconv->u.im->anim = pidgin_pixbuf_anim_from_data(data, len);
7039 gdk_pixbuf_loader_write(loader, data, len, NULL);
7040 gdk_pixbuf_loader_close(loader, &err);
7041
7042 purple_imgstore_unref(custom_img); 7077 purple_imgstore_unref(custom_img);
7043 7078
7044 anim = gdk_pixbuf_loader_get_animation(loader); 7079 if (!gtkconv->u.im->anim) {
7045 if (anim) 7080 purple_debug_error("gtkconv", "Couldn't load icon for conv %s\n",
7046 g_object_ref(G_OBJECT(anim)); 7081 purple_conversation_get_name(conv));
7047 g_object_unref(loader);
7048
7049 if (!anim)
7050 return; 7082 return;
7051 gtkconv->u.im->anim = anim;
7052
7053 if (err) {
7054 purple_debug(PURPLE_DEBUG_ERROR, "gtkconv",
7055 "Buddy icon error: %s\n", err->message);
7056 g_error_free(err);
7057 } 7083 }
7058 7084
7059 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { 7085 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) {
7060 GdkPixbuf *stat; 7086 GdkPixbuf *stat;
7061 gtkconv->u.im->iter = NULL; 7087 gtkconv->u.im->iter = NULL;
7855 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold", FALSE); 7881 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold", FALSE);
7856 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic", FALSE); 7882 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic", FALSE);
7857 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline", FALSE); 7883 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline", FALSE);
7858 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/spellcheck", TRUE); 7884 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/spellcheck", TRUE);
7859 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_incoming_formatting", TRUE); 7885 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_incoming_formatting", TRUE);
7886 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/resize_custom_smileys", TRUE);
7887 purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/custom_smileys_size", 96);
7860 purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines", 2); 7888 purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines", 2);
7861 7889
7862 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps", TRUE); 7890 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_timestamps", TRUE);
7863 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar", TRUE); 7891 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar", TRUE);
7864 7892
8080 8108
8081 purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", 8109 purple_signal_connect(purple_conversations_get_handle(), "received-im-msg",
8082 handle, G_CALLBACK(received_im_msg_cb), NULL); 8110 handle, G_CALLBACK(received_im_msg_cb), NULL);
8083 purple_signal_connect(purple_conversations_get_handle(), "cleared-message-history", 8111 purple_signal_connect(purple_conversations_get_handle(), "cleared-message-history",
8084 handle, G_CALLBACK(clear_conversation_scrollback_cb), NULL); 8112 handle, G_CALLBACK(clear_conversation_scrollback_cb), NULL);
8113
8114 purple_signal_connect(purple_conversations_get_handle(), "deleting-chat-buddy",
8115 handle, G_CALLBACK(deleting_chat_buddy_cb), NULL);
8085 8116
8086 purple_conversations_set_ui_ops(&conversation_ui_ops); 8117 purple_conversations_set_ui_ops(&conversation_ui_ops);
8087 8118
8088 hidden_convwin = pidgin_conv_window_new(); 8119 hidden_convwin = pidgin_conv_window_new();
8089 window_list = g_list_remove(window_list, hidden_convwin); 8120 window_list = g_list_remove(window_list, hidden_convwin);