# HG changeset patch
# Parent e665c525f12fa320ddcf14dea98608f4451295f3
Add additional keys supported by Swype.

diff --git a/src/org/connectbot/service/TerminalKeyListener.java b/src/org/connectbot/service/TerminalKeyListener.java
--- a/src/org/connectbot/service/TerminalKeyListener.java
+++ b/src/org/connectbot/service/TerminalKeyListener.java
@@ -293,6 +293,15 @@
 						return true;
 					}
 				}
+			} else {
+				// Support Home, End, & Cursor Jump in Swype.
+				switch (keyCode) {
+				case KeyEvent.KEYCODE_ALT_LEFT:
+				case KeyEvent.KEYCODE_ALT_RIGHT:
+					// Cusor Jump emits two ALT_LEFTs, don't want META_ALT_LOCK.
+					metaState |= META_ALT_ON;
+					return true;
+				}
 			}
 
 			// look for special chars
@@ -323,8 +332,14 @@
 				metaState &= ~META_TRANSIENT;
 				return true;
 			case KeyEvent.KEYCODE_ENTER:
-				((vt320)buffer).keyTyped(vt320.KEY_ENTER, ' ', 0);
-				metaState &= ~META_TRANSIENT;
+				// Allow Enter to be used for copy selection in Swype.
+				if (bridge.isSelectingForCopy()) {
+					selectForCopy(v);
+					bridge.redraw();
+				} else {
+					((vt320)buffer).keyTyped(vt320.KEY_ENTER, ' ', 0);
+					metaState &= ~META_TRANSIENT;
+				}
 				return true;
 
 			case KeyEvent.KEYCODE_DPAD_LEFT:
@@ -332,8 +347,13 @@
 					selectionArea.decrementColumn();
 					bridge.redraw();
 				} else {
-					((vt320) buffer).keyPressed(vt320.KEY_LEFT, ' ',
-							getStateForBuffer());
+					if ((metaState & META_ALT_MASK) != 0) {
+						((vt320) buffer).keyPressed(vt320.KEY_HOME, ' ',
+								getStateForBuffer());
+					} else {
+						((vt320) buffer).keyPressed(vt320.KEY_LEFT, ' ',
+								getStateForBuffer());
+					}
 					metaState &= ~META_TRANSIENT;
 					bridge.tryKeyVibrate();
 				}
@@ -344,8 +364,13 @@
 					selectionArea.decrementRow();
 					bridge.redraw();
 				} else {
-					((vt320) buffer).keyPressed(vt320.KEY_UP, ' ',
-							getStateForBuffer());
+					if ((metaState & META_ALT_MASK) != 0) {
+						((vt320) buffer).keyPressed(vt320.KEY_PAGE_UP, ' ',
+								getStateForBuffer());
+					} else {
+						((vt320) buffer).keyPressed(vt320.KEY_UP, ' ',
+								getStateForBuffer());
+					}
 					metaState &= ~META_TRANSIENT;
 					bridge.tryKeyVibrate();
 				}
@@ -356,8 +381,13 @@
 					selectionArea.incrementRow();
 					bridge.redraw();
 				} else {
-					((vt320) buffer).keyPressed(vt320.KEY_DOWN, ' ',
-							getStateForBuffer());
+					if ((metaState & META_ALT_MASK) != 0) {
+						((vt320) buffer).keyPressed(vt320.KEY_PAGE_DOWN, ' ',
+								getStateForBuffer());
+					} else {
+						((vt320) buffer).keyPressed(vt320.KEY_DOWN, ' ',
+								getStateForBuffer());
+					}
 					metaState &= ~META_TRANSIENT;
 					bridge.tryKeyVibrate();
 				}
@@ -368,8 +398,13 @@
 					selectionArea.incrementColumn();
 					bridge.redraw();
 				} else {
-					((vt320) buffer).keyPressed(vt320.KEY_RIGHT, ' ',
-							getStateForBuffer());
+					if ((metaState & META_ALT_MASK) != 0) {
+						((vt320) buffer).keyPressed(vt320.KEY_END, ' ',
+								getStateForBuffer());
+					} else {
+						((vt320) buffer).keyPressed(vt320.KEY_RIGHT, ' ',
+								getStateForBuffer());
+					}
 					metaState &= ~META_TRANSIENT;
 					bridge.tryKeyVibrate();
 				}
@@ -378,24 +413,9 @@
 			case KeyEvent.KEYCODE_DPAD_CENTER:
 			case  97: // SMILEY (Eclair & Froyo)
 			case 116: // SMILEY (Gingerbread)
-				if (bridge.isSelectingForCopy()) {
-					if (selectionArea.isSelectingOrigin())
-						selectionArea.finishSelectingOrigin();
-					else {
-						if (clipboard != null) {
-							// copy selected area to clipboard
-							String copiedText = selectionArea.copyFrom(buffer);
-
-							clipboard.setText(copiedText);
-							((TerminalView)v).notifyUser(manager.res.getString(
-									R.string.console_copy_done,
-									copiedText.length()));
-
-							bridge.setSelectingForCopy(false);
-							selectionArea.reset();
-						}
-					}
-				} else {
+				if (bridge.isSelectingForCopy())
+					selectForCopy(v);
+				else {
 					if ((metaState & META_CTRL_ON) != 0) {
 						sendEscape();
 						metaState &= ~META_CTRL_ON;
@@ -544,4 +564,23 @@
 	public void setCharset(String encoding) {
 		this.encoding = encoding;
 	}
+
+	private void selectForCopy(View v) {
+		if (selectionArea.isSelectingOrigin())
+			selectionArea.finishSelectingOrigin();
+		else {
+			if (clipboard != null) {
+				// copy selected area to clipboard
+				String copiedText = selectionArea.copyFrom(buffer);
+
+				clipboard.setText(copiedText);
+				((TerminalView)v).notifyUser(manager.res.getString(
+						R.string.console_copy_done,
+						copiedText.length()));
+
+				bridge.setSelectingForCopy(false);
+				selectionArea.reset();
+			}
+		}
+	}
 }
