diff options
-rw-r--r-- | res/values/arrays.xml | 12 | ||||
-rw-r--r-- | res/values/strings.xml | 7 | ||||
-rw-r--r-- | res/xml/preferences.xml | 9 | ||||
-rw-r--r-- | src/org/connectbot/ConsoleActivity.java | 2 | ||||
-rw-r--r-- | src/org/connectbot/HostListActivity.java | 5 | ||||
-rw-r--r-- | src/org/connectbot/service/TerminalKeyListener.java | 33 | ||||
-rw-r--r-- | src/org/connectbot/util/PreferenceConstants.java | 4 |
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"; |