diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index e4bf079ce6..254f15f955 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -585,7 +585,15 @@ void addNewSession(boolean failSafe, String sessionName) { } } String executablePath = (failSafe ? "/system/bin/sh" : null); - TerminalSession newSession = mTermService.createTermSession(executablePath, null, null, failSafe); + String workingDirectory = null; + if (mSettings.mUseCurrentSessionCwd) { + final TerminalSession currentSession = getCurrentTermSession(); + if (currentSession != null) { + workingDirectory = currentSession.getCwd(); + } + } + + TerminalSession newSession = mTermService.createTermSession(executablePath, null, workingDirectory, failSafe); if (sessionName != null) { newSession.mSessionName = sessionName; } diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 2dd165251c..7a49c62a8c 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -67,6 +67,8 @@ final static class KeyboardShortcut { boolean mBackIsEscape; boolean mShowExtraKeys; + boolean mUseCurrentSessionCwd; + String[][] mExtraKeys; final List shortcuts = new ArrayList<>(); @@ -192,6 +194,8 @@ void reloadFromProperties(Context context) { mBackIsEscape = "escape".equals(props.getProperty("back-key", "back")); + mUseCurrentSessionCwd = "current".equals(props.getProperty("session.cwd-on-create", "default")); + shortcuts.clear(); parseAction("shortcut.create-session", SHORTCUT_ACTION_CREATE_SESSION, props); parseAction("shortcut.next-session", SHORTCUT_ACTION_NEXT_SESSION, props); diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java index 5b82b0f98c..53d013267f 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java @@ -8,6 +8,7 @@ import android.system.OsConstants; import android.util.Log; +import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -166,6 +167,25 @@ public String getTitle() { return (mEmulator == null) ? null : mEmulator.getTitle(); } + /** Returns the shell's working directory or null if it was unavailable. */ + public String getCwd() { + if (mShellPid < 1) + return null; + try { + final String cwdSymlink = String.format("/proc/%s/cwd/", mShellPid); + String outputPath = new File(cwdSymlink) + .getCanonicalPath(); + if (!outputPath.endsWith("/")) + outputPath += '/'; + + if (!cwdSymlink.equals(outputPath)) + return outputPath; + } catch (IOException | SecurityException e) { + // Ignore. + } + return null; + } + /** * Set the terminal emulator's window size and start terminal emulation. *