FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
com.freerdp.freerdpcore.utils.KeyboardMapper Class Reference

Data Structures

interface  KeyProcessingListener
 

Public Member Functions

void init (Context context)
 
void reset (KeyProcessingListener listener)
 
void setKeyProcessingListener (KeyProcessingListener listener)
 
boolean processAndroidKeyEvent (KeyEvent event)
 
void processCustomKeyEvent (int keycode)
 
void sendAltF4 ()
 
int getModifierState (int keycode)
 
void clearlAllModifiers ()
 

Static Public Attributes

static final int KEYBOARD_TYPE_FUNCTIONKEYS = 1
 
static final int KEYBOARD_TYPE_NUMPAD = 2
 
static final int KEYBOARD_TYPE_CURSOR = 3
 
static final int KEYSTATE_ON = 1
 
static final int KEYSTATE_LOCKED = 2
 
static final int KEYSTATE_OFF = 3
 

Detailed Description

Definition at line 18 of file KeyboardMapper.java.

Member Function Documentation

◆ clearlAllModifiers()

void com.freerdp.freerdpcore.utils.KeyboardMapper.clearlAllModifiers ( )
inline

Definition at line 631 of file KeyboardMapper.java.

632 {
633 resetModifierKeysAfterInput(true);
634 }

◆ getModifierState()

int com.freerdp.freerdpcore.utils.KeyboardMapper.getModifierState ( int  keycode)
inline

Definition at line 527 of file KeyboardMapper.java.

528 {
529 int modifierCode = getExtendedKeyCode(keycode);
530
531 // check and get real modifier keycode
532 if ((modifierCode & KEY_FLAG_TOGGLE) == 0)
533 return -1;
534 modifierCode = modifierCode & (~KEY_FLAG_TOGGLE);
535
536 switch (modifierCode)
537 {
538 case VK_LSHIFT:
539 {
540 return (shiftPressed ? (isShiftLocked ? KEYSTATE_LOCKED : KEYSTATE_ON)
541 : KEYSTATE_OFF);
542 }
543 case VK_LCONTROL:
544 {
545 return (ctrlPressed ? (isCtrlLocked ? KEYSTATE_LOCKED : KEYSTATE_ON)
546 : KEYSTATE_OFF);
547 }
548 case VK_LMENU:
549 {
550 return (altPressed ? (isAltLocked ? KEYSTATE_LOCKED : KEYSTATE_ON) : KEYSTATE_OFF);
551 }
552 case VK_LWIN:
553 {
554 return (winPressed ? (isWinLocked ? KEYSTATE_LOCKED : KEYSTATE_ON) : KEYSTATE_OFF);
555 }
556 }
557
558 return -1;
559 }

◆ init()

void com.freerdp.freerdpcore.utils.KeyboardMapper.init ( Context  context)
inline

Definition at line 230 of file KeyboardMapper.java.

