Added notes to the TODO. Matt, please check and modify TODO as required :)
[MenuTunes.git] / KeyBroadcaster.m
1 #import "KeyBroadcaster.h"
2 #import <Carbon/Carbon.h>
3
4 @interface KeyBroadcaster (Private)
5 - (void)_broadcastKeyCode:(short)keyCode andModifiers:(long)modifiers;
6 @end
7
8 @implementation KeyBroadcaster
9
10 - (void)keyDown:(NSEvent *)event
11 {
12     short keyCode;
13     long modifiers;
14     
15     keyCode = [event keyCode];
16     modifiers = [event modifierFlags];
17     
18     modifiers = [KeyBroadcaster cocoaToCarbonModifiers:modifiers];
19     if (modifiers > 0) {
20         [self _broadcastKeyCode:keyCode andModifiers:modifiers];
21     }
22 }
23
24 - (BOOL)performKeyEquivalent:(NSEvent *)event
25 {
26     [self keyDown:event];
27     return YES;
28 }
29
30 - (void)_broadcastKeyCode:(short)keyCode andModifiers:(long)modifiers
31 {
32     NSNumber *keycodeNum = [NSNumber numberWithShort:keyCode];
33     NSNumber *modifiersNum = [NSNumber numberWithLong:modifiers];
34     NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
35                     keycodeNum, @"KeyCode", modifiersNum, @"Modifiers", nil, nil];
36     [[NSNotificationCenter defaultCenter] postNotificationName:@"KeyBroadcasterEvent" object:self userInfo:info];
37 }
38
39 + (long)cocoaToCarbonModifiers:(long)modifiers
40 {
41     long carbonModifiers = 0;
42     int i;
43     static long cocoaToCarbon[6][2] = 
44     {
45         { NSCommandKeyMask, cmdKey },
46         { NSAlternateKeyMask, optionKey },
47         { NSControlKeyMask, controlKey },
48         { NSShiftKeyMask, shiftKey },
49     };
50     for (i = 0; i < 6; i++)
51     {
52         if (modifiers & cocoaToCarbon[i][0])
53         {
54             carbonModifiers += cocoaToCarbon[i][1];
55         }
56     }
57     return carbonModifiers;
58 }
59
60 @end