From 00e29bf16701955f37fd7856198d4d7a594ba8ed Mon Sep 17 00:00:00 2001 From: Rusty Bird Date: Thu, 3 Nov 2016 17:51:26 +0000 Subject: [PATCH 1/2] Add and use onSessionClosingItself() callback Scripts can send themselves the SIGHUP signal ("Hangup"), e.g. using "kill -HUP $$", to indicate that they want to close the session without waiting for the user to press Return. Fixes #56 --- app/src/main/java/com/termux/app/TermuxActivity.java | 6 +++++- app/src/main/java/com/termux/app/TermuxService.java | 6 ++++++ .../java/com/termux/terminal/TerminalSession.java | 12 ++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 7490d62c30..fc57ceabbf 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -392,6 +392,11 @@ public void onSessionFinished(final TerminalSession finishedSession) { mListViewAdapter.notifyDataSetChanged(); } + @Override + public void onSessionClosingItself(TerminalSession session) { + removeFinishedSession(session); + } + @Override public void onClipboardText(TerminalSession session, String text) { if (!mIsVisible) return; @@ -855,7 +860,6 @@ void showToast(String text, boolean longDuration) { } public void removeFinishedSession(TerminalSession finishedSession) { - // Return pressed with finished session - remove it. TermuxService service = mTermService; int index = service.removeTermSession(finishedSession); diff --git a/app/src/main/java/com/termux/app/TermuxService.java b/app/src/main/java/com/termux/app/TermuxService.java index f7489351fe..73743b3409 100644 --- a/app/src/main/java/com/termux/app/TermuxService.java +++ b/app/src/main/java/com/termux/app/TermuxService.java @@ -322,6 +322,12 @@ public void onSessionFinished(final TerminalSession finishedSession) { mSessionChangeCallback.onSessionFinished(finishedSession); } + @Override + public void onSessionClosingItself(TerminalSession session) { + if (mSessionChangeCallback != null) + mSessionChangeCallback.onSessionClosingItself(session); + } + @Override public void onTextChanged(TerminalSession changedSession) { if (mSessionChangeCallback != null) mSessionChangeCallback.onTextChanged(changedSession); diff --git a/app/src/main/java/com/termux/terminal/TerminalSession.java b/app/src/main/java/com/termux/terminal/TerminalSession.java index 2eb446a062..97a0a2a198 100644 --- a/app/src/main/java/com/termux/terminal/TerminalSession.java +++ b/app/src/main/java/com/termux/terminal/TerminalSession.java @@ -38,6 +38,8 @@ public interface SessionChangedCallback { void onSessionFinished(TerminalSession finishedSession); + void onSessionClosingItself(TerminalSession session); + void onClipboardText(TerminalSession session, String text); void onBell(TerminalSession session); @@ -120,6 +122,16 @@ public void handleMessage(Message msg) { cleanupResources(exitCode); mChangeCallback.onSessionFinished(TerminalSession.this); + if (exitCode == -1 || exitCode == 129) { + // Process terminated with SIGHUP (signal 1), or exited with + // status 128+1 (= shell's last child terminated with SIGHUP). + // Scripts can use this to indicate that they want to close + // the session without waiting for the user to press Return. + + mChangeCallback.onSessionClosingItself(TerminalSession.this); + return; + } + String exitDescription = "\r\n[Process completed"; if (exitCode > 0) { // Non-zero process exit. From a92bda3c835c1a2d034aeebe410a497c49d95405 Mon Sep 17 00:00:00 2001 From: Rusty Bird Date: Thu, 3 Nov 2016 17:51:26 +0000 Subject: [PATCH 2/2] Simplify removeFinishedSession() --- .../main/java/com/termux/app/TermuxActivity.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index fc57ceabbf..3f4150eda0 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -73,6 +73,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; +import java.util.List; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -860,19 +861,14 @@ void showToast(String text, boolean longDuration) { } public void removeFinishedSession(TerminalSession finishedSession) { - TermuxService service = mTermService; + int index = mTermService.removeTermSession(finishedSession); + List remainingSessions = mTermService.getSessions(); - int index = service.removeTermSession(finishedSession); mListViewAdapter.notifyDataSetChanged(); - if (mTermService.getSessions().isEmpty()) { - // There are no sessions to show, so finish the activity. + if (remainingSessions.isEmpty()) finish(); - } else { - if (index >= service.getSessions().size()) { - index = service.getSessions().size() - 1; - } - switchToSession(service.getSessions().get(index)); - } + else + switchToSession(remainingSessions.get(Math.min(index, remainingSessions.size() - 1))); } }