231 {
232 if (initialized)
233 return;
234
235 keymapAndroid = new int[256];
236
237 keymapAndroid[KeyEvent.KEYCODE_0] = VK_KEY_0;
238 keymapAndroid[KeyEvent.KEYCODE_1] = VK_KEY_1;
239 keymapAndroid[KeyEvent.KEYCODE_2] = VK_KEY_2;
240 keymapAndroid[KeyEvent.KEYCODE_3] = VK_KEY_3;
241 keymapAndroid[KeyEvent.KEYCODE_4] = VK_KEY_4;
242 keymapAndroid[KeyEvent.KEYCODE_5] = VK_KEY_5;
243 keymapAndroid[KeyEvent.KEYCODE_6] = VK_KEY_6;
244 keymapAndroid[KeyEvent.KEYCODE_7] = VK_KEY_7;
245 keymapAndroid[KeyEvent.KEYCODE_8] = VK_KEY_8;
246 keymapAndroid[KeyEvent.KEYCODE_9] = VK_KEY_9;
247
248 keymapAndroid[KeyEvent.KEYCODE_A] = VK_KEY_A;
249 keymapAndroid[KeyEvent.KEYCODE_B] = VK_KEY_B;
250 keymapAndroid[KeyEvent.KEYCODE_C] = VK_KEY_C;
251 keymapAndroid[KeyEvent.KEYCODE_D] = VK_KEY_D;
252 keymapAndroid[KeyEvent.KEYCODE_E] = VK_KEY_E;
253 keymapAndroid[KeyEvent.KEYCODE_F] = VK_KEY_F;
254 keymapAndroid[KeyEvent.KEYCODE_G] = VK_KEY_G;
255 keymapAndroid[KeyEvent.KEYCODE_H] = VK_KEY_H;
256 keymapAndroid[KeyEvent.KEYCODE_I] = VK_KEY_I;
257 keymapAndroid[KeyEvent.KEYCODE_J] = VK_KEY_J;
258 keymapAndroid[KeyEvent.KEYCODE_K] = VK_KEY_K;
259 keymapAndroid[KeyEvent.KEYCODE_L] = VK_KEY_L;
260 keymapAndroid[KeyEvent.KEYCODE_M] = VK_KEY_M;
261 keymapAndroid[KeyEvent.KEYCODE_N] = VK_KEY_N;
262 keymapAndroid[KeyEvent.KEYCODE_O] = VK_KEY_O;
263 keymapAndroid[KeyEvent.KEYCODE_P] = VK_KEY_P;
264 keymapAndroid[KeyEvent.KEYCODE_Q] = VK_KEY_Q;
265 keymapAndroid[KeyEvent.KEYCODE_R] = VK_KEY_R;
266 keymapAndroid[KeyEvent.KEYCODE_S] = VK_KEY_S;
267 keymapAndroid[KeyEvent.KEYCODE_T] = VK_KEY_T;
268 keymapAndroid[KeyEvent.KEYCODE_U] = VK_KEY_U;
269 keymapAndroid[KeyEvent.KEYCODE_V] = VK_KEY_V;
270 keymapAndroid[KeyEvent.KEYCODE_W] = VK_KEY_W;
271 keymapAndroid[KeyEvent.KEYCODE_X] = VK_KEY_X;
272 keymapAndroid[KeyEvent.KEYCODE_Y] = VK_KEY_Y;
273 keymapAndroid[KeyEvent.KEYCODE_Z] = VK_KEY_Z;
274
275 keymapAndroid[KeyEvent.KEYCODE_DEL] = VK_BACK;
276 keymapAndroid[KeyEvent.KEYCODE_ENTER] = VK_RETURN;
277 keymapAndroid[KeyEvent.KEYCODE_SPACE] = VK_SPACE;
278 keymapAndroid[KeyEvent.KEYCODE_TAB] = VK_TAB;
279 // keymapAndroid[KeyEvent.KEYCODE_SHIFT_LEFT] = VK_LSHIFT;
280 // keymapAndroid[KeyEvent.KEYCODE_SHIFT_RIGHT] = VK_RSHIFT;
281
282 // keymapAndroid[KeyEvent.KEYCODE_DPAD_DOWN] = VK_DOWN;
283 // keymapAndroid[KeyEvent.KEYCODE_DPAD_LEFT] = VK_LEFT;
284 // keymapAndroid[KeyEvent.KEYCODE_DPAD_RIGHT] = VK_RIGHT;
285 // keymapAndroid[KeyEvent.KEYCODE_DPAD_UP] = VK_UP;
286
287 // keymapAndroid[KeyEvent.KEYCODE_COMMA] = VK_OEM_COMMA;
288 // keymapAndroid[KeyEvent.KEYCODE_PERIOD] = VK_OEM_PERIOD;
289 // keymapAndroid[KeyEvent.KEYCODE_MINUS] = VK_OEM_MINUS;
290 // keymapAndroid[KeyEvent.KEYCODE_PLUS] = VK_OEM_PLUS;
291
292 // keymapAndroid[KeyEvent.KEYCODE_ALT_LEFT] = VK_LMENU;
293 // keymapAndroid[KeyEvent.KEYCODE_ALT_RIGHT] = VK_RMENU;
294
295 // keymapAndroid[KeyEvent.KEYCODE_AT] = (KEY_FLAG_UNICODE | 64);
296 // keymapAndroid[KeyEvent.KEYCODE_APOSTROPHE] = (KEY_FLAG_UNICODE | 39);
297 // keymapAndroid[KeyEvent.KEYCODE_BACKSLASH] = (KEY_FLAG_UNICODE | 92);
298 // keymapAndroid[KeyEvent.KEYCODE_COMMA] = (KEY_FLAG_UNICODE | 44);
299 // keymapAndroid[KeyEvent.KEYCODE_EQUALS] = (KEY_FLAG_UNICODE | 61);
300 // keymapAndroid[KeyEvent.KEYCODE_GRAVE] = (KEY_FLAG_UNICODE | 96);
301 // keymapAndroid[KeyEvent.KEYCODE_LEFT_BRACKET] = (KEY_FLAG_UNICODE | 91);
302 // keymapAndroid[KeyEvent.KEYCODE_RIGHT_BRACKET] = (KEY_FLAG_UNICODE | 93);
303 // keymapAndroid[KeyEvent.KEYCODE_MINUS] = (KEY_FLAG_UNICODE | 45);
304 // keymapAndroid[KeyEvent.KEYCODE_PERIOD] = (KEY_FLAG_UNICODE | 46);
305 // keymapAndroid[KeyEvent.KEYCODE_PLUS] = (KEY_FLAG_UNICODE | 43);
306 // keymapAndroid[KeyEvent.KEYCODE_POUND] = (KEY_FLAG_UNICODE | 35);
307 // keymapAndroid[KeyEvent.KEYCODE_SEMICOLON] = (KEY_FLAG_UNICODE | 59);
308 // keymapAndroid[KeyEvent.KEYCODE_SLASH] = (KEY_FLAG_UNICODE | 47);
309 // keymapAndroid[KeyEvent.KEYCODE_STAR] = (KEY_FLAG_UNICODE | 42);
310
311 // special keys mapping
312 keymapExt = new int[256];
313 keymapExt[context.getResources().getInteger(R.integer.keycode_F1)] = VK_F1;
314 keymapExt[context.getResources().getInteger(R.integer.keycode_F2)] = VK_F2;
315 keymapExt[context.getResources().getInteger(R.integer.keycode_F3)] = VK_F3;
316 keymapExt[context.getResources().getInteger(R.integer.keycode_F4)] = VK_F4;
317 keymapExt[context.getResources().getInteger(R.integer.keycode_F5)] = VK_F5;
318 keymapExt[context.getResources().getInteger(R.integer.keycode_F6)] = VK_F6;
319 keymapExt[context.getResources().getInteger(R.integer.keycode_F7)] = VK_F7;
320 keymapExt[context.getResources().getInteger(R.integer.keycode_F8)] = VK_F8;
321 keymapExt[context.getResources().getInteger(R.integer.keycode_F9)] = VK_F9;
322 keymapExt[context.getResources().getInteger(R.integer.keycode_F10)] = VK_F10;
323 keymapExt[context.getResources().getInteger(R.integer.keycode_F11)] = VK_F11;
324 keymapExt[context.getResources().getInteger(R.integer.keycode_F12)] = VK_F12;
325 keymapExt[context.getResources().getInteger(R.integer.keycode_tab)] = VK_TAB;
326 keymapExt[context.getResources().getInteger(R.integer.keycode_print)] = VK_PRINT;
327 keymapExt[context.getResources().getInteger(R.integer.keycode_insert)] =
328 VK_INSERT | VK_EXT_KEY;
329 keymapExt[context.getResources().getInteger(R.integer.keycode_delete)] =
330 VK_DELETE | VK_EXT_KEY;
331 keymapExt[context.getResources().getInteger(R.integer.keycode_home)] = VK_HOME | VK_EXT_KEY;
332 keymapExt[context.getResources().getInteger(R.integer.keycode_end)] = VK_END | VK_EXT_KEY;
333 keymapExt[context.getResources().getInteger(R.integer.keycode_pgup)] =
334 VK_PRIOR | VK_EXT_KEY;
335 keymapExt[context.getResources().getInteger(R.integer.keycode_pgdn)] = VK_NEXT | VK_EXT_KEY;
336
337 // numpad mapping
338 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_0)] = VK_NUMPAD0;
339 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_1)] = VK_NUMPAD1;
340 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_2)] = VK_NUMPAD2;
341 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_3)] = VK_NUMPAD3;
342 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_4)] = VK_NUMPAD4;
343 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_5)] = VK_NUMPAD5;
344 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_6)] = VK_NUMPAD6;
345 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_7)] = VK_NUMPAD7;
346 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_8)] = VK_NUMPAD8;
347 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_9)] = VK_NUMPAD9;
348 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_numlock)] = VK_NUMLOCK;
349 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_add)] = VK_ADD;
350 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_comma)] = VK_DECIMAL;
351 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_divide)] =
352 VK_DIVIDE | VK_EXT_KEY;
353 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_enter)] =
354 VK_RETURN | VK_EXT_KEY;
355 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_multiply)] =
356 VK_MULTIPLY;
357 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_subtract)] =
358 VK_SUBTRACT;
359 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_equals)] =
360 (KEY_FLAG_UNICODE | 61);
361 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_left_paren)] =
362 (KEY_FLAG_UNICODE | 40);
363 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_right_paren)] =
364 (KEY_FLAG_UNICODE | 41);
365
366 // cursor key codes
367 keymapExt[context.getResources().getInteger(R.integer.keycode_up)] = VK_UP | VK_EXT_KEY;
368 keymapExt[context.getResources().getInteger(R.integer.keycode_down)] = VK_DOWN | VK_EXT_KEY;
369 keymapExt[context.getResources().getInteger(R.integer.keycode_left)] = VK_LEFT | VK_EXT_KEY;
370 keymapExt[context.getResources().getInteger(R.integer.keycode_right)] =
371 VK_RIGHT | VK_EXT_KEY;
372 keymapExt[context.getResources().getInteger(R.integer.keycode_enter)] =
373 VK_RETURN | VK_EXT_KEY;
374 keymapExt[context.getResources().getInteger(R.integer.keycode_backspace)] = VK_BACK;
375
376 // shared keys
377 keymapExt[context.getResources().getInteger(R.integer.keycode_win)] = VK_LWIN | VK_EXT_KEY;
378 keymapExt[context.getResources().getInteger(R.integer.keycode_menu)] = VK_APPS | VK_EXT_KEY;
379 keymapExt[context.getResources().getInteger(R.integer.keycode_esc)] = VK_ESCAPE;
380
381 /* keymapExt[context.getResources().getInteger(R.integer.keycode_modifier_ctrl)] =
382 VK_LCONTROL; keymapExt[context.getResources().getInteger(R.integer.keycode_modifier_alt)]
383 = VK_LMENU;
384 keymapExt[context.getResources().getInteger(R.integer.keycode_modifier_shift)] =
385 VK_LSHIFT;
386 */
387 // get custom keyboard key codes
388 keymapExt[context.getResources().getInteger(R.integer.keycode_specialkeys_keyboard)] =
389 EXTKEY_KBFUNCTIONKEYS;
390 keymapExt[context.getResources().getInteger(R.integer.keycode_numpad_keyboard)] =
391 EXTKEY_KBNUMPAD;
392 keymapExt[context.getResources().getInteger(R.integer.keycode_cursor_keyboard)] =
393 EXTKEY_KBCURSOR;
394
395 keymapExt[context.getResources().getInteger(R.integer.keycode_toggle_shift)] =
396 (KEY_FLAG_TOGGLE | VK_LSHIFT);
397 keymapExt[context.getResources().getInteger(R.integer.keycode_toggle_ctrl)] =
398 (KEY_FLAG_TOGGLE | VK_LCONTROL);
399 keymapExt[context.getResources().getInteger(R.integer.keycode_toggle_alt)] =
400 (KEY_FLAG_TOGGLE | VK_LMENU);
401 keymapExt[context.getResources().getInteger(R.integer.keycode_toggle_win)] =
402 (KEY_FLAG_TOGGLE | VK_LWIN);
403
404 initialized = true;
405 }

