Revision: 971 http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=971&view=rev Author: eht16 Date: 2009-09-30 19:41:19 +0000 (Wed, 30 Sep 2009)
Log Message: ----------- Merge changes from trunk: Allow setting a custom dictionary directory without reloading the plugin. Add an option to the preference dialog to select a custom directory to look for additional dictionary files. Minor fixes. Remove unused code. Use single header includes.
Modified Paths: -------------- branches/geany-plugins/geany-plugins-0.18/spellcheck/ChangeLog branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.c branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.h branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.c branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.h branches/geany-plugins/geany-plugins-0.18/spellcheck/src/speller.c
Modified: branches/geany-plugins/geany-plugins-0.18/spellcheck/ChangeLog =================================================================== --- branches/geany-plugins/geany-plugins-0.18/spellcheck/ChangeLog 2009-09-30 19:35:07 UTC (rev 970) +++ branches/geany-plugins/geany-plugins-0.18/spellcheck/ChangeLog 2009-09-30 19:41:19 UTC (rev 971) @@ -1,3 +1,16 @@ +2009-09-30 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + + * src/gui.c, src/gui.h, src/scplugin.c, src/scplugin.h, src/speller.c: + Merge changes from trunk: + Allow setting a custom dictionary directory without reloading + the plugin. + Add an option to the preference dialog to select a custom + directory to look for additional dictionary files. + Minor fixes. + Remove unused code. + Use single header includes. + + 2009-06-28 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/gui.c:
Modified: branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.c =================================================================== --- branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.c 2009-09-30 19:35:07 UTC (rev 970) +++ branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.c 2009-09-30 19:41:19 UTC (rev 971) @@ -23,22 +23,12 @@ */
-#include "geany.h" -#include "support.h" +#include "geanyplugin.h"
#include <ctype.h> #include <string.h>
-#include "plugindata.h"
-#include "document.h" -#include "editor.h" -#include "msgwindow.h" -#include "utils.h" -#include "ui_utils.h" - -#include "geanyfunctions.h" - #include "gui.h" #include "scplugin.h" #include "speller.h" @@ -81,11 +71,6 @@ }
-void sc_gui_update_tooltip(void) -{ -} - - void sc_gui_update_toolbar(void) { /* toolbar item is not requested, so remove the item if it exists */ @@ -101,7 +86,6 @@ if (sc_info->toolbar_button == NULL) { sc_info->toolbar_button = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_SPELL_CHECK); - sc_gui_update_tooltip();
plugin_add_toolbar_item(geany_plugin, sc_info->toolbar_button); ui_add_document_sensitive(GTK_WIDGET(sc_info->toolbar_button)); @@ -158,7 +142,7 @@ }
-static void menu_addword_item_activate_cd(GtkMenuItem *menuitem, gpointer gdata) +static void menu_addword_item_activate_cb(GtkMenuItem *menuitem, gpointer gdata) { gint startword, endword, i, doc_len; ScintillaObject *sci; @@ -298,12 +282,12 @@ menu_item = image_menu_item_new(GTK_STOCK_ADD, label); gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item); g_signal_connect(menu_item, "activate", - G_CALLBACK(menu_addword_item_activate_cd), GINT_TO_POINTER(0)); + G_CALLBACK(menu_addword_item_activate_cb), GINT_TO_POINTER(0));
menu_item = image_menu_item_new(GTK_STOCK_REMOVE, _("Ignore All")); gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item); g_signal_connect(menu_item, "activate", - G_CALLBACK(menu_addword_item_activate_cd), GINT_TO_POINTER(1)); + G_CALLBACK(menu_addword_item_activate_cb), GINT_TO_POINTER(1));
gtk_widget_show(sc_info->edit_menu); gtk_widget_show(sc_info->edit_menu_sep); @@ -459,6 +443,7 @@ { setptr(sc_info->default_language, g_strdup(gdata)); sc_speller_reinit_enchant_dict(); + sc_gui_update_menu(); update_labels(); }
@@ -505,48 +490,33 @@
void sc_gui_update_menu(void) { - GtkWidget *child, *menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(sc_info->menu_item)); - GList *l, *children = gtk_container_get_children(GTK_CONTAINER(menu)); - - sc_ignore_callback = TRUE; - for (l = children; l != NULL; l = g_list_next(l)) - { - if ((child = GTK_BIN(l->data)->child) != NULL) - { - if (GTK_IS_LABEL(child)) - { - if (utils_str_equal(sc_info->default_language, gtk_label_get_text(GTK_LABEL(child)))) - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(l->data), TRUE); - } - } - } - sc_ignore_callback = FALSE; - - update_labels(); -} - - -void sc_gui_create_menu(GtkWidget *sp_item) -{ - GtkWidget *menu, *menu_item; + GtkWidget *menu_item; guint i; + static gboolean need_init = TRUE; GSList *group = NULL; gchar *label;
- gtk_container_add(GTK_CONTAINER(geany->main_widgets->tools_menu), sp_item); + if (need_init) + { + gtk_container_add(GTK_CONTAINER(geany->main_widgets->tools_menu), sc_info->menu_item); + need_init = FALSE; + }
- menu = gtk_menu_new(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(sp_item), menu); + if (sc_info->main_menu != NULL) + gtk_widget_destroy(sc_info->main_menu);
+ sc_info->main_menu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(sc_info->menu_item), sc_info->main_menu); + sc_info->submenu_item_default = gtk_menu_item_new_with_label(NULL); - gtk_container_add(GTK_CONTAINER(menu), sc_info->submenu_item_default); + gtk_container_add(GTK_CONTAINER(sc_info->main_menu), sc_info->submenu_item_default); g_signal_connect(sc_info->submenu_item_default, "activate", G_CALLBACK(menu_item_toggled_cb), NULL);
update_labels();
menu_item = gtk_separator_menu_item_new(); - gtk_container_add(GTK_CONTAINER(menu), menu_item); + gtk_container_add(GTK_CONTAINER(sc_info->main_menu), menu_item);
sc_ignore_callback = TRUE; for (i = 0; i < sc_info->dicts->len; i++) @@ -556,10 +526,11 @@ group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menu_item)); if (utils_str_equal(sc_info->default_language, label)) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), TRUE); - gtk_container_add(GTK_CONTAINER(menu), menu_item); + gtk_container_add(GTK_CONTAINER(sc_info->main_menu), menu_item); g_signal_connect(menu_item, "toggled", G_CALLBACK(menu_item_toggled_cb), label); } sc_ignore_callback = FALSE; + gtk_widget_show_all(sc_info->main_menu); }
Modified: branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.h =================================================================== --- branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.h 2009-09-30 19:35:07 UTC (rev 970) +++ branches/geany-plugins/geany-plugins-0.18/spellcheck/src/gui.h 2009-09-30 19:41:19 UTC (rev 971) @@ -38,14 +38,12 @@
void sc_gui_create_edit_menu(void);
-void sc_gui_create_menu(GtkWidget *sp_item); - void sc_gui_update_editor_menu_cb(GObject *obj, const gchar *word, gint pos, GeanyDocument *doc, gpointer user_data);
void sc_gui_update_toolbar(void);
-void sc_gui_update_menu(void); +void sc_gui_update_menu();
void sc_gui_init(void);
Modified: branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.c =================================================================== --- branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.c 2009-09-30 19:35:07 UTC (rev 970) +++ branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.c 2009-09-30 19:41:19 UTC (rev 971) @@ -23,28 +23,9 @@ */
-#include "geany.h" -#include "support.h" +#include "geanyplugin.h"
-#ifdef HAVE_LOCALE_H -# include <locale.h> -#endif
-/* -#ifdef G_OS_WIN32 -# include <windows.h> -#endif -*/ - -#include "plugindata.h" - -#include "keybindings.h" -#include "utils.h" -#include "ui_utils.h" -#include "filetypes.h" - -#include "geanyfunctions.h" - #include "scplugin.h" #include "gui.h" #include "speller.h" @@ -55,8 +36,8 @@ GeanyFunctions *geany_functions;
-PLUGIN_VERSION_CHECK(132) -PLUGIN_SET_INFO(_("Spell Check"), _("Checks the spelling of the current document."), "0.4", +PLUGIN_VERSION_CHECK(147); +PLUGIN_SET_INFO(_("Spell Check"), _("Checks the spelling of the current document."), VERSION, _("The Geany developer team"))
@@ -83,27 +64,23 @@ };
-/* currently unused */ -#ifdef G_OS_WIN32 -#warning TODO check Windows support -/* On Windows we need to find the Aspell installation prefix via the Windows Registry - * and then set the prefix in the Aspell config object. */ -static void set_up_aspell_prefix(AspellConfig *config) +static void populate_dict_combo(GtkComboBox *combo) { - char sTemp[1024]; - HKEY hkey; - DWORD len = sizeof(sTemp); + guint i; + GtkTreeModel *model = gtk_combo_box_get_model(combo);
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\Aspell"), 0, - KEY_QUERY_VALUE, &hkey) != ERROR_SUCCESS) - return; + gtk_list_store_clear(GTK_LIST_STORE(model)); + for (i = 0; i < sc_info->dicts->len; i++) + { + gtk_combo_box_append_text(GTK_COMBO_BOX(combo), g_ptr_array_index(sc_info->dicts, i));
- if (RegQueryValueEx(hkey, NULL, 0, NULL, (LPBYTE)sTemp, &len) == ERROR_SUCCESS) - aspell_config_replace(config, "prefix", sTemp); - - RegCloseKey(hkey); + if (utils_str_equal(g_ptr_array_index(sc_info->dicts, i), sc_info->default_language)) + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i); + } + /* if the default language couldn't be selected, select the first available language */ + if (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) == -1) + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); } -#endif
static void configure_response_cb(GtkDialog *dialog, gint response, gpointer user_data) @@ -113,9 +90,13 @@ GKeyFile *config = g_key_file_new(); gchar *data; gchar *config_dir = g_path_get_dirname(sc_info->config_file); + GtkComboBox *combo = GTK_COMBO_BOX(g_object_get_data(G_OBJECT(dialog), "combo"));
- setptr(sc_info->default_language, gtk_combo_box_get_active_text(GTK_COMBO_BOX( - g_object_get_data(G_OBJECT(dialog), "combo")))); + setptr(sc_info->default_language, gtk_combo_box_get_active_text(combo)); +#ifdef HAVE_ENCHANT_1_5 + setptr(sc_info->dictionary_dir, g_strdup(gtk_entry_get_text(GTK_ENTRY( + g_object_get_data(G_OBJECT(dialog), "dict_dir"))))); +#endif sc_speller_reinit_enchant_dict();
sc_info->check_while_typing = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( @@ -133,9 +114,11 @@ g_key_file_set_boolean(config, "spellcheck", "check_while_typing", sc_info->check_while_typing); g_key_file_set_boolean(config, "spellcheck", "use_msgwin", sc_info->use_msgwin); g_key_file_set_boolean(config, "spellcheck", "show_toolbar_item", sc_info->show_toolbar_item); + g_key_file_set_string(config, "spellcheck", "dictionary_dir", sc_info->dictionary_dir);
sc_gui_update_toolbar(); sc_gui_update_menu(); + populate_dict_combo(combo);
if (! g_file_test(config_dir, G_FILE_TEST_IS_DIR) && utils_mkdir(config_dir, TRUE) != 0) { @@ -173,6 +156,8 @@ "spellcheck", "check_while_typing", FALSE); sc_info->show_toolbar_item = utils_get_setting_boolean(config, "spellcheck", "show_toolbar_item", TRUE); + sc_info->dictionary_dir = utils_get_setting_string(config, + "spellcheck", "dictionary_dir", NULL); sc_info->use_msgwin = utils_get_setting_boolean(config, "spellcheck", "use_msgwin", FALSE); g_key_file_free(config); g_free(default_lang); @@ -188,7 +173,7 @@ sc_speller_init();
sc_gui_create_edit_menu(); - sc_gui_create_menu(sc_info->menu_item); + sc_gui_update_menu(); gtk_widget_show_all(sc_info->menu_item);
sc_info->signal_id = g_signal_connect(geany->main_widgets->window, @@ -203,10 +188,47 @@ }
+#ifdef HAVE_ENCHANT_1_5 +static void dictionary_dir_button_clicked_cb(GtkButton *button, gpointer item) +{ + GtkWidget *dialog; + gchar *text; + + /* initialize the dialog */ + dialog = gtk_file_chooser_dialog_new(_("Select Directory"), NULL, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); + + text = utils_get_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(item))); + if (NZV(text)) + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), text); + + /* run it */ + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) + { + gchar *utf8_filename, *tmp; + + tmp = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + utf8_filename = utils_get_utf8_from_locale(tmp); + + gtk_entry_set_text(GTK_ENTRY(item), utf8_filename); + + g_free(utf8_filename); + g_free(tmp); + } + + gtk_widget_destroy(dialog); +} +#endif + + GtkWidget *plugin_configure(GtkDialog *dialog) { GtkWidget *label, *vbox, *combo, *check_type, *check_msgwin, *check_toolbar; - guint i; +#ifdef HAVE_ENCHANT_1_5 + GtkWidget *entry_dir, *hbox, *button, *image; +#endif
vbox = gtk_vbox_new(FALSE, 6);
@@ -228,24 +250,43 @@ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 3);
combo = gtk_combo_box_new_text(); + populate_dict_combo(GTK_COMBO_BOX(combo));
- for (i = 0; i < sc_info->dicts->len; i++) - { - gtk_combo_box_append_text(GTK_COMBO_BOX(combo), g_ptr_array_index(sc_info->dicts, i)); - - if (utils_str_equal(g_ptr_array_index(sc_info->dicts, i), sc_info->default_language)) - gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i); - } - /* if the default language couldn't be selected, select the first available language */ - if (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) == -1) - gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); - if (sc_info->dicts->len > 20) gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo), 3); else if (sc_info->dicts->len > 10) gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo), 2); gtk_box_pack_start(GTK_BOX(vbox), combo, FALSE, FALSE, 6);
+#ifdef HAVE_ENCHANT_1_5 + label = gtk_label_new_with_mnemonic(_("_Directory to look for dictionary files:")); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + entry_dir = gtk_entry_new(); + ui_entry_add_clear_icon(GTK_ENTRY(entry_dir)); + gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry_dir); + ui_widget_set_tooltip_text(entry_dir, + _("Read additional dictionary files from this directory. " + "For now, this only works with myspell dictionaries.")); + if (NZV(sc_info->dictionary_dir)) + gtk_entry_set_text(GTK_ENTRY(entry_dir), sc_info->dictionary_dir); + + button = gtk_button_new(); + g_signal_connect(button, "clicked", + G_CALLBACK(dictionary_dir_button_clicked_cb), entry_dir); + + image = gtk_image_new_from_stock("gtk-open", GTK_ICON_SIZE_BUTTON); + gtk_container_add(GTK_CONTAINER(button), image); + + hbox = gtk_hbox_new(FALSE, 6); + gtk_box_pack_start_defaults(GTK_BOX(hbox), entry_dir); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + g_object_set_data(G_OBJECT(dialog), "dict_dir", entry_dir); +#endif g_object_set_data(G_OBJECT(dialog), "combo", combo); g_object_set_data(G_OBJECT(dialog), "check_type", check_type); g_object_set_data(G_OBJECT(dialog), "check_msgwin", check_msgwin); @@ -279,14 +320,6 @@
void plugin_cleanup(void) { - guint i; - - for (i = 0; i < sc_info->dicts->len; i++) - { - g_free(g_ptr_array_index(sc_info->dicts, i)); - } - g_ptr_array_free(sc_info->dicts, TRUE); - g_signal_handler_disconnect(geany->main_widgets->window, sc_info->signal_id);
gtk_widget_destroy(sc_info->edit_menu); @@ -297,6 +330,7 @@ sc_gui_free(); sc_speller_free();
+ g_free(sc_info->dictionary_dir); g_free(sc_info->default_language); g_free(sc_info->config_file); gtk_widget_destroy(sc_info->menu_item);
Modified: branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.h =================================================================== --- branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.h 2009-09-30 19:35:07 UTC (rev 970) +++ branches/geany-plugins/geany-plugins-0.18/spellcheck/src/scplugin.h 2009-09-30 19:41:19 UTC (rev 971) @@ -32,11 +32,13 @@ { gchar *config_file; gchar *default_language; + gchar *dictionary_dir; gboolean use_msgwin; gboolean check_while_typing; gboolean show_toolbar_item; gulong signal_id; GPtrArray *dicts; + GtkWidget *main_menu; GtkWidget *menu_item; GtkWidget *submenu_item_default; GtkWidget *edit_menu;
Modified: branches/geany-plugins/geany-plugins-0.18/spellcheck/src/speller.c =================================================================== --- branches/geany-plugins/geany-plugins-0.18/spellcheck/src/speller.c 2009-09-30 19:35:07 UTC (rev 970) +++ branches/geany-plugins/geany-plugins-0.18/spellcheck/src/speller.c 2009-09-30 19:41:19 UTC (rev 971) @@ -23,24 +23,14 @@ */
-#include "geany.h" -#include "support.h" +#include "geanyplugin.h"
+#include "scintilla/SciLexer.h" + #include <string.h> #include <ctype.h> #include <enchant.h>
-#include "plugindata.h" - -#include "document.h" -#include "editor.h" -#include "msgwindow.h" -#include "utils.h" -#include "ui_utils.h" -#include "scintilla/SciLexer.h" - -#include "geanyfunctions.h" - #include "speller.h" #include "scplugin.h"
@@ -252,42 +242,6 @@ }
-void sc_speller_reinit_enchant_dict(void) -{ - gchar *lang = sc_info->default_language; - - /* Release a previous dict object */ - if (sc_speller_dict != NULL) - enchant_broker_free_dict(sc_speller_broker, sc_speller_dict); - - /* Check if the stored default dictionary is (still) avaiable, fall back to the first - * one in the list if not */ - if (! check_default_lang()) - { - if (sc_info->dicts->len > 0) - { - lang = g_ptr_array_index(sc_info->dicts, 0); - g_warning("Stored language ('%s') could not be loaded. Falling back to '%s'", - sc_info->default_language, lang); - } - else - g_warning("Stored language ('%s') could not be loaded.", sc_info->default_language); - } - - /* Request new dict object */ - sc_speller_dict = enchant_broker_request_dict(sc_speller_broker, lang); - if (sc_speller_dict == NULL) - { - broker_init_failed(); - gtk_widget_set_sensitive(sc_info->menu_item, FALSE); - } - else - { - gtk_widget_set_sensitive(sc_info->menu_item, TRUE); - } -} - - gchar *sc_speller_get_default_lang(void) { const gchar *lang = g_getenv("LANG"); @@ -343,8 +297,24 @@ }
+static void sc_speller_dicts_free(void) +{ + guint i; + if (sc_info->dicts != NULL) + { + for (i = 0; i < sc_info->dicts->len; i++) + { + g_free(g_ptr_array_index(sc_info->dicts, i)); + } + g_ptr_array_free(sc_info->dicts, TRUE); + } +} + + static void create_dicts_array(void) { + sc_speller_dicts_free(); + sc_info->dicts = g_ptr_array_new();
enchant_broker_list_dicts(sc_speller_broker, add_dict_array, sc_info->dicts); @@ -406,18 +376,73 @@ }
+void sc_speller_reinit_enchant_dict(void) +{ + gchar *lang = sc_info->default_language; + + /* Release a previous dict object */ + if (sc_speller_dict != NULL) + enchant_broker_free_dict(sc_speller_broker, sc_speller_dict); + +#if HAVE_ENCHANT_1_5 + { + const gchar *old_path; + gchar *new_path; + + /* add custom dictionary path for myspell (primarily used on Windows) */ + old_path = enchant_broker_get_param(sc_speller_broker, "enchant.myspell.dictionary.path"); + if (old_path != NULL) + new_path = g_strconcat( + old_path, G_SEARCHPATH_SEPARATOR_S, sc_info->dictionary_dir, NULL); + else + new_path = sc_info->dictionary_dir; + + enchant_broker_set_param(sc_speller_broker, "enchant.myspell.dictionary.path", new_path); + if (new_path != sc_info->dictionary_dir) + g_free(new_path); + } +#endif + create_dicts_array(); + + /* Check if the stored default dictionary is (still) avaiable, fall back to the first + * one in the list if not */ + if (! check_default_lang()) + { + if (sc_info->dicts->len > 0) + { + lang = g_ptr_array_index(sc_info->dicts, 0); + g_warning("Stored language ('%s') could not be loaded. Falling back to '%s'", + sc_info->default_language, lang); + } + else + g_warning("Stored language ('%s') could not be loaded.", sc_info->default_language); + } + + /* Request new dict object */ + sc_speller_dict = enchant_broker_request_dict(sc_speller_broker, lang); + if (sc_speller_dict == NULL) + { + broker_init_failed(); + gtk_widget_set_sensitive(sc_info->menu_item, FALSE); + } + else + { + gtk_widget_set_sensitive(sc_info->menu_item, TRUE); + } +} + + void sc_speller_init(void) { sc_speller_broker = enchant_broker_init();
- create_dicts_array(); - sc_speller_reinit_enchant_dict(); }
void sc_speller_free(void) { + sc_speller_dicts_free(); if (sc_speller_dict != NULL) enchant_broker_free_dict(sc_speller_broker, sc_speller_dict); enchant_broker_free(sc_speller_broker);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
plugins-commits@lists.geany.org