]> git.lyx.org Git - lyx.git/blobdiff - src/kbmap.h
Convert shortcut strings to unicode (required by Qt/Mac); restore
[lyx.git] / src / kbmap.h
index 015bce9c3713953403cf45c60c103e6f1a1ab806..029a4e1b4eafcf406187ddd9b9eb132a77629a3d 100644 (file)
 // -*- 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
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Lars Gullik Bjønnes
+ * \author Jean-Marc Lasgouttes
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
+ */
 
 #ifndef KBMAP_H
 #define KBMAP_H
 
-#ifdef __GNUG__
-#pragma interface
-#endif
+#include "funcrequest.h"
 
-#include <list>
+#include "frontends/key_state.h"
+#include "frontends/LyXKeySym.h"
 
-#include "LString.h"
+#include "support/docstream.h"
+
+#include <boost/shared_ptr.hpp>
+
+#include <vector>
+#include <deque>
+
+
+namespace lyx {
 
 class kb_sequence;
 
 /// Defines key maps and actions for key sequences
 class kb_keymap {
 public:
-       ///
-       ~kb_keymap();
-       
-       /** Bind a key-sequence to an action.
-           Returns 0 on success. Otherwise, position in string where
-           error occured. */
-       int 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.
+        * See kb_sequence::parse for the syntax of the seq string
+        */
+       std::string::size_type bind(std::string const & seq, FuncRequest const & func);
+
+       // Parse a bind file
+       bool read(std::string const & bind_file);
+
+       /// print all available keysyms
+       docstring 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_COMMAND_PREFIX / LFUN_UNKNOWN_ACTION
+        */
+       FuncRequest const &
+       lookup(LyXKeySymPtr key,
+              key_modifier::state mod, kb_sequence * seq) const;
 
        ///
-       void print(string & buf) const;
-       
-       /// Look up a key in the keymap
-       int lookup(unsigned int key,
-                  unsigned int mod, kb_sequence * seq) const;
+       typedef std::deque<kb_sequence> Bindings;
 
        /// Given an action, find all keybindings.
-       string const findbinding(int action) const;
+       Bindings findbindings(FuncRequest const & func) const;
+
+       /// Given an action, print the keybindings.
+       docstring const printbindings(FuncRequest const & func) const;
+
+       /**
+        *  Given an action, find the first 1-key binding (if it exists).
+        *  The LyXKeySym pointer is 0 is no key is found.
+        *  [only used by the Qt/Mac frontend]
+        */
+       std::pair<LyXKeySym const *, key_modifier::state>
+       find1keybinding(FuncRequest const & func) const;
+
+
+       /**
+        * Returns a string of the given keysym, with modifiers.
+        * @param key the key as a keysym
+        * @param mod the modifiers
+        */
+       static std::string const printKeySym(LyXKeySym const & key,
+                                            key_modifier::state mod);
+
+       typedef std::pair<key_modifier::state, key_modifier::state> modifier_pair;
+
 private:
        ///
        struct kb_key {
                /// Keysym
-               unsigned int code;
-               
+               LyXKeySymPtr code;
+
                /// Modifier masks
-               unsigned int mod;
-               
+               modifier_pair mod;
+
                /// Keymap for prefix keys
-               kb_keymap * table;
-               
+               boost::shared_ptr<kb_keymap> table;
+
                /// Action for !prefix keys
-               int action;
+               FuncRequest func;
        };
 
+       /**
+        * Define an action for a key sequence.
+        * @param r internal recursion level
+        */
+       void defkey(kb_sequence * seq, FuncRequest const & func,
+                   unsigned int r = 0);
 
-       /// Define a new key sequence
-       int defkey(kb_sequence * seq, int action, int idx = 0);
-       ///
-       static string const keyname(kb_key const & k);
-       
-       ///
-       static
-       void printKey(kb_key const & key, string & buf);
-       ///
+       ///  Returns a string of the given key
+       docstring const printKey(kb_key const & key) const;
+
+       /**
+        * Given an action, find all keybindings
+        * @param func the action
+        * @param prefix a sequence to prepend the results
+        */
+       Bindings findbindings(FuncRequest const & func,
+                             kb_sequence const & prefix) const;
+
+       /// is the table empty ?
        bool empty() const {
                return table.empty();
        }
        ///
-       typedef std::list<kb_key> Table;
+       typedef std::vector<kb_key> Table;
        ///
        Table table;
 };
 
-#endif
+/// Implementation is in lyx_main.C
+extern kb_keymap & theTopLevelKeymap();
+
+
+} // namespace lyx
+
+#endif // KBMAP_H