]> git.lyx.org Git - lyx.git/blobdiff - src/kbsequence.C
Fix event loop to no longer eat CPU
[lyx.git] / src / kbsequence.C
index 0933d0b1bf1011ae52aab6adde43f47af831a422..0d701cdb28ea982ad740bf828fecd98f9f4d7287 100644 (file)
@@ -1,54 +1,51 @@
-/* This file is part of
- * ======================================================
+/**
+ * \file kbsequence.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- *           LyX, The Document Processor
- *     
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2001 The LyX Team.
+ * \author Lars Gullik Bjønnes
+ * \author Jean-Marc Lasgouttes
+ * \author John Levon
  *
- * ====================================================== */
+ * Full author contact details are available in file CREDITS.
+ */
 
 #include <config.h>
-//#include <cstring>
-#include <X11/Xlib.h>
-
-#include "gettext.h"
-
-#ifdef __GNUG__
-#pragma implementation
-#endif
 
 #include "kbsequence.h"
+
+#include "gettext.h"
 #include "kbmap.h"
-#include "debug.h"
+#include "lfuns.h"
 
-using std::endl;
+#include "frontends/LyXKeySym.h"
+#include "frontends/LyXKeySymFactory.h"
 
-// The only modifiers that we handle. We want to throw away things
-// like NumLock.
-enum { ModsMask = ShiftMask | ControlMask | Mod1Mask };
+using std::make_pair;
+using std::string;
 
 
-kb_action kb_sequence::addkey(unsigned int key, unsigned int mod)
+FuncRequest const &
+kb_sequence::addkey(LyXKeySymPtr key,
+                   key_modifier::state mod, key_modifier::state nmod)
 {
        // adding a key to a deleted sequence
        // starts a new sequence
        if (deleted_) {
                deleted_ = false;
-               length_ = 0;
                sequence.clear();
                modifiers.clear();
        }
 
-       modifiers.push_back(mod);
+       modifiers.push_back(make_pair(mod, nmod));
        sequence.push_back(key);
-       ++length_;
 
        if (curmap) {
                return curmap->lookup(key, mod, this);
        }
-       
-       return LFUN_UNKNOWN_ACTION;
+
+       static FuncRequest unknown(LFUN_UNKNOWN_ACTION);
+       return unknown;
 }
 
 
@@ -57,25 +54,27 @@ string::size_type kb_sequence::parse(string const & s)
        if (s.empty()) return 1;
 
        string::size_type i = 0;
-       unsigned int mod = 0;
+       key_modifier::state mod = key_modifier::none;
+       key_modifier::state nmod = key_modifier::none;
+
        while (i < s.length()) {
                if (s[i] == ' ')
                        ++i;
                if (i >= s.length())
                        break;
-               
+
                if (i + 1 < s.length() && s[i + 1] == '-') {
                        switch (s[i]) {
                        case 's': case 'S':
-                               mod |= ShiftMask;
+                               mod |= key_modifier::shift;
                                i += 2;
                                continue;
                        case 'c': case 'C':
-                               mod |= ControlMask;
+                               mod |= key_modifier::ctrl;
                                i += 2;
                                continue;
                        case 'm': case 'M':
-                               mod |= Mod1Mask;
+                               mod |= key_modifier::alt;
                                i += 2;
                                continue;
                        default:
@@ -85,12 +84,15 @@ string::size_type kb_sequence::parse(string const & s)
                           && s[i + 2] == '-') {
                        switch (s[i + 1]) {
                        case 's': case 'S':
+                               nmod |= key_modifier::shift;
                                i += 3;
                                continue;
                        case 'c': case 'C':
+                               nmod |= key_modifier::ctrl;
                                i += 3;
                                continue;
                        case 'm': case 'M':
+                               nmod |= key_modifier::alt;
                                i += 3;
                                continue;
                        default:
@@ -101,23 +103,23 @@ string::size_type kb_sequence::parse(string const & s)
                        string::size_type j = i;
                        for (; j < s.length() && s[j] != ' '; ++j)
                                tbuf += s[j];    // (!!!check bounds :-)
-                       
-                       KeySym key = XStringToKeysym(tbuf.c_str());
-                       if (key == NoSymbol) {
-                               lyxerr[Debug::KBMAP]
-                                       << "kbmap.C: No such keysym: "
-                                       << tbuf << endl;
+
+                       LyXKeySymPtr key(LyXKeySymFactory::create());
+                       key->init(tbuf);
+
+                       if ( ! key->isOK() ) {
                                return j;
                        }
+
                        i = j;
-                       
-                       addkey(key, mod);
-                       mod = 0;
+
+                       addkey(key, mod, nmod);
+                       mod = key_modifier::none;
                }
        }
-       
+
        // empty sequence?
-       if (!length_)
+       if (sequence.size() == 0)
                return 0;
 
        // everything is fine
@@ -129,14 +131,16 @@ string const kb_sequence::print() const
 {
        string buf;
 
-       if (deleted_)
-               return buf;
-       
-       for (std::vector<unsigned int>::size_type i = 0; i < length_; ++i) {
-               buf += kb_keymap::printKeysym(sequence[i], modifiers[i] & 0xffff);
+       //if (deleted_)
+       //      return buf;
+
+       KeySequence::size_type i, length = sequence.size();
+
+       for (i = 0; i < length; ++i) {
+               buf += sequence[i]->print(modifiers[i].first);
 
                // append a blank
-               if (i + 1 < length_) {
+               if (i + 1 < length) {
                        buf += ' ';
                }
        }
@@ -149,7 +153,7 @@ string const kb_sequence::printOptions() const
        string buf;
 
        buf += print();
-       
+
        if (!curmap)
                return buf;
 
@@ -165,26 +169,6 @@ void kb_sequence::mark_deleted()
 }
 
 
-unsigned int kb_sequence::getsym() const
-{
-       if (length_ == 0) return NoSymbol;
-       return sequence[length_ - 1];
-}
-
-
-char kb_sequence::getiso() const
-{
-       unsigned int const c = getsym();
-
-       lyxerr[Debug::KBMAP] << "Raw keysym: "
-                            << std::hex << c << std::dec << endl;
-       lyxerr[Debug::KBMAP] << "byte 3: "
-                            << std::hex << (c & 0xff00) << std::dec
-                            << endl;
-       return kb_keymap::getiso(c);
-}
-
-
 void kb_sequence::reset()
 {
        mark_deleted();
@@ -193,6 +177,6 @@ void kb_sequence::reset()
 
 void kb_sequence::clear()
 {
-       length_ = 0;
+       sequence.clear();
        reset();
 }