Hi! Is there a callback that triggers when a key is pressed? I’m trying to set an alternative button title when opt is pressed, just like alternative menu titles. I get how to detect what button is pressed, but can’t find the right callback.
You can use this:
if (!_optionDownMonitor) {
_optionDownMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskFlagsChanged handler:^NSEvent *(NSEvent *event) {
self.optionIsDown = (event.modifierFlags & NSEventModifierFlagOption) == NSEventModifierFlagOption;
return event;
}];
}
I have never used that from python. It might looks something like this:
from AppKit import NSEventModifierFlagOption
def mask_handler(event):
self.optionIsDown((event.modifierFlags() & NSEventModifierFlagOption) == NSEventModifierFlagOption)
return event
if self._optionDownMonitor is None:
self._optionDownMonitor = NSEvent.addLocalMonitorForEventsMatchingMask_handler_(NSEventMaskFlagsChanged, Mask_handler_)
Put that code somewhere in the view loading/setup code.
Does this help?
(PyObjC support for “blocks” — PyObjC - the Python to Objective-C bridge)
Awesome, thank you!
That works perfectly, but seems like it overrides the behavior of Glyphs.currentDocument.windowController().AltKey(). I can of course get around it, but in case some other tool relies on it, is there a way to do it non-destructively?
It shouldn’t be disturbing others. Can you show me your code (mostly that callback).
It’s a Palette plugin, I just added these:
@objc.python_method
def settings(self):
...
NSEvent.addLocalMonitorForEventsMatchingMask_handler_( NSEventMaskFlagsChanged, self.mask_handler )
@objc.python_method
def mask_handler( self, event ):
optPressed = ((event.modifierFlags() & NSEventModifierFlagOption) == NSEventModifierFlagOption)
if optPressed:
self.paletteView.group.run.setTitle('Run, new tab')
else:
self.paletteView.group.run.setTitle('Run')
With that, Glyphs.currentDocument.windowController().AltKey()
from the plugin and from Macro panel always returns False
Don’t make the callback a method, just add it as a local function inside the method where you set it up.
And return the event in the callback.
That works, thanks a lot!