diff options
| author | Torne Wuff <torne@wolfpuppy.org.uk> | 2015-03-21 23:40:13 +0000 | 
|---|---|---|
| committer | Torne Wuff <torne@wolfpuppy.org.uk> | 2015-03-21 23:44:08 +0000 | 
| commit | e7334fb51553251cc365c9a17f0c4c49af959a1d (patch) | |
| tree | c89273b310de4f0edd01af0dc54a9a461fa92d03 | |
| parent | cf1a6e3000a7344c6cc1a3f14ac387aa2292c10f (diff) | |
| download | connectbot-e7334fb51553251cc365c9a17f0c4c49af959a1d.tar.gz connectbot-e7334fb51553251cc365c9a17f0c4c49af959a1d.tar.bz2 connectbot-e7334fb51553251cc365c9a17f0c4c49af959a1d.zip | |
Make sticky modifiers an option, off by default.
Users with near-full-size keyboards (tablet docks/cases, or usb/bluetooth
keyboards) probably don't want sticky modifier keys. Make it an option
that's off by default (except on the Dream where it's likely desirable).
Also, include a third state to make only "alt" sticky, for the benefit of
the crazy keyboard driver on the TF101/201 that doesn't emit real key
events for alt+key pressed together.
Also, implement stickiness for the control key on physical keyboards that
have one, for consistency.
| -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"; | 
