diff --git a/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java b/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java index 611e8ce2..6d49e9cc 100644 --- a/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java +++ b/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java @@ -60,6 +60,8 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase { private boolean mShowSoftKeyboardIgnoreOnce; private boolean mShowSoftKeyboardWithDelayOnce; + private boolean mTerminalCursorBlinkerStateAlreadySet; + private static final String LOG_TAG = "TermuxTerminalViewClient"; public TermuxTerminalViewClient(TermuxActivity activity, TermuxTerminalSessionClient termuxTerminalSessionClient) { @@ -95,8 +97,7 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase { // Show the soft keyboard if required setSoftKeyboardState(true, false); - // Start terminal cursor blinking if enabled - setTerminalCursorBlinkerState(true); + mTerminalCursorBlinkerStateAlreadySet = false; } /** @@ -118,6 +119,23 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase { setTerminalCursorBlinkerState(true); } + /** + * Should be called when {@link com.termux.view.TerminalView#mEmulator} + */ + @Override + public void onEmulatorSet() { + if (!mTerminalCursorBlinkerStateAlreadySet) { + // Start terminal cursor blinking if enabled + // We need to wait for the first session to be attached that's set in + // TermuxActivity.onServiceConnected() and then the multiple calls to TerminalView.updateSize() + // where the final one eventually sets the mEmulator when width/height is not 0. Otherwise + // blinker will not start again if TermuxActivity is started again after exiting it with + // double back press. Check TerminalView.setTerminalCursorBlinkerState(). + setTerminalCursorBlinkerState(true); + mTerminalCursorBlinkerStateAlreadySet = true; + } + } + @Override 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 1fe8f0a9..1bd5adc5 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -322,6 +322,7 @@ public final class TerminalEmulator { public void updateTerminalSessionClient(TerminalSessionClient client) { mClient = client; setCursorStyle(); + setCursorBlinkState(true); } public TerminalBuffer getScreen() { 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 5f72bbee..84756fed 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -755,6 +755,7 @@ public final class TerminalView extends View { if (mEmulator == null || (newColumns != mEmulator.mColumns || newRows != mEmulator.mRows)) { mTermSession.updateSize(newColumns, newRows); mEmulator = mTermSession.getEmulator(); + mClient.onEmulatorSet(); mTopRow = 0; scrollTo(0, 0); @@ -880,7 +881,13 @@ public final class TerminalView extends View { * {@link #TERMINAL_CURSOR_BLINK_RATE_MIN} and {@link #TERMINAL_CURSOR_BLINK_RATE_MAX}. * * This should be called when the view holding this activity is resumed or stopped so that - * cursor blinker does not run when activity is not visible. + * cursor blinker does not run when activity is not visible. Ensure that {@link #mEmulator} + * is set when you call this to start cursor blinking by waiting for {@link TerminalViewClient#onEmulatorSet()} + * event after calling {@link #attachSession(TerminalSession)} for the first session added in the + * activity, otherwise blinking will not start. Do not call this directly after + * {@link #attachSession(TerminalSession)} since {@link #updateSize()} may return without + * setting {@link #mEmulator} since width/height may be 0. Its called again in + * {@link #onSizeChanged(int, int, int, int)}. * * It should also be called on the * {@link com.termux.terminal.TerminalSessionClient#onTerminalCursorStateChange(boolean)} diff --git a/terminal-view/src/main/java/com/termux/view/TerminalViewClient.java b/terminal-view/src/main/java/com/termux/view/TerminalViewClient.java index 3e454f9a..c1f9f94a 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalViewClient.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalViewClient.java @@ -56,6 +56,8 @@ public interface TerminalViewClient { boolean onCodePoint(int codePoint, boolean ctrlDown, TerminalSession session); + void onEmulatorSet(); + void logError(String tag, String message); diff --git a/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalViewClientBase.java b/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalViewClientBase.java index 701582ad..7f0648d8 100644 --- a/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalViewClientBase.java +++ b/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalViewClientBase.java @@ -67,6 +67,11 @@ public class TermuxTerminalViewClientBase implements TerminalViewClient { return false; } + @Override + public void onEmulatorSet() { + + } + @Override public void logError(String tag, String message) { Logger.logError(tag, message);