From 5fc2b4cd4ae59a7cbfccea60c76019e96efb847c Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Sat, 18 Jun 2022 06:58:44 +0500 Subject: [PATCH] Added: Add `SCROLL` extra key to toggle auto scrolling of terminal to bottom on terminal text updates and termux activity return The toggle will apply to each terminal session separately. Closes #2535 --- .../app/terminal/io/TermuxTerminalExtraKeys.java | 4 ++++ .../com/termux/terminal/TerminalEmulator.java | 12 ++++++++++++ .../main/java/com/termux/view/TerminalView.java | 16 +++++++++++++--- .../termux/extrakeys/ExtraKeysConstants.java | 1 + 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java b/app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java index bcb70655..a38e8cbb 100644 --- a/app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java +++ b/app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java @@ -96,6 +96,10 @@ public class TermuxTerminalExtraKeys extends TerminalExtraKeys { } else if ("PASTE".equals(key)) { if(mTermuxTerminalSessionActivityClient != null) mTermuxTerminalSessionActivityClient.onPasteTextFromClipboard(null); + } else if ("SCROLL".equals(key)) { + TerminalView terminalView = mTermuxTerminalViewClient.getActivity().getTerminalView(); + if (terminalView != null && terminalView.mEmulator != null) + terminalView.mEmulator.toggleAutoScrollDisabled(); } else { super.onTerminalExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); } diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java index 127ef6d9..aeef393c 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -252,6 +252,9 @@ public final class TerminalEmulator { */ private int mScrollCounter = 0; + /** If automatic scrolling of terminal is disabled */ + private boolean mAutoScrollDisabled; + private byte mUtf8ToFollow, mUtf8Index; private final byte[] mUtf8InputBuffer = new byte[4]; private int mLastEmittedCodePoint = -1; @@ -2412,6 +2415,15 @@ public final class TerminalEmulator { mScrollCounter = 0; } + public boolean isAutoScrollDisabled() { + return mAutoScrollDisabled; + } + + public void toggleAutoScrollDisabled() { + mAutoScrollDisabled = !mAutoScrollDisabled; + } + + /** Reset terminal state so user can interact with it regardless of present state. */ public void reset() { setCursorStyle(); diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 2bed7cab..b96b0426 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -409,19 +409,29 @@ public final class TerminalView extends View { } public void onScreenUpdated() { + onScreenUpdated(false); + } + + public void onScreenUpdated(boolean skipScrolling) { if (mEmulator == null) return; int rowsInHistory = mEmulator.getScreen().getActiveTranscriptRows(); if (mTopRow < -rowsInHistory) mTopRow = -rowsInHistory; - boolean skipScrolling = false; - if (isSelectingText()) { + if (isSelectingText() || mEmulator.isAutoScrollDisabled()) { + // Do not scroll when selecting text. int rowShift = mEmulator.getScrollCounter(); if (-mTopRow + rowShift > rowsInHistory) { // .. unless we're hitting the end of history transcript, in which // case we abort text selection and scroll to end. - stopTextSelectionMode(); + if (isSelectingText()) + stopTextSelectionMode(); + + if (mEmulator.isAutoScrollDisabled()) { + mTopRow = -rowsInHistory; + skipScrolling = true; + } } else { skipScrolling = true; mTopRow -= rowShift; diff --git a/termux-shared/src/main/java/com/termux/shared/termux/extrakeys/ExtraKeysConstants.java b/termux-shared/src/main/java/com/termux/shared/termux/extrakeys/ExtraKeysConstants.java index f67a127a..e625db5c 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/extrakeys/ExtraKeysConstants.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/extrakeys/ExtraKeysConstants.java @@ -90,6 +90,7 @@ public class ExtraKeysConstants { put("DRAWER", "☰"); // U+2630 ☰ TRIGRAM FOR HEAVEN not well known but easy to understand put("KEYBOARD", "⌨"); // U+2328 ⌨ KEYBOARD not well known but easy to understand put("PASTE", "⎘"); // U+2398 + put("SCROLL", "⇳"); // U+21F3 }}; public static final ExtraKeyDisplayMap LESS_KNOWN_CHARACTERS_DISPLAY = new ExtraKeyDisplayMap() {{