diff --git a/config/spell.m4 b/config/spell.m4 index 8185939c42..5810f17eed 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 @@ -36,6 +50,7 @@ AC_DEFUN([CHECK_WITH_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) 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()); }