◆ processAndroidKeyEvent()

boolean com.freerdp.freerdpcore.utils.KeyboardMapper.processAndroidKeyEvent ( KeyEvent  event)
inline

Definition at line 421 of file KeyboardMapper.java.

422 {
423 switch (event.getAction())
424 {
425 // we only process down events
426 case KeyEvent.ACTION_UP:
427 {
428 return false;
429 }
430
431 case KeyEvent.ACTION_DOWN:
432 {
433 boolean modifierActive = isModifierPressed();
434 // if a modifier is pressed we will send a VK event (if possible) so that key
435 // combinations will be recognized correctly. Otherwise we will send the unicode
436 // key. At the end we will reset all modifiers and notify our listener.
437 int vkcode = getVirtualKeyCode(event.getKeyCode());
438 if ((vkcode & KEY_FLAG_UNICODE) != 0)
439 listener.processUnicodeKey(vkcode & (~KEY_FLAG_UNICODE));
440 // if we got a valid vkcode send it - except for letters/numbers if a modifier is
441 // active
442 else if (vkcode > 0 &&
443 (event.getMetaState() & (KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON |
444 KeyEvent.META_SYM_ON)) == 0)
445 {
446 listener.processVirtualKey(vkcode, true);
447 listener.processVirtualKey(vkcode, false);
448 }
449 else if (event.isShiftPressed() && vkcode != 0)
450 {
451 listener.processVirtualKey(VK_LSHIFT, true);
452 listener.processVirtualKey(vkcode, true);
453 listener.processVirtualKey(vkcode, false);
454 listener.processVirtualKey(VK_LSHIFT, false);
455 }
456 else if (event.getUnicodeChar() != 0)
457 listener.processUnicodeKey(event.getUnicodeChar());
458 else
459 return false;
460
461 // reset any pending toggle states if a modifier was pressed
462 if (modifierActive)
463 resetModifierKeysAfterInput(false);
464 return true;
465 }
466
467 case KeyEvent.ACTION_MULTIPLE:
468 {
469 String str = event.getCharacters();
470 for (int i = 0; i < str.length(); i++)
471 listener.processUnicodeKey(str.charAt(i));
472 return true;
473 }
474
475 default:
476 break;
477 }
478 return false;
479 }

