Update Russian translation (#3918)
[geany-mirror.git] / scintilla / src / KeyMap.cxx
blobda4f242a4ec79ab89ae77a80e696abba82b457a3
1 // Scintilla source code edit control
2 /** @file KeyMap.cxx
3 ** Defines a mapping between keystrokes and commands.
4 **/
5 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
8 #include <cstdlib>
10 #include <stdexcept>
11 #include <string_view>
12 #include <vector>
13 #include <map>
14 #include <optional>
15 #include <memory>
17 #include "ScintillaTypes.h"
18 #include "ScintillaMessages.h"
20 #include "Debugging.h"
21 #include "Geometry.h"
22 #include "Platform.h"
24 #include "KeyMap.h"
26 using namespace Scintilla;
27 using namespace Scintilla::Internal;
29 KeyMap::KeyMap() {
30 for (int i = 0; static_cast<int>(MapDefault[i].key); i++) {
31 AssignCmdKey(MapDefault[i].key,
32 MapDefault[i].modifiers,
33 MapDefault[i].msg);
37 void KeyMap::Clear() noexcept {
38 kmap.clear();
41 void KeyMap::AssignCmdKey(Keys key, KeyMod modifiers, Message msg) {
42 kmap[KeyModifiers(key, modifiers)] = msg;
45 Message KeyMap::Find(Keys key, KeyMod modifiers) const {
46 std::map<KeyModifiers, Message>::const_iterator it = kmap.find(KeyModifiers(key, modifiers));
47 return (it == kmap.end()) ? static_cast<Message>(0) : it->second;
50 const std::map<KeyModifiers, Message> &KeyMap::GetKeyMap() const noexcept {
51 return kmap;
54 #if PLAT_GTK_MACOSX
55 #define OS_X_KEYS 1
56 #else
57 #define OS_X_KEYS 0
58 #endif
60 // Define a modifier that is exactly Ctrl key on all platforms
61 // Most uses of Ctrl map to Cmd on macOS but some can't so use SCI_[S]CTRL_META
62 #if OS_X_KEYS
63 #define SCI_CTRL_META SCI_META
64 #define SCI_SCTRL_META (SCI_META | SCI_SHIFT)
65 #else
66 #define SCI_CTRL_META SCI_CTRL
67 #define SCI_SCTRL_META (SCI_CTRL | SCI_SHIFT)
68 #endif
70 namespace {
72 constexpr Keys Key(char ch) noexcept {
73 return static_cast<Keys>(ch);
78 const KeyToCommand KeyMap::MapDefault[] = {
80 #if OS_X_KEYS
81 {Keys::Down, SCI_CTRL, Message::DocumentEnd},
82 {Keys::Down, SCI_CSHIFT, Message::DocumentEndExtend},
83 {Keys::Up, SCI_CTRL, Message::DocumentStart},
84 {Keys::Up, SCI_CSHIFT, Message::DocumentStartExtend},
85 {Keys::Left, SCI_CTRL, Message::VCHome},
86 {Keys::Left, SCI_CSHIFT, Message::VCHomeExtend},
87 {Keys::Right, SCI_CTRL, Message::LineEnd},
88 {Keys::Right, SCI_CSHIFT, Message::LineEndExtend},
89 #endif
91 {Keys::Down, SCI_NORM, Message::LineDown},
92 {Keys::Down, SCI_SHIFT, Message::LineDownExtend},
93 {Keys::Down, SCI_CTRL_META, Message::LineScrollDown},
94 {Keys::Down, SCI_ASHIFT, Message::LineDownRectExtend},
95 {Keys::Up, SCI_NORM, Message::LineUp},
96 {Keys::Up, SCI_SHIFT, Message::LineUpExtend},
97 {Keys::Up, SCI_CTRL_META, Message::LineScrollUp},
98 {Keys::Up, SCI_ASHIFT, Message::LineUpRectExtend},
99 {Key('['), SCI_CTRL, Message::ParaUp},
100 {Key('['), SCI_CSHIFT, Message::ParaUpExtend},
101 {Key(']'), SCI_CTRL, Message::ParaDown},
102 {Key(']'), SCI_CSHIFT, Message::ParaDownExtend},
103 {Keys::Left, SCI_NORM, Message::CharLeft},
104 {Keys::Left, SCI_SHIFT, Message::CharLeftExtend},
105 {Keys::Left, SCI_CTRL_META, Message::WordLeft},
106 {Keys::Left, SCI_SCTRL_META, Message::WordLeftExtend},
107 {Keys::Left, SCI_ASHIFT, Message::CharLeftRectExtend},
108 {Keys::Right, SCI_NORM, Message::CharRight},
109 {Keys::Right, SCI_SHIFT, Message::CharRightExtend},
110 {Keys::Right, SCI_CTRL_META, Message::WordRight},
111 {Keys::Right, SCI_SCTRL_META, Message::WordRightExtend},
112 {Keys::Right, SCI_ASHIFT, Message::CharRightRectExtend},
113 {Key('/'), SCI_CTRL, Message::WordPartLeft},
114 {Key('/'), SCI_CSHIFT, Message::WordPartLeftExtend},
115 {Key('\\'), SCI_CTRL, Message::WordPartRight},
116 {Key('\\'), SCI_CSHIFT, Message::WordPartRightExtend},
117 {Keys::Home, SCI_NORM, Message::VCHome},
118 {Keys::Home, SCI_SHIFT, Message::VCHomeExtend},
119 {Keys::Home, SCI_CTRL, Message::DocumentStart},
120 {Keys::Home, SCI_CSHIFT, Message::DocumentStartExtend},
121 {Keys::Home, SCI_ALT, Message::HomeDisplay},
122 {Keys::Home, SCI_ASHIFT, Message::VCHomeRectExtend},
123 {Keys::End, SCI_NORM, Message::LineEnd},
124 {Keys::End, SCI_SHIFT, Message::LineEndExtend},
125 {Keys::End, SCI_CTRL, Message::DocumentEnd},
126 {Keys::End, SCI_CSHIFT, Message::DocumentEndExtend},
127 {Keys::End, SCI_ALT, Message::LineEndDisplay},
128 {Keys::End, SCI_ASHIFT, Message::LineEndRectExtend},
129 {Keys::Prior, SCI_NORM, Message::PageUp},
130 {Keys::Prior, SCI_SHIFT, Message::PageUpExtend},
131 {Keys::Prior, SCI_ASHIFT, Message::PageUpRectExtend},
132 {Keys::Next, SCI_NORM, Message::PageDown},
133 {Keys::Next, SCI_SHIFT, Message::PageDownExtend},
134 {Keys::Next, SCI_ASHIFT, Message::PageDownRectExtend},
135 {Keys::Delete, SCI_NORM, Message::Clear},
136 {Keys::Delete, SCI_SHIFT, Message::Cut},
137 {Keys::Delete, SCI_CTRL, Message::DelWordRight},
138 {Keys::Delete, SCI_CSHIFT, Message::DelLineRight},
139 {Keys::Insert, SCI_NORM, Message::EditToggleOvertype},
140 {Keys::Insert, SCI_SHIFT, Message::Paste},
141 {Keys::Insert, SCI_CTRL, Message::Copy},
142 {Keys::Escape, SCI_NORM, Message::Cancel},
143 {Keys::Back, SCI_NORM, Message::DeleteBack},
144 {Keys::Back, SCI_SHIFT, Message::DeleteBack},
145 {Keys::Back, SCI_CTRL, Message::DelWordLeft},
146 {Keys::Back, SCI_ALT, Message::Undo},
147 {Keys::Back, SCI_CSHIFT, Message::DelLineLeft},
148 {Key('Z'), SCI_CTRL, Message::Undo},
149 #if OS_X_KEYS
150 {Key('Z'), SCI_CSHIFT, Message::Redo},
151 #else
152 {Key('Y'), SCI_CTRL, Message::Redo},
153 #endif
154 {Key('X'), SCI_CTRL, Message::Cut},
155 {Key('C'), SCI_CTRL, Message::Copy},
156 {Key('V'), SCI_CTRL, Message::Paste},
157 {Key('A'), SCI_CTRL, Message::SelectAll},
158 {Keys::Tab, SCI_NORM, Message::Tab},
159 {Keys::Tab, SCI_SHIFT, Message::BackTab},
160 {Keys::Return, SCI_NORM, Message::NewLine},
161 {Keys::Return, SCI_SHIFT, Message::NewLine},
162 {Keys::Add, SCI_CTRL, Message::ZoomIn},
163 {Keys::Subtract, SCI_CTRL, Message::ZoomOut},
164 {Keys::Divide, SCI_CTRL, Message::SetZoom},
165 {Key('L'), SCI_CTRL, Message::LineCut},
166 {Key('L'), SCI_CSHIFT, Message::LineDelete},
167 {Key('T'), SCI_CSHIFT, Message::LineCopy},
168 {Key('T'), SCI_CTRL, Message::LineTranspose},
169 {Key('D'), SCI_CTRL, Message::SelectionDuplicate},
170 {Key('U'), SCI_CTRL, Message::LowerCase},
171 {Key('U'), SCI_CSHIFT, Message::UpperCase},
172 {Key(0),SCI_NORM,static_cast<Message>(0)},