Below is a proof-of-concept for getting multiple encodings in a LyX document to work. As before it still relies on the user setting a suitable language for the text in the different encoding.
It seems to work for me though it's difficult to test due to what I think is in fact a Red Hat bug. Please ignore the quality of the code: I would like some comments on the approach though. Does this seem reasonable ? regards john Index: lyxfunc.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfunc.C,v retrieving revision 1.388 diff -u -r1.388 lyxfunc.C --- lyxfunc.C 18 Dec 2002 14:24:31 -0000 1.388 +++ lyxfunc.C 19 Dec 2002 05:31:59 -0000 @@ -43,6 +43,7 @@ #include "TextCache.h" #include "lyxfind.h" #include "undo_funcs.h" +#include "language.h" #include "ParagraphParameters.h" #include "insets/insetcommand.h" @@ -239,7 +240,7 @@ } if (action == LFUN_SELFINSERT) { - char c = keysym->getISOEncoded(); + char c = +keysym->getISOEncoded(TEXT(false)->cursor.par()->getFont(view()->buffer()->params, +(TEXT(false)->cursor.pos())).language()->encoding()); string argument; // FIXME: why ... Index: kbsequence.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/kbsequence.C,v retrieving revision 1.28 diff -u -r1.28 kbsequence.C --- kbsequence.C 1 Dec 2002 22:59:17 -0000 1.28 +++ kbsequence.C 19 Dec 2002 05:31:59 -0000 @@ -176,7 +176,7 @@ char kb_sequence::getLastKeyEncoded() const { - return getsym()->getISOEncoded(); + return 0; // FIXME return getsym()->getISOEncoded(); } Index: frontends/LyXKeySym.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/LyXKeySym.h,v retrieving revision 1.7 diff -u -r1.7 LyXKeySym.h --- frontends/LyXKeySym.h 12 Dec 2002 13:46:05 -0000 1.7 +++ frontends/LyXKeySym.h 19 Dec 2002 05:32:01 -0000 @@ -15,6 +15,8 @@ #include "LString.h" #include <boost/shared_ptr.hpp> +class Encoding; + /** * This is a base class for representing a keypress. * Each frontend has to implement this to provide @@ -47,7 +49,7 @@ * This converts the LyXKeySym to a 8-bit encoded character. * This relies on user to use the right encoding. */ - virtual char getISOEncoded() const = 0; + virtual char getISOEncoded(Encoding const * enc) const = 0; }; Index: frontends/qt2/QLyXKeySym.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QLyXKeySym.h,v retrieving revision 1.9 diff -u -r1.9 QLyXKeySym.h --- frontends/qt2/QLyXKeySym.h 12 Dec 2002 13:46:06 -0000 1.9 +++ frontends/qt2/QLyXKeySym.h 19 Dec 2002 05:32:01 -0000 @@ -23,6 +23,7 @@ #include <qstring.h> class QKeyEvent; +class Encoding; /** * Qt-specific key press. @@ -58,7 +59,7 @@ * This converts the LyXKeySym to a 8-bit encoded character. * This relies on user to use the right encoding. */ - virtual char getISOEncoded() const; + virtual char getISOEncoded(Encoding const *) const; /// int key() const { return key_; Index: frontends/qt2/QLyXKeySym.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QLyXKeySym.C,v retrieving revision 1.15 diff -u -r1.15 QLyXKeySym.C --- frontends/qt2/QLyXKeySym.C 17 Dec 2002 20:54:42 -0000 1.15 +++ frontends/qt2/QLyXKeySym.C 19 Dec 2002 05:32:02 -0000 @@ -19,13 +19,13 @@ #include "qlkey.h" #include "debug.h" #include "qt_helpers.h" +#include "encoding.h" #include <qevent.h> #include <qtextcodec.h> using std::endl; - QLyXKeySym::QLyXKeySym() : LyXKeySym(), key_(0) { @@ -71,21 +71,112 @@ string QLyXKeySym::getSymbolName() const { - string sym(qkey_to_string(key_)); + return qkey_to_string(key_); +} + + +namespace { - if (sym.empty()) { - lyxerr[Debug::KEY] << "sym empty in getSymbolName()" << endl; - if (!text_.isEmpty()) - sym = fromqstr(text_); + /* Qt encodings left : + * Found codec SJIS + * Found codec JIS7 + * Found codec GB18030 + * Found codec GBK + * Found codec eucKR + * Found codec eucJP + * Found codec Big5 + * Found codec ISO 8859-8 + * Found codec TSCII + * Found codec ISO 8859-11 + * Found codec Apple Roman + * Found codec CP 1258 + * Found codec CP 1257 + * Found codec CP 1256 + * Found codec CP 1254 + * Found codec CP 1253 + * Found codec CP 1252 + * Found codec CP 1250 + * Found codec CP 874 + * Found codec IBM 850 + * Found codec ISO 8859-14 + * Found codec ISO 8859-13 + * Found codec ISO 8859-10 + * Found codec ISO 8859-8-I + * Found codec UTF-8 + */ + + /* lyx encodings left: + * tis620-0, pt154 + */ +QTextCodec * getCodec(string const & lyxname) +{ + QTextCodec * codec = 0; + + if (lyxname == "iso8859-1") + codec = QTextCodec::codecForName("ISO 8859-1"); + else if (lyxname == "iso8859-2") + codec = QTextCodec::codecForName("ISO 8859-2"); + else if (lyxname == "iso8859-3") + codec = QTextCodec::codecForName("ISO 8859-3"); + else if (lyxname == "iso8859-4") + codec = QTextCodec::codecForName("ISO 8859-4"); + else if (lyxname == "iso8859-5") + codec = QTextCodec::codecForName("ISO 8859-5"); + else if (lyxname == "iso8859-6") + codec = QTextCodec::codecForName("ISO 8859-6"); + else if (lyxname == "iso8859-7") + codec = QTextCodec::codecForName("ISO 8859-7"); + else if (lyxname == "iso8859-9") + codec = QTextCodec::codecForName("ISO 8859-9"); + else if (lyxname == "iso8859-15") + codec = QTextCodec::codecForName("ISO 8859-15"); + else if (lyxname == "cp1255") + codec = QTextCodec::codecForName("CP 1255"); + else if (lyxname == "cp1251") + codec = QTextCodec::codecForName("CP 1251"); + else if (lyxname == "koi8") + codec = QTextCodec::codecForName("KOI8-R"); + else if (lyxname == "koi8-u") + codec = QTextCodec::codecForName("KOI8-U"); + + if (!codec) { + codec = QTextCodec::codecForLocale(); + lyxerr[Debug::KEY] << "Encoding " << lyxname + << " not found. Using default locale codec " + << fromqstr(codec->name()) << endl; } - lyxerr[Debug::KEY] << "getSymbolName() -> " << sym << endl; - return sym; + + lyxerr[Debug::KEY] << "encoding check found codec " + << fromqstr(codec->name()) << endl; + return codec; +} + } -char QLyXKeySym::getISOEncoded() const +char QLyXKeySym::getISOEncoded(const Encoding * encoding) const { - unsigned char const c = fromqstr(text_)[0]; +#if 0 + int i = 0; + QTextCodec * codec = QTextCodec::codecForIndex(i); + while (codec) { + if (codec->canEncode(text_)) { + lyxerr[Debug::KEY] << "Found codec " << codec->name() << endl; + } + codec = QTextCodec::codecForIndex(++i); + } + + if (!codec) { + lyxerr[Debug::KEY] << "No codec found !" << endl; + return 0; + } +#endif + + QTextCodec * codec = getCodec(encoding->Name()); + + QCString tmpstr = codec->fromUnicode(text_); + char const * tmpcstr = tmpstr; + unsigned char const c = tmpcstr[0]; lyxerr[Debug::KEY] << "ISOEncoded returning value " << int(c) << endl; return c; } @@ -107,10 +198,14 @@ bool operator==(LyXKeySym const & k1, LyXKeySym const & k2) { - // note we ignore text_ here (non-strict ==), because - // text_ is not filled out by keymap initialisation + QLyXKeySym const & q1(static_cast<QLyXKeySym const &>(k1)); + QLyXKeySym const & q2(static_cast<QLyXKeySym const &>(k2)); - return static_cast<QLyXKeySym const &>(k1).key() - == static_cast<QLyXKeySym const &>(k2).key(); + // we do not have enough info for a fair comparison, so return + // false. This works out OK because unknown text from Qt will + // get inserted anyway after the isText() check + if (q1.key() == Qt::Key_unknown || q2.key() == Qt::Key_unknown) + return false; + return q1.key() == q2.key(); }