◆ processCustomKeyEvent()

void com.freerdp.freerdpcore.utils.KeyboardMapper.processCustomKeyEvent ( int  keycode)
inline

Definition at line 481 of file KeyboardMapper.java.

482 {
483 int extCode = getExtendedKeyCode(keycode);
484 if (extCode == 0)
485 return;
486
487 // toggle button pressed?
488 if ((extCode & KEY_FLAG_TOGGLE) != 0)
489 {
490 processToggleButton(extCode & (~KEY_FLAG_TOGGLE));
491 return;
492 }
493
494 // keyboard switch button pressed?
495 if (extCode == EXTKEY_KBFUNCTIONKEYS || extCode == EXTKEY_KBNUMPAD ||
496 extCode == EXTKEY_KBCURSOR)
497 {
498 switchKeyboard(extCode);
499 return;
500 }
501
502 // nope - see if we got a unicode or vk
503 if ((extCode & KEY_FLAG_UNICODE) != 0)
504 listener.processUnicodeKey(extCode & (~KEY_FLAG_UNICODE));
505 else
506 {
507 listener.processVirtualKey(extCode, true);
508 listener.processVirtualKey(extCode, false);
509 }
510
511 resetModifierKeysAfterInput(false);
512 }

◆ reset()

void com.freerdp.freerdpcore.utils.KeyboardMapper.reset ( KeyProcessingListener  listener)
inline

Definition at line 407 of file KeyboardMapper.java.

408 {
409 shiftPressed = false;
410 ctrlPressed = false;
411 altPressed = false;
412 winPressed = false;
413 setKeyProcessingListener(listener);
414 }

◆ sendAltF4()

void com.freerdp.freerdpcore.utils.KeyboardMapper.sendAltF4 ( )
inline

Definition at line 514 of file KeyboardMapper.java.

515 {
516 listener.processVirtualKey(VK_LMENU, true);
517 listener.processVirtualKey(VK_F4, true);
518 listener.processVirtualKey(VK_F4, false);
519 listener.processVirtualKey(VK_LMENU, false);
520 }

◆ setKeyProcessingListener()

void com.freerdp.freerdpcore.utils.KeyboardMapper.setKeyProcessingListener ( KeyProcessingListener  listener)
inline

Definition at line 416 of file KeyboardMapper.java.

417 {
418 this.listener = listener;
419 }

Field Documentation

◆ KEYBOARD_TYPE_CURSOR

final int com.freerdp.freerdpcore.utils.KeyboardMapper.KEYBOARD_TYPE_CURSOR = 3
static

Definition at line 22 of file KeyboardMapper.java.

◆ KEYBOARD_TYPE_FUNCTIONKEYS

final int com.freerdp.freerdpcore.utils.KeyboardMapper.KEYBOARD_TYPE_FUNCTIONKEYS = 1
static

Definition at line 20 of file KeyboardMapper.java.

◆ KEYBOARD_TYPE_NUMPAD

final int com.freerdp.freerdpcore.utils.KeyboardMapper.KEYBOARD_TYPE_NUMPAD = 2
static

Definition at line 21 of file KeyboardMapper.java.

◆ KEYSTATE_LOCKED

final int com.freerdp.freerdpcore.utils.KeyboardMapper.KEYSTATE_LOCKED = 2
static

Definition at line 27 of file KeyboardMapper.java.

◆ KEYSTATE_OFF

final int com.freerdp.freerdpcore.utils.KeyboardMapper.KEYSTATE_OFF = 3
static

Definition at line 28 of file KeyboardMapper.java.

◆ KEYSTATE_ON

final int com.freerdp.freerdpcore.utils.KeyboardMapper.KEYSTATE_ON = 1
static

Definition at line 26 of file KeyboardMapper.java.


The documentation for this class was generated from the following file: