Skip to content

Commit 08b5812

Browse files
Added!: Convert extra-keys to agnosticism
The termux `extra-keys` have been moved to `termux-shared` library so that they can be imported and used by other apps for their own needs as long as they comply with GPLv3 license. Almost everything is customizable and has no dependency on termux specific logic. Check the javadocs of files of `com.termux.shared.terminal.io.extrakeys` package for more info, specially, `ExtraKeysView`, `ExtraKeysInfo`, `ExtraKeyButton`, `TerminalExtraKeys` and `TermuxTerminalExtraKeys`. Moreover, you can now long hold on `CTRL`, `ALT`, `SHIFT` and `FN` to lock those control keys. They will not be released when you press another key and will only be released by pressing the respective control key again. Closes termux#2049, Closes termux#1861
1 parent 3f85336 commit 08b5812

16 files changed

+1470
-764
lines changed

app/src/main/java/com/termux/app/TermuxActivity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
import com.termux.app.terminal.io.TerminalToolbarViewPager;
4545
import com.termux.app.terminal.TermuxTerminalSessionClient;
4646
import com.termux.app.terminal.TermuxTerminalViewClient;
47-
import com.termux.app.terminal.io.extrakeys.ExtraKeysView;
47+
import com.termux.shared.terminal.io.extrakeys.ExtraKeysView;
4848
import com.termux.app.settings.properties.TermuxAppSharedProperties;
4949
import com.termux.shared.interact.TextInputDialogUtils;
5050
import com.termux.shared.logger.Logger;

app/src/main/java/com/termux/app/settings/properties/TermuxAppSharedProperties.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import android.content.Context;
44

