Mercurial > pidgin
comparison src/conversation.c @ 3790:12b29552f1d7
[gaim-migrate @ 3930]
Better than cheddar, it's i18n input...
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Wed, 23 Oct 2002 00:12:49 +0000 |
parents | fb519383a058 |
children | 3163a8825063 |
comparison
equal
deleted
inserted
replaced
3789:fb519383a058 | 3790:12b29552f1d7 |
---|---|
77 | 77 |
78 int fontsize = 3; | 78 int fontsize = 3; |
79 extern GdkColor bgcolor; | 79 extern GdkColor bgcolor; |
80 extern GdkColor fgcolor; | 80 extern GdkColor fgcolor; |
81 | 81 |
82 void check_everything(GtkWidget *entry); | 82 void check_everything(GtkTextBuffer *buffer); |
83 gboolean keypress_callback(GtkWidget *entry, GdkEventKey * event, struct conversation *c); | 83 gboolean keypress_callback(GtkWidget *entry, GdkEventKey * event, struct conversation *c); |
84 gboolean stop_rclick_callback(GtkWidget *widget, GdkEventButton *event, gpointer data); | |
84 | 85 |
85 static void update_icon(struct conversation *); | 86 static void update_icon(struct conversation *); |
86 static void remove_icon(struct conversation *); | 87 static void remove_icon(struct conversation *); |
87 | 88 |
88 static void update_checkbox(struct conversation *); | 89 static void update_checkbox(struct conversation *); |
438 static void do_insert_image(GtkObject *obj, GtkWidget *wid) | 439 static void do_insert_image(GtkObject *obj, GtkWidget *wid) |
439 { | 440 { |
440 struct conversation *c = gtk_object_get_user_data(obj); | 441 struct conversation *c = gtk_object_get_user_data(obj); |
441 const char *name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); | 442 const char *name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); |
442 const char *filename; | 443 const char *filename; |
443 int pos; | |
444 char *buf; | 444 char *buf; |
445 struct stat st; | 445 struct stat st; |
446 int id = g_slist_length(c->images) + 1; | 446 int id = g_slist_length(c->images) + 1; |
447 | 447 |
448 if (file_is_dir(name, wid)) | 448 if (file_is_dir(name, wid)) |
463 filename = strchr(filename, '/') + 1; | 463 filename = strchr(filename, '/') + 1; |
464 | 464 |
465 buf = g_strdup_printf ("<IMG SRC=\"file://%s\" ID=\"%d\" DATASIZE=\"%d\">", | 465 buf = g_strdup_printf ("<IMG SRC=\"file://%s\" ID=\"%d\" DATASIZE=\"%d\">", |
466 filename, id, (int)st.st_size); | 466 filename, id, (int)st.st_size); |
467 c->images = g_slist_append(c->images, g_strdup(name)); | 467 c->images = g_slist_append(c->images, g_strdup(name)); |
468 | 468 gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(c->entry_buffer), |
469 if (GTK_OLD_EDITABLE(c->entry)->has_selection) { | 469 buf, -1); |
470 int finish = GTK_OLD_EDITABLE(c->entry)->selection_end_pos; | |
471 gtk_editable_insert_text(GTK_EDITABLE(c->entry), | |
472 buf, strlen(buf), &finish); | |
473 } else { | |
474 pos = GTK_OLD_EDITABLE(c->entry)->current_pos; | |
475 gtk_editable_insert_text(GTK_EDITABLE(c->entry), | |
476 buf, strlen(buf), &pos); | |
477 } | |
478 g_free(buf); | 470 g_free(buf); |
479 } | 471 } |
480 | 472 |
481 void insert_image(GtkWidget *save, struct conversation *c) | 473 void insert_image(GtkWidget *save, struct conversation *c) |
482 { | 474 { |
518 return FALSE; | 510 return FALSE; |
519 } | 511 } |
520 | 512 |
521 debug_printf("conversation close callback\n"); | 513 debug_printf("conversation close callback\n"); |
522 | 514 |
523 if (convo_options & OPT_CONVO_CHECK_SPELLING) | 515 /* if (convo_options & OPT_CONVO_CHECK_SPELLING) |
524 gtkspell_detach(GTK_TEXT(c->entry)); | 516 gtkspell_detach(GTK_TEXT(c->entry));*/ |
525 | 517 |
526 if (!c->is_chat) { | 518 if (!c->is_chat) { |
527 GSList *cn = connections; | 519 GSList *cn = connections; |
528 if (!(misc_options & OPT_MISC_STEALTH_TYPING)) | 520 if (!(misc_options & OPT_MISC_STEALTH_TYPING)) |
529 serv_send_typing(c->gc, c->name, NOT_TYPING); | 521 serv_send_typing(c->gc, c->name, NOT_TYPING); |
623 | 615 |
624 sprintf(c->fontface, "%s", newfont && *newfont ? newfont : DEFAULT_FONT_FACE); | 616 sprintf(c->fontface, "%s", newfont && *newfont ? newfont : DEFAULT_FONT_FACE); |
625 c->hasfont = 1; | 617 c->hasfont = 1; |
626 | 618 |
627 pre_fontface = g_strconcat("<FONT FACE=\"", c->fontface, "\">", NULL); | 619 pre_fontface = g_strconcat("<FONT FACE=\"", c->fontface, "\">", NULL); |
628 surround(c->entry, pre_fontface, "</FONT>"); | 620 surround(c, pre_fontface, "</FONT>"); |
629 gtk_widget_grab_focus(c->entry); | 621 gtk_widget_grab_focus(c->entry); |
630 g_free(pre_fontface); | 622 g_free(pre_fontface); |
631 } | 623 } |
632 | 624 |
633 gint delete_all_convo(GtkWidget *w, GdkEventAny *e, gpointer d) | 625 gint delete_all_convo(GtkWidget *w, GdkEventAny *e, gpointer d) |
819 { | 811 { |
820 struct conversation *c = (struct conversation*)data; | 812 struct conversation *c = (struct conversation*)data; |
821 if (c && c->gc && c->name) { | 813 if (c && c->gc && c->name) { |
822 c->type_again = 1; | 814 c->type_again = 1; |
823 serv_send_typing(c->gc, c->name, TYPED); | 815 serv_send_typing(c->gc, c->name, TYPED); |
816 debug_printf("typed...\n"); | |
824 } | 817 } |
825 return FALSE; | 818 return FALSE; |
826 } | 819 } |
827 | 820 |
828 gboolean keypress_callback(GtkWidget *entry, GdkEventKey * event, struct conversation *c) | 821 gboolean keypress_callback(GtkWidget *entry, GdkEventKey *event, struct conversation *c) |
829 { | 822 { |
830 int pos; | |
831 | |
832 if (event->keyval == GDK_Escape) { | 823 if (event->keyval == GDK_Escape) { |
833 if (convo_options & OPT_CONVO_ESC_CAN_CLOSE) { | 824 if (convo_options & OPT_CONVO_ESC_CAN_CLOSE) { |
834 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 825 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
835 close_callback(c->close, c); | 826 close_callback(c->close, c); |
836 c = NULL; | 827 c = NULL; |
845 gtk_imhtml_page_down(GTK_IMHTML(c->text)); | 836 gtk_imhtml_page_down(GTK_IMHTML(c->text)); |
846 } else if ((event->keyval == GDK_F2) && (convo_options & OPT_CONVO_F2_TOGGLES)) { | 837 } else if ((event->keyval == GDK_F2) && (convo_options & OPT_CONVO_F2_TOGGLES)) { |
847 gtk_imhtml_show_comments(GTK_IMHTML(c->text), !GTK_IMHTML(c->text)->comments); | 838 gtk_imhtml_show_comments(GTK_IMHTML(c->text), !GTK_IMHTML(c->text)->comments); |
848 } else if ((event->keyval == GDK_Return) || (event->keyval == GDK_KP_Enter)) { | 839 } else if ((event->keyval == GDK_Return) || (event->keyval == GDK_KP_Enter)) { |
849 if ((event->state & GDK_CONTROL_MASK) && (convo_options & OPT_CONVO_CTL_ENTER)) { | 840 if ((event->state & GDK_CONTROL_MASK) && (convo_options & OPT_CONVO_CTL_ENTER)) { |
850 gtk_signal_emit_by_name(GTK_OBJECT(entry), "activate", c); | 841 send_callback(NULL, c); |
851 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 842 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
852 return TRUE; | 843 return TRUE; |
853 } else if (!(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && (convo_options & OPT_CONVO_ENTER_SENDS)) { | 844 } else if (!(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && (convo_options & OPT_CONVO_ENTER_SENDS)) { |
854 gtk_signal_emit_by_name(GTK_OBJECT(entry), "activate", c); | 845 send_callback(NULL, c); |
855 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 846 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
856 return TRUE; | 847 return TRUE; |
857 } else { | 848 } else { |
858 int oldpos; | 849 return FALSE; |
859 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | |
860 oldpos = pos = gtk_editable_get_position(GTK_EDITABLE(entry)); | |
861 gtk_editable_insert_text(GTK_EDITABLE(entry), "\n", 1, &pos); | |
862 if (oldpos == pos) | |
863 gtk_editable_set_position(GTK_EDITABLE(entry), pos + 1); | |
864 return TRUE; | |
865 } | 850 } |
866 } else if ((event->state & GDK_CONTROL_MASK) && (event->keyval == 'm')) { | 851 } else if ((event->state & GDK_CONTROL_MASK) && (event->keyval == 'm')) { |
867 int oldpos; | |
868 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 852 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
869 oldpos = pos = gtk_editable_get_position(GTK_EDITABLE(entry)); | 853 gtk_text_buffer_insert_at_cursor(c->entry_buffer, "\n", 1); |
870 gtk_editable_insert_text(GTK_EDITABLE(entry), "\n", 1, &pos); | |
871 if (oldpos == pos) | |
872 gtk_editable_set_position(GTK_EDITABLE(entry), pos + 1); | |
873 } else if (event->state & GDK_CONTROL_MASK) { | 854 } else if (event->state & GDK_CONTROL_MASK) { |
874 int pos = 0; | |
875 switch (event->keyval) { | 855 switch (event->keyval) { |
876 case GDK_Up: | 856 case GDK_Up: |
877 if (!c->send_history) | 857 if (!c->send_history) |
878 break; | 858 break; |
879 if (!c->send_history->prev) { | 859 if (!c->send_history->prev) { |
860 GtkTextIter start, end; | |
880 if (c->send_history->data) | 861 if (c->send_history->data) |
881 g_free(c->send_history->data); | 862 g_free(c->send_history->data); |
882 c->send_history->data = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | 863 gtk_text_buffer_get_start_iter(c->entry_buffer, &start); |
864 gtk_text_buffer_get_end_iter(c->entry_buffer, &end); | |
865 c->send_history->data = gtk_text_buffer_get_text(c->entry_buffer, | |
866 &start, &end, FALSE); | |
883 } | 867 } |
884 if (c->send_history->next && c->send_history->next->data) { | 868 if (c->send_history->next && c->send_history->next->data) { |
885 c->send_history = c->send_history->next; | 869 c->send_history = c->send_history->next; |
886 gtk_editable_delete_text (GTK_EDITABLE(entry),0,-1); | 870 gtk_text_buffer_set_text(c->entry_buffer, c->send_history->data, -1); |
887 gtk_editable_insert_text(GTK_EDITABLE(entry), | |
888 c->send_history->data, | |
889 strlen(c->send_history->data), | |
890 &pos); | |
891 } | 871 } |
892 | 872 |
893 break; | 873 break; |
894 case GDK_Down: | 874 case GDK_Down: |
895 if (!c->send_history) | 875 if (!c->send_history) |
896 break; | 876 break; |
897 if (c->send_history->prev) { | 877 if (c->send_history->prev) { |
898 c->send_history = c->send_history->prev; | 878 c->send_history = c->send_history->prev; |
899 if (c->send_history->data) { | 879 if (c->send_history->data) { |
900 gtk_editable_delete_text (GTK_EDITABLE(entry),0,-1); | 880 gtk_text_buffer_set_text(c->entry_buffer, c->send_history->data, -1); |
901 gtk_editable_insert_text (GTK_EDITABLE(entry), c->send_history->data, | |
902 strlen(c->send_history->data), &pos); | |
903 | |
904 } | 881 } |
905 } | 882 } |
906 break; | 883 break; |
907 } | 884 } |
908 if (convo_options & OPT_CONVO_CTL_CHARS) { | 885 if (convo_options & OPT_CONVO_CTL_CHARS) { |
909 switch (event->keyval) { | 886 switch (event->keyval) { |
910 case 'i': | 887 case 'i': |
911 case 'I': | 888 case 'I': |
912 quiet_set(c->italic, | 889 quiet_set(c->italic, |
913 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(c->italic))); | 890 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(c->italic))); |
914 do_italic(c->italic, c->entry); | 891 do_italic(c->italic, c); |
915 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 892 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
916 break; | 893 break; |
917 case 'u': /* ctl-u is GDK_Clear, which clears the line */ | 894 case 'u': /* ctl-u is GDK_Clear, which clears the line */ |
918 case 'U': | 895 case 'U': |
919 quiet_set(c->underline, | 896 quiet_set(c->underline, |
920 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON | 897 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON |
921 (c->underline))); | 898 (c->underline))); |
922 do_underline(c->underline, c->entry); | 899 do_underline(c->underline, c); |
923 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 900 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
924 break; | 901 break; |
925 case 'b': /* ctl-b is GDK_Left, which moves backwards */ | 902 case 'b': /* ctl-b is GDK_Left, which moves backwards */ |
926 case 'B': | 903 case 'B': |
927 quiet_set(c->bold, | 904 quiet_set(c->bold, |
928 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(c->bold))); | 905 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(c->bold))); |
929 do_bold(c->bold, c->entry); | 906 do_bold(c->bold, c); |
930 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 907 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
931 break; | 908 break; |
932 case '-': | 909 case '-': |
933 do_small(NULL, c->entry); | 910 do_small(NULL, c); |
934 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 911 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
935 break; | 912 break; |
936 case '=': | 913 case '=': |
937 case '+': | 914 case '+': |
938 do_big(NULL, c->entry); | 915 do_big(NULL, c); |
939 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 916 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
940 break; | 917 break; |
941 case '0': | 918 case '0': |
942 do_normal(NULL, c->entry); | 919 do_normal(NULL, c); |
943 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 920 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
944 break; | 921 break; |
945 case 'f': | 922 case 'f': |
946 case 'F': | 923 case 'F': |
947 quiet_set(c->font, | 924 quiet_set(c->font, |
1003 case '*': | 980 case '*': |
1004 sprintf(buf, ":-D"); | 981 sprintf(buf, ":-D"); |
1005 break; | 982 break; |
1006 } | 983 } |
1007 if (buf[0]) { | 984 if (buf[0]) { |
1008 if (GTK_OLD_EDITABLE(c->entry)->has_selection) { | 985 gtk_text_buffer_insert_at_cursor(c->entry_buffer, buf, -1); |
1009 int finish = GTK_OLD_EDITABLE(c->entry)->selection_end_pos; | |
1010 gtk_editable_insert_text(GTK_EDITABLE(c->entry), | |
1011 buf, strlen(buf), &finish); | |
1012 } else { | |
1013 pos = GTK_OLD_EDITABLE(c->entry)->current_pos; | |
1014 gtk_editable_insert_text(GTK_EDITABLE(c->entry), | |
1015 buf, strlen(buf), &pos); | |
1016 } | |
1017 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); | 986 gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); |
1018 } | 987 } |
1019 } | 988 } |
1020 if (event->keyval == 'l') { | 989 if (event->keyval == 'l') { |
1021 gtk_imhtml_clear(GTK_IMHTML(c->text)); | 990 gtk_imhtml_clear(GTK_IMHTML(c->text)); |
1068 } | 1037 } |
1069 | 1038 |
1070 return FALSE; | 1039 return FALSE; |
1071 } | 1040 } |
1072 | 1041 |
1042 /* This guy just kills a single right click from being propagated any | |
1043 * further. I have no idea *why* we need this, but we do ... It | |
1044 * prevents right clicks on the GtkTextView in a convo dialog from | |
1045 * going all the way down to the notebook. I suspect a bug in | |
1046 * GtkTextView, but I'm not ready to point any fingers yet. */ | |
1047 gboolean stop_rclick_callback(GtkWidget *widget, GdkEventButton *event, gpointer data) | |
1048 { | |
1049 if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { | |
1050 /* right single click */ | |
1051 g_signal_stop_emission_by_name(G_OBJECT(widget), "button_press_event"); | |
1052 return TRUE; | |
1053 } | |
1054 } | |
1055 | |
1073 static void got_typing_keypress(struct conversation *c, gboolean first) { | 1056 static void got_typing_keypress(struct conversation *c, gboolean first) { |
1074 /* we know we got something, so we at least have to make sure we don't send | 1057 /* we know we got something, so we at least have to make sure we don't send |
1075 * TYPED any time soon */ | 1058 * TYPED any time soon */ |
1076 if(c->type_again_timeout) | 1059 if(c->type_again_timeout) |
1077 gtk_timeout_remove(c->type_again_timeout); | 1060 gtk_timeout_remove(c->type_again_timeout); |
1086 else | 1069 else |
1087 c->type_again = 0; | 1070 c->type_again = 0; |
1088 } | 1071 } |
1089 } | 1072 } |
1090 | 1073 |
1091 void delete_text_callback(GtkEditable *editable, gint start_pos, gint end_pos, gpointer user_data) { | 1074 void delete_text_callback(GtkTextBuffer *textbuffer, GtkTextIter *start_pos, GtkTextIter *end_pos, gpointer user_data) { |
1092 struct conversation *c = user_data; | 1075 struct conversation *c = user_data; |
1093 gchar *contents; | |
1094 | 1076 |
1095 if(!c) | 1077 if(!c) |
1096 return; | 1078 return; |
1097 | 1079 |
1098 if (misc_options & OPT_MISC_STEALTH_TYPING) | 1080 if (misc_options & OPT_MISC_STEALTH_TYPING) |
1099 return; | 1081 return; |
1100 | 1082 |
1101 contents = gtk_editable_get_chars(editable, 0, -1); | 1083 if(gtk_text_iter_is_start(start_pos) && gtk_text_iter_is_end(end_pos)) { |
1102 if(start_pos == 0 && (end_pos == strlen(contents) || end_pos == -1)) { | |
1103 if(c->type_again_timeout) | 1084 if(c->type_again_timeout) |
1104 gtk_timeout_remove(c->type_again_timeout); | 1085 gtk_timeout_remove(c->type_again_timeout); |
1105 serv_send_typing(c->gc, c->name, NOT_TYPING); | 1086 serv_send_typing(c->gc, c->name, NOT_TYPING); |
1106 } else { | 1087 } else { |
1107 /* we're deleting, but not all of it, so it counts as typing */ | 1088 /* we're deleting, but not all of it, so it counts as typing */ |
1108 got_typing_keypress(c, FALSE); | 1089 got_typing_keypress(c, FALSE); |
1109 } | 1090 } |
1110 g_free(contents); | 1091 } |
1111 } | 1092 |
1112 | 1093 void insert_text_callback(GtkTextBuffer *textbuffer, GtkTextIter *position, gchar *new_text, gint new_text_length, gpointer user_data) { |
1113 void insert_text_callback(GtkEditable *editable, gchar *new_text, gint new_text_length, gint *position, gpointer user_data) { | |
1114 struct conversation *c = user_data; | 1094 struct conversation *c = user_data; |
1115 gchar *contents; | |
1116 | 1095 |
1117 if(!c) | 1096 if(!c) |
1118 return; | 1097 return; |
1119 | 1098 |
1120 if (misc_options & OPT_MISC_STEALTH_TYPING) | 1099 if (misc_options & OPT_MISC_STEALTH_TYPING) |
1121 return; | 1100 return; |
1122 | 1101 |
1123 contents = gtk_editable_get_chars(editable, 0, -1); | 1102 got_typing_keypress(c, (gtk_text_iter_is_start(position) && gtk_text_iter_is_end(position))); |
1124 got_typing_keypress(c, (*position == 0 && strlen(contents) == 0)); | |
1125 g_free(contents); | |
1126 } | 1103 } |
1127 | 1104 |
1128 void send_callback(GtkWidget *widget, struct conversation *c) | 1105 void send_callback(GtkWidget *widget, struct conversation *c) |
1129 { | 1106 { |
1130 char *buf, *buf2; | 1107 char *buf, *buf2; |
1131 int limit; | 1108 int limit; |
1132 gulong length=0; | 1109 gulong length=0; |
1133 int err = 0; | 1110 int err = 0; |
1134 GList *first; | 1111 GList *first; |
1112 GtkTextIter start_iter, end_iter; | |
1135 | 1113 |
1136 if (!c->gc) | 1114 if (!c->gc) |
1137 return; | 1115 return; |
1138 | 1116 |
1139 | 1117 gtk_text_buffer_get_start_iter(c->entry_buffer, &start_iter); |
1140 buf2 = gtk_editable_get_chars(GTK_EDITABLE(c->entry), 0, -1); | 1118 gtk_text_buffer_get_end_iter(c->entry_buffer, &end_iter); |
1119 buf2 = gtk_text_buffer_get_text(c->entry_buffer, &start_iter, &end_iter, FALSE); | |
1141 limit = 32 * 1024; /* you shouldn't be sending more than 32k in your messages. that's a book. */ | 1120 limit = 32 * 1024; /* you shouldn't be sending more than 32k in your messages. that's a book. */ |
1142 buf = g_malloc(limit); | 1121 buf = g_malloc(limit); |
1143 g_snprintf(buf, limit, "%s", buf2); | 1122 g_snprintf(buf, limit, "%s", buf2); |
1144 g_free(buf2); | 1123 g_free(buf2); |
1145 if (!strlen(buf)) { | 1124 if (!strlen(buf)) { |
1221 g_free(buf2); | 1200 g_free(buf2); |
1222 g_free(buf); | 1201 g_free(buf); |
1223 return; | 1202 return; |
1224 } | 1203 } |
1225 if (plugin_return) { | 1204 if (plugin_return) { |
1226 gtk_editable_delete_text(GTK_EDITABLE(c->entry), 0, -1); | 1205 gtk_text_buffer_set_text(c->entry_buffer, "", -1); |
1227 g_free(buffy); | 1206 g_free(buffy); |
1228 g_free(buf2); | 1207 g_free(buf2); |
1229 g_free(buf); | 1208 g_free(buf); |
1230 return; | 1209 return; |
1231 } | 1210 } |
1360 else if (err == -ENOTCONN) | 1339 else if (err == -ENOTCONN) |
1361 debug_printf("Not yet connected\n"); | 1340 debug_printf("Not yet connected\n"); |
1362 else | 1341 else |
1363 do_error_dialog(_("Unable to send message"), NULL, GAIM_ERROR); | 1342 do_error_dialog(_("Unable to send message"), NULL, GAIM_ERROR); |
1364 } else { | 1343 } else { |
1365 gtk_editable_delete_text(GTK_EDITABLE(c->entry), 0, -1); | 1344 gtk_text_buffer_set_text(c->entry_buffer, "", -1); |
1366 | 1345 |
1367 if ((err > 0) && (away_options & OPT_AWAY_BACK_ON_IM)) { | 1346 if ((err > 0) && (away_options & OPT_AWAY_BACK_ON_IM)) { |
1368 if (awaymessage != NULL) { | 1347 if (awaymessage != NULL) { |
1369 do_im_back(); | 1348 do_im_back(); |
1370 } else if (c->gc->away) { | 1349 } else if (c->gc->away) { |
1372 } | 1351 } |
1373 } | 1352 } |
1374 } | 1353 } |
1375 } | 1354 } |
1376 | 1355 |
1377 int entry_key_pressed(GtkWidget *w, GtkWidget *entry) | 1356 gboolean entry_key_pressed(GtkTextBuffer *buffer) |
1378 { | 1357 { |
1379 check_everything(w); | 1358 check_everything(buffer); |
1380 return FALSE; | 1359 return FALSE; |
1381 } | 1360 } |
1382 | 1361 |
1383 /*------------------------------------------------------------------------*/ | 1362 /*------------------------------------------------------------------------*/ |
1384 /* HTML-type stuff */ | 1363 /* HTML-type stuff */ |
1385 /*------------------------------------------------------------------------*/ | 1364 /*------------------------------------------------------------------------*/ |
1386 | 1365 |
1387 int count_tag(GtkWidget *entry, char *s1, char *s2) | 1366 int count_tag(GtkTextBuffer *buffer, char *s1, char *s2) |
1388 { | 1367 { |
1389 char *p1, *p2; | 1368 char *p1, *p2; |
1390 int res = 0; | 1369 int res = 0; |
1391 char *tmp, *tmpo, h; | 1370 GtkTextIter start, end; |
1392 tmpo = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | 1371 char *tmp, *tmpo; |
1393 h = tmpo[GTK_OLD_EDITABLE(entry)->current_pos]; | 1372 |
1394 tmpo[GTK_OLD_EDITABLE(entry)->current_pos] = '\0'; | 1373 gtk_text_buffer_get_start_iter(buffer, &start); |
1395 tmp = tmpo; | 1374 gtk_text_buffer_get_iter_at_mark(buffer, &end, |
1375 gtk_text_buffer_get_insert(buffer)); | |
1376 | |
1377 tmp = tmpo = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); | |
1396 do { | 1378 do { |
1397 p1 = strstr(tmp, s1); | 1379 p1 = strstr(tmp, s1); |
1398 p2 = strstr(tmp, s2); | 1380 p2 = strstr(tmp, s2); |
1399 if (p1 && p2) { | 1381 if (p1 && p2) { |
1400 if (p1 < p2) { | 1382 if (p1 < p2) { |
1412 res = 0; | 1394 res = 0; |
1413 tmp = p2 + strlen(s2); | 1395 tmp = p2 + strlen(s2); |
1414 } | 1396 } |
1415 } | 1397 } |
1416 } while (p1 || p2); | 1398 } while (p1 || p2); |
1417 tmpo[GTK_OLD_EDITABLE(entry)->current_pos] = h; | |
1418 g_free(tmpo); | 1399 g_free(tmpo); |
1419 return res; | 1400 return res; |
1420 } | 1401 } |
1421 | 1402 |
1422 | 1403 |
1423 int invert_tags(GtkWidget *entry, char *s1, char *s2, int really) | 1404 gboolean invert_tags(GtkTextBuffer *buffer, char *s1, char *s2, gboolean really) |
1424 { | 1405 { |
1425 int start = GTK_OLD_EDITABLE(entry)->selection_start_pos; | 1406 GtkTextIter start1, start2, end1, end2; |
1426 int finish = GTK_OLD_EDITABLE(entry)->selection_end_pos; | 1407 char *b1, *b2; |
1427 char *s; | 1408 |
1428 | 1409 if (gtk_text_buffer_get_selection_bounds(buffer, &start1, &end2)) { |
1429 s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | 1410 start2 = start1; end1 = end2; |
1430 if (!g_strncasecmp(&s[start], s1, strlen(s1)) && | 1411 if (!gtk_text_iter_forward_chars(&start2, strlen(s1))) |
1431 !g_strncasecmp(&s[finish - strlen(s2)], s2, strlen(s2))) { | 1412 return FALSE; |
1432 if (really) { | 1413 if (!gtk_text_iter_backward_chars(&end1, strlen(s2))) |
1433 gtk_editable_delete_text(GTK_EDITABLE(entry), start, start + strlen(s1)); | 1414 return FALSE; |
1434 gtk_editable_delete_text(GTK_EDITABLE(entry), finish - strlen(s2) - strlen(s1), | 1415 b1 = gtk_text_buffer_get_text(buffer, &start1, &start2, FALSE); |
1435 finish - strlen(s1)); | 1416 b2 = gtk_text_buffer_get_text(buffer, &end1, &end2, FALSE); |
1436 } | 1417 if (!g_strncasecmp(b1, s1, strlen(s1)) && |
1437 g_free(s); | 1418 !g_strncasecmp(b2, s2, strlen(s2))) { |
1438 return 1; | 1419 if (really) { |
1439 } | 1420 GtkTextMark *m_end1, *m_end2; |
1440 g_free(s); | 1421 |
1441 return 0; | 1422 m_end1= gtk_text_buffer_create_mark(buffer, "m1", &end1, TRUE); |
1442 } | 1423 m_end2= gtk_text_buffer_create_mark(buffer, "m2", &end2, TRUE); |
1443 | 1424 |
1444 | 1425 gtk_text_buffer_delete(buffer, &start1, &start2); |
1445 void remove_tags(GtkWidget *entry, char *tag) | 1426 gtk_text_buffer_get_iter_at_mark(buffer, &end1, m_end1); |
1446 { | 1427 gtk_text_buffer_get_iter_at_mark(buffer, &end2, m_end2); |
1447 char *s, *t; | 1428 gtk_text_buffer_delete(buffer, &end1, &end2); |
1448 int start = GTK_OLD_EDITABLE(entry)->selection_start_pos; | 1429 gtk_text_buffer_delete_mark(buffer, m_end1); |
1449 int finish = GTK_OLD_EDITABLE(entry)->selection_end_pos; | 1430 gtk_text_buffer_delete_mark(buffer, m_end2); |
1450 int temp; | 1431 } |
1451 s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | 1432 g_free(b1); g_free(b2); |
1452 t = s; | 1433 return TRUE; |
1453 | 1434 } |
1454 if (start > finish) { | 1435 g_free(b1);g_free(b2); |
1455 temp = start; | 1436 } |
1456 start = finish; | 1437 return FALSE; |
1457 finish = temp; | 1438 } |
1458 } | 1439 |
1459 | 1440 |
1460 if (strstr(tag, "<FONT SIZE=")) { | 1441 void remove_tags(struct conversation *c, char *tag) |
1442 { | |
1443 GtkTextIter start, end, m_start, m_end; | |
1444 | |
1445 if (!gtk_text_buffer_get_selection_bounds(c->entry_buffer, | |
1446 &start, &end)) | |
1447 return; | |
1448 | |
1449 /* FIXMEif (strstr(tag, "<FONT SIZE=")) { | |
1461 while ((t = strstr(t, "<FONT SIZE="))) { | 1450 while ((t = strstr(t, "<FONT SIZE="))) { |
1462 if (((t - s) < finish) && ((t - s) >= start)) { | 1451 if (((t - s) < finish) && ((t - s) >= start)) { |
1463 gtk_editable_delete_text(GTK_EDITABLE(entry), (t - s), | 1452 gtk_editable_delete_text(GTK_EDITABLE(entry), (t - s), |
1464 (t - s) + strlen(tag)); | 1453 (t - s) + strlen(tag)); |
1465 g_free(s); | 1454 g_free(s); |
1466 s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | 1455 s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); |
1467 t = s; | 1456 t = s; |
1468 } else | 1457 } else |
1469 t++; | 1458 t++; |
1470 } | 1459 } |
1471 } else { | 1460 } else*/ { |
1472 while ((t = strstr(t, tag))) { | 1461 while (gtk_text_iter_forward_search(&start, tag, 0, &m_start, &m_end, &end)) { |
1473 if (((t - s) < finish) && ((t - s) >= start)) { | 1462 gtk_text_buffer_delete(c->entry_buffer, &m_start, &m_end); |
1474 gtk_editable_delete_text(GTK_EDITABLE(entry), (t - s), | 1463 gtk_text_buffer_get_selection_bounds(c->entry_buffer, &start, &end); |
1475 (t - s) + strlen(tag)); | 1464 } |
1476 g_free(s); | 1465 } |
1477 s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | |
1478 t = s; | |
1479 } else | |
1480 t++; | |
1481 } | |
1482 } | |
1483 g_free(s); | |
1484 } | 1466 } |
1485 | 1467 |
1486 static char *html_logize(char *p) | 1468 static char *html_logize(char *p) |
1487 { | 1469 { |
1488 | 1470 |
1522 *buffer_p = '\0'; | 1504 *buffer_p = '\0'; |
1523 | 1505 |
1524 return buffer_start; | 1506 return buffer_start; |
1525 } | 1507 } |
1526 | 1508 |
1527 void surround(GtkWidget *entry, char *pre, char *post) | 1509 void surround(struct conversation *c, char *pre, char *post) |
1528 { | 1510 { |
1529 int temp, pos = GTK_OLD_EDITABLE(entry)->current_pos; | 1511 GtkTextIter start, end; |
1530 int dummy; | 1512 GtkTextMark *mark_start, *mark_end; |
1531 int start, finish; | 1513 |
1532 | 1514 /* if (convo_options & OPT_CONVO_CHECK_SPELLING) { |
1533 if (convo_options & OPT_CONVO_CHECK_SPELLING) { | |
1534 gtkspell_detach(GTK_TEXT(entry)); | 1515 gtkspell_detach(GTK_TEXT(entry)); |
1535 } | 1516 }*/ |
1536 | 1517 |
1537 if (GTK_OLD_EDITABLE(entry)->has_selection) { | 1518 if (gtk_text_buffer_get_selection_bounds(c->entry_buffer, &start, &end)) { |
1538 remove_tags(entry, pre); | 1519 remove_tags(c, pre); |
1539 remove_tags(entry, post); | 1520 remove_tags(c, post); |
1540 start = GTK_OLD_EDITABLE(entry)->selection_start_pos; | 1521 |
1541 finish = GTK_OLD_EDITABLE(entry)->selection_end_pos; | 1522 mark_start = gtk_text_buffer_create_mark(c->entry_buffer, "m1", &start, TRUE); |
1542 if (start > finish) { | 1523 mark_end = gtk_text_buffer_create_mark(c->entry_buffer, "m2", &end, FALSE); |
1543 dummy = finish; | 1524 gtk_text_buffer_insert(c->entry_buffer, &start, pre, -1); |
1544 finish = start; | 1525 gtk_text_buffer_get_selection_bounds(c->entry_buffer, &start, &end); |
1545 start = dummy; | 1526 gtk_text_buffer_insert(c->entry_buffer, &end, post, -1); |
1546 } | 1527 gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &start, mark_start); |
1547 dummy = start; | 1528 gtk_text_buffer_move_mark_by_name(c->entry_buffer, "selection_bound", &start); |
1548 gtk_editable_insert_text(GTK_EDITABLE(entry), pre, strlen(pre), &dummy); | |
1549 dummy = finish + strlen(pre); | |
1550 gtk_editable_insert_text(GTK_EDITABLE(entry), post, strlen(post), &dummy); | |
1551 gtk_editable_select_region(GTK_EDITABLE(entry), start, | |
1552 finish + strlen(pre) + strlen(post)); | |
1553 } else { | 1529 } else { |
1554 temp = pos; | 1530 gtk_text_buffer_insert(c->entry_buffer, &start, pre, -1); |
1555 gtk_editable_insert_text(GTK_EDITABLE(entry), pre, strlen(pre), &pos); | 1531 gtk_text_buffer_insert(c->entry_buffer, &start, post, -1); |
1556 if (temp == pos) { | 1532 mark_start = gtk_text_buffer_get_insert(c->entry_buffer); |
1557 dummy = pos + strlen(pre); | 1533 gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &start, mark_start); |
1558 gtk_editable_insert_text(GTK_EDITABLE(entry), post, strlen(post), &dummy); | 1534 gtk_text_iter_backward_chars(&start, strlen(post)); |
1559 gtk_editable_set_position(GTK_EDITABLE(entry), dummy); | 1535 gtk_text_buffer_place_cursor(c->entry_buffer, &start); |
1560 } else { | 1536 } |
1561 dummy = pos; | 1537 |
1562 gtk_editable_insert_text(GTK_EDITABLE(entry), post, strlen(post), &dummy); | 1538 /* if (convo_options & OPT_CONVO_CHECK_SPELLING) { |
1563 gtk_editable_set_position(GTK_EDITABLE(entry), pos); | |
1564 } | |
1565 } | |
1566 | |
1567 if (convo_options & OPT_CONVO_CHECK_SPELLING) { | |
1568 gtkspell_attach(GTK_TEXT(entry)); | 1539 gtkspell_attach(GTK_TEXT(entry)); |
1569 } | 1540 }*/ |
1570 | 1541 |
1571 gtk_widget_grab_focus(entry); | 1542 gtk_widget_grab_focus(c->entry); |
1572 } | 1543 } |
1573 | 1544 |
1574 void advance_past(GtkWidget *entry, char *pre, char *post) | 1545 void advance_past(struct conversation *c, char *pre, char *post) |
1575 { | 1546 { |
1576 char *s, *s2; | 1547 GtkTextIter current_pos, start, end; |
1577 int pos; | 1548 |
1578 if (invert_tags(entry, pre, post, 1)) | 1549 if (invert_tags(c->entry_buffer, pre, post, 1)) |
1579 return; | 1550 return; |
1580 s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | 1551 |
1581 pos = GTK_OLD_EDITABLE(entry)->current_pos; | 1552 gtk_text_buffer_get_iter_at_mark(c->entry_buffer, ¤t_pos, |
1582 debug_printf(_("Currently at %d, "), pos); | 1553 gtk_text_buffer_get_insert(c->entry_buffer)); |
1583 s2 = strstr(&s[pos], post); | 1554 if (gtk_text_iter_forward_search(¤t_pos, post, 0, &start, &end, NULL)) |
1584 if (s2) { | 1555 gtk_text_buffer_place_cursor(c->entry_buffer, &end); |
1585 pos = s2 - s + strlen(post); | 1556 else |
1586 } else { | 1557 gtk_text_buffer_insert_at_cursor(c->entry_buffer, post, -1); |
1587 gtk_editable_insert_text(GTK_EDITABLE(entry), post, strlen(post), &pos); | 1558 |
1588 } | 1559 gtk_widget_grab_focus(c->entry); |
1589 g_free(s); | |
1590 debug_printf(_("Setting position to %d\n"), pos); | |
1591 gtk_editable_set_position(GTK_EDITABLE(entry), pos); | |
1592 gtk_widget_grab_focus(entry); | |
1593 } | 1560 } |
1594 | 1561 |
1595 void toggle_fg_color(GtkWidget *color, struct conversation *c) | 1562 void toggle_fg_color(GtkWidget *color, struct conversation *c) |
1596 { | 1563 { |
1597 if (state_lock) | 1564 if (state_lock) |
1599 if (GTK_TOGGLE_BUTTON(color)->active) | 1566 if (GTK_TOGGLE_BUTTON(color)->active) |
1600 show_fgcolor_dialog(c, color); | 1567 show_fgcolor_dialog(c, color); |
1601 else if (c->fg_color_dialog) | 1568 else if (c->fg_color_dialog) |
1602 cancel_fgcolor(color, c); | 1569 cancel_fgcolor(color, c); |
1603 else | 1570 else |
1604 advance_past(c->entry, "<FONT COLOR>", "</FONT>"); | 1571 advance_past(c, "<FONT COLOR>", "</FONT>"); |
1605 } | 1572 } |
1606 | 1573 |
1607 void toggle_bg_color(GtkWidget *color, struct conversation *c) | 1574 void toggle_bg_color(GtkWidget *color, struct conversation *c) |
1608 { | 1575 { |
1609 if (state_lock) | 1576 if (state_lock) |
1611 if (GTK_TOGGLE_BUTTON(color)->active) | 1578 if (GTK_TOGGLE_BUTTON(color)->active) |
1612 show_bgcolor_dialog(c, color); | 1579 show_bgcolor_dialog(c, color); |
1613 else if (c->bg_color_dialog) | 1580 else if (c->bg_color_dialog) |
1614 cancel_bgcolor(color, c); | 1581 cancel_bgcolor(color, c); |
1615 else | 1582 else |
1616 advance_past(c->entry, "<BODY BGCOLOR>", "</BODY>"); | 1583 advance_past(c, "<BODY BGCOLOR>", "</BODY>"); |
1617 } | 1584 } |
1618 | 1585 |
1619 void toggle_font(GtkWidget *font, struct conversation *c) | 1586 void toggle_font(GtkWidget *font, struct conversation *c) |
1620 { | 1587 { |
1621 if (state_lock) | 1588 if (state_lock) |
1623 if (GTK_TOGGLE_BUTTON(font)->active) | 1590 if (GTK_TOGGLE_BUTTON(font)->active) |
1624 show_font_dialog(c, font); | 1591 show_font_dialog(c, font); |
1625 else if (c->font_dialog) | 1592 else if (c->font_dialog) |
1626 cancel_font(font, c); | 1593 cancel_font(font, c); |
1627 else | 1594 else |
1628 advance_past(c->entry, "<FONT FACE>", "</FONT>"); | 1595 advance_past(c, "<FONT FACE>", "</FONT>"); |
1629 } | 1596 } |
1630 | 1597 |
1631 void insert_link_cb(GtkWidget *w, struct conversation *c) | 1598 void insert_link_cb(GtkWidget *w, struct conversation *c) |
1632 { | 1599 { |
1633 show_add_link(c->link, c); | 1600 show_add_link(c->link, c); |
1642 show_add_link(c->link, c); | 1609 show_add_link(c->link, c); |
1643 | 1610 |
1644 else if (c->link_dialog) | 1611 else if (c->link_dialog) |
1645 cancel_link(c->link, c); | 1612 cancel_link(c->link, c); |
1646 else | 1613 else |
1647 advance_past(c->entry, "<A HREF>", "</A>"); | 1614 advance_past(c, "<A HREF>", "</A>"); |
1648 | 1615 |
1649 gtk_widget_grab_focus(c->entry); | 1616 gtk_widget_grab_focus(c->entry); |
1650 } | 1617 } |
1651 | 1618 |
1652 void do_strike(GtkWidget *strike, GtkWidget *entry) | 1619 void do_strike(GtkWidget *strike, struct conversation *c) |
1653 { | 1620 { |
1654 if (state_lock) | 1621 if (state_lock) |
1655 return; | 1622 return; |
1656 | 1623 |
1657 if (GTK_TOGGLE_BUTTON(strike)->active) | 1624 if (GTK_TOGGLE_BUTTON(strike)->active) |
1658 surround(entry, "<STRIKE>", "</STRIKE>"); | 1625 surround(c, "<STRIKE>", "</STRIKE>"); |
1659 else | 1626 else |
1660 advance_past(entry, "<STRIKE>", "</STRIKE>"); | 1627 advance_past(c, "<STRIKE>", "</STRIKE>"); |
1661 | 1628 |
1662 } | 1629 gtk_widget_grab_focus(c->entry); |
1663 | 1630 } |
1664 void do_bold(GtkWidget *bold, GtkWidget *entry) | 1631 |
1632 void do_bold(GtkWidget *bold, struct conversation *c) | |
1665 { | 1633 { |
1666 if (state_lock) | 1634 if (state_lock) |
1667 return; | 1635 return; |
1668 if (GTK_TOGGLE_BUTTON(bold)->active) | 1636 if (GTK_TOGGLE_BUTTON(bold)->active) |
1669 surround(entry, "<B>", "</B>"); | 1637 surround(c, "<B>", "</B>"); |
1670 else | 1638 else |
1671 advance_past(entry, "<B>", "</B>"); | 1639 advance_past(c, "<B>", "</B>"); |
1672 | 1640 |
1673 gtk_widget_grab_focus(entry); | 1641 gtk_widget_grab_focus(c->entry); |
1674 } | 1642 } |
1675 | 1643 |
1676 void do_underline(GtkWidget *underline, GtkWidget *entry) | 1644 void do_underline(GtkWidget *underline, struct conversation *c) |
1677 { | 1645 { |
1678 if (state_lock) | 1646 if (state_lock) |
1679 return; | 1647 return; |
1680 if (GTK_TOGGLE_BUTTON(underline)->active) | 1648 if (GTK_TOGGLE_BUTTON(underline)->active) |
1681 surround(entry, "<U>", "</U>"); | 1649 surround(c, "<U>", "</U>"); |
1682 else | 1650 else |
1683 advance_past(entry, "<U>", "</U>"); | 1651 advance_past(c, "<U>", "</U>"); |
1684 | 1652 |
1685 gtk_widget_grab_focus(entry); | 1653 gtk_widget_grab_focus(c->entry); |
1686 } | 1654 } |
1687 | 1655 |
1688 void do_italic(GtkWidget *italic, GtkWidget *entry) | 1656 void do_italic(GtkWidget *italic, struct conversation *c) |
1689 { | 1657 { |
1690 if (state_lock) | 1658 if (state_lock) |
1691 return; | 1659 return; |
1692 if (GTK_TOGGLE_BUTTON(italic)->active) | 1660 if (GTK_TOGGLE_BUTTON(italic)->active) |
1693 surround(entry, "<I>", "</I>"); | 1661 surround(c, "<I>", "</I>"); |
1694 else | 1662 else |
1695 advance_past(entry, "<I>", "</I>"); | 1663 advance_past(c, "<I>", "</I>"); |
1696 | 1664 |
1697 gtk_widget_grab_focus(entry); | 1665 gtk_widget_grab_focus(c->entry); |
1698 } | 1666 } |
1699 | 1667 |
1700 /* html code to modify font sizes must all be the same length, */ | 1668 /* html code to modify font sizes must all be the same length, */ |
1701 /* currently set to 15 chars */ | 1669 /* currently set to 15 chars */ |
1702 | 1670 |
1703 void do_small(GtkWidget *small, GtkWidget *entry) | 1671 void do_small(GtkWidget *small, struct conversation *c) |
1704 { | 1672 { |
1705 if (state_lock) | 1673 if (state_lock) |
1706 return; | 1674 return; |
1707 | 1675 |
1708 surround(entry, "<FONT SIZE=\"1\">", "</FONT>"); | 1676 surround(c, "<FONT SIZE=\"1\">", "</FONT>"); |
1709 | 1677 |
1710 gtk_widget_grab_focus(entry); | 1678 gtk_widget_grab_focus(c->entry); |
1711 } | 1679 } |
1712 | 1680 |
1713 void do_normal(GtkWidget *normal, GtkWidget *entry) | 1681 void do_normal(GtkWidget *normal, struct conversation *c) |
1714 { | 1682 { |
1715 if (state_lock) | 1683 if (state_lock) |
1716 return; | 1684 return; |
1717 | 1685 |
1718 surround(entry, "<FONT SIZE=\"3\">", "</FONT>"); | 1686 surround(c, "<FONT SIZE=\"3\">", "</FONT>"); |
1719 | 1687 |
1720 gtk_widget_grab_focus(entry); | 1688 gtk_widget_grab_focus(c->entry); |
1721 } | 1689 } |
1722 | 1690 |
1723 void do_big(GtkWidget *big, GtkWidget *entry) | 1691 void do_big(GtkWidget *big, struct conversation *c) |
1724 { | 1692 { |
1725 if (state_lock) | 1693 if (state_lock) |
1726 return; | 1694 return; |
1727 | 1695 |
1728 surround(entry, "<FONT SIZE=\"5\">", "</FONT>"); | 1696 surround(c, "<FONT SIZE=\"5\">", "</FONT>"); |
1729 | 1697 |
1730 gtk_widget_grab_focus(entry); | 1698 gtk_widget_grab_focus(c->entry); |
1731 } | 1699 } |
1732 | 1700 |
1733 void check_everything(GtkWidget *entry) | 1701 void check_everything(GtkTextBuffer *buffer) |
1734 { | 1702 { |
1735 struct conversation *c; | 1703 struct conversation *c; |
1736 | 1704 |
1737 c = (struct conversation *)gtk_object_get_user_data(GTK_OBJECT(entry)); | 1705 c = (struct conversation *)g_object_get_data(G_OBJECT(buffer), "user_data"); |
1738 if (!c) | 1706 if (!c) |
1739 return; | 1707 return; |
1740 if (invert_tags(entry, "<B>", "</B>", 0)) | 1708 if (invert_tags(c->entry_buffer, "<B>", "</B>", 0)) |
1741 quiet_set(c->bold, TRUE); | 1709 quiet_set(c->bold, TRUE); |
1742 else if (count_tag(entry, "<B>", "</B>")) | 1710 else if (count_tag(c->entry_buffer, "<B>", "</B>")) |
1743 quiet_set(c->bold, TRUE); | 1711 quiet_set(c->bold, TRUE); |
1744 else | 1712 else |
1745 quiet_set(c->bold, FALSE); | 1713 quiet_set(c->bold, FALSE); |
1746 if (invert_tags(entry, "<I>", "</I>", 0)) | 1714 if (invert_tags(c->entry_buffer, "<I>", "</I>", 0)) |
1747 quiet_set(c->italic, TRUE); | 1715 quiet_set(c->italic, TRUE); |
1748 else if (count_tag(entry, "<I>", "</I>")) | 1716 else if (count_tag(c->entry_buffer, "<I>", "</I>")) |
1749 quiet_set(c->italic, TRUE); | 1717 quiet_set(c->italic, TRUE); |
1750 else | 1718 else |
1751 quiet_set(c->italic, FALSE); | 1719 quiet_set(c->italic, FALSE); |
1752 | 1720 |
1753 if (invert_tags(entry, "<FONT COLOR", "</FONT>", 0)) | 1721 if (invert_tags(c->entry_buffer, "<FONT COLOR", "</FONT>", 0)) |
1754 quiet_set(c->fgcolorbtn, TRUE); | 1722 quiet_set(c->fgcolorbtn, TRUE); |
1755 else if (count_tag(entry, "<FONT COLOR", "</FONT>")) | 1723 else if (count_tag(c->entry_buffer, "<FONT COLOR", "</FONT>")) |
1756 quiet_set(c->fgcolorbtn, TRUE); | 1724 quiet_set(c->fgcolorbtn, TRUE); |
1757 else | 1725 else |
1758 quiet_set(c->fgcolorbtn, FALSE); | 1726 quiet_set(c->fgcolorbtn, FALSE); |
1759 | 1727 |
1760 if (invert_tags(entry, "<BODY BGCOLOR", "</BODY>", 0)) | 1728 if (invert_tags(c->entry_buffer, "<BODY BGCOLOR", "</BODY>", 0)) |
1761 quiet_set(c->bgcolorbtn, TRUE); | 1729 quiet_set(c->bgcolorbtn, TRUE); |
1762 else if (count_tag(entry, "<BODY BGCOLOR", "</BODY>")) | 1730 else if (count_tag(c->entry_buffer, "<BODY BGCOLOR", "</BODY>")) |
1763 quiet_set(c->bgcolorbtn, TRUE); | 1731 quiet_set(c->bgcolorbtn, TRUE); |
1764 else | 1732 else |
1765 quiet_set(c->bgcolorbtn, FALSE); | 1733 quiet_set(c->bgcolorbtn, FALSE); |
1766 | 1734 |
1767 if (invert_tags(entry, "<FONT FACE", "</FONT>", 0)) | 1735 if (invert_tags(c->entry_buffer, "<FONT FACE", "</FONT>", 0)) |
1768 quiet_set(c->font, TRUE); | 1736 quiet_set(c->font, TRUE); |
1769 else if (count_tag(entry, "<FONT FACE", "</FONT>")) | 1737 else if (count_tag(c->entry_buffer, "<FONT FACE", "</FONT>")) |
1770 quiet_set(c->font, TRUE); | 1738 quiet_set(c->font, TRUE); |
1771 else | 1739 else |
1772 quiet_set(c->font, FALSE); | 1740 quiet_set(c->font, FALSE); |
1773 | 1741 |
1774 if (invert_tags(entry, "<A HREF", "</A>", 0)) | 1742 if (invert_tags(c->entry_buffer, "<A HREF", "</A>", 0)) |
1775 quiet_set(c->link, TRUE); | 1743 quiet_set(c->link, TRUE); |
1776 else if (count_tag(entry, "<A HREF", "</A>")) | 1744 else if (count_tag(c->entry_buffer, "<A HREF", "</A>")) |
1777 quiet_set(c->link, TRUE); | 1745 quiet_set(c->link, TRUE); |
1778 else | 1746 else |
1779 quiet_set(c->link, FALSE); | 1747 quiet_set(c->link, FALSE); |
1780 | 1748 |
1781 if (invert_tags(entry, "<U>", "</U>", 0)) | 1749 if (invert_tags(c->entry_buffer, "<U>", "</U>", 0)) |
1782 quiet_set(c->underline, TRUE); | 1750 quiet_set(c->underline, TRUE); |
1783 else if (count_tag(entry, "<U>", "</U>")) | 1751 else if (count_tag(c->entry_buffer, "<U>", "</U>")) |
1784 quiet_set(c->underline, TRUE); | 1752 quiet_set(c->underline, TRUE); |
1785 else | 1753 else |
1786 quiet_set(c->underline, FALSE); | 1754 quiet_set(c->underline, FALSE); |
1787 } | 1755 } |
1788 | 1756 |
2247 | 2215 |
2248 /* Bold */ | 2216 /* Bold */ |
2249 button = gaim_pixbuf_toolbar_button_from_stock("gtk-bold"); | 2217 button = gaim_pixbuf_toolbar_button_from_stock("gtk-bold"); |
2250 gtk_size_group_add_widget(sg, button); | 2218 gtk_size_group_add_widget(sg, button); |
2251 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 2219 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
2252 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_bold), c->entry); | 2220 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_bold), c); |
2253 c->bold = button; /* We should remember this */ | 2221 c->bold = button; /* We should remember this */ |
2254 | 2222 |
2255 /* Italic */ | 2223 /* Italic */ |
2256 button = gaim_pixbuf_toolbar_button_from_stock("gtk-italic"); | 2224 button = gaim_pixbuf_toolbar_button_from_stock("gtk-italic"); |
2257 gtk_size_group_add_widget(sg, button); | 2225 gtk_size_group_add_widget(sg, button); |
2258 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 2226 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
2259 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_italic), c->entry); | 2227 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_italic), c); |
2260 c->italic = button; /* We should remember this */ | 2228 c->italic = button; /* We should remember this */ |
2261 | 2229 |
2262 /* Underline */ | 2230 /* Underline */ |
2263 button = gaim_pixbuf_toolbar_button_from_stock("gtk-underline"); | 2231 button = gaim_pixbuf_toolbar_button_from_stock("gtk-underline"); |
2264 gtk_size_group_add_widget(sg, button); | 2232 gtk_size_group_add_widget(sg, button); |
2265 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 2233 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
2266 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_underline), c->entry); | 2234 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_underline), c); |
2267 c->underline = button; /* We should remember this */ | 2235 c->underline = button; /* We should remember this */ |
2268 | 2236 |
2269 /* Sep */ | 2237 /* Sep */ |
2270 sep = gtk_vseparator_new(); | 2238 sep = gtk_vseparator_new(); |
2271 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | 2239 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); |
2272 | 2240 |
2273 /* Increase font size */ | 2241 /* Increase font size */ |
2274 button = gaim_pixbuf_toolbar_button_from_file("text_bigger.png"); | 2242 button = gaim_pixbuf_toolbar_button_from_file("text_bigger.png"); |
2275 gtk_size_group_add_widget(sg, button); | 2243 gtk_size_group_add_widget(sg, button); |
2276 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 2244 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
2277 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_big), c->entry); | 2245 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_big), c); |
2278 | 2246 |
2279 /* Normal Font Size */ | 2247 /* Normal Font Size */ |
2280 button = gaim_pixbuf_toolbar_button_from_file("text_normal.png"); | 2248 button = gaim_pixbuf_toolbar_button_from_file("text_normal.png"); |
2281 gtk_size_group_add_widget(sg, button); | 2249 gtk_size_group_add_widget(sg, button); |
2282 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 2250 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
2283 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_normal), c->entry); | 2251 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_normal), c); |
2284 c->font = button; /* We should remember this */ | 2252 c->font = button; /* We should remember this */ |
2285 | 2253 |
2286 /* Decrease font size */ | 2254 /* Decrease font size */ |
2287 button = gaim_pixbuf_toolbar_button_from_file("text_smaller.png"); | 2255 button = gaim_pixbuf_toolbar_button_from_file("text_smaller.png"); |
2288 gtk_size_group_add_widget(sg, button); | 2256 gtk_size_group_add_widget(sg, button); |
2289 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 2257 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
2290 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_small), c->entry); | 2258 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_small), c); |
2291 | 2259 |
2292 /* Sep */ | 2260 /* Sep */ |
2293 sep = gtk_vseparator_new(); | 2261 sep = gtk_vseparator_new(); |
2294 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | 2262 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); |
2295 | 2263 |
2751 GtkWidget *send; | 2719 GtkWidget *send; |
2752 GtkWidget *info; | 2720 GtkWidget *info; |
2753 GtkWidget *warn; | 2721 GtkWidget *warn; |
2754 GtkWidget *block; | 2722 GtkWidget *block; |
2755 /*GtkWidget *close;*/ | 2723 /*GtkWidget *close;*/ |
2724 GtkWidget *frame; | |
2756 GtkWidget *entry; | 2725 GtkWidget *entry; |
2757 GtkWidget *bbox; | 2726 GtkWidget *bbox; |
2758 GtkWidget *vbox; | 2727 GtkWidget *vbox; |
2759 GtkWidget *vbox2; | 2728 GtkWidget *vbox2; |
2760 GtkWidget *paned; | 2729 GtkWidget *paned; |
2902 | 2871 |
2903 c->lbox = gtk_hbox_new(FALSE, 0); | 2872 c->lbox = gtk_hbox_new(FALSE, 0); |
2904 gtk_box_pack_start(GTK_BOX(vbox2), c->lbox, FALSE, FALSE, 0); | 2873 gtk_box_pack_start(GTK_BOX(vbox2), c->lbox, FALSE, FALSE, 0); |
2905 gtk_widget_show(c->lbox); | 2874 gtk_widget_show(c->lbox); |
2906 | 2875 |
2907 entry = gtk_text_new(NULL, NULL); | 2876 toolbar = build_conv_toolbar(c); |
2877 gtk_box_pack_start(GTK_BOX(vbox2), toolbar, FALSE, FALSE, 0); | |
2878 | |
2879 frame = gtk_frame_new(NULL); | |
2880 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); | |
2881 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0); | |
2882 gtk_widget_show(frame); | |
2883 | |
2884 c->entry_buffer = gtk_text_buffer_new(NULL); | |
2885 g_object_set_data(G_OBJECT(c->entry_buffer), "user_data", c); | |
2886 entry = gtk_text_view_new_with_buffer(c->entry_buffer); | |
2908 c->entry = entry; | 2887 c->entry = entry; |
2909 if (!(im_options & OPT_IM_ONE_WINDOW)) | 2888 if (!(im_options & OPT_IM_ONE_WINDOW)) |
2910 gtk_window_set_focus(GTK_WINDOW(c->window), c->entry); | 2889 gtk_window_set_focus(GTK_WINDOW(c->window), c->entry); |
2911 | 2890 |
2912 toolbar = build_conv_toolbar(c); | 2891 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(c->entry), GTK_WRAP_WORD); |
2913 gtk_box_pack_start(GTK_BOX(vbox2), toolbar, FALSE, FALSE, 0); | |
2914 | |
2915 gtk_object_set_user_data(GTK_OBJECT(entry), c); | |
2916 gtk_text_set_editable(GTK_TEXT(entry), TRUE); | |
2917 gtk_text_set_word_wrap(GTK_TEXT(entry), TRUE); | |
2918 | 2892 |
2919 gtk_widget_set_usize(entry, conv_size.width - 20, MAX(conv_size.entry_height, 25)); | 2893 gtk_widget_set_usize(entry, conv_size.width - 20, MAX(conv_size.entry_height, 25)); |
2920 | 2894 |
2921 gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(send_callback), c); | 2895 g_signal_connect_swapped(G_OBJECT(c->entry), "key_press_event", |
2922 gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", GTK_SIGNAL_FUNC(keypress_callback), c); | 2896 G_CALLBACK(entry_key_pressed), c->entry_buffer); |
2923 gtk_signal_connect(GTK_OBJECT(entry), "insert-text", GTK_SIGNAL_FUNC(insert_text_callback), c); | 2897 g_signal_connect(G_OBJECT(c->entry), "key_press_event", G_CALLBACK(keypress_callback), c); |
2924 gtk_signal_connect(GTK_OBJECT(entry), "delete-text", GTK_SIGNAL_FUNC(delete_text_callback), c); | 2898 g_signal_connect_after(G_OBJECT(c->entry), "button_press_event", |
2925 gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", GTK_SIGNAL_FUNC(entry_key_pressed), | 2899 G_CALLBACK(stop_rclick_callback), NULL); |
2926 entry); | 2900 g_signal_connect(G_OBJECT(c->entry_buffer), "insert_text", |
2927 if (convo_options & OPT_CONVO_CHECK_SPELLING) | 2901 G_CALLBACK(insert_text_callback), c); |
2928 gtkspell_attach(GTK_TEXT(c->entry)); | 2902 g_signal_connect(G_OBJECT(c->entry_buffer), "delete_range", |
2929 gtk_box_pack_start(GTK_BOX(vbox2), entry, TRUE, TRUE, 0); | 2903 G_CALLBACK(delete_text_callback), c); |
2904 | |
2905 /* if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
2906 gtkspell_attach(GTK_TEXT(c->entry));*/ | |
2907 gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(entry)); | |
2930 gtk_widget_show(entry); | 2908 gtk_widget_show(entry); |
2931 | 2909 |
2932 c->bbox = bbox = gtk_hbox_new(FALSE, 5); | 2910 c->bbox = bbox = gtk_hbox_new(FALSE, 5); |
2933 gtk_box_pack_start(GTK_BOX(vbox2), bbox, FALSE, FALSE, 0); | 2911 gtk_box_pack_start(GTK_BOX(vbox2), bbox, FALSE, FALSE, 0); |
2934 gtk_widget_show(bbox); | 2912 gtk_widget_show(bbox); |
3043 } | 3021 } |
3044 } | 3022 } |
3045 | 3023 |
3046 while (cnv) { | 3024 while (cnv) { |
3047 c = (struct conversation *)cnv->data; | 3025 c = (struct conversation *)cnv->data; |
3048 if (convo_options & OPT_CONVO_CHECK_SPELLING) | 3026 /* if (convo_options & OPT_CONVO_CHECK_SPELLING) |
3049 gtkspell_attach(GTK_TEXT(c->entry)); | 3027 gtkspell_attach(GTK_TEXT(c->entry)); |
3050 else | 3028 else |
3051 gtkspell_detach(GTK_TEXT(c->entry)); | 3029 gtkspell_detach(GTK_TEXT(c->entry));*/ |
3052 cnv = cnv->next; | 3030 cnv = cnv->next; |
3053 } | 3031 } |
3054 | 3032 |
3055 while (con) { | 3033 while (con) { |
3056 gc = (struct gaim_connection *)con->data; | 3034 gc = (struct gaim_connection *)con->data; |
3057 cht = gc->buddy_chats; | 3035 cht = gc->buddy_chats; |
3058 while (cht) { | 3036 while (cht) { |
3059 c = (struct conversation *)cht->data; | 3037 c = (struct conversation *)cht->data; |
3060 if (convo_options & OPT_CONVO_CHECK_SPELLING) | 3038 /* if (convo_options & OPT_CONVO_CHECK_SPELLING) |
3061 gtkspell_attach(GTK_TEXT(c->entry)); | 3039 gtkspell_attach(GTK_TEXT(c->entry)); |
3062 else | 3040 else |
3063 gtkspell_detach(GTK_TEXT(c->entry)); | 3041 gtkspell_detach(GTK_TEXT(c->entry));*/ |
3064 cht = cht->next; | 3042 cht = cht->next; |
3065 } | 3043 } |
3066 con = con->next; | 3044 con = con->next; |
3067 } | 3045 } |
3068 | 3046 |