forked from eczarny/spectacle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SpectacleApplicationController.m
124 lines (81 loc) · 3.55 KB
/
SpectacleApplicationController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#import "SpectacleApplicationController.h"
#import "SpectaclePreferencesController.h"
#import "SpectacleUtilities.h"
#import "SpectacleConstants.h"
@interface SpectacleApplicationController (SpectacleApplicationControllerPrivate)
- (void)createStatusItem;
- (void)destroyStatusItem;
#pragma mark -
- (void)enableStatusItem: (NSNotification *)notification;
- (void)disableStatusItem: (NSNotification *)notification;
#pragma mark -
- (void)menuDidSendAction: (NSNotification *)notification;
@end
#pragma mark -
@implementation SpectacleApplicationController
- (void)applicationDidFinishLaunching: (NSNotification *)notification {
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[SpectacleUtilities registerDefaultsForBundle: [SpectacleUtilities applicationBundle]];
preferencesController = [SpectaclePreferencesController new];
if (!AXAPIEnabled()) {
[SpectacleUtilities displayAccessibilityAPIAlert];
[[NSApplication sharedApplication] terminate: self];
return;
}
[self registerHotKeys];
[notificationCenter addObserver: self
selector: @selector(enableStatusItem:)
name: SpectacleStatusItemEnabledNotification
object: nil];
[notificationCenter addObserver: self
selector: @selector(disableStatusItem:)
name: SpectacleStatusItemDisabledNotification
object: nil];
[notificationCenter addObserver: self
selector: @selector(menuDidSendAction:)
name: NSMenuDidSendActionNotification
object: nil];
if ([[NSUserDefaults standardUserDefaults] boolForKey: SpectacleStatusItemEnabledPreference]) {
[self createStatusItem];
}
}
#pragma mark -
- (BOOL)applicationShouldHandleReopen: (NSApplication *)application hasVisibleWindows: (BOOL)visibleWindows {
[self showPreferencesWindow: self];
return YES;
}
#pragma mark -
- (IBAction)showPreferencesWindow: (id)sender {
[preferencesController showWindow: sender];
}
@end
#pragma mark -
@implementation SpectacleApplicationController (SpectacleApplicationControllerPrivate)
- (void)createStatusItem {
NSString *applicationVersion = [SpectacleUtilities applicationVersion];
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength];
[statusItem setImage: [SpectacleUtilities imageFromResource: SpectacleStatusItemIcon inBundle: [SpectacleUtilities applicationBundle]]];
[statusItem setAlternateImage: [SpectacleUtilities imageFromResource: SpectacleAlternateStatusItemIcon inBundle: [SpectacleUtilities applicationBundle]]];
[statusItem setHighlightMode: YES];
if (applicationVersion) {
[statusItem setToolTip: [NSString stringWithFormat: @"Spectacle %@", applicationVersion]];
} else {
[statusItem setToolTip: @"Spectacle"];
}
[statusItem setMenu: statusItemMenu];
}
- (void)destroyStatusItem {
[[NSStatusBar systemStatusBar] removeStatusItem: statusItem];
}
#pragma mark -
- (void)enableStatusItem: (NSNotification *)notification {
[self createStatusItem];
}
- (void)disableStatusItem: (NSNotification *)notification {
[self destroyStatusItem];
}
#pragma mark -
- (void)menuDidSendAction: (NSNotification *)notification {
[[NSApplication sharedApplication] activateIgnoringOtherApps: YES];
}
@end