Skip to content

Instantly share code, notes, and snippets.

@NyaMisty
Last active February 22, 2023 20:51
Show Gist options
  • Save NyaMisty/dfd8fd9271f70122fb2f83a698baf59d to your computer and use it in GitHub Desktop.
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 :(
# 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