├── MarioMenuBarPref
├── MarioMenuBarPref.tiff
├── Schwammerl.icns
├── SwiftBlogLogo.png
├── mario_walking.png
├── SwiftBlogLogo@2x.png
├── mario_walking@2x.png
├── MarioPrefController.h
├── MarioMenuBarPref.h
├── MarioMenuBarPref.m
├── Info.plist
├── MarioPrefController.m
└── Base.lproj
│ └── MarioMenuBarPref.xib
├── Installer and packager
├── Packager.pmdoc
│ ├── 03launch-contents.xml
│ ├── 01mariomeetsmenubar-contents.xml
│ ├── 02mariomenubarpref-contents.xml
│ ├── 03launch.xml
│ ├── 01mariomeetsmenubar.xml
│ ├── 02mariomenubarpref.xml
│ └── index.xml
├── Uninstaller.pmdoc
│ ├── 01uninstall-contents.xml
│ ├── 01uninstall.xml
│ └── index.xml
├── launch.sh
├── DMGTemplate.dmgpkg
└── uninstall.sh
├── Screenshots
├── app_preview.gif
├── mario_walking.png
├── mario_preferences.png
└── mario_system_settings.png
├── MarioMeetsMenuBar
├── MarioMeetsMenuBar-Bridging-Header.h
├── Images.xcassets
│ ├── mario1.imageset
│ │ ├── mario1.png
│ │ └── Contents.json
│ ├── mario2.imageset
│ │ ├── mario2.png
│ │ └── Contents.json
│ ├── mario3.imageset
│ │ ├── mario3.png
│ │ └── Contents.json
│ └── AppIcon.appiconset
│ │ ├── mushroom_retro_up_mushroom_up@2x.png
│ │ ├── mushroom_retro_up_mushroom_up@2x-1.png
│ │ └── Contents.json
├── Info.plist
├── MarioController.swift
├── AppDelegate.swift
└── Base.lproj
│ └── Main.storyboard
├── MarioMeetsMenuBar.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── .gitignore
├── MarioMeetsMenuBarTests
├── Info.plist
└── MarioMeetsMenuBarTests.swift
├── LICENSE
└── Readme.md
/MarioMenuBarPref/MarioMenuBarPref.tiff:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Installer and packager/Packager.pmdoc/03launch-contents.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Installer and packager/Uninstaller.pmdoc/01uninstall-contents.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Installer and packager/Packager.pmdoc/01mariomeetsmenubar-contents.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Installer and packager/Packager.pmdoc/02mariomenubarpref-contents.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Installer and packager/launch.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | open /Applications/MarioMeetsMenuBar.app
4 | exit 0
--------------------------------------------------------------------------------
/Screenshots/app_preview.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/Screenshots/app_preview.gif
--------------------------------------------------------------------------------
/Screenshots/mario_walking.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/Screenshots/mario_walking.png
--------------------------------------------------------------------------------
/MarioMenuBarPref/Schwammerl.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMenuBarPref/Schwammerl.icns
--------------------------------------------------------------------------------
/MarioMenuBarPref/SwiftBlogLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMenuBarPref/SwiftBlogLogo.png
--------------------------------------------------------------------------------
/MarioMenuBarPref/mario_walking.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMenuBarPref/mario_walking.png
--------------------------------------------------------------------------------
/Screenshots/mario_preferences.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/Screenshots/mario_preferences.png
--------------------------------------------------------------------------------
/MarioMenuBarPref/SwiftBlogLogo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMenuBarPref/SwiftBlogLogo@2x.png
--------------------------------------------------------------------------------
/MarioMenuBarPref/mario_walking@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMenuBarPref/mario_walking@2x.png
--------------------------------------------------------------------------------
/Screenshots/mario_system_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/Screenshots/mario_system_settings.png
--------------------------------------------------------------------------------
/Installer and packager/DMGTemplate.dmgpkg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/Installer and packager/DMGTemplate.dmgpkg
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/MarioMeetsMenuBar-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // Use this file to import your target's public headers that you would like to expose to Swift.
3 | //
4 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/mario1.imageset/mario1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMeetsMenuBar/Images.xcassets/mario1.imageset/mario1.png
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/mario2.imageset/mario2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMeetsMenuBar/Images.xcassets/mario2.imageset/mario2.png
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/mario3.imageset/mario3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMeetsMenuBar/Images.xcassets/mario3.imageset/mario3.png
--------------------------------------------------------------------------------
/Installer and packager/uninstall.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | rm -Rf /Applications/MarioMeetsMenuBar.app
3 | rm -Rf /Library/PreferencePanes/MarioMenuBarPref.prefPane
4 | rm /tmp/uninstall.sh
5 | exit 0
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/AppIcon.appiconset/mushroom_retro_up_mushroom_up@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMeetsMenuBar/Images.xcassets/AppIcon.appiconset/mushroom_retro_up_mushroom_up@2x.png
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/AppIcon.appiconset/mushroom_retro_up_mushroom_up@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/HEAD/MarioMeetsMenuBar/Images.xcassets/AppIcon.appiconset/mushroom_retro_up_mushroom_up@2x-1.png
--------------------------------------------------------------------------------
/MarioMeetsMenuBar.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/MarioMenuBarPref/MarioPrefController.h:
--------------------------------------------------------------------------------
1 | //
2 | // MenuBarPrefController.h
3 | // MarioMeetsMenuBar
4 | //
5 | // Created by Stefan Popp on 13.07.15.
6 | // Copyright (c) 2015 SwiftBlog. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MarioPrefController : NSObject
12 |
13 | - (void)configurePreview;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/MarioMenuBarPref/MarioMenuBarPref.h:
--------------------------------------------------------------------------------
1 | //
2 | // MarioMenuBarPref.h
3 | // MarioMenuBarPref
4 | //
5 | // Created by Stefan Popp on 13.07.15.
6 | // Copyright (c) 2015 SwiftBlog. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface MarioMenuBarPref : NSPreferencePane
12 |
13 | - (void)mainViewDidLoad;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/mario1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "mario1.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/mario2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "mario2.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.xcassets/mario3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "mario3.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/MarioMenuBarPref/MarioMenuBarPref.m:
--------------------------------------------------------------------------------
1 | //
2 | // MarioMenuBarPref.m
3 | // MarioMenuBarPref
4 | //
5 | // Created by Stefan Popp on 13.07.15.
6 | // Copyright (c) 2015 SwiftBlog. All rights reserved.
7 | //
8 |
9 | #import "MarioMenuBarPref.h"
10 |
11 | #import "MarioPrefController.h"
12 |
13 | @interface MarioMenuBarPref ()
14 | @property (strong) IBOutlet MarioPrefController *marioPrefController;
15 | @end
16 |
17 | @implementation MarioMenuBarPref
18 |
19 | - (void)mainViewDidLoad
20 | {
21 | [_marioPrefController configurePreview];
22 | }
23 |
24 | @end
25 |
--------------------------------------------------------------------------------
/Installer and packager/Packager.pmdoc/03launch.xml:
--------------------------------------------------------------------------------
1 | de.swift-blog.mariomeetsmenubar.launch.pkg1.0/private/tmp/launch.sh/private/tmp/parentinstallTo.pathinstallTo/private/tmp/launch.sh
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | build/
4 | *.pbxuser
5 | !default.pbxuser
6 | *.mode1v3
7 | !default.mode1v3
8 | *.mode2v3
9 | !default.mode2v3
10 | *.perspectivev3
11 | !default.perspectivev3
12 | xcuserdata
13 | *.xccheckout
14 | *.moved-aside
15 | DerivedData
16 | *.hmap
17 | *.ipa
18 | *.xcuserstate
19 | *.xcappdata
20 | *.xcappdata/
21 | # CocoaPods
22 | #
23 | # We recommend against adding the Pods directory to your .gitignore. However
24 | # you should judge for yourself, the pros and cons are mentioned at:
25 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
26 | #
27 | Pods/
28 |
--------------------------------------------------------------------------------
/Installer and packager/Packager.pmdoc/01mariomeetsmenubar.xml:
--------------------------------------------------------------------------------
1 | de.swift-blog.mariomeetsmenubar.MarioMeetsMenuBar.pkg1.0/Applications/MarioMeetsMenuBar.app/Applicationsscripts.postinstall.pathscripts.scriptsDirectoryPath.pathrelocatableparentinstallTo
--------------------------------------------------------------------------------
/Installer and packager/Uninstaller.pmdoc/01uninstall.xml:
--------------------------------------------------------------------------------
1 | de.swift-blog.uninstaller.uninstall.pkg1.0/private/tmp/uninstall.sh/private/tmpinstallTo.pathparentinstallToscripts.postinstall.path/private/tmp/uninstall.sh
--------------------------------------------------------------------------------
/Installer and packager/Packager.pmdoc/02mariomenubarpref.xml:
--------------------------------------------------------------------------------
1 | de.swift-blog.mariomeetsmenubar.MarioMenuBarPref.pkg1.0/private/tmp/MarioMenuBarPref.prefPane/Library/PreferencePanesinstallTo.pathparentinstallToinstallTo.isAbsoluteType/CVS$/\.svn$/\.cvsignore$/\.cvspass$/\.DS_Store$
--------------------------------------------------------------------------------
/MarioMeetsMenuBarTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | de.SwiftBlog.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBarTests/MarioMeetsMenuBarTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MarioMeetsMenuBarTests.swift
3 | // MarioMeetsMenuBarTests
4 | //
5 | // Created by Stefan Popp on 08.07.15.
6 | // Copyright (c) 2015 SwiftBlog. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import XCTest
11 |
12 | class MarioMeetsMenuBarTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | XCTAssert(true, "Pass")
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measureBlock() {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Stefan Popp
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | de.SwiftBlog.$(PRODUCT_NAME:rfc1034identifier)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0.1
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2015 SwiftBlog. All rights reserved.
29 | NSMainStoryboardFile
30 | Main
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/MarioMenuBarPref/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | de.SwiftBlog.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | NSHumanReadableCopyright
24 | Copyright © 2015 SwiftBlog. All rights reserved.
25 | NSMainNibFile
26 | MarioMenuBarPref
27 | NSPrefPaneIconFile
28 | Schwammerl.icns
29 | NSPrefPaneIconLabel
30 | Mario MenuBar
31 | NSPrincipalClass
32 | MarioMenuBarPref
33 |
34 |
35 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Images.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 | "size" : "256x256",
40 | "idiom" : "mac",
41 | "filename" : "mushroom_retro_up_mushroom_up@2x.png",
42 | "scale" : "2x"
43 | },
44 | {
45 | "size" : "512x512",
46 | "idiom" : "mac",
47 | "filename" : "mushroom_retro_up_mushroom_up@2x-1.png",
48 | "scale" : "1x"
49 | },
50 | {
51 | "idiom" : "mac",
52 | "size" : "512x512",
53 | "scale" : "2x"
54 | }
55 | ],
56 | "info" : {
57 | "version" : 1,
58 | "author" : "xcode"
59 | }
60 | }
--------------------------------------------------------------------------------
/Installer and packager/Uninstaller.pmdoc/index.xml:
--------------------------------------------------------------------------------
1 | Uninstaller/private/tmp/Uninstaller.pkgDeveloper ID Installer: Stefan Popp (MDGNFV4S3C)de.swift-blogUninstaller for MarioMeetsMenuBar/Applications/MarioMeetsMenuBar.appMarioMeetsMenuBar not foundThe app is not installed at /Applications/MarioMeetsMenuBar.app/Library/PreferencePanes/MarioMenuBarPref.prefPanePreference pane not foundThe preference pane is not found at /Library/PreferencePanes/MarioMenuBarPref.prefPane de.SwiftBlog.MarioMeetsMenuBar9de.SwiftBlog.MarioMenuBarPref9- 01uninstall.xml
postinstallActions.actionsproperties.titledescriptionproperties.anywhereDomainpreinstallActions.actions
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # [Mario meets OS X menu bar](https://github.com/SwiftBlogDe/MarioMeetsMenuBar) #
2 |
3 | A little useless UI enhancement inspired by [bisqwit's E editor](https://www.youtube.com/watch?v=y71lli8MS8s) for OS X, created and maintained by [SwiftBlog.de](http://www.swift-blog.de) :rocket:.
4 |
5 |
6 |
7 | 
8 |
9 | A little Mario walking from left to right, all day long. The most useless UI addition for OS X you've ever seen, but well... it was fun to program and get the stuff working with best performance.
10 | * Highly optimized animation (:laughing:) - 0% CPU
11 | * :zap: No additional power consumption
12 | * Made without the need of :beer:
13 |
14 |
15 | 
16 |
17 | ### Requirements ###
18 |
19 | Mac OS X 10.10+
20 |
21 | # Installation #
22 |
23 | ###Build from source
24 |
25 | Just clone or download the current master. You need at least Xcode 6.4 and OS X 10.10 to build the application.
26 |
27 | ###Installer
28 |
29 | Get the Installer DMG, mount it and run the installer. After installation the application is automatically started.
30 |
31 | [Download Version 1.0.1 ](https://www.dropbox.com/s/xgpbp0lcps43upn/MarioMeetsMenuBarV101.dmg?dl=1)
32 |
33 | ### Uninstall
34 |
35 | An uninstaller script is available in the Installer DMG
36 |
37 | ### Settings and quit app
38 |
39 | 
40 |
41 | 
42 |
43 | ###Notes
44 |
45 | The application will launch after the installation. You can set an autolaunch option and kill the application with the Mario Menubar system preference.
46 |
47 | ### Thank you
48 |
49 | [dingong](https://scratch.mit.edu/projects/167450/) - For your free mario sprite
50 | [Sandro Pereira, AKA "PH03NYX"](http://sandrodcpereira.com) - For your lovley Icons
51 |
--------------------------------------------------------------------------------
/Installer and packager/Packager.pmdoc/index.xml:
--------------------------------------------------------------------------------
1 | MarioMeetsMenuBar/private/tmp/Installer.pkgDeveloper ID Installer: Stefan Popp (MDGNFV4S3C)de.swift-blogA simple Mario which walks from left to right in the menu bar.
2 |
3 | http://www.swift-blog.de/Users/devnet/Desktop/mario_walking@2x.pngMinimum required OS X Version is 10.9.- 01mariomeetsmenubar.xml
- 02mariomenubarpref.xml
- 03launch.xml
properties.titleproperties.userDomaindescription
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/MarioController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MarioController.swift
3 | // MarioMeetsMenuBar
4 | //
5 | // Created by Stefan Popp on 08.07.15.
6 | // Copyright (c) 2015 SwiftBlog. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | // Versatz den Mario ausserhalb des Bildschirms noch links und rechts laeuft
12 | let kMarioOffscreenOffset: CGFloat = 128.0
13 |
14 | // Subclass wenn mal etwas Fanciness dazu kommen soll =)
15 | class MarioImageView: NSImageView {
16 |
17 | }
18 |
19 | class MarioWindowController {
20 |
21 | // Hauptfenster
22 | let marioWindow: MarioWindow!
23 | let marioContentView: NSView!
24 | var marioLayer: CALayer!
25 |
26 | // Marios Frame in dem wir zeichnen
27 | static let marioFrame = CGRect(
28 | x: 0.0,
29 | y: 0.0,
30 | width: 22.0,
31 | height: 22.0
32 | )
33 |
34 | // Erstellen des Image views und erzeugen von Layern zur animierung
35 | init(marioWindow: MarioWindow) {
36 | self.marioWindow = marioWindow
37 | marioContentView = marioWindow.contentView as! NSView
38 | marioContentView.layer = CALayer()
39 | marioContentView.wantsLayer = true
40 | marioContentView.layerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.Never
41 | }
42 |
43 | func start() {
44 | // Mario Image View hinzufuegen
45 | addMario()
46 |
47 | // Mario animation starten
48 | animateMario()
49 | }
50 |
51 | func animateMario() {
52 | // Target X Koordinate errechnen
53 | let targetX = self.marioContentView.frame.width + kMarioOffscreenOffset;
54 | CATransaction.begin()
55 | CATransaction.setCompletionBlock { () -> Void in
56 |
57 | }
58 |
59 | /**
60 | * Lauf Animation mit Sprites
61 | */
62 | // Keypath fuer den Austausch ist bei Image Views "contents"
63 | let spriteAnimation = CAKeyframeAnimation(keyPath: "contents")
64 |
65 | // Sprites als Einzelbilder
66 | spriteAnimation.values = [
67 | NSImage(named: "mario1")!,
68 | NSImage(named: "mario3")!,
69 | ]
70 |
71 | // 500ms fuer einen Durchlauf der Animation
72 | spriteAnimation.duration = 0.5
73 |
74 | // Diskreter Zeitverlauf, linear uberblendet die Bilder
75 | spriteAnimation.calculationMode = kCAAnimationDiscrete
76 |
77 | // Wir wiederholen die Animation bis zum Sant Nimmermehrstag
78 | // https://de.wikipedia.org/wiki/Sankt_Nimmerlein
79 | spriteAnimation.repeatCount = HUGE
80 |
81 |
82 | /**
83 | * Mario auf der X Koordinate bewegen
84 | */
85 | let translateAnimation = CABasicAnimation(keyPath: "transform.translation.x")
86 | let targetFrame = CGRectOffset(marioContentView.frame, targetX, 0);
87 | var sourcePoint = CGPoint(x: 0-kMarioOffscreenOffset, y: 0)
88 | translateAnimation.toValue = NSValue(point: targetFrame.origin)
89 | translateAnimation.fromValue = NSValue(point: sourcePoint)
90 |
91 | // To Value und From Value verdrehen gibt tollen
92 | translateAnimation.removedOnCompletion = false
93 | translateAnimation.fillMode = kCAFillModeForwards
94 |
95 | // 23 - https://de.wikipedia.org/wiki/Dreiundzwanzig
96 | translateAnimation.duration = 23.0
97 | translateAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
98 | translateAnimation.repeatCount = HUGE
99 |
100 | /**
101 | * Animationen hinzufuegen
102 | */
103 | marioLayer.addAnimation(spriteAnimation, forKey: "marioWalk")
104 | marioLayer.addAnimation(translateAnimation, forKey: "marioTranslate")
105 | CATransaction.commit()
106 | }
107 |
108 | func addMario() {
109 | // Mario Frame
110 | let frame = self.dynamicType.marioFrame
111 |
112 | // Mario Bild Layer erzeugen
113 | marioLayer = CALayer()
114 | marioLayer.name = "mario1"
115 | marioLayer.frame = CGRect(
116 | x: 0,
117 | y: 0,
118 | width: frame.height,
119 | height: frame.width
120 | )
121 | marioLayer.contents = NSImage(named: "mario1")
122 | marioContentView.layer?.addSublayer(marioLayer)
123 | }
124 |
125 | func didChangeScreenParameters() {
126 | marioLayer.removeAllAnimations()
127 | animateMario()
128 | }
129 | }
130 |
131 |
--------------------------------------------------------------------------------
/MarioMenuBarPref/MarioPrefController.m:
--------------------------------------------------------------------------------
1 | //
2 | // MenuBarPrefController.m
3 | // MarioMeetsMenuBar
4 | //
5 | // Created by Stefan Popp on 13.07.15.
6 | // Copyright (c) 2015 SwiftBlog. All rights reserved.
7 | //
8 |
9 | #import "MarioPrefController.h"
10 | #import
11 |
12 | @interface MarioPrefController ()
13 |
14 | @property NSUserDefaults *defaults;
15 | @property (weak) IBOutlet NSButton *launchSwitch;
16 |
17 | @end
18 |
19 | @implementation MarioPrefController
20 |
21 | #pragma mark - Settings and view configuration
22 | - (void)configurePreview {
23 | [self readSettings];
24 | [_launchSwitch setState:[_defaults boolForKey:@"launchOnStart"]];
25 | }
26 |
27 | - (void)readSettings {
28 | _defaults = [[NSUserDefaults alloc] initWithSuiteName:@"de.swift-blog.mariomeetsmenubar"];
29 | [_defaults synchronize];
30 | }
31 |
32 | #pragma mark - Application helper
33 |
34 | - (BOOL)appIsRunning {
35 | NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"de.SwiftBlog.MarioMeetsMenuBar"];
36 | return (apps.count > 0);
37 | }
38 |
39 |
40 | - (void)terminateMarioMenuApp {
41 |
42 | if (! [self appIsRunning]) {
43 | return;
44 | }
45 |
46 | NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"de.SwiftBlog.MarioMeetsMenuBar"];
47 | NSRunningApplication *app = apps[0];
48 | [app forceTerminate];
49 | }
50 |
51 | #pragma mark - Login launch helper
52 |
53 | - (void)setLaunchOnLogin:(BOOL)launchOnLogin
54 | {
55 | NSURL *bundleURL = [NSURL fileURLWithPath:@"/Applications/MarioMeetsMenuBar.app"];
56 | LSSharedFileListRef loginItemsListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
57 |
58 | if (launchOnLogin) {
59 | NSDictionary *properties;
60 | properties = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"com.apple.loginitem.HideOnLaunch"];
61 | LSSharedFileListItemRef itemRef = LSSharedFileListInsertItemURL(loginItemsListRef, kLSSharedFileListItemLast, NULL, NULL, (__bridge CFURLRef)bundleURL, (__bridge CFDictionaryRef)properties,NULL);
62 | if (itemRef) {
63 | CFRelease(itemRef);
64 | }
65 | } else {
66 | LSSharedFileListRef loginItemsListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
67 | CFArrayRef snapshotRef = LSSharedFileListCopySnapshot(loginItemsListRef, NULL);
68 | NSArray* loginItems = (__bridge_transfer id)(snapshotRef);
69 |
70 | for (id item in loginItems) {
71 | LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item;
72 | CFURLRef itemURLRef;
73 | if (LSSharedFileListItemResolve(itemRef, 0, &itemURLRef, NULL) == noErr) {
74 | NSURL *itemURL = (__bridge_transfer id)(itemURLRef);
75 | if ([itemURL isEqual:bundleURL]) {
76 | LSSharedFileListItemRemove(loginItemsListRef, itemRef);
77 | }
78 | }
79 | }
80 | }
81 | }
82 |
83 | #pragma mark - Actions
84 |
85 | - (IBAction)uninstallApplicationClicked:(NSButton *)sender {
86 | NSAlert *alert = [NSAlert new];
87 | [alert addButtonWithTitle:@"Uninstall"];
88 | [alert addButtonWithTitle:@"Cancel"];
89 | [alert setMessageText:@"Are you sure to uninstall the Mario menu bar?"];
90 | [alert setInformativeText:@"Uninstall MarioMeetsMenuBar"];
91 | [alert setAlertStyle:NSCriticalAlertStyle];
92 |
93 | NSWindow *window = [NSApplication sharedApplication].keyWindow;
94 | [alert beginSheetModalForWindow:window completionHandler:^(NSModalResponse returnCode) {
95 |
96 | }];
97 | return;
98 | }
99 |
100 | - (IBAction)quitApplicationClicked:(NSButton *)sender {
101 | if (! [self appIsRunning]) {
102 | NSAlert *alert = [NSAlert new];
103 | [alert addButtonWithTitle:@"OK"];
104 | [alert setMessageText:@"MarioMeetsMenuBar is not running"];
105 | [alert setInformativeText:@"MarioMeetsMenuBar"];
106 | [alert setAlertStyle:NSInformationalAlertStyle];
107 | [alert runModal];
108 | return;
109 | }
110 |
111 | [self terminateMarioMenuApp];
112 | }
113 |
114 | - (IBAction)openSwiftBlogClicked:(NSButton *)sender {
115 | [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.swift-blog.de/"]];
116 | }
117 |
118 | - (IBAction)launchOnStartClicked:(NSButton *)sender {
119 | [_defaults setBool:sender.state forKey:@"launchOnStart"];
120 | [self setLaunchOnLogin:sender.state];
121 | }
122 |
123 | @end
124 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // MarioMeetsMenuBar
4 | //
5 | // Created by Stefan Popp on 08.07.15.
6 | // Copyright (c) 2015 SwiftBlog. All rights reserved.
7 | //
8 | /*
9 | Todo:
10 |
11 | Multi Monitor Mario?
12 | Sprites auf 32x32 angleichen
13 |
14 | Nice to have:
15 | Animation ein wenig verspielter machen
16 | */
17 |
18 | import Cocoa
19 |
20 | class MarioWindow: NSWindow {
21 | override func constrainFrameRect(frameRect: NSRect, toScreen screen: NSScreen?) -> NSRect {
22 | return frameRect
23 | }
24 | }
25 |
26 | @NSApplicationMain
27 | class AppDelegate: NSObject, NSApplicationDelegate {
28 |
29 | var window: MarioWindow!
30 | var marioController: MarioWindowController!
31 |
32 | func applicationDidFinishLaunching(aNotification: NSNotification) {
33 |
34 | // Verhindere die Anzeige der Applikation im Dock
35 | NSApp.setActivationPolicy(NSApplicationActivationPolicy.Accessory)
36 |
37 | // Notifications ueber Desktop wechsel erhalten
38 | let workspaceNC = NSWorkspace.sharedWorkspace().notificationCenter
39 | workspaceNC.addObserver(
40 | self,
41 | selector: "didChangeWorkspace",
42 | name:NSWorkspaceActiveSpaceDidChangeNotification,
43 | object: NSWorkspace.sharedWorkspace()
44 | )
45 |
46 | // Erstelle das Anwendungsfenster und zeige es an
47 | createApplicationWindow()
48 |
49 | // Mario controller erstellen und loslaufen lasse
50 | addMarioController()
51 |
52 | let delayTime = dispatch_time(DISPATCH_TIME_NOW,
53 | Int64(2 * Double(NSEC_PER_SEC)))
54 | dispatch_after(delayTime, dispatch_get_main_queue()) {
55 | self.bringToFront()
56 | }
57 |
58 | }
59 |
60 | func applicationWillTerminate(aNotification: NSNotification) {
61 | // Insert code here to tear down your application
62 | }
63 |
64 | func addMarioController() {
65 | window.level = Int(CGWindowLevelForKey(Int32(kCGMainMenuWindowLevelKey)+1))
66 | // Erstelle Mario und lass ihn laufen
67 | marioController = MarioWindowController(marioWindow: window)
68 | marioController.start()
69 | }
70 |
71 | func createApplicationWindow() {
72 | // Erstelle Mario Fenster und platziere es ueber alle anderen Fenster
73 | window = MarioWindow(
74 | contentRect: windowContentRect(), // Fensterposition
75 | styleMask: NSBorderlessWindowMask, // Keine Titlebar und Rand
76 | backing: NSBackingStoreType.Buffered,
77 | defer: true
78 | )
79 | window.level = Int(CGWindowLevelForKey(Int32(kCGMainMenuWindowLevelKey)+1))
80 | window.hasShadow = false
81 | window.opaque = false
82 | window.backgroundColor = NSColor(
83 | calibratedHue: 0,
84 | saturation: 1.0,
85 | brightness: 0,
86 | alpha: 0.0
87 | )
88 |
89 | // App kann auf allen Spaces gelaunched und angezeigt werden
90 | window.collectionBehavior = NSWindowCollectionBehavior.MoveToActiveSpace
91 |
92 | // Jegliche Maus-Events unterdruecken
93 | window.ignoresMouseEvents = true
94 |
95 | // Applikationsfenster nach vorne holen
96 | window.makeKeyAndOrderFront(self)
97 |
98 |
99 | // Erstellen eines Platzhalter Views und Zuweisung an das Window
100 | let contentView = NSView(frame: window.frame)
101 | window.contentView = contentView
102 | }
103 |
104 | func windowContentRect() -> CGRect {
105 | // Aufloesung abfragen
106 | let screenFrame = NSScreen.mainScreen()!.frame
107 |
108 | // Marios Dimensionen ermitteln
109 | let marioFrame = MarioWindowController.marioFrame
110 |
111 | // Bereich zum zeichnen festlegen
112 | let contentRect = CGRect(
113 | x: 0,
114 | y: screenFrame.height-marioFrame.height,
115 | width: screenFrame.size.width,
116 | height: marioFrame.height
117 | )
118 | return contentRect
119 | }
120 |
121 | func bringToFront() {
122 | window.orderFrontRegardless()
123 |
124 | // Recall each 15 minutes
125 | let delayTime = dispatch_time(DISPATCH_TIME_NOW,
126 | Int64((3600/4) * Double(NSEC_PER_SEC)))
127 | dispatch_after(delayTime, dispatch_get_main_queue()) {
128 | self.bringToFront()
129 | }
130 | }
131 |
132 | func applicationDidChangeScreenParameters(notification: NSNotification) {
133 | // Auf Display Veraenderungen reagieren
134 | updateWindowFrame()
135 | }
136 |
137 | func updateWindowFrame() {
138 | window.level = Int(CGWindowLevelForKey(Int32(kCGMainMenuWindowLevelKey)+1))
139 |
140 | // Fenster neu positionieren
141 | window.setFrame(windowContentRect(), display: true)
142 |
143 | // Marios animationen neu berechnen
144 | marioController.didChangeScreenParameters()
145 | }
146 |
147 | func didChangeWorkspace() {
148 | self.updateWindowFrame()
149 | window.orderFrontRegardless()
150 | }
151 | }
152 |
153 |
--------------------------------------------------------------------------------
/MarioMenuBarPref/Base.lproj/MarioMenuBarPref.xib:
--------------------------------------------------------------------------------
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 |
35 |
45 |
55 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 37102AF71B53EB4D00A684A5 /* MarioMenuBarPref.h in Headers */ = {isa = PBXBuildFile; fileRef = 37102AF61B53EB4D00A684A5 /* MarioMenuBarPref.h */; };
11 | 37102AF91B53EB4D00A684A5 /* MarioMenuBarPref.m in Sources */ = {isa = PBXBuildFile; fileRef = 37102AF81B53EB4D00A684A5 /* MarioMenuBarPref.m */; };
12 | 37102AFB1B53EB4D00A684A5 /* MarioMenuBarPref.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 37102AFA1B53EB4D00A684A5 /* MarioMenuBarPref.tiff */; };
13 | 37102AFE1B53EB4D00A684A5 /* MarioMenuBarPref.xib in Resources */ = {isa = PBXBuildFile; fileRef = 37102AFC1B53EB4D00A684A5 /* MarioMenuBarPref.xib */; };
14 | 37102B0A1B53F2BE00A684A5 /* SwiftBlogLogo.png in Resources */ = {isa = PBXBuildFile; fileRef = 37102B081B53F2BE00A684A5 /* SwiftBlogLogo.png */; };
15 | 37102B0B1B53F2BE00A684A5 /* SwiftBlogLogo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37102B091B53F2BE00A684A5 /* SwiftBlogLogo@2x.png */; };
16 | 37102B0F1B53F49F00A684A5 /* MarioPrefController.h in Headers */ = {isa = PBXBuildFile; fileRef = 37102B0D1B53F49F00A684A5 /* MarioPrefController.h */; };
17 | 37102B101B53F49F00A684A5 /* MarioPrefController.m in Sources */ = {isa = PBXBuildFile; fileRef = 37102B0E1B53F49F00A684A5 /* MarioPrefController.m */; };
18 | 37102B141B53F85300A684A5 /* mario_walking.png in Resources */ = {isa = PBXBuildFile; fileRef = 37102B121B53F85300A684A5 /* mario_walking.png */; };
19 | 37102B151B53F85300A684A5 /* mario_walking@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37102B131B53F85300A684A5 /* mario_walking@2x.png */; };
20 | 3730CC0C1B4D9B3800E8FDBB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3730CC0B1B4D9B3800E8FDBB /* AppDelegate.swift */; };
21 | 3730CC0E1B4D9B3800E8FDBB /* MarioController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3730CC0D1B4D9B3800E8FDBB /* MarioController.swift */; };
22 | 3730CC101B4D9B3800E8FDBB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3730CC0F1B4D9B3800E8FDBB /* Images.xcassets */; };
23 | 3730CC131B4D9B3900E8FDBB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3730CC111B4D9B3900E8FDBB /* Main.storyboard */; };
24 | 3730CC1F1B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3730CC1E1B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.swift */; };
25 | 379B84991B5285190027B0F8 /* Readme.md in Sources */ = {isa = PBXBuildFile; fileRef = 379B84981B5285190027B0F8 /* Readme.md */; };
26 | 37C946181B5446E800EF0586 /* Schwammerl.icns in Resources */ = {isa = PBXBuildFile; fileRef = 37C946171B5446E800EF0586 /* Schwammerl.icns */; };
27 | /* End PBXBuildFile section */
28 |
29 | /* Begin PBXContainerItemProxy section */
30 | 3730CC191B4D9B3900E8FDBB /* PBXContainerItemProxy */ = {
31 | isa = PBXContainerItemProxy;
32 | containerPortal = 3730CBFE1B4D9B3800E8FDBB /* Project object */;
33 | proxyType = 1;
34 | remoteGlobalIDString = 3730CC051B4D9B3800E8FDBB;
35 | remoteInfo = MarioMeetsMenuBar;
36 | };
37 | /* End PBXContainerItemProxy section */
38 |
39 | /* Begin PBXFileReference section */
40 | 37102AF21B53EB4D00A684A5 /* MarioMenuBarPref.prefPane */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MarioMenuBarPref.prefPane; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 37102AF51B53EB4D00A684A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
42 | 37102AF61B53EB4D00A684A5 /* MarioMenuBarPref.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MarioMenuBarPref.h; sourceTree = ""; };
43 | 37102AF81B53EB4D00A684A5 /* MarioMenuBarPref.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MarioMenuBarPref.m; sourceTree = ""; };
44 | 37102AFA1B53EB4D00A684A5 /* MarioMenuBarPref.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = MarioMenuBarPref.tiff; sourceTree = ""; };
45 | 37102AFD1B53EB4D00A684A5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MarioMenuBarPref.xib; sourceTree = ""; };
46 | 37102B081B53F2BE00A684A5 /* SwiftBlogLogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SwiftBlogLogo.png; sourceTree = ""; };
47 | 37102B091B53F2BE00A684A5 /* SwiftBlogLogo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "SwiftBlogLogo@2x.png"; sourceTree = ""; };
48 | 37102B0D1B53F49F00A684A5 /* MarioPrefController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarioPrefController.h; sourceTree = ""; };
49 | 37102B0E1B53F49F00A684A5 /* MarioPrefController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MarioPrefController.m; sourceTree = ""; };
50 | 37102B121B53F85300A684A5 /* mario_walking.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mario_walking.png; sourceTree = ""; };
51 | 37102B131B53F85300A684A5 /* mario_walking@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "mario_walking@2x.png"; sourceTree = ""; };
52 | 3730CC061B4D9B3800E8FDBB /* MarioMeetsMenuBar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MarioMeetsMenuBar.app; sourceTree = BUILT_PRODUCTS_DIR; };
53 | 3730CC0A1B4D9B3800E8FDBB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
54 | 3730CC0B1B4D9B3800E8FDBB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
55 | 3730CC0D1B4D9B3800E8FDBB /* MarioController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarioController.swift; sourceTree = ""; };
56 | 3730CC0F1B4D9B3800E8FDBB /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
57 | 3730CC121B4D9B3900E8FDBB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
58 | 3730CC181B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MarioMeetsMenuBarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
59 | 3730CC1D1B4D9B3900E8FDBB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
60 | 3730CC1E1B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarioMeetsMenuBarTests.swift; sourceTree = ""; };
61 | 3730CC571B4F1A5D00E8FDBB /* MarioMeetsMenuBar-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MarioMeetsMenuBar-Bridging-Header.h"; sourceTree = ""; };
62 | 379B84981B5285190027B0F8 /* Readme.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Readme.md; sourceTree = SOURCE_ROOT; };
63 | 37C946171B5446E800EF0586 /* Schwammerl.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Schwammerl.icns; sourceTree = ""; };
64 | /* End PBXFileReference section */
65 |
66 | /* Begin PBXFrameworksBuildPhase section */
67 | 37102AEE1B53EB4D00A684A5 /* Frameworks */ = {
68 | isa = PBXFrameworksBuildPhase;
69 | buildActionMask = 2147483647;
70 | files = (
71 | );
72 | runOnlyForDeploymentPostprocessing = 0;
73 | };
74 | 3730CC031B4D9B3800E8FDBB /* Frameworks */ = {
75 | isa = PBXFrameworksBuildPhase;
76 | buildActionMask = 2147483647;
77 | files = (
78 | );
79 | runOnlyForDeploymentPostprocessing = 0;
80 | };
81 | 3730CC151B4D9B3900E8FDBB /* Frameworks */ = {
82 | isa = PBXFrameworksBuildPhase;
83 | buildActionMask = 2147483647;
84 | files = (
85 | );
86 | runOnlyForDeploymentPostprocessing = 0;
87 | };
88 | /* End PBXFrameworksBuildPhase section */
89 |
90 | /* Begin PBXGroup section */
91 | 37102AF31B53EB4D00A684A5 /* MarioMenuBarPref */ = {
92 | isa = PBXGroup;
93 | children = (
94 | 37102B111B53F4A200A684A5 /* Controller */,
95 | 37102AF61B53EB4D00A684A5 /* MarioMenuBarPref.h */,
96 | 37102AF81B53EB4D00A684A5 /* MarioMenuBarPref.m */,
97 | 37102AFA1B53EB4D00A684A5 /* MarioMenuBarPref.tiff */,
98 | 37102AFC1B53EB4D00A684A5 /* MarioMenuBarPref.xib */,
99 | 37102B0C1B53F2C100A684A5 /* Resourcen */,
100 | 37102AF41B53EB4D00A684A5 /* Supporting Files */,
101 | );
102 | path = MarioMenuBarPref;
103 | sourceTree = "";
104 | };
105 | 37102AF41B53EB4D00A684A5 /* Supporting Files */ = {
106 | isa = PBXGroup;
107 | children = (
108 | 37102AF51B53EB4D00A684A5 /* Info.plist */,
109 | );
110 | name = "Supporting Files";
111 | sourceTree = "";
112 | };
113 | 37102B0C1B53F2C100A684A5 /* Resourcen */ = {
114 | isa = PBXGroup;
115 | children = (
116 | 37C946171B5446E800EF0586 /* Schwammerl.icns */,
117 | 37102B121B53F85300A684A5 /* mario_walking.png */,
118 | 37102B131B53F85300A684A5 /* mario_walking@2x.png */,
119 | 37102B081B53F2BE00A684A5 /* SwiftBlogLogo.png */,
120 | 37102B091B53F2BE00A684A5 /* SwiftBlogLogo@2x.png */,
121 | );
122 | name = Resourcen;
123 | sourceTree = "";
124 | };
125 | 37102B111B53F4A200A684A5 /* Controller */ = {
126 | isa = PBXGroup;
127 | children = (
128 | 37102B0D1B53F49F00A684A5 /* MarioPrefController.h */,
129 | 37102B0E1B53F49F00A684A5 /* MarioPrefController.m */,
130 | );
131 | name = Controller;
132 | sourceTree = "";
133 | };
134 | 3730CBFD1B4D9B3800E8FDBB = {
135 | isa = PBXGroup;
136 | children = (
137 | 3730CC081B4D9B3800E8FDBB /* MarioMeetsMenuBar */,
138 | 3730CC1B1B4D9B3900E8FDBB /* MarioMeetsMenuBarTests */,
139 | 37102AF31B53EB4D00A684A5 /* MarioMenuBarPref */,
140 | 3730CC071B4D9B3800E8FDBB /* Products */,
141 | );
142 | sourceTree = "";
143 | };
144 | 3730CC071B4D9B3800E8FDBB /* Products */ = {
145 | isa = PBXGroup;
146 | children = (
147 | 3730CC061B4D9B3800E8FDBB /* MarioMeetsMenuBar.app */,
148 | 3730CC181B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.xctest */,
149 | 37102AF21B53EB4D00A684A5 /* MarioMenuBarPref.prefPane */,
150 | );
151 | name = Products;
152 | sourceTree = "";
153 | };
154 | 3730CC081B4D9B3800E8FDBB /* MarioMeetsMenuBar */ = {
155 | isa = PBXGroup;
156 | children = (
157 | 3730CC0B1B4D9B3800E8FDBB /* AppDelegate.swift */,
158 | 3730CC0D1B4D9B3800E8FDBB /* MarioController.swift */,
159 | 3730CC0F1B4D9B3800E8FDBB /* Images.xcassets */,
160 | 3730CC111B4D9B3900E8FDBB /* Main.storyboard */,
161 | 3730CC5B1B4F1AB300E8FDBB /* Objective-C */,
162 | 3730CC091B4D9B3800E8FDBB /* Supporting Files */,
163 | 379B84981B5285190027B0F8 /* Readme.md */,
164 | );
165 | path = MarioMeetsMenuBar;
166 | sourceTree = "";
167 | };
168 | 3730CC091B4D9B3800E8FDBB /* Supporting Files */ = {
169 | isa = PBXGroup;
170 | children = (
171 | 3730CC0A1B4D9B3800E8FDBB /* Info.plist */,
172 | );
173 | name = "Supporting Files";
174 | sourceTree = "";
175 | };
176 | 3730CC1B1B4D9B3900E8FDBB /* MarioMeetsMenuBarTests */ = {
177 | isa = PBXGroup;
178 | children = (
179 | 3730CC1E1B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.swift */,
180 | 3730CC1C1B4D9B3900E8FDBB /* Supporting Files */,
181 | );
182 | path = MarioMeetsMenuBarTests;
183 | sourceTree = "";
184 | };
185 | 3730CC1C1B4D9B3900E8FDBB /* Supporting Files */ = {
186 | isa = PBXGroup;
187 | children = (
188 | 3730CC1D1B4D9B3900E8FDBB /* Info.plist */,
189 | );
190 | name = "Supporting Files";
191 | sourceTree = "";
192 | };
193 | 3730CC5B1B4F1AB300E8FDBB /* Objective-C */ = {
194 | isa = PBXGroup;
195 | children = (
196 | 3730CC571B4F1A5D00E8FDBB /* MarioMeetsMenuBar-Bridging-Header.h */,
197 | );
198 | name = "Objective-C";
199 | sourceTree = "";
200 | };
201 | /* End PBXGroup section */
202 |
203 | /* Begin PBXHeadersBuildPhase section */
204 | 37102AEF1B53EB4D00A684A5 /* Headers */ = {
205 | isa = PBXHeadersBuildPhase;
206 | buildActionMask = 2147483647;
207 | files = (
208 | 37102B0F1B53F49F00A684A5 /* MarioPrefController.h in Headers */,
209 | 37102AF71B53EB4D00A684A5 /* MarioMenuBarPref.h in Headers */,
210 | );
211 | runOnlyForDeploymentPostprocessing = 0;
212 | };
213 | /* End PBXHeadersBuildPhase section */
214 |
215 | /* Begin PBXNativeTarget section */
216 | 37102AF11B53EB4D00A684A5 /* MarioMenuBarPref */ = {
217 | isa = PBXNativeTarget;
218 | buildConfigurationList = 37102B011B53EB4D00A684A5 /* Build configuration list for PBXNativeTarget "MarioMenuBarPref" */;
219 | buildPhases = (
220 | 37102AED1B53EB4D00A684A5 /* Sources */,
221 | 37102AEE1B53EB4D00A684A5 /* Frameworks */,
222 | 37102AEF1B53EB4D00A684A5 /* Headers */,
223 | 37102AF01B53EB4D00A684A5 /* Resources */,
224 | );
225 | buildRules = (
226 | );
227 | dependencies = (
228 | );
229 | name = MarioMenuBarPref;
230 | productName = MarioMenuBarPref;
231 | productReference = 37102AF21B53EB4D00A684A5 /* MarioMenuBarPref.prefPane */;
232 | productType = "com.apple.product-type.bundle";
233 | };
234 | 3730CC051B4D9B3800E8FDBB /* MarioMeetsMenuBar */ = {
235 | isa = PBXNativeTarget;
236 | buildConfigurationList = 3730CC221B4D9B3900E8FDBB /* Build configuration list for PBXNativeTarget "MarioMeetsMenuBar" */;
237 | buildPhases = (
238 | 3730CC021B4D9B3800E8FDBB /* Sources */,
239 | 3730CC031B4D9B3800E8FDBB /* Frameworks */,
240 | 3730CC041B4D9B3800E8FDBB /* Resources */,
241 | );
242 | buildRules = (
243 | );
244 | dependencies = (
245 | );
246 | name = MarioMeetsMenuBar;
247 | productName = MarioMeetsMenuBar;
248 | productReference = 3730CC061B4D9B3800E8FDBB /* MarioMeetsMenuBar.app */;
249 | productType = "com.apple.product-type.application";
250 | };
251 | 3730CC171B4D9B3900E8FDBB /* MarioMeetsMenuBarTests */ = {
252 | isa = PBXNativeTarget;
253 | buildConfigurationList = 3730CC251B4D9B3900E8FDBB /* Build configuration list for PBXNativeTarget "MarioMeetsMenuBarTests" */;
254 | buildPhases = (
255 | 3730CC141B4D9B3900E8FDBB /* Sources */,
256 | 3730CC151B4D9B3900E8FDBB /* Frameworks */,
257 | 3730CC161B4D9B3900E8FDBB /* Resources */,
258 | );
259 | buildRules = (
260 | );
261 | dependencies = (
262 | 3730CC1A1B4D9B3900E8FDBB /* PBXTargetDependency */,
263 | );
264 | name = MarioMeetsMenuBarTests;
265 | productName = MarioMeetsMenuBarTests;
266 | productReference = 3730CC181B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.xctest */;
267 | productType = "com.apple.product-type.bundle.unit-test";
268 | };
269 | /* End PBXNativeTarget section */
270 |
271 | /* Begin PBXProject section */
272 | 3730CBFE1B4D9B3800E8FDBB /* Project object */ = {
273 | isa = PBXProject;
274 | attributes = {
275 | LastUpgradeCheck = 0640;
276 | ORGANIZATIONNAME = SwiftBlog;
277 | TargetAttributes = {
278 | 37102AF11B53EB4D00A684A5 = {
279 | CreatedOnToolsVersion = 6.4;
280 | };
281 | 3730CC051B4D9B3800E8FDBB = {
282 | CreatedOnToolsVersion = 6.4;
283 | };
284 | 3730CC171B4D9B3900E8FDBB = {
285 | CreatedOnToolsVersion = 6.4;
286 | TestTargetID = 3730CC051B4D9B3800E8FDBB;
287 | };
288 | };
289 | };
290 | buildConfigurationList = 3730CC011B4D9B3800E8FDBB /* Build configuration list for PBXProject "MarioMeetsMenuBar" */;
291 | compatibilityVersion = "Xcode 3.2";
292 | developmentRegion = English;
293 | hasScannedForEncodings = 0;
294 | knownRegions = (
295 | en,
296 | Base,
297 | );
298 | mainGroup = 3730CBFD1B4D9B3800E8FDBB;
299 | productRefGroup = 3730CC071B4D9B3800E8FDBB /* Products */;
300 | projectDirPath = "";
301 | projectRoot = "";
302 | targets = (
303 | 3730CC051B4D9B3800E8FDBB /* MarioMeetsMenuBar */,
304 | 3730CC171B4D9B3900E8FDBB /* MarioMeetsMenuBarTests */,
305 | 37102AF11B53EB4D00A684A5 /* MarioMenuBarPref */,
306 | );
307 | };
308 | /* End PBXProject section */
309 |
310 | /* Begin PBXResourcesBuildPhase section */
311 | 37102AF01B53EB4D00A684A5 /* Resources */ = {
312 | isa = PBXResourcesBuildPhase;
313 | buildActionMask = 2147483647;
314 | files = (
315 | 37102AFE1B53EB4D00A684A5 /* MarioMenuBarPref.xib in Resources */,
316 | 37102B151B53F85300A684A5 /* mario_walking@2x.png in Resources */,
317 | 37102AFB1B53EB4D00A684A5 /* MarioMenuBarPref.tiff in Resources */,
318 | 37102B0A1B53F2BE00A684A5 /* SwiftBlogLogo.png in Resources */,
319 | 37102B141B53F85300A684A5 /* mario_walking.png in Resources */,
320 | 37102B0B1B53F2BE00A684A5 /* SwiftBlogLogo@2x.png in Resources */,
321 | 37C946181B5446E800EF0586 /* Schwammerl.icns in Resources */,
322 | );
323 | runOnlyForDeploymentPostprocessing = 0;
324 | };
325 | 3730CC041B4D9B3800E8FDBB /* Resources */ = {
326 | isa = PBXResourcesBuildPhase;
327 | buildActionMask = 2147483647;
328 | files = (
329 | 3730CC101B4D9B3800E8FDBB /* Images.xcassets in Resources */,
330 | 3730CC131B4D9B3900E8FDBB /* Main.storyboard in Resources */,
331 | );
332 | runOnlyForDeploymentPostprocessing = 0;
333 | };
334 | 3730CC161B4D9B3900E8FDBB /* Resources */ = {
335 | isa = PBXResourcesBuildPhase;
336 | buildActionMask = 2147483647;
337 | files = (
338 | );
339 | runOnlyForDeploymentPostprocessing = 0;
340 | };
341 | /* End PBXResourcesBuildPhase section */
342 |
343 | /* Begin PBXSourcesBuildPhase section */
344 | 37102AED1B53EB4D00A684A5 /* Sources */ = {
345 | isa = PBXSourcesBuildPhase;
346 | buildActionMask = 2147483647;
347 | files = (
348 | 37102AF91B53EB4D00A684A5 /* MarioMenuBarPref.m in Sources */,
349 | 37102B101B53F49F00A684A5 /* MarioPrefController.m in Sources */,
350 | );
351 | runOnlyForDeploymentPostprocessing = 0;
352 | };
353 | 3730CC021B4D9B3800E8FDBB /* Sources */ = {
354 | isa = PBXSourcesBuildPhase;
355 | buildActionMask = 2147483647;
356 | files = (
357 | 3730CC0E1B4D9B3800E8FDBB /* MarioController.swift in Sources */,
358 | 3730CC0C1B4D9B3800E8FDBB /* AppDelegate.swift in Sources */,
359 | 379B84991B5285190027B0F8 /* Readme.md in Sources */,
360 | );
361 | runOnlyForDeploymentPostprocessing = 0;
362 | };
363 | 3730CC141B4D9B3900E8FDBB /* Sources */ = {
364 | isa = PBXSourcesBuildPhase;
365 | buildActionMask = 2147483647;
366 | files = (
367 | 3730CC1F1B4D9B3900E8FDBB /* MarioMeetsMenuBarTests.swift in Sources */,
368 | );
369 | runOnlyForDeploymentPostprocessing = 0;
370 | };
371 | /* End PBXSourcesBuildPhase section */
372 |
373 | /* Begin PBXTargetDependency section */
374 | 3730CC1A1B4D9B3900E8FDBB /* PBXTargetDependency */ = {
375 | isa = PBXTargetDependency;
376 | target = 3730CC051B4D9B3800E8FDBB /* MarioMeetsMenuBar */;
377 | targetProxy = 3730CC191B4D9B3900E8FDBB /* PBXContainerItemProxy */;
378 | };
379 | /* End PBXTargetDependency section */
380 |
381 | /* Begin PBXVariantGroup section */
382 | 37102AFC1B53EB4D00A684A5 /* MarioMenuBarPref.xib */ = {
383 | isa = PBXVariantGroup;
384 | children = (
385 | 37102AFD1B53EB4D00A684A5 /* Base */,
386 | );
387 | name = MarioMenuBarPref.xib;
388 | sourceTree = "";
389 | };
390 | 3730CC111B4D9B3900E8FDBB /* Main.storyboard */ = {
391 | isa = PBXVariantGroup;
392 | children = (
393 | 3730CC121B4D9B3900E8FDBB /* Base */,
394 | );
395 | name = Main.storyboard;
396 | sourceTree = "";
397 | };
398 | /* End PBXVariantGroup section */
399 |
400 | /* Begin XCBuildConfiguration section */
401 | 37102AFF1B53EB4D00A684A5 /* Debug */ = {
402 | isa = XCBuildConfiguration;
403 | buildSettings = {
404 | COMBINE_HIDPI_IMAGES = YES;
405 | GCC_PREPROCESSOR_DEFINITIONS = (
406 | "DEBUG=1",
407 | "$(inherited)",
408 | );
409 | INFOPLIST_FILE = MarioMenuBarPref/Info.plist;
410 | INSTALL_PATH = "$(HOME)/Library/PreferencePanes";
411 | MACOSX_DEPLOYMENT_TARGET = 10.9;
412 | PRODUCT_NAME = "$(TARGET_NAME)";
413 | SDKROOT = macosx10.9;
414 | WRAPPER_EXTENSION = prefPane;
415 | };
416 | name = Debug;
417 | };
418 | 37102B001B53EB4D00A684A5 /* Release */ = {
419 | isa = XCBuildConfiguration;
420 | buildSettings = {
421 | COMBINE_HIDPI_IMAGES = YES;
422 | INFOPLIST_FILE = MarioMenuBarPref/Info.plist;
423 | INSTALL_PATH = "$(HOME)/Library/PreferencePanes";
424 | MACOSX_DEPLOYMENT_TARGET = 10.9;
425 | PRODUCT_NAME = "$(TARGET_NAME)";
426 | SDKROOT = macosx10.9;
427 | WRAPPER_EXTENSION = prefPane;
428 | };
429 | name = Release;
430 | };
431 | 3730CC201B4D9B3900E8FDBB /* Debug */ = {
432 | isa = XCBuildConfiguration;
433 | buildSettings = {
434 | ALWAYS_SEARCH_USER_PATHS = NO;
435 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
436 | CLANG_CXX_LIBRARY = "libc++";
437 | CLANG_ENABLE_MODULES = YES;
438 | CLANG_ENABLE_OBJC_ARC = YES;
439 | CLANG_WARN_BOOL_CONVERSION = YES;
440 | CLANG_WARN_CONSTANT_CONVERSION = YES;
441 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
442 | CLANG_WARN_EMPTY_BODY = YES;
443 | CLANG_WARN_ENUM_CONVERSION = YES;
444 | CLANG_WARN_INT_CONVERSION = YES;
445 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
446 | CLANG_WARN_UNREACHABLE_CODE = YES;
447 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
448 | CODE_SIGN_IDENTITY = "-";
449 | COPY_PHASE_STRIP = NO;
450 | DEBUG_INFORMATION_FORMAT = dwarf;
451 | ENABLE_STRICT_OBJC_MSGSEND = YES;
452 | GCC_C_LANGUAGE_STANDARD = gnu99;
453 | GCC_DYNAMIC_NO_PIC = NO;
454 | GCC_NO_COMMON_BLOCKS = YES;
455 | GCC_OPTIMIZATION_LEVEL = 0;
456 | GCC_PREPROCESSOR_DEFINITIONS = (
457 | "DEBUG=1",
458 | "$(inherited)",
459 | );
460 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
461 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
462 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
463 | GCC_WARN_UNDECLARED_SELECTOR = YES;
464 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
465 | GCC_WARN_UNUSED_FUNCTION = YES;
466 | GCC_WARN_UNUSED_VARIABLE = YES;
467 | MACOSX_DEPLOYMENT_TARGET = 10.9;
468 | MTL_ENABLE_DEBUG_INFO = YES;
469 | ONLY_ACTIVE_ARCH = YES;
470 | SDKROOT = macosx;
471 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
472 | };
473 | name = Debug;
474 | };
475 | 3730CC211B4D9B3900E8FDBB /* Release */ = {
476 | isa = XCBuildConfiguration;
477 | buildSettings = {
478 | ALWAYS_SEARCH_USER_PATHS = NO;
479 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
480 | CLANG_CXX_LIBRARY = "libc++";
481 | CLANG_ENABLE_MODULES = YES;
482 | CLANG_ENABLE_OBJC_ARC = YES;
483 | CLANG_WARN_BOOL_CONVERSION = YES;
484 | CLANG_WARN_CONSTANT_CONVERSION = YES;
485 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
486 | CLANG_WARN_EMPTY_BODY = YES;
487 | CLANG_WARN_ENUM_CONVERSION = YES;
488 | CLANG_WARN_INT_CONVERSION = YES;
489 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
490 | CLANG_WARN_UNREACHABLE_CODE = YES;
491 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
492 | CODE_SIGN_IDENTITY = "-";
493 | COPY_PHASE_STRIP = NO;
494 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
495 | ENABLE_NS_ASSERTIONS = NO;
496 | ENABLE_STRICT_OBJC_MSGSEND = YES;
497 | GCC_C_LANGUAGE_STANDARD = gnu99;
498 | GCC_NO_COMMON_BLOCKS = YES;
499 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
500 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
501 | GCC_WARN_UNDECLARED_SELECTOR = YES;
502 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
503 | GCC_WARN_UNUSED_FUNCTION = YES;
504 | GCC_WARN_UNUSED_VARIABLE = YES;
505 | MACOSX_DEPLOYMENT_TARGET = 10.9;
506 | MTL_ENABLE_DEBUG_INFO = NO;
507 | SDKROOT = macosx;
508 | };
509 | name = Release;
510 | };
511 | 3730CC231B4D9B3900E8FDBB /* Debug */ = {
512 | isa = XCBuildConfiguration;
513 | buildSettings = {
514 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
515 | CLANG_ENABLE_MODULES = YES;
516 | COMBINE_HIDPI_IMAGES = YES;
517 | INFOPLIST_FILE = MarioMeetsMenuBar/Info.plist;
518 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
519 | MACOSX_DEPLOYMENT_TARGET = 10.9;
520 | PRODUCT_NAME = "$(TARGET_NAME)";
521 | SDKROOT = macosx10.10;
522 | SWIFT_OBJC_BRIDGING_HEADER = "MarioMeetsMenuBar/MarioMeetsMenuBar-Bridging-Header.h";
523 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
524 | };
525 | name = Debug;
526 | };
527 | 3730CC241B4D9B3900E8FDBB /* Release */ = {
528 | isa = XCBuildConfiguration;
529 | buildSettings = {
530 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
531 | CLANG_ENABLE_MODULES = YES;
532 | COMBINE_HIDPI_IMAGES = YES;
533 | INFOPLIST_FILE = MarioMeetsMenuBar/Info.plist;
534 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
535 | MACOSX_DEPLOYMENT_TARGET = 10.9;
536 | PRODUCT_NAME = "$(TARGET_NAME)";
537 | SDKROOT = macosx10.10;
538 | SWIFT_OBJC_BRIDGING_HEADER = "MarioMeetsMenuBar/MarioMeetsMenuBar-Bridging-Header.h";
539 | };
540 | name = Release;
541 | };
542 | 3730CC261B4D9B3900E8FDBB /* Debug */ = {
543 | isa = XCBuildConfiguration;
544 | buildSettings = {
545 | BUNDLE_LOADER = "$(TEST_HOST)";
546 | COMBINE_HIDPI_IMAGES = YES;
547 | FRAMEWORK_SEARCH_PATHS = (
548 | "$(DEVELOPER_FRAMEWORKS_DIR)",
549 | "$(inherited)",
550 | );
551 | GCC_PREPROCESSOR_DEFINITIONS = (
552 | "DEBUG=1",
553 | "$(inherited)",
554 | );
555 | INFOPLIST_FILE = MarioMeetsMenuBarTests/Info.plist;
556 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
557 | PRODUCT_NAME = "$(TARGET_NAME)";
558 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MarioMeetsMenuBar.app/Contents/MacOS/MarioMeetsMenuBar";
559 | };
560 | name = Debug;
561 | };
562 | 3730CC271B4D9B3900E8FDBB /* Release */ = {
563 | isa = XCBuildConfiguration;
564 | buildSettings = {
565 | BUNDLE_LOADER = "$(TEST_HOST)";
566 | COMBINE_HIDPI_IMAGES = YES;
567 | FRAMEWORK_SEARCH_PATHS = (
568 | "$(DEVELOPER_FRAMEWORKS_DIR)",
569 | "$(inherited)",
570 | );
571 | INFOPLIST_FILE = MarioMeetsMenuBarTests/Info.plist;
572 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
573 | PRODUCT_NAME = "$(TARGET_NAME)";
574 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MarioMeetsMenuBar.app/Contents/MacOS/MarioMeetsMenuBar";
575 | };
576 | name = Release;
577 | };
578 | /* End XCBuildConfiguration section */
579 |
580 | /* Begin XCConfigurationList section */
581 | 37102B011B53EB4D00A684A5 /* Build configuration list for PBXNativeTarget "MarioMenuBarPref" */ = {
582 | isa = XCConfigurationList;
583 | buildConfigurations = (
584 | 37102AFF1B53EB4D00A684A5 /* Debug */,
585 | 37102B001B53EB4D00A684A5 /* Release */,
586 | );
587 | defaultConfigurationIsVisible = 0;
588 | defaultConfigurationName = Release;
589 | };
590 | 3730CC011B4D9B3800E8FDBB /* Build configuration list for PBXProject "MarioMeetsMenuBar" */ = {
591 | isa = XCConfigurationList;
592 | buildConfigurations = (
593 | 3730CC201B4D9B3900E8FDBB /* Debug */,
594 | 3730CC211B4D9B3900E8FDBB /* Release */,
595 | );
596 | defaultConfigurationIsVisible = 0;
597 | defaultConfigurationName = Release;
598 | };
599 | 3730CC221B4D9B3900E8FDBB /* Build configuration list for PBXNativeTarget "MarioMeetsMenuBar" */ = {
600 | isa = XCConfigurationList;
601 | buildConfigurations = (
602 | 3730CC231B4D9B3900E8FDBB /* Debug */,
603 | 3730CC241B4D9B3900E8FDBB /* Release */,
604 | );
605 | defaultConfigurationIsVisible = 0;
606 | defaultConfigurationName = Release;
607 | };
608 | 3730CC251B4D9B3900E8FDBB /* Build configuration list for PBXNativeTarget "MarioMeetsMenuBarTests" */ = {
609 | isa = XCConfigurationList;
610 | buildConfigurations = (
611 | 3730CC261B4D9B3900E8FDBB /* Debug */,
612 | 3730CC271B4D9B3900E8FDBB /* Release */,
613 | );
614 | defaultConfigurationIsVisible = 0;
615 | defaultConfigurationName = Release;
616 | };
617 | /* End XCConfigurationList section */
618 | };
619 | rootObject = 3730CBFE1B4D9B3800E8FDBB /* Project object */;
620 | }
621 |
--------------------------------------------------------------------------------
/MarioMeetsMenuBar/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
--------------------------------------------------------------------------------