/** * gtkspell_new_attach: * @view: The #GtkTextView to attach to. * @lang: The language to use, in a form pspell understands (it appears to * be a locale specifier?). * @error: Return location for error. * * Create a new #GtkSpell object attached to @view with language @lang. * * Returns: a new #GtkSpell object, or %NULL on error. */ GtkSpell* gtkspell_new_attach(GtkTextView *view, const gchar *lang, GError **error) { GtkTextBuffer *buffer; GtkTextIter start, end; GtkSpell *spell; if (error) g_return_val_if_fail(*error == NULL, NULL); spell = g_object_get_data(G_OBJECT(view), GTKSPELL_OBJECT_KEY); g_assert(spell == NULL); /* attach to the widget */ spell = g_new0(GtkSpell, 1); spell->view = view; if (!gtkspell_set_language_internal(spell, lang, error)) { g_free(spell); return NULL; } g_object_set_data(G_OBJECT(view), GTKSPELL_OBJECT_KEY, spell); g_signal_connect_swapped(G_OBJECT(view), "destroy", G_CALLBACK(gtkspell_free), spell); g_signal_connect(G_OBJECT(view), "button-press-event", G_CALLBACK(button_press_event), spell); g_signal_connect(G_OBJECT(view), "populate-popup", G_CALLBACK(populate_popup), spell); buffer = gtk_text_view_get_buffer(view); g_signal_connect(G_OBJECT(buffer), "insert-text", G_CALLBACK(insert_text_before), spell); g_signal_connect_after(G_OBJECT(buffer), "insert-text", G_CALLBACK(insert_text_after), spell); g_signal_connect_after(G_OBJECT(buffer), "delete-range", G_CALLBACK(delete_range_after), spell); spell->tag_highlight = gtk_text_buffer_create_tag(buffer, "gtkspell-misspelled", "foreground", "red", "underline", PANGO_UNDERLINE_SINGLE, NULL); /* we create the mark here, but we don't use it until text is * inserted, so we don't really care where iter points. */ gtk_text_buffer_get_bounds(buffer, &start, &end); spell->mark_insert = gtk_text_buffer_create_mark(buffer, "gtkspell-insert", &start, TRUE); /* now check the entire text buffer. */ gtkspell_recheck_all(spell); return spell; }
/** * gtkspell_set_language: * @spell: The #GtkSpell object. * @lang: The language to use, in a form pspell understands (it appears to * be a locale specifier?). * @error: Return location for error. * * Set the language on @spell to @lang, possibily returning an error in * @error. * * Returns: FALSE if there was an error. */ gboolean gtkspell_set_language(GtkSpell *spell, const gchar *lang, GError **error) { gboolean ret; if (error) g_return_val_if_fail(*error == NULL, FALSE); ret = gtkspell_set_language_internal(spell, lang, error); if (ret) gtkspell_recheck_all(spell); return ret; }
void spell_language_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer user_data) { #ifdef HAVE_GTKSPELL Ebook *ebook; GConfValue *value; GtkSpell *spell; const gchar *gconf_lang; gchar *lang; GtkWidget * window, * G_GNUC_UNUSED spell_check; GtkTextView * text_view; gboolean spellcheck_wanted; g_return_if_fail (user_data); ebook = (Ebook *) user_data; value = gconf_entry_get_value (entry); gconf_lang = gconf_value_get_string (value); window = GTK_WIDGET(gtk_builder_get_object (ebook->builder, "gpdfwindow")); spell_check = GTK_WIDGET(gtk_builder_get_object (ebook->builder, "spellcheckmenuitem")); text_view = GTK_TEXT_VIEW(gtk_builder_get_object (ebook->builder, "textview")); if (*gconf_lang == '\0' || gconf_lang == NULL) lang = NULL; else lang = g_strdup (gconf_lang); if (window) { spellcheck_wanted = gconf_client_get_bool (ebook->client, ebook->spell_check.key, NULL); spell = gtkspell_get_from_text_view (text_view); if (spellcheck_wanted) { if (spell && lang) /* Only if we have both spell and lang non-null we can use _set_language() */ gtkspell_set_language (spell, lang, NULL); else { /* We need to create a new spell widget if we want to use lang == NULL (use default lang) * or if the spell isn't initialized */ if (spell) gtkspell_detach (spell); spell = gtkspell_new_attach (text_view, lang, NULL); } gtkspell_recheck_all (spell); } } spell_language_select_menuitem (ebook, lang); g_free (lang); #endif /* HAVE_GTKSPELL */ }