2 * \file qt4/GuiKeySymbol.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Asger & Jürgen
8 * Full author contact details are available in file CREDITS.
13 #include "KeySymbol.h"
15 #include "qt_helpers.h"
17 #include "support/lassert.h"
18 #include "support/debug.h"
24 #include <QKeySequence>
37 * Return true if the key event is a modifier.
39 static bool isModifier(int qkey
)
58 * Return the numeric Qt Key corresponding to the
61 static int string_to_qkey(std::string
const & str
)
65 if (str
== "Escape") return Qt::Key_Escape
;
66 if (str
== "Tab") return Qt::Key_Tab
;
67 if (str
== "ISO_Left_Tab") return Qt::Key_Tab
;
68 if (str
== "BackSpace") return Qt::Key_Backspace
;
69 if (str
== "Return") return Qt::Key_Return
;
70 if (str
== "KP_Enter") return Qt::Key_Enter
; // correct ?
71 if (str
== "Insert") return Qt::Key_Insert
;
72 if (str
== "KP_Insert") return Qt::Key_Insert
;
73 if (str
== "Delete") return Qt::Key_Delete
;
74 if (str
== "KP_Delete") return Qt::Key_Delete
;
75 if (str
== "Pause") return Qt::Key_Pause
;
76 if (str
== "Print") return Qt::Key_Print
;
77 if (str
== "Sys_Req") return Qt::Key_SysReq
;
78 if (str
== "Home") return Qt::Key_Home
;
79 if (str
== "End") return Qt::Key_End
;
80 if (str
== "Left") return Qt::Key_Left
;
81 if (str
== "Up") return Qt::Key_Up
;
82 if (str
== "Right") return Qt::Key_Right
;
83 if (str
== "Down") return Qt::Key_Down
;
84 if (str
== "Prior") return Qt::Key_PageUp
;
85 if (str
== "Next") return Qt::Key_PageDown
;
86 if (str
== "KP_Home") return Qt::Key_Home
;
87 if (str
== "KP_End") return Qt::Key_End
;
88 if (str
== "KP_Left") return Qt::Key_Left
;
89 if (str
== "KP_Up") return Qt::Key_Up
;
90 if (str
== "KP_Right") return Qt::Key_Right
;
91 if (str
== "KP_Down") return Qt::Key_Down
;
92 if (str
== "KP_Prior") return Qt::Key_PageUp
;
93 if (str
== "KP_Next") return Qt::Key_PageDown
;
94 if (str
== "Shift_L") return Qt::Key_Shift
;
95 if (str
== "Control_L") return Qt::Key_Control
;
96 if (str
== "Alt_L") return Qt::Key_Meta
; // correct ?
97 if (str
== "Alt_R") return Qt::Key_Alt
;
98 if (str
== "Caps_Lock") return Qt::Key_CapsLock
;
99 if (str
== "Num_Lock") return Qt::Key_NumLock
;
100 if (str
== "Scroll_Lock") return Qt::Key_ScrollLock
;
101 if (str
== "F1") return Qt::Key_F1
;
102 if (str
== "F2") return Qt::Key_F2
;
103 if (str
== "F3") return Qt::Key_F3
;
104 if (str
== "F4") return Qt::Key_F4
;
105 if (str
== "F5") return Qt::Key_F5
;
106 if (str
== "F6") return Qt::Key_F6
;
107 if (str
== "F7") return Qt::Key_F7
;
108 if (str
== "F8") return Qt::Key_F8
;
109 if (str
== "F9") return Qt::Key_F9
;
110 if (str
== "F10") return Qt::Key_F10
;
111 if (str
== "F11") return Qt::Key_F11
;
112 if (str
== "F12") return Qt::Key_F12
;
113 if (str
== "F13") return Qt::Key_F13
;
114 if (str
== "F14") return Qt::Key_F14
;
115 if (str
== "F15") return Qt::Key_F15
;
116 if (str
== "F16") return Qt::Key_F16
;
117 if (str
== "F17") return Qt::Key_F17
;
118 if (str
== "F18") return Qt::Key_F18
;
119 if (str
== "F19") return Qt::Key_F19
;
120 if (str
== "F20") return Qt::Key_F20
;
121 if (str
== "F21") return Qt::Key_F21
;
122 if (str
== "F22") return Qt::Key_F22
;
123 if (str
== "F23") return Qt::Key_F23
;
124 if (str
== "F24") return Qt::Key_F24
;
125 if (str
== "F25") return Qt::Key_F25
;
126 if (str
== "F26") return Qt::Key_F26
;
127 if (str
== "F27") return Qt::Key_F27
;
128 if (str
== "F28") return Qt::Key_F28
;
129 if (str
== "F29") return Qt::Key_F29
;
130 if (str
== "F30") return Qt::Key_F30
;
131 if (str
== "F31") return Qt::Key_F31
;
132 if (str
== "F32") return Qt::Key_F32
;
133 if (str
== "F33") return Qt::Key_F33
;
134 if (str
== "F34") return Qt::Key_F34
;
135 if (str
== "F35") return Qt::Key_F35
;
136 if (str
== "0") return Qt::Key_0
;
137 if (str
== "1") return Qt::Key_1
;
138 if (str
== "2") return Qt::Key_2
;
139 if (str
== "3") return Qt::Key_3
;
140 if (str
== "4") return Qt::Key_4
;
141 if (str
== "5") return Qt::Key_5
;
142 if (str
== "6") return Qt::Key_6
;
143 if (str
== "7") return Qt::Key_7
;
144 if (str
== "8") return Qt::Key_8
;
145 if (str
== "9") return Qt::Key_9
;
146 if (str
== "KP_0") return Qt::Key_0
;
147 if (str
== "KP_1") return Qt::Key_1
;
148 if (str
== "KP_2") return Qt::Key_2
;
149 if (str
== "KP_3") return Qt::Key_3
;
150 if (str
== "KP_4") return Qt::Key_4
;
151 if (str
== "KP_5") return Qt::Key_5
;
152 if (str
== "KP_6") return Qt::Key_6
;
153 if (str
== "KP_7") return Qt::Key_7
;
154 if (str
== "KP_8") return Qt::Key_8
;
155 if (str
== "KP_9") return Qt::Key_9
;
156 if (str
== "colon") return Qt::Key_Colon
;
157 if (str
== "semicolon") return Qt::Key_Semicolon
;
158 if (str
== "less") return Qt::Key_Less
;
159 if (str
== "equal") return Qt::Key_Equal
;
160 if (str
== "greater") return Qt::Key_Greater
;
161 if (str
== "question") return Qt::Key_Question
;
162 if (str
== "at") return Qt::Key_At
;
163 if (str
== "A") return Qt::Key_A
;
164 if (str
== "B") return Qt::Key_B
;
165 if (str
== "C") return Qt::Key_C
;
166 if (str
== "D") return Qt::Key_D
;
167 if (str
== "E") return Qt::Key_E
;
168 if (str
== "F") return Qt::Key_F
;
169 if (str
== "G") return Qt::Key_G
;
170 if (str
== "H") return Qt::Key_H
;
171 if (str
== "I") return Qt::Key_I
;
172 if (str
== "J") return Qt::Key_J
;
173 if (str
== "K") return Qt::Key_K
;
174 if (str
== "L") return Qt::Key_L
;
175 if (str
== "M") return Qt::Key_M
;
176 if (str
== "N") return Qt::Key_N
;
177 if (str
== "O") return Qt::Key_O
;
178 if (str
== "P") return Qt::Key_P
;
179 if (str
== "Q") return Qt::Key_Q
;
180 if (str
== "R") return Qt::Key_R
;
181 if (str
== "S") return Qt::Key_S
;
182 if (str
== "T") return Qt::Key_T
;
183 if (str
== "U") return Qt::Key_U
;
184 if (str
== "V") return Qt::Key_V
;
185 if (str
== "W") return Qt::Key_W
;
186 if (str
== "X") return Qt::Key_X
;
187 if (str
== "Y") return Qt::Key_Y
;
188 if (str
== "Z") return Qt::Key_Z
;
189 if (str
== "a") return Qt::Key_A
;
190 if (str
== "b") return Qt::Key_B
;
191 if (str
== "c") return Qt::Key_C
;
192 if (str
== "d") return Qt::Key_D
;
193 if (str
== "e") return Qt::Key_E
;
194 if (str
== "f") return Qt::Key_F
;
195 if (str
== "g") return Qt::Key_G
;
196 if (str
== "h") return Qt::Key_H
;
197 if (str
== "i") return Qt::Key_I
;
198 if (str
== "j") return Qt::Key_J
;
199 if (str
== "k") return Qt::Key_K
;
200 if (str
== "l") return Qt::Key_L
;
201 if (str
== "m") return Qt::Key_M
;
202 if (str
== "n") return Qt::Key_N
;
203 if (str
== "o") return Qt::Key_O
;
204 if (str
== "p") return Qt::Key_P
;
205 if (str
== "q") return Qt::Key_Q
;
206 if (str
== "r") return Qt::Key_R
;
207 if (str
== "s") return Qt::Key_S
;
208 if (str
== "t") return Qt::Key_T
;
209 if (str
== "u") return Qt::Key_U
;
210 if (str
== "v") return Qt::Key_V
;
211 if (str
== "w") return Qt::Key_W
;
212 if (str
== "x") return Qt::Key_X
;
213 if (str
== "y") return Qt::Key_Y
;
214 if (str
== "z") return Qt::Key_Z
;
215 if (str
== "bracketleft") return Qt::Key_BracketLeft
;
216 if (str
== "backslash") return Qt::Key_Backslash
;
217 if (str
== "bracketright") return Qt::Key_BracketRight
;
218 if (str
== "bar") return Qt::Key_Bar
;
219 if (str
== "underscore") return Qt::Key_Underscore
;
220 if (str
== "space") return Qt::Key_Space
;
221 if (str
== "parenleft") return Qt::Key_ParenLeft
;
222 if (str
== "parenright") return Qt::Key_ParenRight
;
223 if (str
== "quotedbl") return Qt::Key_QuoteDbl
;
224 if (str
== "quoteright") return Qt::Key_Apostrophe
;
225 if (str
== "quoteleft") return Qt::Key_QuoteLeft
;
226 if (str
== "exclam") return Qt::Key_Exclam
;
227 if (str
== "numbersign") return Qt::Key_NumberSign
;
228 if (str
== "asciicircum") return Qt::Key_AsciiCircum
;
229 if (str
== "dollar") return Qt::Key_Dollar
;
230 if (str
== "percent") return Qt::Key_Percent
;
231 if (str
== "ampersand") return Qt::Key_Ampersand
;
232 if (str
== "asterisk") return Qt::Key_Asterisk
;
233 if (str
== "KP_Multiply") return Qt::Key_Asterisk
;
234 if (str
== "apostrophe") return Qt::Key_Apostrophe
;
235 if (str
== "plus") return Qt::Key_Plus
;
236 if (str
== "KP_Add") return Qt::Key_Plus
;
237 if (str
== "minus") return Qt::Key_Minus
;
238 if (str
== "KP_Subtract") return Qt::Key_Minus
;
239 if (str
== "comma") return Qt::Key_Comma
;
240 if (str
== "period") return Qt::Key_Period
;
241 if (str
== "KP_Decimal") return Qt::Key_Period
;
242 if (str
== "slash") return Qt::Key_Slash
;
243 if (str
== "KP_Divide") return Qt::Key_Slash
;
244 if (str
== "asciitilde") return Qt::Key_AsciiTilde
;
245 if (str
== "braceleft") return Qt::Key_BraceLeft
;
246 if (str
== "braceright") return Qt::Key_BraceRight
;
247 if (str
== "grave") return Qt::Key_QuoteLeft
; // ???
248 if (str
== "notsign") return Qt::Key_notsign
;
249 if (str
== "nobreakspace") return Qt::Key_nobreakspace
;
250 if (str
== "exclamdown") return Qt::Key_exclamdown
;
251 if (str
== "cent") return Qt::Key_cent
;
252 if (str
== "sterling") return Qt::Key_sterling
;
253 if (str
== "currency") return Qt::Key_currency
;
254 if (str
== "yen") return Qt::Key_yen
;
255 if (str
== "brokenbar") return Qt::Key_brokenbar
;
256 if (str
== "section") return Qt::Key_section
;
257 if (str
== "diaeresis") return Qt::Key_diaeresis
;
258 if (str
== "copyright") return Qt::Key_copyright
;
259 if (str
== "ordfeminine") return Qt::Key_ordfeminine
;
260 if (str
== "guillemotleft") return Qt::Key_guillemotleft
;
261 if (str
== "hyphen") return Qt::Key_hyphen
;
262 if (str
== "registered") return Qt::Key_registered
;
263 if (str
== "macron") return Qt::Key_macron
;
264 if (str
== "degree") return Qt::Key_degree
;
265 if (str
== "plusminus") return Qt::Key_plusminus
;
266 if (str
== "twosuperior") return Qt::Key_twosuperior
;
267 if (str
== "threesuperior") return Qt::Key_threesuperior
;
268 if (str
== "acute") return Qt::Key_acute
;
269 if (str
== "mu") return Qt::Key_mu
;
270 if (str
== "paragraph") return Qt::Key_paragraph
;
271 if (str
== "periodcentered") return Qt::Key_periodcentered
;
272 if (str
== "cedilla") return Qt::Key_cedilla
;
273 if (str
== "onesuperior") return Qt::Key_onesuperior
;
274 if (str
== "masculine") return Qt::Key_masculine
;
275 if (str
== "guillemotright") return Qt::Key_guillemotright
;
276 if (str
== "onequarter") return Qt::Key_onequarter
;
277 if (str
== "onehalf") return Qt::Key_onehalf
;
278 if (str
== "threequarters") return Qt::Key_threequarters
;
279 if (str
== "questiondown") return Qt::Key_questiondown
;
280 if (str
== "Agrave") return Qt::Key_Agrave
;
281 if (str
== "Aacute") return Qt::Key_Aacute
;
282 if (str
== "Acircumflex") return Qt::Key_Acircumflex
;
283 if (str
== "Atilde") return Qt::Key_Atilde
;
284 if (str
== "Adiaeresis") return Qt::Key_Adiaeresis
;
285 if (str
== "Aring") return Qt::Key_Aring
;
286 if (str
== "AE") return Qt::Key_AE
;
287 if (str
== "Ccedilla") return Qt::Key_Ccedilla
;
288 if (str
== "Egrave") return Qt::Key_Egrave
;
289 if (str
== "Eacute") return Qt::Key_Eacute
;
290 if (str
== "Ecircumflex") return Qt::Key_Ecircumflex
;
291 if (str
== "Ediaeresis") return Qt::Key_Ediaeresis
;
292 if (str
== "Igrave") return Qt::Key_Igrave
;
293 if (str
== "Iacute") return Qt::Key_Iacute
;
294 if (str
== "Icircumflex") return Qt::Key_Icircumflex
;
295 if (str
== "Idiaeresis") return Qt::Key_Idiaeresis
;
296 if (str
== "ETH") return Qt::Key_ETH
;
297 if (str
== "Ntilde") return Qt::Key_Ntilde
;
298 if (str
== "Ograve") return Qt::Key_Ograve
;
299 if (str
== "Oacute") return Qt::Key_Oacute
;
300 if (str
== "Ocircumflex") return Qt::Key_Ocircumflex
;
301 if (str
== "Otilde") return Qt::Key_Otilde
;
302 if (str
== "Odiaeresis") return Qt::Key_Odiaeresis
;
303 if (str
== "multiply") return Qt::Key_multiply
;
304 if (str
== "Ooblique") return Qt::Key_Ooblique
;
305 if (str
== "Ugrave") return Qt::Key_Ugrave
;
306 if (str
== "Uacute") return Qt::Key_Uacute
;
307 if (str
== "Ucircumflex") return Qt::Key_Ucircumflex
;
308 if (str
== "Udiaeresis") return Qt::Key_Udiaeresis
;
309 if (str
== "Yacute") return Qt::Key_Yacute
;
310 if (str
== "THORN") return Qt::Key_THORN
;
311 if (str
== "ssharp") return Qt::Key_ssharp
;
312 if (str
== "agrave") return Qt::Key_Agrave
;
313 if (str
== "aacute") return Qt::Key_Aacute
;
314 if (str
== "acircumflex") return Qt::Key_Acircumflex
;
315 if (str
== "atilde") return Qt::Key_Atilde
;
316 if (str
== "adiaeresis") return Qt::Key_Adiaeresis
;
317 if (str
== "aring") return Qt::Key_Aring
;
318 if (str
== "ae") return Qt::Key_AE
;
319 if (str
== "ccedilla") return Qt::Key_Ccedilla
;
320 if (str
== "egrave") return Qt::Key_Egrave
;
321 if (str
== "eacute") return Qt::Key_Eacute
;
322 if (str
== "ecircumflex") return Qt::Key_Ecircumflex
;
323 if (str
== "ediaeresis") return Qt::Key_Ediaeresis
;
324 if (str
== "igrave") return Qt::Key_Igrave
;
325 if (str
== "iacute") return Qt::Key_Iacute
;
326 if (str
== "icircumflex") return Qt::Key_Icircumflex
;
327 if (str
== "idiaeresis") return Qt::Key_Idiaeresis
;
328 if (str
== "eth") return Qt::Key_ETH
;
329 if (str
== "ntilde") return Qt::Key_Ntilde
;
330 if (str
== "ograve") return Qt::Key_Ograve
;
331 if (str
== "oacute") return Qt::Key_Oacute
;
332 if (str
== "ocircumflex") return Qt::Key_Ocircumflex
;
333 if (str
== "otilde") return Qt::Key_Otilde
;
334 if (str
== "odiaeresis") return Qt::Key_Odiaeresis
;
335 if (str
== "division") return Qt::Key_division
;
336 if (str
== "oslash") return Qt::Key_Ooblique
;
337 if (str
== "ugrave") return Qt::Key_Ugrave
;
338 if (str
== "uacute") return Qt::Key_Uacute
;
339 if (str
== "ucircumflex") return Qt::Key_Ucircumflex
;
340 if (str
== "udiaeresis") return Qt::Key_Udiaeresis
;
341 if (str
== "yacute") return Qt::Key_Yacute
;
342 if (str
== "thorn") return Qt::Key_THORN
;
343 if (str
== "ydiaeresis") return Qt::Key_ydiaeresis
;
345 // FIXME, correct for all these ?
346 if (str
== "Super_L") return Qt::Key_Super_L
;
347 if (str
== "Super_R") return Qt::Key_Super_R
;
348 if (str
== "Menu") return Qt::Key_Menu
;
349 if (str
== "Hyper_L") return Qt::Key_Hyper_L
;
350 if (str
== "Hyper_R") return Qt::Key_Hyper_R
;
351 if (str
== "Help") return Qt::Key_Help
;
352 if (str
== "BackTab") return Qt::Key_Backtab
;
354 return Qt::Key_unknown
;
359 * qkey_to_string - convert Qt keypress into LyX
361 * Convert the Qt keypress into a string understandable
362 * by the LyX core (same as XKeysymToString).
364 static std::string
const qkey_to_string(int lkey
)
367 case Qt::Key_0
: return "0";
368 case Qt::Key_1
: return "1";
369 case Qt::Key_2
: return "2";
370 case Qt::Key_3
: return "3";
371 case Qt::Key_4
: return "4";
372 case Qt::Key_5
: return "5";
373 case Qt::Key_6
: return "6";
374 case Qt::Key_7
: return "7";
375 case Qt::Key_8
: return "8";
376 case Qt::Key_9
: return "9";
378 case Qt::Key_A
: return "a";
379 case Qt::Key_B
: return "b";
380 case Qt::Key_C
: return "c";
381 case Qt::Key_D
: return "d";
382 case Qt::Key_E
: return "e";
383 case Qt::Key_F
: return "f";
384 case Qt::Key_G
: return "g";
385 case Qt::Key_H
: return "h";
386 case Qt::Key_I
: return "i";
387 case Qt::Key_J
: return "j";
388 case Qt::Key_K
: return "k";
389 case Qt::Key_L
: return "l";
390 case Qt::Key_M
: return "m";
391 case Qt::Key_N
: return "n";
392 case Qt::Key_O
: return "o";
393 case Qt::Key_P
: return "p";
394 case Qt::Key_Q
: return "q";
395 case Qt::Key_R
: return "r";
396 case Qt::Key_S
: return "s";
397 case Qt::Key_T
: return "t";
398 case Qt::Key_U
: return "u";
399 case Qt::Key_V
: return "v";
400 case Qt::Key_W
: return "w";
401 case Qt::Key_X
: return "x";
402 case Qt::Key_Y
: return "y";
403 case Qt::Key_Z
: return "z";
405 case Qt::Key_Return
: return "Return";
406 case Qt::Key_Escape
: return "Escape";
407 case Qt::Key_Tab
: return "Tab";
408 case Qt::Key_Backspace
: return "BackSpace";
409 case Qt::Key_Insert
: return "Insert";
410 case Qt::Key_Delete
: return "Delete";
411 case Qt::Key_Pause
: return "Pause";
412 case Qt::Key_Print
: return "Print";
413 case Qt::Key_SysReq
: return "Sys_Req";
414 case Qt::Key_Home
: return "Home";
415 case Qt::Key_End
: return "End";
416 case Qt::Key_Left
: return "Left";
417 case Qt::Key_Up
: return "Up";
418 case Qt::Key_Right
: return "Right";
419 case Qt::Key_Down
: return "Down";
420 case Qt::Key_PageUp
: return "Prior";
421 case Qt::Key_PageDown
: return "Next";
422 case Qt::Key_Shift
: return "Shift_L";
423 case Qt::Key_Control
: return "Control_L";
424 case Qt::Key_Meta
: return "Alt_L"; // correct ?
425 case Qt::Key_Alt
: return "Alt_R";
426 case Qt::Key_CapsLock
: return "Caps_Lock";
427 case Qt::Key_NumLock
: return "Num_Lock";
428 case Qt::Key_ScrollLock
: return "Scroll_Lock";
429 case Qt::Key_F1
: return "F1";
430 case Qt::Key_F2
: return "F2";
431 case Qt::Key_F3
: return "F3";
432 case Qt::Key_F4
: return "F4";
433 case Qt::Key_F5
: return "F5";
434 case Qt::Key_F6
: return "F6";
435 case Qt::Key_F7
: return "F7";
436 case Qt::Key_F8
: return "F8";
437 case Qt::Key_F9
: return "F9";
438 case Qt::Key_F10
: return "F10";
439 case Qt::Key_F11
: return "F11";
440 case Qt::Key_F12
: return "F12";
441 case Qt::Key_F13
: return "F13";
442 case Qt::Key_F14
: return "F14";
443 case Qt::Key_F15
: return "F15";
444 case Qt::Key_F16
: return "F16";
445 case Qt::Key_F17
: return "F17";
446 case Qt::Key_F18
: return "F18";
447 case Qt::Key_F19
: return "F19";
448 case Qt::Key_F20
: return "F20";
449 case Qt::Key_F21
: return "F21";
450 case Qt::Key_F22
: return "F22";
451 case Qt::Key_F23
: return "F23";
452 case Qt::Key_F24
: return "F24";
453 case Qt::Key_F25
: return "F25";
454 case Qt::Key_F26
: return "F26";
455 case Qt::Key_F27
: return "F27";
456 case Qt::Key_F28
: return "F28";
457 case Qt::Key_F29
: return "F29";
458 case Qt::Key_F30
: return "F30";
459 case Qt::Key_F31
: return "F31";
460 case Qt::Key_F32
: return "F32";
461 case Qt::Key_F33
: return "F33";
462 case Qt::Key_F34
: return "F34";
463 case Qt::Key_F35
: return "F35";
464 case Qt::Key_Colon
: return "colon";
465 case Qt::Key_Semicolon
: return "semicolon";
466 case Qt::Key_Less
: return "less";
467 case Qt::Key_Equal
: return "equal";
468 case Qt::Key_Greater
: return "greater";
469 case Qt::Key_Question
: return "question";
470 case Qt::Key_At
: return "at";
471 case Qt::Key_BracketLeft
: return "bracketleft";
472 case Qt::Key_Backslash
: return "backslash";
473 case Qt::Key_BracketRight
: return "bracketright";
474 case Qt::Key_Underscore
: return "underscore";
475 case Qt::Key_Space
: return "space";
476 case Qt::Key_ParenLeft
: return "parenleft";
477 case Qt::Key_ParenRight
: return "parenright";
478 case Qt::Key_QuoteDbl
: return "quotedbl";
479 case Qt::Key_Exclam
: return "exclam";
480 case Qt::Key_NumberSign
: return "numbersign";
481 case Qt::Key_AsciiCircum
: return "asciicircum";
482 case Qt::Key_Dollar
: return "dollar";
483 case Qt::Key_Percent
: return "percent";
484 case Qt::Key_Ampersand
: return "ampersand";
485 case Qt::Key_Asterisk
: return "asterisk";
486 case Qt::Key_Apostrophe
: return "apostrophe";
487 case Qt::Key_Plus
: return "plus";
488 case Qt::Key_Minus
: return "minus";
489 case Qt::Key_Comma
: return "comma";
490 case Qt::Key_Period
: return "period";
491 case Qt::Key_Slash
: return "slash";
492 case Qt::Key_AsciiTilde
: return "asciitilde";
493 case Qt::Key_BraceLeft
: return "braceleft";
494 case Qt::Key_BraceRight
: return "braceright";
495 case Qt::Key_QuoteLeft
: return "grave"; // ???
496 case Qt::Key_notsign
: return "notsign";
497 case Qt::Key_nobreakspace
: return "nobreakspace";
498 case Qt::Key_exclamdown
: return "exclamdown";
499 case Qt::Key_cent
: return "cent";
500 case Qt::Key_sterling
: return "sterling";
501 case Qt::Key_currency
: return "currency";
502 case Qt::Key_yen
: return "yen";
503 case Qt::Key_brokenbar
: return "brokenbar";
504 case Qt::Key_section
: return "section";
505 case Qt::Key_diaeresis
: return "diaeresis";
506 case Qt::Key_copyright
: return "copyright";
507 case Qt::Key_ordfeminine
: return "ordfeminine";
508 case Qt::Key_guillemotleft
: return "guillemotleft";
509 case Qt::Key_hyphen
: return "hyphen";
510 case Qt::Key_registered
: return "registered";
511 case Qt::Key_macron
: return "macron";
512 case Qt::Key_degree
: return "degree";
513 case Qt::Key_plusminus
: return "plusminus";
514 case Qt::Key_twosuperior
: return "twosuperior";
515 case Qt::Key_threesuperior
: return "threesuperior";
516 case Qt::Key_acute
: return "acute";
517 case Qt::Key_mu
: return "mu";
518 case Qt::Key_paragraph
: return "paragraph";
519 case Qt::Key_periodcentered
: return "periodcentered";
520 case Qt::Key_cedilla
: return "cedilla";
521 case Qt::Key_onesuperior
: return "onesuperior";
522 case Qt::Key_masculine
: return "masculine";
523 case Qt::Key_guillemotright
: return "guillemotright";
524 case Qt::Key_onequarter
: return "onequarter";
525 case Qt::Key_onehalf
: return "onehalf";
526 case Qt::Key_threequarters
: return "threequarters";
527 case Qt::Key_questiondown
: return "questiondown";
528 case Qt::Key_Agrave
: return "Agrave";
529 case Qt::Key_Aacute
: return "Aacute";
530 case Qt::Key_Acircumflex
: return "Acircumflex";
531 case Qt::Key_Atilde
: return "Atilde";
532 case Qt::Key_Adiaeresis
: return "Adiaeresis";
533 case Qt::Key_Aring
: return "Aring";
534 case Qt::Key_AE
: return "AE";
535 case Qt::Key_Ccedilla
: return "Ccedilla";
536 case Qt::Key_Egrave
: return "Egrave";
537 case Qt::Key_Eacute
: return "Eacute";
538 case Qt::Key_Ecircumflex
: return "Ecircumflex";
539 case Qt::Key_Ediaeresis
: return "Ediaeresis";
540 case Qt::Key_Igrave
: return "Igrave";
541 case Qt::Key_Iacute
: return "Iacute";
542 case Qt::Key_Icircumflex
: return "Icircumflex";
543 case Qt::Key_Idiaeresis
: return "Idiaeresis";
544 case Qt::Key_ETH
: return "ETH";
545 case Qt::Key_Ntilde
: return "Ntilde";
546 case Qt::Key_Ograve
: return "Ograve";
547 case Qt::Key_Oacute
: return "Oacute";
548 case Qt::Key_Ocircumflex
: return "Ocircumflex";
549 case Qt::Key_Otilde
: return "Otilde";
550 case Qt::Key_Odiaeresis
: return "Odiaeresis";
551 case Qt::Key_multiply
: return "multiply";
552 case Qt::Key_Ooblique
: return "Ooblique";
553 case Qt::Key_Ugrave
: return "Ugrave";
554 case Qt::Key_Uacute
: return "Uacute";
555 case Qt::Key_Ucircumflex
: return "Ucircumflex";
556 case Qt::Key_Udiaeresis
: return "Udiaeresis";
557 case Qt::Key_Yacute
: return "Yacute";
558 case Qt::Key_THORN
: return "THORN";
559 case Qt::Key_ssharp
: return "ssharp";
560 case Qt::Key_ydiaeresis
: return "ydiaeresis";
562 // FIXME: these ones I don't know the names of ... help !
563 // what's here is basically guesses ...
564 case Qt::Key_Super_L
: return "Super_L";
565 case Qt::Key_Super_R
: return "Super_R";
566 case Qt::Key_Menu
: return "Menu";
567 case Qt::Key_Hyper_L
: return "Hyper_L";
568 case Qt::Key_Hyper_R
: return "Hyper_R";
569 case Qt::Key_Help
: return "Help";
570 case Qt::Key_Bar
: return "Bar";
571 case Qt::Key_Backtab
: return "BackTab";
574 case Qt::Key_unknown
: return "";
580 static char encode(string
const & encoding
, QString
const & str
)
582 typedef map
<string
, QTextCodec
*> EncodingMap
;
583 EncodingMap encoding_map
;
585 QTextCodec
* codec
= 0;
587 EncodingMap::const_iterator cit
= encoding_map
.find(encoding
);
588 if (cit
== encoding_map
.end()) {
589 LYXERR(Debug::KEY
, "Unrecognised encoding '" << encoding
<< "'.");
590 codec
= encoding_map
.find("")->second
;
596 LYXERR(Debug::KEY
, "No codec for encoding '" << encoding
<< "' found.");
600 LYXERR(Debug::KEY
, "Using codec " << codec
->name());
602 if (!codec
->canEncode(str
)) {
603 LYXERR(Debug::KEY
, "Oof. Can't encode the text !");
607 return codec
->fromUnicode(str
).data()[0];
612 void setKeySymbol(KeySymbol
* sym
, QKeyEvent
* ev
)
614 sym
->setKey(ev
->key());
615 if (ev
->text().isNull()) {
616 LYXERR(Debug::KEY
, "keyevent has isNull() text !");
617 sym
->setText(docstring());
620 LYXERR(Debug::KEY
, "Getting key " << ev
->key() << ", with text '"
621 << ev
->text() << "'");
622 // This is unsafe because ev->text() is the unicode representation of the
623 // key, not the name of the key. For example, Ctrl-x and Alt-x produce
625 sym
->setText(qstring_to_ucs4(ev
->text()));
626 LYXERR(Debug::KEY
, "Setting key to " << sym
->key() << ", "
627 << to_utf8(sym
->text()));
631 void KeySymbol::init(string
const & symbolname
)
633 key_
= string_to_qkey(symbolname
);
634 text_
= from_utf8(symbolname
);
635 LYXERR(Debug::KEY
, "Init key to " << key_
<< ", " << to_utf8(text_
));
639 bool KeySymbol::isOK() const
641 bool const ok
= !(text_
.empty() && key_
== Qt::Key_unknown
);
642 LYXERR(Debug::KEY
, "isOK is " << ok
);
647 bool KeySymbol::isModifier() const
649 bool const mod
= lyx::isModifier(key_
);
650 LYXERR(Debug::KEY
, "isModifier is " << mod
);
655 string
KeySymbol::getSymbolName() const
657 string name
= qkey_to_string(key_
);
661 name
= to_utf8(text_
);
667 char_type
KeySymbol::getUCSEncoded() const
672 // UTF16 has a maximum of two characters.
673 LASSERT(text_
.size() <= 2, /**/);
675 if (lyxerr
.debugging() && text_
.size() > 1) {
676 // We don't know yet how well support the full ucs4 range.
677 LYXERR(Debug::KEY
, "KeySymbol::getUCSEncoded()");
678 for (int i
= 0; i
!= int(text_
.size()); ++i
)
679 LYXERR(Debug::KEY
, "char " << i
<< ": " << int(text_
[i
]));
686 docstring
const KeySymbol::print(KeyModifier mod
, bool forgui
) const
690 if (mod
& ShiftModifier
)
691 tmpkey
+= Qt::ShiftModifier
;
692 if (mod
& ControlModifier
)
693 tmpkey
+= Qt::ControlModifier
;
694 if (mod
& AltModifier
)
695 tmpkey
+= Qt::AltModifier
;
697 QKeySequence
seq(tmpkey
);
701 str
= seq
.toString(QKeySequence::NativeText
);
704 // Qt/Mac does not use Command and friends in the
705 // portable case, but the windows-like Control+x (bug 5421).
706 str
= seq
.toString(QKeySequence::NativeText
);
707 str
.replace(QChar(0x21E7), qt_("Shift-"));
708 str
.replace(QChar(0x2303), qt_("Control-"));
709 str
.replace(QChar(0x2325), qt_("Option-"));
710 str
.replace(QChar(0x2318), qt_("Command-"));
712 str
= seq
.toString(QKeySequence::PortableText
);
716 return qstring_to_ucs4(str
);
720 bool KeySymbol::isText() const
724 LYXERR(Debug::KEY
, "text_ empty, isText() == false");
729 bool KeySymbol::operator==(KeySymbol
const & ks
) const
731 // we do not have enough info for a fair comparison, so return
732 // false. This works out OK because unknown text from Qt will
733 // get inserted anyway after the isText() check
734 if (key_
== Qt::Key_unknown
|| ks
.key_
== Qt::Key_unknown
)
736 return key_
== ks
.key_
;
740 KeyModifier
q_key_state(Qt::KeyboardModifiers state
)
742 KeyModifier k
= NoModifier
;
743 if (state
& Qt::ControlModifier
)
744 k
|= ControlModifier
;
745 if (state
& Qt::ShiftModifier
)
747 if (state
& Qt::AltModifier
|| state
& Qt::MetaModifier
)