summaryrefslogtreecommitdiff
path: root/src/keymap_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-10-25 00:01:17 +0100
committerMaxime Coste <frrrwww@gmail.com>2013-10-25 00:30:46 +0100
commit2c09da50be80dbaf484682689bfd1a685d601573 (patch)
tree6fe5efc4ef6ff1c379c388de48fdc0dd96b79981 /src/keymap_manager.cc
parent77ac777526a6a05c2d2027e30c0bbcf9720ad5b7 (diff)
Add key mapping support
Diffstat (limited to 'src/keymap_manager.cc')
-rw-r--r--src/keymap_manager.cc45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/keymap_manager.cc b/src/keymap_manager.cc
new file mode 100644
index 00000000..71f936fd
--- /dev/null
+++ b/src/keymap_manager.cc
@@ -0,0 +1,45 @@
+#include "keymap_manager.hh"
+
+namespace std
+{
+
+template<> struct hash<Kakoune::KeymapMode>
+{
+ size_t operator()(Kakoune::KeymapMode val) const
+ {
+ return hash<int>{}((int)val);
+ }
+};
+
+}
+
+namespace Kakoune
+{
+
+void KeymapManager::map_key(Key key, KeymapMode mode, std::vector<Key> mapping)
+{
+ m_mapping[{key, mode}] = mapping;
+}
+
+void KeymapManager::unmap_key(Key key, KeymapMode mode)
+{
+ m_mapping.erase({key, mode});
+}
+
+
+bool KeymapManager::is_mapped(Key key, KeymapMode mode) const
+{
+ return m_mapping.find({key, mode}) != m_mapping.end() or
+ (m_parent and m_parent->is_mapped(key, mode));
+}
+
+memoryview<Key> KeymapManager::get_mapping(Key key, KeymapMode mode) const
+{
+ auto it = m_mapping.find({key, mode});
+ if (it != m_mapping.end())
+ return { it->second };
+ kak_assert(m_parent);
+ return m_parent->get_mapping(key, mode);
+}
+
+}