| 606 |
606 |
| 607 static void |
607 static void |
| 608 do_insert_image_cb(GtkWidget *widget, int response, PidginWebViewToolbar *toolbar) |
608 do_insert_image_cb(GtkWidget *widget, int response, PidginWebViewToolbar *toolbar) |
| 609 { |
609 { |
| 610 PidginWebViewToolbarPriv *priv = PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
610 PidginWebViewToolbarPriv *priv = PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
| 611 gchar *filename = NULL, *name, *buf; |
611 gchar *filename = NULL, *buf; |
| 612 char *filedata; |
612 char *filedata; |
| 613 size_t size; |
613 size_t size; |
| 614 GError *error = NULL; |
614 GError *error = NULL; |
| 615 int id; |
615 PurpleImage *img; |
| 616 |
616 |
| 617 if (response == GTK_RESPONSE_ACCEPT) |
617 if (response == GTK_RESPONSE_ACCEPT) |
| 618 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); |
618 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); |
| 619 |
619 |
| 620 /* The following triggers a callback that closes the widget */ |
620 /* The following triggers a callback that closes the widget */ |
| 630 g_free(filename); |
630 g_free(filename); |
| 631 |
631 |
| 632 return; |
632 return; |
| 633 } |
633 } |
| 634 |
634 |
| 635 name = strrchr(filename, G_DIR_SEPARATOR) + 1; |
635 img = purple_image_new_from_data(filedata, size); |
| 636 |
636 purple_image_set_friendly_filename(img, filename); |
| 637 id = purple_imgstore_new_with_id(filedata, size, name); |
637 |
| 638 |
638 if (!img) { |
| 639 if (id == 0) { |
|
| 640 buf = g_strdup_printf(_("Failed to store image: %s\n"), filename); |
639 buf = g_strdup_printf(_("Failed to store image: %s\n"), filename); |
| 641 purple_notify_error(NULL, NULL, buf, NULL, NULL); |
640 purple_notify_error(NULL, NULL, buf, NULL, NULL); |
| 642 |
641 |
| 643 g_free(buf); |
642 g_free(buf); |
| 644 g_free(filename); |
643 g_free(filename); |
| 646 return; |
645 return; |
| 647 } |
646 } |
| 648 |
647 |
| 649 g_free(filename); |
648 g_free(filename); |
| 650 |
649 |
| 651 pidgin_webview_insert_image(PIDGIN_WEBVIEW(toolbar->webview), id); |
650 pidgin_webview_insert_image(PIDGIN_WEBVIEW(toolbar->webview), img); |
| 652 /* TODO: do it after passing an image to protocol, not before |
651 /* TODO: do it after passing an image to protocol, not before |
| 653 * purple_imgstore_unref_by_id(id); |
652 * g_object_unref(img); |
| 654 */ |
653 */ |
| 655 } |
654 } |
| 656 |
655 |
| 657 static void |
656 static void |
| 658 insert_image_cb(GtkAction *action, PidginWebViewToolbar *toolbar) |
657 insert_image_cb(GtkAction *action, PidginWebViewToolbar *toolbar) |
| 700 } |
699 } |
| 701 |
700 |
| 702 static void |
701 static void |
| 703 insert_smiley_text(GtkWidget *widget, PidginWebViewToolbar *toolbar) |
702 insert_smiley_text(GtkWidget *widget, PidginWebViewToolbar *toolbar) |
| 704 { |
703 { |
| 705 char *smiley_text, *escaped_smiley; |
704 PurpleSmiley *smiley; |
| 706 |
705 PurpleImage *image; |
| 707 smiley_text = g_object_get_data(G_OBJECT(widget), "smiley_text"); |
706 guint image_id; |
| 708 escaped_smiley = g_markup_escape_text(smiley_text, -1); |
707 gchar *escaped_smiley, *smiley_html; |
| |
708 const gchar *smiley_class; |
| |
709 |
| |
710 smiley = g_object_get_data(G_OBJECT(widget), "smiley"); |
| |
711 smiley_class = g_object_get_data(G_OBJECT(widget), "smiley-class"); |
| |
712 image = purple_smiley_get_image(smiley); |
| |
713 image_id = purple_image_store_add(image); |
| |
714 |
| |
715 escaped_smiley = g_markup_escape_text( |
| |
716 purple_smiley_get_shortcut(smiley), -1); |
| |
717 smiley_html = g_strdup_printf("<img src=\"" PURPLE_IMAGE_STORE_PROTOCOL |
| |
718 "%u\" class=\"emoticon %s-emoticon\" alt=\"%s\" title=\"%s\">", |
| |
719 image_id, smiley_class, escaped_smiley, escaped_smiley); |
| |
720 |
| |
721 g_free(escaped_smiley); |
| 709 |
722 |
| 710 pidgin_webview_append_html(PIDGIN_WEBVIEW(toolbar->webview), |
723 pidgin_webview_append_html(PIDGIN_WEBVIEW(toolbar->webview), |
| 711 escaped_smiley); |
724 smiley_html); |
| 712 |
725 |
| 713 g_free(escaped_smiley); |
726 g_free(smiley_html); |
| 714 |
727 |
| 715 close_smiley_dialog(toolbar); |
728 close_smiley_dialog(toolbar); |
| 716 } |
729 } |
| 717 |
730 |
| 718 static gboolean |
731 static gboolean |
| 813 |
827 |
| 814 image = GTK_IMAGE(gtk_image_new_from_pixbuf(pixbuf)); |
828 image = GTK_IMAGE(gtk_image_new_from_pixbuf(pixbuf)); |
| 815 |
829 |
| 816 button = gtk_button_new(); |
830 button = gtk_button_new(); |
| 817 gtk_container_add(GTK_CONTAINER(button), GTK_WIDGET(image)); |
831 gtk_container_add(GTK_CONTAINER(button), GTK_WIDGET(image)); |
| 818 g_object_set_data_full(G_OBJECT(button), "smiley_text", |
832 |
| 819 g_strdup(smiley_shortcut), g_free); |
833 g_object_ref(smiley); |
| |
834 g_object_set_data_full(G_OBJECT(button), "smiley", |
| |
835 smiley, g_object_unref); |
| |
836 g_object_set_data(G_OBJECT(button), |
| |
837 "smiley-class", (gpointer)smiley_class); |
| |
838 |
| 820 g_signal_connect(G_OBJECT(button), "clicked", |
839 g_signal_connect(G_OBJECT(button), "clicked", |
| 821 G_CALLBACK(insert_smiley_text), toolbar); |
840 G_CALLBACK(insert_smiley_text), toolbar); |
| 822 gtk_widget_set_tooltip_text(button, smiley_shortcut); |
841 gtk_widget_set_tooltip_text(button, smiley_shortcut); |
| 823 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
842 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
| 824 |
843 |
| 944 } |
963 } |
| 945 |
964 |
| 946 /* Add buttons for smileys. */ |
965 /* Add buttons for smileys. */ |
| 947 if (theme_smileys) { |
966 if (theme_smileys) { |
| 948 add_smiley_list(toolbar, smiley_table, theme_smileys, |
967 add_smiley_list(toolbar, smiley_table, theme_smileys, |
| 949 max_line_width, smileys_from_custom); |
968 max_line_width, smileys_from_custom, "theme"); |
| 950 } |
969 } |
| 951 if (theme_smileys && custom_smileys) { |
970 if (theme_smileys && custom_smileys) { |
| 952 gtk_box_pack_start(GTK_BOX(smiley_table), |
971 gtk_box_pack_start(GTK_BOX(smiley_table), |
| 953 gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), |
972 gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), |
| 954 TRUE, FALSE, 0); |
973 TRUE, FALSE, 0); |
| 955 } |
974 } |
| 956 if (custom_smileys) { |
975 if (custom_smileys) { |
| 957 add_smiley_list(toolbar, smiley_table, custom_smileys, |
976 add_smiley_list(toolbar, smiley_table, custom_smileys, |
| 958 max_line_width, NULL); |
977 max_line_width, NULL, "custom"); |
| 959 } |
978 } |
| 960 |
979 |
| 961 gtk_widget_add_events(dialog, GDK_KEY_PRESS_MASK); |
980 gtk_widget_add_events(dialog, GDK_KEY_PRESS_MASK); |
| 962 } else { |
981 } else { |
| 963 smiley_table = gtk_label_new(_("This theme has no available smileys.")); |
982 smiley_table = gtk_label_new(_("This theme has no available smileys.")); |