├── Dash.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── README.md
└── Dash
├── ViewController.h
├── main.m
├── AppDelegate.h
├── FSWatcher.h
├── Dash.entitlements
├── Assets.xcassets
└── AppIcon.appiconset
│ └── Contents.json
├── FSWatcher.m
├── Info.plist
├── AppDelegate.m
├── ViewController.m
└── Main.storyboard
/Dash.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Dash
2 |
3 | Dash displays a local, noninteractive web page (from `~/Library/Application Support/Dash/index.html`) on your Desktop. The page can have a transparent background, and it’s reloaded whenever a file in its directory changes.
4 |
--------------------------------------------------------------------------------
/Dash/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // Dash
4 | //
5 | // Created by Sidney on 8/18/17.
6 | // Copyright © 2017 Sidney San Martín. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : NSViewController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Dash/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // Dash
4 | //
5 | // Created by Sidney on 8/18/17.
6 | // Copyright © 2017 Sidney San Martín. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | int main(int argc, const char * argv[]) {
12 | return NSApplicationMain(argc, argv);
13 | }
14 |
--------------------------------------------------------------------------------
/Dash/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // Dash
4 | //
5 | // Created by Sidney on 8/18/17.
6 | // Copyright © 2017 Sidney San Martín. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : NSObject
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Dash/FSWatcher.h:
--------------------------------------------------------------------------------
1 | //
2 | // FSWatcher.h
3 | // Dash
4 | //
5 | // Created by Sidney on 8/18/17.
6 | // Copyright © 2017 Sidney San Martín. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface FSWatcher : NSObject
12 | - (instancetype)initWithPaths:(NSArray*)paths cb:(void(^)(void))cb;
13 | @end
14 |
--------------------------------------------------------------------------------
/Dash/Dash.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Dash/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/Dash/FSWatcher.m:
--------------------------------------------------------------------------------
1 | //
2 | // FSWatcher.m
3 | // Dash
4 | //
5 | // Created by Sidney on 8/18/17.
6 | // Copyright © 2017 Sidney San Martín. All rights reserved.
7 | //
8 |
9 | #import "FSWatcher.h"
10 |
11 | @implementation FSWatcher {
12 | void(^_cb)(void);
13 | FSEventStreamRef _stream;
14 | }
15 |
16 | void fsCallback(ConstFSEventStreamRef streamRef, void * clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags * eventFlags, const FSEventStreamEventId * eventIds) {
17 | ((__bridge FSWatcher*)clientCallBackInfo)->_cb();
18 | }
19 |
20 | - (instancetype)initWithPaths:(NSArray*)paths cb:(void(^)(void))cb {
21 | if ((self = [super init])) {
22 | _cb = cb;
23 | FSEventStreamContext context = {0};
24 | context.info = (__bridge void*)self;
25 | _stream = FSEventStreamCreate(nil, &fsCallback, &context, (__bridge CFArrayRef)paths, kFSEventStreamEventIdSinceNow, 0.1, kFSEventStreamCreateFlagNone);
26 | FSEventStreamScheduleWithRunLoop(_stream, CFRunLoopGetMain(), kCFRunLoopCommonModes);
27 | FSEventStreamStart(_stream);
28 | }
29 | return self;
30 | }
31 |
32 | - (void)dealloc {
33 | FSEventStreamRelease(_stream);
34 | }
35 | @end
36 |
--------------------------------------------------------------------------------
/Dash/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2017 Sidney San Martín. All rights reserved.
27 | NSMainStoryboardFile
28 | Main
29 | LSBackgroundOnly
30 |
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/Dash/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // Dash
4 | //
5 | // Created by Sidney on 8/18/17.
6 | // Copyright © 2017 Sidney San Martín. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 | #import "ViewController.h"
11 |
12 | @interface FullScreenWindow: NSWindow
13 | @end
14 |
15 | @implementation FullScreenWindow
16 | - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen {
17 | return NSScreen.mainScreen.frame;
18 | }
19 | @end
20 |
21 | @interface AppDelegate ()
22 |
23 | @end
24 |
25 | @implementation AppDelegate {
26 | ViewController* _vc;
27 | FullScreenWindow* _window;
28 | }
29 |
30 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
31 | _vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
32 | _window = [[FullScreenWindow alloc] initWithContentRect:NSZeroRect
33 | styleMask:NSWindowStyleMaskBorderless
34 | backing:NSBackingStoreBuffered
35 | defer:YES];
36 | _window.backgroundColor = NSColor.clearColor;
37 | _window.opaque = NO;
38 | _window.level = kCGDesktopWindowLevel;
39 | _window.ignoresMouseEvents = YES;
40 | _window.collectionBehavior = NSWindowCollectionBehaviorStationary;
41 | _window.contentView = _vc.view;
42 | _window.contentView.wantsLayer = YES;
43 | [_window orderBack:nil];
44 | }
45 | @end
46 |
--------------------------------------------------------------------------------
/Dash/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // Dash
4 | //
5 | // Created by Sidney on 8/18/17.
6 | // Copyright © 2017 Sidney San Martín. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import "FSWatcher.h"
11 |
12 | @import WebKit;
13 |
14 | NSURL* supportDirectory;
15 | NSURL* page;
16 |
17 | /*
18 | private let supportDirectory = try! defaultFileManager
19 | .URLForDirectory(
20 | .ApplicationSupportDirectory,
21 | inDomain: .UserDomainMask,
22 | appropriateForURL: nil,
23 | create: true
24 | )
25 | .URLByAppendingPathComponent(NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleNameKey as String) as! String)
26 | private let page = supportDirectory.URLByAppendingPathComponent("index.html")
27 | */
28 |
29 | @implementation ViewController {
30 | WebView* _webView;
31 | FSWatcher* _fsWatcher;
32 | }
33 |
34 | + (void)initialize {
35 | NSFileManager* fileManager = NSFileManager.defaultManager;
36 | NSError* err = nil;
37 | supportDirectory = [[fileManager URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&err] URLByAppendingPathComponent:[NSBundle.mainBundle objectForInfoDictionaryKey:(NSString*)kCFBundleNameKey]];
38 | if (err) {
39 | [[NSAlert alertWithError:err] runModal];
40 | [NSApp terminate:nil];
41 | }
42 | page = [supportDirectory URLByAppendingPathComponent:@"index.html"];
43 |
44 | }
45 |
46 | - (void)loadView {
47 | _webView = [[WebView alloc] initWithFrame:NSZeroRect];
48 | _webView.drawsBackground = NO;
49 | self.view = _webView;
50 | __weak ViewController* weakSelf = self;
51 | _fsWatcher = [[FSWatcher alloc] initWithPaths:@[supportDirectory.path] cb:^{
52 | [weakSelf reload];
53 | }];
54 | [self reload];
55 | }
56 |
57 | - (void)reload {
58 | NSFileManager* fileManager = NSFileManager.defaultManager;
59 | if (![fileManager fileExistsAtPath:page.path]) {
60 | [fileManager createDirectoryAtURL:supportDirectory withIntermediateDirectories:YES attributes:nil error:nil];
61 | [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
62 | [NSApp activateIgnoringOtherApps:YES];
63 | NSAlert* alert = [[NSAlert alloc] init];
64 | alert.messageText = @"Missing index.html";
65 | alert.informativeText = @"Dash needs a file called “index.html”.";
66 | [alert addButtonWithTitle:@"Quit"];
67 | [alert addButtonWithTitle:@"Show Folder"];
68 | if ([alert runModal] == NSAlertSecondButtonReturn) {
69 | [NSWorkspace.sharedWorkspace openURL:supportDirectory];
70 | }
71 | [NSApp terminate:nil];
72 | }
73 | [_webView.mainFrame loadRequest:[NSURLRequest requestWithURL:page]];
74 | }
75 | @end
76 |
--------------------------------------------------------------------------------
/Dash.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 48;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | E92CA7C91F47EC5900A99160 /* FSWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = E92CA7C81F47EC5900A99160 /* FSWatcher.m */; };
11 | E92CA7EB1F47F29800A99160 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E92CA7EA1F47F24C00A99160 /* Main.storyboard */; };
12 | E9B72C561F4732740019D9AE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B72C551F4732740019D9AE /* AppDelegate.m */; };
13 | E9B72C591F4732740019D9AE /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B72C581F4732740019D9AE /* ViewController.m */; };
14 | E9B72C5B1F4732740019D9AE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E9B72C5A1F4732740019D9AE /* Assets.xcassets */; };
15 | E9B72C611F4732740019D9AE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B72C601F4732740019D9AE /* main.m */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXFileReference section */
19 | E92CA7C71F47EC5900A99160 /* FSWatcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FSWatcher.h; sourceTree = ""; };
20 | E92CA7C81F47EC5900A99160 /* FSWatcher.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FSWatcher.m; sourceTree = ""; };
21 | E92CA7EA1F47F24C00A99160 /* Main.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; };
22 | E9B72C511F4732740019D9AE /* Dash.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Dash.app; sourceTree = BUILT_PRODUCTS_DIR; };
23 | E9B72C541F4732740019D9AE /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
24 | E9B72C551F4732740019D9AE /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
25 | E9B72C571F4732740019D9AE /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
26 | E9B72C581F4732740019D9AE /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
27 | E9B72C5A1F4732740019D9AE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
28 | E9B72C5F1F4732740019D9AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
29 | E9B72C601F4732740019D9AE /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
30 | E9B72C621F4732740019D9AE /* Dash.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Dash.entitlements; sourceTree = ""; };
31 | /* End PBXFileReference section */
32 |
33 | /* Begin PBXFrameworksBuildPhase section */
34 | E9B72C4E1F4732740019D9AE /* Frameworks */ = {
35 | isa = PBXFrameworksBuildPhase;
36 | buildActionMask = 2147483647;
37 | files = (
38 | );
39 | runOnlyForDeploymentPostprocessing = 0;
40 | };
41 | /* End PBXFrameworksBuildPhase section */
42 |
43 | /* Begin PBXGroup section */
44 | E9B72C481F4732740019D9AE = {
45 | isa = PBXGroup;
46 | children = (
47 | E9B72C531F4732740019D9AE /* Dash */,
48 | E9B72C521F4732740019D9AE /* Products */,
49 | );
50 | sourceTree = "";
51 | };
52 | E9B72C521F4732740019D9AE /* Products */ = {
53 | isa = PBXGroup;
54 | children = (
55 | E9B72C511F4732740019D9AE /* Dash.app */,
56 | );
57 | name = Products;
58 | sourceTree = "";
59 | };
60 | E9B72C531F4732740019D9AE /* Dash */ = {
61 | isa = PBXGroup;
62 | children = (
63 | E9B72C541F4732740019D9AE /* AppDelegate.h */,
64 | E9B72C551F4732740019D9AE /* AppDelegate.m */,
65 | E92CA7C71F47EC5900A99160 /* FSWatcher.h */,
66 | E92CA7C81F47EC5900A99160 /* FSWatcher.m */,
67 | E9B72C571F4732740019D9AE /* ViewController.h */,
68 | E9B72C581F4732740019D9AE /* ViewController.m */,
69 | E9B72C5A1F4732740019D9AE /* Assets.xcassets */,
70 | E92CA7EA1F47F24C00A99160 /* Main.storyboard */,
71 | E9B72C5F1F4732740019D9AE /* Info.plist */,
72 | E9B72C601F4732740019D9AE /* main.m */,
73 | E9B72C621F4732740019D9AE /* Dash.entitlements */,
74 | );
75 | path = Dash;
76 | sourceTree = "";
77 | };
78 | /* End PBXGroup section */
79 |
80 | /* Begin PBXNativeTarget section */
81 | E9B72C501F4732740019D9AE /* Dash */ = {
82 | isa = PBXNativeTarget;
83 | buildConfigurationList = E9B72C651F4732740019D9AE /* Build configuration list for PBXNativeTarget "Dash" */;
84 | buildPhases = (
85 | E9B72C4D1F4732740019D9AE /* Sources */,
86 | E9B72C4E1F4732740019D9AE /* Frameworks */,
87 | E9B72C4F1F4732740019D9AE /* Resources */,
88 | );
89 | buildRules = (
90 | );
91 | dependencies = (
92 | );
93 | name = Dash;
94 | productName = Dash;
95 | productReference = E9B72C511F4732740019D9AE /* Dash.app */;
96 | productType = "com.apple.product-type.application";
97 | };
98 | /* End PBXNativeTarget section */
99 |
100 | /* Begin PBXProject section */
101 | E9B72C491F4732740019D9AE /* Project object */ = {
102 | isa = PBXProject;
103 | attributes = {
104 | LastUpgradeCheck = 0900;
105 | ORGANIZATIONNAME = "Sidney San Martín";
106 | TargetAttributes = {
107 | E9B72C501F4732740019D9AE = {
108 | CreatedOnToolsVersion = 9.0;
109 | };
110 | };
111 | };
112 | buildConfigurationList = E9B72C4C1F4732740019D9AE /* Build configuration list for PBXProject "Dash" */;
113 | compatibilityVersion = "Xcode 8.0";
114 | developmentRegion = en;
115 | hasScannedForEncodings = 0;
116 | knownRegions = (
117 | en,
118 | Base,
119 | );
120 | mainGroup = E9B72C481F4732740019D9AE;
121 | productRefGroup = E9B72C521F4732740019D9AE /* Products */;
122 | projectDirPath = "";
123 | projectRoot = "";
124 | targets = (
125 | E9B72C501F4732740019D9AE /* Dash */,
126 | );
127 | };
128 | /* End PBXProject section */
129 |
130 | /* Begin PBXResourcesBuildPhase section */
131 | E9B72C4F1F4732740019D9AE /* Resources */ = {
132 | isa = PBXResourcesBuildPhase;
133 | buildActionMask = 2147483647;
134 | files = (
135 | E9B72C5B1F4732740019D9AE /* Assets.xcassets in Resources */,
136 | E92CA7EB1F47F29800A99160 /* Main.storyboard in Resources */,
137 | );
138 | runOnlyForDeploymentPostprocessing = 0;
139 | };
140 | /* End PBXResourcesBuildPhase section */
141 |
142 | /* Begin PBXSourcesBuildPhase section */
143 | E9B72C4D1F4732740019D9AE /* Sources */ = {
144 | isa = PBXSourcesBuildPhase;
145 | buildActionMask = 2147483647;
146 | files = (
147 | E9B72C591F4732740019D9AE /* ViewController.m in Sources */,
148 | E92CA7C91F47EC5900A99160 /* FSWatcher.m in Sources */,
149 | E9B72C611F4732740019D9AE /* main.m in Sources */,
150 | E9B72C561F4732740019D9AE /* AppDelegate.m in Sources */,
151 | );
152 | runOnlyForDeploymentPostprocessing = 0;
153 | };
154 | /* End PBXSourcesBuildPhase section */
155 |
156 | /* Begin XCBuildConfiguration section */
157 | E9B72C631F4732740019D9AE /* Debug */ = {
158 | isa = XCBuildConfiguration;
159 | buildSettings = {
160 | ALWAYS_SEARCH_USER_PATHS = NO;
161 | CLANG_ANALYZER_NONNULL = YES;
162 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
163 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
164 | CLANG_CXX_LIBRARY = "libc++";
165 | CLANG_ENABLE_MODULES = YES;
166 | CLANG_ENABLE_OBJC_ARC = YES;
167 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
168 | CLANG_WARN_BOOL_CONVERSION = YES;
169 | CLANG_WARN_COMMA = YES;
170 | CLANG_WARN_CONSTANT_CONVERSION = YES;
171 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
172 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
173 | CLANG_WARN_EMPTY_BODY = YES;
174 | CLANG_WARN_ENUM_CONVERSION = YES;
175 | CLANG_WARN_INFINITE_RECURSION = YES;
176 | CLANG_WARN_INT_CONVERSION = YES;
177 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
178 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
179 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
180 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
181 | CLANG_WARN_STRICT_PROTOTYPES = YES;
182 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
183 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
184 | CLANG_WARN_UNREACHABLE_CODE = YES;
185 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
186 | CODE_SIGN_IDENTITY = "-";
187 | COPY_PHASE_STRIP = NO;
188 | DEBUG_INFORMATION_FORMAT = dwarf;
189 | ENABLE_STRICT_OBJC_MSGSEND = YES;
190 | ENABLE_TESTABILITY = YES;
191 | GCC_C_LANGUAGE_STANDARD = gnu11;
192 | GCC_DYNAMIC_NO_PIC = NO;
193 | GCC_NO_COMMON_BLOCKS = YES;
194 | GCC_OPTIMIZATION_LEVEL = 0;
195 | GCC_PREPROCESSOR_DEFINITIONS = (
196 | "DEBUG=1",
197 | "$(inherited)",
198 | );
199 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
200 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
201 | GCC_WARN_UNDECLARED_SELECTOR = YES;
202 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
203 | GCC_WARN_UNUSED_FUNCTION = YES;
204 | GCC_WARN_UNUSED_VARIABLE = YES;
205 | MACOSX_DEPLOYMENT_TARGET = 10.13;
206 | MTL_ENABLE_DEBUG_INFO = YES;
207 | ONLY_ACTIVE_ARCH = YES;
208 | SDKROOT = macosx;
209 | };
210 | name = Debug;
211 | };
212 | E9B72C641F4732740019D9AE /* Release */ = {
213 | isa = XCBuildConfiguration;
214 | buildSettings = {
215 | ALWAYS_SEARCH_USER_PATHS = NO;
216 | CLANG_ANALYZER_NONNULL = YES;
217 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
218 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
219 | CLANG_CXX_LIBRARY = "libc++";
220 | CLANG_ENABLE_MODULES = YES;
221 | CLANG_ENABLE_OBJC_ARC = YES;
222 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
223 | CLANG_WARN_BOOL_CONVERSION = YES;
224 | CLANG_WARN_COMMA = YES;
225 | CLANG_WARN_CONSTANT_CONVERSION = YES;
226 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
227 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
228 | CLANG_WARN_EMPTY_BODY = YES;
229 | CLANG_WARN_ENUM_CONVERSION = YES;
230 | CLANG_WARN_INFINITE_RECURSION = YES;
231 | CLANG_WARN_INT_CONVERSION = YES;
232 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
233 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
234 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
235 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
236 | CLANG_WARN_STRICT_PROTOTYPES = YES;
237 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
238 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
239 | CLANG_WARN_UNREACHABLE_CODE = YES;
240 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
241 | CODE_SIGN_IDENTITY = "-";
242 | COPY_PHASE_STRIP = NO;
243 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
244 | ENABLE_NS_ASSERTIONS = NO;
245 | ENABLE_STRICT_OBJC_MSGSEND = YES;
246 | GCC_C_LANGUAGE_STANDARD = gnu11;
247 | GCC_NO_COMMON_BLOCKS = YES;
248 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
249 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
250 | GCC_WARN_UNDECLARED_SELECTOR = YES;
251 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
252 | GCC_WARN_UNUSED_FUNCTION = YES;
253 | GCC_WARN_UNUSED_VARIABLE = YES;
254 | MACOSX_DEPLOYMENT_TARGET = 10.13;
255 | MTL_ENABLE_DEBUG_INFO = NO;
256 | SDKROOT = macosx;
257 | };
258 | name = Release;
259 | };
260 | E9B72C661F4732740019D9AE /* Debug */ = {
261 | isa = XCBuildConfiguration;
262 | buildSettings = {
263 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
264 | CODE_SIGN_ENTITLEMENTS = Dash/Dash.entitlements;
265 | COMBINE_HIDPI_IMAGES = YES;
266 | INFOPLIST_FILE = Dash/Info.plist;
267 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
268 | PRODUCT_BUNDLE_IDENTIFIER = us.s4y.Dash;
269 | PRODUCT_NAME = "$(TARGET_NAME)";
270 | };
271 | name = Debug;
272 | };
273 | E9B72C671F4732740019D9AE /* Release */ = {
274 | isa = XCBuildConfiguration;
275 | buildSettings = {
276 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
277 | CODE_SIGN_ENTITLEMENTS = Dash/Dash.entitlements;
278 | COMBINE_HIDPI_IMAGES = YES;
279 | INFOPLIST_FILE = Dash/Info.plist;
280 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
281 | PRODUCT_BUNDLE_IDENTIFIER = us.s4y.Dash;
282 | PRODUCT_NAME = "$(TARGET_NAME)";
283 | };
284 | name = Release;
285 | };
286 | /* End XCBuildConfiguration section */
287 |
288 | /* Begin XCConfigurationList section */
289 | E9B72C4C1F4732740019D9AE /* Build configuration list for PBXProject "Dash" */ = {
290 | isa = XCConfigurationList;
291 | buildConfigurations = (
292 | E9B72C631F4732740019D9AE /* Debug */,
293 | E9B72C641F4732740019D9AE /* Release */,
294 | );
295 | defaultConfigurationIsVisible = 0;
296 | defaultConfigurationName = Release;
297 | };
298 | E9B72C651F4732740019D9AE /* Build configuration list for PBXNativeTarget "Dash" */ = {
299 | isa = XCConfigurationList;
300 | buildConfigurations = (
301 | E9B72C661F4732740019D9AE /* Debug */,
302 | E9B72C671F4732740019D9AE /* Release */,
303 | );
304 | defaultConfigurationIsVisible = 0;
305 | defaultConfigurationName = Release;
306 | };
307 | /* End XCConfigurationList section */
308 | };
309 | rootObject = E9B72C491F4732740019D9AE /* Project object */;
310 | }
311 |
--------------------------------------------------------------------------------
/Dash/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
--------------------------------------------------------------------------------