From: Jean-Marc Lasgouttes Date: Wed, 24 Jan 2018 15:19:34 +0000 (+0100) Subject: Add support for enchant 2.x X-Git-Tag: 2.3.1~150 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=b3cca8086d2fafad1aeea2cdfb6639100952b3c5;p=features.git 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. (cherry picked from commit 63a4e82874fddcec00a1733c14ad4525d155f19f) --- diff --git a/config/spell.m4 b/config/spell.m4 index a15f9f6b3d..f494da8f2f 100644 --- a/config/spell.m4 +++ b/config/spell.m4 @@ -23,7 +23,21 @@ AC_DEFUN([CHECK_WITH_ASPELL], 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::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], [ lyx_use_enchant=true @@ -31,16 +45,17 @@ AC_DEFUN([CHECK_WITH_ENCHANT], test "$with_enchant" = "no" && lyx_use_enchant=false if $lyx_use_enchant; then - PKG_CHECK_MODULES([ENCHANT], [enchant], [], [lyx_use_enchant=false]) - AC_MSG_CHECKING([whether to use enchant]) - if $lyx_use_enchant ; then - AC_MSG_RESULT(yes) - AC_DEFINE(USE_ENCHANT, 1, [Define as 1 to use the enchant library]) - lyx_flags="$lyx_flags use-enchant" - else - AC_MSG_RESULT(no) - fi - fi + PKG_CHECK_MODULES([ENCHANT], [enchant], [], [lyx_use_enchant=false]) + AC_MSG_CHECKING([whether to use enchant]) + if $lyx_use_enchant ; then + AC_MSG_RESULT(yes) + AC_DEFINE(USE_ENCHANT, 1, [Define as 1 to use the enchant library]) + LYX_HAVE_ENCHANT2 + lyx_flags="$lyx_flags use-enchant" + else + AC_MSG_RESULT(no) + fi + fi ]) # Macro to add for using hunspell spellchecker libraries! -*- sh -*- diff --git a/development/cmake/ConfigureChecks.cmake b/development/cmake/ConfigureChecks.cmake index f09ba8bd92..d2695b041a 100644 --- a/development/cmake/ConfigureChecks.cmake +++ b/development/cmake/ConfigureChecks.cmake @@ -195,6 +195,24 @@ check_cxx_source_compiles( " 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::Broker broker; + int main() { + return(0); + } + " + HAVE_ENCHANT2) + if (HAVE_ENCHANT2) + message(STATUS "ENCHANT2 found") + endif() +endif() + set(USE_LLVM_LIBCPP) set(STD_STRING_USES_COW) set(USE_GLIBCXX_CXX11_ABI) diff --git a/development/cmake/config.h.cmake b/development/cmake/config.h.cmake index 7fac0b00b5..fd08c45587 100644 --- a/development/cmake/config.h.cmake +++ b/development/cmake/config.h.cmake @@ -88,6 +88,9 @@ ${Include_used_spellchecker} // Define to 1 if std::call_once is supported by the compiler #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 #define MYTHES_H_LOCATION <${MYTHES_DIR}/mythes.hxx> diff --git a/src/EnchantChecker.cpp b/src/EnchantChecker.cpp index 5ef399a24a..47eb35e52e 100644 --- a/src/EnchantChecker.cpp +++ b/src/EnchantChecker.cpp @@ -30,6 +30,17 @@ namespace lyx { namespace { +enchant::Broker & broker() +{ +#ifdef HAVE_ENCHANT2 + static enchant::Broker thebroker; + return thebroker; +#else + return *enchant::Broker::instance(); +#endif +} + + struct Speller { enchant::Dict * speller; }; @@ -68,12 +79,11 @@ EnchantChecker::Private::~Private() enchant::Dict * EnchantChecker::Private::addSpeller(string const & lang) { - enchant::Broker * instance = enchant::Broker::instance(); Speller m; try { 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) { // FIXME error handling? @@ -186,8 +196,7 @@ bool EnchantChecker::hasDictionary(Language const * lang) const { if (!lang) return false; - enchant::Broker * instance = enchant::Broker::instance(); - return (instance->dict_exists(lang->code())); + return broker().dict_exists(lang->code()); }