├── .github
└── FUNDING.yml
├── .gitignore
├── LICENSE.txt
├── README.txt
├── NiblessMenu
├── main.swift
├── Info.plist
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
└── AppDelegate.swift
└── NiblessMenu.xcodeproj
└── project.pbxproj
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | custom: https://www.paypal.me/JeffJohnsonWI
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | DerivedData/
3 | project.xcworkspace/
4 | xcuserdata/
5 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | SHAG Software License Agreement
2 |
3 | If you use this source code in your app and become rich and famous while I linger in poverty and obscurity, I will Silently Hold A Grudge.
4 |
5 |
6 | NiblessMenu is Copyright © 2017 Jeff Johnson. All rights reserved.
7 |
--------------------------------------------------------------------------------
/README.txt:
--------------------------------------------------------------------------------
1 | NiblessMenu is sample code written in Swift demonstrating how to programmatically create the main menu in a Mac app, without using a nib or storyboard.
2 |
3 | See the LICENSE.txt file for the software license agreement.
4 |
5 | NiblessMenu is Copyright © 2017 Jeff Johnson. All rights reserved.
6 |
--------------------------------------------------------------------------------
/NiblessMenu/main.swift:
--------------------------------------------------------------------------------
1 | import Cocoa
2 |
3 | autoreleasepool {
4 | let delegate = AppDelegate()
5 | // NSApplication delegate is a weak reference,
6 | // so we have to make sure it's not deallocated.
7 | // In Objective-C you would use NS_VALID_UNTIL_END_OF_SCOPE
8 | withExtendedLifetime(delegate, {
9 | let application = NSApplication.shared
10 | application.delegate = delegate
11 | application.run()
12 | application.delegate = nil
13 | })
14 | }
15 |
--------------------------------------------------------------------------------
/NiblessMenu/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
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 Jeff Johnson. All rights reserved.
27 | NSPrincipalClass
28 | NSApplication
29 |
30 |
31 |
--------------------------------------------------------------------------------
/NiblessMenu/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 | }
--------------------------------------------------------------------------------
/NiblessMenu/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import Cocoa
2 |
3 | // Apparently these aren't declared anywhere
4 | @objc protocol EditMenuActions {
5 | func redo(_ sender:AnyObject)
6 | func undo(_ sender:AnyObject)
7 | }
8 |
9 | class AppDelegate:NSObject, NSApplicationDelegate
10 | {
11 | lazy var applicationName:String = {
12 | if let bundleName = Bundle.main.object(forInfoDictionaryKey:"CFBundleName") {
13 | if let bundleNameAsString = bundleName as? String {
14 | return bundleNameAsString
15 | }
16 | else {
17 | print("CFBundleName not a String!")
18 | }
19 | }
20 | else {
21 | print("CFBundleName nil!")
22 | }
23 |
24 | return NSLocalizedString("NiblessMenu", comment:"The name of this application")
25 | }()
26 |
27 | func applicationWillFinishLaunching(_ notification:Notification) {
28 | populateMainMenu()
29 | }
30 |
31 | func populateMainMenu() {
32 | let mainMenu = NSMenu(title:"MainMenu")
33 |
34 | // The titles of the menu items are for identification purposes only and shouldn't be localized.
35 | // The strings in the menu bar come from the submenu titles,
36 | // except for the application menu, whose title is ignored at runtime.
37 | var menuItem = mainMenu.addItem(withTitle:"Application", action:nil, keyEquivalent:"")
38 | var submenu = NSMenu(title:"Application")
39 | populateApplicationMenu(submenu)
40 | mainMenu.setSubmenu(submenu, for:menuItem)
41 |
42 | menuItem = mainMenu.addItem(withTitle:"File", action:nil, keyEquivalent:"")
43 | submenu = NSMenu(title:NSLocalizedString("File", comment:"File menu"))
44 | populateFileMenu(submenu)
45 | mainMenu.setSubmenu(submenu, for:menuItem)
46 |
47 | menuItem = mainMenu.addItem(withTitle:"Edit", action:nil, keyEquivalent:"")
48 | submenu = NSMenu(title:NSLocalizedString("Edit", comment:"Edit menu"))
49 | populateEditMenu(submenu)
50 | mainMenu.setSubmenu(submenu, for:menuItem)
51 |
52 | menuItem = mainMenu.addItem(withTitle:"View", action:nil, keyEquivalent:"")
53 | submenu = NSMenu(title:NSLocalizedString("View", comment:"View menu"))
54 | populateViewMenu(submenu)
55 | mainMenu.setSubmenu(submenu, for:menuItem)
56 |
57 | menuItem = mainMenu.addItem(withTitle:"Window", action:nil, keyEquivalent:"")
58 | submenu = NSMenu(title:NSLocalizedString("Window", comment:"Window menu"))
59 | populateWindowMenu(submenu)
60 | mainMenu.setSubmenu(submenu, for:menuItem)
61 | NSApp.windowsMenu = submenu
62 |
63 | menuItem = mainMenu.addItem(withTitle:"Help", action:nil, keyEquivalent:"")
64 | submenu = NSMenu(title:NSLocalizedString("Help", comment:"Help menu"))
65 | populateHelpMenu(submenu)
66 | mainMenu.setSubmenu(submenu, for:menuItem)
67 |
68 | // NSApplication will make a copy of your menu,
69 | // so if you need to access the mainMenu after this point,
70 | // your current menu reference won't work anymore,
71 | // and you need to get a new reference from NSApp.mainMenu
72 | NSApp.mainMenu = mainMenu
73 | }
74 |
75 | func populateApplicationMenu(_ menu:NSMenu) {
76 | var title = NSLocalizedString("About", comment:"About menu item") + " " + applicationName
77 | var menuItem = menu.addItem(withTitle:title, action:#selector(NSApplication.orderFrontStandardAboutPanel(_:)), keyEquivalent:"")
78 | menuItem.target = NSApp
79 |
80 | menu.addItem(NSMenuItem.separator())
81 |
82 | title = NSLocalizedString("Services", comment:"Services menu item")
83 | menuItem = menu.addItem(withTitle:title, action:nil, keyEquivalent:"")
84 | let servicesMenu = NSMenu(title:"Services")
85 | menu.setSubmenu(servicesMenu, for:menuItem)
86 | NSApp.servicesMenu = servicesMenu
87 |
88 | menu.addItem(NSMenuItem.separator())
89 |
90 | title = NSLocalizedString("Hide", comment:"Hide menu item") + " " + applicationName
91 | menuItem = menu.addItem(withTitle:title, action:#selector(NSApplication.hide(_:)), keyEquivalent:"h")
92 | menuItem.target = NSApp
93 |
94 | title = NSLocalizedString("Hide Others", comment:"Hide Others menu item")
95 | menuItem = menu.addItem(withTitle:title, action:#selector(NSApplication.hideOtherApplications(_:)), keyEquivalent:"h")
96 | menuItem.keyEquivalentModifierMask = [.command, .option]
97 | menuItem.target = NSApp
98 |
99 | title = NSLocalizedString("Show All", comment:"Show All menu item")
100 | menuItem = menu.addItem(withTitle:title, action:#selector(NSApplication.unhideAllApplications(_:)), keyEquivalent:"")
101 | menuItem.target = NSApp
102 |
103 | menu.addItem(NSMenuItem.separator())
104 |
105 | title = NSLocalizedString("Quit", comment:"Quit menu item") + " " + applicationName
106 | menuItem = menu.addItem(withTitle:title, action:#selector(NSApplication.terminate(_:)), keyEquivalent:"q")
107 | menuItem.target = NSApp
108 | }
109 |
110 | func populateFileMenu(_ menu:NSMenu) {
111 | let title = NSLocalizedString("Close Window", comment:"Close Window menu item")
112 | menu.addItem(withTitle:title, action:#selector(NSWindow.performClose(_:)), keyEquivalent:"w")
113 | }
114 |
115 | func populateEditMenu(_ menu:NSMenu) {
116 | var title = NSLocalizedString("Undo", comment:"Undo menu item")
117 | menu.addItem(withTitle:title, action:#selector(EditMenuActions.undo(_:)), keyEquivalent:"z")
118 |
119 | title = NSLocalizedString("Redo", comment:"Redo menu item")
120 | menu.addItem(withTitle:title, action:#selector(EditMenuActions.redo(_:)), keyEquivalent:"Z")
121 |
122 | menu.addItem(NSMenuItem.separator())
123 |
124 | title = NSLocalizedString("Cut", comment:"Cut menu item")
125 | menu.addItem(withTitle:title, action:#selector(NSText.cut(_:)), keyEquivalent:"x")
126 |
127 | title = NSLocalizedString("Copy", comment:"Copy menu item")
128 | menu.addItem(withTitle:title, action:#selector(NSText.copy(_:)), keyEquivalent:"c")
129 |
130 | title = NSLocalizedString("Paste", comment:"Paste menu item")
131 | menu.addItem(withTitle:title, action:#selector(NSText.paste(_:)), keyEquivalent:"v")
132 |
133 | title = NSLocalizedString("Paste and Match Style", comment:"Paste and Match Style menu item")
134 | var menuItem = menu.addItem(withTitle:title, action:#selector(NSTextView.pasteAsPlainText(_:)), keyEquivalent:"V")
135 | menuItem.keyEquivalentModifierMask = [.command, .option]
136 |
137 | title = NSLocalizedString("Delete", comment:"Delete menu item")
138 | menu.addItem(withTitle:title, action:#selector(NSText.delete(_:)), keyEquivalent:"\u{8}") // backspace
139 |
140 | title = NSLocalizedString("Select All", comment:"Select All menu item")
141 | menu.addItem(withTitle:title, action:#selector(NSText.selectAll(_:)), keyEquivalent:"a")
142 |
143 | menu.addItem(NSMenuItem.separator())
144 |
145 | title = NSLocalizedString("Find", comment:"Find menu item")
146 | menuItem = menu.addItem(withTitle:title, action:nil, keyEquivalent:"")
147 | let findMenu = NSMenu(title:"Find")
148 | populateFindMenu(findMenu)
149 | menu.setSubmenu(findMenu, for:menuItem)
150 |
151 | title = NSLocalizedString("Spelling", comment:"Spelling menu item")
152 | menuItem = menu.addItem(withTitle:title, action:nil, keyEquivalent:"")
153 | let spellingMenu = NSMenu(title:"Spelling")
154 | populateSpellingMenu(spellingMenu)
155 | menu.setSubmenu(spellingMenu, for:menuItem)
156 | }
157 |
158 | func populateFindMenu(_ menu:NSMenu) {
159 | var title = NSLocalizedString("Find…", comment:"Find… menu item")
160 | var menuItem = menu.addItem(withTitle:title, action:#selector(NSResponder.performTextFinderAction(_:)), keyEquivalent:"f")
161 | menuItem.tag = NSTextFinder.Action.showFindInterface.rawValue
162 |
163 | title = NSLocalizedString("Find Next", comment:"Find Next menu item")
164 | menuItem = menu.addItem(withTitle:title, action:#selector(NSResponder.performTextFinderAction(_:)), keyEquivalent:"g")
165 | menuItem.tag = NSTextFinder.Action.nextMatch.rawValue
166 |
167 | title = NSLocalizedString("Find Previous", comment:"Find Previous menu item")
168 | menuItem = menu.addItem(withTitle:title, action:#selector(NSResponder.performTextFinderAction(_:)), keyEquivalent:"G")
169 | menuItem.tag = NSTextFinder.Action.previousMatch.rawValue
170 |
171 | title = NSLocalizedString("Use Selection for Find", comment:"Use Selection for Find menu item")
172 | menuItem = menu.addItem(withTitle:title, action:#selector(NSResponder.performTextFinderAction(_:)), keyEquivalent:"e")
173 | menuItem.tag = NSTextFinder.Action.setSearchString.rawValue
174 |
175 | title = NSLocalizedString("Jump to Selection", comment:"Jump to Selection menu item")
176 | menu.addItem(withTitle:title, action:#selector(NSResponder.centerSelectionInVisibleArea(_:)), keyEquivalent:"j")
177 | }
178 |
179 | func populateSpellingMenu(_ menu:NSMenu) {
180 | var title = NSLocalizedString("Spelling…", comment:"Spelling… menu item")
181 | menu.addItem(withTitle:title, action:#selector(NSText.showGuessPanel(_:)), keyEquivalent:":")
182 |
183 | title = NSLocalizedString("Check Spelling", comment:"Check Spelling menu item")
184 | menu.addItem(withTitle:title, action:#selector(NSText.checkSpelling(_:)), keyEquivalent:";")
185 |
186 | title = NSLocalizedString("Check Spelling as You Type", comment:"Check Spelling as You Type menu item")
187 | menu.addItem(withTitle:title, action:#selector(NSTextView.toggleContinuousSpellChecking(_:)), keyEquivalent:"")
188 | }
189 |
190 | func populateViewMenu(_ menu:NSMenu) {
191 | var title = NSLocalizedString("Show Toolbar", comment:"Show Toolbar menu item")
192 | var menuItem = menu.addItem(withTitle:title, action:#selector(NSWindow.toggleToolbarShown(_:)), keyEquivalent:"t")
193 | menuItem.keyEquivalentModifierMask = [.command, .option]
194 |
195 | title = NSLocalizedString("Customize Toolbar…", comment:"Customize Toolbar… menu item")
196 | menu.addItem(withTitle:title, action:#selector(NSWindow.runToolbarCustomizationPalette(_:)), keyEquivalent:"")
197 |
198 | menu.addItem(NSMenuItem.separator())
199 |
200 | title = NSLocalizedString("Enter Full Screen", comment:"Enter Full Screen menu item")
201 | menuItem = menu.addItem(withTitle:title, action:#selector(NSWindow.toggleFullScreen(_:)), keyEquivalent:"f")
202 | menuItem.keyEquivalentModifierMask = [.command, .control]
203 | }
204 |
205 | func populateWindowMenu(_ menu:NSMenu) {
206 | var title = NSLocalizedString("Minimize", comment:"Minimize menu item")
207 | menu.addItem(withTitle:title, action:#selector(NSWindow.performMiniaturize(_:)), keyEquivalent:"m")
208 |
209 | title = NSLocalizedString("Zoom", comment:"Zoom menu item")
210 | menu.addItem(withTitle:title, action:#selector(NSWindow.performZoom(_:)), keyEquivalent:"")
211 |
212 | menu.addItem(NSMenuItem.separator())
213 |
214 | title = NSLocalizedString("Bring All to Front", comment:"Bring All to Front menu item")
215 | let menuItem = menu.addItem(withTitle:title, action:#selector(NSApplication.arrangeInFront(_:)), keyEquivalent:"")
216 | menuItem.target = NSApp
217 | }
218 |
219 | func populateHelpMenu(_ menu:NSMenu) {
220 | let title = applicationName + " " + NSLocalizedString("Help", comment:"Help menu item")
221 | let menuItem = menu.addItem(withTitle:title, action:#selector(NSApplication.showHelp(_:)), keyEquivalent:"")
222 | menuItem.target = NSApp
223 | }
224 | }
225 |
--------------------------------------------------------------------------------
/NiblessMenu.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 48;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 52A079231F044B0300CC5D16 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52A079221F044B0300CC5D16 /* AppDelegate.swift */; };
11 | 52A079271F044B0300CC5D16 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52A079261F044B0300CC5D16 /* Assets.xcassets */; };
12 | 52A079321F044D5400CC5D16 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52A079311F044D5400CC5D16 /* main.swift */; };
13 | /* End PBXBuildFile section */
14 |
15 | /* Begin PBXFileReference section */
16 | 52A0791F1F044B0300CC5D16 /* NiblessMenu.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NiblessMenu.app; sourceTree = BUILT_PRODUCTS_DIR; };
17 | 52A079221F044B0300CC5D16 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
18 | 52A079261F044B0300CC5D16 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
19 | 52A0792B1F044B0300CC5D16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
20 | 52A079311F044D5400CC5D16 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; };
21 | /* End PBXFileReference section */
22 |
23 | /* Begin PBXFrameworksBuildPhase section */
24 | 52A0791C1F044B0300CC5D16 /* Frameworks */ = {
25 | isa = PBXFrameworksBuildPhase;
26 | buildActionMask = 2147483647;
27 | files = (
28 | );
29 | runOnlyForDeploymentPostprocessing = 0;
30 | };
31 | /* End PBXFrameworksBuildPhase section */
32 |
33 | /* Begin PBXGroup section */
34 | 52A079161F044B0300CC5D16 = {
35 | isa = PBXGroup;
36 | children = (
37 | 52A079211F044B0300CC5D16 /* NiblessMenu */,
38 | 52A079201F044B0300CC5D16 /* Products */,
39 | );
40 | sourceTree = "";
41 | };
42 | 52A079201F044B0300CC5D16 /* Products */ = {
43 | isa = PBXGroup;
44 | children = (
45 | 52A0791F1F044B0300CC5D16 /* NiblessMenu.app */,
46 | );
47 | name = Products;
48 | sourceTree = "";
49 | };
50 | 52A079211F044B0300CC5D16 /* NiblessMenu */ = {
51 | isa = PBXGroup;
52 | children = (
53 | 52A079221F044B0300CC5D16 /* AppDelegate.swift */,
54 | 52A079311F044D5400CC5D16 /* main.swift */,
55 | 52A079261F044B0300CC5D16 /* Assets.xcassets */,
56 | 52A0792B1F044B0300CC5D16 /* Info.plist */,
57 | );
58 | path = NiblessMenu;
59 | sourceTree = "";
60 | };
61 | /* End PBXGroup section */
62 |
63 | /* Begin PBXNativeTarget section */
64 | 52A0791E1F044B0300CC5D16 /* NiblessMenu */ = {
65 | isa = PBXNativeTarget;
66 | buildConfigurationList = 52A0792E1F044B0300CC5D16 /* Build configuration list for PBXNativeTarget "NiblessMenu" */;
67 | buildPhases = (
68 | 52A0791B1F044B0300CC5D16 /* Sources */,
69 | 52A0791C1F044B0300CC5D16 /* Frameworks */,
70 | 52A0791D1F044B0300CC5D16 /* Resources */,
71 | );
72 | buildRules = (
73 | );
74 | dependencies = (
75 | );
76 | name = NiblessMenu;
77 | productName = NiblessMenu;
78 | productReference = 52A0791F1F044B0300CC5D16 /* NiblessMenu.app */;
79 | productType = "com.apple.product-type.application";
80 | };
81 | /* End PBXNativeTarget section */
82 |
83 | /* Begin PBXProject section */
84 | 52A079171F044B0300CC5D16 /* Project object */ = {
85 | isa = PBXProject;
86 | attributes = {
87 | LastSwiftUpdateCheck = 0830;
88 | LastUpgradeCheck = 0900;
89 | ORGANIZATIONNAME = "Jeff Johnson";
90 | TargetAttributes = {
91 | 52A0791E1F044B0300CC5D16 = {
92 | CreatedOnToolsVersion = 8.3.2;
93 | LastSwiftMigration = 0900;
94 | ProvisioningStyle = Automatic;
95 | };
96 | };
97 | };
98 | buildConfigurationList = 52A0791A1F044B0300CC5D16 /* Build configuration list for PBXProject "NiblessMenu" */;
99 | compatibilityVersion = "Xcode 8.0";
100 | developmentRegion = English;
101 | hasScannedForEncodings = 0;
102 | knownRegions = (
103 | en,
104 | Base,
105 | );
106 | mainGroup = 52A079161F044B0300CC5D16;
107 | productRefGroup = 52A079201F044B0300CC5D16 /* Products */;
108 | projectDirPath = "";
109 | projectRoot = "";
110 | targets = (
111 | 52A0791E1F044B0300CC5D16 /* NiblessMenu */,
112 | );
113 | };
114 | /* End PBXProject section */
115 |
116 | /* Begin PBXResourcesBuildPhase section */
117 | 52A0791D1F044B0300CC5D16 /* Resources */ = {
118 | isa = PBXResourcesBuildPhase;
119 | buildActionMask = 2147483647;
120 | files = (
121 | 52A079271F044B0300CC5D16 /* Assets.xcassets in Resources */,
122 | );
123 | runOnlyForDeploymentPostprocessing = 0;
124 | };
125 | /* End PBXResourcesBuildPhase section */
126 |
127 | /* Begin PBXSourcesBuildPhase section */
128 | 52A0791B1F044B0300CC5D16 /* Sources */ = {
129 | isa = PBXSourcesBuildPhase;
130 | buildActionMask = 2147483647;
131 | files = (
132 | 52A079321F044D5400CC5D16 /* main.swift in Sources */,
133 | 52A079231F044B0300CC5D16 /* AppDelegate.swift in Sources */,
134 | );
135 | runOnlyForDeploymentPostprocessing = 0;
136 | };
137 | /* End PBXSourcesBuildPhase section */
138 |
139 | /* Begin XCBuildConfiguration section */
140 | 52A0792C1F044B0300CC5D16 /* Debug */ = {
141 | isa = XCBuildConfiguration;
142 | buildSettings = {
143 | ALWAYS_SEARCH_USER_PATHS = NO;
144 | CLANG_ANALYZER_NONNULL = YES;
145 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
146 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
147 | CLANG_CXX_LIBRARY = "libc++";
148 | CLANG_ENABLE_MODULES = YES;
149 | CLANG_ENABLE_OBJC_ARC = YES;
150 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
151 | CLANG_WARN_BOOL_CONVERSION = YES;
152 | CLANG_WARN_COMMA = YES;
153 | CLANG_WARN_CONSTANT_CONVERSION = YES;
154 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
155 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
156 | CLANG_WARN_EMPTY_BODY = YES;
157 | CLANG_WARN_ENUM_CONVERSION = YES;
158 | CLANG_WARN_INFINITE_RECURSION = YES;
159 | CLANG_WARN_INT_CONVERSION = YES;
160 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
161 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
162 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
163 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
164 | CLANG_WARN_STRICT_PROTOTYPES = YES;
165 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
166 | CLANG_WARN_UNREACHABLE_CODE = YES;
167 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
168 | CODE_SIGN_IDENTITY = "-";
169 | COPY_PHASE_STRIP = NO;
170 | DEBUG_INFORMATION_FORMAT = dwarf;
171 | ENABLE_STRICT_OBJC_MSGSEND = YES;
172 | ENABLE_TESTABILITY = YES;
173 | GCC_C_LANGUAGE_STANDARD = gnu99;
174 | GCC_DYNAMIC_NO_PIC = NO;
175 | GCC_NO_COMMON_BLOCKS = YES;
176 | GCC_OPTIMIZATION_LEVEL = 0;
177 | GCC_PREPROCESSOR_DEFINITIONS = (
178 | "DEBUG=1",
179 | "$(inherited)",
180 | );
181 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
182 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
183 | GCC_WARN_UNDECLARED_SELECTOR = YES;
184 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
185 | GCC_WARN_UNUSED_FUNCTION = YES;
186 | GCC_WARN_UNUSED_VARIABLE = YES;
187 | MACOSX_DEPLOYMENT_TARGET = 10.12;
188 | MTL_ENABLE_DEBUG_INFO = YES;
189 | ONLY_ACTIVE_ARCH = YES;
190 | SDKROOT = macosx;
191 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
192 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
193 | };
194 | name = Debug;
195 | };
196 | 52A0792D1F044B0300CC5D16 /* Release */ = {
197 | isa = XCBuildConfiguration;
198 | buildSettings = {
199 | ALWAYS_SEARCH_USER_PATHS = NO;
200 | CLANG_ANALYZER_NONNULL = YES;
201 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
202 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
203 | CLANG_CXX_LIBRARY = "libc++";
204 | CLANG_ENABLE_MODULES = YES;
205 | CLANG_ENABLE_OBJC_ARC = YES;
206 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
207 | CLANG_WARN_BOOL_CONVERSION = YES;
208 | CLANG_WARN_COMMA = YES;
209 | CLANG_WARN_CONSTANT_CONVERSION = YES;
210 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
211 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
212 | CLANG_WARN_EMPTY_BODY = YES;
213 | CLANG_WARN_ENUM_CONVERSION = YES;
214 | CLANG_WARN_INFINITE_RECURSION = YES;
215 | CLANG_WARN_INT_CONVERSION = YES;
216 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
217 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
218 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
219 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
220 | CLANG_WARN_STRICT_PROTOTYPES = YES;
221 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
222 | CLANG_WARN_UNREACHABLE_CODE = YES;
223 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
224 | CODE_SIGN_IDENTITY = "-";
225 | COPY_PHASE_STRIP = NO;
226 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
227 | ENABLE_NS_ASSERTIONS = NO;
228 | ENABLE_STRICT_OBJC_MSGSEND = YES;
229 | GCC_C_LANGUAGE_STANDARD = gnu99;
230 | GCC_NO_COMMON_BLOCKS = YES;
231 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
232 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
233 | GCC_WARN_UNDECLARED_SELECTOR = YES;
234 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
235 | GCC_WARN_UNUSED_FUNCTION = YES;
236 | GCC_WARN_UNUSED_VARIABLE = YES;
237 | MACOSX_DEPLOYMENT_TARGET = 10.12;
238 | MTL_ENABLE_DEBUG_INFO = NO;
239 | SDKROOT = macosx;
240 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
241 | };
242 | name = Release;
243 | };
244 | 52A0792F1F044B0300CC5D16 /* Debug */ = {
245 | isa = XCBuildConfiguration;
246 | buildSettings = {
247 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
248 | COMBINE_HIDPI_IMAGES = YES;
249 | INFOPLIST_FILE = NiblessMenu/Info.plist;
250 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
251 | PRODUCT_BUNDLE_IDENTIFIER = com.lapcatsoftware.NiblessMenu;
252 | PRODUCT_NAME = "$(TARGET_NAME)";
253 | SWIFT_VERSION = 4.0;
254 | };
255 | name = Debug;
256 | };
257 | 52A079301F044B0300CC5D16 /* Release */ = {
258 | isa = XCBuildConfiguration;
259 | buildSettings = {
260 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
261 | COMBINE_HIDPI_IMAGES = YES;
262 | INFOPLIST_FILE = NiblessMenu/Info.plist;
263 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
264 | PRODUCT_BUNDLE_IDENTIFIER = com.lapcatsoftware.NiblessMenu;
265 | PRODUCT_NAME = "$(TARGET_NAME)";
266 | SWIFT_VERSION = 4.0;
267 | };
268 | name = Release;
269 | };
270 | /* End XCBuildConfiguration section */
271 |
272 | /* Begin XCConfigurationList section */
273 | 52A0791A1F044B0300CC5D16 /* Build configuration list for PBXProject "NiblessMenu" */ = {
274 | isa = XCConfigurationList;
275 | buildConfigurations = (
276 | 52A0792C1F044B0300CC5D16 /* Debug */,
277 | 52A0792D1F044B0300CC5D16 /* Release */,
278 | );
279 | defaultConfigurationIsVisible = 0;
280 | defaultConfigurationName = Release;
281 | };
282 | 52A0792E1F044B0300CC5D16 /* Build configuration list for PBXNativeTarget "NiblessMenu" */ = {
283 | isa = XCConfigurationList;
284 | buildConfigurations = (
285 | 52A0792F1F044B0300CC5D16 /* Debug */,
286 | 52A079301F044B0300CC5D16 /* Release */,
287 | );
288 | defaultConfigurationIsVisible = 0;
289 | defaultConfigurationName = Release;
290 | };
291 | /* End XCConfigurationList section */
292 | };
293 | rootObject = 52A079171F044B0300CC5D16 /* Project object */;
294 | }
295 |
--------------------------------------------------------------------------------