comparison src/dialogs.c @ 4667:4bf9c6e8e432

[gaim-migrate @ 4978] protocol-specific smileys in the smiley dialog committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Fri, 07 Mar 2003 23:49:10 +0000
parents bf89c7598989
children 794cc8ec1166
comparison
equal deleted inserted replaced
4666:f8895ad921ee 4667:4bf9c6e8e432
60 #include "pixmaps/add.xpm" 60 #include "pixmaps/add.xpm"
61 #include "pixmaps/close.xpm" 61 #include "pixmaps/close.xpm"
62 62
63 #define PATHSIZE 1024 63 #define PATHSIZE 1024
64 64
65 int smiley_array[FACE_TOTAL];
66 char *current_smiley;
67 GdkColor bgcolor; 65 GdkColor bgcolor;
68 GdkColor fgcolor; 66 GdkColor fgcolor;
69 67
70 static GtkWidget *imdialog = NULL; /*I only want ONE of these :) */ 68 static GtkWidget *imdialog = NULL; /*I only want ONE of these :) */
71 static GList *dialogwindows = NULL; 69 static GList *dialogwindows = NULL;
3711 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.smiley); 3709 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.smiley);
3712 gtk_widget_destroy(gtkconv->dialogs.smiley); 3710 gtk_widget_destroy(gtkconv->dialogs.smiley);
3713 gtkconv->dialogs.smiley = NULL; 3711 gtkconv->dialogs.smiley = NULL;
3714 } 3712 }
3715 3713
3716 void set_smiley(GtkWidget *w, char *face)
3717 {
3718 current_smiley = face;
3719 }
3720
3721 void set_smiley_array(GtkWidget *widget, int smiley_type)
3722 {
3723 int i;
3724
3725 for (i = 0; i < FACE_TOTAL; i++)
3726 smiley_array[i] = 0;
3727
3728 smiley_array[smiley_type] = 1;
3729
3730 return;
3731 }
3732
3733 void insert_smiley_text(GtkWidget *widget, struct gaim_conversation *c) 3714 void insert_smiley_text(GtkWidget *widget, struct gaim_conversation *c)
3734 { 3715 {
3735 struct gaim_gtk_conversation *gtkconv; 3716 struct gaim_gtk_conversation *gtkconv;
3717 char *smiley_text = g_object_get_data(G_OBJECT(widget), "smiley_text");
3736 3718
3737 gtkconv = GAIM_GTK_CONVERSATION(c); 3719 gtkconv = GAIM_GTK_CONVERSATION(c);
3738 3720
3739 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, current_smiley, -1); 3721 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, smiley_text, -1);
3740 close_smiley_dialog(NULL, c); 3722 close_smiley_dialog(NULL, c);
3741 } 3723 }
3742 3724
3743 static void toolbar_add_smiley(struct gaim_conversation *c, GtkWidget *bar, char* path, char *filename, char *face) 3725 static void add_smiley(struct gaim_conversation *c, GtkWidget *table, int row, int col, char *filename, char *face)
3744 { 3726 {
3745 GtkWidget *image; 3727 GtkWidget *image;
3746 GtkWidget *button; 3728 GtkWidget *button;
3747 char *buf; 3729 struct gaim_gtk_conversation *gtkconv = GAIM_GTK_CONVERSATION(c);
3748 3730
3749 buf = g_build_filename(path, filename, NULL); 3731 image = gtk_image_new_from_file(filename);
3750 image = gtk_image_new_from_file(buf); 3732 button = gtk_button_new();
3751 g_free(buf); 3733 gtk_container_add(GTK_CONTAINER(button), image);
3752 button = 3734 g_object_set_data(G_OBJECT(button), "smiley_text", face);
3753 gtk_toolbar_append_item(GTK_TOOLBAR(bar), NULL, NULL, NULL, 3735 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), c);
3754 image, G_CALLBACK(set_smiley), (char *)face); 3736
3755 g_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), c); 3737 gtk_tooltips_set_tip(gtkconv->tooltips, button, face, NULL);
3738
3739 gtk_table_attach_defaults(GTK_TABLE(table), button, col, col+1, row, row+1);
3756 3740
3757 /* these look really weird with borders */ 3741 /* these look really weird with borders */
3758 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); 3742 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
3743
3744 gtk_widget_show(button);
3745 }
3746
3747 static gboolean smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) {
3748 while(list) {
3749 GtkIMHtmlSmiley *cur = list->data;
3750 if(!strcmp(cur->file, smiley->file))
3751 return FALSE;
3752 list = list->next;
3753 }
3754 return TRUE;
3759 } 3755 }
3760 3756
3761 void show_smiley_dialog(struct gaim_conversation *c, GtkWidget *widget) 3757 void show_smiley_dialog(struct gaim_conversation *c, GtkWidget *widget)
3762 { 3758 {
3763 struct gaim_gtk_conversation *gtkconv; 3759 struct gaim_gtk_conversation *gtkconv;
3764 GtkWidget *dialog; 3760 GtkWidget *dialog;
3765 GtkWidget *vbox, *smiley_box = NULL; 3761 GtkWidget *smiley_table = NULL;
3766 GtkWidget *win; 3762 GSList *smileys, *unique_smileys = NULL;
3767 GtkWidget *bbox; 3763 int width;
3768 char *smiley_path = 0; 3764 int row = 0, col = 0;
3769 3765
3770 gtkconv = GAIM_GTK_CONVERSATION(c); 3766 gtkconv = GAIM_GTK_CONVERSATION(c);
3771 3767
3772 if (gtkconv->dialogs.smiley) 3768 if (gtkconv->dialogs.smiley)
3773 return; 3769 return;
3774 3770
3775 win = GAIM_GTK_WINDOW(gaim_conversation_get_window(c))->window; 3771 if(c->account)
3772 smileys = get_proto_smileys(c->account->protocol);
3773 else
3774 smileys = get_proto_smileys(DEFAULT_PROTO);
3775
3776 while(smileys) {
3777 GtkIMHtmlSmiley *smiley = smileys->data;
3778 if(!smiley->hidden) {
3779 if(smiley_is_unique(unique_smileys, smiley))
3780 unique_smileys = g_slist_append(unique_smileys, smiley);
3781 }
3782 smileys = smileys->next;
3783 }
3784
3785
3786 width = floor(sqrt(g_slist_length(unique_smileys)));
3776 3787
3777 GAIM_DIALOG(dialog); 3788 GAIM_DIALOG(dialog);
3778 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); 3789 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
3779 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog"); 3790 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog");
3780 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); 3791 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
3781 3792
3782 /* setup boxes */ 3793 smiley_table = gtk_table_new(width, width, TRUE);
3783 vbox = gtk_vbox_new(TRUE, 5);
3784 bbox = gtk_hbox_new(FALSE, 5);
3785
3786
3787 /* setup buttons */
3788 3794
3789 /* pack buttons */ 3795 /* pack buttons */
3790 3796
3791 smiley_box = gtk_toolbar_new(); 3797 while(unique_smileys) {
3792 gtk_box_pack_start(GTK_BOX(vbox), smiley_box, TRUE, TRUE, 0); 3798 GtkIMHtmlSmiley *smiley = unique_smileys->data;
3793 3799 if(!smiley->hidden) {
3794 smiley_path = g_build_filename(DATADIR, "pixmaps", "gaim", "smileys", "default", NULL); 3800 add_smiley(c, smiley_table, row, col, smiley->file, smiley->smile);
3795 toolbar_add_smiley(c, smiley_box, smiley_path, "angel.png", "O:-)"); 3801 if(++col >= width) {
3796 toolbar_add_smiley(c, smiley_box, smiley_path, "bigsmile.png", ":-D"); 3802 col = 0;
3797 toolbar_add_smiley(c, smiley_box, smiley_path, "burp.png", ":-!"); 3803 row++;
3798 toolbar_add_smiley(c, smiley_box, smiley_path, "crossedlips.png", ":-X"); 3804 }
3799 3805 }
3800 smiley_box = gtk_toolbar_new(); 3806 unique_smileys = unique_smileys->next;
3801 gtk_box_pack_start(GTK_BOX(vbox), smiley_box, TRUE, TRUE, 0); 3807 }
3802 toolbar_add_smiley(c, smiley_box, smiley_path, "cry.png", ":'("); 3808
3803 toolbar_add_smiley(c, smiley_box, smiley_path, "embarrassed.png", ":-["); 3809 gtk_container_add(GTK_CONTAINER(dialog), smiley_table);
3804 toolbar_add_smiley(c, smiley_box, smiley_path, "kiss.png", ":-*"); 3810
3805 toolbar_add_smiley(c, smiley_box, smiley_path, "moneymouth.png", ":-$"); 3811 gtk_widget_show(smiley_table);
3806 3812
3807 smiley_box = gtk_toolbar_new();
3808 gtk_box_pack_start(GTK_BOX(vbox), smiley_box, TRUE, TRUE, 0);
3809 toolbar_add_smiley(c, smiley_box, smiley_path, "sad.png", ":-(");
3810 toolbar_add_smiley(c, smiley_box, smiley_path, "scream.png", "=-O");
3811 toolbar_add_smiley(c, smiley_box, smiley_path, "smile.png", ":-)");
3812 toolbar_add_smiley(c, smiley_box, smiley_path, "cool.png", "8-)");
3813
3814 smiley_box = gtk_toolbar_new();
3815 gtk_box_pack_start(GTK_BOX(vbox), smiley_box, TRUE, TRUE, 0);
3816 toolbar_add_smiley(c, smiley_box, smiley_path, "think.png", ":-/");
3817 toolbar_add_smiley(c, smiley_box, smiley_path, "tongue.png", ":-P");
3818 toolbar_add_smiley(c, smiley_box, smiley_path, "wink.png", ";-)");
3819 toolbar_add_smiley(c, smiley_box, smiley_path, "yell.png", ">:o");
3820
3821 g_free(smiley_path);
3822
3823 gtk_container_add(GTK_CONTAINER(dialog), vbox);
3824 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); 3813 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
3825 3814
3826 /* connect signals */ 3815 /* connect signals */
3827 g_object_set_data(G_OBJECT(dialog), "dialog_type", "smiley dialog"); 3816 g_object_set_data(G_OBJECT(dialog), "dialog_type", "smiley dialog");
3828 g_signal_connect(G_OBJECT(dialog), "delete_event", 3817 g_signal_connect(G_OBJECT(dialog), "delete_event",