summary refs log tree commit diff stats
path: root/src/fe-gtk
diff options
context:
space:
mode:
authorPatrick Griffis <tingping@tingping.se>2017-11-24 03:51:10 -0500
committerPatrick Griffis <tingping@tingping.se>2017-11-24 03:56:53 -0500
commit005858795878b92fc17b4c2127bce90a1d053483 (patch)
treebd355158fc402b392daee70645438dfa6bd08436 /src/fe-gtk
parent228e08543afe3fb5d15e9e3f40114f6ae1a3d793 (diff)
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
Diffstat (limited to 'src/fe-gtk')
-rw-r--r--src/fe-gtk/sexy-spell-entry.c94
1 files changed, 55 insertions, 39 deletions
diff --git a/src/fe-gtk/sexy-spell-entry.c b/src/fe-gtk/sexy-spell-entry.c
index 566abcf3..bd31d223 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