blob: 67dc231d78e8d9085732f715dfebd70120d02504 [file] [log] [blame]
/*
* 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 = true;
// 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;
}
}