KTextEditor

keyparser.cpp
1 /*
2  SPDX-FileCopyrightText: 2008 Erlend Hamberg <[email protected]>
3  SPDX-FileCopyrightText: 2008 Evgeniy Ivanov <[email protected]>
4 
5  SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 #include <QKeyEvent>
9 #include <QStringList>
10 #include <vimode/keyparser.h>
11 
12 using namespace KateVi;
13 
14 KeyParser *KeyParser::m_instance = nullptr;
15 
16 KeyParser::KeyParser()
17 {
18  initKeyTables();
19 }
20 
21 KeyParser *KeyParser::self()
22 {
23  if (m_instance == nullptr) {
24  m_instance = new KeyParser();
25  }
26 
27  return m_instance;
28 }
29 
30 void KeyParser::initKeyTables()
31 {
32  m_qt2katevi.insert(Qt::Key_Escape, QStringLiteral("esc"));
33  m_qt2katevi.insert(Qt::Key_Tab, QStringLiteral("tab"));
34  m_qt2katevi.insert(Qt::Key_Backtab, QStringLiteral("backtab"));
35  m_qt2katevi.insert(Qt::Key_Backspace, QStringLiteral("backspace"));
36  m_qt2katevi.insert(Qt::Key_Return, QStringLiteral("return"));
37  m_qt2katevi.insert(Qt::Key_Enter, QStringLiteral("enter"));
38  m_qt2katevi.insert(Qt::Key_Insert, QStringLiteral("insert"));
39  m_qt2katevi.insert(Qt::Key_Delete, QStringLiteral("delete"));
40  m_qt2katevi.insert(Qt::Key_Pause, QStringLiteral("pause"));
41  m_qt2katevi.insert(Qt::Key_Print, QStringLiteral("print"));
42  m_qt2katevi.insert(Qt::Key_SysReq, QStringLiteral("sysreq"));
43  m_qt2katevi.insert(Qt::Key_Clear, QStringLiteral("clear"));
44  m_qt2katevi.insert(Qt::Key_Home, QStringLiteral("home"));
45  m_qt2katevi.insert(Qt::Key_End, QStringLiteral("end"));
46  m_qt2katevi.insert(Qt::Key_Left, QStringLiteral("left"));
47  m_qt2katevi.insert(Qt::Key_Up, QStringLiteral("up"));
48  m_qt2katevi.insert(Qt::Key_Right, QStringLiteral("right"));
49  m_qt2katevi.insert(Qt::Key_Down, QStringLiteral("down"));
50  m_qt2katevi.insert(Qt::Key_PageUp, QStringLiteral("pageup"));
51  m_qt2katevi.insert(Qt::Key_PageDown, QStringLiteral("pagedown"));
52  m_qt2katevi.insert(Qt::Key_Shift, QStringLiteral("shift"));
53  m_qt2katevi.insert(Qt::Key_Control, QStringLiteral("control"));
54  m_qt2katevi.insert(Qt::Key_Meta, QStringLiteral("meta"));
55  m_qt2katevi.insert(Qt::Key_Alt, QStringLiteral("alt"));
56  m_qt2katevi.insert(Qt::Key_AltGr, QStringLiteral("altgr"));
57  m_qt2katevi.insert(Qt::Key_CapsLock, QStringLiteral("capslock"));
58  m_qt2katevi.insert(Qt::Key_NumLock, QStringLiteral("numlock"));
59  m_qt2katevi.insert(Qt::Key_ScrollLock, QStringLiteral("scrolllock"));
60  m_qt2katevi.insert(Qt::Key_F1, QStringLiteral("f1"));
61  m_qt2katevi.insert(Qt::Key_F2, QStringLiteral("f2"));
62  m_qt2katevi.insert(Qt::Key_F3, QStringLiteral("f3"));
63  m_qt2katevi.insert(Qt::Key_F4, QStringLiteral("f4"));
64  m_qt2katevi.insert(Qt::Key_F5, QStringLiteral("f5"));
65  m_qt2katevi.insert(Qt::Key_F6, QStringLiteral("f6"));
66  m_qt2katevi.insert(Qt::Key_F7, QStringLiteral("f7"));
67  m_qt2katevi.insert(Qt::Key_F8, QStringLiteral("f8"));
68  m_qt2katevi.insert(Qt::Key_F9, QStringLiteral("f9"));
69  m_qt2katevi.insert(Qt::Key_F10, QStringLiteral("f10"));
70  m_qt2katevi.insert(Qt::Key_F11, QStringLiteral("f11"));
71  m_qt2katevi.insert(Qt::Key_F12, QStringLiteral("f12"));
72  m_qt2katevi.insert(Qt::Key_F13, QStringLiteral("f13"));
73  m_qt2katevi.insert(Qt::Key_F14, QStringLiteral("f14"));
74  m_qt2katevi.insert(Qt::Key_F15, QStringLiteral("f15"));
75  m_qt2katevi.insert(Qt::Key_F16, QStringLiteral("f16"));
76  m_qt2katevi.insert(Qt::Key_F17, QStringLiteral("f17"));
77  m_qt2katevi.insert(Qt::Key_F18, QStringLiteral("f18"));
78  m_qt2katevi.insert(Qt::Key_F19, QStringLiteral("f19"));
79  m_qt2katevi.insert(Qt::Key_F20, QStringLiteral("f20"));
80  m_qt2katevi.insert(Qt::Key_F21, QStringLiteral("f21"));
81  m_qt2katevi.insert(Qt::Key_F22, QStringLiteral("f22"));
82  m_qt2katevi.insert(Qt::Key_F23, QStringLiteral("f23"));
83  m_qt2katevi.insert(Qt::Key_F24, QStringLiteral("f24"));
84  m_qt2katevi.insert(Qt::Key_F25, QStringLiteral("f25"));
85  m_qt2katevi.insert(Qt::Key_F26, QStringLiteral("f26"));
86  m_qt2katevi.insert(Qt::Key_F27, QStringLiteral("f27"));
87  m_qt2katevi.insert(Qt::Key_F28, QStringLiteral("f28"));
88  m_qt2katevi.insert(Qt::Key_F29, QStringLiteral("f29"));
89  m_qt2katevi.insert(Qt::Key_F30, QStringLiteral("f30"));
90  m_qt2katevi.insert(Qt::Key_F31, QStringLiteral("f31"));
91  m_qt2katevi.insert(Qt::Key_F32, QStringLiteral("f32"));
92  m_qt2katevi.insert(Qt::Key_F33, QStringLiteral("f33"));
93  m_qt2katevi.insert(Qt::Key_F34, QStringLiteral("f34"));
94  m_qt2katevi.insert(Qt::Key_F35, QStringLiteral("f35"));
95  m_qt2katevi.insert(Qt::Key_Super_L, QStringLiteral("super_l"));
96  m_qt2katevi.insert(Qt::Key_Super_R, QStringLiteral("super_r"));
97  m_qt2katevi.insert(Qt::Key_Menu, QStringLiteral("menu"));
98  m_qt2katevi.insert(Qt::Key_Hyper_L, QStringLiteral("hyper_l"));
99  m_qt2katevi.insert(Qt::Key_Hyper_R, QStringLiteral("hyper_r"));
100  m_qt2katevi.insert(Qt::Key_Help, QStringLiteral("help"));
101  m_qt2katevi.insert(Qt::Key_Direction_L, QStringLiteral("direction_l"));
102  m_qt2katevi.insert(Qt::Key_Direction_R, QStringLiteral("direction_r"));
103  m_qt2katevi.insert(Qt::Key_Multi_key, QStringLiteral("multi_key"));
104  m_qt2katevi.insert(Qt::Key_Codeinput, QStringLiteral("codeinput"));
105  m_qt2katevi.insert(Qt::Key_SingleCandidate, QStringLiteral("singlecandidate"));
106  m_qt2katevi.insert(Qt::Key_MultipleCandidate, QStringLiteral("multiplecandidate"));
107  m_qt2katevi.insert(Qt::Key_PreviousCandidate, QStringLiteral("previouscandidate"));
108  m_qt2katevi.insert(Qt::Key_Mode_switch, QStringLiteral("mode_switch"));
109  m_qt2katevi.insert(Qt::Key_Kanji, QStringLiteral("kanji"));
110  m_qt2katevi.insert(Qt::Key_Muhenkan, QStringLiteral("muhenkan"));
111  m_qt2katevi.insert(Qt::Key_Henkan, QStringLiteral("henkan"));
112  m_qt2katevi.insert(Qt::Key_Romaji, QStringLiteral("romaji"));
113  m_qt2katevi.insert(Qt::Key_Hiragana, QStringLiteral("hiragana"));
114  m_qt2katevi.insert(Qt::Key_Katakana, QStringLiteral("katakana"));
115  m_qt2katevi.insert(Qt::Key_Hiragana_Katakana, QStringLiteral("hiragana_katakana"));
116  m_qt2katevi.insert(Qt::Key_Zenkaku, QStringLiteral("zenkaku"));
117  m_qt2katevi.insert(Qt::Key_Hankaku, QStringLiteral("hankaku"));
118  m_qt2katevi.insert(Qt::Key_Zenkaku_Hankaku, QStringLiteral("zenkaku_hankaku"));
119  m_qt2katevi.insert(Qt::Key_Touroku, QStringLiteral("touroku"));
120  m_qt2katevi.insert(Qt::Key_Massyo, QStringLiteral("massyo"));
121  m_qt2katevi.insert(Qt::Key_Kana_Lock, QStringLiteral("kana_lock"));
122  m_qt2katevi.insert(Qt::Key_Kana_Shift, QStringLiteral("kana_shift"));
123  m_qt2katevi.insert(Qt::Key_Eisu_Shift, QStringLiteral("eisu_shift"));
124  m_qt2katevi.insert(Qt::Key_Eisu_toggle, QStringLiteral("eisu_toggle"));
125  m_qt2katevi.insert(Qt::Key_Hangul, QStringLiteral("hangul"));
126  m_qt2katevi.insert(Qt::Key_Hangul_Start, QStringLiteral("hangul_start"));
127  m_qt2katevi.insert(Qt::Key_Hangul_End, QStringLiteral("hangul_end"));
128  m_qt2katevi.insert(Qt::Key_Hangul_Hanja, QStringLiteral("hangul_hanja"));
129  m_qt2katevi.insert(Qt::Key_Hangul_Jamo, QStringLiteral("hangul_jamo"));
130  m_qt2katevi.insert(Qt::Key_Hangul_Romaja, QStringLiteral("hangul_romaja"));
131  m_qt2katevi.insert(Qt::Key_Hangul_Jeonja, QStringLiteral("hangul_jeonja"));
132  m_qt2katevi.insert(Qt::Key_Hangul_Banja, QStringLiteral("hangul_banja"));
133  m_qt2katevi.insert(Qt::Key_Hangul_PreHanja, QStringLiteral("hangul_prehanja"));
134  m_qt2katevi.insert(Qt::Key_Hangul_PostHanja, QStringLiteral("hangul_posthanja"));
135  m_qt2katevi.insert(Qt::Key_Hangul_Special, QStringLiteral("hangul_special"));
136  m_qt2katevi.insert(Qt::Key_Dead_Grave, QStringLiteral("dead_grave"));
137  m_qt2katevi.insert(Qt::Key_Dead_Acute, QStringLiteral("dead_acute"));
138  m_qt2katevi.insert(Qt::Key_Dead_Circumflex, QStringLiteral("dead_circumflex"));
139  m_qt2katevi.insert(Qt::Key_Dead_Tilde, QStringLiteral("dead_tilde"));
140  m_qt2katevi.insert(Qt::Key_Dead_Macron, QStringLiteral("dead_macron"));
141  m_qt2katevi.insert(Qt::Key_Dead_Breve, QStringLiteral("dead_breve"));
142  m_qt2katevi.insert(Qt::Key_Dead_Abovedot, QStringLiteral("dead_abovedot"));
143  m_qt2katevi.insert(Qt::Key_Dead_Diaeresis, QStringLiteral("dead_diaeresis"));
144  m_qt2katevi.insert(Qt::Key_Dead_Abovering, QStringLiteral("dead_abovering"));
145  m_qt2katevi.insert(Qt::Key_Dead_Doubleacute, QStringLiteral("dead_doubleacute"));
146  m_qt2katevi.insert(Qt::Key_Dead_Caron, QStringLiteral("dead_caron"));
147  m_qt2katevi.insert(Qt::Key_Dead_Cedilla, QStringLiteral("dead_cedilla"));
148  m_qt2katevi.insert(Qt::Key_Dead_Ogonek, QStringLiteral("dead_ogonek"));
149  m_qt2katevi.insert(Qt::Key_Dead_Iota, QStringLiteral("dead_iota"));
150  m_qt2katevi.insert(Qt::Key_Dead_Voiced_Sound, QStringLiteral("dead_voiced_sound"));
151  m_qt2katevi.insert(Qt::Key_Dead_Semivoiced_Sound, QStringLiteral("dead_semivoiced_sound"));
152  m_qt2katevi.insert(Qt::Key_Dead_Belowdot, QStringLiteral("dead_belowdot"));
153  m_qt2katevi.insert(Qt::Key_Dead_Hook, QStringLiteral("dead_hook"));
154  m_qt2katevi.insert(Qt::Key_Dead_Horn, QStringLiteral("dead_horn"));
155  m_qt2katevi.insert(Qt::Key_Back, QStringLiteral("back"));
156  m_qt2katevi.insert(Qt::Key_Forward, QStringLiteral("forward"));
157  m_qt2katevi.insert(Qt::Key_Stop, QStringLiteral("stop"));
158  m_qt2katevi.insert(Qt::Key_Refresh, QStringLiteral("refresh"));
159  m_qt2katevi.insert(Qt::Key_VolumeDown, QStringLiteral("volumedown"));
160  m_qt2katevi.insert(Qt::Key_VolumeMute, QStringLiteral("volumemute"));
161  m_qt2katevi.insert(Qt::Key_VolumeUp, QStringLiteral("volumeup"));
162  m_qt2katevi.insert(Qt::Key_BassBoost, QStringLiteral("bassboost"));
163  m_qt2katevi.insert(Qt::Key_BassUp, QStringLiteral("bassup"));
164  m_qt2katevi.insert(Qt::Key_BassDown, QStringLiteral("bassdown"));
165  m_qt2katevi.insert(Qt::Key_TrebleUp, QStringLiteral("trebleup"));
166  m_qt2katevi.insert(Qt::Key_TrebleDown, QStringLiteral("trebledown"));
167  m_qt2katevi.insert(Qt::Key_MediaPlay, QStringLiteral("mediaplay"));
168  m_qt2katevi.insert(Qt::Key_MediaStop, QStringLiteral("mediastop"));
169  m_qt2katevi.insert(Qt::Key_MediaPrevious, QStringLiteral("mediaprevious"));
170  m_qt2katevi.insert(Qt::Key_MediaNext, QStringLiteral("medianext"));
171  m_qt2katevi.insert(Qt::Key_MediaRecord, QStringLiteral("mediarecord"));
172  m_qt2katevi.insert(Qt::Key_HomePage, QStringLiteral("homepage"));
173  m_qt2katevi.insert(Qt::Key_Favorites, QStringLiteral("favorites"));
174  m_qt2katevi.insert(Qt::Key_Search, QStringLiteral("search"));
175  m_qt2katevi.insert(Qt::Key_Standby, QStringLiteral("standby"));
176  m_qt2katevi.insert(Qt::Key_OpenUrl, QStringLiteral("openurl"));
177  m_qt2katevi.insert(Qt::Key_LaunchMail, QStringLiteral("launchmail"));
178  m_qt2katevi.insert(Qt::Key_LaunchMedia, QStringLiteral("launchmedia"));
179  m_qt2katevi.insert(Qt::Key_Launch0, QStringLiteral("launch0"));
180  m_qt2katevi.insert(Qt::Key_Launch1, QStringLiteral("launch1"));
181  m_qt2katevi.insert(Qt::Key_Launch2, QStringLiteral("launch2"));
182  m_qt2katevi.insert(Qt::Key_Launch3, QStringLiteral("launch3"));
183  m_qt2katevi.insert(Qt::Key_Launch4, QStringLiteral("launch4"));
184  m_qt2katevi.insert(Qt::Key_Launch5, QStringLiteral("launch5"));
185  m_qt2katevi.insert(Qt::Key_Launch6, QStringLiteral("launch6"));
186  m_qt2katevi.insert(Qt::Key_Launch7, QStringLiteral("launch7"));
187  m_qt2katevi.insert(Qt::Key_Launch8, QStringLiteral("launch8"));
188  m_qt2katevi.insert(Qt::Key_Launch9, QStringLiteral("launch9"));
189  m_qt2katevi.insert(Qt::Key_LaunchA, QStringLiteral("launcha"));
190  m_qt2katevi.insert(Qt::Key_LaunchB, QStringLiteral("launchb"));
191  m_qt2katevi.insert(Qt::Key_LaunchC, QStringLiteral("launchc"));
192  m_qt2katevi.insert(Qt::Key_LaunchD, QStringLiteral("launchd"));
193  m_qt2katevi.insert(Qt::Key_LaunchE, QStringLiteral("launche"));
194  m_qt2katevi.insert(Qt::Key_LaunchF, QStringLiteral("launchf"));
195  m_qt2katevi.insert(Qt::Key_MediaLast, QStringLiteral("medialast"));
196  m_qt2katevi.insert(Qt::Key_unknown, QStringLiteral("unknown"));
197  m_qt2katevi.insert(Qt::Key_Call, QStringLiteral("call"));
198  m_qt2katevi.insert(Qt::Key_Context1, QStringLiteral("context1"));
199  m_qt2katevi.insert(Qt::Key_Context2, QStringLiteral("context2"));
200  m_qt2katevi.insert(Qt::Key_Context3, QStringLiteral("context3"));
201  m_qt2katevi.insert(Qt::Key_Context4, QStringLiteral("context4"));
202  m_qt2katevi.insert(Qt::Key_Flip, QStringLiteral("flip"));
203  m_qt2katevi.insert(Qt::Key_Hangup, QStringLiteral("hangup"));
204  m_qt2katevi.insert(Qt::Key_No, QStringLiteral("no"));
205  m_qt2katevi.insert(Qt::Key_Select, QStringLiteral("select"));
206  m_qt2katevi.insert(Qt::Key_Yes, QStringLiteral("yes"));
207  m_qt2katevi.insert(Qt::Key_Execute, QStringLiteral("execute"));
208  m_qt2katevi.insert(Qt::Key_Printer, QStringLiteral("printer"));
209  m_qt2katevi.insert(Qt::Key_Play, QStringLiteral("play"));
210  m_qt2katevi.insert(Qt::Key_Sleep, QStringLiteral("sleep"));
211  m_qt2katevi.insert(Qt::Key_Zoom, QStringLiteral("zoom"));
212  m_qt2katevi.insert(Qt::Key_Cancel, QStringLiteral("cancel"));
213 
214  for (QHash<int, QString>::const_iterator i = m_qt2katevi.constBegin(); i != m_qt2katevi.constEnd(); ++i) {
215  m_katevi2qt.insert(i.value(), i.key());
216  }
217  m_katevi2qt.insert(QStringLiteral("cr"), Qt::Key_Enter);
218 
219  m_nameToKeyCode.insert(QStringLiteral("invalid"), -1);
220  m_nameToKeyCode.insert(QStringLiteral("esc"), 1);
221  m_nameToKeyCode.insert(QStringLiteral("tab"), 2);
222  m_nameToKeyCode.insert(QStringLiteral("backtab"), 3);
223  m_nameToKeyCode.insert(QStringLiteral("backspace"), 4);
224  m_nameToKeyCode.insert(QStringLiteral("return"), 5);
225  m_nameToKeyCode.insert(QStringLiteral("enter"), 6);
226  m_nameToKeyCode.insert(QStringLiteral("insert"), 7);
227  m_nameToKeyCode.insert(QStringLiteral("delete"), 8);
228  m_nameToKeyCode.insert(QStringLiteral("pause"), 9);
229  m_nameToKeyCode.insert(QStringLiteral("print"), 10);
230  m_nameToKeyCode.insert(QStringLiteral("sysreq"), 11);
231  m_nameToKeyCode.insert(QStringLiteral("clear"), 12);
232  m_nameToKeyCode.insert(QStringLiteral("home"), 13);
233  m_nameToKeyCode.insert(QStringLiteral("end"), 14);
234  m_nameToKeyCode.insert(QStringLiteral("left"), 15);
235  m_nameToKeyCode.insert(QStringLiteral("up"), 16);
236  m_nameToKeyCode.insert(QStringLiteral("right"), 17);
237  m_nameToKeyCode.insert(QStringLiteral("down"), 18);
238  m_nameToKeyCode.insert(QStringLiteral("pageup"), 19);
239  m_nameToKeyCode.insert(QStringLiteral("pagedown"), 20);
240  m_nameToKeyCode.insert(QStringLiteral("shift"), 21);
241  m_nameToKeyCode.insert(QStringLiteral("control"), 22);
242  m_nameToKeyCode.insert(QStringLiteral("meta"), 23);
243  m_nameToKeyCode.insert(QStringLiteral("alt"), 24);
244  m_nameToKeyCode.insert(QStringLiteral("altgr"), 25);
245  m_nameToKeyCode.insert(QStringLiteral("capslock"), 26);
246  m_nameToKeyCode.insert(QStringLiteral("numlock"), 27);
247  m_nameToKeyCode.insert(QStringLiteral("scrolllock"), 28);
248  m_nameToKeyCode.insert(QStringLiteral("f1"), 29);
249  m_nameToKeyCode.insert(QStringLiteral("f2"), 30);
250  m_nameToKeyCode.insert(QStringLiteral("f3"), 31);
251  m_nameToKeyCode.insert(QStringLiteral("f4"), 32);
252  m_nameToKeyCode.insert(QStringLiteral("f5"), 33);
253  m_nameToKeyCode.insert(QStringLiteral("f6"), 34);
254  m_nameToKeyCode.insert(QStringLiteral("f7"), 35);
255  m_nameToKeyCode.insert(QStringLiteral("f8"), 36);
256  m_nameToKeyCode.insert(QStringLiteral("f9"), 37);
257  m_nameToKeyCode.insert(QStringLiteral("f10"), 38);
258  m_nameToKeyCode.insert(QStringLiteral("f11"), 39);
259  m_nameToKeyCode.insert(QStringLiteral("f12"), 40);
260  m_nameToKeyCode.insert(QStringLiteral("f13"), 41);
261  m_nameToKeyCode.insert(QStringLiteral("f14"), 42);
262  m_nameToKeyCode.insert(QStringLiteral("f15"), 43);
263  m_nameToKeyCode.insert(QStringLiteral("f16"), 44);
264  m_nameToKeyCode.insert(QStringLiteral("f17"), 45);
265  m_nameToKeyCode.insert(QStringLiteral("f18"), 46);
266  m_nameToKeyCode.insert(QStringLiteral("f19"), 47);
267  m_nameToKeyCode.insert(QStringLiteral("f20"), 48);
268  m_nameToKeyCode.insert(QStringLiteral("f21"), 49);
269  m_nameToKeyCode.insert(QStringLiteral("f22"), 50);
270  m_nameToKeyCode.insert(QStringLiteral("f23"), 51);
271  m_nameToKeyCode.insert(QStringLiteral("f24"), 52);
272  m_nameToKeyCode.insert(QStringLiteral("f25"), 53);
273  m_nameToKeyCode.insert(QStringLiteral("f26"), 54);
274  m_nameToKeyCode.insert(QStringLiteral("f27"), 55);
275  m_nameToKeyCode.insert(QStringLiteral("f28"), 56);
276  m_nameToKeyCode.insert(QStringLiteral("f29"), 57);
277  m_nameToKeyCode.insert(QStringLiteral("f30"), 58);
278  m_nameToKeyCode.insert(QStringLiteral("f31"), 59);
279  m_nameToKeyCode.insert(QStringLiteral("f32"), 60);
280  m_nameToKeyCode.insert(QStringLiteral("f33"), 61);
281  m_nameToKeyCode.insert(QStringLiteral("f34"), 62);
282  m_nameToKeyCode.insert(QStringLiteral("f35"), 63);
283  m_nameToKeyCode.insert(QStringLiteral("super_l"), 64);
284  m_nameToKeyCode.insert(QStringLiteral("super_r"), 65);
285  m_nameToKeyCode.insert(QStringLiteral("menu"), 66);
286  m_nameToKeyCode.insert(QStringLiteral("hyper_l"), 67);
287  m_nameToKeyCode.insert(QStringLiteral("hyper_r"), 68);
288  m_nameToKeyCode.insert(QStringLiteral("help"), 69);
289  m_nameToKeyCode.insert(QStringLiteral("direction_l"), 70);
290  m_nameToKeyCode.insert(QStringLiteral("direction_r"), 71);
291  m_nameToKeyCode.insert(QStringLiteral("multi_key"), 172);
292  m_nameToKeyCode.insert(QStringLiteral("codeinput"), 173);
293  m_nameToKeyCode.insert(QStringLiteral("singlecandidate"), 174);
294  m_nameToKeyCode.insert(QStringLiteral("multiplecandidate"), 175);
295  m_nameToKeyCode.insert(QStringLiteral("previouscandidate"), 176);
296  m_nameToKeyCode.insert(QStringLiteral("mode_switch"), 177);
297  m_nameToKeyCode.insert(QStringLiteral("kanji"), 178);
298  m_nameToKeyCode.insert(QStringLiteral("muhenkan"), 179);
299  m_nameToKeyCode.insert(QStringLiteral("henkan"), 180);
300  m_nameToKeyCode.insert(QStringLiteral("romaji"), 181);
301  m_nameToKeyCode.insert(QStringLiteral("hiragana"), 182);
302  m_nameToKeyCode.insert(QStringLiteral("katakana"), 183);
303  m_nameToKeyCode.insert(QStringLiteral("hiragana_katakana"), 184);
304  m_nameToKeyCode.insert(QStringLiteral("zenkaku"), 185);
305  m_nameToKeyCode.insert(QStringLiteral("hankaku"), 186);
306  m_nameToKeyCode.insert(QStringLiteral("zenkaku_hankaku"), 187);
307  m_nameToKeyCode.insert(QStringLiteral("touroku"), 188);
308  m_nameToKeyCode.insert(QStringLiteral("massyo"), 189);
309  m_nameToKeyCode.insert(QStringLiteral("kana_lock"), 190);
310  m_nameToKeyCode.insert(QStringLiteral("kana_shift"), 191);
311  m_nameToKeyCode.insert(QStringLiteral("eisu_shift"), 192);
312  m_nameToKeyCode.insert(QStringLiteral("eisu_toggle"), 193);
313  m_nameToKeyCode.insert(QStringLiteral("hangul"), 194);
314  m_nameToKeyCode.insert(QStringLiteral("hangul_start"), 195);
315  m_nameToKeyCode.insert(QStringLiteral("hangul_end"), 196);
316  m_nameToKeyCode.insert(QStringLiteral("hangul_hanja"), 197);
317  m_nameToKeyCode.insert(QStringLiteral("hangul_jamo"), 198);
318  m_nameToKeyCode.insert(QStringLiteral("hangul_romaja"), 199);
319  m_nameToKeyCode.insert(QStringLiteral("hangul_jeonja"), 200);
320  m_nameToKeyCode.insert(QStringLiteral("hangul_banja"), 201);
321  m_nameToKeyCode.insert(QStringLiteral("hangul_prehanja"), 202);
322  m_nameToKeyCode.insert(QStringLiteral("hangul_posthanja"), 203);
323  m_nameToKeyCode.insert(QStringLiteral("hangul_special"), 204);
324  m_nameToKeyCode.insert(QStringLiteral("dead_grave"), 205);
325  m_nameToKeyCode.insert(QStringLiteral("dead_acute"), 206);
326  m_nameToKeyCode.insert(QStringLiteral("dead_circumflex"), 207);
327  m_nameToKeyCode.insert(QStringLiteral("dead_tilde"), 208);
328  m_nameToKeyCode.insert(QStringLiteral("dead_macron"), 209);
329  m_nameToKeyCode.insert(QStringLiteral("dead_breve"), 210);
330  m_nameToKeyCode.insert(QStringLiteral("dead_abovedot"), 211);
331  m_nameToKeyCode.insert(QStringLiteral("dead_diaeresis"), 212);
332  m_nameToKeyCode.insert(QStringLiteral("dead_abovering"), 213);
333  m_nameToKeyCode.insert(QStringLiteral("dead_doubleacute"), 214);
334  m_nameToKeyCode.insert(QStringLiteral("dead_caron"), 215);
335  m_nameToKeyCode.insert(QStringLiteral("dead_cedilla"), 216);
336  m_nameToKeyCode.insert(QStringLiteral("dead_ogonek"), 217);
337  m_nameToKeyCode.insert(QStringLiteral("dead_iota"), 218);
338  m_nameToKeyCode.insert(QStringLiteral("dead_voiced_sound"), 219);
339  m_nameToKeyCode.insert(QStringLiteral("dead_semivoiced_sound"), 220);
340  m_nameToKeyCode.insert(QStringLiteral("dead_belowdot"), 221);
341  m_nameToKeyCode.insert(QStringLiteral("dead_hook"), 222);
342  m_nameToKeyCode.insert(QStringLiteral("dead_horn"), 223);
343  m_nameToKeyCode.insert(QStringLiteral("back"), 224);
344  m_nameToKeyCode.insert(QStringLiteral("forward"), 225);
345  m_nameToKeyCode.insert(QStringLiteral("stop"), 226);
346  m_nameToKeyCode.insert(QStringLiteral("refresh"), 227);
347  m_nameToKeyCode.insert(QStringLiteral("volumedown"), 228);
348  m_nameToKeyCode.insert(QStringLiteral("volumemute"), 229);
349  m_nameToKeyCode.insert(QStringLiteral("volumeup"), 230);
350  m_nameToKeyCode.insert(QStringLiteral("bassboost"), 231);
351  m_nameToKeyCode.insert(QStringLiteral("bassup"), 232);
352  m_nameToKeyCode.insert(QStringLiteral("bassdown"), 233);
353  m_nameToKeyCode.insert(QStringLiteral("trebleup"), 234);
354  m_nameToKeyCode.insert(QStringLiteral("trebledown"), 235);
355  m_nameToKeyCode.insert(QStringLiteral("mediaplay"), 236);
356  m_nameToKeyCode.insert(QStringLiteral("mediastop"), 237);
357  m_nameToKeyCode.insert(QStringLiteral("mediaprevious"), 238);
358  m_nameToKeyCode.insert(QStringLiteral("medianext"), 239);
359  m_nameToKeyCode.insert(QStringLiteral("mediarecord"), 240);
360  m_nameToKeyCode.insert(QStringLiteral("homepage"), 241);
361  m_nameToKeyCode.insert(QStringLiteral("favorites"), 242);
362  m_nameToKeyCode.insert(QStringLiteral("search"), 243);
363  m_nameToKeyCode.insert(QStringLiteral("standby"), 244);
364  m_nameToKeyCode.insert(QStringLiteral("openurl"), 245);
365  m_nameToKeyCode.insert(QStringLiteral("launchmail"), 246);
366  m_nameToKeyCode.insert(QStringLiteral("launchmedia"), 247);
367  m_nameToKeyCode.insert(QStringLiteral("launch0"), 248);
368  m_nameToKeyCode.insert(QStringLiteral("launch1"), 249);
369  m_nameToKeyCode.insert(QStringLiteral("launch2"), 250);
370  m_nameToKeyCode.insert(QStringLiteral("launch3"), 251);
371  m_nameToKeyCode.insert(QStringLiteral("launch4"), 252);
372  m_nameToKeyCode.insert(QStringLiteral("launch5"), 253);
373  m_nameToKeyCode.insert(QStringLiteral("launch6"), 254);
374  m_nameToKeyCode.insert(QStringLiteral("launch7"), 255);
375  m_nameToKeyCode.insert(QStringLiteral("launch8"), 256);
376  m_nameToKeyCode.insert(QStringLiteral("launch9"), 257);
377  m_nameToKeyCode.insert(QStringLiteral("launcha"), 258);
378  m_nameToKeyCode.insert(QStringLiteral("launchb"), 259);
379  m_nameToKeyCode.insert(QStringLiteral("launchc"), 260);
380  m_nameToKeyCode.insert(QStringLiteral("launchd"), 261);
381  m_nameToKeyCode.insert(QStringLiteral("launche"), 262);
382  m_nameToKeyCode.insert(QStringLiteral("launchf"), 263);
383  m_nameToKeyCode.insert(QStringLiteral("medialast"), 264);
384  m_nameToKeyCode.insert(QStringLiteral("unknown"), 265);
385  m_nameToKeyCode.insert(QStringLiteral("call"), 266);
386  m_nameToKeyCode.insert(QStringLiteral("context1"), 267);
387  m_nameToKeyCode.insert(QStringLiteral("context2"), 268);
388  m_nameToKeyCode.insert(QStringLiteral("context3"), 269);
389  m_nameToKeyCode.insert(QStringLiteral("context4"), 270);
390  m_nameToKeyCode.insert(QStringLiteral("flip"), 271);
391  m_nameToKeyCode.insert(QStringLiteral("hangup"), 272);
392  m_nameToKeyCode.insert(QStringLiteral("no"), 273);
393  m_nameToKeyCode.insert(QStringLiteral("select"), 274);
394  m_nameToKeyCode.insert(QStringLiteral("yes"), 275);
395  m_nameToKeyCode.insert(QStringLiteral("execute"), 276);
396  m_nameToKeyCode.insert(QStringLiteral("printer"), 277);
397  m_nameToKeyCode.insert(QStringLiteral("play"), 278);
398  m_nameToKeyCode.insert(QStringLiteral("sleep"), 279);
399  m_nameToKeyCode.insert(QStringLiteral("zoom"), 280);
400  m_nameToKeyCode.insert(QStringLiteral("cancel"), 281);
401 
402  m_nameToKeyCode.insert(QStringLiteral("a"), 282);
403  m_nameToKeyCode.insert(QStringLiteral("b"), 283);
404  m_nameToKeyCode.insert(QStringLiteral("c"), 284);
405  m_nameToKeyCode.insert(QStringLiteral("d"), 285);
406  m_nameToKeyCode.insert(QStringLiteral("e"), 286);
407  m_nameToKeyCode.insert(QStringLiteral("f"), 287);
408  m_nameToKeyCode.insert(QStringLiteral("g"), 288);
409  m_nameToKeyCode.insert(QStringLiteral("h"), 289);
410  m_nameToKeyCode.insert(QStringLiteral("i"), 290);
411  m_nameToKeyCode.insert(QStringLiteral("j"), 291);
412  m_nameToKeyCode.insert(QStringLiteral("k"), 292);
413  m_nameToKeyCode.insert(QStringLiteral("l"), 293);
414  m_nameToKeyCode.insert(QStringLiteral("m"), 294);
415  m_nameToKeyCode.insert(QStringLiteral("n"), 295);
416  m_nameToKeyCode.insert(QStringLiteral("o"), 296);
417  m_nameToKeyCode.insert(QStringLiteral("p"), 297);
418  m_nameToKeyCode.insert(QStringLiteral("q"), 298);
419  m_nameToKeyCode.insert(QStringLiteral("r"), 299);
420  m_nameToKeyCode.insert(QStringLiteral("s"), 300);
421  m_nameToKeyCode.insert(QStringLiteral("t"), 301);
422  m_nameToKeyCode.insert(QStringLiteral("u"), 302);
423  m_nameToKeyCode.insert(QStringLiteral("v"), 303);
424  m_nameToKeyCode.insert(QStringLiteral("w"), 304);
425  m_nameToKeyCode.insert(QStringLiteral("x"), 305);
426  m_nameToKeyCode.insert(QStringLiteral("y"), 306);
427  m_nameToKeyCode.insert(QStringLiteral("z"), 307);
428  m_nameToKeyCode.insert(QStringLiteral("`"), 308);
429  m_nameToKeyCode.insert(QStringLiteral("!"), 309);
430  m_nameToKeyCode.insert(QStringLiteral("\""), 310);
431  m_nameToKeyCode.insert(QStringLiteral("$"), 311);
432  m_nameToKeyCode.insert(QStringLiteral("%"), 312);
433  m_nameToKeyCode.insert(QStringLiteral("^"), 313);
434  m_nameToKeyCode.insert(QStringLiteral("&"), 314);
435  m_nameToKeyCode.insert(QStringLiteral("*"), 315);
436  m_nameToKeyCode.insert(QStringLiteral("("), 316);
437  m_nameToKeyCode.insert(QStringLiteral(")"), 317);
438  m_nameToKeyCode.insert(QStringLiteral("-"), 318);
439  m_nameToKeyCode.insert(QStringLiteral("_"), 319);
440  m_nameToKeyCode.insert(QStringLiteral("="), 320);
441  m_nameToKeyCode.insert(QStringLiteral("+"), 321);
442  m_nameToKeyCode.insert(QStringLiteral("["), 322);
443  m_nameToKeyCode.insert(QStringLiteral("]"), 323);
444  m_nameToKeyCode.insert(QStringLiteral("{"), 324);
445  m_nameToKeyCode.insert(QStringLiteral("}"), 325);
446  m_nameToKeyCode.insert(QStringLiteral(":"), 326);
447  m_nameToKeyCode.insert(QStringLiteral(";"), 327);
448  m_nameToKeyCode.insert(QStringLiteral("@"), 328);
449  m_nameToKeyCode.insert(QStringLiteral("'"), 329);
450  m_nameToKeyCode.insert(QStringLiteral("#"), 330);
451  m_nameToKeyCode.insert(QStringLiteral("~"), 331);
452  m_nameToKeyCode.insert(QStringLiteral("\\"), 332);
453  m_nameToKeyCode.insert(QStringLiteral("|"), 333);
454  m_nameToKeyCode.insert(QStringLiteral(","), 334);
455  m_nameToKeyCode.insert(QStringLiteral("."), 335);
456  // m_nameToKeyCode.insert( QLatin1String( ">" ), 336 );
457  m_nameToKeyCode.insert(QStringLiteral("/"), 337);
458  m_nameToKeyCode.insert(QStringLiteral("?"), 338);
459  m_nameToKeyCode.insert(QStringLiteral(" "), 339);
460  // m_nameToKeyCode.insert( QLatin1String( "<" ), 341 );
461  m_nameToKeyCode.insert(QStringLiteral("0"), 340);
462  m_nameToKeyCode.insert(QStringLiteral("1"), 341);
463  m_nameToKeyCode.insert(QStringLiteral("2"), 342);
464  m_nameToKeyCode.insert(QStringLiteral("3"), 343);
465  m_nameToKeyCode.insert(QStringLiteral("4"), 344);
466  m_nameToKeyCode.insert(QStringLiteral("5"), 345);
467  m_nameToKeyCode.insert(QStringLiteral("6"), 346);
468  m_nameToKeyCode.insert(QStringLiteral("7"), 347);
469  m_nameToKeyCode.insert(QStringLiteral("8"), 348);
470  m_nameToKeyCode.insert(QStringLiteral("9"), 349);
471  m_nameToKeyCode.insert(QStringLiteral("cr"), 350);
472  m_nameToKeyCode.insert(QStringLiteral("leader"), 351);
473  m_nameToKeyCode.insert(QStringLiteral("nop"), 352);
474 
475  for (QHash<QString, int>::const_iterator i = m_nameToKeyCode.constBegin(); i != m_nameToKeyCode.constEnd(); ++i) {
476  m_keyCodeToName.insert(i.value(), i.key());
477  }
478 }
479 
480 QString KeyParser::qt2vi(int key) const
481 {
482  return (m_qt2katevi.contains(key) ? m_qt2katevi.value(key) : QStringLiteral("invalid"));
483 }
484 
485 int KeyParser::vi2qt(const QString &keypress) const
486 {
487  return (m_katevi2qt.contains(keypress) ? m_katevi2qt.value(keypress) : -1);
488 }
489 
490 int KeyParser::encoded2qt(const QString &keypress) const
491 {
492  QString key = KeyParser::self()->decodeKeySequence(keypress);
493 
494  if (key.length() > 2 && key[0] == QLatin1Char('<') && key[key.length() - 1] == QLatin1Char('>')) {
495  key = key.mid(1, key.length() - 2);
496  }
497  return (m_katevi2qt.contains(key) ? m_katevi2qt.value(key) : -1);
498 }
499 
500 const QString KeyParser::encodeKeySequence(const QString &keys) const
501 {
502  QString encodedSequence;
503  unsigned int keyCodeTemp = 0;
504 
505  bool insideTag = false;
506  QChar c;
507  for (int i = 0; i < keys.length(); i++) {
508  c = keys.at(i);
509  if (insideTag) {
510  if (c == QLatin1Char('>')) {
511  QString temp;
512  temp.setNum(0xE000 + keyCodeTemp, 16);
513  QChar code(0xE000 + keyCodeTemp);
514  encodedSequence.append(code);
515  keyCodeTemp = 0;
516  insideTag = false;
517  continue;
518  } else {
519  // contains modifiers
520  if (keys.midRef(i).indexOf(QLatin1Char('-')) != -1 && keys.midRef(i).indexOf(QLatin1Char('-')) < keys.midRef(i).indexOf(QLatin1Char('>'))) {
521  // Perform something similar to a split on '-', except that we want to keep the occurrences of '-'
522  // e.g. <c-s-a> will equate to the list of tokens "c-", "s-", "a".
523  // A straight split on '-' would give us "c", "s", "a", in which case we lose the piece of information that
524  // 'a' is just the 'a' key, not the 'alt' modifier.
525  const QString untilClosing = keys.mid(i, keys.midRef(i).indexOf(QLatin1Char('>'))).toLower();
526  QStringList tokens;
527  int currentPos = 0;
528  int nextHypen = -1;
529  while ((nextHypen = untilClosing.indexOf(QLatin1Char('-'), currentPos)) != -1) {
530  tokens << untilClosing.mid(currentPos, nextHypen - currentPos + 1);
531  currentPos = nextHypen + 1;
532  }
533  tokens << untilClosing.mid(currentPos);
534 
535  for (const QString &str : qAsConst(tokens)) {
536  if (str == QLatin1String("s-") && (keyCodeTemp & 0x01) != 0x1) {
537  keyCodeTemp += 0x1;
538  } else if (str == QLatin1String("c-") && (keyCodeTemp & 0x02) != 0x2) {
539  keyCodeTemp += 0x2;
540  } else if (str == QLatin1String("a-") && (keyCodeTemp & 0x04) != 0x4) {
541  keyCodeTemp += 0x4;
542  } else if (str == QLatin1String("m-") && (keyCodeTemp & 0x08) != 0x8) {
543  keyCodeTemp += 0x8;
544  } else {
545  if (m_nameToKeyCode.contains(str) || (str.length() == 1 && str.at(0).isLetterOrNumber())) {
546  if (m_nameToKeyCode.contains(str)) {
547  keyCodeTemp += m_nameToKeyCode.value(str) * 0x10;
548  } else {
549  keyCodeTemp += str.at(0).unicode() * 0x10;
550  }
551  } else {
552  int endOfBlock = keys.indexOf(QLatin1Char('>'));
553  if (endOfBlock -= -1) {
554  endOfBlock = keys.length() - 1;
555  }
556  encodedSequence.clear();
557  encodedSequence.append(m_nameToKeyCode.value(QStringLiteral("invalid")));
558  break;
559  }
560  }
561  }
562  } else {
563  QString str = keys.mid(i, keys.indexOf(QLatin1Char('>'), i) - i).toLower();
564  if (keys.indexOf(QLatin1Char('>'), i) != -1 && (m_nameToKeyCode.contains(str) || (str.length() == 1 && str.at(0).isLetterOrNumber()))) {
565  if (m_nameToKeyCode.contains(str)) {
566  keyCodeTemp += m_nameToKeyCode.value(str) * 0x10;
567  } else {
568  keyCodeTemp += str.at(0).unicode() * 0x10;
569  }
570  } else {
571  int endOfBlock = keys.indexOf(QLatin1Char('>'));
572  if (endOfBlock -= -1) {
573  endOfBlock = keys.length() - 1;
574  }
575  encodedSequence.clear();
576  keyCodeTemp = m_nameToKeyCode.value(QStringLiteral("invalid")) * 0x10;
577  }
578  }
579  i += keys.midRef(i, keys.midRef(i).indexOf(QLatin1Char('>'))).length() - 1;
580  }
581  } else {
582  if (c == QLatin1Char('<')) {
583  // If there's no closing '>', or if there is an opening '<' before the next '>', interpret as a literal '<'
584  // If we are <space>, encode as a literal " ".
585  const QStringRef rest = keys.midRef(i);
586  if (rest.indexOf(QLatin1Char('>'), 1) != -1 && rest.mid(1, rest.indexOf(QLatin1Char('>'), 1) - 1) == QLatin1String("space")) {
587  encodedSequence.append(QLatin1Char(' '));
588  i += rest.indexOf(QLatin1Char('>'), 1);
589  continue;
590  } else if (rest.indexOf(QLatin1Char('>'), 1) == -1 || (rest.indexOf(QLatin1Char('<'), 1) < rest.indexOf(QLatin1Char('>'), 1) && rest.indexOf(QLatin1Char('<'), 1) != -1)) {
591  encodedSequence.append(c);
592  continue;
593  }
594  insideTag = true;
595  continue;
596  } else {
597  encodedSequence.append(c);
598  }
599  }
600  }
601 
602  return encodedSequence;
603 }
604 
605 const QString KeyParser::decodeKeySequence(const QString &keys) const
606 {
607  QString ret;
608 
609  for (int i = 0; i < keys.length(); i++) {
610  QChar c = keys.at(i);
611  int keycode = c.unicode();
612 
613  if ((keycode & 0xE000) != 0xE000) {
614  ret.append(c);
615  } else {
616  ret.append(QLatin1Char('<'));
617 
618  if ((keycode & 0x1) == 0x1) {
619  ret.append(QLatin1String("s-"));
620  // keycode -= 0x1;
621  }
622  if ((keycode & 0x2) == 0x2) {
623  ret.append(QLatin1String("c-"));
624  // keycode -= 0x2;
625  }
626  if ((keycode & 0x4) == 0x4) {
627  ret.append(QLatin1String("a-"));
628  // keycode -= 0x4;
629  }
630  if ((keycode & 0x8) == 0x8) {
631  ret.append(QLatin1String("m-"));
632  // keycode -= 0x8;
633  }
634 
635  if ((keycode & 0xE000) == 0xE000) {
636  ret.append(m_keyCodeToName.value((keycode - 0xE000) / 0x10));
637  } else {
638  ret.append(QChar(keycode));
639  }
640  ret.append(QLatin1Char('>'));
641  }
642  }
643 
644  return ret;
645 }
646 
647 const QChar KeyParser::KeyEventToQChar(const QKeyEvent &keyEvent)
648 {
649  const int keyCode = keyEvent.key();
650  const QString &text = keyEvent.text();
651  const Qt::KeyboardModifiers mods = keyEvent.modifiers();
652 
653  // If previous key press was AltGr, return key value right away and don't go
654  // down the "handle modifiers" code path. AltGr is really confusing...
655  if (mods & Qt::GroupSwitchModifier) {
656  return (!text.isEmpty()) ? text.at(0) : QChar();
657  }
658 
659  if (text.isEmpty() || (text.length() == 1 && text.at(0) < 0x20) || keyCode == Qt::Key_Delete || (mods != Qt::NoModifier && mods != Qt::ShiftModifier && mods != Qt::KeypadModifier)) {
661 
662  keyPress.append(QLatin1Char('<'));
663  keyPress.append((mods & Qt::ShiftModifier) ? QStringLiteral("s-") : QString());
664  keyPress.append((mods & Qt::ControlModifier) ? QStringLiteral("c-") : QString());
665  keyPress.append((mods & Qt::AltModifier) ? QStringLiteral("a-") : QString());
666  keyPress.append((mods & Qt::MetaModifier) ? QStringLiteral("m-") : QString());
667  keyPress.append(keyCode <= 0xFF ? QChar(keyCode) : qt2vi(keyCode));
668  keyPress.append(QLatin1Char('>'));
669 
670  return encodeKeySequence(keyPress).at(0);
671  } else {
672  return text.at(0);
673  }
674 }
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const const
typedef KeyboardModifiers
Qt::KeyboardModifiers modifiers() const const
QString & append(QChar ch)
QHash::iterator insert(const Key &key, const T &value)
int indexOf(const QString &str, int from, Qt::CaseSensitivity cs) const const
void clear()
QHash::const_iterator constEnd() const const
void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier, int delay)
bool isEmpty() const const
QString text() const const
ushort unicode() const const
const T value(const Key &key) const const
int key() const const
QStringRef midRef(int position, int n) const const
QHash::const_iterator constBegin() const const
QString mid(int position, int n) const const
QString & setNum(short n, int base)
const QChar at(int position) const const
int length() const const
QStringRef mid(int position, int n) const const
bool contains(const Key &key) const const
Key_Escape
for encoding keypresses w/ modifiers into an internal QChar representation and back again to a descri...
Definition: keyparser.h:24
bool isLetterOrNumber() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Wed Sep 23 2020 22:58:23 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.