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