1 /* keybindings.cpp --
2 Copyright (C) 2005 Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
37
38 #include "keybindings.h"
39
40 /* InputEvent key modifiers */
41 #define SHIFT_MASK 1
42 #define CTRL_MASK 2
43 #define META_MASK 4
44 #define ALT_MASK 8
45 #define ALT_GRAPH_MASK 0x20
46 #define BUTTON1_MASK 0x10
47 #define BUTTON2_MASK 8
48 #define BUTTON3_MASK 4
49
50 #define SHIFT_DOWN_MASK 0x0040
51 #define CTRL_DOWN_MASK 0x0080
52 #define META_DOWN_MASK 0x0100
53 #define ALT_DOWN_MASK 0x0200
54 #define BUTTON1_DOWN_MASK 0x0400
55 #define BUTTON2_DOWN_MASK 0x0800
56 #define BUTTON3_DOWN_MASK 0x1000
57 #define ALT_GRAPH_DOWN_MASK 0x2000
58
59 /* Virtual Keys */
60 /* This list should be kept in the same order as the VK_ field
61 declarations in KeyEvent.java. */
62 #define VK_ENTER '\n'
63 #define VK_BACK_SPACE '\b'
64 #define VK_TAB '\t'
65 #define VK_CANCEL 3
66 #define VK_CLEAR 12
67 #define VK_SHIFT 16
68 #define VK_CONTROL 17
69 #define VK_ALT 18
70 #define VK_PAUSE 19
71 #define VK_CAPS_LOCK 20
72 #define VK_ESCAPE 27
73 #define VK_SPACE ' '
74 #define VK_PAGE_UP 33
75 #define VK_PAGE_DOWN 34
76 #define VK_END 35
77 #define VK_HOME 36
78 #define VK_LEFT 37
79 #define VK_UP 38
80 #define VK_RIGHT 39
81 #define VK_DOWN 40
82 #define VK_COMMA ','
83 #define VK_MINUS '-'
84 #define VK_PERIOD '.'
85 #define VK_SLASH '/'
86 #define VK_0 '0'
87 #define VK_1 '1'
88 #define VK_2 '2'
89 #define VK_3 '3'
90 #define VK_4 '4'
91 #define VK_5 '5'
92 #define VK_6 '6'
93 #define VK_7 '7'
94 #define VK_8 '8'
95 #define VK_9 '9'
96 #define VK_SEMICOLON ';'
97 #define VK_EQUALS '='
98 #define VK_A 'A'
99 #define VK_B 'B'
100 #define VK_C 'C'
101 #define VK_D 'D'
102 #define VK_E 'E'
103 #define VK_F 'F'
104 #define VK_G 'G'
105 #define VK_H 'H'
106 #define VK_I 'I'
107 #define VK_J 'J'
108 #define VK_K 'K'
109 #define VK_L 'L'
110 #define VK_M 'M'
111 #define VK_N 'N'
112 #define VK_O 'O'
113 #define VK_P 'P'
114 #define VK_Q 'Q'
115 #define VK_R 'R'
116 #define VK_S 'S'
117 #define VK_T 'T'
118 #define VK_U 'U'
119 #define VK_V 'V'
120 #define VK_W 'W'
121 #define VK_X 'X'
122 #define VK_Y 'Y'
123 #define VK_Z 'Z'
124 #define VK_OPEN_BRACKET '['
125 #define VK_BACK_SLASH '\\'
126 #define VK_CLOSE_BRACKET ']'
127 #define VK_NUMPAD0 96
128 #define VK_NUMPAD1 97
129 #define VK_NUMPAD2 98
130 #define VK_NUMPAD3 99
131 #define VK_NUMPAD4 100
132 #define VK_NUMPAD5 101
133 #define VK_NUMPAD6 102
134 #define VK_NUMPAD7 103
135 #define VK_NUMPAD8 104
136 #define VK_NUMPAD9 105
137 #define VK_MULTIPLY 106
138 #define VK_ADD 107
139 #define VK_SEPARATER 108
140 #define VK_SEPARATOR 108
141 #define VK_SUBTRACT 109
142 #define VK_DECIMAL 110
143 #define VK_DIVIDE 111
144 #define VK_DELETE 127
145 #define VK_NUM_LOCK 144
146 #define VK_SCROLL_LOCK 145
147 #define VK_F1 112
148 #define VK_F2 113
149 #define VK_F3 114
150 #define VK_F4 115
151 #define VK_F5 116
152 #define VK_F6 117
153 #define VK_F7 118
154 #define VK_F8 119
155 #define VK_F9 120
156 #define VK_F10 121
157 #define VK_F11 122
158 #define VK_F12 123
159 #define VK_F13 61440
160 #define VK_F14 61441
161 #define VK_F15 61442
162 #define VK_F16 61443
163 #define VK_F17 61444
164 #define VK_F18 61445
165 #define VK_F19 61446
166 #define VK_F20 61447
167 #define VK_F21 61448
168 #define VK_F22 61449
169 #define VK_F23 61450
170 #define VK_F24 61451
171 #define VK_PRINTSCREEN 154
172 #define VK_INSERT 155
173 #define VK_HELP 156
174 #define VK_META 157
175 #define VK_BACK_QUOTE 192
176 #define VK_QUOTE 222
177 #define VK_KP_UP 224
178 #define VK_KP_DOWN 225
179 #define VK_KP_LEFT 226
180 #define VK_KP_RIGHT 227
181 #define VK_DEAD_GRAVE 128
182 #define VK_DEAD_ACUTE 129
183 #define VK_DEAD_CIRCUMFLEX 130
184 #define VK_DEAD_TILDE 131
185 #define VK_DEAD_MACRON 132
186 #define VK_DEAD_BREVE 133
187 #define VK_DEAD_ABOVEDOT 134
188 #define VK_DEAD_DIAERESIS 135
189 #define VK_DEAD_ABOVERING 136
190 #define VK_DEAD_DOUBLEACUTE 137
191 #define VK_DEAD_CARON 138
192 #define VK_DEAD_CEDILLA 139
193 #define VK_DEAD_OGONEK 140
194 #define VK_DEAD_IOTA 141
195 #define VK_DEAD_VOICED_SOUND 142
196 #define VK_DEAD_SEMIVOICED_SOUND 143
197 #define VK_AMPERSAND 150
198 #define VK_ASTERISK 151
199 #define VK_QUOTEDBL 152
200 #define VK_LESS 153
201 #define VK_GREATER 160
202 #define VK_BRACELEFT 161
203 #define VK_BRACERIGHT 162
204 #define VK_AT 512
205 #define VK_COLON 513
206 #define VK_CIRCUMFLEX 514
207 #define VK_DOLLAR 515
208 #define VK_EURO_SIGN 516
209 #define VK_EXCLAMATION_MARK 517
210 #define VK_INVERTED_EXCLAMATION_MARK 518
211 #define VK_LEFT_PARENTHESIS 519
212 #define VK_NUMBER_SIGN 520
213 #define VK_PLUS 521
214 #define VK_RIGHT_PARENTHESIS 522
215 #define VK_UNDERSCORE 523
216 #define VK_FINAL 24
217 #define VK_CONVERT 28
218 #define VK_NONCONVERT 29
219 #define VK_ACCEPT 30
220 #define VK_MODECHANGE 31
221 #define VK_KANA 21
222 #define VK_KANJI 25
223 #define VK_ALPHANUMERIC 240
224 #define VK_KATAKANA 241
225 #define VK_HIRAGANA 242
226 #define VK_FULL_WIDTH 243
227 #define VK_HALF_WIDTH 244
228 #define VK_ROMAN_CHARACTERS 245
229 #define VK_ALL_CANDIDATES 256
230 #define VK_PREVIOUS_CANDIDATE 257
231 #define VK_CODE_INPUT 258
232 #define VK_JAPANESE_KATAKANA 259
233 #define VK_JAPANESE_HIRAGANA 260
234 #define VK_JAPANESE_ROMAN 261
235 #define VK_KANA_LOCK 262
236 #define VK_INPUT_METHOD_ON_OFF 263
237 #define VK_CUT 65489
238 #define VK_COPY 65485
239 #define VK_PASTE 65487
240 #define VK_UNDO 65483
241 #define VK_AGAIN 65481
242 #define VK_FIND 65488
243 #define VK_PROPS 65482
244 #define VK_STOP 65480
245 #define VK_COMPOSE 65312
246 #define VK_ALT_GRAPH 65406
247 #define VK_UNDEFINED 0
248
249
mapKeyCode(QKeyEvent * key)250 int mapKeyCode(QKeyEvent *key)
251 {
252 switch(key->key())
253 {
254 case Qt::Key_Escape:
255 return VK_ESCAPE;
256 case Qt::Key_Tab:
257 return VK_TAB;
258 case Qt::Key_Backspace:
259 return VK_BACK_SPACE;
260 case Qt::Key_Return:
261 case Qt::Key_Enter:
262 return VK_ENTER;
263 case Qt::Key_Insert:
264 return VK_INSERT;
265 case Qt::Key_Delete:
266 return VK_DELETE;
267 case Qt::Key_Pause:
268 return VK_PAUSE;
269 case Qt::Key_Print:
270 case Qt::Key_SysReq:
271 return VK_PRINTSCREEN;
272 case Qt::Key_Home:
273 return VK_HOME;
274 case Qt::Key_End:
275 return VK_END;
276 case Qt::Key_Left:
277 return VK_LEFT;
278 case Qt::Key_Up:
279 return VK_UP;
280 case Qt::Key_Right:
281 return VK_RIGHT;
282 case Qt::Key_Down:
283 return VK_DOWN;
284 case Qt::Key_PageUp:
285 return VK_PAGE_UP;
286 case Qt::Key_PageDown:
287 return VK_PAGE_DOWN;
288 case Qt::Key_Shift:
289 return VK_SHIFT;
290 case Qt::Key_Control:
291 return VK_CONTROL;
292 case Qt::Key_Meta:
293 return VK_META;
294 case Qt::Key_Alt:
295 return VK_ALT;
296 case Qt::Key_CapsLock:
297 return VK_CAPS_LOCK;
298 case Qt::Key_NumLock:
299 return VK_NUM_LOCK;
300 case Qt::Key_ScrollLock:
301 return VK_SCROLL_LOCK;
302 case Qt::Key_Clear:
303 return VK_CLEAR;
304 case Qt::Key_F1:
305 return VK_F1;
306 case Qt::Key_F2:
307 return VK_F2;
308 case Qt::Key_F3:
309 return VK_F3;
310 case Qt::Key_F4:
311 return VK_F4;
312 case Qt::Key_F5:
313 return VK_F5;
314 case Qt::Key_F6:
315 return VK_F6;
316 case Qt::Key_F7:
317 return VK_F7;
318 case Qt::Key_F8:
319 return VK_F8;
320 case Qt::Key_F9:
321 return VK_F9;
322 case Qt::Key_F10:
323 return VK_F10;
324 case Qt::Key_F11:
325 return VK_F11;
326 case Qt::Key_F12:
327 return VK_F12;
328 case Qt::Key_F13:
329 return VK_F13;
330 case Qt::Key_F14:
331 return VK_F14;
332 case Qt::Key_F15:
333 return VK_F15;
334 case Qt::Key_F16:
335 return VK_F16;
336 case Qt::Key_F17:
337 return VK_F17;
338 case Qt::Key_F18:
339 return VK_F18;
340 case Qt::Key_F19:
341 return VK_F19;
342 case Qt::Key_F20:
343 return VK_F20;
344 case Qt::Key_F21:
345 return VK_F21;
346 case Qt::Key_F22:
347 return VK_F22;
348 case Qt::Key_F23:
349 return VK_F23;
350 case Qt::Key_F24:
351 return VK_F24;
352 case Qt::Key_Help:
353 return VK_HELP;
354
355 case Qt::Key_Space:
356 return VK_SPACE;
357
358 case Qt::Key_Exclam:
359 return VK_EXCLAMATION_MARK;
360 case Qt::Key_QuoteDbl:
361 return VK_QUOTEDBL;
362 case Qt::Key_NumberSign:
363 return VK_NUMBER_SIGN;
364
365 case Qt::Key_Dollar:
366 return VK_DOLLAR;
367
368
369 case Qt::Key_Ampersand:
370 return VK_AMPERSAND;
371
372 case Qt::Key_ParenLeft:
373 return VK_LEFT_PARENTHESIS;
374 case Qt::Key_ParenRight:
375 return VK_RIGHT_PARENTHESIS;
376 case Qt::Key_Asterisk:
377 return VK_ASTERISK;
378 case Qt::Key_Plus:
379 return VK_PLUS;
380 case Qt::Key_Comma:
381 return VK_COMMA;
382 case Qt::Key_Minus:
383 return VK_MINUS;
384 case Qt::Key_Period:
385 return VK_PERIOD;
386 case Qt::Key_Slash:
387 return VK_SLASH;
388
389 case Qt::Key_0:
390 return VK_0;
391 case Qt::Key_1:
392 return VK_1;
393 case Qt::Key_2:
394 return VK_2;
395 case Qt::Key_3:
396 return VK_3;
397 case Qt::Key_4:
398 return VK_4;
399 case Qt::Key_5:
400 return VK_5 ;
401 case Qt::Key_6:
402 return VK_6;
403 case Qt::Key_7:
404 return VK_7;
405 case Qt::Key_8:
406 return VK_8;
407 case Qt::Key_9:
408 return VK_9;
409
410 case Qt::Key_Colon:
411 return VK_COLON;
412 case Qt::Key_Semicolon:
413 return VK_SEMICOLON;
414 case Qt::Key_Less:
415 return VK_LESS;
416 case Qt::Key_Equal:
417 return VK_EQUALS;
418 case Qt::Key_Greater:
419 return VK_GREATER;
420 case Qt::Key_Question:
421 case Qt::Key_At:
422
423 case Qt::Key_A:
424 return VK_A;
425 case Qt::Key_B:
426 return VK_B;
427 case Qt::Key_C:
428 return VK_C;
429 case Qt::Key_D:
430 return VK_D;
431 case Qt::Key_E:
432 return VK_E;
433 case Qt::Key_F:
434 return VK_F;
435 case Qt::Key_G:
436 return VK_G;
437 case Qt::Key_H:
438 return VK_H;
439 case Qt::Key_I:
440 return VK_I;
441 case Qt::Key_J:
442 return VK_J;
443 case Qt::Key_K:
444 return VK_K;
445 case Qt::Key_L:
446 return VK_L;
447 case Qt::Key_M:
448 return VK_M;
449 case Qt::Key_N:
450 return VK_N;
451 case Qt::Key_O:
452 return VK_O;
453 case Qt::Key_P:
454 return VK_P;
455 case Qt::Key_Q:
456 return VK_Q;
457 case Qt::Key_R:
458 return VK_R;
459 case Qt::Key_S:
460 return VK_S;
461 case Qt::Key_T:
462 return VK_T;
463 case Qt::Key_U:
464 return VK_U;
465 case Qt::Key_V:
466 return VK_V;
467 case Qt::Key_W:
468 return VK_W;
469 case Qt::Key_X:
470 return VK_X;
471 case Qt::Key_Y:
472 return VK_Y;
473 case Qt::Key_Z:
474 return VK_Z;
475 case Qt::Key_division:
476 return VK_DIVIDE;
477 case Qt::Key_BracketLeft:
478 return VK_OPEN_BRACKET;
479 case Qt::Key_Backslash:
480 return VK_BACK_SLASH;
481 case Qt::Key_BracketRight:
482 return VK_CLOSE_BRACKET;
483 case Qt::Key_BraceLeft:
484 return VK_BRACELEFT;
485 case Qt::Key_BraceRight:
486 return VK_BRACERIGHT;
487 case Qt::Key_brokenbar:
488 return VK_SEPARATOR; // correct?
489
490 default:
491 return VK_UNDEFINED;
492 }
493 }
494
getUnicode(QKeyEvent * key)495 int getUnicode(QKeyEvent *key)
496 {
497 QString s = key->text();
498 if(s.isEmpty())
499 return 0; // CHAR_UNDEFINED
500 QChar c = s.at(0);
501 return (int)c.unicode();
502 }
503
504 /**
505 * Returns the key modifiers in KeyEvent format
506 */
getKeyModifiers(Qt::KeyboardModifiers state)507 int getKeyModifiers(Qt::KeyboardModifiers state)
508 {
509 int modifier = 0;
510 if( state & Qt::ShiftModifier )
511 modifier |= SHIFT_DOWN_MASK;
512 if( state & Qt::ControlModifier )
513 modifier |= CTRL_DOWN_MASK;
514 if( state & Qt::AltModifier )
515 modifier |= ALT_DOWN_MASK;
516 if( state & Qt::MetaModifier )
517 modifier |= META_DOWN_MASK;
518
519 return modifier;
520 }
521
522 /**
523 * Returns the key modifiers in ActionEvent format
524 */
getAEKeyModifiers(Qt::KeyboardModifiers state)525 int getAEKeyModifiers(Qt::KeyboardModifiers state)
526 {
527 int modifier = 0;
528 if( state & Qt::ShiftModifier )
529 modifier |= SHIFT_MASK;
530 if( state & Qt::ControlModifier )
531 modifier |= CTRL_MASK;
532 if( state & Qt::AltModifier )
533 modifier |= ALT_MASK;
534 if( state & Qt::MetaModifier )
535 modifier |= META_MASK;
536
537 return modifier;
538 }
539
540 /**
541 * Returns the mouse modifiers in InputEvent format
542 */
getMouseModifiers(QMouseEvent * e)543 int getMouseModifiers(QMouseEvent *e)
544 {
545 int modifier = 0;
546 int buttons = e->buttons();
547 int state = e->modifiers();
548
549 if( buttons & Qt::LeftButton )
550 modifier |= BUTTON1_DOWN_MASK;
551 if( buttons & Qt::MidButton )
552 modifier |= BUTTON2_DOWN_MASK;
553 if( buttons & Qt::RightButton )
554 modifier |= BUTTON3_DOWN_MASK;
555
556 if( state & Qt::ShiftModifier )
557 modifier |= SHIFT_DOWN_MASK;
558 if( state & Qt::ControlModifier )
559 modifier |= CTRL_DOWN_MASK;
560 if( state & Qt::AltModifier )
561 modifier |= ALT_DOWN_MASK;
562 if( state & Qt::MetaModifier )
563 modifier |= META_DOWN_MASK;
564
565 // FIXME: Alt Gr?
566 return modifier;
567 }
568
569 /**
570 * Returns the mouse modifiers in InputEvent format
571 * We need a different method here because e->buttons() doesn't work for,
572 * mouseReleased events. (But strangely enough it does for pressed ones)
573 */
getReleaseModifiers(QMouseEvent * e)574 int getReleaseModifiers(QMouseEvent *e)
575 {
576 int modifier = 0;
577 int button = e->button();
578 int state = e->modifiers();
579
580 if( button & Qt::LeftButton )
581 modifier |= BUTTON1_DOWN_MASK;
582 if( button & Qt::MidButton )
583 modifier |= BUTTON2_DOWN_MASK;
584 if( button & Qt::RightButton )
585 modifier |= BUTTON3_DOWN_MASK;
586
587 if( state & Qt::ShiftModifier )
588 modifier |= SHIFT_DOWN_MASK;
589 if( state & Qt::ControlModifier )
590 modifier |= CTRL_DOWN_MASK;
591 if( state & Qt::AltModifier )
592 modifier |= ALT_DOWN_MASK;
593 if( state & Qt::MetaModifier )
594 modifier |= META_DOWN_MASK;
595
596 // FIXME: Alt Gr?
597 return modifier;
598 }
599
600
601