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 <[email protected]>
6 // The License.txt file describes the conditions under which this software may be distributed.
7
8 #include <cstdlib>
9
10 #include <stdexcept>
11 #include <string_view>
12 #include <vector>
13 #include <map>
14 #include <memory>
15
16 #include "Platform.h"
17
18 #include "Scintilla.h"
19
20 #include "KeyMap.h"
21
22 using namespace Scintilla;
23
KeyMap()24 KeyMap::KeyMap() {
25 for (int i = 0; MapDefault[i].key; i++) {
26 AssignCmdKey(MapDefault[i].key,
27 MapDefault[i].modifiers,
28 MapDefault[i].msg);
29 }
30 }
31
~KeyMap()32 KeyMap::~KeyMap() {
33 Clear();
34 }
35
Clear()36 void KeyMap::Clear() noexcept {
37 kmap.clear();
38 }
39
AssignCmdKey(int key,int modifiers,unsigned int msg)40 void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {
41 kmap[KeyModifiers(key, modifiers)] = msg;
42 }
43
Find(int key,int modifiers) const44 unsigned int KeyMap::Find(int key, int modifiers) const {
45 std::map<KeyModifiers, unsigned int>::const_iterator it = kmap.find(KeyModifiers(key, modifiers));
46 return (it == kmap.end()) ? 0 : it->second;
47 }
48
GetKeyMap() const49 const std::map<KeyModifiers, unsigned int> &KeyMap::GetKeyMap() const noexcept {
50 return kmap;
51 }
52
53 #if PLAT_GTK_MACOSX
54 #define OS_X_KEYS 1
55 #else
56 #define OS_X_KEYS 0
57 #endif
58
59 // Define a modifier that is exactly Ctrl key on all platforms
60 // Most uses of Ctrl map to Cmd on OS X but some can't so use SCI_[S]CTRL_META
61 #if OS_X_KEYS
62 #define SCI_CTRL_META SCI_META
63 #define SCI_SCTRL_META (SCI_META | SCI_SHIFT)
64 #else
65 #define SCI_CTRL_META SCI_CTRL
66 #define SCI_SCTRL_META (SCI_CTRL | SCI_SHIFT)
67 #endif
68
69 const KeyToCommand KeyMap::MapDefault[] = {
70
71 #if OS_X_KEYS
72 {SCK_DOWN, SCI_CTRL, SCI_DOCUMENTEND},
73 {SCK_DOWN, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND},
74 {SCK_UP, SCI_CTRL, SCI_DOCUMENTSTART},
75 {SCK_UP, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND},
76 {SCK_LEFT, SCI_CTRL, SCI_VCHOME},
77 {SCK_LEFT, SCI_CSHIFT, SCI_VCHOMEEXTEND},
78 {SCK_RIGHT, SCI_CTRL, SCI_LINEEND},
79 {SCK_RIGHT, SCI_CSHIFT, SCI_LINEENDEXTEND},
80 #endif
81
82 {SCK_DOWN, SCI_NORM, SCI_LINEDOWN},
83 {SCK_DOWN, SCI_SHIFT, SCI_LINEDOWNEXTEND},
84 {SCK_DOWN, SCI_CTRL_META, SCI_LINESCROLLDOWN},
85 {SCK_DOWN, SCI_ASHIFT, SCI_LINEDOWNRECTEXTEND},
86 {SCK_UP, SCI_NORM, SCI_LINEUP},
87 {SCK_UP, SCI_SHIFT, SCI_LINEUPEXTEND},
88 {SCK_UP, SCI_CTRL_META, SCI_LINESCROLLUP},
89 {SCK_UP, SCI_ASHIFT, SCI_LINEUPRECTEXTEND},
90 {'[', SCI_CTRL, SCI_PARAUP},
91 {'[', SCI_CSHIFT, SCI_PARAUPEXTEND},
92 {']', SCI_CTRL, SCI_PARADOWN},
93 {']', SCI_CSHIFT, SCI_PARADOWNEXTEND},
94 {SCK_LEFT, SCI_NORM, SCI_CHARLEFT},
95 {SCK_LEFT, SCI_SHIFT, SCI_CHARLEFTEXTEND},
96 {SCK_LEFT, SCI_CTRL_META, SCI_WORDLEFT},
97 {SCK_LEFT, SCI_SCTRL_META, SCI_WORDLEFTEXTEND},
98 {SCK_LEFT, SCI_ASHIFT, SCI_CHARLEFTRECTEXTEND},
99 {SCK_RIGHT, SCI_NORM, SCI_CHARRIGHT},
100 {SCK_RIGHT, SCI_SHIFT, SCI_CHARRIGHTEXTEND},
101 {SCK_RIGHT, SCI_CTRL_META, SCI_WORDRIGHT},
102 {SCK_RIGHT, SCI_SCTRL_META, SCI_WORDRIGHTEXTEND},
103 {SCK_RIGHT, SCI_ASHIFT, SCI_CHARRIGHTRECTEXTEND},
104 {'/', SCI_CTRL, SCI_WORDPARTLEFT},
105 {'/', SCI_CSHIFT, SCI_WORDPARTLEFTEXTEND},
106 {'\\', SCI_CTRL, SCI_WORDPARTRIGHT},
107 {'\\', SCI_CSHIFT, SCI_WORDPARTRIGHTEXTEND},
108 {SCK_HOME, SCI_NORM, SCI_VCHOME},
109 {SCK_HOME, SCI_SHIFT, SCI_VCHOMEEXTEND},
110 {SCK_HOME, SCI_CTRL, SCI_DOCUMENTSTART},
111 {SCK_HOME, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND},
112 {SCK_HOME, SCI_ALT, SCI_HOMEDISPLAY},
113 {SCK_HOME, SCI_ASHIFT, SCI_VCHOMERECTEXTEND},
114 {SCK_END, SCI_NORM, SCI_LINEEND},
115 {SCK_END, SCI_SHIFT, SCI_LINEENDEXTEND},
116 {SCK_END, SCI_CTRL, SCI_DOCUMENTEND},
117 {SCK_END, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND},
118 {SCK_END, SCI_ALT, SCI_LINEENDDISPLAY},
119 {SCK_END, SCI_ASHIFT, SCI_LINEENDRECTEXTEND},
120 {SCK_PRIOR, SCI_NORM, SCI_PAGEUP},
121 {SCK_PRIOR, SCI_SHIFT, SCI_PAGEUPEXTEND},
122 {SCK_PRIOR, SCI_ASHIFT, SCI_PAGEUPRECTEXTEND},
123 {SCK_NEXT, SCI_NORM, SCI_PAGEDOWN},
124 {SCK_NEXT, SCI_SHIFT, SCI_PAGEDOWNEXTEND},
125 {SCK_NEXT, SCI_ASHIFT, SCI_PAGEDOWNRECTEXTEND},
126 {SCK_DELETE, SCI_NORM, SCI_CLEAR},
127 {SCK_DELETE, SCI_SHIFT, SCI_CUT},
128 {SCK_DELETE, SCI_CTRL, SCI_DELWORDRIGHT},
129 {SCK_DELETE, SCI_CSHIFT, SCI_DELLINERIGHT},
130 {SCK_INSERT, SCI_NORM, SCI_EDITTOGGLEOVERTYPE},
131 {SCK_INSERT, SCI_SHIFT, SCI_PASTE},
132 {SCK_INSERT, SCI_CTRL, SCI_COPY},
133 {SCK_ESCAPE, SCI_NORM, SCI_CANCEL},
134 {SCK_BACK, SCI_NORM, SCI_DELETEBACK},
135 {SCK_BACK, SCI_SHIFT, SCI_DELETEBACK},
136 {SCK_BACK, SCI_CTRL, SCI_DELWORDLEFT},
137 {SCK_BACK, SCI_ALT, SCI_UNDO},
138 {SCK_BACK, SCI_CSHIFT, SCI_DELLINELEFT},
139 {'Z', SCI_CTRL, SCI_UNDO},
140 #if OS_X_KEYS
141 {'Z', SCI_CSHIFT, SCI_REDO},
142 #else
143 {'Y', SCI_CTRL, SCI_REDO},
144 #endif
145 {'X', SCI_CTRL, SCI_CUT},
146 {'C', SCI_CTRL, SCI_COPY},
147 {'V', SCI_CTRL, SCI_PASTE},
148 {'A', SCI_CTRL, SCI_SELECTALL},
149 {SCK_TAB, SCI_NORM, SCI_TAB},
150 {SCK_TAB, SCI_SHIFT, SCI_BACKTAB},
151 {SCK_RETURN, SCI_NORM, SCI_NEWLINE},
152 {SCK_RETURN, SCI_SHIFT, SCI_NEWLINE},
153 {SCK_ADD, SCI_CTRL, SCI_ZOOMIN},
154 {SCK_SUBTRACT, SCI_CTRL, SCI_ZOOMOUT},
155 {SCK_DIVIDE, SCI_CTRL, SCI_SETZOOM},
156 {'L', SCI_CTRL, SCI_LINECUT},
157 {'L', SCI_CSHIFT, SCI_LINEDELETE},
158 {'T', SCI_CSHIFT, SCI_LINECOPY},
159 {'T', SCI_CTRL, SCI_LINETRANSPOSE},
160 {'D', SCI_CTRL, SCI_SELECTIONDUPLICATE},
161 {'U', SCI_CTRL, SCI_LOWERCASE},
162 {'U', SCI_CSHIFT, SCI_UPPERCASE},
163 {0,0,0},
164 };
165
166