Skip to content

Commit 7d76e8b

Browse files
Add PASTE extra key for pasting text from clipboard
1 parent 00d80b9 commit 7d76e8b

File tree

11 files changed

+53
-16
lines changed

11 files changed

+53
-16
lines changed

app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionClient.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,13 +162,25 @@ public void onSessionFinished(final TerminalSession finishedSession) {
162162
}
163163

164164
@Override
165-
public void onClipboardText(TerminalSession session, String text) {
165+
public void onCopyTextToClipboard(TerminalSession session, String text) {
166166
if (!mActivity.isVisible()) return;
167167

168168
ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
169169
clipboard.setPrimaryClip(new ClipData(null, new String[]{"text/plain"}, new ClipData.Item(text)));
170170
}
171171

172+
@Override
173+
public void onPasteTextFromClipboard(TerminalSession session) {
174+
if (!mActivity.isVisible()) return;
175+
176+
ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
177+
ClipData clipData = clipboard.getPrimaryClip();
178+
if (clipData != null) {
179+
CharSequence paste = clipData.getItemAt(0).coerceToText(mActivity);
180+
if (!TextUtils.isEmpty(paste)) mActivity.getTerminalView().mEmulator.paste(paste.toString());
181+
}
182+
}
183+
172184
@Override
173185
public void onBell(TerminalSession session) {
174186
if (!mActivity.isVisible()) return;

app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) {
4545
layout = inflater.inflate(R.layout.view_terminal_toolbar_extra_keys, collection, false);
4646
ExtraKeysView extraKeysView = (ExtraKeysView) layout;
4747
extraKeysView.setTermuxTerminalViewClient(mActivity.getTermuxTerminalViewClient());
48+
extraKeysView.setTermuxTerminalSessionClient(mActivity.getTermuxTerminalSessionClient());
4849
mActivity.setExtraKeysView(extraKeysView);
4950
extraKeysView.reload(mActivity.getProperties().getExtraKeysInfo());
5051

app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysInfo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ static class CharDisplayMap extends CleverMap<String, String> {}
116116
put("DEL", "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand
117117
put("DRAWER", "☰"); // U+2630 ☰ TRIGRAM FOR HEAVEN not well known but easy to understand
118118
put("KEYBOARD", "⌨"); // U+2328 ⌨ KEYBOARD not well known but easy to understand
119+
//put("PASTE", "📋"); // U+2328 ⌨ KEYBOARD not well known but easy to understand
120+
put("PASTE", "⎘"); // U+2328 ⌨ KEYBOARD not well known but easy to understand
119121
}};
120122

121123
static final CharDisplayMap lessKnownCharactersDisplay = new CharDisplayMap() {{

app/src/main/java/com/termux/app/terminal/io/extrakeys/ExtraKeysView.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import android.widget.PopupWindow;
2929

3030
import com.termux.R;
31+
import com.termux.app.terminal.TermuxTerminalSessionClient;
3132
import com.termux.app.terminal.TermuxTerminalViewClient;
3233
import com.termux.view.TerminalView;
3334

@@ -45,6 +46,7 @@ public final class ExtraKeysView extends GridLayout {
4546
private static final int BUTTON_PRESSED_COLOR = 0xFF7F7F7F;
4647

4748
TermuxTerminalViewClient mTermuxTerminalViewClient;
49+
TermuxTerminalSessionClient mTermuxTerminalSessionClient;
4850

4951
public ExtraKeysView(Context context, AttributeSet attrs) {
5052
super(context, attrs);
@@ -89,6 +91,9 @@ private void sendKey(View view, String keyName, boolean forceCtrlDown, boolean f
8991
} else if ("DRAWER".equals(keyName)) {
9092
DrawerLayout drawer = view.findViewById(R.id.drawer_layout);
9193
drawer.openDrawer(Gravity.LEFT);
94+
} else if ("PASTE".equals(keyName)) {
95+
if(mTermuxTerminalSessionClient != null)
96+
mTermuxTerminalSessionClient.onPasteTextFromClipboard(null);
9297
} else if (keyCodesForString.containsKey(keyName)) {
9398
Integer keyCode = keyCodesForString.get(keyName);
9499
if (keyCode == null) return;
@@ -389,4 +394,8 @@ public void setTermuxTerminalViewClient(TermuxTerminalViewClient termuxTerminalV
389394
this.mTermuxTerminalViewClient = termuxTerminalViewClient;
390395
}
391396

397+
public void setTermuxTerminalSessionClient(TermuxTerminalSessionClient termuxTerminalSessionClient) {
398+
this.mTermuxTerminalSessionClient = termuxTerminalSessionClient;
399+
}
400+
392401
}

terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1980,7 +1980,7 @@ private void doOscSetTextParameters(String bellOrStringTerminator) {
19801980
int startIndex = textParameter.indexOf(";") + 1;
19811981
try {
19821982
String clipboardText = new String(Base64.decode(textParameter.substring(startIndex), 0), StandardCharsets.UTF_8);
1983-
mSession.clipboardText(clipboardText);
1983+
mSession.onCopyTextToClipboard(clipboardText);
19841984
} catch (Exception e) {
19851985
mClient.logError(LOG_TAG, "OSC Manipulate selection, invalid string '" + textParameter + "");
19861986
}

terminal-emulator/src/main/java/com/termux/terminal/TerminalOutput.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ public final void write(String data) {
1818
/** Notify the terminal client that the terminal title has changed. */
1919
public abstract void titleChanged(String oldTitle, String newTitle);
2020

21-
/** Notify the terminal client that the terminal title has changed. */
22-
public abstract void clipboardText(String text);
21+
/** Notify the terminal client that text should be copied to clipboard. */
22+
public abstract void onCopyTextToClipboard(String text);
23+
24+
/** Notify the terminal client that text should be pasted from clipboard. */
25+
public abstract void onPasteTextFromClipboard();
2326

2427
/** Notify the terminal client that a bell character (ASCII 7, bell, BEL, \a, ^G)) has been received. */
2528
public abstract void onBell();

terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,13 @@ public synchronized int getExitStatus() {
269269
}
270270

271271
@Override
272-
public void clipboardText(String text) {
273-
mClient.onClipboardText(this, text);
272+
public void onCopyTextToClipboard(String text) {
273+
mClient.onCopyTextToClipboard(this, text);
274+
}
275+
276+
@Override
277+
public void onPasteTextFromClipboard() {
278+
mClient.onPasteTextFromClipboard(this);
274279
}
275280

276281
@Override

terminal-emulator/src/main/java/com/termux/terminal/TerminalSessionClient.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ public interface TerminalSessionClient {
1313

1414
void onSessionFinished(TerminalSession finishedSession);
1515

16-
void onClipboardText(TerminalSession session, String text);
16+
void onCopyTextToClipboard(TerminalSession session, String text);
17+
18+
void onPasteTextFromClipboard(TerminalSession session);
1719

1820
void onBell(TerminalSession session);
1921

terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,14 @@ public void titleChanged(String oldTitle, String newTitle) {
3737
}
3838

3939
@Override
40-
public void clipboardText(String text) {
40+
public void onCopyTextToClipboard(String text) {
4141
clipboardPuts.add(text);
4242
}
4343

44+
@Override
45+
public void onPasteTextFromClipboard() {
46+
}
47+
4448
@Override
4549
public void onBell() {
4650
bellsRung++;

terminal-view/src/main/java/com/termux/view/textselection/TextSelectionCursorController.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,12 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
138138
switch (item.getItemId()) {
139139
case ACTION_COPY:
140140
String selectedText = terminalView.mEmulator.getSelectedText(mSelX1, mSelY1, mSelX2, mSelY2).trim();
141-
terminalView.mTermSession.clipboardText(selectedText);
141+
terminalView.mTermSession.onCopyTextToClipboard(selectedText);
142142
terminalView.stopTextSelectionMode();
143143
break;
144144
case ACTION_PASTE:
145145
terminalView.stopTextSelectionMode();
146-
ClipboardManager clipboard = (ClipboardManager) terminalView.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
147-
ClipData clipData = clipboard.getPrimaryClip();
148-
if (clipData != null) {
149-
CharSequence paste = clipData.getItemAt(0).coerceToText(terminalView.getContext());
150-
if (!TextUtils.isEmpty(paste)) terminalView.mEmulator.paste(paste.toString());
151-
}
146+
terminalView.mTermSession.onPasteTextFromClipboard();
152147
break;
153148
case ACTION_MORE:
154149
terminalView.stopTextSelectionMode(); //we stop text selection first, otherwise handles will show above popup

termux-shared/src/main/java/com/termux/shared/terminal/TermuxTerminalSessionClientBase.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ public void onSessionFinished(final TerminalSession finishedSession) {
2222
}
2323

2424
@Override
25-
public void onClipboardText(TerminalSession session, String text) {
25+
public void onCopyTextToClipboard(TerminalSession session, String text) {
26+
}
27+
28+
@Override
29+
public void onPasteTextFromClipboard(TerminalSession session) {
2630
}
2731

2832
@Override

0 commit comments

Comments
 (0)