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