diff -u gtkspell-2.0.10/gtkspell/gtkspell.c gtkspell-2.0.10/gtkspell/gtkspell.c --- gtkspell-2.0.10/gtkspell/gtkspell.c +++ gtkspell-2.0.10/gtkspell/gtkspell.c @@ -445,12 +445,82 @@ } static void +language_change_callback(GtkWidget *mi, GtkSpell* spell) { + GError* error = NULL; + gchar *name; + g_object_get(G_OBJECT(mi), "name", &name, NULL); + gtkspell_set_language(spell, name, &error); + g_free(name); +} + +GtkWidget* +build_languages_menu(GtkSpell *spell) { + GtkWidget *mi, *menu; + GHashTable* ht; + + ht = g_hash_table_new(g_str_hash, g_str_equal); + + menu = gtk_menu_new(); + + /* build languages list */ + AspellConfig * config; + AspellDictInfoList * dlist; + AspellDictInfoEnumeration * dels; + const AspellDictInfo * entry; + + config = new_aspell_config(); + + /* the returned pointer should _not_ need to be deleted */ + dlist = get_aspell_dict_info_list(config); + + /* config is no longer needed */ + delete_aspell_config(config); + + dels = aspell_dict_info_list_elements(dlist); + + while ( (entry = aspell_dict_info_enumeration_next(dels)) != 0) + { + gchar *dummy, *dummy1; + if(!g_hash_table_lookup_extended(ht, entry->code, &dummy, &dummy1)){ + mi = gtk_menu_item_new_with_label(_(entry->code)); + g_object_set(G_OBJECT(mi), "name", entry->code, NULL); + g_hash_table_insert(ht, entry->code, NULL); + g_signal_connect(G_OBJECT(mi), "activate", + G_CALLBACK(language_change_callback), spell); + gtk_widget_show(mi); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); + } + } + + delete_aspell_dict_info_enumeration(dels); + g_hash_table_destroy(ht); + + //languages = g_get_language_names(); + + return menu; +} + + + +static void populate_popup(GtkTextView *textview, GtkMenu *menu, GtkSpell *spell) { GtkWidget *img, *mi; GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview); GtkTextIter start, end; char *word; + /* menu separator comes first. */ + mi = gtk_menu_item_new(); + gtk_widget_show(mi); + gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi); + + /* on top: language selection */ + mi = gtk_menu_item_new_with_label(_("Select Language")); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), + build_languages_menu(spell)); + gtk_widget_show_all(mi); + gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi); + /* we need to figure out if they picked a misspelled word. */ get_word_extents_from_mark(buffer, &start, &end, spell->mark_click); @@ -459,11 +529,6 @@ if (!gtk_text_iter_has_tag(&start, spell->tag_highlight)) return; /* word wasn't misspelled. */ - /* menu separator comes first. */ - mi = gtk_menu_item_new(); - gtk_widget_show(mi); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi); - /* then, on top of it, the suggestions menu. */ img = gtk_image_new_from_stock(GTK_STOCK_SPELL_CHECK, GTK_ICON_SIZE_MENU); mi = gtk_image_menu_item_new_with_label(_("Spelling Suggestions")); diff -u gtkspell-2.0.10/debian/changelog gtkspell-2.0.10/debian/changelog --- gtkspell-2.0.10/debian/changelog +++ gtkspell-2.0.10/debian/changelog @@ -1,3 +1,9 @@ +gtkspell (2.0.10-4ubuntu1) gutsy; urgency=low + + * added on the fly language selection submenu + + -- Hanno Stock Sun, 03 Feb 2008 03:15:52 +0100 + gtkspell (2.0.10-4) unstable; urgency=low * Seed symbols file for libgtkspell0