From 0d0f218d52c4095cf0b52b2212522fe5500e8d79 Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 10 Jul 2026 15:54:51 +0000 Subject: [PATCH] Compact terminal input controls --- .../neatstudio/tmuxandroid/MainActivity.java | 161 +++++++++--------- 1 file changed, 82 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java b/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java index 831443f..324bfa1 100644 --- a/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java +++ b/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java @@ -66,7 +66,7 @@ public final class MainActivity extends Activity { private static final int MAX_TERMINAL_COLS = 140; private static final int MIN_TERMINAL_ROWS = 8; private static final int MAX_TERMINAL_ROWS = 80; - private static final int TERMINAL_KEYS_HEIGHT_DP = 92; + private static final int TERMINAL_KEYS_HEIGHT_DP = 54; private static final int STATUS_NORMAL = 0; private static final int STATUS_BUSY = 1; private static final int STATUS_SUCCESS = 2; @@ -2074,8 +2074,8 @@ public final class MainActivity extends Activity { inputField.setHintTextColor(COLOR_TEXT_DIM); inputField.setHint("type command or text"); inputField.setSingleLine(false); - inputField.setMinLines(1); - inputField.setMaxLines(2); + inputField.setMinLines(3); + inputField.setMaxLines(5); inputField.setCursorVisible(true); inputField.setFocusableInTouchMode(true); inputField.setGravity(Gravity.TOP | Gravity.START); @@ -2679,7 +2679,7 @@ public final class MainActivity extends Activity { private LinearLayout createAccessoryBar() { LinearLayout panel = new LinearLayout(this); panel.setOrientation(LinearLayout.VERTICAL); - panel.setPadding(dp(6), dp(4), dp(6), dp(4)); + panel.setPadding(dp(6), dp(3), dp(6), dp(3)); panel.setBackgroundColor(COLOR_PANEL); LinearLayout tabs = terminalKeyRow(); @@ -2690,26 +2690,25 @@ public final class MainActivity extends Activity { addAccessoryTab(tabs, "Sym", 3); panel.addView(tabs, new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - dp(24) + dp(18) )); - LinearLayout firstRow = terminalKeyRow(); - LinearLayout secondRow = terminalKeyRow(); - addAccessoryPageKeys(firstRow, secondRow); - LinearLayout.LayoutParams rowParams = new LinearLayout.LayoutParams( + HorizontalScrollView keyScroller = new HorizontalScrollView(this); + keyScroller.setHorizontalScrollBarEnabled(false); + keyScroller.setFillViewport(true); + LinearLayout keyRow = terminalKeyRow(); + addAccessoryPageKeys(keyRow); + keyScroller.addView(keyRow, new HorizontalScrollView.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.MATCH_PARENT + )); + LinearLayout.LayoutParams keyParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, 0, 1 ); - rowParams.topMargin = dp(3); - panel.addView(firstRow, rowParams); - LinearLayout.LayoutParams secondParams = new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - 0, - 1 - ); - secondParams.topMargin = dp(3); - panel.addView(secondRow, secondParams); + keyParams.topMargin = dp(2); + panel.addView(keyScroller, keyParams); return panel; } @@ -2720,64 +2719,64 @@ public final class MainActivity extends Activity { return row; } - private void addAccessoryPageKeys(LinearLayout firstRow, LinearLayout secondRow) { + private void addAccessoryPageKeys(LinearLayout row) { switch (terminalKeyPage) { case 1: - addSoftKey(firstRow, "Esc", "\u001b"); - addSoftKey(firstRow, "Tab", "\t"); - addSoftKey(firstRow, "C-c", "\u0003"); - addSoftKey(firstRow, "C-d", "\u0004"); - addSoftKey(firstRow, "C-z", "\u001a"); - addSoftKey(firstRow, "C-l", "\u000c"); - addSoftKey(secondRow, "C-r", "\u0012"); - addSoftKey(secondRow, "C-a", "\u0001"); - addSoftKey(secondRow, "C-e", "\u0005"); - addSoftKey(secondRow, "C-u", "\u0015"); - addSoftKey(secondRow, "C-k", "\u000b"); - addSoftKey(secondRow, "C-b", "\u0002"); + addSoftKey(row, "Esc", "\u001b"); + addSoftKey(row, "Tab", "\t"); + addSoftKey(row, "C-c", "\u0003"); + addSoftKey(row, "C-d", "\u0004"); + addSoftKey(row, "C-z", "\u001a"); + addSoftKey(row, "C-l", "\u000c"); + addSoftKey(row, "C-r", "\u0012"); + addSoftKey(row, "C-a", "\u0001"); + addSoftKey(row, "C-e", "\u0005"); + addSoftKey(row, "C-u", "\u0015"); + addSoftKey(row, "C-k", "\u000b"); + addSoftKey(row, "C-b", "\u0002"); break; case 2: - addSoftKey(firstRow, "←", "\u001b[D"); - addSoftKey(firstRow, "→", "\u001b[C"); - addSoftKey(firstRow, "↑", "\u001b[A"); - addSoftKey(firstRow, "↓", "\u001b[B"); - addSoftKey(firstRow, "Home", "\u001b[H"); - addSoftKey(firstRow, "End", "\u001b[F"); - addSoftKey(secondRow, "Pg↑", "\u001b[5~"); - addSoftKey(secondRow, "Pg↓", "\u001b[6~"); - addComposerButton(secondRow, "Prev", () -> setTerminalKeyPage(terminalKeyPage - 1)); - addComposerButton(secondRow, "Next", () -> setTerminalKeyPage(terminalKeyPage + 1)); - addSoftKey(secondRow, "Clear", "\u000c"); - addSoftKey(secondRow, "Detach", "\u0002d"); + addSoftKey(row, "←", "\u001b[D"); + addSoftKey(row, "→", "\u001b[C"); + addSoftKey(row, "↑", "\u001b[A"); + addSoftKey(row, "↓", "\u001b[B"); + addSoftKey(row, "Home", "\u001b[H"); + addSoftKey(row, "End", "\u001b[F"); + addSoftKey(row, "Pg↑", "\u001b[5~"); + addSoftKey(row, "Pg↓", "\u001b[6~"); + addComposerButton(row, "Prev", () -> setTerminalKeyPage(terminalKeyPage - 1)); + addComposerButton(row, "Next", () -> setTerminalKeyPage(terminalKeyPage + 1)); + addSoftKey(row, "Clear", "\u000c"); + addSoftKey(row, "Detach", "\u0002d"); break; case 3: - addTextKey(firstRow, "~", "~"); - addTextKey(firstRow, "/", "/"); - addTextKey(firstRow, "-", "-"); - addTextKey(firstRow, "_", "_"); - addTextKey(firstRow, ".", "."); - addTextKey(firstRow, "|", "|"); - addTextKey(secondRow, "&", "&"); - addTextKey(secondRow, ";", ";"); - addTextKey(secondRow, "$", "$"); - addTextKey(secondRow, "\"", "\""); - addTextKey(secondRow, "'", "'"); - addTextKey(secondRow, "Space", " "); + addTextKey(row, "~", "~"); + addTextKey(row, "/", "/"); + addTextKey(row, "-", "-"); + addTextKey(row, "_", "_"); + addTextKey(row, ".", "."); + addTextKey(row, "|", "|"); + addTextKey(row, "&", "&"); + addTextKey(row, ";", ";"); + addTextKey(row, "$", "$"); + addTextKey(row, "\"", "\""); + addTextKey(row, "'", "'"); + addTextKey(row, "Space", " "); break; case 0: default: - addComposerButton(firstRow, "←", () -> moveComposerCursor(-1)); - addComposerButton(firstRow, "→", () -> moveComposerCursor(1)); - addSoftKey(firstRow, "↑", "\u001b[A"); - addSoftKey(firstRow, "↓", "\u001b[B"); - addSoftKey(firstRow, "Esc", "\u001b"); - addSoftKey(firstRow, "Tab", "\t"); - addSoftKey(secondRow, "Enter", TERMINAL_ENTER); - addSoftButton(secondRow, "Paste", view -> pasteClipboard()); - addComposerButton(secondRow, "⌫", this::backspaceComposerText); - addTextKey(secondRow, "NL", "\n"); - addComposerButton(secondRow, "Bottom", this::scrollTerminalBottom); - addComposerButton(secondRow, "Select", () -> { + addComposerButton(row, "←", () -> moveComposerCursor(-1)); + addComposerButton(row, "→", () -> moveComposerCursor(1)); + addSoftKey(row, "↑", "\u001b[A"); + addSoftKey(row, "↓", "\u001b[B"); + addSoftKey(row, "Esc", "\u001b"); + addSoftKey(row, "Tab", "\t"); + addSoftKey(row, "Enter", TERMINAL_ENTER); + addSoftButton(row, "Paste", view -> pasteClipboard()); + addComposerButton(row, "⌫", this::backspaceComposerText); + addTextKey(row, "NL", "\n"); + addComposerButton(row, "Bottom", this::scrollTerminalBottom); + addComposerButton(row, "Select", () -> { terminalSelectionEnabled = !terminalSelectionEnabled; if (terminalText != null) { terminalText.setTextIsSelectable(terminalSelectionEnabled); @@ -3225,6 +3224,8 @@ public final class MainActivity extends Activity { button.setPadding(dp(5), 0, dp(5), 0); button.setMinWidth(0); button.setMinimumWidth(0); + button.setMinHeight(0); + button.setMinimumHeight(0); return button; } @@ -3249,7 +3250,6 @@ public final class MainActivity extends Activity { input.setTextColor(COLOR_TEXT); input.setHintTextColor(COLOR_TEXT_DIM); input.setTextSize(13); - input.setMinHeight(dp(38)); input.setPadding(dp(8), dp(5), dp(8), dp(5)); input.setBackground(inputBackground()); } @@ -3308,37 +3308,40 @@ public final class MainActivity extends Activity { private void addSoftButton(LinearLayout row, String label, View.OnClickListener listener) { Button button = toolbarButton(label, listener); - button.setTextSize(isArrowLabel(label) ? 15 : 9); - button.setPadding(dp(2), 0, dp(2), 0); + button.setTextSize(isArrowLabel(label) ? 14 : 9); + button.setPadding(dp(5), 0, dp(5), 0); button.setMinWidth(0); button.setMinimumWidth(0); + button.setMinHeight(0); + button.setMinimumHeight(0); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( - 0, + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT, - 1 + 0 ); - params.leftMargin = dp(2); - params.rightMargin = dp(2); + params.leftMargin = dp(1); + params.rightMargin = dp(1); row.addView(button, params); } private void addAccessoryTab(LinearLayout row, String label, int page) { Button button = toolbarButton(label, view -> setTerminalKeyPage(page)); boolean selected = terminalKeyPage == page; - button.setTextSize(9); - button.setPadding(dp(2), 0, dp(2), 0); + button.setTextSize(8); + button.setPadding(dp(7), 0, dp(7), 0); button.setMinWidth(0); button.setMinimumWidth(0); + button.setMinHeight(0); + button.setMinimumHeight(0); button.setTextColor(selected ? Color.rgb(14, 38, 24) : COLOR_TEXT_MUTED); button.setBackground(selected ? rounded(COLOR_ACCENT, 7, COLOR_ACCENT, 1) : rounded(COLOR_CARD_ALT, 7, COLOR_BORDER_SOFT, 1)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( - 0, + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT, - 1 + 0 ); - params.leftMargin = dp(2); params.rightMargin = dp(2); row.addView(button, params); }