GP-6899 - Accessibility help updates

This commit is contained in:
dragonmacher
2026-09-17 19:20:07 -04:00
committed by Ryan Kurtz
parent 1c779da13a
commit 88f02f225e
8 changed files with 169 additions and 182 deletions

View File

@@ -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>

View File

@@ -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.

View File

@@ -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());
}

View File

@@ -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);
}