commit b3cca8086d2fafad1aeea2cdfb6639100952b3c5
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Wed Jan 24 16:19:34 2018 +0100

    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)
---
 config/spell.m4                         |   37 +++++++++++++++++++++---------
 development/cmake/ConfigureChecks.cmake |   18 +++++++++++++++
 development/cmake/config.h.cmake        |    3 ++
 src/EnchantChecker.cpp                  |   17 +++++++++++---
 4 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/config/spell.m4 b/config/spell.m4
index a15f9f6..f494da8 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++.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],
 [
        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 f09ba8b..d2695b0 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++.h>
+    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 7fac0b0..fd08c45 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 5ef399a..47eb35e 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());
 }
 
 

Reply via email to