# Allows adding into local smileys an animated smiley, thanks to the # new structs from rev b7a9a556a47e7f06d11e8fcdee75a6bd4b164de3. # # Patch by frasten # # old_revision [5c5977a6ed3591121ef82ff587586850b9dcd176] # # patch "pidgin/gtkimhtml.c" # from [a2b15240fc9c6d228b99707b6b548cfc26cb1718] # to [dbac774b62d76fbe1371ea71c3ef06ad47d947f2] # # patch "pidgin/gtksmiley.c" # from [a942afe215c036667a01ec770970ac37e288b0b5] # to [6e12952c3af0e852dc9d9a1bc1a7ddadac7c37bc] # # patch "pidgin/gtksmiley.h" # from [a76d7590c1a4ff856badead1903f04baa10fc452] # to [eadc9695b25b5760750fbbb7aee368fd4a8e2131] # ============================================================ --- pidgin/gtkimhtml.c a2b15240fc9c6d228b99707b6b548cfc26cb1718 +++ pidgin/gtkimhtml.c dbac774b62d76fbe1371ea71c3ef06ad47d947f2 @@ -3867,12 +3867,15 @@ static void } static void -gtk_imhtml_custom_smiley_save(GtkWidget *w, GtkIMHtmlImage *image) +gtk_imhtml_custom_smiley_save(GtkWidget *w, GtkIMHtmlImageSave *save) { + GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image; + /* Create an add dialog */ PidginSmiley *editor = pidgin_smiley_edit(NULL, NULL); pidgin_smiley_editor_set_shortcut(editor, image->filename); pidgin_smiley_editor_set_image(editor, image->pixbuf); + pidgin_smiley_editor_set_data(editor, save->data, save->datasize); } /* @@ -3907,7 +3910,7 @@ static gboolean gtk_imhtml_image_clicked item = gtk_image_menu_item_new_with_mnemonic(_("_Add Custom Smiley...")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img); g_signal_connect(G_OBJECT(item), "activate", - G_CALLBACK(gtk_imhtml_custom_smiley_save), image); + G_CALLBACK(gtk_imhtml_custom_smiley_save), save); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } ============================================================ --- pidgin/gtksmiley.c a942afe215c036667a01ec770970ac37e288b0b5 +++ pidgin/gtksmiley.c 6e12952c3af0e852dc9d9a1bc1a7ddadac7c37bc @@ -47,6 +47,8 @@ struct _PidginSmiley GtkWidget *smiley_image; gchar *filename; GdkPixbuf *custom_pixbuf; + gpointer data; /** @Since 2.6.0 */ + gsize datasize; /** @Since 2.6.0 */ }; typedef struct @@ -277,7 +279,6 @@ static void do_add(GtkWidget *widget, Pi purple_debug_info("gtksmiley", "adding a new smiley\n"); if (s->filename == NULL) { - /* Get the smiley from the custom pixbuf */ gchar *buffer = NULL; gsize size = 0; gchar *filename; @@ -296,8 +297,16 @@ static void do_add(GtkWidget *widget, Pi } } - gdk_pixbuf_save_to_buffer(s->custom_pixbuf, &buffer, &size, - "png", NULL, "compression", "9", NULL, NULL); + if (s->data && s->datasize) { + /* Cached data & size in memory */ + buffer = s->data; + size = s->datasize; + } + else { + /* Get the smiley from the custom pixbuf */ + gdk_pixbuf_save_to_buffer(s->custom_pixbuf, &buffer, &size, + "png", NULL, "compression", "9", NULL, NULL); + } filename = purple_util_get_image_filename(buffer, size); s->filename = g_build_filename(dirname, filename, NULL); purple_util_write_data_to_file_absolute(s->filename, buffer, size); @@ -465,6 +474,13 @@ pidgin_smiley_editor_set_image(PidginSmi gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image); } +void +pidgin_smiley_editor_set_data(PidginSmiley *editor, gpointer *data, gsize datasize) +{ + editor->data = data; + editor->datasize = datasize; +} + /****************************************************************************** * Delete smiley *****************************************************************************/ ============================================================ --- pidgin/gtksmiley.h a76d7590c1a4ff856badead1903f04baa10fc452 +++ pidgin/gtksmiley.h eadc9695b25b5760750fbbb7aee368fd4a8e2131 @@ -100,4 +100,14 @@ void pidgin_smiley_editor_set_image(Pidg */ void pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image); +/** + * Sets the image data in a smiley add dialog + * + * @since 2.6.0 + * @param editor A smiley editor dialog + * @param data A pointer to smiley's data + * @param datasize The size of smiley's data + */ +void pidgin_smiley_editor_set_data(PidginSmiley *editor, gpointer *data, gsize datasize); + #endif /* PIDGIN_GTKSMILEY_H */