Tweak toolbar icons.
[enjoyable.git] / EnjoyableApplicationDelegate.m
1 //
2 // EnjoyableApplicationDelegate.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 4/05/09.
6 //
7
8 #import "EnjoyableApplicationDelegate.h"
9
10 #import "NJMapping.h"
11 #import "NJMappingsController.h"
12 #import "NJDeviceController.h"
13 #import "NJOutputController.h"
14 #import "NJEvents.h"
15
16 @implementation EnjoyableApplicationDelegate {
17 NSInteger mappingsMenuIndex;
18 }
19
20 - (void)didSwitchApplication:(NSNotification *)notification {
21 NSRunningApplication *currentApp = notification.userInfo[NSWorkspaceApplicationKey];
22 [self.mappingsController activateMappingForProcess:currentApp.localizedName];
23 }
24
25 - (void)applicationDidFinishLaunching:(NSNotification *)notification {
26 [NSNotificationCenter.defaultCenter
27 addObserver:self
28 selector:@selector(mappingDidChange:)
29 name:NJEventMappingChanged
30 object:nil];
31 [NSNotificationCenter.defaultCenter
32 addObserver:self
33 selector:@selector(mappingListDidChange:)
34 name:NJEventMappingListChanged
35 object:nil];
36 [NSNotificationCenter.defaultCenter
37 addObserver:self
38 selector:@selector(eventTranslationActivated:)
39 name:NJEventTranslationActivated
40 object:nil];
41 [NSNotificationCenter.defaultCenter
42 addObserver:self
43 selector:@selector(eventTranslationDeactivated:)
44 name:NJEventTranslationDeactivated
45 object:nil];
46
47 while (![dockMenuBase itemAtIndex:mappingsMenuIndex++].tag);
48
49 self.outputController.enabled = NO;
50 [self.inputController setup];
51 [self.mappingsController load];
52 }
53
54 - (void)applicationWillTerminate:(NSNotification *)aNotification {
55 [NSUserDefaults.standardUserDefaults synchronize];
56 [NSNotificationCenter.defaultCenter removeObserver:self];
57 }
58
59 - (void)eventTranslationActivated:(NSNotification *)note {
60 [NSWorkspace.sharedWorkspace.notificationCenter
61 addObserver:self
62 selector:@selector(didSwitchApplication:)
63 name:NSWorkspaceDidActivateApplicationNotification
64 object:nil];
65 NSLog(@"Listening for application changes.");
66 }
67
68 - (void)eventTranslationDeactivated:(NSNotification *)note {
69 [NSWorkspace.sharedWorkspace.notificationCenter
70 removeObserver:self
71 name:NSWorkspaceDidActivateApplicationNotification
72 object:nil];
73 NSLog(@"Ignoring application changes.");
74 }
75
76 - (void)mappingListDidChange:(NSNotification *)note {
77 NSArray *mappings = note.object;
78 NSInteger removeFrom = mappingsMenuIndex;
79 while (dockMenuBase.numberOfItems > removeFrom)
80 [dockMenuBase removeItemAtIndex:dockMenuBase.numberOfItems - 1];
81 int added = 0;
82 for (NJMapping *mapping in mappings) {
83 NSString *keyEquiv = ++added < 10 ? @(added).stringValue : @"";
84 [dockMenuBase addItemWithTitle:mapping.name
85 action:@selector(chooseMapping:)
86 keyEquivalent:keyEquiv];
87
88 }
89 [_outputController refreshMappings];
90 }
91
92 - (void)mappingDidChange:(NSNotification *)note {
93 NJMapping *current = note.object;
94 NSArray *mappings = self.mappingsController.mappings;
95 for (NSUInteger i = 0; i < mappings.count; ++i)
96 [dockMenuBase itemAtIndex:i + mappingsMenuIndex].state = mappings[i] == current;
97 }
98
99 - (void)chooseMapping:(id)sender {
100 NSInteger idx = [dockMenuBase indexOfItem:sender] - mappingsMenuIndex;
101 NJMapping *chosen = self.mappingsController[idx];
102 [_mappingsController activateMapping:chosen];
103 }
104
105 @end