aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/layout/act_wizard.xml2
-rw-r--r--res/layout/wiz_eula.xml2
-rw-r--r--res/values/arrays.xml6
-rw-r--r--res/values/strings.xml1
-rw-r--r--res/xml/preferences.xml61
-rw-r--r--src/de/mud/terminal/VDUBuffer.java8
-rw-r--r--src/org/connectbot/ConsoleActivity.java79
-rw-r--r--src/org/connectbot/HostEditorActivity.java31
-rw-r--r--src/org/connectbot/HostListActivity.java1
-rw-r--r--src/org/connectbot/R.java8
-rw-r--r--src/org/connectbot/TerminalView.java15
-rw-r--r--src/org/connectbot/service/TerminalBridge.java118
-rw-r--r--src/org/connectbot/service/TerminalManager.java38
13 files changed, 286 insertions, 84 deletions
diff --git a/res/layout/act_wizard.xml b/res/layout/act_wizard.xml
index 73cf130..9d59126 100644
--- a/res/layout/act_wizard.xml
+++ b/res/layout/act_wizard.xml
@@ -35,7 +35,7 @@
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:padding="10dip"
+ android:padding="5dip"
>
<Button
diff --git a/res/layout/wiz_eula.xml b/res/layout/wiz_eula.xml
index 7616612..41b6b9f 100644
--- a/res/layout/wiz_eula.xml
+++ b/res/layout/wiz_eula.xml
@@ -41,7 +41,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
- android:text="It can manage several SSH sessions in the background, and can copy/paste between other apps."
+ android:text="It can manage several SSH sessions in the background, create tunnels, and copy/paste between other apps."
android:textAppearance="?android:attr/textAppearanceMedium"
/>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 020a1ab..33622f3 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -15,4 +15,10 @@
<item>gray</item>
</string-array>
+ <string-array name="list_keymode">
+ <item>Use right-side keys</item>
+ <item>Use left-side keys</item>
+ <item>Don't use</item>
+ </string-array>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3b63f21..2ec0bc6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -36,6 +36,7 @@
<string name="pref_emulation">emulation</string>
<string name="pref_scrollback">scrollback</string>
<string name="pref_keepalive">keepalive</string>
+ <string name="pref_keymode">keymode</string>
<string name="bind_minutes">%s minutes ago</string>
<string name="bind_hours">%s hours ago</string>
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 825b457..317aa26 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -18,30 +18,47 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
- <ListPreference
- android:key="@string/pref_emulation"
- android:title="Emulation mode"
- android:summary="Terminal emulation mode to use for PTY connections"
- android:entries="@array/list_emulation_modes"
- android:defaultValue="screen"
- android:entryValues="@array/list_emulation_modes"
- android:singleLine="true"
- />
+ <PreferenceCategory
+ android:title="Terminal emulation">
+
+ <ListPreference
+ android:key="@string/pref_emulation"
+ android:title="Emulation mode"
+ android:summary="Terminal emulation mode to use for PTY connections"
+ android:entries="@array/list_emulation_modes"
+ android:defaultValue="screen"
+ android:entryValues="@array/list_emulation_modes"
+ />
+
+ <EditTextPreference
+ android:key="@string/pref_scrollback"
+ android:title="Scrollback size"
+ android:summary="Size of scrollback buffer to keep in memory for each console"
+ android:defaultValue="140"
+ android:singleLine="true"
+ />
+
+ </PreferenceCategory>
- <EditTextPreference
- android:key="@string/pref_scrollback"
- android:title="Scrollback size"
- android:summary="Size of scrollback buffer to keep in memory for each console"
- android:defaultValue="140"
- android:singleLine="true"
- />
+ <PreferenceCategory
+ android:title="User interface">
- <CheckBoxPreference
- android:key="@string/pref_keepalive"
- android:title="Keep phone awake"
- android:summary="Keep the screen from turning off when working in a console"
- android:defaultValue="true"
- />
+ <ListPreference
+ android:key="@string/pref_keymode"
+ android:title="Directory shortcuts"
+ android:summary="Select how to use Alt for '/' and Shift for Tab"
+ android:entries="@array/list_keymode"
+ android:defaultValue="Use right-side keys"
+ android:entryValues="@array/list_keymode"
+ />
+
+ <CheckBoxPreference
+ android:key="@string/pref_keepalive"
+ android:title="Keep screen awake"
+ android:summary="Prevent the screen from turning off when working in a console"
+ android:defaultValue="true"
+ />
+ </PreferenceCategory>
</PreferenceScreen> \ No newline at end of file
diff --git a/src/de/mud/terminal/VDUBuffer.java b/src/de/mud/terminal/VDUBuffer.java
index 120f093..60e7abf 100644
--- a/src/de/mud/terminal/VDUBuffer.java
+++ b/src/de/mud/terminal/VDUBuffer.java
@@ -33,7 +33,7 @@ import android.util.Log;
* all methods to manipulate the buffer that stores characters and their
* attributes as well as the regions displayed.
*
- * @author Matthias L. Jugel, Marcus Mei§ner
+ * @author Matthias L. Jugel, Marcus Meiner
* @version $Id: VDUBuffer.java 503 2005-10-24 07:34:13Z marcus $
*/
public class VDUBuffer {
@@ -343,8 +343,10 @@ public class VDUBuffer {
if (scrollDown) {
if (n > (bottom - top)) n = (bottom - top);
- cbuf = new char[bottom - l - (n - 1)][width];
- abuf = new int[bottom - l - (n - 1)][width];
+ int size = bottom - l - (n - 1);
+ if(size < 0) size = 0;
+ cbuf = new char[size][width];
+ abuf = new int[size][width];
System.arraycopy(charArray, oldBase + l, cbuf, 0, bottom - l - (n - 1));
System.arraycopy(charAttributes, oldBase + l,
diff --git a/src/org/connectbot/ConsoleActivity.java b/src/org/connectbot/ConsoleActivity.java
index 34cc83a..d7be9de 100644
--- a/src/org/connectbot/ConsoleActivity.java
+++ b/src/org/connectbot/ConsoleActivity.java
@@ -109,6 +109,7 @@ public class ConsoleActivity extends Activity {
// let them know about our prompt handler services
bridge.promptHelper.setHandler(promptHandler);
+ bridge.refreshKeymode();
// inflate each terminal view
RelativeLayout view = (RelativeLayout)inflater.inflate(R.layout.item_terminal, flip, false);
@@ -387,6 +388,9 @@ public class ConsoleActivity extends Activity {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+
+ // if copying, then ignore
+ if(copying) return false;
// if releasing then reset total scroll
if(e2.getAction() == MotionEvent.ACTION_UP) {
@@ -467,6 +471,58 @@ public class ConsoleActivity extends Activity {
flip.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
+
+ // when copying, highlight the area
+ if(copying) {
+ if(copySource == null) return false;
+ int row = (int)(event.getY() / copySource.bridge.charHeight);
+ int col = (int)(event.getX() / copySource.bridge.charWidth);
+
+ switch(event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ // recording starting area
+ copySource.top = row;
+ copySource.left = col;
+ return false;
+ case MotionEvent.ACTION_MOVE:
+ // update selected area
+ copySource.bottom = row;
+ copySource.right = col;
+ copySource.invalidate();
+ return false;
+ case MotionEvent.ACTION_UP:
+ // copy selected area to clipboard
+ int top = Math.min(copySource.top, copySource.bottom),
+ bottom = Math.max(copySource.top, copySource.bottom),
+ left = Math.min(copySource.left, copySource.right),
+ right = Math.max(copySource.left, copySource.right);
+
+ // perform actual buffer copy
+ int size = (right - left) * (bottom - top);
+ StringBuffer buffer = new StringBuffer(size);
+ for(int y = top; y <= bottom; y++) {
+ for(int x = left; x <= right; x++) {
+ // only copy printable chars
+ char c = copySource.bridge.buffer.getChar(x, y);
+ if(c < 32 || c >= 127) c = ' ';
+ buffer.append(c);
+ }
+ buffer.append("\n");
+ }
+
+ clipboard.setText(buffer.toString());
+ Toast.makeText(ConsoleActivity.this, String.format("Copied %d bytes to clipboard", buffer.length()), Toast.LENGTH_LONG).show();
+
+ case MotionEvent.ACTION_CANCEL:
+ // make sure we clear any highlighted area
+ copySource.resetSelected();
+ copying = false;
+ return true;
+ }
+
+
+ }
+
// pass any touch events back to detector
return detect.onTouchEvent(event);
}
@@ -520,6 +576,9 @@ public class ConsoleActivity extends Activity {
protected MenuItem disconnect, copy, paste, tunnel;
+ protected boolean copying = false;
+ protected TerminalView copySource = null;
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
@@ -528,7 +587,7 @@ public class ConsoleActivity extends Activity {
boolean activeTerminal = (view instanceof TerminalView);
boolean authenticated = false;
if(activeTerminal)
- authenticated = ((TerminalView)view).bridge.connection.isAuthenticationComplete();
+ authenticated = ((TerminalView)view).bridge.fullyConnected;
disconnect = menu.add("Disconnect");
disconnect.setEnabled(activeTerminal);
@@ -547,8 +606,18 @@ public class ConsoleActivity extends Activity {
copy = menu.add("Copy");
copy.setIcon(android.R.drawable.ic_menu_set_as);
- copy.setEnabled(false && activeTerminal && authenticated);
- // TODO: freeze current console, allow selection, and set clipboard to contents
+ copy.setEnabled(activeTerminal && authenticated);
+ copy.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ // mark as copying and reset any previous bounds
+ copying = true;
+ copySource = (TerminalView)view;
+ copySource.resetSelected();
+
+ Toast.makeText(ConsoleActivity.this, "Touch and drag to select area to copy", Toast.LENGTH_LONG).show();
+ return true;
+ }
+ });
paste = menu.add("Paste");
@@ -637,10 +706,10 @@ public class ConsoleActivity extends Activity {
boolean activeTerminal = (view instanceof TerminalView);
boolean authenticated = false;
if(activeTerminal)
- authenticated = ((TerminalView)view).bridge.connection.isAuthenticationComplete();
+ authenticated = ((TerminalView)view).bridge.fullyConnected;
disconnect.setEnabled(activeTerminal);
- copy.setEnabled(false && activeTerminal && authenticated);
+ copy.setEnabled(activeTerminal && authenticated);
paste.setEnabled(clipboard.hasText() && activeTerminal && authenticated);
tunnel.setEnabled(activeTerminal && authenticated);
diff --git a/src/org/connectbot/HostEditorActivity.java b/src/org/connectbot/HostEditorActivity.java
index 84e0790..d0f628f 100644
--- a/src/org/connectbot/HostEditorActivity.java
+++ b/src/org/connectbot/HostEditorActivity.java
@@ -42,14 +42,12 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
public class CursorPreferenceHack implements SharedPreferences {
- protected final SQLiteDatabase db;
protected final String table;
protected final int id;
protected Map<String, String> values = new HashMap<String, String>();
- public CursorPreferenceHack(SQLiteDatabase db, String table, int id) {
- this.db = db;
+ public CursorPreferenceHack(String table, int id) {
this.table = table;
this.id = id;
@@ -61,6 +59,7 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
// fill a cursor and cache the values locally
// this makes sure we dont have any floating cursor to dispose later
+ SQLiteDatabase db = hostdb.getReadableDatabase();
Cursor cursor = db.query(table, null, "_id = ?",
new String[] { Integer.toString(id) }, null, null, null);
cursor.moveToFirst();
@@ -73,6 +72,7 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
}
cursor.close();
+ db.close();
}
@@ -92,7 +92,9 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
public boolean commit() {
Log.d(this.getClass().toString(), "commit() changes back to database");
+ SQLiteDatabase db = hostdb.getWritableDatabase();
db.update(table, update, "_id = ?", new String[] { Integer.toString(id) });
+ db.close();
// make sure we refresh the parent cached values
cacheValues();
@@ -187,19 +189,21 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
return this.pref;
}
- public CursorPreferenceHack pref;
+ protected HostDatabase hostdb = null;
+ protected CursorPreferenceHack pref;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- HostDatabase db = new HostDatabase(this);
int id = this.getIntent().getIntExtra(Intent.EXTRA_TITLE, -1);
// TODO: we could pass through a specific ContentProvider uri here
//this.getPreferenceManager().setSharedPreferencesName(uri);
- this.pref = new CursorPreferenceHack(db.getWritableDatabase(), HostDatabase.TABLE_HOSTS, id);
+ this.hostdb = new HostDatabase(this);
+
+ this.pref = new CursorPreferenceHack(HostDatabase.TABLE_HOSTS, id);
this.pref.registerOnSharedPreferenceChangeListener(this);
this.addPreferencesFromResource(R.xml.host_prefs);
@@ -209,6 +213,21 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
}
+ public void onStart() {
+ super.onStart();
+ if(this.hostdb == null)
+ this.hostdb = new HostDatabase(this);
+
+ }
+
+ public void onStop() {
+ super.onStop();
+ if(this.hostdb != null) {
+ this.hostdb.close();
+ this.hostdb = null;
+ }
+ }
+
public void updateSummaries() {
// for all text preferences, set hint as current database value
for(String key : this.pref.values.keySet()) {
diff --git a/src/org/connectbot/HostListActivity.java b/src/org/connectbot/HostListActivity.java
index 6581b59..d9bc586 100644
--- a/src/org/connectbot/HostListActivity.java
+++ b/src/org/connectbot/HostListActivity.java
@@ -294,6 +294,7 @@ public class HostListActivity extends ListActivity {
// refresh cursor because of possible sorting change
if(this.hosts != null)
this.hosts.close();
+ if(this.hostdb == null) return;
this.hosts = this.hostdb.allHosts(sortedByColor);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item_host, this.hosts,
diff --git a/src/org/connectbot/R.java b/src/org/connectbot/R.java
index 2e6c118..d33398a 100644
--- a/src/org/connectbot/R.java
+++ b/src/org/connectbot/R.java
@@ -19,6 +19,7 @@ public final class R {
public static final class array {
public static final int list_colors=0x7f060001;
public static final int list_emulation_modes=0x7f060000;
+ public static final int list_keymode=0x7f060002;
}
public static final class attr {
}
@@ -68,9 +69,9 @@ public final class R {
public static final int alert_disconnect_msg=0x7f070015;
public static final int app_desc=0x7f070001;
public static final int app_name=0x7f070000;
- public static final int bind_days=0x7f07001d;
- public static final int bind_hours=0x7f07001c;
- public static final int bind_minutes=0x7f07001b;
+ public static final int bind_days=0x7f07001e;
+ public static final int bind_hours=0x7f07001d;
+ public static final int bind_minutes=0x7f07001c;
public static final int button_add=0x7f070011;
public static final int button_cancel=0x7f070012;
public static final int button_change=0x7f070013;
@@ -85,6 +86,7 @@ public final class R {
public static final int msg_version=0x7f070017;
public static final int pref_emulation=0x7f070018;
public static final int pref_keepalive=0x7f07001a;
+ public static final int pref_keymode=0x7f07001b;
public static final int pref_scrollback=0x7f070019;
public static final int prompt_touch=0x7f07000f;
public static final int resolve_connect=0x7f070009;
diff --git a/src/org/connectbot/TerminalView.java b/src/org/connectbot/TerminalView.java
index c25507c..23c6770 100644
--- a/src/org/connectbot/TerminalView.java
+++ b/src/org/connectbot/TerminalView.java
@@ -41,6 +41,15 @@ public class TerminalView extends View {
protected final TerminalBridge bridge;
protected final Paint paint;
protected final Paint cursorPaint;
+
+ public int top = -1, bottom = -1, left = -1, right = -1;
+
+ public void resetSelected() {
+ this.top = -1;
+ this.bottom = -1;
+ this.left = -1;
+ this.right = -1;
+ }
public TerminalView(Context context, TerminalBridge bridge) {
super(context);
@@ -92,6 +101,12 @@ public class TerminalView extends View {
y + this.bridge.charHeight, cursorPaint);
}
+
+ // draw any highlighted area
+ if(top >= 0 && bottom >= 0 && left >= 0 && right >= 0) {
+ canvas.drawRect(left * this.bridge.charWidth, top * this.bridge.charHeight,
+ right * this.bridge.charWidth, bottom * this.bridge.charHeight, cursorPaint);
+ }
}
diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java
index 45cc7cb..ea677f2 100644
--- a/src/org/connectbot/service/TerminalBridge.java
+++ b/src/org/connectbot/service/TerminalBridge.java
@@ -91,9 +91,10 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
public final static int COLOR_FG_STD = 7;
public final static int COLOR_BG_STD = 0;
+
+ protected final TerminalManager manager;
public final String nickname;
- protected final HostDatabase hostdb;
protected final String username;
public String postlogin = null;
@@ -126,7 +127,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
public boolean verifyServerHostKey(String hostname, int port, String serverHostKeyAlgorithm, byte[] serverHostKey) throws Exception {
// read in all known hosts from hostdb
- KnownHosts hosts = hostdb.getKnownHosts();
+ KnownHosts hosts = manager.hostdb.getKnownHosts();
switch(hosts.verifyHostkey(hostname, serverHostKeyAlgorithm, serverHostKey)) {
case KnownHosts.HOSTKEY_IS_OK:
@@ -142,7 +143,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
if(result == null) return false;
if(result.booleanValue()) {
// save this key in known database
- hostdb.saveKnownHost(hostname, serverHostKeyAlgorithm, serverHostKey);
+ manager.hostdb.saveKnownHost(hostname, serverHostKeyAlgorithm, serverHostKey);
}
return result.booleanValue();
@@ -172,14 +173,15 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
* launch thread to start SSH connection and handle any hostkey verification
* and password authentication.
*/
- public TerminalBridge(final HostDatabase hostdb, final String nickname, final String username, final String hostname, final int port, String emulation, int scrollback) throws Exception {
+ public TerminalBridge(final TerminalManager manager, final String nickname, final String username, final String hostname, final int port) throws Exception {
- this.hostdb = hostdb;
+ this.manager = manager;
this.nickname = nickname;
this.username = username;
- this.emulation = emulation;
- this.scrollback = scrollback;
+ this.emulation = manager.getEmulation();
+ this.scrollback = manager.getScrollback();
+ this.postlogin = manager.getPostLogin(nickname);
// create prompt helper to relay password and hostkey requests up to gui
this.promptHelper = new PromptHelper(this);
@@ -314,14 +316,21 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
* Inject a specific string into this terminal. Used for post-login strings
* and pasting clipboard.
*/
- public void injectString(String string) {
- if(string == null || string.length() == 0) return;
- KeyEvent[] events = keymap.getEvents(string.toCharArray());
- for(KeyEvent event : events) {
- this.onKey(null, event.getKeyCode(), event);
- }
+ public void injectString(final String string) {
+ new Thread(new Runnable() {
+ public void run() {
+ if(string == null || string.length() == 0) return;
+ KeyEvent[] events = keymap.getEvents(string.toCharArray());
+ if(events == null || events.length == 0) return;
+ for(KeyEvent event : events) {
+ onKey(null, event.getKeyCode(), event);
+ }
+ }
+ }).start();
}
+ public boolean fullyConnected = false;
+
/**
* Internal method to request actual PTY terminal once we've finished
* authentication. If called before authenticated, it will just fail.
@@ -367,6 +376,8 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
// force font-size to make sure we resizePTY as needed
this.setFontSize(this.fontSize);
+ this.fullyConnected = true;
+
// finally send any post-login string, if requested
this.injectString(postlogin);
@@ -399,6 +410,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
}).start();
this.disconnectFlag = true;
+ this.fullyConnected = false;
// pass notification back up to terminal manager
// the manager will do any gui notification if applicable
@@ -407,8 +419,14 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
}
+ public String keymode = null;
+
+ public void refreshKeymode() {
+ this.keymode = this.manager.getKeyMode();
+ }
+
public KeyCharacterMap keymap = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
-
+
/**
* Handle onKey() events coming down from a {@link TerminalView} above us.
* We might collect these for our internal buffer when working with hostkeys
@@ -435,12 +453,16 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
// skip keys if we arent connected yet
if(this.session == null) return false;
-
+
// otherwise pass through to existing session
// print normal keys
if (printing) {
int key = keymap.get(keyCode, event.getMetaState());
+
+ Log.d(TAG, Integer.toString(event.getMetaState()));
+
if (ctrlPressed) {
+ //if((event.getMetaState() & KeyEvent.META_SYM_ON) != 0) {
// Support CTRL-A through CTRL-Z
if (key >= 0x61 && key <= 0x79)
key -= 0x60;
@@ -448,26 +470,64 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
key -= 0x39;
ctrlPressed = false;
}
+
+ // handle pressing f-keys
+ if((event.getMetaState() & KeyEvent.META_SHIFT_ON) != 0) {
+ Log.d(TAG, "yay pressing an fkey");
+ switch(key) {
+ case '!': ((vt320)buffer).keyPressed(vt320.KEY_F1, ' ', 0); return true;
+ case '@': ((vt320)buffer).keyPressed(vt320.KEY_F2, ' ', 0); return true;
+ case '#': ((vt320)buffer).keyPressed(vt320.KEY_F3, ' ', 0); return true;
+ case '$': ((vt320)buffer).keyPressed(vt320.KEY_F4, ' ', 0); return true;
+ case '%': ((vt320)buffer).keyPressed(vt320.KEY_F5, ' ', 0); return true;
+ case '^': ((vt320)buffer).keyPressed(vt320.KEY_F6, ' ', 0); return true;
+ case '&': ((vt320)buffer).keyPressed(vt320.KEY_F7, ' ', 0); return true;
+ case '*': ((vt320)buffer).keyPressed(vt320.KEY_F8, ' ', 0); return true;
+ case '(': ((vt320)buffer).keyPressed(vt320.KEY_F9, ' ', 0); return true;
+ case ')': ((vt320)buffer).keyPressed(vt320.KEY_F10, ' ', 0); return true;
+ }
+ }
+
this.stdin.write(key);
return true;
}
+
+ // try handling keymode shortcuts
+ if("Use right-side keys".equals(this.keymode)) {
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_ALT_RIGHT: this.stdin.write('/'); return true;
+ case KeyEvent.KEYCODE_SHIFT_RIGHT: this.stdin.write(0x09); return true;
+ }
+ } else if("Use left-side keys".equals(this.keymode)) {
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_ALT_LEFT: this.stdin.write('/'); return true;
+ case KeyEvent.KEYCODE_SHIFT_LEFT: this.stdin.write(0x09); return true;
+ }
+ }
// look for special chars
switch(keyCode) {
- case KeyEvent.KEYCODE_DEL: stdin.write(0x08); return true;
- case KeyEvent.KEYCODE_ENTER: ((vt320)buffer).keyTyped(vt320.KEY_ENTER, ' ', event.getMetaState()); return true;
- case KeyEvent.KEYCODE_DPAD_LEFT: ((vt320)buffer).keyPressed(vt320.KEY_LEFT, ' ', event.getMetaState()); return true;
- case KeyEvent.KEYCODE_DPAD_UP: ((vt320)buffer).keyPressed(vt320.KEY_UP, ' ', event.getMetaState()); return true;
- case KeyEvent.KEYCODE_DPAD_DOWN: ((vt320)buffer).keyPressed(vt320.KEY_DOWN, ' ', event.getMetaState()); return true;
- case KeyEvent.KEYCODE_DPAD_RIGHT: ((vt320)buffer).keyPressed(vt320.KEY_RIGHT, ' ', event.getMetaState()); return true;
- case KeyEvent.KEYCODE_DPAD_CENTER:
- // TODO: Add some visual indication of Ctrl state
- if (ctrlPressed) {
- stdin.write(0x1B); // ESC
- ctrlPressed = false;
- } else
- ctrlPressed = true;
- return true;
+ case KeyEvent.KEYCODE_CAMERA:
+ this.stdin.write(0x01);
+ this.stdin.write(' ');
+ //((vt320)buffer).keyTyped('a', 'a', vt320.KEY_CONTROL);
+ //((vt320)buffer).keyTyped(' ', ' ', 0);
+ break;
+
+ case KeyEvent.KEYCODE_DEL: stdin.write(0x08); return true;
+ case KeyEvent.KEYCODE_ENTER: ((vt320)buffer).keyTyped(vt320.KEY_ENTER, ' ', event.getMetaState()); return true;
+ case KeyEvent.KEYCODE_DPAD_LEFT: ((vt320)buffer).keyPressed(vt320.KEY_LEFT, ' ', event.getMetaState()); return true;
+ case KeyEvent.KEYCODE_DPAD_UP: ((vt320)buffer).keyPressed(vt320.KEY_UP, ' ', event.getMetaState()); return true;
+ case KeyEvent.KEYCODE_DPAD_DOWN: ((vt320)buffer).keyPressed(vt320.KEY_DOWN, ' ', event.getMetaState()); return true;
+ case KeyEvent.KEYCODE_DPAD_RIGHT: ((vt320)buffer).keyPressed(vt320.KEY_RIGHT, ' ', event.getMetaState()); return true;
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ // TODO: Add some visual indication of Ctrl state
+ if (ctrlPressed) {
+ stdin.write(0x1B); // ESC
+ ctrlPressed = false;
+ } else
+ ctrlPressed = true;
+ return true;
}
} catch (IOException e) {
diff --git a/src/org/connectbot/service/TerminalManager.java b/src/org/connectbot/service/TerminalManager.java
index 1941f8b..f37315d 100644
--- a/src/org/connectbot/service/TerminalManager.java
+++ b/src/org/connectbot/service/TerminalManager.java
@@ -54,7 +54,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
protected HostDatabase hostdb;
protected SharedPreferences prefs;
- protected String pref_emulation, pref_scrollback;
+ protected String pref_emulation, pref_scrollback, pref_keymode;
@Override
public void onCreate() {
@@ -62,6 +62,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
this.prefs = PreferenceManager.getDefaultSharedPreferences(this);
this.pref_emulation = this.getResources().getString(R.string.pref_emulation);
this.pref_scrollback = this.getResources().getString(R.string.pref_scrollback);
+ this.pref_keymode = this.getResources().getString(R.string.pref_keymode);
this.hostdb = new HostDatabase(this);
@@ -89,19 +90,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
throw new Exception("Connection already open for that nickname");
}
- String emulation = prefs.getString(this.pref_emulation, "screen");
- int scrollback = 140;
- try {
- scrollback = Integer.parseInt(prefs.getString(this.pref_scrollback, "140"));
- } catch(Exception e) {
- }
-
- // find the post-connection string for this host
- String postlogin = hostdb.getPostLogin(nickname);
-
- TerminalBridge bridge = new TerminalBridge(hostdb, nickname, username, hostname, port, emulation, scrollback);
- bridge.disconnectListener = this;
- bridge.postlogin = postlogin;
+ TerminalBridge bridge = new TerminalBridge(this, nickname, username, hostname, port);
bridge.setOnDisconnectedListener(this);
bridge.startConnection();
this.bridges.add(bridge);
@@ -111,6 +100,27 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
}
+ public String getEmulation() {
+ return prefs.getString(this.pref_emulation, "screen");
+ }
+
+ public int getScrollback() {
+ int scrollback = 140;
+ try {
+ scrollback = Integer.parseInt(prefs.getString(this.pref_scrollback, "140"));
+ } catch(Exception e) {
+ }
+ return scrollback;
+ }
+
+ public String getPostLogin(String nickname) {
+ return hostdb.getPostLogin(nickname);
+ }
+
+ public String getKeyMode() {
+ return prefs.getString(this.pref_keymode, "Use right-side keys");
+ }
+
/**
* Open a new SSH session by reading parameters from the given URI. Follows
* format <code>ssh://user@host:port/#nickname</code>