aboutsummaryrefslogtreecommitdiffstats
path: root/Low Battery Yup
diff options
context:
space:
mode:
Diffstat (limited to 'Low Battery Yup')
-rw-r--r--Low Battery Yup/AppDelegate.h11
-rw-r--r--Low Battery Yup/AppDelegate.m39
-rw-r--r--Low Battery Yup/DaemonLauncher.h17
-rw-r--r--Low Battery Yup/DaemonLauncher.m59
-rw-r--r--Low Battery Yup/LaunchAgentManager.h20
-rw-r--r--Low Battery Yup/LaunchAgentManager.m52
-rw-r--r--Low Battery Yup/com.teddywing.Low-Battery-Yup.StartAtLogin.plist17
-rw-r--r--Low Battery Yup/en.lproj/MainMenu.xib185
8 files changed, 397 insertions, 3 deletions
diff --git a/Low Battery Yup/AppDelegate.h b/Low Battery Yup/AppDelegate.h
index 3998e46..0504102 100644
--- a/Low Battery Yup/AppDelegate.h
+++ b/Low Battery Yup/AppDelegate.h
@@ -9,10 +9,21 @@
#import <Cocoa/Cocoa.h>
#import <MASShortcut/MASShortcut.h>
#import "ShortcutView.h"
+#import "LaunchAgentManager.h"
+#import "DaemonLauncher.h"
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSWindow *window;
IBOutlet ShortcutView *_shortcut_view;
+ IBOutlet NSButton *_start_at_login;
+ IBOutlet NSButton *_launch_app;
+
+ LaunchAgentManager *_launchagent;
+ DaemonLauncher *_daemon_launcher;
}
+- (void)initializeShortcutView;
+- (IBAction)performStartAtLogin:(id)sender;
+- (IBAction)launchOrQuitDaemon:(id)sender;
+
@end
diff --git a/Low Battery Yup/AppDelegate.m b/Low Battery Yup/AppDelegate.m
index 83d03ae..69081ca 100644
--- a/Low Battery Yup/AppDelegate.m
+++ b/Low Battery Yup/AppDelegate.m
@@ -11,13 +11,32 @@
@implementation AppDelegate
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ _launchagent = [[LaunchAgentManager alloc] init];
+ _daemon_launcher = [[DaemonLauncher alloc] init];
+ }
+ return self;
+}
+
- (void)dealloc
{
+ [_launchagent release];
+ [_daemon_launcher release];
[super dealloc];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
+ [self initializeShortcutView];
+ [self performStartAtLogin:self];
+ [_launch_app setState:[_daemon_launcher isRunning]];
+}
+
+- (void)initializeShortcutView
+{
NSDictionary *saved_shortcut;
if ((saved_shortcut = [[NSUserDefaults standardUserDefaults] objectForKey:kPreferenceGlobalShortcut])) {
MASShortcut *shortcut = [MASShortcut
@@ -28,6 +47,26 @@
}
}
+- (IBAction)performStartAtLogin:(id)sender
+{
+ if ([_start_at_login state] == NSOnState) {
+ [_launchagent install];
+ }
+ else {
+ [_launchagent uninstall];
+ }
+}
+
+- (IBAction)launchOrQuitDaemon:(id)sender
+{
+ if ([_launch_app state]) {
+ [_daemon_launcher launch];
+ }
+ else {
+ [_daemon_launcher quit];
+ }
+}
+
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{
return YES;
diff --git a/Low Battery Yup/DaemonLauncher.h b/Low Battery Yup/DaemonLauncher.h
new file mode 100644
index 0000000..586dbda
--- /dev/null
+++ b/Low Battery Yup/DaemonLauncher.h
@@ -0,0 +1,17 @@
+//
+// DaemonLauncher.h
+// Low Battery Yup.d
+//
+// Created by TW on 12/2/16.
+// Copyright (c) 2016 TW. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface DaemonLauncher : NSObject
+
+- (BOOL)launch;
+- (BOOL)quit;
+- (BOOL)isRunning;
+
+@end
diff --git a/Low Battery Yup/DaemonLauncher.m b/Low Battery Yup/DaemonLauncher.m
new file mode 100644
index 0000000..355e9fd
--- /dev/null
+++ b/Low Battery Yup/DaemonLauncher.m
@@ -0,0 +1,59 @@
+//
+// DaemonLauncher.m
+// Low Battery Yup.d
+//
+// Created by TW on 12/2/16.
+// Copyright (c) 2016 TW. All rights reserved.
+//
+
+#import "DaemonLauncher.h"
+
+@implementation DaemonLauncher
+
+- (BOOL)launch
+{
+ NSURL *daemon_url = [[NSBundle mainBundle] URLForResource:@"Low Battery Yup.d" withExtension:@"app"];
+
+ NSError *error = nil;
+ [[NSWorkspace sharedWorkspace]
+ launchApplicationAtURL:daemon_url
+ options:NSWorkspaceLaunchWithoutAddingToRecents | NSWorkspaceLaunchWithoutActivation
+ configuration:nil
+ error:&error];
+
+ if (error != nil) {
+ NSLog(@"%@", error);
+ return NO;
+ }
+
+ return YES;
+}
+
+- (BOOL)quit
+{
+ NSArray *applications = [NSRunningApplication
+ runningApplicationsWithBundleIdentifier:@"com.teddywing.Low-Battery-Yup-d"];
+
+ if ([applications count] > 0) {
+ NSRunningApplication *daemon = [applications objectAtIndex:0];
+ return [daemon terminate];
+ }
+
+ return NO;
+}
+
+- (BOOL)isRunning
+{
+ NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
+
+ for (int i = 0; i < [runningApplications count]; i++) {
+ if ([[[runningApplications objectAtIndex:i] bundleIdentifier]
+ isEqualToString:@"com.teddywing.Low-Battery-Yup-d"]) {
+ return YES;
+ }
+ }
+
+ return NO;
+}
+
+@end
diff --git a/Low Battery Yup/LaunchAgentManager.h b/Low Battery Yup/LaunchAgentManager.h
new file mode 100644
index 0000000..5a9fa44
--- /dev/null
+++ b/Low Battery Yup/LaunchAgentManager.h
@@ -0,0 +1,20 @@
+//
+// LaunchAgentManager.h
+// Low Battery Yup.d
+//
+// Created by TW on 12/2/16.
+// Copyright (c) 2016 TW. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#define LAUNCH_AGENTS_PATH @"~/Library/LaunchAgents"
+
+@interface LaunchAgentManager : NSObject {
+ NSFileManager *_file_manager;
+}
+
+- (BOOL)install;
+- (BOOL)uninstall;
+
+@end
diff --git a/Low Battery Yup/LaunchAgentManager.m b/Low Battery Yup/LaunchAgentManager.m
new file mode 100644
index 0000000..fd75795
--- /dev/null
+++ b/Low Battery Yup/LaunchAgentManager.m
@@ -0,0 +1,52 @@
+//
+// LaunchAgentManager.m
+// Low Battery Yup.d
+//
+// Created by TW on 12/2/16.
+// Copyright (c) 2016 TW. All rights reserved.
+//
+
+#import "LaunchAgentManager.h"
+
+@implementation LaunchAgentManager
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ _file_manager = [NSFileManager defaultManager];
+ }
+ return self;
+}
+
+- (BOOL)install
+{
+ NSBundle *main_bundle = [NSBundle mainBundle];
+ NSURL *launchagents_url = [NSURL fileURLWithPath:
+ [[LAUNCH_AGENTS_PATH stringByAppendingString:@"/com.teddywing.Low-Battery-Yup.StartAtLogin.plist"] stringByExpandingTildeInPath]
+ isDirectory:YES];
+
+ NSError *error;
+ BOOL success = [_file_manager copyItemAtURL:
+ [main_bundle URLForResource:@"com.teddywing.Low-Battery-Yup.StartAtLogin" withExtension:@"plist"]
+ toURL:launchagents_url
+ error:&error];
+
+ if (!success) {
+ NSLog(@"%@", error);
+ }
+
+ return success;
+}
+
+- (BOOL)uninstall
+{
+ return [[NSWorkspace sharedWorkspace]
+ performFileOperation:NSWorkspaceRecycleOperation
+ source:[LAUNCH_AGENTS_PATH stringByExpandingTildeInPath]
+ destination:@""
+ files:[NSArray arrayWithObject:@"com.teddywing.Low-Battery-Yup.StartAtLogin.plist"]
+ tag:nil];
+}
+
+@end
diff --git a/Low Battery Yup/com.teddywing.Low-Battery-Yup.StartAtLogin.plist b/Low Battery Yup/com.teddywing.Low-Battery-Yup.StartAtLogin.plist
new file mode 100644
index 0000000..37ece9c
--- /dev/null
+++ b/Low Battery Yup/com.teddywing.Low-Battery-Yup.StartAtLogin.plist
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>Label</key>
+ <string>com.teddywing.Low-Battery-Yup.StartAtLogin</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>/usr/bin/open</string>
+ <string>/Applications/Low Battery Yup.app/Contents/Resources/Low Battery Yup.d.app</string>
+ </array>
+ <key>LimitLoadToSessionType</key>
+ <string>Aqua</string>
+ <key>RunAtLoad</key>
+ <true/>
+</dict>
+</plist>
diff --git a/Low Battery Yup/en.lproj/MainMenu.xib b/Low Battery Yup/en.lproj/MainMenu.xib
index 4b01316..f8f0d64 100644
--- a/Low Battery Yup/en.lproj/MainMenu.xib
+++ b/Low Battery Yup/en.lproj/MainMenu.xib
@@ -11,10 +11,13 @@
<string key="NS.object.0">2844</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
+ <string>NSButton</string>
+ <string>NSButtonCell</string>
<string>NSCustomObject</string>
<string>NSCustomView</string>
<string>NSMenu</string>
<string>NSMenuItem</string>
+ <string>NSUserDefaultsController</string>
<string>NSView</string>
<string>NSWindowTemplate</string>
</array>
@@ -1308,19 +1311,81 @@
<object class="NSCustomView" id="489226571">
<reference key="NSNextResponder" ref="439893737"/>
<int key="NSvFlags">268</int>
- <string key="NSFrame">{{84, 83}, {313, 19}}</string>
+ <string key="NSFrame">{{84, 100}, {313, 19}}</string>
<reference key="NSSuperview" ref="439893737"/>
<reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="1065652370"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSClassName">ShortcutView</string>
</object>
+ <object class="NSButton" id="1065652370">
+ <reference key="NSNextResponder" ref="439893737"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{82, 32}, {104, 18}}</string>
+ <reference key="NSSuperview" ref="439893737"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="452223334"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="508243847">
+ <int key="NSCellFlags">-2080374784</int>
+ <int key="NSCellFlags2">268435456</int>
+ <string key="NSContents">Start at login</string>
+ <object class="NSFont" key="NSSupport" id="380350173">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <string key="NSCellIdentifier">_NS:9</string>
+ <reference key="NSControlView" ref="1065652370"/>
+ <int key="NSButtonFlags">1211912448</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSCustomResource" key="NSNormalImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSSwitch</string>
+ </object>
+ <object class="NSButtonImageSource" key="NSAlternateImage">
+ <string key="NSImageName">NSSwitch</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ </object>
+ <object class="NSButton" id="452223334">
+ <reference key="NSNextResponder" ref="439893737"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{242, 24}, {161, 32}}</string>
+ <reference key="NSSuperview" ref="439893737"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="622792239">
+ <int key="NSCellFlags">67108864</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Launch Application</string>
+ <reference key="NSSupport" ref="380350173"/>
+ <string key="NSCellIdentifier">_NS:9</string>
+ <reference key="NSControlView" ref="452223334"/>
+ <int key="NSButtonFlags">-930988032</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents">Quit Application</string>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ </object>
</array>
<string key="NSFrameSize">{480, 185}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="489226571"/>
</object>
- <string key="NSScreenRect">{{0, 0}, {2560, 1578}}</string>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
<string key="NSMinSize">{480, 207}</string>
<string key="NSMaxSize">{480, 207}</string>
<bool key="NSWindowIsRestorable">YES</bool>
@@ -1331,6 +1396,9 @@
<object class="NSCustomObject" id="755631768">
<string key="NSClassName">NSFontManager</string>
</object>
+ <object class="NSUserDefaultsController" id="453441597">
+ <bool key="NSSharedInstance">YES</bool>
+ </object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
@@ -2022,6 +2090,54 @@
</object>
<int key="connectionID">541</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">_start_at_login</string>
+ <reference key="source" ref="976324537"/>
+ <reference key="destination" ref="1065652370"/>
+ </object>
+ <int key="connectionID">544</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performStartAtLogin:</string>
+ <reference key="source" ref="976324537"/>
+ <reference key="destination" ref="1065652370"/>
+ </object>
+ <int key="connectionID">545</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">launchOrQuitDaemon:</string>
+ <reference key="source" ref="976324537"/>
+ <reference key="destination" ref="452223334"/>
+ </object>
+ <int key="connectionID">555</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">_launch_app</string>
+ <reference key="source" ref="976324537"/>
+ <reference key="destination" ref="452223334"/>
+ </object>
+ <int key="connectionID">556</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: values.StartAtLogin</string>
+ <reference key="source" ref="1065652370"/>
+ <reference key="destination" ref="453441597"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="1065652370"/>
+ <reference key="NSDestination" ref="453441597"/>
+ <string key="NSLabel">value: values.StartAtLogin</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">values.StartAtLogin</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">552</int>
+ </object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
@@ -2547,7 +2663,9 @@
<int key="objectID">372</int>
<reference key="object" ref="439893737"/>
<array class="NSMutableArray" key="children">
+ <reference ref="1065652370"/>
<reference ref="489226571"/>
+ <reference ref="452223334"/>
</array>
<reference key="parent" ref="972006081"/>
</object>
@@ -3029,6 +3147,37 @@
<reference key="object" ref="489226571"/>
<reference key="parent" ref="439893737"/>
</object>
+ <object class="IBObjectRecord">
+ <int key="objectID">542</int>
+ <reference key="object" ref="1065652370"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="508243847"/>
+ </array>
+ <reference key="parent" ref="439893737"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">543</int>
+ <reference key="object" ref="508243847"/>
+ <reference key="parent" ref="1065652370"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">546</int>
+ <reference key="object" ref="453441597"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">553</int>
+ <reference key="object" ref="452223334"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="622792239"/>
+ </array>
+ <reference key="parent" ref="439893737"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">554</int>
+ <reference key="object" ref="622792239"/>
+ <reference key="parent" ref="452223334"/>
+ </object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -3175,6 +3324,11 @@
<string key="517.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="534.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="542.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="546.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="553.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="554.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3194,24 +3348,48 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
- <int key="maxID">541</int>
+ <int key="maxID">559</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">AppDelegate</string>
<string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="launchOrQuitDaemon:">id</string>
+ <string key="performStartAtLogin:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="launchOrQuitDaemon:">
+ <string key="name">launchOrQuitDaemon:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="performStartAtLogin:">
+ <string key="name">performStartAtLogin:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
<dictionary class="NSMutableDictionary" key="outlets">
+ <string key="_launch_app">NSButton</string>
<string key="_shortcut_view">ShortcutView</string>
+ <string key="_start_at_login">NSButton</string>
<string key="customShortcutView">MASShortcutView</string>
<string key="feedbackTextField">NSTextField</string>
<string key="window">NSWindow</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="_launch_app">
+ <string key="name">_launch_app</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
<object class="IBToOneOutletInfo" key="_shortcut_view">
<string key="name">_shortcut_view</string>
<string key="candidateClassName">ShortcutView</string>
</object>
+ <object class="IBToOneOutletInfo" key="_start_at_login">
+ <string key="name">_start_at_login</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
<object class="IBToOneOutletInfo" key="customShortcutView">
<string key="name">customShortcutView</string>
<string key="candidateClassName">MASShortcutView</string>
@@ -3255,6 +3433,7 @@
<dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
<string key="NSMenuCheckmark">{11, 11}</string>
<string key="NSMenuMixedState">{10, 3}</string>
+ <string key="NSSwitch">{15, 15}</string>
</dictionary>
</data>
</archive>