From 26c9bb3a573b236f009654903461e496410a4147 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Mon, 25 Feb 2013 20:56:53 -0800 Subject: Start hooking up keyboard input to view Change-Id: I37fb55f8fadd79bf4f32f55bee83f879d4d90680 --- src/com/android/terminal/TerminalKeys.java | 46 +++++++++++++++++++++++++--- src/com/android/terminal/TerminalView.java | 49 ++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/com/android/terminal/TerminalKeys.java b/src/com/android/terminal/TerminalKeys.java index 5e88a20..e77085a 100644 --- a/src/com/android/terminal/TerminalKeys.java +++ b/src/com/android/terminal/TerminalKeys.java @@ -19,9 +19,11 @@ package com.android.terminal; import android.util.Log; import android.view.KeyCharacterMap; import android.view.KeyEvent; +import android.view.View; -public class TerminalKeys { +public class TerminalKeys implements View.OnKeyListener { 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; @@ -67,7 +69,9 @@ public class TerminalKeys { public static final int VTERM_MOD_ALT = 0x02; public static final int VTERM_MOD_CTRL = 0x04; - public static int getModifier(KeyEvent event) { + private Terminal mTerm; + + public static int getModifiers(KeyEvent event) { int mod = 0; if (event.isCtrlPressed()) { mod |= VTERM_MOD_CTRL; @@ -153,13 +157,47 @@ public class TerminalKeys { } } - public static int getCharacter(KeyEvent event) { + 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 VTERM_KEY_NONE; + return 0; } return c; } + + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (mTerm == null) return false; + + int modifiers = getModifiers(event); + + int c = getKey(event); + if (c != 0) { + mTerm.dispatchKey(modifiers, c); + if (DEBUG) { + Log.d(TAG, "dispatched key event: " + + "mod=" + modifiers + ", " + + "keys=" + getKeyName(keyCode)); + } + return true; + } + + c = getCharacter(event); + if (c != 0) { + mTerm.dispatchKey(modifiers, c); + if (DEBUG) { + Log.d(TAG, "dispatched key event: " + + "mod=" + modifiers + ", " + + "character='" + new String(Character.toChars(c)) + "'"); + } + return true; + } + + return false; + } + + public void setTerminal(Terminal term) { + mTerm = term; + } } diff --git a/src/com/android/terminal/TerminalView.java b/src/com/android/terminal/TerminalView.java index 64aeabd..4764183 100644 --- a/src/com/android/terminal/TerminalView.java +++ b/src/com/android/terminal/TerminalView.java @@ -25,6 +25,10 @@ import android.graphics.Rect; import android.graphics.Typeface; import android.os.SystemClock; import android.util.Log; +import android.view.inputmethod.BaseInputConnection; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.view.KeyEvent; import android.view.View; import com.android.terminal.Terminal.CellRun; @@ -51,6 +55,8 @@ public class TerminalView extends View { private Terminal mTerm; + private TerminalKeys mTermKeys; + private int mCharTop; private int mCharWidth; private int mCharHeight; @@ -107,8 +113,17 @@ public class TerminalView extends View { @Override public void onClick(View v) { v.invalidate(); + v.requestFocus(); } }); + + // Set view properties + setFocusable(true); + setFocusableInTouchMode(true); + setScrollContainer(true); + + mTermKeys = new TerminalKeys(); + setOnKeyListener(mTermKeys); } public void setTerminal(Terminal term) { @@ -119,6 +134,7 @@ public class TerminalView extends View { mTerm = term; if (term != null) { term.setClient(mClient); + mTermKeys.setTerminal(term); } updateTerminalSize(); } @@ -235,4 +251,37 @@ public class TerminalView extends View { final long delta = SystemClock.elapsedRealtime() - start; if (LOGD) Log.d(TAG, "onDraw() took " + delta + "ms"); } + + @Override + public boolean onCheckIsTextEditor() { + return true; + } + + @Override + public InputConnection onCreateInputConnection(EditorInfo outAttrs) { + outAttrs.imeOptions |= + EditorInfo.IME_FLAG_NO_EXTRACT_UI | + EditorInfo.IME_FLAG_NO_ENTER_ACTION | + EditorInfo.IME_ACTION_NONE; + outAttrs.inputType = EditorInfo.TYPE_NULL; + return new BaseInputConnection(this, false) { + @Override + public boolean deleteSurroundingText (int leftLength, int rightLength) { + KeyEvent k; + if (rightLength == 0 && leftLength == 0) { + k = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL); + return this.sendKeyEvent(k); + } + for (int i = 0; i < leftLength; i++) { + k = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL); + this.sendKeyEvent(k); + } + for (int i = 0; i < rightLength; i++) { + k = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_FORWARD_DEL); + this.sendKeyEvent(k); + } + return true; + } + }; + } } -- cgit v1.2.3