55
import com.termux.app.terminal.io.KeyboardShortcut;
6-
import com.termux.app.terminal.io.extrakeys.ExtraKeysInfo;
6+
import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants;
7+
import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants.EXTRA_KEY_DISPLAY_MAPS;
8+
import com.termux.shared.terminal.io.extrakeys.ExtraKeysInfo;
79
import com.termux.shared.logger.Logger;
810
import com.termux.shared.settings.properties.TermuxPropertyConstants;
911
import com.termux.shared.settings.properties.TermuxSharedProperties;
@@ -50,13 +52,20 @@ private void setExtraKeys() {
5052
// {@link #getExtraKeysStyleInternalPropertyValueFromValue(String)}
5153
String extrakeys = (String) getInternalPropertyValue(TermuxPropertyConstants.KEY_EXTRA_KEYS, true);
5254
String extraKeysStyle = (String) getInternalPropertyValue(TermuxPropertyConstants.KEY_EXTRA_KEYS_STYLE, true);
53-
mExtraKeysInfo = new ExtraKeysInfo(extrakeys, extraKeysStyle);
55+
56+
ExtraKeysConstants.ExtraKeyDisplayMap extraKeyDisplayMap = ExtraKeysInfo.getCharDisplayMapForStyle(extraKeysStyle);
57+
if (EXTRA_KEY_DISPLAY_MAPS.DEFAULT_CHAR_DISPLAY.equals(extraKeyDisplayMap) && !TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE.equals(extraKeysStyle)) {
58+
Logger.logError(TermuxSharedProperties.LOG_TAG, "The style \"" + extraKeysStyle + "\" for the key \"" + TermuxPropertyConstants.KEY_EXTRA_KEYS_STYLE + "\" is invalid. Using default style instead.");
59+
extraKeysStyle = TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE;
60+
}
61+
62+
mExtraKeysInfo = new ExtraKeysInfo(extrakeys, extraKeysStyle, ExtraKeysConstants.CONTROL_CHARS_ALIASES);
5463
} catch (JSONException e) {
5564
Logger.showToast(mContext, "Could not load and set the \"" + TermuxPropertyConstants.KEY_EXTRA_KEYS + "\" property from the properties file: " + e.toString(), true);
5665
Logger.logStackTraceWithMessage(LOG_TAG, "Could not load and set the \"" + TermuxPropertyConstants.KEY_EXTRA_KEYS + "\" property from the properties file: ", e);
5766

5867
try {
59-
mExtraKeysInfo = new ExtraKeysInfo(TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS, TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE);
68+
mExtraKeysInfo = new ExtraKeysInfo(TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS, TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE, ExtraKeysConstants.CONTROL_CHARS_ALIASES);
6069
} catch (JSONException e2) {
6170
Logger.showToast(mContext, "Can't create default extra keys",true);
6271
Logger.logStackTraceWithMessage(LOG_TAG, "Could create default extra keys: ", e);

app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@
2727
import com.termux.shared.interact.MessageDialogUtils;
2828
import com.termux.shared.shell.ShellUtils;
2929
import com.termux.shared.terminal.TermuxTerminalViewClientBase;
30+
import com.termux.shared.terminal.io.extrakeys.SpecialButton;
3031
import com.termux.shared.termux.AndroidUtils;
3132
import com.termux.shared.termux.TermuxConstants;
3233
import com.termux.shared.activities.ReportActivity;
3334
import com.termux.shared.models.ReportInfo;
3435
import com.termux.app.models.UserAction;
3536
import com.termux.app.terminal.io.KeyboardShortcut;
36-
import com.termux.app.terminal.io.extrakeys.ExtraKeysView;
3737
import com.termux.shared.settings.properties.TermuxPropertyConstants;
3838
import com.termux.shared.data.DataUtils;
3939
import com.termux.shared.logger.Logger;
@@ -289,12 +289,22 @@ private boolean handleVirtualKeys(int keyCode, KeyEvent event, boolean down) {
289289

290290
@Override
291291
public boolean readControlKey() {
292-
return (mActivity.getExtraKeysView() != null && mActivity.getExtraKeysView().readSpecialButton(ExtraKeysView.SpecialButton.CTRL)) || mVirtualControlKeyDown;
292+
return readExtraKeysSpecialButton(SpecialButton.CTRL) || mVirtualControlKeyDown;
293293
}
294294

295295
@Override
296296
public boolean readAltKey() {
297-
return (mActivity.getExtraKeysView() != null && mActivity.getExtraKeysView().readSpecialButton(ExtraKeysView.SpecialButton.ALT));
297+
return readExtraKeysSpecialButton(SpecialButton.ALT);
298+
}
299+
300+
public boolean readExtraKeysSpecialButton(SpecialButton specialButton) {
301+
if (mActivity.getExtraKeysView() == null) return false;
302+
Boolean state = mActivity.getExtraKeysView().readSpecialButton(specialButton, true);
303+
if (state == null) {
304+
Logger.logError(LOG_TAG,"Failed to read an unregistered " + specialButton + " special button value from extra keys.");
305+
return false;
306+
}
307+
return state;
298308
}
299309

300310
@Override

app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import com.termux.R;
1313
import com.termux.app.TermuxActivity;
14-
import com.termux.app.terminal.io.extrakeys.ExtraKeysView;
14+
import com.termux.shared.terminal.io.extrakeys.ExtraKeysView;
1515
import com.termux.terminal.TerminalSession;
1616

1717
public class TerminalToolbarViewPager {
@@ -44,8 +44,8 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) {
4444
if (position == 0) {
4545
layout = inflater.inflate(R.layout.view_terminal_toolbar_extra_keys, collection, false);
4646
ExtraKeysView extraKeysView = (ExtraKeysView) layout;
47-
extraKeysView.setTermuxTerminalViewClient(mActivity.getTermuxTerminalViewClient());
48-
extraKeysView.setTermuxTerminalSessionClient(mActivity.getTermuxTerminalSessionClient());
47+
extraKeysView.setExtraKeysViewClient(new TermuxTerminalExtraKeys(mActivity.getTerminalView(),
48+
mActivity.getTermuxTerminalViewClient(), mActivity.getTermuxTerminalSessionClient()));
4949
mActivity.setExtraKeysView(extraKeysView);
5050
extraKeysView.reload(mActivity.getProperties().getExtraKeysInfo());
5151

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.termux.app.terminal.io;
2+
3+
import android.annotation.SuppressLint;
4+
import android.view.Gravity;
5+
import android.view.View;
6+
7+
import androidx.annotation.NonNull;
8+
import androidx.drawerlayout.widget.DrawerLayout;
9+
10+
import com.termux.R;
11+
import com.termux.app.terminal.TermuxTerminalSessionClient;
12+
import com.termux.app.terminal.TermuxTerminalViewClient;
13+
import com.termux.shared.terminal.io.TerminalExtraKeys;
14+
import com.termux.view.TerminalView;
15+
16+
public class TermuxTerminalExtraKeys extends TerminalExtraKeys {
17+
18+
19+
TermuxTerminalViewClient mTermuxTerminalViewClient;
20+
TermuxTerminalSessionClient mTermuxTerminalSessionClient;
21+
22+
public TermuxTerminalExtraKeys(@NonNull TerminalView terminalView,
23+
TermuxTerminalViewClient termuxTerminalViewClient,
24+
TermuxTerminalSessionClient termuxTerminalSessionClient) {
25+
super(terminalView);
26+
mTermuxTerminalViewClient = termuxTerminalViewClient;
27+
mTermuxTerminalSessionClient = termuxTerminalSessionClient;
28+
}
29+
30+
@SuppressLint("RtlHardcoded")
31+
@Override
32+
public void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrlDown, boolean altDown, boolean shiftDown, boolean fnDown) {
33+
if ("KEYBOARD".equals(key)) {
34+
if(mTermuxTerminalViewClient != null)
35+
mTermuxTerminalViewClient.onToggleSoftKeyboardRequest();
36+
} else if ("DRAWER".equals(key)) {
37+
DrawerLayout drawer = view.findViewById(R.id.drawer_layout);
38+
drawer.openDrawer(Gravity.LEFT);
39+
} else if ("PASTE".equals(key)) {
40+
if(mTermuxTerminalSessionClient != null)
41+
mTermuxTerminalSessionClient.onPasteTextFromClipboard(null);
42+
} else {
43+
super.onTerminalExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown);
44+
}
45+
}
46+
47+
}

app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeyButton.java

-92
This file was deleted.

0 commit comments

Comments
 (0)