diff --git a/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html b/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html index 2ea00b278f..3be4d20758 100644 --- a/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html +++ b/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html @@ -32,6 +32,15 @@ "#Satellite_View">Satellite View. There is also a group of actions that apply to the entire graph.

+ +
+
+ +

Ctrl-Space will toggle + between the full Listing view and the Function Graph view. The Toggle Listing and + Function Graph action's key binding can be changed in the tool options.

+
+

Primary View

diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FunctionGraphPlugin.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FunctionGraphPlugin.java index d8a5cd9298..9fe1e3601e 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FunctionGraphPlugin.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FunctionGraphPlugin.java @@ -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. @@ -21,6 +21,9 @@ import javax.swing.Icon; import org.jdom.Element; +import docking.ComponentProvider; +import docking.DockingWindowManager; +import docking.action.builder.ActionBuilder; import docking.options.OptionsService; import docking.tool.ToolConstants; import generic.theme.GIcon; @@ -36,6 +39,7 @@ import ghidra.app.plugin.core.functiongraph.mvc.FunctionGraphOptions; import ghidra.app.plugin.core.marker.MarginProviderSupplier; import ghidra.app.services.*; import ghidra.app.util.viewer.format.FormatManager; +import ghidra.app.util.viewer.listingpanel.ListingPanel; import ghidra.framework.model.DomainFile; import ghidra.framework.options.*; import ghidra.framework.plugintool.PluginInfo; @@ -86,6 +90,29 @@ public class FunctionGraphPlugin extends ProgramPlugin super(tool); colorProvider = new IndependentColorProvider(tool); + + new ActionBuilder("Toggle Listing and Function Graph", getName()) + .keyBinding("control space") + .onAction(c -> toggleView()) + .buildAndInstall(tool); + } + + private void toggleView() { + + CodeViewerService cvService = tool.getService(CodeViewerService.class); + + ListingPanel lp = cvService.getListingPanel(); + DockingWindowManager dwm = DockingWindowManager.getInstance(lp); + ComponentProvider cvProvider = dwm.getComponentProvider(lp); + if (cvProvider.isFocusedProvider()) { + connectedProvider.setVisible(true); + } + else { + // Either the Function Graph is focused or some other provider has focus. Just jump to + // the code viewer in this case. The user can perform the action again to get to the + // graph. + cvProvider.setVisible(true); + } } @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java index bfe6395582..5609532fa5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java @@ -248,6 +248,8 @@ public abstract class ComponentProvider implements HelpDescriptor, ActionContext return; } + // this call is needed to bring tabbed providers to the front + toFront(); if (defaultFocusComponent != null) { DockingWindowManager.requestFocus(defaultFocusComponent); return;