Here's a proper patch. It works for me. How I tested this :

create a  doc with an english par, russian par, and polish par.

Map Cyrillic_zhe to F11
Map lcaron to F10
Change english encoding to iso8859-15 (just to test the Eurosign)

move to each par and check that F10,F11, etc. do the right thing. They
do, but one problem :

If I create a new paragraph, then apply a language change to it, it
doesn't seem to work properly. I do not understand why.

Anyway, I think I'm going to apply this unless there's strong objection.
Kornel, if you can't insert Cyrillic_a with this patch, I feel farily
sure  it means that your Qt or system is simply buggy. Inserting
Cyrillic_a is just fine for me. Still, -dbg key might still be
interesting.

This can get some real testing in pre2.

btw, why don't we default to is8859-15 for most of the languages ?

Comments ?

regards
john


Index: BufferView.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView.C,v
retrieving revision 1.113
diff -u -r1.113 BufferView.C
--- BufferView.C        21 Oct 2002 16:21:51 -0000      1.113
+++ BufferView.C        19 Dec 2002 22:03:58 -0000
@@ -933,6 +933,18 @@
 }
 
 
+Encoding const * BufferView::getEncoding() const
+{
+       LyXText * t = getLyXText();
+       if (!t)
+               return 0;
+
+       LyXCursor const & c= t->cursor;
+       LyXFont const font = c.par()->getFont(buffer()->params, c.pos());
+       return font.language()->encoding();
+}
+
+
 void BufferView::haveSelection(bool sel)
 {
        pimpl_->workarea().haveSelection(sel);
Index: BufferView.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView.h,v
retrieving revision 1.112
diff -u -r1.112 BufferView.h
--- BufferView.h        1 Dec 2002 21:10:35 -0000       1.112
+++ BufferView.h        19 Dec 2002 22:04:00 -0000
@@ -30,6 +30,7 @@
 class Painter;
 class UpdatableInset;
 class WordLangTuple;
+class Encoding;
 
 /**
  * A buffer view encapsulates a view onto a particular
@@ -123,6 +124,9 @@
        int unlockInset(UpdatableInset * inset);
        /// unlock the currently locked inset
        void insetUnlock();
+
+       /// return the current encoding at the cursor
+       Encoding const * getEncoding() const;
 
        /// return the parent language of the given inset
        Language const * getParentLanguage(Inset * inset) const;
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 22:04:13 -0000
@@ -166,20 +166,6 @@
 }
 
 
-LyXKeySymPtr kb_sequence::getsym() const
-{
-       if (sequence.size() == 0)
-               return LyXKeySymPtr(LyXKeySymFactory::create());
-       return sequence.back();
-}
-
-
-char kb_sequence::getLastKeyEncoded() const
-{
-       return getsym()->getISOEncoded();
-}
-
-
 void kb_sequence::reset()
 {
        mark_deleted();
Index: kbsequence.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/kbsequence.h,v
retrieving revision 1.13
diff -u -r1.13 kbsequence.h
--- kbsequence.h        11 Aug 2002 16:27:09 -0000      1.13
+++ kbsequence.h        19 Dec 2002 22:04:15 -0000
@@ -71,13 +71,6 @@
        /// Mark the sequence as deleted.
        void mark_deleted();
 
-       /**
-        * Return the value of the last keysym in the sequence
-        * in the local ISO encoding. If it does not encode
-        * in this encoding, return 0.
-        */
-       char getLastKeyEncoded() const;
-
        /// Reset sequence to become "deleted"
        void reset();
 
@@ -100,9 +93,6 @@
        kb_keymap * curmap;
 
 private:
-       /// get the keysym of last in sequence
-       LyXKeySymPtr getsym() const;
-
        /**
         * Array holding the current key sequence as KeySyms.
         * If sequence[length - 1] < 0xff it can be used as ISO8859 char
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 22:04:30 -0000
@@ -31,6 +31,7 @@
 #include "gettext.h"
 #include "Lsstream.h"
 #include "trans_mgr.h"
+#include "encoding.h"
 #include "layout.h"
 #include "bufferview_funcs.h"
 #include "frontends/LyXView.h"
@@ -101,6 +102,7 @@
 
 LyXFunc::LyXFunc(LyXView * o)
        : owner(o),
+       encoded_last_key(0),
        keyseq(toplevel_keymap.get(), toplevel_keymap.get()),
        cancel_meta_seq(toplevel_keymap.get(), toplevel_keymap.get()),
        meta_fake_bit(key_modifier::none)
@@ -134,9 +136,9 @@
 
 void LyXFunc::handleKeyFunc(kb_action action)
 {
-       char c = keyseq.getLastKeyEncoded();
+       char c = encoded_last_key;
 
-       if (keyseq.length() > 1) {
+       if (keyseq.length()) {
                c = 0;
        }
 
@@ -175,6 +177,10 @@
                return;
        }
 
+       Encoding const * encoding = view()->getEncoding();
+
+       encoded_last_key = keysym->getISOEncoded(encoding ? encoding->Name() : "");
+
        // Do a one-deep top-level lookup for
        // cancel and meta-fake keys. RVDK_PATCH_5
        cancel_meta_seq.reset();
@@ -239,16 +245,15 @@
        }
 
        if (action == LFUN_SELFINSERT) {
-               char c = keysym->getISOEncoded();
-               string argument;
+               if (encoded_last_key != 0) {
+                       string arg;
+                       arg += encoded_last_key;
 
-               // FIXME: why ...
-               if (c != 0)
-                       argument = c;
+                       dispatch(FuncRequest(view(), LFUN_SELFINSERT, arg));
 
-               dispatch(FuncRequest(view(), LFUN_SELFINSERT, argument));
-               lyxerr[Debug::KEY] << "SelfInsert arg[`"
+                       lyxerr[Debug::KEY] << "SelfInsert arg[`"
                                   << argument << "']" << endl;
+               }
        } else {
                dispatch(action);
        }
@@ -760,7 +765,7 @@
 #endif
                        if ((action == LFUN_UNKNOWN_ACTION)
                            && argument.empty()) {
-                               argument = keyseq.getLastKeyEncoded();
+                               argument = encoded_last_key;
                        }
                        // Undo/Redo is a bit tricky for insets.
                        if (action == LFUN_UNDO) {
Index: lyxfunc.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfunc.h,v
retrieving revision 1.52
diff -u -r1.52 lyxfunc.h
--- lyxfunc.h   1 Dec 2002 22:59:17 -0000       1.52
+++ lyxfunc.h   19 Dec 2002 22:04:31 -0000
@@ -77,6 +77,10 @@
 
        ///
        LyXView * owner;
+
+       /// the last character added to the key sequence, in ISO encoded form
+       char encoded_last_key;
+
        ///
        kb_sequence keyseq;
        ///
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 22:05:25 -0000
@@ -47,7 +47,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(string const & encoding) const = 0;
 };
 
 
Index: frontends/qt2/QLyXKeySym.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QLyXKeySym.C,v
retrieving revision 1.16
diff -u -r1.16 QLyXKeySym.C
--- frontends/qt2/QLyXKeySym.C  19 Dec 2002 18:44:31 -0000      1.16
+++ frontends/qt2/QLyXKeySym.C  19 Dec 2002 22:05:32 -0000
@@ -23,7 +23,75 @@
 #include <qevent.h>
 #include <qtextcodec.h>
 
+#include <map>
+
 using std::endl;
+using std::map;
+
+namespace {
+
+typedef map<string, QTextCodec *> EncodingMap;
+EncodingMap encoding_map;
+
+char const encode(string const & encoding, QString const & str)
+{
+       QTextCodec * codec = 0;
+
+       EncodingMap::const_iterator cit = encoding_map.find(encoding);
+       if (cit == encoding_map.end()) {
+               lyxerr[Debug::KEY] << "Unrecognised encoding "
+                       << encoding << endl;
+               codec = QTextCodec::codecForLocale();
+       } else {
+               codec = cit->second;
+       }
+
+       if (!codec) {
+               lyxerr[Debug::KEY] << "No codec exists for encoding "
+                       << encoding << endl;
+               codec = QTextCodec::codecForLocale();
+       }
+
+       lyxerr[Debug::KEY] << "Using codec " << fromqstr(codec->name()) << endl;
+
+       if (!codec->canEncode(str)) {
+               lyxerr[Debug::KEY] << "Oof. Can't encode the text !" << endl;
+               return 0;
+       }
+
+       QCString tmpstr = codec->fromUnicode(str);
+       char const * tmpcstr = tmpstr;
+       return tmpcstr[0];
+}
+
+}
+
+
+void initEncodings()
+{
+       // when no document open
+       encoding_map[""] = QTextCodec::codecForLocale();
+
+       encoding_map["iso8859-1"] = QTextCodec::codecForName("ISO 8859-1");
+       encoding_map["iso8859-2"] = QTextCodec::codecForName("ISO 8859-2");
+       encoding_map["iso8859-3"] = QTextCodec::codecForName("ISO 8859-3");
+       encoding_map["iso8859-4"] = QTextCodec::codecForName("ISO 8859-4");
+       encoding_map["iso8859-5"] = QTextCodec::codecForName("ISO 8859-5");
+       encoding_map["iso8859-6"] = QTextCodec::codecForName("ISO 8859-6");
+       encoding_map["iso8859-7"] = QTextCodec::codecForName("ISO 8859-7");
+       encoding_map["iso8859-9"] = QTextCodec::codecForName("ISO 8859-9");
+       encoding_map["iso8859-15"] = QTextCodec::codecForName("ISO 8859-15");
+       encoding_map["cp1255"] = QTextCodec::codecForName("CP 1255");
+       encoding_map["cp1251"] = QTextCodec::codecForName("CP 1251");
+       encoding_map["koi8"] = QTextCodec::codecForName("KOI8-R");
+       encoding_map["koi8-u"] = QTextCodec::codecForName("KOI8-U");
+
+       // FIXME
+       encoding_map["tis620-0"] = 0;
+       encoding_map["pt154"] = 0;
+
+       // There are lots more codecs in Qt too ...
+}
 
 
 QLyXKeySym::QLyXKeySym()
@@ -81,9 +149,9 @@
 }
 
 
-char QLyXKeySym::getISOEncoded() const
+char QLyXKeySym::getISOEncoded(string const & encoding) const
 {
-       unsigned char const c = fromqstr(text_)[0];
+       unsigned char const c = encode(encoding, text_);
        lyxerr[Debug::KEY] << "ISOEncoded returning value " << int(c) << endl;
        return c;
 }
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 22:05:32 -0000
@@ -58,7 +58,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(string const & encoding) const;
        ///
        int key() const {
                return key_;
Index: frontends/qt2/lyx_gui.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/lyx_gui.C,v
retrieving revision 1.26
diff -u -r1.26 lyx_gui.C
--- frontends/qt2/lyx_gui.C     18 Dec 2002 14:24:32 -0000      1.26
+++ frontends/qt2/lyx_gui.C     19 Dec 2002 22:05:38 -0000
@@ -79,10 +79,14 @@
 // FIXME: wrong place !
 LyXServer * lyxserver;
 
+// in QLyXKeySym.C
+extern void initEncodings();
+
 #ifdef Q_WS_X11
 extern bool lyxX11EventFilter(XEvent * xev);
 #endif
 
+
 class LQApplication : public QApplication
 {
 public:
@@ -93,13 +97,16 @@
 #endif
 };
 
+
 LQApplication::LQApplication(int &argc, char **argv)
        : QApplication( argc, argv )
 {}
 
+
 LQApplication::~LQApplication()
 {}
 
+
 void lyx_gui::parse_init(int & argc, char * argv[])
 {
        static LQApplication a(argc, argv);
@@ -111,6 +118,8 @@
 
        // needs to be done before reading lyxrc
        lyxrc.dpi = getDPI();
+
+       initEncodings();
 }
 
 
Index: frontends/xforms/XLyXKeySym.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/XLyXKeySym.C,v
retrieving revision 1.5
diff -u -r1.5 XLyXKeySym.C
--- frontends/xforms/XLyXKeySym.C       20 Oct 2002 01:48:28 -0000      1.5
+++ frontends/xforms/XLyXKeySym.C       19 Dec 2002 22:05:42 -0000
@@ -69,7 +69,7 @@
 }
 
 
-char XLyXKeySym::getISOEncoded() const
+char XLyXKeySym::getISOEncoded(string const &) const
 {
        if (keysym_ == NoSymbol) {
                return 0;
Index: frontends/xforms/XLyXKeySym.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/XLyXKeySym.h,v
retrieving revision 1.5
diff -u -r1.5 XLyXKeySym.h
--- frontends/xforms/XLyXKeySym.h       20 Oct 2002 01:48:28 -0000      1.5
+++ frontends/xforms/XLyXKeySym.h       19 Dec 2002 22:05:42 -0000
@@ -47,7 +47,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(string const & encoding) const;
 
        ///
        unsigned int keysym() const {

-- 
"ALL television is children's television."
        - Richard Adler 

Reply via email to