]> git.lyx.org Git - features.git/commitdiff
kb3 patch from John
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 30 Nov 2001 13:25:38 +0000 (13:25 +0000)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 30 Nov 2001 13:25:38 +0000 (13:25 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@3120 a592a061-630c-0410-9148-cb99ea01b6c8

14 files changed:
src/ChangeLog
src/LyXAction.C
src/LyXAction.h
src/Painter.C
src/WorkArea.C
src/frontends/xforms/Menubar_pimpl.C
src/kbmap.C
src/kbmap.h
src/kbsequence.C
src/kbsequence.h
src/lyxfunc.C
src/lyxfunc.h
src/lyxrc.C
src/tabular.C

index b82401af6f6561fe95b73b1a155f0e098c173921..0eca8616166b655a91f142ebb2de3798810cd214 100644 (file)
@@ -1,3 +1,18 @@
+2001-11-26  John Levon  <moz@compsoc.man.ac.uk>
+
+       * LyXAction.h:
+       * LyXAction.C:
+       * lyxfunc.h:
+       * lyxfunc.C:
+       * kbmap.h:
+       * kbmap.C:
+       * lyxrc.C:
+       * kbsequence.h:
+       * kbsequence.C: part re-write of old kb code
+
+       * Painter.C:
+       * WorkArea.C: remove Lgb_bug_find_hack
+
 2001-11-30  José Matos <jamatos@fep.up.pt>
 
        * buffer.C (makeDocBookFile): add a comment to point a hack.
index 6986dab36bc8aafd699f846cfc4d3e174b4198e4..a9df467c776a7ef5ceca1b27e6c6d608cc95fe34 100644 (file)
@@ -445,7 +445,7 @@ LyXAction::LyXAction()
 
 // Search for an existent pseudoaction, return LFUN_UNKNOWN_ACTION
 // if it doesn't exist.
-int LyXAction::searchActionArg(kb_action action, string const & arg) const
+kb_action LyXAction::searchActionArg(kb_action action, string const & arg) const
 {
        arg_map::const_iterator pit = lyx_arg_map.find(action);
 
@@ -473,7 +473,7 @@ int LyXAction::searchActionArg(kb_action action, string const & arg) const
                              << action << '|' 
                              << arg << "] = " << aci->second << endl;
 
-       return aci->second;
+       return kb_action(aci->second);
 }
 
 
index 9c4d4c1d12a5453f9ae4cb42b02bbf905e6f02c9..c48d599e226be5da25cf891ee0a0b315746c7b16 100644 (file)
@@ -83,7 +83,7 @@ public:
        kb_action retrieveActionArg(int i, string & arg) const;
     
        /// Search for an existent pseudoaction, return -1 if it doesn't exist.
-       int searchActionArg(kb_action action, string const & arg) const;
+       kb_action searchActionArg(kb_action action, string const & arg) const;
 
        /// Check if a value is a pseudo-action. 
        bool isPseudoAction(int) const;
index 7726af8365595f21c12e09335825bd8eef640cde..eac9623c3679c39edf8ba09dfec1b2f91f4e65a4 100644 (file)
@@ -47,18 +47,8 @@ Painter::Painter(WorkArea & wa)
 
 /* Basic drawing routines */
 
-extern bool Lgb_bug_find_hack;
-
 PainterBase & Painter::point(int x, int y, LColor::color c)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "point not called from "
-                               "workarea::workhandler\n";
-               lyxerr[Debug::INFO] << "Painter drawable: "
-                              << owner.getPixmap() << endl;
-       }
-       
        XDrawPoint(display, owner.getPixmap(),
                   lyxColorHandler->getGCForeground(c), x, y);
        return *this;
@@ -70,14 +60,6 @@ PainterBase & Painter::line(int x1, int y1, int x2, int y2,
                        enum line_style ls,
                        enum line_width lw)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "line not called from "
-                               "workarea::workhandler\n";
-               lyxerr[Debug::INFO] << "Painter drawable: "
-                              << owner.getPixmap() << endl;
-       }
-       
        XDrawLine(display, owner.getPixmap(), 
                  lyxColorHandler->getGCLinepars(ls, lw, col),
                  x1, y1, x2, y2);
@@ -90,14 +72,6 @@ PainterBase & Painter::lines(int const * xp, int const * yp, int np,
                             enum line_style ls,
                             enum line_width lw)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "lines not called from "
-                               "workarea::workhandler\n";
-               lyxerr[Debug::INFO] << "Painter drawable: "
-                              << owner.getPixmap() << endl;
-       }
-       
 #ifndef HAVE_AUTO_PTR
        XPoint * points = new XPoint[np];
 #else
@@ -124,14 +98,6 @@ PainterBase & Painter::rectangle(int x, int y, int w, int h,
                                 enum line_style ls,
                                 enum line_width lw)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "rectangle not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: "
-                      << owner.getPixmap() << endl;
-       }
-       
        XDrawRectangle(display, owner.getPixmap(),
                       lyxColorHandler->getGCLinepars(ls, lw, col), 
                       x, y, w, h);
@@ -142,14 +108,6 @@ PainterBase & Painter::rectangle(int x, int y, int w, int h,
 PainterBase & Painter::fillRectangle(int x, int y, int w, int h,
                                 LColor::color col)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "fillrectangle not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: "
-                      << owner.getPixmap() << endl;
-       }
-       
        XFillRectangle(display, owner.getPixmap(),
                       lyxColorHandler->getGCForeground(col), x, y, w, h);
        return *this;
@@ -159,13 +117,6 @@ PainterBase & Painter::fillRectangle(int x, int y, int w, int h,
 PainterBase & Painter::fillPolygon(int const * xp, int const * yp, int np,
                               LColor::color col)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr <<"fillpolygon not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: " << owner.getPixmap() << endl;
-       }
-       
 #ifndef HAVE_AUTO_PTR
        XPoint * points = new XPoint[np];
 #else
@@ -190,13 +141,6 @@ PainterBase & Painter::arc(int x, int y,
                  unsigned int w, unsigned int h,
                  int a1, int a2, LColor::color col)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "arc not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: " << owner.getPixmap() << endl;
-       }
-       
         XDrawArc(display, owner.getPixmap(),
                 lyxColorHandler->getGCForeground(col),
                  x, y, w, h, a1, a2);
@@ -210,13 +154,6 @@ PainterBase & Painter::segments(int const * x1, int const * y1,
                            LColor::color col,
                            enum line_style ls, enum line_width lw)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "segments not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: " << owner.getPixmap() << endl;
-       }
-       
 #ifndef HAVE_AUTO_PTR
        XSegment * s= new XSegment[ns];
 #else
@@ -239,13 +176,6 @@ PainterBase & Painter::segments(int const * x1, int const * y1,
 
 PainterBase & Painter::pixmap(int x, int y, int w, int h, Pixmap bitmap)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "workAreaExpose not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: " << owner.getPixmap() << endl;
-       }
-
        XGCValues val;
        val.function = GXcopy;
        GC gc = XCreateGC(display, owner.getPixmap(),
@@ -301,12 +231,6 @@ PainterBase & Painter::text(int x, int y, char const * s, size_t ls,
                return *this;
        }
 
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "text not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: " << owner.getPixmap() << endl;
-       }
        GC gc = lyxColorHandler->getGCForeground(f.realColor());
        if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
                lyxfont::XSetFont(display, gc, f);
@@ -344,12 +268,6 @@ PainterBase & Painter::text(int x, int y, char const * s, size_t ls,
 PainterBase & Painter::text(int x, int y, XChar2b const * s, int ls,
                        LyXFont const & f)
 {
-       if (lyxerr.debugging(Debug::GUI)) {
-               if (!Lgb_bug_find_hack)
-                       lyxerr << "text not called from "
-                               "workarea::workhandler\n";
-               lyxerr << "Painter drawable: " << owner.getPixmap() << endl;
-       }
        GC gc = lyxColorHandler->getGCForeground(f.realColor());
        if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
                lyxfont::XSetFont(display, gc, f);
index a6fc52ddb00c126d25551c5d4c823ec9cf4570a9..c70a8c720c76ac02867508af9d4ea7bfd3fe9bf8 100644 (file)
@@ -325,8 +325,6 @@ void WorkArea::scroll_cb(FL_OBJECT * ob, long)
 }
 
 
-bool Lgb_bug_find_hack = false;
-
 int WorkArea::work_area_handler(FL_OBJECT * ob, int event,
                                FL_Coord, FL_Coord ,
                                int key, void * xev)
@@ -347,9 +345,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event,
                        return 1;
                lyxerr[Debug::WORKAREA] << "Workarea event: DRAW" << endl;
                area->createPixmap(area->workWidth(), area->height());
-               Lgb_bug_find_hack = true;
                area->workAreaExpose();
-               Lgb_bug_find_hack = false;
                break;
        case FL_PUSH:
                if (!ev || ev->xbutton.button == 0) break;
index 2a8463860a1649a9ad8e87e743654dd5fe27de0e..53ab5c71252b94e8b6bba01f14d7b7d76d34d64b 100644 (file)
@@ -439,7 +439,7 @@ int Menubar::Pimpl::create_submenu(Window win, LyXView * view,
 
                        // Get the keys bound to this action, but keep only the
                        // first one later
-                       string const accel = toplevel_keymap->findbinding(item.action());
+                       string const accel = toplevel_keymap->findbinding(kb_action(item.action()));
                        // Build the menu label from all the info
                        string label = item.label();
 
index 8b528c49f1d046bae6fb066cd8b101b692dcbc66..7a147621d801f04f33d16b91f9968ea751cb8a10 100644 (file)
@@ -1,8 +1,8 @@
 /* This file is part of
- * ====================================================== 
- * 
+ * ======================================================
+ *
  *           LyX, The Document Processor
- *      
+ *     
  *           Copyright 1995 Matthias Ettrich
  *           Copyright 1995-2001 The LyX Team.
  *
@@ -10,7 +10,6 @@
 
 #include <config.h>
 
-//#include <cstring>
 #include <X11/Xlib.h>
 
 #ifdef __GNUG__
 using std::endl;
 
 // The only modifiers that we handle. We want to throw away things
-// like NumLock. 
+// like NumLock.
 enum { ModsMask = ShiftMask | ControlMask | Mod1Mask };
 
 
-// === static functions =================================================== 
-
-
-/* ---F+------------------------------------------------------------------ *\
-   Function  : printKeysym
-   Called by : kb_sequence::print and printKeyMap. RVDK_PATCH_5
-   Purpose   : prints a keysym, including modifiers.
-   Parameters: key    - keysym
-               mod    - modifiers
-               buf    - string where the result goes
-              maxlen - length of string (including '\0')
-   Returns   : length of printed string if ok, 0 otherwise.
-\* ---F------------------------------------------------------------------- */
-void printKeysym(unsigned int key, unsigned int mod, string & buf)
+string const kb_keymap::printKeysym(unsigned int key, unsigned int mod)
 {
+       string buf;
        mod &= ModsMask;
 
        char const * const s = XKeysymToString(key);
@@ -51,27 +38,40 @@ void printKeysym(unsigned int key, unsigned int mod, string & buf)
        if (mod & ControlMask) buf += "C-";
        if (mod & Mod1Mask) buf += "M-";
        if (s) buf += s;
+       return buf;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-   Function  : printKeyTab
-   Called by : kb_keymap::print
-   Purpose   : print the keysyms found in the given key table. RVDK_PATCH_5
-   Parameters: tabPt  - keytable pointer
-               buf    - string where the result goes
-               maxLen - length of string (including '\0')
-   Returns   : length of printed string.
-\* ---F------------------------------------------------------------------- */
+char kb_keymap::getiso(unsigned int c)
+{
+       switch (c & 0x0000FF00) {
+               // latin 1 byte 3 = 0
+       case 0x00000000: break;
+               // latin 2 byte 3 = 1
+       case 0x00000100:
+               // latin 3 byte 3 = 2
+       case 0x00000200:
+               // latin 4 byte 3 = 3
+       case 0x00000300:
+               // latin 8 byte 3 = 18 (0x12)
+       case 0x00001200:
+               // latin 9 byte 3 = 19 (0x13)
+       case 0x00001300:
+               c &= 0x000000FF;
+               break;
+       default:
+               c = 0;
+       }
+       return c;
+}
 
-void kb_keymap::printKey(kb_key const & key, string & buf)
+string const kb_keymap::printKey(kb_key const & key) const
 {
-       printKeysym(key.code, key.mod & 0xffff, buf);
+       return printKeysym(key.code, key.mod & 0xffff);
 }
 
 
-// This binds a key to an action
-string::size_type kb_keymap::bind(string const & seq, int action)
+string::size_type kb_keymap::bind(string const & seq, kb_action action)
 {
        if (lyxerr.debugging(Debug::KBMAP)) {
                lyxerr << "BIND: Sequence `"
@@ -79,39 +79,30 @@ string::size_type kb_keymap::bind(string const & seq, int action)
                       << action << "'" << endl;
        }
        
-       kb_sequence k;
+       kb_sequence k(0, 0);
 
        string::size_type const res = k.parse(seq);
        if (res == string::npos) {
                defkey(&k, action);
-       } else
+       } else {
                lyxerr[Debug::KBMAP] << "Parse error at position " << res
                                     << " in key sequence '" << seq << "'."
                                     << endl;
+       }
+
        return res;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_keymap::lookup
-    Called by : [user], kb_sequence::add()
-    Purpose   : look up a key press in a given keymap
-    Parameters: key - the keysym of the key press
-                mod - the modifier mask of the keypress
-                seq - the key-sequence retrieved so far
-    Returns   : user defined action; 0 for prefix key, -1 if key not found
-\* ---F------------------------------------------------------------------- */
-
-int kb_keymap::lookup(unsigned int key,
+kb_action kb_keymap::lookup(unsigned int key,
                      unsigned int mod, kb_sequence * seq) const
 {
        if (table.empty()) {
                seq->curmap = seq->stdmap;
-               seq->delseq();
-               return -1;
+               seq->mark_deleted();
+               return LFUN_UNKNOWN_ACTION;
        }
 
-       //unsigned int msk1, msk0;
        //suppress modifier bits we do not handle
        mod &= ModsMask;
 
@@ -120,15 +111,15 @@ int kb_keymap::lookup(unsigned int key,
                unsigned int const msk1 = cit->mod & 0xffff;
                unsigned int const msk0 = (cit->mod >> 16) & 0xffff;
                if (cit->code == key && (mod & ~msk0) == msk1) {
-                       // math found:
+                       // match found
                        if (cit->table.get()) {
                                // this is a prefix key - set new map
                                seq->curmap = cit->table.get();
-                               return 0;
+                               return LFUN_PREFIX;
                        } else {
                                // final key - reset map
                                seq->curmap = seq->stdmap;
-                               seq->delseq();
+                               seq->mark_deleted();
                                return cit->action;
                        }
                }
@@ -136,105 +127,73 @@ int kb_keymap::lookup(unsigned int key,
 
        // error - key not found:
        seq->curmap = seq->stdmap;
-       seq->delseq();
-       return -1;
+       seq->mark_deleted();
+       return LFUN_UNKNOWN_ACTION;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_keymap::print
-    Called by : [user]
-    Purpose   : Prints all the available keysyms. RVDK_PATCH_5
-    Parameters: buf    - string where output goes.
-               maxLen - available length in string, including `\0'.
-    Returns   : updated maxLen.
-\* ---F------------------------------------------------------------------- */
-
-void kb_keymap::print(string & buf) const
+string const kb_keymap::print() const
 {
+       string buf;
        for (Table::const_iterator cit = table.begin();
             cit != table.end(); ++cit) {
-               printKey((*cit), buf);
+               buf += printKey((*cit));
                buf += ' ';
        }
+       return buf;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_keymap::defkey
-    Called by : [user]
-    Purpose   : define an action for a key sequence
-    Parameters: seq    - the key sequence
-                action - the action to be defined
-                idx    - recursion depth
-    Returns   : 0 if ok.
-\* ---F------------------------------------------------------------------- */
-
-int kb_keymap::defkey(kb_sequence * seq, int action, int idx /*= 0*/)
+void kb_keymap::defkey(kb_sequence * seq, kb_action action, unsigned int r)
 {
-       unsigned int const code = seq->sequence[idx];
-       if (code == NoSymbol) return -1;
+       unsigned int const code = seq->sequence[r];
+       if (code == NoSymbol) return;
 
-       unsigned int const modmsk = seq->modifiers[idx];
+       unsigned int const modmsk = seq->modifiers[r];
 
-       // --- check if key is already there --------------------------------
-       if (table.size() != 0) { // without this I get strange crashes
-               Table::iterator end = table.end();
-       for (Table::iterator it = table.begin(); it != end; ++it) {
+       // check if key is already there
+       for (Table::iterator it = table.begin(); it != table.end(); ++it) {
                if (code == it->code && modmsk == it->mod) {
                        // overwrite binding
-                       if (idx + 1 == seq->length) {
-                               string buf;
-                               seq->print(buf, true);
+                       if (r + 1 == seq->length()) {
                                lyxerr[Debug::KBMAP]
                                        << "Warning: New binding for '"
-                                       << buf
+                                       << seq->print()
                                        << "' is overriding old binding..."
                                        << endl;
-                               if (it->table.get()) {
+                                       if (it->table.get()) {
                                        it->table.reset(0);
                                }
                                it->action = action;
-                               return 0;
+                               return;
                        } else if (!it->table.get()) {
-                               string buf;
-                               seq->print(buf, true);
-                               lyxerr << "Error: New binding for '" << buf
+                               lyxerr << "Error: New binding for '" << seq->print()
                                       << "' is overriding old binding..."
-                                      << endl;
-                               return -1;
+                                              << endl;
+                               return;
                        } else {
-                               return it->table->defkey(seq, action,
-                                                        idx + 1);
+                               it->table->defkey(seq, action, r + 1);
+                               return;
                        }
                }
        }
-       }
        
        Table::iterator newone = table.insert(table.end(), kb_key());
        newone->code = code;
        newone->mod = modmsk;
-       if (idx + 1 == seq->length) {
+       if (r + 1 == seq->length()) {
                newone->action = action;
                newone->table.reset(0);
-               return 0;
+               return;
        } else {
                newone->table.reset(new kb_keymap);
-               return newone->table->defkey(seq, action, idx + 1);
+               newone->table->defkey(seq, action, r + 1);
+               return;
        }
 }
 
 
-string const kb_keymap::keyname(kb_key const & k)
-{
-       string buf;
-       printKeysym(k.code, k.mod, buf);
-       return buf;
-}
-
-
-// Finds a key for a keyaction, if possible
-string const kb_keymap::findbinding(int act, string const & prefix) const
+string const kb_keymap::findbinding(kb_action act, string const & prefix) const
 {
        string res;
        if (table.empty()) return res;
@@ -245,15 +204,13 @@ string const kb_keymap::findbinding(int act, string const & prefix) const
                if (cit->table.get()) {
                        res += cit->table->findbinding(act,
                                                       prefix
-                                                      + keyname((*cit))
+                                                      + printKey((*cit))
                                                       + " ");
                } else if (cit->action == act) {
                        res += "[";
-                       res += prefix + keyname((*cit));
+                       res += prefix + printKey((*cit));
                        res += "] ";
                }
        }
        return res;
 }
-
-/* === End of File: kbmap.C ============================================== */
index a21a66255802639cbb88123a4f369f9a40779a0e..27b62fd1eb9dca98bf9ed8a9bb1e38a76c429ce5 100644 (file)
@@ -16,6 +16,8 @@
 #include <list>
 #include <boost/smart_ptr.hpp>
 
+#include "commandtags.h"
+
 #include "LString.h"
 
 class kb_sequence;
@@ -23,21 +25,40 @@ class kb_sequence;
 /// Defines key maps and actions for key sequences
 class kb_keymap {
 public:
-       /** Bind a key-sequence to an action.
-           Returns 0 on success. Otherwise, position in string where
-           error occured. */
-       string::size_type bind(string const & seq, int action);
+       /**
+        * Bind a key sequence to an action.
+        * @return 0 on success, or position in string seq where error
+        * occurs.
+        */
+       string::size_type bind(string const & seq, kb_action action);
 
-       ///
-       void print(string & buf) const;
+       /// print all available keysyms
+       string const print() const;
        
-       /// Look up a key in the keymap
-       int lookup(unsigned int key,
-                  unsigned int mod, kb_sequence * seq) const;
+       /**
+        * Look up a key press in the keymap.
+        * @param key the keysym
+        * @param mod the modifiers
+        * @param seq the current key sequence so far
+        * @return the action / LFUN_PREFIX / LFUN_UNKNOWN_ACTION
+        */
+       kb_action lookup(unsigned int key,
+               unsigned int mod, kb_sequence * seq) const;
 
        /// Given an action, find all keybindings.
-       string const findbinding(int action,
+       string const findbinding(kb_action action,
                                 string const & prefix = string()) const;
+
+       /**
+        * Returns a string of the given keysym, with modifiers.
+        * @param key the key
+        * @param mod the modifiers
+        */
+       static string const printKeysym(unsigned int key, unsigned int mod);
+
+       /// return the ISO value of a keysym
+       static char getiso(unsigned int i);
+
 private:
        ///
        struct kb_key {
@@ -51,19 +72,20 @@ private:
                boost::shared_ptr<kb_keymap> table;
                
                /// Action for !prefix keys
-               int action;
+               kb_action action;
        };
 
 
-       /// Define a new key sequence
-       int defkey(kb_sequence * seq, int action, int idx = 0);
-       ///
-       static string const keyname(kb_key const & k);
+       /**
+        * Define an action for a key sequence.
+        * @param r internal recursion level
+        */
+       void defkey(kb_sequence * seq, kb_action action, unsigned int r = 0);
        
-       ///
-       static
-       void printKey(kb_key const & key, string & buf);
-       ///
+       ///  Returns a string of the given key
+       string const printKey(kb_key const & key) const;
+
+       /// is the table empty ?
        bool empty() const {
                return table.empty();
        }
index 7c661929c24b2dce3d9baa7c74cf1898a432cc4d..0933d0b1bf1011ae52aab6adde43f47af831a422 100644 (file)
@@ -1,8 +1,8 @@
 /* This file is part of
- * ====================================================== 
- * 
+ * ======================================================
+ *
  *           LyX, The Document Processor
- *      
+ *     
  *           Copyright 1995 Matthias Ettrich
  *           Copyright 1995-2001 The LyX Team.
  *
 using std::endl;
 
 // The only modifiers that we handle. We want to throw away things
-// like NumLock. 
+// like NumLock.
 enum { ModsMask = ShiftMask | ControlMask | Mod1Mask };
 
 
-// === static functions =================================================== 
-
-
-/* ---F+------------------------------------------------------------------ *\
-   Function  : printKeysym
-   Called by : kb_sequence::print and printKeyMap. RVDK_PATCH_5
-   Purpose   : prints a keysym, including modifiers.
-   Parameters: key    - keysym
-               mod    - modifiers
-               buf    - string where the result goes
-              maxlen - length of string (including '\0')
-   Returns   : length of printed string if ok, 0 otherwise.
-\* ---F------------------------------------------------------------------- */
-extern
-void printKeysym(unsigned int key, unsigned int mod, string & buf);
-
-
-// === kb_sequence methods ================================================ 
-
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_sequence::addkey
-    Called by : [user]
-    Purpose   : add a key to the sequence, look up in map and return action
-    Parameters: key  - keysym of key
-                mod  - modifier mask
-                nmod - modifier veto mask (unused now)
-    Returns   : action or -1 if error (no map defined or key not found)
-\* ---F------------------------------------------------------------------- */
-
-int kb_sequence::addkey(unsigned int key,
-                       unsigned int mod, unsigned int nmod /*= 0*/)
+kb_action kb_sequence::addkey(unsigned int key, unsigned int mod)
 {
-       //lyxerr << "kb_sequence::addkey: length is [" << length << "]\n"
-       //       << "kb_sequence::addkey::key == [" << key << "]\n"
-       //       << "kb_sequence::addkey::mod == [" << mod << "]" << endl;
-       
-       if (length <= 0) {
-               length = 0;
+       // 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 + (nmod << 16));
+       modifiers.push_back(mod);
        sequence.push_back(key);
-       ++length;
+       ++length_;
 
-       if (curmap)
+       if (curmap) {
                return curmap->lookup(key, mod, this);
+       }
        
-       return -1;
+       return LFUN_UNKNOWN_ACTION;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_sequence::parse
-    Called by : [user]
-    Purpose   : parse a string that holds a key sequence and add the keys
-    Parameters: s - string holding the key sequence
-    Returns   : string::npos if ok, error pos if error
-    Note      : Keys must be separated with whitespace;
-                Use the keysym names used by XStringToKeysym
-                Prefixes are S-, C-, M- for shift, control, meta
-\* ---F------------------------------------------------------------------- */
-
 string::size_type kb_sequence::parse(string const & s)
 {
        if (s.empty()) return 1;
 
        string::size_type i = 0;
-       unsigned int mod = 0, nmod = 0;
+       unsigned int mod = 0;
        while (i < s.length()) {
                if (s[i] == ' ')
                        ++i;
                if (i >= s.length())
                        break;
                
-               if (i + 1 < s.length() && s[i + 1] == '-')      {
+               if (i + 1 < s.length() && s[i + 1] == '-') {
                        switch (s[i]) {
                        case 's': case 'S':
                                mod |= ShiftMask;
@@ -126,15 +85,12 @@ string::size_type kb_sequence::parse(string const & s)
                           && s[i + 2] == '-') {
                        switch (s[i + 1]) {
                        case 's': case 'S':
-                               nmod |= ShiftMask;
                                i += 3;
                                continue;
                        case 'c': case 'C':
-                               nmod |= ControlMask;
                                i += 3;
                                continue;
                        case 'm': case 'M':
-                               nmod |= Mod1Mask;
                                i += 3;
                                continue;
                        default:
@@ -155,14 +111,13 @@ string::size_type kb_sequence::parse(string const & s)
                        }
                        i = j;
                        
-                       addkey(key, mod, nmod);
+                       addkey(key, mod);
                        mod = 0;
-                       nmod = 0;
                }
        }
        
        // empty sequence?
-       if (!length)
+       if (!length_)
                return 0;
 
        // everything is fine
@@ -170,103 +125,53 @@ string::size_type kb_sequence::parse(string const & s)
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_sequence::print
-    Called by : [user]
-    Purpose   : print the currently defined sequence into a string
-    Parameters: buf           - string where the result goes
-                when_defined  - only  print when sequence is real: length > 0.
-    Returns   : 0, if ok, -1 if string too long
-\* ---F------------------------------------------------------------------- */
-
-int kb_sequence::print(string & buf, bool when_defined) const
+string const kb_sequence::print() const
 {
-       //lyxerr << "kb_sequence::print: length is [" << length << "]" << endl;
-       
-       KeySym key;
-       unsigned int mod;
-       int l = length;
-       if (l < 0 && !when_defined ) l = -l;
-       
-       for (int i = 0; i < l; ++i) {
-               key = sequence[i];
-               mod = modifiers[i] & 0xffff;
-               //lyxerr << "kb_sequence::sequence[" << i << "] == [" << key << "]\n"
-               //       << "kb_sequence::modifiers[" << i << "] == [" << mod << "]"
-               //       << endl;
+       string buf;
 
-               printKeysym(key, mod, buf);  // RVDK_PATCH_5
+       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 (i + 1 < l) {  // append a blank
+               // append a blank
+               if (i + 1 < length_) {
                        buf += ' ';
                }
        }
-       return 0;
+       return buf;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_sequence::printOptions
-    Called by : [user]
-    Purpose   : print the available key options from the current state in the
-                sequence. RVDK_PATCH_5
-    Parameters: buf    - string where the result goes
-                maxlen - length of string (including '\0')
-    Returns   : 0, if ok, -1 if string too long
-\* ---F------------------------------------------------------------------- */
-
-int kb_sequence::printOptions(string & buf) const
+string const kb_sequence::printOptions() const
 {
-       print(buf, true);
+       string buf;
+
+       buf += print();
        
-       if (!curmap) return -1;
+       if (!curmap)
+               return buf;
+
        buf += _("   options: ");
-       curmap->print(buf);
-       return 0;
+       buf += curmap->print();
+       return buf;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_sequence::delseq
-    Called by : [user]
-    Purpose   : mark the sequence as deleted
-    Parameters: none
-    Returns   : nothing
-\* ---F------------------------------------------------------------------- */
-
-void kb_sequence::delseq()
+void kb_sequence::mark_deleted()
 {
-       // negative length marks sequence as deleted, but we can still
-       // print() it or retrieve the last char using getiso()
-       length = -length;
+       deleted_ = true;
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-   Function  : kb_sequence::getsym
-   Called by : [user], getiso
-   Purpose   : get the keysym of the last key in sequence
-   Parameters: none
-   Returns   : keysym
-\* ---F------------------------------------------------------------------- */
-
 unsigned int kb_sequence::getsym() const
 {
-       int l = length;
-       if (l == 0) return NoSymbol;
-       if (l < 0) l = -l;
-       return sequence[l - 1];
+       if (length_ == 0) return NoSymbol;
+       return sequence[length_ - 1];
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_sequence::getiso
-    Called by : [user]
-    Purpose   : return iso character code of last key, if any
-    Parameters: none
-    Returns   : iso code or 0 if none
-\* ---F------------------------------------------------------------------- */
-
 char kb_sequence::getiso() const
 {
        unsigned int const c = getsym();
@@ -274,47 +179,20 @@ char kb_sequence::getiso() const
        lyxerr[Debug::KBMAP] << "Raw keysym: "
                             << std::hex << c << std::dec << endl;
        lyxerr[Debug::KBMAP] << "byte 3: "
-                            << std::hex << (c & 0x0000FF00) << std::dec
+                            << std::hex << (c & 0xff00) << std::dec
                             << endl;
-       
-       switch (c & 0x0000FF00) {
-               // latin 1 byte 3 = 0
-       case 0x00000000:
-               return c;
-               // latin 2 byte 3 = 1
-       case 0x00000100:
-               // latin 3 byte 3 = 2
-       case 0x00000200:
-               // latin 4 byte 3 = 3
-       case 0x00000300:
-               // latin 8 byte 3 = 18 (0x12)
-       case 0x00001200:
-               // latin 9 byte 3 = 19 (0x13)
-       case 0x00001300:
-               return c & 0x000000FF;
-       default:
-               return '\0';
-       }
-
-       // not a latin char we know of
-       // Yes but this is already handled above (JMarc)
-       //return '\0';
+       return kb_keymap::getiso(c);
 }
 
 
-/* ---F+------------------------------------------------------------------ *\
-    Function  : kb_sequence::reset
-    Called by : [user]
-    Purpose   : reset sequence to initial state. RVDK_PATCH_5
-    Parameters: none
-    Returns   : void
-\* ---F------------------------------------------------------------------- */
-
 void kb_sequence::reset()
 {
-       delseq();
+       mark_deleted();
        curmap = stdmap;
-       if (length > 0) length = -length;
 }
 
-/* === End of File: kbmap.C ============================================== */
+void kb_sequence::clear()
+{
+       length_ = 0;
+       reset();
+}
index 8ad1a5ae6adf548c1a8dbf1ff5745e33286594b0..f277ba83eecb9bf45f18f8f8137ac2d890e669ef 100644 (file)
@@ -1,10 +1,9 @@
 // -*- C++ -*-
-/* ======================================================================= *\
-   File   : kbmap.h, kbmap.h,v 1.3 1996/12/10 04:35:57 larsbj Exp
-   Author : chb, 30.Oct.1995
-   Docu   : see kbmap.C
-   Purpose: class definitions for XKeyEvent keymap handling
-   \* ==================================================================== */
+/**
+ * \file kbsequence.h
+ * Copyright 2001 the LyX Team
+ * Read the file COPYING
+ */
 
 #ifndef KBSEQUENCE_H
 #define KBSEQUENCE_H
 #include <vector>
 #include "LString.h"
 
+#include "commandtags.h"
+
 class kb_keymap;
 
 /// Holds a key sequence and the current and standard keymaps
 class kb_sequence {
 public:
+       friend class kb_keymap;
+
        ///
-       kb_sequence() {
-               stdmap = curmap = 0;
-               length = 0;
-       }
+       kb_sequence(kb_keymap * std, kb_keymap * cur)
+               : stdmap(std), curmap(cur), length_(0), deleted_(false) {}
 
-       /** Add a key to the key sequence and look it up in the curmap
-           if the latter is defined. */
-       int addkey(unsigned int key, unsigned int mod, unsigned int nmod = 0);
+       
 
-       ///
-       int print(string & buf, bool when_defined = false) const;
+       /**
+        * Add a key to the key sequence and look it up in the curmap
+        * if the latter is defined.
+        * @param mod modifier mask
+        * @return the action matching this key sequence or LFUN_UNKNOWN_ACTION
+        */
+       kb_action addkey(unsigned int key, unsigned int mod);
+
+       /**
+        * Add a sequence of keys from a string to the sequence
+        * @return string::npos if OK, else error position in string
+        *
+        * Keys in the string must be separated with whitespace;
+        * Use the keysym names used by XStringToKeysym
+        * Prefixes are S-, C-, M- for shift, control, meta
+        */
+       string::size_type parse(string const & s);
        
-        ///
-       int printOptions(string & buf) const;
+       /**
+        * Return the current sequence as a string.
+        * @see parse()
+        */
+       string const print() const;
        
-       /// Make length negative to mark the sequence as deleted
-       void delseq();
+       /**
+        * Return the current sequence and available options as
+        * a string. No options are added if no curmap kb map exists.
+        */
+       string const printOptions() const;
+       
+       /// Mark the sequence as deleted.
+       void mark_deleted();
 
-       ///
+       /// Return the ISO value of the last keysym in sequence, or 0
        char getiso() const;
        
-       ///
-       unsigned int getsym() const;
-       
-       ///
+       /// Reset sequence to become "deleted"
        void reset();
        
-       ///
-       string::size_type parse(string const & s);
-       
+       /// clear in full
+       void clear();
+
+       bool deleted() const {
+               return deleted_;
+       }
+
+       /// length of sequence
+       std::vector<unsigned int>::size_type length() const {
+               return length_;
+       }
+
        /// Keymap to use if a new sequence is starting
        kb_keymap * stdmap;
        
        /// Keymap to use for the next key
        kb_keymap * curmap;
        
-       /** Array holding the current key sequence.
-           If sequence[length-1] < 0xff it can be used as ISO8859 char */
+private:
+       /// get the keysym of last in sequence
+       unsigned int getsym() const;
+       
+       /**
+        * Array holding the current key sequence.
+        * If sequence[length-1] < 0xff it can be used as ISO8859 char
+        */
        std::vector<unsigned int> sequence;
        
-       ///
+       /// modifiers for keys in the sequence
        std::vector<unsigned int> modifiers;
        
        /// Current length of key sequence
-       int length;
+       std::vector<unsigned int>::size_type length_;
+
+       /// is keysequence deleted ?
+       bool deleted_;
 };
 
 #endif
index a8683531bec2a9ef9023daed39b8c91c13837338..e420b2c8fc95e7b07659b2650903ce6bb29ba23d 100644 (file)
@@ -160,12 +160,13 @@ bool LyXFunc::show_sc = true;
 
 
 LyXFunc::LyXFunc(LyXView * o)
-       : owner(o)
+       : owner(o),
+       keyseq(toplevel_keymap.get(), toplevel_keymap.get()),
+       cancel_meta_seq(toplevel_keymap.get(), toplevel_keymap.get())
 {
        meta_fake_bit = 0;
        lyx_dead_action = LFUN_NOACTION;
        lyx_calling_dead_action = LFUN_NOACTION;
-       setupLocalKeymap();
 }
 
 
@@ -204,14 +205,15 @@ void LyXFunc::handleKeyFunc(kb_action action)
 {
        char c = keyseq.getiso();
 
-       if (keyseq.length != -1) c = 0;
+       if (keyseq.length() > 1) {
+               c = 0;
+       }
        
        owner->getIntl()->getTrans()
                .deadkey(c, get_accent(action).accent, TEXT(false));
-       // Need to reset, in case the minibuffer calls these
+       // Need to clear, in case the minibuffer calls these
        // actions
-       keyseq.reset();
-       keyseq.length = 0;
+       keyseq.clear();
        // copied verbatim from do_accent_char
        owner->view()->update(TEXT(false),
               BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
@@ -281,14 +283,15 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
        // Dont remove this unless you know what you are doing.
        meta_fake_bit = 0;
                
-       if (action == 0) action = LFUN_PREFIX;
+       // can this happen now ? 
+       if (action == LFUN_NOACTION) {
+               action = LFUN_PREFIX;
+       }
 
        if (lyxerr.debugging(Debug::KEY)) {
-               string buf;
-               keyseq.print(buf);
                lyxerr << "Key [action="
                       << action << "]["
-                      << buf << "]"
+                      << keyseq.print() << "]"
                       << endl;
        }
 
@@ -296,13 +299,11 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
        // why not return already here if action == -1 and
        // num_bytes == 0? (Lgb)
 
-       if (keyseq.length > 1 || keyseq.length < -1) {
-               string buf;
-               keyseq.print(buf);
-               owner->message(buf);
+       if (keyseq.length() > 1 && !keyseq.deleted()) {
+               owner->message(keyseq.print());
        }
 
-       if (action == -1) {
+       if (action == LFUN_UNKNOWN_ACTION) {
                // It is unknown, but what if we remove all
                // the modifiers? (Lgb)
                action = keyseq.addkey(keysym, 0);
@@ -312,35 +313,18 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
                               << "Action now set to ["
                               << action << "]" << endl;
                }
-               if (action == -1) {
+               if (action == LFUN_UNKNOWN_ACTION) {
                        owner->message(_("Unknown function."));
                        return;
                }
        }
 
        if (action == LFUN_SELFINSERT) {
-               // This is very X dependant.
+               // This is very X dependent.
                unsigned int c = keysym;
                
-               switch (c & 0x0000FF00) {
-                       // latin 1 byte 3 = 0
-               case 0x00000000: break;
-                       // latin 2 byte 3 = 1
-               case 0x00000100:
-                       // latin 3 byte 3 = 2
-               case 0x00000200:
-                       // latin 4 byte 3 = 3
-               case 0x00000300:
-                       // latin 8 byte 3 = 18 (0x12)
-               case 0x00001200:
-                       // latin 9 byte 3 = 19 (0x13)
-               case 0x00001300:
-                       c &= 0x000000FF;
-                       break;
-               default:
-                       c = 0;
-                       break;
-               }
+               c = kb_keymap::getiso(c);
+
                if (c > 0)
                        argument = static_cast<char>(c);
                lyxerr[Debug::KEY] << "SelfInsert arg[`"
@@ -817,7 +801,7 @@ string const LyXFunc::dispatch(int ac,
        if (owner->view()->available() && owner->view()->theLockingInset()) {
                UpdatableInset::RESULT result;
                if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) &&
-                                    (keyseq.length >= -1)))
+                                    (!keyseq.deleted())))
                {
                        if ((action==LFUN_UNKNOWN_ACTION) && argument.empty()){
                                argument = keyseq.getiso();
@@ -994,9 +978,7 @@ string const LyXFunc::dispatch(int ac,
                        owner->view()->update(TEXT(),
                                              BufferView::SELECT|BufferView::FITCUR);
                }
-               string buf;
-               keyseq.print(buf, true);
-               owner->message(buf);
+               owner->message(keyseq.print());
        }
        break;
 
@@ -1024,9 +1006,7 @@ string const LyXFunc::dispatch(int ac,
        case LFUN_META_FAKE:                                 // RVDK_PATCH_5
        {
                meta_fake_bit = Mod1Mask;
-               string buf;
-               keyseq.print(buf, true);
-               setMessage(buf); // RVDK_PATCH_5
+               setMessage(keyseq.print());
        }
        break;  
 
@@ -1375,9 +1355,7 @@ string const LyXFunc::dispatch(int ac,
                
        case LFUN_NOTIFY:
        {
-               string buf;
-               keyseq.print(buf);
-               dispatch_buffer = buf;
+               dispatch_buffer = keyseq.print();
                lyxserver->notifyClient(dispatch_buffer);
        }
        break;
@@ -1635,7 +1613,7 @@ exit_with_message:
                        // for it in minibuffer
                        string comname = lyxaction.getActionName(action);
 
-                       int pseudoaction = action;
+                       kb_action pseudoaction = action;
                        bool argsadded = false;
 
                        if (!argument.empty()) {
@@ -2031,14 +2009,15 @@ void LyXFunc::initMiniBuffer()
        
        // When meta-fake key is pressed, show the key sequence so far + "M-".
        if (wasMetaKey()) {
-               keyseqStr();
+               text = keyseq.print();
                text += "M-";
        }
 
        // Else, when a non-complete key sequence is pressed,
        // show the available options.
-       else if (keyseqUncomplete()) 
-               text = keyseqOptions();
+       else if (keyseq.length() > 1) {
+               text = keyseq.printOptions();
+       }
    
        // Else, show the buffer state.
        else if (owner->view()->available()) {
index 6942650e1906291412a33bab54609e0619353d68..c76751e56651b8b858c1db919a821fbde6f52fa2 100644 (file)
@@ -55,17 +55,6 @@ public:
        /// The last key was meta
        bool wasMetaKey() const;
 
-       // These can't be global because are part of the
-       // internal state (ale970227)
-       /// Get the current keyseq string
-       string const keyseqStr() const;
-
-       /// Is the key sequence uncomplete?
-       bool keyseqUncomplete() const;
-
-       /// get options for the current keyseq
-       string const keyseqOptions() const;
-
         /// True if lyxfunc reports an error
         bool errorStat() const { return errorstat; }
         /// Buffer to store result messages
@@ -141,33 +130,6 @@ bool LyXFunc::wasMetaKey() const
 }
      
 
-inline
-string const LyXFunc::keyseqStr() const
-{
-       // Why not just remove this function
-       string text;
-       keyseq.print(text, true);
-       return text;
-} 
-
-
-inline
-string const LyXFunc::keyseqOptions() const
-{
-       // Why not just remove this function
-       string text;
-       keyseq.printOptions(text);
-       return text;
-} 
-
-
-inline
-bool LyXFunc::keyseqUncomplete() const
-{ 
-       return (keyseq.length > 0);
-}
-
-
 inline
 void LyXFunc::setHintMessage(bool hm) 
 { 
index cd89f42206781332f4a6d6a7e6c132dff46cb9b4..857c2d96f0ad7c4a75b050978da802a236109e21 100644 (file)
@@ -736,7 +736,7 @@ int LyXRC::read(string const & filename)
                                               << cmd << "' Action `"
                                               << action << '\'' << endl;
                                }
-                               res = toplevel_keymap->bind(seq, action);
+                               res = toplevel_keymap->bind(seq, kb_action(action));
                                if (res != string::npos
                                    && lyxerr.debugging(Debug::LYXRC)) {
                                        lexrc.printError(
index 1445ad1818e07dd13337623881ad1980f65c4e04..76f3135455ad047db8e862568406a9ff66741596 100644 (file)
@@ -2603,6 +2603,7 @@ int LyXTabular::Ascii(Buffer const * buf, ostream & os) const
 
 InsetText * LyXTabular::GetCellInset(int cell) const
 {
+       lyxerr << "LyXTabular::GetCellInset: cell=" << cell <<endl;
        cur_cell = cell;
        return & cell_info[row_of_cell(cell)][column_of_cell(cell)].inset;
 }