Last active
February 22, 2023 20:51
-
-
Save NyaMisty/dfd8fd9271f70122fb2f83a698baf59d to your computer and use it in GitHub Desktop.
Ghidra Script: Remap Ctrl&Meta to platform Ctrl key (i.e. Command on macOS, Ctrl on Win/Linux). Note: because Ghidra does not support running script on startup, you'll need to run this script manually on ech start :(
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Remap Ctrl&Meta to platform Ctrl key (i.e. Command on macOS, Ctrl on Win/Linux) | |
#@author NyaMisty | |
#@category UIHelper | |
#@keybinding Alt-C | |
#@menupath Edit.RemapCtrl | |
#@toolbar RemapCtrl | |
from javax.swing import KeyStroke | |
from java.awt.event import InputEvent | |
from generic.test import TestUtils | |
import docking | |
from docking import DockingUtils | |
from docking.action import KeyBindingData | |
from docking.actions import KeyBindingUtils | |
from docking.tool.util import DockingToolConstants | |
tool = state.getTool() | |
metactrlMask = InputEvent.META_MASK | InputEvent.CTRL_MASK | InputEvent.META_DOWN_MASK | InputEvent.CTRL_DOWN_MASK | |
def convertKs(ks, ctrl=DockingUtils.CONTROL_KEY_MODIFIER_MASK): | |
mod = ks.getModifiers() | |
if (mod & metactrlMask) == 0: | |
return ks | |
mod = (mod & ~metactrlMask) | ctrl | |
newks = KeyStroke.getKeyStroke(ks.getKeyCode(), mod) | |
newks = KeyBindingUtils.validateKeyStroke(newks) | |
return newks | |
print "Canonicalizing Ctrl&Meta to Meta" | |
kboption = tool.getOptions(DockingToolConstants.KEY_BINDINGS) | |
for action in tool.getAllActions(): | |
kb = action.getKeyBindingData() | |
if kb is None: | |
continue | |
ks, kbPred = TestUtils.getInstanceField('keyStroke', kb), kb.getKeyBindingPrecedence() | |
if ks is None: | |
continue | |
newks = convertKs(ks, InputEvent.META_MASK) | |
if newks != ks: | |
print "Canonicalize (%s) to (%s) for (%s)" % (ks, newks, action) | |
kboption.setKeyStroke(action.getFullName(), newks) | |
action.setUnvalidatedKeyBindingData(KeyBindingData(newks, kbPred)) | |
#raise Exceotion(111) | |
print "Mapping Ctrl&Meta to Platform Ctrl" | |
toolActions = tool.getToolActions() | |
kbm = TestUtils.getInstanceField("keyBindingsManager", toolActions) | |
dockingKeyMap = TestUtils.getInstanceField("dockingKeyMap", kbm) | |
updatedKeyMap = {} | |
for ks, multikeyAction in dockingKeyMap.items(): | |
if not isinstance(multikeyAction, docking.action.MultipleKeyAction): | |
continue | |
newks = convertKs(ks) | |
if ks != newks: | |
# We don't care whether newks was already registered, | |
# because inside doAddKeyBinding -> MultipleKeyAction.addAction | |
# it will check whether actionData are duplicated. | |
print "Mapping (%s) to (%s)" % (ks, newks) | |
actions = TestUtils.getInstanceField('actions', multikeyAction) | |
actionKeyStroke = TestUtils.getInstanceField('keyStroke', multikeyAction) | |
doAddKeyBinding = kbm.getClass().getDeclaredMethod('doAddKeyBinding', [docking.ComponentProvider, docking.action.DockingActionIf, KeyStroke, KeyStroke]) | |
doAddKeyBinding.setAccessible(True) | |
for actionData in actions: | |
#continue | |
provider = TestUtils.getInstanceField('provider', actionData) | |
action = TestUtils.getInstanceField('action', actionData) | |
args = [provider, action, newks, actionKeyStroke] | |
print 'doAddKeyBinding', args | |
#TestUtils.invokeInstanceMethod('doAddKeyBinding', kbm, argClasses, args) | |
#kbm.doAddKeyBinding(*args) | |
doAddKeyBinding.invoke(kbm, *args) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment