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 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 32 KeyMap::~KeyMap() { 33 Clear(); 34 } 35 36 void KeyMap::Clear() noexcept { 37 kmap.clear(); 38 } 39 40 void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) { 41 kmap[KeyModifiers(key, modifiers)] = msg; 42 } 43 44 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 49 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