125 lines
4.0 KiB
Diff
125 lines
4.0 KiB
Diff
From 005858795878b92fc17b4c2127bce90a1d053483 Mon Sep 17 00:00:00 2001
|
|
From: Patrick Griffis <tingping@tingping.se>
|
|
Date: Fri, 24 Nov 2017 03:51:10 -0500
|
|
Subject: [PATCH] spell-entry: Improve robustness of enchant loading and fix
|
|
2.0 support
|
|
|
|
- Add logging and error handling to loading symbols
|
|
- Don't load unversioned symbol
|
|
- Handle new function names in Enchant 2.0
|
|
|
|
Closes #2095
|
|
---
|
|
src/fe-gtk/sexy-spell-entry.c | 94 +++++++++++++++++++++++++------------------
|
|
1 file changed, 55 insertions(+), 39 deletions(-)
|
|
|
|
diff --git a/src/fe-gtk/sexy-spell-entry.c b/src/fe-gtk/sexy-spell-entry.c
|
|
index 566abcf3e..bd31d2239 100644
|
|
--- a/src/fe-gtk/sexy-spell-entry.c
|
|
+++ b/src/fe-gtk/sexy-spell-entry.c
|
|
@@ -159,49 +159,65 @@ initialize_enchant (void)
|
|
{
|
|
GModule *enchant;
|
|
gpointer funcptr;
|
|
-
|
|
-
|
|
- enchant = g_module_open("libenchant."G_MODULE_SUFFIX, 0);
|
|
- if (enchant == NULL)
|
|
- {
|
|
-#ifndef WIN32
|
|
- enchant = g_module_open("libenchant.so.1", 0);
|
|
- if (enchant == NULL)
|
|
- {
|
|
-#ifdef __APPLE__
|
|
- enchant = g_module_open("libenchant.dylib", 0);
|
|
- if (enchant == NULL)
|
|
+ gsize i;
|
|
+ const char * const libnames[] = {
|
|
+#ifdef G_OS_WIN32
|
|
+ "libenchant.dll",
|
|
#endif
|
|
- return;
|
|
- }
|
|
-#else
|
|
- return;
|
|
+#ifdef G_OS_UNIX
|
|
+ "libenchant.so.1",
|
|
+ "libenchant.so.2",
|
|
#endif
|
|
- }
|
|
-
|
|
- have_enchant = TRUE;
|
|
-
|
|
-#define MODULE_SYMBOL(name, func) \
|
|
- g_module_symbol(enchant, (name), &funcptr); \
|
|
- (func) = funcptr;
|
|
-
|
|
- MODULE_SYMBOL("enchant_broker_init", enchant_broker_init)
|
|
- MODULE_SYMBOL("enchant_broker_free", enchant_broker_free)
|
|
- MODULE_SYMBOL("enchant_broker_free_dict", enchant_broker_free_dict)
|
|
- MODULE_SYMBOL("enchant_broker_list_dicts", enchant_broker_list_dicts)
|
|
- MODULE_SYMBOL("enchant_broker_request_dict", enchant_broker_request_dict)
|
|
-
|
|
- MODULE_SYMBOL("enchant_dict_add_to_personal", enchant_dict_add_to_personal)
|
|
- MODULE_SYMBOL("enchant_dict_add_to_session", enchant_dict_add_to_session)
|
|
- MODULE_SYMBOL("enchant_dict_check", enchant_dict_check)
|
|
- MODULE_SYMBOL("enchant_dict_describe", enchant_dict_describe)
|
|
+#ifdef __APPLE__
|
|
+ "libenchant.dylib",
|
|
+#endif
|
|
+ };
|
|
+
|
|
+ for (i = 0; i < G_N_ELEMENTS(libnames); ++i)
|
|
+ {
|
|
+ enchant = g_module_open(libnames[i], 0);
|
|
+ if (enchant)
|
|
+ {
|
|
+ g_info ("Loaded %s", libnames[i]);
|
|
+ have_enchant = TRUE;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!have_enchant)
|
|
+ return;
|
|
+
|
|
+#define MODULE_SYMBOL(name, func, alt_name) G_STMT_START { \
|
|
+ const char *funcname = name; \
|
|
+ gboolean ret = g_module_symbol(enchant, funcname, &funcptr); \
|
|
+ if (alt_name) { \
|
|
+ funcname = alt_name; \
|
|
+ ret = g_module_symbol(enchant, funcname, &funcptr); \
|
|
+ } \
|
|
+ if (ret == FALSE) { \
|
|
+ g_warning ("Failed to find enchant symbol %s", funcname); \
|
|
+ have_enchant = FALSE; \
|
|
+ return; \
|
|
+ } \
|
|
+ (func) = funcptr; \
|
|
+} G_STMT_END;
|
|
+
|
|
+ MODULE_SYMBOL("enchant_broker_init", enchant_broker_init, NULL)
|
|
+ MODULE_SYMBOL("enchant_broker_free", enchant_broker_free, NULL)
|
|
+ MODULE_SYMBOL("enchant_broker_free_dict", enchant_broker_free_dict, NULL)
|
|
+ MODULE_SYMBOL("enchant_broker_list_dicts", enchant_broker_list_dicts, NULL)
|
|
+ MODULE_SYMBOL("enchant_broker_request_dict", enchant_broker_request_dict, NULL)
|
|
+
|
|
+ MODULE_SYMBOL("enchant_dict_add_to_personal", enchant_dict_add_to_personal,
|
|
+ "enchant_dict_add")
|
|
+ MODULE_SYMBOL("enchant_dict_add_to_session", enchant_dict_add_to_session, NULL)
|
|
+ MODULE_SYMBOL("enchant_dict_check", enchant_dict_check, NULL)
|
|
+ MODULE_SYMBOL("enchant_dict_describe", enchant_dict_describe, NULL)
|
|
MODULE_SYMBOL("enchant_dict_free_suggestions",
|
|
- enchant_dict_free_suggestions)
|
|
+ enchant_dict_free_suggestions, "enchant_dict_free_string_list")
|
|
MODULE_SYMBOL("enchant_dict_store_replacement",
|
|
- enchant_dict_store_replacement)
|
|
- MODULE_SYMBOL("enchant_dict_suggest", enchant_dict_suggest)
|
|
-
|
|
-#undef MODULE_SYMBOL
|
|
+ enchant_dict_store_replacement, NULL)
|
|
+ MODULE_SYMBOL("enchant_dict_suggest", enchant_dict_suggest, NULL)
|
|
}
|
|
|
|
static void
|