comparison pidgin/gtksmiley.c @ 23163:99ef50c8da91

Modified patch from malu to "Add context menu alternative to add received custom smiley". Closes #5855.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Wed, 21 May 2008 17:56:20 +0000
parents d0ee799828d1
children 013ec6fabd3f
comparison
equal deleted inserted replaced
23162:e0e57b83b359 23163:99ef50c8da91
37 #include "gtkutils.h" 37 #include "gtkutils.h"
38 #include "pidginstock.h" 38 #include "pidginstock.h"
39 39
40 #define PIDGIN_RESPONSE_EDIT 1000 40 #define PIDGIN_RESPONSE_EDIT 1000
41 41
42 typedef struct 42 struct _PidginSmiley
43 { 43 {
44 PurpleSmiley *smiley; 44 PurpleSmiley *smiley;
45 GtkWidget *parent; 45 GtkWidget *parent;
46 GtkWidget *smile; 46 GtkWidget *smile;
47 GtkWidget *smiley_image; 47 GtkWidget *smiley_image;
48 gchar *filename; 48 gchar *filename;
49 } PidginSmiley; 49 GdkPixbuf *custom_pixbuf;
50 };
50 51
51 typedef struct 52 typedef struct
52 { 53 {
53 GtkWidget *window; 54 GtkWidget *window;
54 55
70 static void 71 static void
71 pidgin_smiley_destroy(PidginSmiley *smiley) 72 pidgin_smiley_destroy(PidginSmiley *smiley)
72 { 73 {
73 gtk_widget_destroy(smiley->parent); 74 gtk_widget_destroy(smiley->parent);
74 g_free(smiley->filename); 75 g_free(smiley->filename);
76 if (smiley->custom_pixbuf)
77 gdk_pixbuf_unref(smiley->custom_pixbuf);
75 g_free(smiley); 78 g_free(smiley);
76 } 79 }
77 80
78 /****************************************************************************** 81 /******************************************************************************
79 * GtkIMHtmlSmileys stuff 82 * GtkIMHtmlSmileys stuff
228 } 231 }
229 purple_smiley_set_data(s->smiley, (guchar*)data, len, FALSE); 232 purple_smiley_set_data(s->smiley, (guchar*)data, len, FALSE);
230 } 233 }
231 purple_smiley_set_shortcut(s->smiley, entry); 234 purple_smiley_set_shortcut(s->smiley, entry);
232 } else { 235 } else {
233 if ((s->filename == NULL || *entry == 0)) { 236 if ((s->filename == NULL && s->custom_pixbuf == NULL)
237 || *entry == 0) {
234 purple_notify_error(s->parent, _("Custom Smiley"), 238 purple_notify_error(s->parent, _("Custom Smiley"),
235 _("More Data needed"), 239 _("More Data needed"),
236 s->filename ? _("Please provide a shortcut to associate with the smiley.") 240 s->filename ? _("Please provide a shortcut to associate with the smiley.")
237 : _("Please select an image for the smiley.")); 241 : _("Please select an image for the smiley."));
238 return; 242 return;
239 } 243 }
240 244
241 purple_debug_info("gtksmiley", "adding a new smiley\n"); 245 purple_debug_info("gtksmiley", "adding a new smiley\n");
246
247 if (s->filename == NULL) {
248 /* Get the smiley from the custom pixbuf */
249 gchar *buffer = NULL;
250 gsize size = 0;
251 gchar *filename;
252
253 gdk_pixbuf_save_to_bufferv(s->custom_pixbuf, &buffer, &size,
254 "png", NULL, NULL, NULL);
255 filename = purple_util_get_image_filename(buffer, size);
256 s->filename = g_build_filename(purple_smileys_get_storing_dir(), filename, NULL);
257 purple_util_write_data_to_file_absolute(s->filename, buffer, size);
258 g_free(filename);
259 g_free(buffer);
260 }
242 emoticon = purple_smiley_new_from_file(entry, s->filename); 261 emoticon = purple_smiley_new_from_file(entry, s->filename);
243 pidgin_smiley_add_to_list(emoticon); 262 pidgin_smiley_add_to_list(emoticon);
244 } 263 }
245 264
246 if (smiley_manager != NULL) 265 if (smiley_manager != NULL)
291 gtk_window_set_title(GTK_WINDOW(file_chooser), _("Custom Smiley")); 310 gtk_window_set_title(GTK_WINDOW(file_chooser), _("Custom Smiley"));
292 gtk_window_set_role(GTK_WINDOW(file_chooser), "file-selector-custom-smiley"); 311 gtk_window_set_role(GTK_WINDOW(file_chooser), "file-selector-custom-smiley");
293 gtk_widget_show_all(file_chooser); 312 gtk_widget_show_all(file_chooser);
294 } 313 }
295 314
296 void pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley) 315 PidginSmiley *
316 pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley)
297 { 317 {
298 GtkWidget *vbox; 318 GtkWidget *vbox;
299 GtkWidget *hbox; 319 GtkWidget *hbox;
300 GtkWidget *label; 320 GtkWidget *label;
301 GtkWidget *filech; 321 GtkWidget *filech;
305 325
306 PidginSmiley *s = g_new0(PidginSmiley, 1); 326 PidginSmiley *s = g_new0(PidginSmiley, 1);
307 s->smiley = smiley; 327 s->smiley = smiley;
308 328
309 window = gtk_dialog_new_with_buttons(smiley ? _("Edit Smiley") : _("Add Smiley"), 329 window = gtk_dialog_new_with_buttons(smiley ? _("Edit Smiley") : _("Add Smiley"),
310 GTK_WINDOW(widget), 330 widget ? GTK_WINDOW(widget) : NULL,
311 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, 331 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
312 smiley ? GTK_STOCK_SAVE : GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, 332 smiley ? GTK_STOCK_SAVE : GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
313 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 333 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
314 NULL); 334 NULL);
315 s->parent = window; 335 s->parent = window;
376 gtk_widget_show(hbox); 396 gtk_widget_show(hbox);
377 397
378 gtk_widget_show(GTK_WIDGET(window)); 398 gtk_widget_show(GTK_WIDGET(window));
379 g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(pidgin_smiley_destroy), s); 399 g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(pidgin_smiley_destroy), s);
380 g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(purple_notify_close_with_handle), s); 400 g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(purple_notify_close_with_handle), s);
401
402 return s;
403 }
404
405 void
406 pidgin_smiley_editor_set_shortcut(PidginSmiley *editor, const gchar *shortcut)
407 {
408 gtk_entry_set_text(GTK_ENTRY(editor->smile), shortcut ? shortcut : "");
409 }
410
411 void
412 pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image)
413 {
414 if (editor->custom_pixbuf)
415 gdk_pixbuf_unref(editor->custom_pixbuf);
416 editor->custom_pixbuf = image ? gdk_pixbuf_ref(image) : NULL;
417 if (image)
418 gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image);
381 } 419 }
382 420
383 /****************************************************************************** 421 /******************************************************************************
384 * Delete smiley 422 * Delete smiley
385 *****************************************************************************/ 423 *****************************************************************************/
646 gtk_window_set_role(GTK_WINDOW(win), "custom_smiley_manager"); 684 gtk_window_set_role(GTK_WINDOW(win), "custom_smiley_manager");
647 gtk_container_set_border_width(GTK_CONTAINER(win),PIDGIN_HIG_BORDER); 685 gtk_container_set_border_width(GTK_CONTAINER(win),PIDGIN_HIG_BORDER);
648 gtk_dialog_set_response_sensitive(GTK_DIALOG(win), GTK_RESPONSE_NO, FALSE); 686 gtk_dialog_set_response_sensitive(GTK_DIALOG(win), GTK_RESPONSE_NO, FALSE);
649 gtk_dialog_set_response_sensitive(GTK_DIALOG(win), PIDGIN_RESPONSE_EDIT, 687 gtk_dialog_set_response_sensitive(GTK_DIALOG(win), PIDGIN_RESPONSE_EDIT,
650 FALSE); 688 FALSE);
651 689
652 g_signal_connect(win, "response", G_CALLBACK(smiley_manager_select_cb), 690 g_signal_connect(win, "response", G_CALLBACK(smiley_manager_select_cb),
653 dialog); 691 dialog);
654 692
655 /* The vbox */ 693 /* The vbox */
656 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); 694 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);