From 9ab003df4cb817d94e2cedb542c8d86833216827 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 21 Dec 2019 16:04:16 +0000 Subject: [PATCH] feat(gui): map back and forward mouse keys for navigation (#807) --- jadx-gui/src/main/java/jadx/gui/JadxGUI.java | 15 ++++++- .../src/main/java/jadx/gui/ui/MainWindow.java | 40 +++++++++++++++++++ .../src/main/java/jadx/gui/ui/TabbedPane.java | 8 +++- .../main/java/jadx/gui/utils/JumpManager.java | 31 +++++++++++++- .../main/java/jadx/gui/utils/SystemInfo.java | 20 ++++++++++ 5 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 jadx-gui/src/main/java/jadx/gui/utils/SystemInfo.java diff --git a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java index 65568ecc..73b7832c 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java @@ -1,6 +1,7 @@ package jadx.gui; -import javax.swing.*; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,6 +11,7 @@ import jadx.gui.settings.JadxSettings; import jadx.gui.settings.JadxSettingsAdapter; import jadx.gui.ui.MainWindow; import jadx.gui.utils.NLS; +import jadx.gui.utils.SystemInfo; import jadx.gui.utils.logs.LogCollector; public class JadxGUI { @@ -28,6 +30,8 @@ public class JadxGUI { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } NLS.setLocale(settings.getLangLocale()); + printSystemInfo(); + SwingUtilities.invokeLater(new MainWindow(settings)::init); } catch (Exception e) { LOG.error("Error: {}", e.getMessage(), e); @@ -47,4 +51,13 @@ public class JadxGUI { } return false; } + + private static void printSystemInfo() { + if (LOG.isDebugEnabled()) { + LOG.debug("Starting jadx-gui. Version: '{}'. JVM: {} {}. OS: {} {}", + SystemInfo.JADX_VERSION, + SystemInfo.JAVA_VM, SystemInfo.JAVA_VER, + SystemInfo.OS_NAME, SystemInfo.OS_VERSION); + } + } } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index ab18f8aa..f373f2dc 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -1,5 +1,6 @@ package jadx.gui.ui; +import java.awt.AWTEvent; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; @@ -7,6 +8,7 @@ import java.awt.DisplayMode; import java.awt.Font; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; +import java.awt.Toolkit; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; @@ -97,6 +99,7 @@ import jadx.gui.utils.FontUtils; import jadx.gui.utils.JumpPosition; import jadx.gui.utils.Link; import jadx.gui.utils.NLS; +import jadx.gui.utils.SystemInfo; import jadx.gui.utils.UiUtils; import static javax.swing.KeyStroke.getKeyStroke; @@ -164,6 +167,7 @@ public class MainWindow extends JFrame { FontUtils.registerBundledFonts(); initUI(); initMenuAndToolbar(); + registerMouseNavigationButtons(); UiUtils.setWindowIcons(this); loadSettings(); checkForUpdate(); @@ -958,6 +962,42 @@ public class MainWindow extends JFrame { setTitle(DEFAULT_TITLE); } + private void registerMouseNavigationButtons() { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + toolkit.addAWTEventListener(event -> { + if (event instanceof MouseEvent) { + MouseEvent mouseEvent = (MouseEvent) event; + if (mouseEvent.getID() == MouseEvent.MOUSE_PRESSED) { + int rawButton = mouseEvent.getButton(); + if (rawButton <= 3) { + return; + } + int button = remapMouseButton(rawButton); + switch (button) { + case 4: + tabbedPane.navBack(); + break; + case 5: + tabbedPane.navForward(); + break; + } + } + } + }, AWTEvent.MOUSE_EVENT_MASK); + } + + private static int remapMouseButton(int rawButton) { + if (SystemInfo.IS_LINUX) { + if (rawButton == 6) { + return 4; + } + if (rawButton == 7) { + return 5; + } + } + return rawButton; + } + private static String[] getPathExpansion(TreePath path) { List pathList = new ArrayList<>(); while (path != null) { diff --git a/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java b/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java index c3fbac9e..ae0627b1 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/TabbedPane.java @@ -1,12 +1,13 @@ package jadx.gui.ui; -import java.awt.*; +import java.awt.Component; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import javax.swing.*; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; import org.jetbrains.annotations.Nullable; @@ -40,6 +41,9 @@ public class TabbedPane extends JTabbedPane { setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); addMouseWheelListener(e -> { + if (openTabs.isEmpty()) { + return; + } int direction = e.getWheelRotation(); int index = getSelectedIndex(); int maxIndex = getTabCount() - 1; diff --git a/jadx-gui/src/main/java/jadx/gui/utils/JumpManager.java b/jadx-gui/src/main/java/jadx/gui/utils/JumpManager.java index e0d9608f..390e9299 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/JumpManager.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/JumpManager.java @@ -2,6 +2,9 @@ package jadx.gui.utils; import java.util.ArrayList; import java.util.List; +import java.util.Objects; + +import org.jetbrains.annotations.Nullable; public class JumpManager { @@ -9,7 +12,7 @@ public class JumpManager { private int currentPos = 0; public void addPosition(JumpPosition pos) { - if (pos.equals(getCurrent())) { + if (ignoreJump(pos)) { return; } currentPos++; @@ -25,6 +28,30 @@ public class JumpManager { } } + private boolean ignoreJump(JumpPosition pos) { + JumpPosition current = getCurrent(); + if (current == null) { + return false; + } + if (pos.equals(current)) { + return true; + } + if (Objects.equals(current.getNode(), pos.getNode())) { + // undefined jump line in same node // TODO: find the cause + if (pos.getLine() == 0) { + return true; + } + if (current.getLine() == 0) { + // replace current + getPrev(); + return false; + } + return false; + } + return false; + } + + @Nullable private JumpPosition getCurrent() { if (currentPos >= 0 && currentPos < list.size()) { return list.get(currentPos); @@ -32,6 +59,7 @@ public class JumpManager { return null; } + @Nullable public JumpPosition getPrev() { if (currentPos == 0) { return null; @@ -40,6 +68,7 @@ public class JumpManager { return list.get(currentPos); } + @Nullable public JumpPosition getNext() { int size = list.size(); if (size == 0) { diff --git a/jadx-gui/src/main/java/jadx/gui/utils/SystemInfo.java b/jadx-gui/src/main/java/jadx/gui/utils/SystemInfo.java new file mode 100644 index 00000000..f2eca96e --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/utils/SystemInfo.java @@ -0,0 +1,20 @@ +package jadx.gui.utils; + +import java.util.Locale; + +import jadx.api.JadxDecompiler; + +public class SystemInfo { + public static final String JADX_VERSION = JadxDecompiler.getVersion(); + + public static final String JAVA_VM = System.getProperty("java.vm.name"); + public static final String JAVA_VER = System.getProperty("java.version"); + + public static final String OS_NAME = System.getProperty("os.name"); + public static final String OS_VERSION = System.getProperty("os.version"); + + private static final String LOWER_OS_NAME = OS_NAME.toLowerCase(Locale.ENGLISH); + public static final boolean IS_WINDOWS = LOWER_OS_NAME.startsWith("windows"); + public static final boolean IS_MAC = LOWER_OS_NAME.startsWith("mac"); + public static final boolean IS_LINUX = LOWER_OS_NAME.startsWith("linux"); +} -- GitLab