/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.terminal; import android.util.Log; import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.View; public class TerminalKeys { private static final String TAG = "TerminalKeys"; private static final boolean DEBUG = false; // Taken from vterm_input.h // TODO: Consider setting these via jni public static final int VTERM_KEY_NONE = 0; public static final int VTERM_KEY_ENTER = 1; public static final int VTERM_KEY_TAB = 2; public static final int VTERM_KEY_BACKSPACE = 3; public static final int VTERM_KEY_ESCAPE = 4; public static final int VTERM_KEY_UP = 5; public static final int VTERM_KEY_DOWN = 6; public static final int VTERM_KEY_LEFT = 7; public static final int VTERM_KEY_RIGHT = 8; public static final int VTERM_KEY_INS = 9; public static final int VTERM_KEY_DEL = 10; public static final int VTERM_KEY_HOME = 11; public static final int VTERM_KEY_END = 12; public static final int VTERM_KEY_PAGEUP = 13; public static final int VTERM_KEY_PAGEDOWN = 14; public static final int VTERM_KEY_FUNCTION_0 = 256; public static final int VTERM_KEY_FUNCTION_MAX = VTERM_KEY_FUNCTION_0 + 255; public static final int VTERM_KEY_KP_0 = 512; public static final int VTERM_KEY_KP_1 = 513; public static final int VTERM_KEY_KP_2 = 514; public static final int VTERM_KEY_KP_3 = 515; public static final int VTERM_KEY_KP_4 = 516; public static final int VTERM_KEY_KP_5 = 517; public static final int VTERM_KEY_KP_6 = 518; public static final int VTERM_KEY_KP_7 = 519; public static final int VTERM_KEY_KP_8 = 520; public static final int VTERM_KEY_KP_9 = 521; public static final int VTERM_KEY_KP_MULT = 522; public static final int VTERM_KEY_KP_PLUS = 523; public static final int VTERM_KEY_KP_COMMA = 524; public static final int VTERM_KEY_KP_MINUS = 525; public static final int VTERM_KEY_KP_PERIOD = 526; public static final int VTERM_KEY_KP_DIVIDE = 527; public static final int VTERM_KEY_KP_ENTER = 528; public static final int VTERM_KEY_KP_EQUAL = 529; public static final int VTERM_MOD_NONE = 0x00; public static final int VTERM_MOD_SHIFT = 0x01; public static final int VTERM_MOD_ALT = 0x02; public static final int VTERM_MOD_CTRL = 0x04; private Terminal mTerm; public static int getModifiers(KeyEvent event) { int mod = 0; if (event.isCtrlPressed()) { mod |= VTERM_MOD_CTRL; } if (event.isAltPressed()) { mod |= VTERM_MOD_ALT; } if (event.isShiftPressed()) { mod |= VTERM_MOD_SHIFT; } return mod; } public static int getKey(KeyEvent event) { switch(event.getKeyCode()) { case KeyEvent.KEYCODE_ENTER: return VTERM_KEY_ENTER; case KeyEvent.KEYCODE_TAB: return VTERM_KEY_TAB; case KeyEvent.KEYCODE_DEL: return VTERM_KEY_BACKSPACE; case KeyEvent.KEYCODE_ESCAPE: return VTERM_KEY_ESCAPE; case KeyEvent.KEYCODE_DPAD_UP: return VTERM_KEY_UP; case KeyEvent.KEYCODE_DPAD_DOWN: return VTERM_KEY_DOWN; case KeyEvent.KEYCODE_DPAD_LEFT: return VTERM_KEY_LEFT; case KeyEvent.KEYCODE_DPAD_RIGHT: return VTERM_KEY_RIGHT; case KeyEvent.KEYCODE_INSERT: return VTERM_KEY_INS; case KeyEvent.KEYCODE_FORWARD_DEL: return VTERM_KEY_DEL; case KeyEvent.KEYCODE_MOVE_HOME: return VTERM_KEY_HOME; case KeyEvent.KEYCODE_MOVE_END: return VTERM_KEY_END; case KeyEvent.KEYCODE_PAGE_UP: return VTERM_KEY_PAGEUP; case KeyEvent.KEYCODE_PAGE_DOWN: return VTERM_KEY_PAGEDOWN; default: return 0; } } public static String getKeyName(int key) { switch(key) { case VTERM_KEY_ENTER: return "VTERM_KEY_ENTER"; case VTERM_KEY_TAB: return "VTERM_KEY_TAB"; case VTERM_KEY_BACKSPACE: return "VTERM_KEY_BACKSPACE"; case VTERM_KEY_ESCAPE: return "VTERM_KEY_ESCAPE"; case VTERM_KEY_UP: return "VTERM_KEY_UP"; case VTERM_KEY_DOWN: return "VTERM_KEY_DOWN"; case VTERM_KEY_LEFT: return "VTERM_KEY_LEFT"; case VTERM_KEY_RIGHT: return "VTERM_KEY_RIGHT"; case VTERM_KEY_INS: return "VTERM_KEY_INS"; case VTERM_KEY_DEL: return "VTERM_KEY_DEL"; case VTERM_KEY_HOME: return "VTERM_KEY_HOME"; case VTERM_KEY_END: return "VTERM_KEY_END"; case VTERM_KEY_PAGEUP: return "VTERM_KEY_PAGEUP"; case VTERM_KEY_PAGEDOWN: return "VTERM_KEY_PAGEDOWN"; case VTERM_KEY_NONE: return "VTERM_KEY_NONE"; default: return "UNKNOWN KEY"; } } public int getCharacter(KeyEvent event) { int c = event.getUnicodeChar(); // TODO: Actually support dead keys if ((c & KeyCharacterMap.COMBINING_ACCENT) != 0) { Log.w(TAG, "Received dead key, ignoring"); return 0; } return c; } public boolean onKey(View v, int keyCode, KeyEvent event) { if (mTerm == null || event.getAction() == KeyEvent.ACTION_UP) return false; int modifiers = getModifiers(event); int c = getKey(event); if (c != 0) { if (DEBUG) { Log.d(TAG, "dispatched key event: " + "mod=" + modifiers + ", " + "keys=" + getKeyName(c)); } return mTerm.dispatchKey(modifiers, c); } c = getCharacter(event); if (c != 0) { if (DEBUG) { Log.d(TAG, "dispatched key event: " + "mod=" + modifiers + ", " + "character='" + new String(Character.toChars(c)) + "'"); } return mTerm.dispatchCharacter(modifiers, c); } return false; } public void setTerminal(Terminal term) { mTerm = term; } }