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