# HG changeset patch # User Sadrul Habib Chowdhury # Date 1211392580 0 # Node ID 99ef50c8da9142195f7f34992d2f583f57be38fa # Parent e0e57b83b359a6efa8bdb9a2adf933c0eb6dd861 Modified patch from malu to "Add context menu alternative to add received custom smiley". Closes #5855. diff -r e0e57b83b359 -r 99ef50c8da91 pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Wed May 21 12:29:27 2008 +0000 +++ b/pidgin/gtkimhtml.c Wed May 21 17:56:20 2008 +0000 @@ -32,10 +32,14 @@ #include "internal.h" #include "pidgin.h" #include "pidginstock.h" +#include "gtkutils.h" +#include "smiley.h" +#include "imgstore.h" #include "debug.h" #include "util.h" #include "gtkimhtml.h" +#include "gtksmiley.h" #include "gtksourceiter.h" #include "gtksourceundomanager.h" #include "gtksourceview-marshal.h" @@ -3687,6 +3691,15 @@ gtk_widget_show(image->filesel); } +static void +gtk_imhtml_custom_smiley_save(GtkWidget *w, GtkIMHtmlImage *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); +} + /* * So, um, AIM Direct IM lets you send any file, not just images. You can * just insert a sound or a file or whatever in a conversation. It's @@ -3711,6 +3724,19 @@ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_image_save), image); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + /* Add menu item for adding custom smiley to local smileys */ + /* we only add the menu if the image is of "custom smiley size" + <= 96x96 pixels */ + if (image->width <= 96 && image->height <= 96) { + text = g_strdup_printf(_("_Add Custom Smiley...")); + img = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); + item = gtk_image_menu_item_new_with_mnemonic(text); + 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); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + } + gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event_button->button, event_button->time); @@ -3732,7 +3758,7 @@ GdkPixbufAnimation *anim = NULL; GtkIMHtmlScalable *image = NULL; gboolean ret; - + if (event->type != GDK_BUTTON_RELEASE || ((GdkEventButton*)event)->button != 3) return FALSE; diff -r e0e57b83b359 -r 99ef50c8da91 pidgin/gtksmiley.c --- a/pidgin/gtksmiley.c Wed May 21 12:29:27 2008 +0000 +++ b/pidgin/gtksmiley.c Wed May 21 17:56:20 2008 +0000 @@ -39,14 +39,15 @@ #define PIDGIN_RESPONSE_EDIT 1000 -typedef struct +struct _PidginSmiley { PurpleSmiley *smiley; GtkWidget *parent; GtkWidget *smile; GtkWidget *smiley_image; gchar *filename; -} PidginSmiley; + GdkPixbuf *custom_pixbuf; +}; typedef struct { @@ -72,6 +73,8 @@ { gtk_widget_destroy(smiley->parent); g_free(smiley->filename); + if (smiley->custom_pixbuf) + gdk_pixbuf_unref(smiley->custom_pixbuf); g_free(smiley); } @@ -230,7 +233,8 @@ } purple_smiley_set_shortcut(s->smiley, entry); } else { - if ((s->filename == NULL || *entry == 0)) { + if ((s->filename == NULL && s->custom_pixbuf == NULL) + || *entry == 0) { purple_notify_error(s->parent, _("Custom Smiley"), _("More Data needed"), s->filename ? _("Please provide a shortcut to associate with the smiley.") @@ -239,6 +243,21 @@ } 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; + + gdk_pixbuf_save_to_bufferv(s->custom_pixbuf, &buffer, &size, + "png", NULL, NULL, NULL); + filename = purple_util_get_image_filename(buffer, size); + s->filename = g_build_filename(purple_smileys_get_storing_dir(), filename, NULL); + purple_util_write_data_to_file_absolute(s->filename, buffer, size); + g_free(filename); + g_free(buffer); + } emoticon = purple_smiley_new_from_file(entry, s->filename); pidgin_smiley_add_to_list(emoticon); } @@ -293,7 +312,8 @@ gtk_widget_show_all(file_chooser); } -void pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley) +PidginSmiley * +pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley) { GtkWidget *vbox; GtkWidget *hbox; @@ -307,7 +327,7 @@ s->smiley = smiley; window = gtk_dialog_new_with_buttons(smiley ? _("Edit Smiley") : _("Add Smiley"), - GTK_WINDOW(widget), + widget ? GTK_WINDOW(widget) : NULL, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, smiley ? GTK_STOCK_SAVE : GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, @@ -378,6 +398,24 @@ gtk_widget_show(GTK_WIDGET(window)); g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(pidgin_smiley_destroy), s); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(purple_notify_close_with_handle), s); + + return s; +} + +void +pidgin_smiley_editor_set_shortcut(PidginSmiley *editor, const gchar *shortcut) +{ + gtk_entry_set_text(GTK_ENTRY(editor->smile), shortcut ? shortcut : ""); +} + +void +pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image) +{ + if (editor->custom_pixbuf) + gdk_pixbuf_unref(editor->custom_pixbuf); + editor->custom_pixbuf = image ? gdk_pixbuf_ref(image) : NULL; + if (image) + gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image); } /****************************************************************************** @@ -648,7 +686,7 @@ gtk_dialog_set_response_sensitive(GTK_DIALOG(win), GTK_RESPONSE_NO, FALSE); gtk_dialog_set_response_sensitive(GTK_DIALOG(win), PIDGIN_RESPONSE_EDIT, FALSE); - + g_signal_connect(win, "response", G_CALLBACK(smiley_manager_select_cb), dialog); diff -r e0e57b83b359 -r 99ef50c8da91 pidgin/gtksmiley.h --- a/pidgin/gtksmiley.h Wed May 21 12:29:27 2008 +0000 +++ b/pidgin/gtksmiley.h Wed May 21 17:56:20 2008 +0000 @@ -1,6 +1,7 @@ /** * @file gtksmiley.h GTK+ Custom Smiley API * @ingroup pidgin + * @since 2.5.0 */ /* pidgin @@ -29,6 +30,8 @@ #include "smiley.h" +typedef struct _PidginSmiley PidginSmiley; + /** * Add a PurpleSmiley to the GtkIMHtmlSmiley's list to be able to use it * in pidgin @@ -72,9 +75,29 @@ /** * Shows an editor for a smiley. * - * @param widget The parent widget to be linked or @c NULL - * @param smiley The PurpleSmiley to be edited, or @c NULL for a new smiley + * @param widget The parent widget to be linked or @c NULL + * @param smiley The PurpleSmiley to be edited, or @c NULL for a new smiley + * @return The smiley add dialog + * + * @see pidgin_smiley_editor_set_shortcut + * @see pidgin_smiley_editor_set_image */ -void pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley); +PidginSmiley *pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley); + +/** + * Set the shortcut in a smiley add dialog + * + * @param editor A smiley editor dialog (created by pidgin_smiley_edit) + * @param shortcut The shortcut to set + */ +void pidgin_smiley_editor_set_shortcut(PidginSmiley *editor, const gchar *shortcut); + +/** + * Set the image in a smiley add dialog + * + * @param editor A smiley editor dialog + * @param image A GdkPixbuf image + */ +void pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image); #endif /* _PIDGIN_GTKSMILEY_H_*/