forked from eczarny/spectacle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSpectacleApplicationController.m
130 lines (90 loc) · 4.21 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
125
126
127
128
129
130
#import "SpectacleApplicationController.h"
#import "SpectaclePreferencesController.h"
#import "SpectacleUtilities.h"
#import "SpectacleConstants.h"
@interface SpectacleApplicationController ()
@property (nonatomic) NSStatusItem *statusItem;
@property (nonatomic) SpectaclePreferencesController *preferencesController;
@end
#pragma mark -
@implementation SpectacleApplicationController
- (void)applicationDidFinishLaunching: (NSNotification *)notification {
NSNotificationCenter *notificationCenter = NSNotificationCenter.defaultCenter;
[SpectacleUtilities registerDefaultsForBundle: SpectacleUtilities.applicationBundle];
_preferencesController = [SpectaclePreferencesController new];
[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];
}
switch (SpectacleUtilities.spectacleTrust) {
case SpectacleIsNotTrustedBeforeMavericks:
[SpectacleUtilities displayAccessibilityAPIAlert];
break;
case SpectacleIsNotTrustedOnOrAfterMavericks:
[[NSApplication sharedApplication] runModalForWindow: _accessiblityAccessDialogWindow];
break;
default:
break;
}
}
#pragma mark -
- (BOOL)applicationShouldHandleReopen: (NSApplication *)application hasVisibleWindows: (BOOL)visibleWindows {
[self showPreferencesWindow: self];
return YES;
}
#pragma mark -
- (IBAction)showPreferencesWindow: (id)sender {
[_preferencesController showWindow: sender];
}
#pragma mark -
- (IBAction)openSystemPreferences: (id)sender {
NSURL *preferencePaneURL = [NSURL fileURLWithPath: [SpectacleUtilities pathForPreferencePaneNamed: SpectacleSecurityPreferencePaneName]];
NSBundle *applicationBundle = SpectacleUtilities.applicationBundle;
NSURL *scriptURL = [applicationBundle URLForResource: SpectacleSecurityAndPrivacyPreferencesScriptName withExtension: SpectacleAppleScriptFileExtension];
[NSApplication.sharedApplication stopModal];
[_accessiblityAccessDialogWindow orderOut: self];
if (![[[NSAppleScript alloc] initWithContentsOfURL: scriptURL error: nil] executeAndReturnError: nil]) {
[NSWorkspace.sharedWorkspace openURL: preferencePaneURL];
}
}
#pragma mark -
- (void)createStatusItem {
NSString *applicationVersion = SpectacleUtilities.applicationVersion;
_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength];
_statusItem.image = [SpectacleUtilities imageFromResource: SpectacleStatusItemIcon inBundle: SpectacleUtilities.applicationBundle];
_statusItem.alternateImage = [SpectacleUtilities imageFromResource: SpectacleAlternateStatusItemIcon inBundle: SpectacleUtilities.applicationBundle];
_statusItem.highlightMode = YES;
if (applicationVersion) {
_statusItem.toolTip = [NSString stringWithFormat: @"Spectacle %@", applicationVersion];
} else {
_statusItem.toolTip = @"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