X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fkbmap.h;h=482ab6c10db3d21f2e081363c2f193bff9e8da19;hb=8555881d19d77b32315661699fab31a82d3833ab;hp=3cb9a69f299bffbd7d68f9294bf91ffd649e21cf;hpb=7c6267e4b10364cc892776e0a426eb32ade6b0b4;p=lyx.git diff --git a/src/kbmap.h b/src/kbmap.h index 3cb9a69f29..482ab6c10d 100644 --- a/src/kbmap.h +++ b/src/kbmap.h @@ -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 + * \author John Levon + */ #ifndef KBMAP_H #define KBMAP_H @@ -13,158 +15,85 @@ #pragma interface #endif -#include - #include "LString.h" +#include "frontends/key_state.h" +#include "frontends/LyXKeySym.h" -#define NO_HASH 1 +#include -#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 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 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 Table; /// - unsigned int staticmod[KB_PREALLOC]; - - /// Physically allocated storage size - int size; + Table table; }; -#endif +#endif // KBMAP_H