diff --git a/app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionClient.java b/app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionClient.java index e80290d5..f023dd73 100644 --- a/app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionClient.java +++ b/app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionClient.java @@ -162,13 +162,25 @@ public class TermuxTerminalSessionClient extends TermuxTerminalSessionClientBase } @Override - public void onClipboardText(TerminalSession session, String text) { + public void onCopyTextToClipboard(TerminalSession session, String text) { if (!mActivity.isVisible()) return; ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setPrimaryClip(new ClipData(null, new String[]{"text/plain"}, new ClipData.Item(text))); } + @Override + public void onPasteTextFromClipboard(TerminalSession session) { + if (!mActivity.isVisible()) return; + + ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = clipboard.getPrimaryClip(); + if (clipData != null) { + CharSequence paste = clipData.getItemAt(0).coerceToText(mActivity); + if (!TextUtils.isEmpty(paste)) mActivity.getTerminalView().mEmulator.paste(paste.toString()); + } + } + @Override public void onBell(TerminalSession session) { if (!mActivity.isVisible()) return; diff --git a/app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java b/app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java index 5e7adfb8..dc306852 100644 --- a/app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java +++ b/app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java @@ -45,6 +45,7 @@ public class TerminalToolbarViewPager { layout = inflater.inflate(R.layout.view_terminal_toolbar_extra_keys, collection, false); ExtraKeysView extraKeysView = (ExtraKeysView) layout; extraKeysView.setTermuxTerminalViewClient(mActivity.getTermuxTerminalViewClient()); + extraKeysView.setTermuxTerminalSessionClient(mActivity.getTermuxTerminalSessionClient()); mActivity.setExtraKeysView(extraKeysView); extraKeysView.reload(mActivity.getProperties().getExtraKeysInfo()); diff --git a/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysInfo.java b/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysInfo.java index 98cc6afc..61f56b29 100644 --- a/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysInfo.java +++ b/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysInfo.java @@ -116,6 +116,8 @@ public class ExtraKeysInfo { put("DEL", "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand 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+2328 ⌨ KEYBOARD not well known but easy to understand + put("PASTE", "⎘"); // U+2328 ⌨ KEYBOARD not well known but easy to understand }}; static final CharDisplayMap lessKnownCharactersDisplay = new CharDisplayMap() {{ diff --git a/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysView.java b/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysView.java index 66f3008b..79aceaa1 100644 --- a/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysView.java @@ -28,6 +28,7 @@ import android.widget.GridLayout; import android.widget.PopupWindow; import com.termux.R; +import com.termux.app.terminal.TermuxTerminalSessionClient; import com.termux.app.terminal.TermuxTerminalViewClient; import com.termux.view.TerminalView; @@ -45,6 +46,7 @@ public final class ExtraKeysView extends GridLayout { private static final int BUTTON_PRESSED_COLOR = 0xFF7F7F7F; TermuxTerminalViewClient mTermuxTerminalViewClient; + TermuxTerminalSessionClient mTermuxTerminalSessionClient; public ExtraKeysView(Context context, AttributeSet attrs) { super(context, attrs); @@ -89,6 +91,9 @@ public final class ExtraKeysView extends GridLayout { } else if ("DRAWER".equals(keyName)) { DrawerLayout drawer = view.findViewById(R.id.drawer_layout); drawer.openDrawer(Gravity.LEFT); + } else if ("PASTE".equals(keyName)) { + if(mTermuxTerminalSessionClient != null) + mTermuxTerminalSessionClient.onPasteTextFromClipboard(null); } else if (keyCodesForString.containsKey(keyName)) { Integer keyCode = keyCodesForString.get(keyName); if (keyCode == null) return; @@ -389,4 +394,8 @@ public final class ExtraKeysView extends GridLayout { this.mTermuxTerminalViewClient = termuxTerminalViewClient; } + public void setTermuxTerminalSessionClient(TermuxTerminalSessionClient termuxTerminalSessionClient) { + this.mTermuxTerminalSessionClient = termuxTerminalSessionClient; + } + } 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 1bd5adc5..bf95aafd 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -1980,7 +1980,7 @@ public final class TerminalEmulator { int startIndex = textParameter.indexOf(";") + 1; try { String clipboardText = new String(Base64.decode(textParameter.substring(startIndex), 0), StandardCharsets.UTF_8); - mSession.clipboardText(clipboardText); + mSession.onCopyTextToClipboard(clipboardText); } catch (Exception e) { mClient.logError(LOG_TAG, "OSC Manipulate selection, invalid string '" + textParameter + ""); } diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalOutput.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalOutput.java index cec0282b..305082a5 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalOutput.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalOutput.java @@ -18,8 +18,11 @@ public abstract class TerminalOutput { /** Notify the terminal client that the terminal title has changed. */ public abstract void titleChanged(String oldTitle, String newTitle); - /** Notify the terminal client that the terminal title has changed. */ - public abstract void clipboardText(String text); + /** Notify the terminal client that text should be copied to clipboard. */ + public abstract void onCopyTextToClipboard(String text); + + /** Notify the terminal client that text should be pasted from clipboard. */ + public abstract void onPasteTextFromClipboard(); /** Notify the terminal client that a bell character (ASCII 7, bell, BEL, \a, ^G)) has been received. */ public abstract void onBell(); 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 37708279..47ea8533 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java @@ -269,8 +269,13 @@ public final class TerminalSession extends TerminalOutput { } @Override - public void clipboardText(String text) { - mClient.onClipboardText(this, text); + public void onCopyTextToClipboard(String text) { + mClient.onCopyTextToClipboard(this, text); + } + + @Override + public void onPasteTextFromClipboard() { + mClient.onPasteTextFromClipboard(this); } @Override diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalSessionClient.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalSessionClient.java index f8d83d06..0ffe8e43 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalSessionClient.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalSessionClient.java @@ -13,7 +13,9 @@ public interface TerminalSessionClient { void onSessionFinished(TerminalSession finishedSession); - void onClipboardText(TerminalSession session, String text); + void onCopyTextToClipboard(TerminalSession session, String text); + + void onPasteTextFromClipboard(TerminalSession session); void onBell(TerminalSession session); diff --git a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java index 9fc16857..eb1da8c0 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java @@ -37,10 +37,14 @@ public abstract class TerminalTestCase extends TestCase { } @Override - public void clipboardText(String text) { + public void onCopyTextToClipboard(String text) { clipboardPuts.add(text); } + @Override + public void onPasteTextFromClipboard() { + } + @Override public void onBell() { bellsRung++; diff --git a/terminal-view/src/main/java/com/termux/view/textselection/TextSelectionCursorController.java b/terminal-view/src/main/java/com/termux/view/textselection/TextSelectionCursorController.java index 8ff36b7f..954bf84c 100644 --- a/terminal-view/src/main/java/com/termux/view/textselection/TextSelectionCursorController.java +++ b/terminal-view/src/main/java/com/termux/view/textselection/TextSelectionCursorController.java @@ -138,17 +138,12 @@ public class TextSelectionCursorController implements CursorController { switch (item.getItemId()) { case ACTION_COPY: String selectedText = terminalView.mEmulator.getSelectedText(mSelX1, mSelY1, mSelX2, mSelY2).trim(); - terminalView.mTermSession.clipboardText(selectedText); + terminalView.mTermSession.onCopyTextToClipboard(selectedText); terminalView.stopTextSelectionMode(); break; case ACTION_PASTE: terminalView.stopTextSelectionMode(); - ClipboardManager clipboard = (ClipboardManager) terminalView.getContext().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clipData = clipboard.getPrimaryClip(); - if (clipData != null) { - CharSequence paste = clipData.getItemAt(0).coerceToText(terminalView.getContext()); - if (!TextUtils.isEmpty(paste)) terminalView.mEmulator.paste(paste.toString()); - } + terminalView.mTermSession.onPasteTextFromClipboard(); break; case ACTION_MORE: terminalView.stopTextSelectionMode(); //we stop text selection first, otherwise handles will show above popup diff --git a/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalSessionClientBase.java b/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalSessionClientBase.java index 6df69a72..df6eb5fe 100644 --- a/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalSessionClientBase.java +++ b/termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalSessionClientBase.java @@ -22,7 +22,11 @@ public class TermuxTerminalSessionClientBase implements TerminalSessionClient { } @Override - public void onClipboardText(TerminalSession session, String text) { + public void onCopyTextToClipboard(TerminalSession session, String text) { + } + + @Override + public void onPasteTextFromClipboard(TerminalSession session) { } @Override