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.
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