| 145 imhtml = gtk_imhtml_new(NULL, NULL); |
145 imhtml = gtk_imhtml_new(NULL, NULL); |
| 146 gtk_imhtml_set_editable(GTK_IMHTML(imhtml), editable); |
146 gtk_imhtml_set_editable(GTK_IMHTML(imhtml), editable); |
| 147 gtk_imhtml_set_format_functions(GTK_IMHTML(imhtml), GTK_IMHTML_ALL ^ GTK_IMHTML_IMAGE); |
147 gtk_imhtml_set_format_functions(GTK_IMHTML(imhtml), GTK_IMHTML_ALL ^ GTK_IMHTML_IMAGE); |
| 148 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(imhtml), GTK_WRAP_WORD_CHAR); |
148 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(imhtml), GTK_WRAP_WORD_CHAR); |
| 149 if (editable && gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) |
149 if (editable && gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) |
| 150 gaim_gtk_gtkspell_setup(GTK_TEXT_VIEW(imhtml)); |
150 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(imhtml)); |
| 151 gtk_widget_show(imhtml); |
151 gtk_widget_show(imhtml); |
| 152 |
152 |
| 153 if (editable) { |
153 if (editable) { |
| 154 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(toolbar), imhtml); |
154 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(toolbar), imhtml); |
| 155 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(toolbar), "default"); |
155 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(toolbar), "default"); |
| 895 |
895 |
| 896 g_free(tmp); |
896 g_free(tmp); |
| 897 return buf; |
897 return buf; |
| 898 } |
898 } |
| 899 |
899 |
| |
900 void |
| |
901 gaim_gtk_setup_gtkspell(GtkTextView *textview) |
| |
902 { |
| 900 #ifdef USE_GTKSPELL |
903 #ifdef USE_GTKSPELL |
| 901 static GtkSpell* (*gtkspell_get_from_text_view_ptr)(GtkTextView *view); |
|
| 902 static void (*gtkspell_detach_ptr)(GtkSpell *spell); |
|
| 903 static GtkSpell* (*gtkspell_new_attach_ptr)(GtkTextView *view, const gchar *lang, GError **error); |
|
| 904 static int gtkspell_available = -1; /* -1 unknown, 0 false, 1 true */ |
|
| 905 |
|
| 906 #define GTKSPELL_SONAME "libgtkspell." G_MODULE_SUFFIX ".0" |
|
| 907 |
|
| 908 static void |
|
| 909 setup_gtkspell() |
|
| 910 { |
|
| 911 #if GLIB_CHECK_VERSION(2,3,3) |
|
| 912 GModule *handle = g_module_open(GTKSPELL_SONAME, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); |
|
| 913 #else |
|
| 914 GModule *handle = g_module_open(GTKSPELL_SONAME, G_MODULE_BIND_LAZY); |
|
| 915 #endif |
|
| 916 |
|
| 917 if (handle != NULL) |
|
| 918 { |
|
| 919 gpointer ptr; /* squash GCC strict aliasing warnings */ |
|
| 920 |
|
| 921 g_module_symbol(handle, "gtkspell_new_attach", &ptr); |
|
| 922 gtkspell_new_attach_ptr = ptr; |
|
| 923 |
|
| 924 g_module_symbol(handle, "gtkspell_detach", &ptr); |
|
| 925 gtkspell_detach_ptr = ptr; |
|
| 926 |
|
| 927 g_module_symbol(handle, "gtkspell_get_from_text_view", &ptr); |
|
| 928 gtkspell_get_from_text_view_ptr = ptr; |
|
| 929 |
|
| 930 gtkspell_available = TRUE; |
|
| 931 } |
|
| 932 else |
|
| 933 { |
|
| 934 gaim_debug_warning("gtkspell", "Failed to load %s: %s\n", GTKSPELL_SONAME, g_module_error()); |
|
| 935 gtkspell_available = FALSE; |
|
| 936 } |
|
| 937 } |
|
| 938 |
|
| 939 gboolean |
|
| 940 gaim_gtk_gtkspell_is_available() |
|
| 941 { |
|
| 942 if (gtkspell_available == -1) |
|
| 943 setup_gtkspell(); |
|
| 944 |
|
| 945 return gtkspell_available; |
|
| 946 } |
|
| 947 |
|
| 948 void |
|
| 949 gaim_gtk_gtkspell_setup(GtkTextView *textview) |
|
| 950 { |
|
| 951 GError *error = NULL; |
904 GError *error = NULL; |
| 952 char *locale = NULL; |
905 char *locale = NULL; |
| 953 |
906 |
| 954 g_return_if_fail(textview != NULL); |
907 g_return_if_fail(textview != NULL); |
| 955 g_return_if_fail(GTK_IS_TEXT_VIEW(textview)); |
908 g_return_if_fail(GTK_IS_TEXT_VIEW(textview)); |
| 956 |
909 |
| 957 if (!gaim_gtk_gtkspell_is_available()) |
910 if (gtkspell_new_attach(textview, locale, &error) == NULL && error) |
| 958 return; |
|
| 959 |
|
| 960 if (gtkspell_new_attach_ptr(textview, locale, &error) == NULL && error) |
|
| 961 { |
911 { |
| 962 gaim_debug_warning("gtkspell", "Failed to setup GtkSpell: %s\n", error->message); |
912 gaim_debug_warning("gtkspell", "Failed to setup GtkSpell: %s\n", |
| |
913 error->message); |
| 963 g_error_free(error); |
914 g_error_free(error); |
| 964 } |
915 } |
| 965 } |
916 #endif /* USE_GTKSPELL */ |
| 966 |
917 } |
| 967 void |
|
| 968 gaim_gtk_gtkspell_unsetup(GtkTextView *textview) |
|
| 969 { |
|
| 970 GtkSpell *spell; |
|
| 971 |
|
| 972 if (!gtkspell_available) |
|
| 973 return; |
|
| 974 |
|
| 975 spell = gtkspell_get_from_text_view_ptr(textview); |
|
| 976 gtkspell_detach_ptr(spell); |
|
| 977 } |
|
| 978 |
|
| 979 #else /* !USE_GTKSPELL */ |
|
| 980 |
|
| 981 gboolean |
|
| 982 gaim_gtk_gtkspell_is_available() |
|
| 983 { |
|
| 984 return FALSE; |
|
| 985 } |
|
| 986 |
|
| 987 void |
|
| 988 gaim_gtk_gtkspell_setup(GtkTextView *textview) |
|
| 989 { |
|
| 990 } |
|
| 991 |
|
| 992 void |
|
| 993 gaim_gtk_gtkspell_unsetup(GtkTextView *textview) |
|
| 994 { |
|
| 995 } |
|
| 996 |
|
| 997 #endif /* !USE_GTKSPELL */ |
|
| 998 |
918 |
| 999 void |
919 void |
| 1000 gaim_gtk_save_accels_cb(GtkAccelGroup *accel_group, guint arg1, |
920 gaim_gtk_save_accels_cb(GtkAccelGroup *accel_group, guint arg1, |
| 1001 GdkModifierType arg2, GClosure *arg3, |
921 GdkModifierType arg2, GClosure *arg3, |
| 1002 gpointer data) |
922 gpointer data) |