diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html index 4e06391801..7e4522ce09 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html @@ -83,6 +83,13 @@ CTRL-SHIFT-H or CTRL-SHIFT-G, respectively. They repeat the last search in the forward or backward direction.

+

Select All

+ +

This is accessed using the local drop-down menu or the key sequence CTRL-SHIFT-A. It + selects all text in the terminal, including its scrollback buffer. If all the text is already + selected, then this selects nothing, so that pressing the keystroke twice is effectively + "Select None."

+

Terminate

This action is accessed using the local drop-down menu. It will terminate the Terminal's diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/TerminalProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/TerminalProvider.java index 1b4d067c8d..0e6539f8bf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/TerminalProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/TerminalProvider.java @@ -18,6 +18,7 @@ package ghidra.app.plugin.core.terminal; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; +import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.*; @@ -32,6 +33,7 @@ import docking.*; import docking.action.DockingAction; import docking.action.DockingActionIf; import docking.action.builder.ActionBuilder; +import docking.widgets.EventTrigger; import docking.widgets.OkDialog; import docking.widgets.fieldpanel.support.*; import generic.theme.GColor; @@ -163,6 +165,7 @@ public class TerminalProvider extends ComponentProviderAdapter { protected DockingAction actionFind; protected DockingAction actionFindNext; protected DockingAction actionFindPrevious; + protected DockingAction actionSelectAll; protected DockingAction actionTerminate; private boolean terminated = false; @@ -251,6 +254,14 @@ public class TerminalProvider extends ComponentProviderAdapter { .enabledWhen(this::isEnabledFindStep) .onAction(this::activatedFindPrevious) .buildAndInstallLocal(this); + actionSelectAll = new ActionBuilder("Select All", plugin.getName()) + .menuPath("Select All") + .menuGroup("Select") + .keyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_A, + InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)) + .helpLocation(new HelpLocation(helpPlugin.getName(), "select_all")) + .onAction(this::activatedSelectAll) + .buildAndInstallLocal(this); } protected void activatedFind(ActionContext ctx) { @@ -300,6 +311,24 @@ public class TerminalProvider extends ComponentProviderAdapter { doFind(false); } + protected void activatedSelectAll(ActionContext ctx) { + FieldSelection sel = new FieldSelection(); + BigInteger numIndexes = panel.model.getNumIndexes(); + if (numIndexes.equals(BigInteger.ZERO)) { + return; + } + BigInteger lastIndex = numIndexes.subtract(BigInteger.ONE); + TerminalLayout layout = panel.model.getLayout(lastIndex); + int lastCol = layout.line.length(); + sel.addRange( + new FieldLocation(BigInteger.ZERO, 0, 0, 0), + new FieldLocation(lastIndex, 0, 0, lastCol)); + if (panel.getFieldPanel().getSelection().equals(sel)) { + sel.clear(); + } + panel.getFieldPanel().setSelection(sel, EventTrigger.GUI_ACTION); + } + /** * Check if the given keystroke would activate a local action. *