Мне удалось перехватить события ярлыков меню, но я борюсь с правильной маршрутизацией события onKey к текущему textRield firstResponder.
Код ниже работает, но я не совсем доволен этим.Смотрите комментарии там.Этот метод перезаписывает исходный в NSApplication
.
- (void) sendEvent:(NSEvent*)event
{
id fr = NSApplication.sharedApplication.keyWindow.firstResponder;
if (fr == nil || [fr isKindOfClass:NSTextView.class] == NO) {
[super sendEvent:event];
return;
}
NSTextView *tf = (NSTextView*)fr;
if (!tf.editable || !tf.isEditable) {
[super sendEvent:event];
return;
}
// <REF> https://stackoverflow.com/a/3176930/929170
//
if ([event type] == NSEventTypeKeyDown) {
if (([event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand) {
if ([[event charactersIgnoringModifiers] isEqualToString:@"x"]) {
if ([self sendAction:@selector(cut:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"c"]) {
if ([self sendAction:@selector(copy:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"v"]) {
if ([self sendAction:@selector(paste:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"z"]) {
if ([self sendAction:@selector(undo:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"a"]) {
if ([self sendAction:@selector(selectAll:) to:nil from:self])
return;
}
}
else if (([event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask) == (NSEventModifierFlagCommand | NSEventModifierFlagShift)) {
if ([[event charactersIgnoringModifiers] isEqualToString:@"Z"]) {
if ([self sendAction:@selector(redo:) to:nil from:self])
return;
}
}
}
// <C> this likely takes care of routing all the standard events (e.g. select word) EXCEPT clipboard actions;
// Don't know why the clipboard events are not handled but the code above takes care of it.
// Some event might however be lost...
//
[NSApplication.sharedApplication.keyWindow sendEvent:event];
// <C> super is already handled above;
//[super sendEvent:event];
}