From 6c7ac1fd4570d42f1d7eaa375b30a5aff96b9a0e Mon Sep 17 00:00:00 2001 From: Michael Lai Date: Sat, 15 Mar 2014 23:18:05 -0700 Subject: [PATCH] Fixing keyboard shortcuts in MessageViewer. Pretty extensive change - I'm using Mail.app APIs for a lot of shortcuts since many of these may differ on different keyboard layouts. The bundle's functionality would also break if you happened to remap Mail shortcuts with the global keyboard shortcuts preferences. --- GMailinator/GMailinator.m | 81 +++++++++++---------------------------- 1 file changed, 22 insertions(+), 59 deletions(-) diff --git a/GMailinator/GMailinator.m b/GMailinator/GMailinator.m index 6083fbb..d6fd5af 100644 --- a/GMailinator/GMailinator.m +++ b/GMailinator/GMailinator.m @@ -46,8 +46,6 @@ + (void)load { class_addMethod(c, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); class_replaceMethod(c, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod)); - - NSLog(@"OLD STLYE"); } + (void)registerBundle @@ -61,11 +59,11 @@ + (void)registerBundle - (void)overrideMailKeyDown:(NSEvent*)event { unichar key = [[event characters] characterAtIndex:0]; + id messageViewer = [[self performSelector:@selector(delegate)] performSelector:@selector(delegate)]; switch (key) { case 'e': case 'y': { - id messageViewer = [[self performSelector:@selector(delegate)] performSelector:@selector(delegate)]; [messageViewer performSelector:@selector(archiveMessages:) withObject:nil]; break; } @@ -104,36 +102,23 @@ - (void)overrideMailKeyDown:(NSEvent*)event { break; } case '#': { - id messageViewer = [[self performSelector:@selector(delegate)] performSelector:@selector(delegate)]; [messageViewer performSelector:@selector(deleteMessages:) withObject:nil]; break; } case 'c': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 45, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMailKeyDown: newEvent]; + [messageViewer performSelector:@selector(showComposeWindow:) withObject:nil]; break; } case 'r': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 15, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMailKeyDown: newEvent]; + [messageViewer performSelector:@selector(replyMessage:) withObject:nil]; break; } - case 'a': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 15, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand | kCGEventFlagMaskShift); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMailKeyDown: newEvent]; + case 'f': { + [messageViewer performSelector:@selector(forwardMessage:) withObject:nil]; break; } - case 'f': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 3, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand | kCGEventFlagMaskShift); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMailKeyDown: newEvent]; + case 'a': { + [messageViewer performSelector:@selector(replyAllMessage:) withObject:nil]; break; } case '/': { @@ -156,68 +141,46 @@ - (void)overrideMessagesKeyDown:(NSEvent*)event { switch (key) { case 'e': case 'y': { - id messageViewer = [[self performSelector:@selector(delegate)] performSelector:@selector(delegate)]; - [messageViewer performSelector:@selector(archiveMessages:) withObject:nil]; + [self performSelector:@selector(archiveMessages:) withObject:nil]; break; } -// case 'h': { -// NSEvent *newEvent = [NSEvent eventWithCGEvent: CGEventCreateKeyboardEvent(NULL, 115, true)]; -// [self overrideMessagesKeyDown: newEvent]; + // These don't work so well, but it looks like this is a Mail bug; the + // menu option for Select next/previous message in conversation just jumps + // to the next/previous thread instead. Also, it looks like capturing left/ + // right doesn't work for MessageViewer for some reason. +// case 'k': { +// [self performSelector:@selector(selectNextInThread:) withObject:nil]; // break; // } -// case 'l': { -// NSEvent *newEvent = [NSEvent eventWithCGEvent: CGEventCreateKeyboardEvent(NULL, 119, true)]; -// [self overrideMessagesKeyDown: newEvent]; +// case 'j': { +// [self performSelector:@selector(selectPreviousInThread:) withObject:nil]; // break; // } - case 'k': { - NSEvent *newEvent = [NSEvent eventWithCGEvent: CGEventCreateKeyboardEvent(NULL, 123, true)]; - [self overrideMessagesKeyDown: newEvent]; - break; - } - case 'j': { - NSEvent *newEvent = [NSEvent eventWithCGEvent: CGEventCreateKeyboardEvent(NULL, 124, true)]; - [self overrideMessagesKeyDown: newEvent]; - break; - } case '#': { - id messageViewer = [[self performSelector:@selector(delegate)] performSelector:@selector(delegate)]; - [messageViewer performSelector:@selector(deleteMessages:) withObject:nil]; + [self performSelector:@selector(deleteMessages:) withObject:nil]; break; } case 'c': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 45, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMessagesKeyDown: newEvent]; + [self performSelector:@selector(showComposeWindow:) withObject:nil]; break; } case 'r': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 15, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMessagesKeyDown: newEvent]; + [self performSelector:@selector(replyMessage:) withObject:nil]; break; } case 'f': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 3, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand | kCGEventFlagMaskShift); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMessagesKeyDown: newEvent]; + [self performSelector:@selector(forwardMessage:) withObject:nil]; break; } case 'a': { - CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 15, true); - CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand | kCGEventFlagMaskShift); - NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMessagesKeyDown: newEvent]; + [self performSelector:@selector(replyAllMessage:) withObject:nil]; break; } case '/': { CGEventRef cgEvent = CGEventCreateKeyboardEvent(NULL, 3, true); CGEventSetFlags(cgEvent, kCGEventFlagMaskCommand | kCGEventFlagMaskAlternate); NSEvent *newEvent = [NSEvent eventWithCGEvent: cgEvent]; - [self overrideMailKeyDown: newEvent]; + [self overrideMessagesKeyDown: newEvent]; break; } default: