blob: 771692942a4082197a4ac70b3ae27d72c0a996eb [file] [log] [blame] [edit]
/*
* BRLTTY - A background process providing access to the console screen (when in
* text mode) for a blind person using a refreshable braille display.
*
* Copyright (C) 1995-2023 by The BRLTTY Developers.
*
* BRLTTY comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
#include "prologue.h"
#include <string.h>
#include <android/keycodes.h>
#include "log.h"
#include "system_java.h"
#include "kbd.h"
#include "kbd_internal.h"
#include "kbd_android.h"
BEGIN_KEY_CODE_MAP
[ANDROID_KEY_0] = KBD_KEY_NUMBER(Zero),
[ANDROID_KEY_1] = KBD_KEY_NUMBER(One),
[ANDROID_KEY_2] = KBD_KEY_NUMBER(Two),
[ANDROID_KEY_3] = KBD_KEY_NUMBER(Three),
[ANDROID_KEY_3D_MODE] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_4] = KBD_KEY_NUMBER(Four),
[ANDROID_KEY_5] = KBD_KEY_NUMBER(Five),
[ANDROID_KEY_6] = KBD_KEY_NUMBER(Six),
[ANDROID_KEY_7] = KBD_KEY_NUMBER(Seven),
[ANDROID_KEY_8] = KBD_KEY_NUMBER(Eight),
[ANDROID_KEY_9] = KBD_KEY_NUMBER(Nine),
[ANDROID_KEY_A] = KBD_KEY_LETTER(A),
[ANDROID_KEY_ALT_LEFT] = KBD_KEY_MODIFIER(AltLeft),
[ANDROID_KEY_ALT_RIGHT] = KBD_KEY_MODIFIER(AltRight),
[ANDROID_KEY_APOSTROPHE] = KBD_KEY_SYMBOL(Apostrophe),
[ANDROID_KEY_APP_SWITCH] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_ASSIST] = KBD_KEY_ACTION(Help),
[ANDROID_KEY_AT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_AVR_INPUT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_AVR_POWER] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_B] = KBD_KEY_LETTER(B),
[ANDROID_KEY_BACK] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BACKSLASH] = KBD_KEY_SYMBOL(Backslash),
[ANDROID_KEY_BOOKMARK] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BREAK] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_1] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_10] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_11] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_12] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_13] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_14] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_15] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_16] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_2] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_3] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_4] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_5] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_6] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_7] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_8] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_9] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_A] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_B] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_C] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_L1] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_L2] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_MODE] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_R1] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_R2] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_SELECT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_START] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_THUMBL] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_THUMBR] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_X] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_Y] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_BUTTON_Z] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_C] = KBD_KEY_LETTER(C),
[ANDROID_KEY_CALCULATOR] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CALENDAR] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CALL] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CAMERA] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CAPS_LOCK] = KBD_KEY_LOCK(Capitals),
[ANDROID_KEY_CAPTIONS] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CHANNEL_DOWN] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CHANNEL_UP] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CLEAR] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_COMMA] = KBD_KEY_SYMBOL(Comma),
[ANDROID_KEY_CONTACTS] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_CTRL_LEFT] = KBD_KEY_MODIFIER(ControlLeft),
[ANDROID_KEY_CTRL_RIGHT] = KBD_KEY_MODIFIER(ControlRight),
[ANDROID_KEY_D] = KBD_KEY_LETTER(D),
[ANDROID_KEY_DEL] = KBD_KEY_ACTION(DeleteBackward),
[ANDROID_KEY_DPAD_CENTER] = KBD_KEY_ACTION(Select),
[ANDROID_KEY_DPAD_DOWN] = KBD_KEY_ACTION(ArrowDown),
[ANDROID_KEY_DPAD_LEFT] = KBD_KEY_ACTION(ArrowLeft),
[ANDROID_KEY_DPAD_RIGHT] = KBD_KEY_ACTION(ArrowRight),
[ANDROID_KEY_DPAD_UP] = KBD_KEY_ACTION(ArrowUp),
[ANDROID_KEY_DVR] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_E] = KBD_KEY_LETTER(E),
[ANDROID_KEY_EISU] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_ENDCALL] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_ENTER] = KBD_KEY_ACTION(Enter),
[ANDROID_KEY_ENVELOPE] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_EQUALS] = KBD_KEY_SYMBOL(Equals),
[ANDROID_KEY_ESCAPE] = KBD_KEY_ACTION(Escape),
[ANDROID_KEY_EXPLORER] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_F] = KBD_KEY_LETTER(F),
[ANDROID_KEY_F1] = KBD_KEY_FUNCTION(F1),
[ANDROID_KEY_F10] = KBD_KEY_FUNCTION(F10),
[ANDROID_KEY_F11] = KBD_KEY_FUNCTION(F11),
[ANDROID_KEY_F12] = KBD_KEY_FUNCTION(F12),
[ANDROID_KEY_F2] = KBD_KEY_FUNCTION(F2),
[ANDROID_KEY_F3] = KBD_KEY_FUNCTION(F3),
[ANDROID_KEY_F4] = KBD_KEY_FUNCTION(F4),
[ANDROID_KEY_F5] = KBD_KEY_FUNCTION(F5),
[ANDROID_KEY_F6] = KBD_KEY_FUNCTION(F6),
[ANDROID_KEY_F7] = KBD_KEY_FUNCTION(F7),
[ANDROID_KEY_F8] = KBD_KEY_FUNCTION(F8),
[ANDROID_KEY_F9] = KBD_KEY_FUNCTION(F9),
[ANDROID_KEY_FOCUS] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_FORWARD] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_FORWARD_DEL] = KBD_KEY_ACTION(DeleteForward),
[ANDROID_KEY_FUNCTION] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_G] = KBD_KEY_LETTER(G),
[ANDROID_KEY_GRAVE] = KBD_KEY_SYMBOL(Grave),
[ANDROID_KEY_GUIDE] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_H] = KBD_KEY_LETTER(H),
[ANDROID_KEY_HEADSETHOOK] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_HENKAN] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_HOME] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_I] = KBD_KEY_LETTER(I),
[ANDROID_KEY_INFO] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_INSERT] = KBD_KEY_ACTION(Insert),
[ANDROID_KEY_J] = KBD_KEY_LETTER(J),
[ANDROID_KEY_K] = KBD_KEY_LETTER(K),
[ANDROID_KEY_KANA] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_KATAKANA_HIRAGANA] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_L] = KBD_KEY_LETTER(L),
[ANDROID_KEY_LANGUAGE_SWITCH] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_LEFT_BRACKET] = KBD_KEY_SYMBOL(LeftBracket),
[ANDROID_KEY_M] = KBD_KEY_LETTER(M),
[ANDROID_KEY_MANNER_MODE] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_MEDIA_CLOSE] = KBD_KEY_MEDIA(Close),
[ANDROID_KEY_MEDIA_EJECT] = KBD_KEY_MEDIA(Eject),
[ANDROID_KEY_MEDIA_FAST_FORWARD] = KBD_KEY_MEDIA(Forward),
[ANDROID_KEY_MEDIA_NEXT] = KBD_KEY_MEDIA(Next),
[ANDROID_KEY_MEDIA_PAUSE] = KBD_KEY_MEDIA(Pause),
[ANDROID_KEY_MEDIA_PLAY] = KBD_KEY_MEDIA(Play),
[ANDROID_KEY_MEDIA_PLAY_PAUSE] = KBD_KEY_MEDIA(PlayPause),
[ANDROID_KEY_MEDIA_PREVIOUS] = KBD_KEY_MEDIA(Previous),
[ANDROID_KEY_MEDIA_RECORD] = KBD_KEY_MEDIA(Record),
[ANDROID_KEY_MEDIA_REWIND] = KBD_KEY_MEDIA(Backward),
[ANDROID_KEY_MEDIA_STOP] = KBD_KEY_MEDIA(Stop),
[ANDROID_KEY_MENU] = KBD_KEY_ACTION(Menu),
[ANDROID_KEY_META_LEFT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_META_RIGHT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_MINUS] = KBD_KEY_SYMBOL(Minus),
[ANDROID_KEY_MOVE_END] = KBD_KEY_ACTION(End),
[ANDROID_KEY_MOVE_HOME] = KBD_KEY_ACTION(Home),
[ANDROID_KEY_MUHENKAN] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_MUSIC] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_MUTE] = KBD_KEY_MEDIA(Mute),
[ANDROID_KEY_N] = KBD_KEY_LETTER(N),
[ANDROID_KEY_NOTIFICATION] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_NUM] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_NUMPAD_0] = KBD_KEY_KPNUMBER(Zero),
[ANDROID_KEY_NUMPAD_1] = KBD_KEY_KPNUMBER(One),
[ANDROID_KEY_NUMPAD_2] = KBD_KEY_KPNUMBER(Two),
[ANDROID_KEY_NUMPAD_3] = KBD_KEY_KPNUMBER(Three),
[ANDROID_KEY_NUMPAD_4] = KBD_KEY_KPNUMBER(Four),
[ANDROID_KEY_NUMPAD_5] = KBD_KEY_KPNUMBER(Five),
[ANDROID_KEY_NUMPAD_6] = KBD_KEY_KPNUMBER(Six),
[ANDROID_KEY_NUMPAD_7] = KBD_KEY_KPNUMBER(Seven),
[ANDROID_KEY_NUMPAD_8] = KBD_KEY_KPNUMBER(Eight),
[ANDROID_KEY_NUMPAD_9] = KBD_KEY_KPNUMBER(Nine),
[ANDROID_KEY_NUMPAD_ADD] = KBD_KEY_KPSYMBOL(Plus),
[ANDROID_KEY_NUMPAD_COMMA] = KBD_KEY_KPSYMBOL(Comma),
[ANDROID_KEY_NUMPAD_DIVIDE] = KBD_KEY_KPSYMBOL(Divide),
[ANDROID_KEY_NUMPAD_DOT] = KBD_KEY_KPSYMBOL(Period),
[ANDROID_KEY_NUMPAD_ENTER] = KBD_KEY_KPACTION(Enter),
[ANDROID_KEY_NUMPAD_EQUALS] = KBD_KEY_KPSYMBOL(Equals),
[ANDROID_KEY_NUMPAD_LEFT_PAREN] = KBD_KEY_KPSYMBOL(LeftParenthesis),
[ANDROID_KEY_NUMPAD_MULTIPLY] = KBD_KEY_KPSYMBOL(Multiply),
[ANDROID_KEY_NUMPAD_RIGHT_PAREN] = KBD_KEY_KPSYMBOL(RightParenthesis),
[ANDROID_KEY_NUMPAD_SUBTRACT] = KBD_KEY_KPSYMBOL(Minus),
[ANDROID_KEY_NUM_LOCK] = KBD_KEY_LOCK(Numbers),
[ANDROID_KEY_O] = KBD_KEY_LETTER(O),
[ANDROID_KEY_P] = KBD_KEY_LETTER(P),
[ANDROID_KEY_PAGE_DOWN] = KBD_KEY_ACTION(PageDown),
[ANDROID_KEY_PAGE_UP] = KBD_KEY_ACTION(PageUp),
[ANDROID_KEY_PERIOD] = KBD_KEY_SYMBOL(Period),
[ANDROID_KEY_PICTSYMBOLS] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_PLUS] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_POUND] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_POWER] = KBD_KEY_ACTION(Power),
[ANDROID_KEY_PROG_BLUE] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_PROG_GREEN] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_PROG_RED] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_PROG_YELLOW] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_Q] = KBD_KEY_LETTER(Q),
[ANDROID_KEY_R] = KBD_KEY_LETTER(R),
[ANDROID_KEY_RIGHT_BRACKET] = KBD_KEY_SYMBOL(RightBracket),
[ANDROID_KEY_RO] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_S] = KBD_KEY_LETTER(S),
[ANDROID_KEY_SCROLL_LOCK] = KBD_KEY_LOCK(Scroll),
[ANDROID_KEY_SEARCH] = KBD_KEY_ACTION(Find),
[ANDROID_KEY_SEMICOLON] = KBD_KEY_SYMBOL(Semicolon),
[ANDROID_KEY_SETTINGS] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_SHIFT_LEFT] = KBD_KEY_MODIFIER(ShiftLeft),
[ANDROID_KEY_SHIFT_RIGHT] = KBD_KEY_MODIFIER(ShiftRight),
[ANDROID_KEY_SLASH] = KBD_KEY_SYMBOL(Slash),
[ANDROID_KEY_SOFT_LEFT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_SOFT_RIGHT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_SPACE] = KBD_KEY_SYMBOL(Space),
[ANDROID_KEY_STAR] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_STB_INPUT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_STB_POWER] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_SWITCH_CHARSET] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_SYM] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_SYSRQ] = KBD_KEY_ACTION(SystemRequest),
[ANDROID_KEY_T] = KBD_KEY_LETTER(T),
[ANDROID_KEY_TAB] = KBD_KEY_ACTION(Tab),
[ANDROID_KEY_TV] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_TV_INPUT] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_TV_POWER] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_U] = KBD_KEY_LETTER(U),
[ANDROID_KEY_UNKNOWN] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_V] = KBD_KEY_LETTER(V),
[ANDROID_KEY_VOLUME_DOWN] = KBD_KEY_MEDIA(VolumeDown),
[ANDROID_KEY_VOLUME_MUTE] = KBD_KEY_MEDIA(Mute),
[ANDROID_KEY_VOLUME_UP] = KBD_KEY_MEDIA(VolumeUp),
[ANDROID_KEY_W] = KBD_KEY_LETTER(W),
[ANDROID_KEY_WINDOW] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_X] = KBD_KEY_LETTER(X),
[ANDROID_KEY_Y] = KBD_KEY_LETTER(Y),
[ANDROID_KEY_YEN] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_Z] = KBD_KEY_LETTER(Z),
[ANDROID_KEY_ZENKAKU_HANKAKU] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_ZOOM_IN] = KBD_KEY_UNMAPPED,
[ANDROID_KEY_ZOOM_OUT] = KBD_KEY_UNMAPPED,
[B2G_KEY_CHARACTERS ... B2G_KEY_CHARACTERS+0XFF] = KBD_KEY_IGNORE,
[B2G_KEY_CHORDS ... B2G_KEY_CHORDS+0XFF] = KBD_KEY_IGNORE,
[B2G_KEY_DOT1] = KBD_KEY_BRAILLE(Dot7),
[B2G_KEY_DOT2] = KBD_KEY_BRAILLE(Dot3),
[B2G_KEY_DOT3] = KBD_KEY_BRAILLE(Dot2),
[B2G_KEY_DOT4] = KBD_KEY_BRAILLE(Dot1),
[B2G_KEY_DOT5] = KBD_KEY_BRAILLE(Dot4),
[B2G_KEY_DOT6] = KBD_KEY_BRAILLE(Dot5),
[B2G_KEY_DOT7] = KBD_KEY_BRAILLE(Dot6),
[B2G_KEY_DOT8] = KBD_KEY_BRAILLE(Dot8),
[B2G_KEY_DOT9] = KBD_KEY_BRAILLE(Space),
[B2G_KEY_CURSOR0] = KBD_KEY_ROUTING(0),
[B2G_KEY_CURSOR1] = KBD_KEY_ROUTING(1),
[B2G_KEY_CURSOR2] = KBD_KEY_ROUTING(2),
[B2G_KEY_CURSOR3] = KBD_KEY_ROUTING(3),
[B2G_KEY_CURSOR4] = KBD_KEY_ROUTING(4),
[B2G_KEY_CURSOR5] = KBD_KEY_ROUTING(5),
[B2G_KEY_CURSOR6] = KBD_KEY_ROUTING(6),
[B2G_KEY_CURSOR7] = KBD_KEY_ROUTING(7),
[B2G_KEY_CURSOR8] = KBD_KEY_ROUTING(8),
[B2G_KEY_CURSOR9] = KBD_KEY_ROUTING(9),
[B2G_KEY_CURSOR10] = KBD_KEY_ROUTING(10),
[B2G_KEY_CURSOR11] = KBD_KEY_ROUTING(11),
[B2G_KEY_CURSOR12] = KBD_KEY_ROUTING(12),
[B2G_KEY_CURSOR13] = KBD_KEY_ROUTING(13),
[B2G_KEY_CURSOR14] = KBD_KEY_ROUTING(14),
[B2G_KEY_CURSOR15] = KBD_KEY_ROUTING(15),
[B2G_KEY_CURSOR16] = KBD_KEY_ROUTING(16),
[B2G_KEY_CURSOR17] = KBD_KEY_ROUTING(17),
[B2G_KEY_CURSOR18] = KBD_KEY_ROUTING(18),
[B2G_KEY_CURSOR19] = KBD_KEY_ROUTING(19),
[B2G_KEY_CURSOR20] = KBD_KEY_ROUTING(20),
[B2G_KEY_CURSOR21] = KBD_KEY_ROUTING(21),
[B2G_KEY_CURSOR22] = KBD_KEY_ROUTING(22),
[B2G_KEY_CURSOR23] = KBD_KEY_ROUTING(23),
[B2G_KEY_CURSOR24] = KBD_KEY_ROUTING(24),
[B2G_KEY_CURSOR25] = KBD_KEY_ROUTING(25),
[B2G_KEY_CURSOR26] = KBD_KEY_ROUTING(26),
[B2G_KEY_CURSOR27] = KBD_KEY_ROUTING(27),
[B2G_KEY_CURSOR28] = KBD_KEY_ROUTING(28),
[B2G_KEY_CURSOR29] = KBD_KEY_ROUTING(29),
[B2G_KEY_CURSOR30] = KBD_KEY_ROUTING(30),
[B2G_KEY_CURSOR31] = KBD_KEY_ROUTING(31),
[B2G_KEY_CURSOR32] = KBD_KEY_ROUTING(32),
[B2G_KEY_CURSOR33] = KBD_KEY_ROUTING(33),
[B2G_KEY_CURSOR34] = KBD_KEY_ROUTING(34),
[B2G_KEY_CURSOR35] = KBD_KEY_ROUTING(35),
[B2G_KEY_CURSOR36] = KBD_KEY_ROUTING(36),
[B2G_KEY_CURSOR37] = KBD_KEY_ROUTING(37),
[B2G_KEY_CURSOR38] = KBD_KEY_ROUTING(38),
[B2G_KEY_CURSOR39] = KBD_KEY_ROUTING(39),
[B2G_KEY_BACK] = KBD_KEY_BRAILLE(Backward),
[B2G_KEY_FORWARD] = KBD_KEY_BRAILLE(Forward),
END_KEY_CODE_MAP
static KeyboardInstanceObject *keyboardInstance = NULL;
struct KeyboardInstanceExtensionStruct {
JNIEnv *env;
jobject object;
jclass inputService;
jmethodID forwardKeyEvent;
};
int
newKeyboardMonitorExtension (KeyboardMonitorExtension **kmx) {
return 1;
}
void
destroyKeyboardMonitorExtension (KeyboardMonitorExtension *kmx) {
}
int
newKeyboardInstanceExtension (KeyboardInstanceExtension **kix) {
if ((*kix = malloc(sizeof(**kix)))) {
memset(*kix, 0, sizeof(**kix));
(*kix)->env = NULL;
(*kix)->object = NULL;
(*kix)->inputService = NULL;
(*kix)->forwardKeyEvent = 0;
return 1;
} else {
logMallocError();
}
return 0;
}
void
destroyKeyboardInstanceExtension (KeyboardInstanceExtension *kix) {
keyboardInstance = NULL;
free(kix);
}
int
forwardKeyEvent (KeyboardInstanceObject *kio, int code, int press) {
KeyboardInstanceExtension *kix = kio->kix;
if (findJavaClass(kix->env, &kix->inputService, JAVA_OBJ_BRLTTY("InputService"))) {
if (findJavaInstanceMethod(kix->env, &kix->forwardKeyEvent, kix->inputService, "forwardKeyEvent",
JAVA_SIG_METHOD(JAVA_SIG_VOID,
JAVA_SIG_INT // code
JAVA_SIG_BOOLEAN // press
))) {
(*kix->env)->CallVoidMethod(
kix->env, kix->object, kix->forwardKeyEvent,
code, (press? JNI_TRUE: JNI_FALSE)
);
if (!clearJavaException(kix->env, 1)) {
return 1;
}
}
}
return 0;
}
JAVA_INSTANCE_METHOD (
org_a11y_brltty_android_InputService, handleKeyEvent, jboolean,
jint code, jboolean press
) {
KeyboardInstanceObject *kio = keyboardInstance;
if (kio) {
KeyboardInstanceExtension *kix = kio->kix;
kix->env = env;
kix->object = this;
handleKeyEvent(kio, code, (press != JNI_FALSE));
return JNI_TRUE;
}
return JNI_FALSE;
}
int
monitorKeyboards (KeyboardMonitorObject *kmo) {
KeyboardInstanceObject *kio;
if ((kio = newKeyboardInstanceObject(kmo))) {
keyboardInstance = kio;
return 1;
}
return 0;
}