]> git.lyx.org Git - lyx.git/blobdiff - src/kbmap.h
fix keys to be unique
[lyx.git] / src / kbmap.h
index 3cb9a69f299bffbd7d68f9294bf91ffd649e21cf..482ab6c10db3d21f2e081363c2f193bff9e8da19 100644 (file)
@@ -1,10 +1,12 @@
 // -*- 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 kbmap.h
+ * Copyright 1995-2002 the LyX Team
+ * Read the file COPYING
+ *
+ * \author Lars Gullik Bjønnes <larsbj@lyx.org>
+ * \author John Levon <moz@compsoc.man.ac.uk>
+ */
 
 #ifndef KBMAP_H
 #define KBMAP_H
 #pragma interface
 #endif
 
-#include <X11/Xlib.h>
-
 #include "LString.h"
+#include "frontends/key_state.h"
+#include "frontends/LyXKeySym.h"
 
-#define NO_HASH 1
+#include <list>
 
-#define KB_PREALLOC  16
-#ifndef NO_HASH
-#define KB_HASHSIZE 128   // yes, yes - I know. 128 is not exactly prime :-)
-// ... but we are dealing with ASCII chars mostly.
-#endif
-class kb_keymap;
 class kb_sequence;
 
-///
-struct kb_key {
-       /// Keysym
-       unsigned int code;
-       
-       /// Modifier masks
-       unsigned int mod;
-       
-       /// Keymap for prefix keys
-       kb_keymap * table;
-       
-       /// Action for !prefix keys
-       int action;
-};
-
-
 /// Defines key maps and actions for key sequences
 class kb_keymap {
 public:
-       ///
-       kb_keymap() {
-               size = 0; 
-               table = 0;
-       }
-       ///
-       ~kb_keymap();
-       
-       /// Bind a key-sequence to an action
-       /** Returns 0 on success. Otherwise, position in string where
-           error occured. */
-       int bind(char const * seq, int action);
+       /**
+        * Bind a key sequence to an action.
+        * @return 0 on success, or position in string seq where error
+        * occurs.
+        * See kb_sequence::parse for the syntax of the seq string
+        */
+       string::size_type bind(string const & seq, int action);
 
-       ///
-       void print(string & buf) const;
-       
-       /// Look up a key in the keymap
-       int lookup(KeySym key, unsigned mod, kb_sequence * seq);
+       /// print all available keysyms
+       string const print() 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
+        */
+       int lookup(LyXKeySymPtr key,
+                  key_modifier::state mod, kb_sequence * seq) const;
 
        /// Given an action, find all keybindings.
-       string findbinding(int action) const;
+       string const findbinding(int action,
+                                string const & prefix = string()) const;
+
+       /**
+        * Returns a string of the given keysym, with modifiers.
+        * @param key the key as a keysym
+        * @param mod the modifiers
+        */
+       static string const printKeysym(LyXKeySymPtr key,
+                                       key_modifier::state mod);
+
+       typedef std::pair<key_modifier::state, key_modifier::state> modifier_pair;
+
 private:
-       /// Define a new key sequence
-       int defkey(kb_sequence * seq, int action, int idx = 0);
-       
-       /// Size of the table (<0: hashtab)
-       int size;
-       
-       /// Holds the defined keys
-       /** Both kinds of tables ends with NoSymbol */
-#ifndef NO_HASH
-       union
-       {
-#endif
-               /// Table for linear array
-               kb_key * table;
-#ifndef NO_HASH        
-               /// Hash table holding key lists
-               kb_key ** htable;
+       ///
+       struct kb_key {
+               /// Keysym
+               LyXKeySymPtr code;
+
+               /// Modifier masks
+               modifier_pair mod;
+
+               /// Keymap for prefix keys
+               boost::shared_ptr<kb_keymap> table;
+
+               /// Action for !prefix keys
+               int action;
        };
-#endif
-};
 
+       /**
+        * Define an action for a key sequence.
+        * @param r internal recursion level
+        */
+       void defkey(kb_sequence * seq, int action, unsigned int r = 0);
 
-/// Holds a key sequence and the current and standard keymaps
-class kb_sequence {
-public:
-       ///
-       kb_sequence() {
-               stdmap = curmap = 0;
-               sequence = staticseq;
-               modifiers = staticmod;
-               length = 0; 
-               size = KB_PREALLOC;
-       }
-       
-       ///
-       
-       
-       ///
-       ~kb_sequence()
-               {
-                       if (sequence != staticseq) {
-                               delete sequence;
-                               delete modifiers;
-                       }
-               }
-       
-       /// Add a key to the key sequence and look it up in the curmap
-       /** Add a key to the key sequence and look it up in the curmap
-           if the latter is defined. */
-       int addkey(KeySym key, unsigned mod, unsigned nmod = 0);
+       ///  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();
+       }
        ///
-       int print(string & buf, bool when_defined = false) const;
-       
-        ///
-       int printOptions(string & buf) const;
-       
-       /// Make length negative to mark the sequence as deleted
-       void delseq();
-       
-       ///
-       char getiso();
-       
-       ///
-       KeySym getsym();
-       
-       ///
-       void reset();
-       
-       ///
-       int parse(char const * s);
-       
-       /// 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 */
-       unsigned int * sequence;
-       
-       ///
-       unsigned int * modifiers;
-       
-       /// Current length of key sequence
-       int length;
-       
-private:
-       /// Static array preallocated for sequence
-       unsigned int staticseq[KB_PREALLOC];
-       
+       typedef std::list<kb_key> Table;
        ///
-       unsigned int staticmod[KB_PREALLOC];
-       
-       /// Physically allocated storage size
-       int size;
+       Table table;
 };
 
-#endif
+#endif // KBMAP_H