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