48 |
{ |
{ |
49 |
jobject *peer_obj; |
jobject *peer_obj; |
50 |
int nwindows; |
int nwindows; |
51 |
GdkWindow ***windows; /* array of pointers to (GdkWindow *) */ |
/* array of pointers to (GdkWindow *) */ |
52 |
|
GdkWindow ***windows; |
53 |
}; |
}; |
54 |
|
|
55 |
static jint |
static jint |
69 |
} |
} |
70 |
|
|
71 |
static jint |
static jint |
72 |
state_to_awt_mods (int mods) |
state_to_awt_mods (guint state) |
73 |
{ |
{ |
74 |
jint result = 0; |
jint result = 0; |
75 |
|
|
76 |
if (mods & (GDK_SHIFT_MASK | GDK_LOCK_MASK)) |
if (state & GDK_SHIFT_MASK) |
77 |
result |= AWT_SHIFT_MASK; |
result |= AWT_SHIFT_MASK; |
78 |
if (mods & GDK_CONTROL_MASK) |
if (state & GDK_CONTROL_MASK) |
79 |
result |= AWT_CTRL_MASK; |
result |= AWT_CTRL_MASK; |
80 |
|
if (state & GDK_MOD1_MASK) |
81 |
|
result |= AWT_ALT_MASK; |
82 |
|
|
83 |
return result; |
return result; |
84 |
} |
} |
85 |
|
|
86 |
|
/* Modifier key events need special treatment. In Sun's peer |
87 |
|
implementation, when a modifier key is pressed, the KEY_PRESSED |
88 |
|
event has that modifier in its modifiers list. The corresponding |
89 |
|
KEY_RELEASED event's modifier list does not contain the modifier. |
90 |
|
For example, pressing and releasing the shift key will produce a |
91 |
|
key press event with modifiers=Shift, and a key release event with |
92 |
|
no modifiers. GDK's key events behave in the exact opposite way, |
93 |
|
so this translation code is needed. */ |
94 |
|
static jint |
95 |
|
keyevent_state_to_awt_mods (GdkEvent *event) |
96 |
|
{ |
97 |
|
jint result = 0; |
98 |
|
guint state; |
99 |
|
|
100 |
|
if (event->type == GDK_KEY_PRESS) |
101 |
|
{ |
102 |
|
state = event->key.state; |
103 |
|
|
104 |
|
if (event->key.keyval == GDK_Shift_L |
105 |
|
|| event->key.keyval == GDK_Shift_R) |
106 |
|
result |= AWT_SHIFT_MASK; |
107 |
|
else |
108 |
|
{ |
109 |
|
if (state & GDK_SHIFT_MASK) |
110 |
|
result |= AWT_SHIFT_MASK; |
111 |
|
} |
112 |
|
|
113 |
|
if (event->key.keyval == GDK_Control_L |
114 |
|
|| event->key.keyval == GDK_Control_R) |
115 |
|
result |= AWT_CTRL_MASK; |
116 |
|
else |
117 |
|
{ |
118 |
|
if (state & GDK_CONTROL_MASK) |
119 |
|
result |= AWT_CTRL_MASK; |
120 |
|
} |
121 |
|
|
122 |
|
if (event->key.keyval == GDK_Alt_L |
123 |
|
|| event->key.keyval == GDK_Alt_R) |
124 |
|
result |= AWT_ALT_MASK; |
125 |
|
else |
126 |
|
{ |
127 |
|
if (state & GDK_MOD1_MASK) |
128 |
|
result |= AWT_ALT_MASK; |
129 |
|
} |
130 |
|
} |
131 |
|
else if (event->type == GDK_KEY_RELEASE) |
132 |
|
{ |
133 |
|
state = event->key.state; |
134 |
|
|
135 |
|
if (event->key.keyval != GDK_Shift_L |
136 |
|
&& event->key.keyval != GDK_Shift_R) |
137 |
|
{ |
138 |
|
if (state & GDK_SHIFT_MASK) |
139 |
|
result |= AWT_SHIFT_MASK; |
140 |
|
} |
141 |
|
if (event->key.keyval != GDK_Control_L |
142 |
|
&& event->key.keyval != GDK_Control_R) |
143 |
|
{ |
144 |
|
if (state & GDK_CONTROL_MASK) |
145 |
|
result |= AWT_CTRL_MASK; |
146 |
|
} |
147 |
|
|
148 |
|
if (event->key.keyval != GDK_Alt_L |
149 |
|
&& event->key.keyval != GDK_Alt_R) |
150 |
|
{ |
151 |
|
if (state & GDK_MOD1_MASK) |
152 |
|
result |= AWT_ALT_MASK; |
153 |
|
} |
154 |
|
} |
155 |
|
|
156 |
|
return result; |
157 |
|
} |
158 |
|
|
159 |
|
/* Get the first keyval in the keymap for this event's keycode. The |
160 |
|
first keyval corresponds roughly to Java's notion of a virtual |
161 |
|
key. Returns the uppercase version of the first keyval. */ |
162 |
|
static guint |
163 |
|
get_first_keyval_from_keymap (GdkEvent *event) |
164 |
|
{ |
165 |
|
guint keyval; |
166 |
|
guint *keyvals; |
167 |
|
gint n_entries; |
168 |
|
|
169 |
|
if (!gdk_keymap_get_entries_for_keycode (NULL, |
170 |
|
event->key.hardware_keycode, |
171 |
|
NULL, |
172 |
|
&keyvals, |
173 |
|
&n_entries)) |
174 |
|
{ |
175 |
|
g_warning ("No keyval found for hardware keycode %d\n", |
176 |
|
event->key.hardware_keycode); |
177 |
|
/* Try to recover by using the keyval in the event structure. */ |
178 |
|
keyvals = &(event->key.keyval); |
179 |
|
} |
180 |
|
keyval = keyvals[0]; |
181 |
|
g_free (keyvals); |
182 |
|
|
183 |
|
return gdk_keyval_to_upper (keyval); |
184 |
|
} |
185 |
|
|
186 |
#ifdef __GNUC__ |
#ifdef __GNUC__ |
187 |
__inline |
__inline |
188 |
#endif |
#endif |
189 |
static jint |
static jint |
190 |
keysym_to_awt_keycode (guint keyval) |
keysym_to_awt_keycode (GdkEvent *event) |
191 |
{ |
{ |
192 |
guint vk; |
guint ukeyval; |
193 |
|
guint state; |
194 |
|
|
195 |
vk = gdk_keyval_to_upper (keyval); |
ukeyval = get_first_keyval_from_keymap (event); |
196 |
|
state = event->key.state; |
197 |
|
|
198 |
if (vk >= 0x41 && vk <= 0x5A) /* VK_A through VK_Z */ |
/* VK_A through VK_Z */ |
199 |
return vk; |
if (ukeyval >= GDK_A && ukeyval <= GDK_Z) |
200 |
|
return ukeyval; |
201 |
|
|
202 |
if (vk >= 0x30 && vk <= 0x39) /* VK_0 through VK_9 */ |
/* VK_0 through VK_9 */ |
203 |
return vk; |
if (ukeyval >= GDK_0 && ukeyval <= GDK_9) |
204 |
|
return ukeyval; |
205 |
|
|
206 |
switch (vk) |
switch (ukeyval) |
207 |
{ |
{ |
208 |
case GDK_Alt_L: |
case GDK_Return: |
209 |
case GDK_Alt_R: |
case GDK_KP_Enter: |
210 |
return VK_ALT; |
return VK_ENTER; |
211 |
case GDK_BackSpace: |
case GDK_BackSpace: |
212 |
return VK_BACK_SPACE; |
return VK_BACK_SPACE; |
213 |
|
case GDK_Tab: |
214 |
|
return VK_TAB; |
215 |
case GDK_Cancel: |
case GDK_Cancel: |
216 |
return VK_CANCEL; |
return VK_CANCEL; |
|
case GDK_Caps_Lock: |
|
|
return VK_CAPS_LOCK; |
|
217 |
case GDK_Clear: |
case GDK_Clear: |
218 |
return VK_CLEAR; |
return VK_CLEAR; |
219 |
case GDK_bracketright: |
case GDK_Shift_L: |
220 |
return VK_CLOSE_BRACKET; |
case GDK_Shift_R: |
221 |
case GDK_comma: |
return VK_SHIFT; |
|
return VK_COMMA; |
|
222 |
case GDK_Control_L: |
case GDK_Control_L: |
223 |
case GDK_Control_R: |
case GDK_Control_R: |
224 |
return VK_CONTROL; |
return VK_CONTROL; |
225 |
|
case GDK_Alt_L: |
226 |
|
case GDK_Alt_R: |
227 |
|
return VK_ALT; |
228 |
|
case GDK_Pause: |
229 |
|
return VK_PAUSE; |
230 |
|
case GDK_Caps_Lock: |
231 |
|
return VK_CAPS_LOCK; |
232 |
|
case GDK_Escape: |
233 |
|
return VK_ESCAPE; |
234 |
|
case GDK_space: |
235 |
|
return VK_SPACE; |
236 |
|
case GDK_KP_Page_Up: |
237 |
|
/* For keys on the numeric keypad, the JVM produces one of two |
238 |
|
virtual keys, depending on the num lock state. */ |
239 |
|
if (state & GDK_MOD2_MASK) |
240 |
|
return VK_NUMPAD9; |
241 |
|
else |
242 |
|
return VK_PAGE_UP; |
243 |
|
case GDK_Page_Up: |
244 |
|
return VK_PAGE_UP; |
245 |
|
case GDK_KP_Page_Down: |
246 |
|
if (state & GDK_MOD2_MASK) |
247 |
|
return VK_NUMPAD3; |
248 |
|
else |
249 |
|
return VK_PAGE_DOWN; |
250 |
|
case GDK_Page_Down: |
251 |
|
return VK_PAGE_DOWN; |
252 |
|
case GDK_KP_End: |
253 |
|
if (state & GDK_MOD2_MASK) |
254 |
|
return VK_NUMPAD1; |
255 |
|
else |
256 |
|
return VK_END; |
257 |
|
case GDK_End: |
258 |
|
return VK_END; |
259 |
|
case GDK_KP_Home: |
260 |
|
if (state & GDK_MOD2_MASK) |
261 |
|
return VK_NUMPAD7; |
262 |
|
else |
263 |
|
return VK_HOME; |
264 |
|
case GDK_Home: |
265 |
|
return VK_HOME; |
266 |
|
case GDK_KP_Begin: |
267 |
|
if (state & GDK_MOD2_MASK) |
268 |
|
return VK_NUMPAD5; |
269 |
|
else |
270 |
|
return VK_UNDEFINED; |
271 |
|
case GDK_Left: |
272 |
|
return VK_LEFT; |
273 |
|
case GDK_Up: |
274 |
|
return VK_UP; |
275 |
|
case GDK_Right: |
276 |
|
return VK_RIGHT; |
277 |
|
case GDK_Down: |
278 |
|
return VK_DOWN; |
279 |
|
case GDK_comma: |
280 |
|
return VK_COMMA; |
281 |
|
case GDK_minus: |
282 |
|
return VK_MINUS; |
283 |
|
case GDK_period: |
284 |
|
return VK_PERIOD; |
285 |
|
case GDK_slash: |
286 |
|
return VK_SLASH; |
287 |
|
/* |
288 |
|
return VK_0; |
289 |
|
return VK_1; |
290 |
|
return VK_2; |
291 |
|
return VK_3; |
292 |
|
return VK_4; |
293 |
|
return VK_5; |
294 |
|
return VK_6; |
295 |
|
return VK_7; |
296 |
|
return VK_8; |
297 |
|
return VK_9; |
298 |
|
*/ |
299 |
|
case GDK_semicolon: |
300 |
|
return VK_SEMICOLON; |
301 |
|
case GDK_equal: |
302 |
|
return VK_EQUALS; |
303 |
|
/* |
304 |
|
return VK_A; |
305 |
|
return VK_B; |
306 |
|
return VK_C; |
307 |
|
return VK_D; |
308 |
|
return VK_E; |
309 |
|
return VK_F; |
310 |
|
return VK_G; |
311 |
|
return VK_H; |
312 |
|
return VK_I; |
313 |
|
return VK_J; |
314 |
|
return VK_K; |
315 |
|
return VK_L; |
316 |
|
return VK_M; |
317 |
|
return VK_N; |
318 |
|
return VK_O; |
319 |
|
return VK_P; |
320 |
|
return VK_Q; |
321 |
|
return VK_R; |
322 |
|
return VK_S; |
323 |
|
return VK_T; |
324 |
|
return VK_U; |
325 |
|
return VK_V; |
326 |
|
return VK_W; |
327 |
|
return VK_X; |
328 |
|
return VK_Y; |
329 |
|
return VK_Z; |
330 |
|
*/ |
331 |
|
case GDK_bracketleft: |
332 |
|
return VK_OPEN_BRACKET; |
333 |
|
case GDK_backslash: |
334 |
|
return VK_BACK_SLASH; |
335 |
|
case GDK_bracketright: |
336 |
|
return VK_CLOSE_BRACKET; |
337 |
|
case GDK_KP_0: |
338 |
|
return VK_NUMPAD0; |
339 |
|
case GDK_KP_1: |
340 |
|
return VK_NUMPAD1; |
341 |
|
case GDK_KP_2: |
342 |
|
return VK_NUMPAD2; |
343 |
|
case GDK_KP_3: |
344 |
|
return VK_NUMPAD3; |
345 |
|
case GDK_KP_4: |
346 |
|
return VK_NUMPAD4; |
347 |
|
case GDK_KP_5: |
348 |
|
return VK_NUMPAD5; |
349 |
|
case GDK_KP_6: |
350 |
|
return VK_NUMPAD6; |
351 |
|
case GDK_KP_7: |
352 |
|
return VK_NUMPAD7; |
353 |
|
case GDK_KP_8: |
354 |
|
return VK_NUMPAD8; |
355 |
|
case GDK_KP_9: |
356 |
|
return VK_NUMPAD9; |
357 |
|
case GDK_KP_Multiply: |
358 |
|
return VK_MULTIPLY; |
359 |
|
case GDK_KP_Add: |
360 |
|
return VK_ADD; |
361 |
|
/* |
362 |
|
return VK_SEPARATER; |
363 |
|
*/ |
364 |
|
case GDK_KP_Separator: |
365 |
|
return VK_SEPARATOR; |
366 |
|
case GDK_KP_Subtract: |
367 |
|
return VK_SUBTRACT; |
368 |
case GDK_KP_Decimal: |
case GDK_KP_Decimal: |
369 |
return VK_DECIMAL; |
return VK_DECIMAL; |
|
case GDK_Delete: |
|
|
return VK_DELETE; |
|
370 |
case GDK_KP_Divide: |
case GDK_KP_Divide: |
371 |
return VK_DIVIDE; |
return VK_DIVIDE; |
372 |
case GDK_Down: |
case GDK_KP_Delete: |
373 |
return VK_DOWN; |
if (state & GDK_MOD2_MASK) |
374 |
case GDK_End: |
return VK_DECIMAL; |
375 |
return VK_END; |
else |
376 |
case GDK_Return: |
return VK_DELETE; |
377 |
return VK_ENTER; |
case GDK_Delete: |
378 |
case GDK_Escape: |
return VK_DELETE; |
379 |
return VK_ESCAPE; |
case GDK_Num_Lock: |
380 |
|
return VK_NUM_LOCK; |
381 |
|
case GDK_Scroll_Lock: |
382 |
|
return VK_SCROLL_LOCK; |
383 |
case GDK_F1: |
case GDK_F1: |
384 |
return VK_F1; |
return VK_F1; |
385 |
case GDK_F2: |
case GDK_F2: |
404 |
return VK_F11; |
return VK_F11; |
405 |
case GDK_F12: |
case GDK_F12: |
406 |
return VK_F12; |
return VK_F12; |
407 |
case GDK_Help: |
case GDK_F13: |
408 |
return VK_HELP; |
return VK_F13; |
409 |
case GDK_Home: |
case GDK_F14: |
410 |
return VK_HOME; |
return VK_F14; |
411 |
|
case GDK_F15: |
412 |
|
return VK_F15; |
413 |
|
case GDK_F16: |
414 |
|
return VK_F16; |
415 |
|
case GDK_F17: |
416 |
|
return VK_F17; |
417 |
|
case GDK_F18: |
418 |
|
return VK_F18; |
419 |
|
case GDK_F19: |
420 |
|
return VK_F19; |
421 |
|
case GDK_F20: |
422 |
|
return VK_F20; |
423 |
|
case GDK_F21: |
424 |
|
return VK_F21; |
425 |
|
case GDK_F22: |
426 |
|
return VK_F22; |
427 |
|
case GDK_F23: |
428 |
|
return VK_F23; |
429 |
|
case GDK_F24: |
430 |
|
return VK_F24; |
431 |
|
case GDK_Print: |
432 |
|
return VK_PRINTSCREEN; |
433 |
|
case GDK_KP_Insert: |
434 |
|
if (state & GDK_MOD2_MASK) |
435 |
|
return VK_NUMPAD0; |
436 |
|
else |
437 |
|
return VK_INSERT; |
438 |
case GDK_Insert: |
case GDK_Insert: |
439 |
return VK_INSERT; |
return VK_INSERT; |
440 |
|
case GDK_Help: |
441 |
|
return VK_HELP; |
442 |
|
case GDK_Meta_L: |
443 |
|
case GDK_Meta_R: |
444 |
|
return VK_META; |
445 |
|
case GDK_grave: |
446 |
|
return VK_BACK_QUOTE; |
447 |
|
case GDK_apostrophe: |
448 |
|
return VK_QUOTE; |
449 |
|
case GDK_KP_Up: |
450 |
|
if (state & GDK_MOD2_MASK) |
451 |
|
return VK_NUMPAD8; |
452 |
|
else |
453 |
|
return VK_KP_UP; |
454 |
|
case GDK_KP_Down: |
455 |
|
if (state & GDK_MOD2_MASK) |
456 |
|
return VK_NUMPAD2; |
457 |
|
else |
458 |
|
return VK_KP_DOWN; |
459 |
|
case GDK_KP_Left: |
460 |
|
if (state & GDK_MOD2_MASK) |
461 |
|
return VK_NUMPAD4; |
462 |
|
else |
463 |
|
return VK_KP_LEFT; |
464 |
|
case GDK_KP_Right: |
465 |
|
if (state & GDK_MOD2_MASK) |
466 |
|
return VK_NUMPAD6; |
467 |
|
else |
468 |
|
return VK_KP_RIGHT; |
469 |
|
case GDK_dead_grave: |
470 |
|
return VK_DEAD_GRAVE; |
471 |
|
case GDK_dead_acute: |
472 |
|
return VK_DEAD_ACUTE; |
473 |
|
case GDK_dead_circumflex: |
474 |
|
return VK_DEAD_CIRCUMFLEX; |
475 |
|
case GDK_dead_tilde: |
476 |
|
return VK_DEAD_TILDE; |
477 |
|
case GDK_dead_macron: |
478 |
|
return VK_DEAD_MACRON; |
479 |
|
case GDK_dead_breve: |
480 |
|
return VK_DEAD_BREVE; |
481 |
|
case GDK_dead_abovedot: |
482 |
|
return VK_DEAD_ABOVEDOT; |
483 |
|
case GDK_dead_diaeresis: |
484 |
|
return VK_DEAD_DIAERESIS; |
485 |
|
case GDK_dead_abovering: |
486 |
|
return VK_DEAD_ABOVERING; |
487 |
|
case GDK_dead_doubleacute: |
488 |
|
return VK_DEAD_DOUBLEACUTE; |
489 |
|
case GDK_dead_caron: |
490 |
|
return VK_DEAD_CARON; |
491 |
|
case GDK_dead_cedilla: |
492 |
|
return VK_DEAD_CEDILLA; |
493 |
|
case GDK_dead_ogonek: |
494 |
|
return VK_DEAD_OGONEK; |
495 |
|
case GDK_dead_iota: |
496 |
|
return VK_DEAD_IOTA; |
497 |
|
case GDK_dead_voiced_sound: |
498 |
|
return VK_DEAD_VOICED_SOUND; |
499 |
|
case GDK_dead_semivoiced_sound: |
500 |
|
return VK_DEAD_SEMIVOICED_SOUND; |
501 |
|
case GDK_ampersand: |
502 |
|
return VK_AMPERSAND; |
503 |
|
case GDK_asterisk: |
504 |
|
return VK_ASTERISK; |
505 |
|
case GDK_quotedbl: |
506 |
|
return VK_QUOTEDBL; |
507 |
|
case GDK_less: |
508 |
|
return VK_LESS; |
509 |
|
case GDK_greater: |
510 |
|
return VK_GREATER; |
511 |
|
case GDK_braceleft: |
512 |
|
return VK_BRACELEFT; |
513 |
|
case GDK_braceright: |
514 |
|
return VK_BRACERIGHT; |
515 |
|
case GDK_at: |
516 |
|
return VK_AT; |
517 |
|
case GDK_colon: |
518 |
|
return VK_COLON; |
519 |
|
case GDK_asciicircum: |
520 |
|
return VK_CIRCUMFLEX; |
521 |
|
case GDK_dollar: |
522 |
|
return VK_DOLLAR; |
523 |
|
case GDK_EuroSign: |
524 |
|
return VK_EURO_SIGN; |
525 |
|
case GDK_exclam: |
526 |
|
return VK_EXCLAMATION_MARK; |
527 |
|
case GDK_exclamdown: |
528 |
|
return VK_INVERTED_EXCLAMATION_MARK; |
529 |
|
case GDK_parenleft: |
530 |
|
return VK_LEFT_PARENTHESIS; |
531 |
|
case GDK_numbersign: |
532 |
|
return VK_NUMBER_SIGN; |
533 |
|
case GDK_plus: |
534 |
|
return VK_PLUS; |
535 |
|
case GDK_parenright: |
536 |
|
return VK_RIGHT_PARENTHESIS; |
537 |
|
case GDK_underscore: |
538 |
|
return VK_UNDERSCORE; |
539 |
|
/* |
540 |
|
return VK_FINAL; |
541 |
|
return VK_CONVERT; |
542 |
|
return VK_NONCONVERT; |
543 |
|
return VK_ACCEPT; |
544 |
|
*/ |
545 |
|
case GDK_Mode_switch: |
546 |
|
return VK_MODECHANGE; |
547 |
|
/* |
548 |
|
return VK_KANA; |
549 |
|
*/ |
550 |
case GDK_Kanji: |
case GDK_Kanji: |
551 |
return VK_KANJI; |
return VK_KANJI; |
552 |
case GDK_Left: |
/* |
553 |
return VK_LEFT; |
return VK_ALPHANUMERIC; |
554 |
|
*/ |
555 |
|
case GDK_Katakana: |
556 |
|
return VK_KATAKANA; |
557 |
|
case GDK_Hiragana: |
558 |
|
return VK_HIRAGANA; |
559 |
|
/* |
560 |
|
return VK_FULL_WIDTH; |
561 |
|
return VK_HALF_WIDTH; |
562 |
|
return VK_ROMAN_CHARACTERS; |
563 |
|
return VK_ALL_CANDIDATES; |
564 |
|
*/ |
565 |
|
case GDK_PreviousCandidate: |
566 |
|
return VK_PREVIOUS_CANDIDATE; |
567 |
|
case GDK_Codeinput: |
568 |
|
return VK_CODE_INPUT; |
569 |
|
/* |
570 |
|
return VK_JAPANESE_KATAKANA; |
571 |
|
return VK_JAPANESE_HIRAGANA; |
572 |
|
return VK_JAPANESE_ROMAN; |
573 |
|
*/ |
574 |
|
case GDK_Kana_Lock: |
575 |
|
return VK_KANA_LOCK; |
576 |
|
/* |
577 |
|
return VK_INPUT_METHOD_ON_OFF; |
578 |
|
return VK_CUT; |
579 |
|
return VK_COPY; |
580 |
|
return VK_PASTE; |
581 |
|
return VK_UNDO; |
582 |
|
return VK_AGAIN; |
583 |
|
return VK_FIND; |
584 |
|
return VK_PROPS; |
585 |
|
return VK_STOP; |
586 |
|
return VK_COMPOSE; |
587 |
|
return VK_ALT_GRAPH; |
588 |
|
*/ |
589 |
|
default: |
590 |
|
return VK_UNDEFINED; |
591 |
|
} |
592 |
|
} |
593 |
|
|
594 |
|
static jint |
595 |
|
keysym_to_awt_keylocation (GdkEvent *event) |
596 |
|
{ |
597 |
|
guint ukeyval; |
598 |
|
|
599 |
|
ukeyval = get_first_keyval_from_keymap (event); |
600 |
|
|
601 |
|
/* VK_A through VK_Z */ |
602 |
|
if (ukeyval >= GDK_A && ukeyval <= GDK_Z) |
603 |
|
return AWT_KEY_LOCATION_STANDARD; |
604 |
|
|
605 |
|
/* VK_0 through VK_9 */ |
606 |
|
if (ukeyval >= GDK_0 && ukeyval <= GDK_9) |
607 |
|
return AWT_KEY_LOCATION_STANDARD; |
608 |
|
|
609 |
|
switch (ukeyval) |
610 |
|
{ |
611 |
|
case GDK_Shift_L: |
612 |
|
case GDK_Control_L: |
613 |
|
case GDK_Alt_L: |
614 |
case GDK_Meta_L: |
case GDK_Meta_L: |
615 |
|
return AWT_KEY_LOCATION_LEFT; |
616 |
|
|
617 |
|
case GDK_Shift_R: |
618 |
|
case GDK_Control_R: |
619 |
|
case GDK_Alt_R: |
620 |
case GDK_Meta_R: |
case GDK_Meta_R: |
621 |
return VK_META; |
return AWT_KEY_LOCATION_RIGHT; |
622 |
case GDK_KP_Multiply: |
|
623 |
return VK_MULTIPLY; |
case GDK_Return: |
624 |
case GDK_Num_Lock: |
case GDK_BackSpace: |
625 |
return VK_NUM_LOCK; |
case GDK_Tab: |
626 |
|
case GDK_Cancel: |
627 |
|
case GDK_Clear: |
628 |
|
case GDK_Pause: |
629 |
|
case GDK_Caps_Lock: |
630 |
|
case GDK_Escape: |
631 |
|
case GDK_space: |
632 |
|
case GDK_Page_Up: |
633 |
|
case GDK_Page_Down: |
634 |
|
case GDK_End: |
635 |
|
case GDK_Home: |
636 |
|
case GDK_Left: |
637 |
|
case GDK_Up: |
638 |
|
case GDK_Right: |
639 |
|
case GDK_Down: |
640 |
|
case GDK_comma: |
641 |
|
case GDK_minus: |
642 |
|
case GDK_period: |
643 |
|
case GDK_slash: |
644 |
|
case GDK_semicolon: |
645 |
|
case GDK_equal: |
646 |
|
case GDK_bracketleft: |
647 |
|
case GDK_backslash: |
648 |
|
case GDK_bracketright: |
649 |
|
case GDK_Delete: |
650 |
|
case GDK_Scroll_Lock: |
651 |
|
case GDK_F1: |
652 |
|
case GDK_F2: |
653 |
|
case GDK_F3: |
654 |
|
case GDK_F4: |
655 |
|
case GDK_F5: |
656 |
|
case GDK_F6: |
657 |
|
case GDK_F7: |
658 |
|
case GDK_F8: |
659 |
|
case GDK_F9: |
660 |
|
case GDK_F10: |
661 |
|
case GDK_F11: |
662 |
|
case GDK_F12: |
663 |
|
case GDK_F13: |
664 |
|
case GDK_F14: |
665 |
|
case GDK_F15: |
666 |
|
case GDK_F16: |
667 |
|
case GDK_F17: |
668 |
|
case GDK_F18: |
669 |
|
case GDK_F19: |
670 |
|
case GDK_F20: |
671 |
|
case GDK_F21: |
672 |
|
case GDK_F22: |
673 |
|
case GDK_F23: |
674 |
|
case GDK_F24: |
675 |
|
case GDK_Print: |
676 |
|
case GDK_Insert: |
677 |
|
case GDK_Help: |
678 |
|
case GDK_grave: |
679 |
|
case GDK_apostrophe: |
680 |
|
case GDK_dead_grave: |
681 |
|
case GDK_dead_acute: |
682 |
|
case GDK_dead_circumflex: |
683 |
|
case GDK_dead_tilde: |
684 |
|
case GDK_dead_macron: |
685 |
|
case GDK_dead_breve: |
686 |
|
case GDK_dead_abovedot: |
687 |
|
case GDK_dead_diaeresis: |
688 |
|
case GDK_dead_abovering: |
689 |
|
case GDK_dead_doubleacute: |
690 |
|
case GDK_dead_caron: |
691 |
|
case GDK_dead_cedilla: |
692 |
|
case GDK_dead_ogonek: |
693 |
|
case GDK_dead_iota: |
694 |
|
case GDK_dead_voiced_sound: |
695 |
|
case GDK_dead_semivoiced_sound: |
696 |
|
case GDK_ampersand: |
697 |
|
case GDK_asterisk: |
698 |
|
case GDK_quotedbl: |
699 |
|
case GDK_less: |
700 |
|
case GDK_greater: |
701 |
|
case GDK_braceleft: |
702 |
|
case GDK_braceright: |
703 |
|
case GDK_at: |
704 |
|
case GDK_colon: |
705 |
|
case GDK_asciicircum: |
706 |
|
case GDK_dollar: |
707 |
|
case GDK_EuroSign: |
708 |
|
case GDK_exclam: |
709 |
|
case GDK_exclamdown: |
710 |
|
case GDK_parenleft: |
711 |
|
case GDK_numbersign: |
712 |
|
case GDK_plus: |
713 |
|
case GDK_parenright: |
714 |
|
case GDK_underscore: |
715 |
|
case GDK_Mode_switch: |
716 |
|
case GDK_Kanji: |
717 |
|
case GDK_Katakana: |
718 |
|
case GDK_Hiragana: |
719 |
|
case GDK_PreviousCandidate: |
720 |
|
case GDK_Codeinput: |
721 |
|
case GDK_Kana_Lock: |
722 |
|
return AWT_KEY_LOCATION_STANDARD; |
723 |
|
|
724 |
|
case GDK_KP_Enter: |
725 |
|
case GDK_KP_Page_Up: |
726 |
|
case GDK_KP_Page_Down: |
727 |
|
case GDK_KP_End: |
728 |
|
case GDK_KP_Home: |
729 |
|
case GDK_KP_Begin: |
730 |
case GDK_KP_0: |
case GDK_KP_0: |
|
return VK_NUMPAD0; |
|
731 |
case GDK_KP_1: |
case GDK_KP_1: |
|
return VK_NUMPAD1; |
|
732 |
case GDK_KP_2: |
case GDK_KP_2: |
|
return VK_NUMPAD2; |
|
733 |
case GDK_KP_3: |
case GDK_KP_3: |
|
return VK_NUMPAD3; |
|
734 |
case GDK_KP_4: |
case GDK_KP_4: |
|
return VK_NUMPAD4; |
|
735 |
case GDK_KP_5: |
case GDK_KP_5: |
|
return VK_NUMPAD5; |
|
736 |
case GDK_KP_6: |
case GDK_KP_6: |
|
return VK_NUMPAD6; |
|
737 |
case GDK_KP_7: |
case GDK_KP_7: |
|
return VK_NUMPAD7; |
|
738 |
case GDK_KP_8: |
case GDK_KP_8: |
|
return VK_NUMPAD8; |
|
739 |
case GDK_KP_9: |
case GDK_KP_9: |
740 |
return VK_NUMPAD9; |
case GDK_KP_Multiply: |
741 |
case GDK_bracketleft: |
case GDK_KP_Add: |
|
return VK_OPEN_BRACKET; |
|
|
case GDK_Page_Down: |
|
|
return VK_PAGE_DOWN; |
|
|
case GDK_Page_Up: |
|
|
return VK_PAGE_UP; |
|
|
case GDK_Pause: |
|
|
return VK_PAUSE; |
|
|
case GDK_period: |
|
|
return VK_PERIOD; |
|
|
case GDK_Print: |
|
|
return VK_PRINTSCREEN; |
|
|
case GDK_quoteright: |
|
|
return VK_QUOTE; |
|
|
case GDK_Right: |
|
|
return VK_RIGHT; |
|
|
case GDK_Scroll_Lock: |
|
|
return VK_SCROLL_LOCK; |
|
|
case GDK_semicolon: |
|
|
return VK_SEMICOLON; |
|
742 |
case GDK_KP_Separator: |
case GDK_KP_Separator: |
|
return VK_SEPARATOR; |
|
|
case GDK_Shift_L: |
|
|
case GDK_Shift_R: |
|
|
return VK_SHIFT; |
|
|
case GDK_slash: |
|
|
return VK_SLASH; |
|
|
case GDK_space: |
|
|
return VK_SPACE; |
|
743 |
case GDK_KP_Subtract: |
case GDK_KP_Subtract: |
744 |
return VK_SUBTRACT; |
case GDK_KP_Decimal: |
745 |
|
case GDK_KP_Divide: |
746 |
|
case GDK_KP_Delete: |
747 |
|
case GDK_Num_Lock: |
748 |
|
case GDK_KP_Insert: |
749 |
|
case GDK_KP_Up: |
750 |
|
case GDK_KP_Down: |
751 |
|
case GDK_KP_Left: |
752 |
|
case GDK_KP_Right: |
753 |
|
return AWT_KEY_LOCATION_NUMPAD; |
754 |
|
|
755 |
|
default: |
756 |
|
return AWT_KEY_LOCATION_UNKNOWN; |
757 |
|
} |
758 |
|
} |
759 |
|
|
760 |
|
static jchar |
761 |
|
keyevent_to_awt_keychar (GdkEvent *event) |
762 |
|
{ |
763 |
|
if (event->key.length > 0) |
764 |
|
{ |
765 |
|
/* Translate GDK carriage return to Java linefeed. */ |
766 |
|
if (event->key.string[0] == 13) |
767 |
|
return VK_ENTER; |
768 |
|
else |
769 |
|
return event->key.string[0]; |
770 |
|
} |
771 |
|
else |
772 |
|
{ |
773 |
|
switch (event->key.keyval) |
774 |
|
{ |
775 |
|
case GDK_BackSpace: |
776 |
|
return VK_BACK_SPACE; |
777 |
case GDK_Tab: |
case GDK_Tab: |
778 |
return VK_TAB; |
return VK_TAB; |
779 |
case GDK_Up: |
case GDK_Delete: |
780 |
return VK_UP; |
case GDK_KP_Delete: |
781 |
|
return VK_DELETE; |
782 |
default: |
default: |
783 |
return VK_UNDEFINED; |
return AWT_KEY_CHAR_UNDEFINED; |
784 |
|
} |
785 |
} |
} |
786 |
} |
} |
787 |
|
|
790 |
GtkIMContext "commit" signals, but that do trigger Java KEY_TYPED |
GtkIMContext "commit" signals, but that do trigger Java KEY_TYPED |
791 |
events. */ |
events. */ |
792 |
static int |
static int |
793 |
generates_key_typed_event (guint keyval, GtkWidget *source) |
generates_key_typed_event (GdkEvent *event, GtkWidget *source) |
794 |
{ |
{ |
795 |
return (keyval == GDK_BackSpace |
guint keyval; |
796 |
|
|
797 |
|
if (!GTK_IS_ENTRY (source) |
798 |
|
&& !GTK_IS_TEXT_VIEW (source)) |
799 |
|
return event->key.length ? 1 : 0; |
800 |
|
|
801 |
|
keyval = event->key.keyval; |
802 |
|
|
803 |
|
return (keyval == GDK_Escape |
804 |
|
|| keyval == GDK_BackSpace |
805 |
|| keyval == GDK_Delete |
|| keyval == GDK_Delete |
806 |
|
|| keyval == GDK_KP_Delete |
807 |
|| keyval == GDK_Return |
|| keyval == GDK_Return |
808 |
|
|| keyval == GDK_KP_Enter |
809 |
|| (keyval == GDK_Tab |
|| (keyval == GDK_Tab |
810 |
&& GTK_IS_TEXT_VIEW(source))) ? 1 : 0; |
&& GTK_IS_TEXT_VIEW(source))) ? 1 : 0; |
811 |
} |
} |
1059 |
NULL, |
NULL, |
1060 |
(guchar **)&obj_ptr); |
(guchar **)&obj_ptr); |
1061 |
|
|
|
/* if (grab && GTK_WIDGET_HAS_DEFAULT (widget) ) */ |
|
|
/* { */ |
|
1062 |
(*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, |
(*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, |
1063 |
postKeyEventID, |
postKeyEventID, |
1064 |
(jint) AWT_KEY_PRESSED, |
(jint) AWT_KEY_PRESSED, |
1065 |
(jlong) event->key.time, |
(jlong) event->key.time, |
1066 |
state_to_awt_mods (event->key.state), |
keyevent_state_to_awt_mods (event), |
1067 |
keysym_to_awt_keycode (event->key.keyval), |
keysym_to_awt_keycode (event), |
1068 |
(jchar) (event->key.length) ? |
keyevent_to_awt_keychar (event), |
1069 |
event->key.string[0] : |
keysym_to_awt_keylocation (event)); |
|
AWT_KEY_CHAR_UNDEFINED); |
|
1070 |
|
|
1071 |
if (generates_key_typed_event (event->key.keyval, window->focus_widget)) |
if (generates_key_typed_event (event, window->focus_widget)) |
1072 |
(*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, |
(*gdk_env)->CallVoidMethod (gdk_env, *obj_ptr, |
1073 |
postKeyEventID, |
postKeyEventID, |
1074 |
(jint) AWT_KEY_TYPED, |
(jint) AWT_KEY_TYPED, |
1075 |
(jlong) event->key.time, |
(jlong) event->key.time, |
1076 |
state_to_awt_mods (event->key.state), |
state_to_awt_mods (event->key.state), |
1077 |
VK_UNDEFINED, |
VK_UNDEFINED, |
1078 |
(jchar) (event->key.length) ? |
keyevent_to_awt_keychar (event), |
1079 |
event->key.string[0] : |
AWT_KEY_LOCATION_UNKNOWN); |
|
AWT_KEY_CHAR_UNDEFINED); |
|
1080 |
} |
} |
1081 |
} |
} |
1082 |
break; |
break; |
1118 |
postKeyEventID, |
postKeyEventID, |
1119 |
(jint) AWT_KEY_RELEASED, |
(jint) AWT_KEY_RELEASED, |
1120 |
(jlong) event->key.time, |
(jlong) event->key.time, |
1121 |
state_to_awt_mods (event->key.state), |
keyevent_state_to_awt_mods (event), |
1122 |
keysym_to_awt_keycode (event->key.keyval), |
keysym_to_awt_keycode (event), |
1123 |
(jchar) (event->key.length) ? |
keyevent_to_awt_keychar (event), |
1124 |
event->key.string[0] : |
keysym_to_awt_keylocation (event)); |
|
AWT_KEY_CHAR_UNDEFINED); |
|
1125 |
} |
} |
1126 |
} |
} |
1127 |
break; |
break; |