aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values/arrays.xml12
-rw-r--r--res/values/strings.xml7
-rw-r--r--res/xml/preferences.xml9
-rw-r--r--src/org/connectbot/ConsoleActivity.java2
-rw-r--r--src/org/connectbot/HostListActivity.java5
-rw-r--r--src/org/connectbot/service/TerminalKeyListener.java33
-rw-r--r--src/org/connectbot/util/PreferenceConstants.java4
7 files changed, 67 insertions, 5 deletions
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 00c92ba..4721490 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -71,6 +71,18 @@
<item>gray</item>
</string-array>
+ <string-array name="list_stickymodifiers" translatable="false">
+ <item>@string/no</item>
+ <item>@string/only_alt</item>
+ <item>@string/yes</item>
+ </string-array>
+
+ <string-array name="list_stickymodifiers_values" translatable="false">
+ <item>no</item>
+ <item>alt</item>
+ <item>yes</item>
+ </string-array>
+
<string-array name="list_keymode" translatable="false">
<item>@string/list_keymode_right</item>
<item>@string/list_keymode_left</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 273815b..e634385 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -196,6 +196,13 @@
<!-- Summary for the keyboard shortcuts preference -->
<string name="pref_keymode_summary">"Select how to use Alt for '/' and Shift for Tab"</string>
+ <!-- Name for the sticky modifiers preference -->
+ <string name="pref_stickymodifiers_title">"Sticky modifiers"</string>
+ <!-- Summary for the sticky modifiers preference -->
+ <string name="pref_stickymodifiers_summary">"Modifier keys remain enabled until another key is pressed"</string>
+
+ <string name="only_alt">"Only alt"</string>
+
<!-- Name for the camera shortcut usage preference -->
<string name="pref_camera_title">"Camera shortcut"</string>
<!-- Summary for the camera shortcut usage preference -->
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 6d20a5d..a1b79ae 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -122,6 +122,15 @@
/>
<ListPreference
+ android:key="stickymodifiers"
+ android:title="@string/pref_stickymodifiers_title"
+ android:summary="@string/pref_stickymodifiers_summary"
+ android:entries="@array/list_stickymodifiers"
+ android:entryValues="@array/list_stickymodifiers_values"
+ android:defaultValue="no"
+ />
+
+ <ListPreference
android:key="keymode"
android:title="@string/pref_keymode_title"
android:summary="@string/pref_keymode_summary"
diff --git a/src/org/connectbot/ConsoleActivity.java b/src/org/connectbot/ConsoleActivity.java
index 7aca08c..aeb0e67 100644
--- a/src/org/connectbot/ConsoleActivity.java
+++ b/src/org/connectbot/ConsoleActivity.java
@@ -422,7 +422,7 @@ public class ConsoleActivity extends Activity {
TerminalView terminal = (TerminalView)flip;
TerminalKeyListener handler = terminal.bridge.getKeyHandler();
- handler.metaPress(TerminalKeyListener.OUR_CTRL_ON);
+ handler.metaPress(TerminalKeyListener.OUR_CTRL_ON, true);
hideEmulatedKeys();
}
});
diff --git a/src/org/connectbot/HostListActivity.java b/src/org/connectbot/HostListActivity.java
index 648b705..99c2a39 100644
--- a/src/org/connectbot/HostListActivity.java
+++ b/src/org/connectbot/HostListActivity.java
@@ -172,6 +172,11 @@ public class HostListActivity extends ListActivity {
editor.putBoolean(PreferenceConstants.CTRL_FKEYS, true);
editor.commit();
}
+ if (!prefs.contains(PreferenceConstants.STICKY_MODIFIERS)) {
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putString(PreferenceConstants.STICKY_MODIFIERS, PreferenceConstants.YES);
+ editor.commit();
+ }
}
// check for eula agreement
diff --git a/src/org/connectbot/service/TerminalKeyListener.java b/src/org/connectbot/service/TerminalKeyListener.java
index 43bd8e0..fc3413d 100644
--- a/src/org/connectbot/service/TerminalKeyListener.java
+++ b/src/org/connectbot/service/TerminalKeyListener.java
@@ -64,6 +64,8 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
// backport constants from api level 11
private final static int KEYCODE_ESCAPE = 111;
+ private final static int KEYCODE_CTRL_LEFT = 113;
+ private final static int KEYCODE_CTRL_RIGHT = 114;
private final static int HC_META_CTRL_ON = 0x1000;
private final static int HC_META_CTRL_LEFT_ON = 0x2000;
private final static int HC_META_CTRL_RIGHT_ON = 0x4000;
@@ -81,6 +83,7 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
private boolean shiftedNumbersAreFKeysOnHardKeyboard;
private boolean controlNumbersAreFKeysOnSoftKeyboard;
private boolean volumeKeysChangeFontSize;
+ private int stickyMetas;
private int ourMetaState = 0;
@@ -234,6 +237,10 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
return true;
}
}
+ if (keyCode == KEYCODE_CTRL_LEFT || keyCode == KEYCODE_CTRL_RIGHT) {
+ metaPress(OUR_CTRL_ON);
+ return true;
+ }
}
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
@@ -258,7 +265,7 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
sendEscape();
ourMetaState &= ~OUR_CTRL_ON;
} else
- metaPress(OUR_CTRL_ON);
+ metaPress(OUR_CTRL_ON, true);
}
bridge.redraw();
return true;
@@ -497,17 +504,25 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
*
* @param code
*/
- public void metaPress(int code) {
+ public void metaPress(int code, boolean forceSticky) {
if ((ourMetaState & (code << 1)) != 0) {
ourMetaState &= ~(code << 1);
} else if ((ourMetaState & code) != 0) {
ourMetaState &= ~code;
ourMetaState |= code << 1;
- } else
+ } else if (forceSticky || (stickyMetas & code) != 0) {
ourMetaState |= code;
+ } else {
+ // skip redraw
+ return;
+ }
bridge.redraw();
}
+ public void metaPress(int code) {
+ metaPress(code, false);
+ }
+
public void setTerminalKeyMode(String keymode) {
this.keymode = keymode;
}
@@ -542,7 +557,8 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
if (PreferenceConstants.KEYMODE.equals(key) ||
PreferenceConstants.SHIFT_FKEYS.equals(key) ||
PreferenceConstants.CTRL_FKEYS.equals(key) ||
- PreferenceConstants.VOLUME_FONT.equals(key)) {
+ PreferenceConstants.VOLUME_FONT.equals(key) ||
+ PreferenceConstants.STICKY_MODIFIERS.equals(key)) {
updatePrefs();
}
}
@@ -554,6 +570,15 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
controlNumbersAreFKeysOnSoftKeyboard =
prefs.getBoolean(PreferenceConstants.CTRL_FKEYS, false);
volumeKeysChangeFontSize = prefs.getBoolean(PreferenceConstants.VOLUME_FONT, true);
+ String stickyModifiers = prefs.getString(PreferenceConstants.STICKY_MODIFIERS,
+ PreferenceConstants.NO);
+ if (PreferenceConstants.ALT.equals(stickyModifiers)) {
+ stickyMetas = OUR_ALT_ON;
+ } else if (PreferenceConstants.YES.equals(stickyModifiers)) {
+ stickyMetas = OUR_SHIFT_ON | OUR_CTRL_ON | OUR_ALT_ON;
+ } else {
+ stickyMetas = 0;
+ }
}
public void setCharset(String encoding) {
diff --git a/src/org/connectbot/util/PreferenceConstants.java b/src/org/connectbot/util/PreferenceConstants.java
index ade1b35..ab5e4a9 100644
--- a/src/org/connectbot/util/PreferenceConstants.java
+++ b/src/org/connectbot/util/PreferenceConstants.java
@@ -80,6 +80,10 @@ public class PreferenceConstants {
public static final String SHIFT_FKEYS = "shiftfkeys";
public static final String CTRL_FKEYS = "ctrlfkeys";
public static final String VOLUME_FONT = "volumefont";
+ public static final String STICKY_MODIFIERS = "stickymodifiers";
+ public static final String YES = "yes";
+ public static final String NO = "no";
+ public static final String ALT = "alt";
/* Backup identifiers */
public static final String BACKUP_PREF_KEY = "prefs";