Add support for enchant 2.x

As of enchant 2.x, it is required to create a Broker instance instead
of relying on a static one provided by the library.

Add autoconf and cmake (courtesy of Kornel) tests that check whether
one can indeed instantiate a Broker object, and act on the result in a
new broker() helper function.

Fixes bug #10986.
This commit is contained in:
Jean-Marc Lasgouttes 2018-01-24 16:19:34 +01:00
parent 7e071f14b9
commit 63a4e82874
4 changed files with 50 additions and 5 deletions

View File

@ -23,7 +23,21 @@ AC_DEFUN([CHECK_WITH_ASPELL],
fi fi
]) ])
# Macro to add for using enchant spellchecker libraries! -*- sh -*- AC_DEFUN([LYX_HAVE_ENCHANT2],
[
AC_MSG_CHECKING([whether enchant is version 2.x at least])
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$ENCHANT_CFLAGS $AM_CXXFLAGS $CXXFLAGS"
AC_TRY_COMPILE([#include <enchant++.h>],
[enchant::Broker broker;],
[AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_ENCHANT2, 1, [Define to 1 if enchant 2.x is detected])
],
[AC_MSG_RESULT(no)])
CXXFLAGS=$save_CXXFLAGS
])
AC_DEFUN([CHECK_WITH_ENCHANT], AC_DEFUN([CHECK_WITH_ENCHANT],
[ [
lyx_use_enchant=true lyx_use_enchant=true
@ -36,6 +50,7 @@ AC_DEFUN([CHECK_WITH_ENCHANT],
if $lyx_use_enchant ; then if $lyx_use_enchant ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(USE_ENCHANT, 1, [Define as 1 to use the enchant library]) AC_DEFINE(USE_ENCHANT, 1, [Define as 1 to use the enchant library])
LYX_HAVE_ENCHANT2
lyx_flags="$lyx_flags use-enchant" lyx_flags="$lyx_flags use-enchant"
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)

View File

@ -195,6 +195,24 @@ check_cxx_source_compiles(
" "
LYX_USE_STD_CALL_ONCE) LYX_USE_STD_CALL_ONCE)
if (ENCHANT_FOUND)
set(CMAKE_REQUIRED_INCLUDES ${ENCHANT_INCLUDE_DIR})
set(CMAKE_REQUIRED_LIBRARIES ${ENCHANT_LIBRARY})
# Check, whether enchant is version 2.x at least
check_cxx_source_compiles(
"
#include <enchant++.h>
enchant::Broker broker;
int main() {
return(0);
}
"
HAVE_ENCHANT2)
if (HAVE_ENCHANT2)
message(STATUS "ENCHANT2 found")
endif()
endif()
set(USE_LLVM_LIBCPP) set(USE_LLVM_LIBCPP)
set(STD_STRING_USES_COW) set(STD_STRING_USES_COW)
set(USE_GLIBCXX_CXX11_ABI) set(USE_GLIBCXX_CXX11_ABI)

View File

@ -88,6 +88,9 @@ ${Include_used_spellchecker}
// Define to 1 if std::call_once is supported by the compiler // Define to 1 if std::call_once is supported by the compiler
#cmakedefine LYX_USE_STD_CALL_ONCE 1 #cmakedefine LYX_USE_STD_CALL_ONCE 1
// Define to 1 if enchant is version 2.x at least
#cmakedefine HAVE_ENCHANT2 1
#endif // config.h guard #endif // config.h guard
#define MYTHES_H_LOCATION <${MYTHES_DIR}/mythes.hxx> #define MYTHES_H_LOCATION <${MYTHES_DIR}/mythes.hxx>

View File

@ -30,6 +30,17 @@ namespace lyx {
namespace { namespace {
enchant::Broker & broker()
{
#ifdef HAVE_ENCHANT2
static enchant::Broker thebroker;
return thebroker;
#else
return *enchant::Broker::instance();
#endif
}
struct Speller { struct Speller {
enchant::Dict * speller; enchant::Dict * speller;
}; };
@ -68,12 +79,11 @@ EnchantChecker::Private::~Private()
enchant::Dict * EnchantChecker::Private::addSpeller(string const & lang) enchant::Dict * EnchantChecker::Private::addSpeller(string const & lang)
{ {
enchant::Broker * instance = enchant::Broker::instance();
Speller m; Speller m;
try { try {
LYXERR(Debug::FILES, "request enchant speller for language " << lang); LYXERR(Debug::FILES, "request enchant speller for language " << lang);
m.speller = instance->request_dict(lang); m.speller = broker().request_dict(lang);
} }
catch (enchant::Exception & e) { catch (enchant::Exception & e) {
// FIXME error handling? // FIXME error handling?
@ -186,8 +196,7 @@ bool EnchantChecker::hasDictionary(Language const * lang) const
{ {
if (!lang) if (!lang)
return false; return false;
enchant::Broker * instance = enchant::Broker::instance(); return broker().dict_exists(lang->code());
return (instance->dict_exists(lang->code()));
} }