Skip to content

Commit 6611b48

Browse files
author
Workbench
committed
fixes: termux#4281 - Treat Caps Lock as Ctrl on physical keyboard
1 parent e987053 commit 6611b48

3 files changed

Lines changed: 27 additions & 1 deletion

File tree

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase {
6262
/** Keeping track of the special keys acting as Ctrl and Fn for the soft keyboard and other hardware keys. */
6363
boolean mVirtualControlKeyDown, mVirtualFnKeyDown;
6464

65+
/** Keeping track of whether Caps Lock is being treated as Ctrl (physical keyboard remap). */
66+
boolean mCapsLockAsCtrl;
67+
6568
private Runnable mShowSoftKeyboardRunnable;
6669

6770
private boolean mShowSoftKeyboardIgnoreOnce;
@@ -322,7 +325,12 @@ private boolean handleVirtualKeys(int keyCode, KeyEvent event, boolean down) {
322325

323326
@Override
324327
public boolean readControlKey() {
325-
return readExtraKeysSpecialButton(SpecialButton.CTRL) || mVirtualControlKeyDown;
328+
return readExtraKeysSpecialButton(SpecialButton.CTRL) || mVirtualControlKeyDown || mCapsLockAsCtrl;
329+
}
330+
331+
@Override
332+
public void setCapsLockAsCtrl(boolean down) {
333+
mCapsLockAsCtrl = down;
326334
}
327335

328336
@Override

terminal-view/src/main/java/com/termux/view/TerminalView.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,18 @@ public boolean onKeyDown(int keyCode, KeyEvent event) {
784784
return true;
785785
} else if (keyCode == KeyEvent.KEYCODE_LANGUAGE_SWITCH) {
786786
return super.onKeyDown(keyCode, event);
787+
} else if (keyCode == KeyEvent.KEYCODE_ZENKAKU_HANKAKU ||
788+
keyCode == KeyEvent.KEYCODE_HENKAN ||
789+
keyCode == KeyEvent.KEYCODE_MUHENKAN ||
790+
keyCode == KeyEvent.KEYCODE_YEN ||
791+
keyCode == KeyEvent.KEYCODE_RO) {
792+
return super.onKeyDown(keyCode, event);
793+
} else if (keyCode == KeyEvent.KEYCODE_CAPS_LOCK) {
794+
// Treat Caps Lock as Ctrl for physical keyboards where Caps Lock is
795+
// remapped to Ctrl at the Android system level. Toggle virtual Ctrl state
796+
// on key down and consume the event so it does not toggle Caps Lock LED.
797+
mClient.setCapsLockAsCtrl(event.getAction() == KeyEvent.ACTION_DOWN);
798+
return true;
787799
}
788800

789801
final int metaState = event.getMetaState();
@@ -971,6 +983,10 @@ public boolean onKeyUp(int keyCode, KeyEvent event) {
971983
invalidate();
972984
return true;
973985
} else if (event.isSystem()) {
986+
if (keyCode == KeyEvent.KEYCODE_CAPS_LOCK) {
987+
// Reset the Caps Lock as Ctrl state on key up. (#4281)
988+
mClient.setCapsLockAsCtrl(false);
989+
}
974990
// Let system key events through.
975991
return super.onKeyUp(keyCode, event);
976992
}

terminal-view/src/main/java/com/termux/view/TerminalViewClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public interface TerminalViewClient {
5252

5353
boolean readControlKey();
5454

55+
void setCapsLockAsCtrl(boolean down);
56+
5557
boolean readAltKey();
5658

5759
boolean readShiftKey();

0 commit comments

Comments
 (0)