mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
GP-6899 - Accessibility help updates
This commit is contained in:
@@ -11,61 +11,105 @@
|
||||
<META name="generator" content="Microsoft FrontPage 4.0">
|
||||
</HEAD>
|
||||
|
||||
<BODY>
|
||||
<BODY>
|
||||
<H1 align="center">Ghidra Accessibility</H1>
|
||||
<P>Ghidra strives to be as accessible as possible to all users, including those relying on keyboard-only operation and screen readers. This document summarizes built-in accessibility features, recommended usage patterns, and known limitations.</P>
|
||||
|
||||
<BLOCKQUOTE>
|
||||
<P>Ghidra strives to be as accessible as possible to all users, including those relying on
|
||||
keyboard-only operation and screen readers. This document summarizes built-in accessibility
|
||||
features, recommended usage patterns, and known limitations.</P>
|
||||
|
||||
<H2>Screen-Reader Guidance</H2>
|
||||
<P>Most of Ghidra's UI is built in Java/Swing, so screen reader behavior may differ from a web browser. To get the best results:</P>
|
||||
|
||||
<BLOCKQUOTE>
|
||||
<P>Most of Ghidra's UI is built in Java/Swing, so screen reader behavior may differ from a web
|
||||
browser. To get the best results:</P>
|
||||
|
||||
<UL>
|
||||
<LI>Use a modern Java-aware screen reader (e.g. NVDA on Windows).</LI>
|
||||
<LI>Enable "focus following caret" or "announce focus changes" so you hear when UI components gain keyboard focus.</LI>
|
||||
<LI>Pause briefly after opening new dialogs or views, as Swing can sometimes batch events.</LI>
|
||||
|
||||
<LI>Enable "focus following caret" or "announce focus changes" so you hear when UI components
|
||||
gain keyboard focus.</LI>
|
||||
|
||||
<LI>Pause briefly after opening new dialogs or views, as Swing can sometimes batch
|
||||
events.</LI>
|
||||
</UL>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<H2>Keyboard Navigation</H2>
|
||||
<P>Ghidra provides comprehensive keyboard navigation support to traverse UI components, windows, and providers. For full details, including focus traversal and navigation shortcuts, see the <A href="help/topics/KeyboardNavigation/KeyboardNavigation.html">Keyboard Navigation</A> topic.</P>
|
||||
|
||||
<H2>Quick Action Dialog (Ctrl + 3)</H2>
|
||||
<P>Ghidra's Quick Action dialog provides a fast, keyboard-first way to find and run any action. Press <B>Ctrl + 3</B> to open it, then:</P>
|
||||
<BLOCKQUOTE>
|
||||
<P>Ghidra provides comprehensive keyboard navigation support to traverse UI components,
|
||||
windows, and providers. For full details, including focus traversal and navigation shortcuts,
|
||||
see the <A href="help/topics/KeyboardNavigation/KeyboardNavigation.html">Keyboard
|
||||
Navigation</A> topic.</P>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
|
||||
<H2>Quick Action Dialog (Ctrl-3)</H2>
|
||||
|
||||
<BLOCKQUOTE>
|
||||
<P>Ghidra's
|
||||
<A href="help/topics/KeyboardNavigation/KeyboardNavigation.html#ActionChooserDialog">
|
||||
Quick Action Dialog</A> provides a fast, keyboard-first way to find and run any action.
|
||||
Press <B>Ctrl-3</B> to open it, then:</P>
|
||||
|
||||
<UL>
|
||||
<LI>Begin typing any portion of an action name</LI>
|
||||
|
||||
<LI>Use <B>Up</B>/<B>Down</B> arrows to navigate the list.</LI>
|
||||
|
||||
<LI>Repeat <B>Ctrl + 3</B> to expand from local to global actions.</LI>
|
||||
|
||||
<LI>Press <B>Enter</B> to execute the selected command.</LI>
|
||||
<LI>Repeat <B>Ctrl + 3</B> to expand from local to global actions.</LI>
|
||||
<LI>The dialog remembers recent commands across sessions for quick recall.</LI>
|
||||
</UL>
|
||||
<P>This dialog is invaluable for screen-reader users or anyone who prefers keyboard navigation over menus.</P>
|
||||
|
||||
<H2>Script Launcher (Ctrl + Shift + S)</H2>
|
||||
<P>A quick launcher exists for Ghidra scripts. For details, see the Script Manager topic: <A href="help/topics/GhidraScriptMgrPlugin/GhidraScriptMgrPlugin.htm">Script Manager</A>.</P>
|
||||
<OL>
|
||||
<LI>Press <B>Ctrl + Shift + S</B>.</LI>
|
||||
<LI>Begin typing your script's name (wildcards and substrings allowed).</LI>
|
||||
<LI>Navigate the filtered list with Up/Down, then Enter to run.</LI>
|
||||
<LI>Recently run scripts float to the top automatically.</LI>
|
||||
</OL>
|
||||
<P>The dialog remembers recently used actions across sessions for quick recall. This feature is
|
||||
invaluable for screen-reader users or anyone who prefers keyboard navigation over menus.</P>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<H2>Script Launcher (Ctrl-Shift-S)</H2>
|
||||
|
||||
<BLOCKQUOTE>
|
||||
<P>Ghidra's
|
||||
<A href="help/topics/GhidraScriptMgrPlugin/GhidraScriptMgrPlugin.htm#Script_Quick_Launch">
|
||||
Script Quick Launcher</A> provides a quick way to run desired scripts.
|
||||
Press <B>Ctrl-Shift-S</B> to open it, then:
|
||||
</P>
|
||||
|
||||
<H2>Other Accessibility-Focused Enhancements</H2>
|
||||
<UL>
|
||||
<LI><B>Customizable Key Bindings</B>: Assign or modify keyboard shortcuts via Edit -> Tool Options -> Key Bindings, or press F4 while hovering over a toolbar icon or menu item to set a shortcut (see <A href="../Tool/ToolOptions_Dialog.htm#KeyBindings_Option">Key Bindings</A>).</LI>
|
||||
<LI><B>Accessible Names and Roles</B>: Most dialogs now expose meaningful AccessibleName and AccessibleRole fields.</LI>
|
||||
<LI><B>Dialog Checkbox Improvements</B>: Spacebar toggles and arrow keys navigate checkbox groups reliably.</LI>
|
||||
<LI><B>Decompilation View</B>: Reduced redundant reads when moving the caret.</LI>
|
||||
<LI><B>Filter Dialogs</B>: Improved focus order and announceable fields in filter dialogs (e.g., Analyze -> Filters).</LI>
|
||||
<LI>Begin typing your script's name (wildcards and substrings allowed).</LI>
|
||||
|
||||
<LI>Navigate the filtered list with Up/Down, then Enter to run.</LI>
|
||||
|
||||
</UL>
|
||||
|
||||
<P>The dialog remembers recentlyl used scripts for quick recall.</P>
|
||||
|
||||
</BLOCKQUOTE>
|
||||
|
||||
|
||||
|
||||
<H2>Known Limitations</H2>
|
||||
|
||||
<BLOCKQUOTE>
|
||||
<UL>
|
||||
<LI>Swing's accessibility support is not as mature as HTML/ARIA; you may encounter missing or stale descriptions, focus swapping, or limited screen-reader gestures.</LI>
|
||||
<LI>Swing's accessibility support is not as mature as HTML/ARIA. You may encounter missing or
|
||||
stale descriptions, focus swapping, or limited screen-reader gestures.</LI>
|
||||
|
||||
<LI>Browser-style reporting (tabular UI state summaries) is not available.</LI>
|
||||
</UL>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<H2>Related Topics</H2>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<P class="relatedtopic">Related Topics:</P>
|
||||
<UL>
|
||||
<LI><A href="help/topics/KeyboardNavigation/KeyboardNavigation.html">Keyboard Navigation</A></LI>
|
||||
<LI><A href="help/topics/GhidraScriptMgrPlugin/GhidraScriptMgrPlugin.htm">Script Manager</A></LI>
|
||||
<LI><A href="help/topics/KeyboardNavigation/KeyboardNavigation.html">Keyboard
|
||||
Navigation</A></LI>
|
||||
|
||||
<LI><A href="help/topics/GhidraScriptMgrPlugin/GhidraScriptMgrPlugin.htm">Script
|
||||
Manager</A></LI>
|
||||
</UL><BR>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
Manager.</P>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<H3><A name="Script_Quick_Launch"></A>Script Quick Launch</H3>
|
||||
<H3><A name="Script_Quick_Launch"></A>Script Quick Launcher</H3>
|
||||
|
||||
<BLOCKQUOTE>
|
||||
<P align="left">This key binding action shows a dialog to quickly find and run scripts.
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@@ -20,17 +20,13 @@ import java.io.InputStream;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import docking.ActionContext;
|
||||
import docking.action.DockingAction;
|
||||
import docking.action.MenuData;
|
||||
import docking.tool.ToolConstants;
|
||||
import ghidra.app.CorePluginPackage;
|
||||
import ghidra.app.plugin.PluginCategoryNames;
|
||||
import ghidra.framework.main.ApplicationLevelOnlyPlugin;
|
||||
import ghidra.framework.plugintool.*;
|
||||
import ghidra.framework.plugintool.util.PluginStatus;
|
||||
import ghidra.framework.preferences.Preferences;
|
||||
import ghidra.util.HelpLocation;
|
||||
import ghidra.util.Swing;
|
||||
import ghidra.util.SystemUtilities;
|
||||
import utilities.util.FileUtilities;
|
||||
|
||||
@@ -48,7 +44,6 @@ public class TipOfTheDayPlugin extends Plugin implements ApplicationLevelOnlyPlu
|
||||
private static final String SHOW_TIPS = "SHOW_TIPS";
|
||||
|
||||
private TipOfTheDayDialog dialog;
|
||||
private DockingAction action;
|
||||
|
||||
public TipOfTheDayPlugin(PluginTool tool) {
|
||||
super(tool);
|
||||
@@ -56,19 +51,6 @@ public class TipOfTheDayPlugin extends Plugin implements ApplicationLevelOnlyPlu
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
action = new DockingAction("Tips of the day", getName()) {
|
||||
@Override
|
||||
public void actionPerformed(ActionContext context) {
|
||||
dialog.doShow(tool.getToolFrame());
|
||||
}
|
||||
};
|
||||
action.setMenuBarData(new MenuData(new String[] { "Help", "Tip of the Day" },
|
||||
ToolConstants.HELP_CONTENTS_MENU_GROUP));
|
||||
|
||||
action.setEnabled(true);
|
||||
action.setHelpLocation(new HelpLocation(ToolConstants.TOOL_HELP_TOPIC, "Tip_of_the_day"));
|
||||
tool.addAction(action);
|
||||
|
||||
List<String> tips = null;
|
||||
try {
|
||||
tips = loadTips();
|
||||
@@ -91,8 +73,6 @@ public class TipOfTheDayPlugin extends Plugin implements ApplicationLevelOnlyPlu
|
||||
@Override
|
||||
protected void dispose() {
|
||||
writePreferences();
|
||||
|
||||
action.dispose();
|
||||
dialog.close();
|
||||
}
|
||||
|
||||
@@ -101,7 +81,7 @@ public class TipOfTheDayPlugin extends Plugin implements ApplicationLevelOnlyPlu
|
||||
String showTipsStr = Preferences.getProperty(SHOW_TIPS, "true", true);
|
||||
|
||||
int tipIndex = Integer.parseInt(tipIndexStr);
|
||||
final boolean showTips = Boolean.parseBoolean(showTipsStr);
|
||||
boolean showTips = Boolean.parseBoolean(showTipsStr);
|
||||
if (showTips) {
|
||||
tipIndex = (++tipIndex) % dialog.getNumberOfTips();
|
||||
writePreferences(tipIndex, showTips);
|
||||
@@ -110,7 +90,7 @@ public class TipOfTheDayPlugin extends Plugin implements ApplicationLevelOnlyPlu
|
||||
dialog.setTipIndex(tipIndex);
|
||||
dialog.setShowTips(showTips);
|
||||
|
||||
SystemUtilities.runSwingLater(() -> {
|
||||
Swing.runLater(() -> {
|
||||
if (showTips && !SystemUtilities.isInTestingMode()) {
|
||||
dialog.show(tool.getToolFrame());
|
||||
}
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@@ -16,6 +16,7 @@
|
||||
package ghidra.app.plugin.runtimeinfo;
|
||||
|
||||
import docking.action.builder.ActionBuilder;
|
||||
import docking.tool.ToolConstants;
|
||||
import ghidra.app.plugin.PluginCategoryNames;
|
||||
import ghidra.framework.main.ApplicationLevelOnlyPlugin;
|
||||
import ghidra.framework.main.UtilityPluginPackage;
|
||||
@@ -50,7 +51,7 @@ public class RuntimeInfoPlugin extends Plugin implements ApplicationLevelOnlyPlu
|
||||
.onAction(context -> showInstalledProcessors())
|
||||
.enabled(true)
|
||||
.menuPath("Help", supportedActionName)
|
||||
.menuGroup("YYY") // trying to put this just above the last menu entry
|
||||
.menuGroup(ToolConstants.HELP_RUNTIME_MENU_GROUP)
|
||||
.helpLocation(getInstalledProcessorsHelpLocation())
|
||||
.buildAndInstall(tool);
|
||||
|
||||
@@ -59,7 +60,7 @@ public class RuntimeInfoPlugin extends Plugin implements ApplicationLevelOnlyPlu
|
||||
.onAction(context -> showRuntimeInfo())
|
||||
.enabled(true)
|
||||
.menuPath("Help", runtimeInfoActionName)
|
||||
.menuGroup("YYY")
|
||||
.menuGroup(ToolConstants.HELP_RUNTIME_MENU_GROUP)
|
||||
.helpLocation(getRuntimeInfoHelpLocation())
|
||||
.buildAndInstall(tool);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user