pidgin/gtkwebviewtoolbar.c

branch
soc.2013.gobjectification.plugins
changeset 37134
07746c9a04bf
parent 37133
832cd077145e
parent 35821
48f1315f1f58
child 37135
6271bcdee576
equal deleted inserted replaced
37133:832cd077145e 37134:07746c9a04bf
20 * 20 *
21 */ 21 */
22 #include "internal.h" 22 #include "internal.h"
23 #include "pidgin.h" 23 #include "pidgin.h"
24 24
25 #include "imgstore.h" 25 #include "image-store.h"
26 #include "notify.h" 26 #include "notify.h"
27 #include "prefs.h" 27 #include "prefs.h"
28 #include "request.h" 28 #include "request.h"
29 #include "pidginstock.h" 29 #include "pidginstock.h"
30 #include "smiley-custom.h" 30 #include "smiley-custom.h"
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
776 return total_width; 789 return total_width;
777 } 790 }
778 791
779 static void 792 static void
780 add_smiley_list(PidginWebViewToolbar *toolbar, GtkWidget *container, 793 add_smiley_list(PidginWebViewToolbar *toolbar, GtkWidget *container,
781 GList *smileys, int max_width, PurpleSmileyList *shadow_smileys) 794 GList *smileys, int max_width, PurpleSmileyList *shadow_smileys,
795 const gchar *smiley_class)
782 { 796 {
783 GList *it; 797 GList *it;
784 GtkWidget *line; 798 GtkWidget *line;
785 int line_width = 0; 799 int line_width = 0;
786 800
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."));

mercurial