├── 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.MarioMenuBarPref901uninstall.xmlpostinstallActions.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 | ![MarioMeetsMenuBar](https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/master/Screenshots/mario_walking.png "MarioMeetsMenuBar") 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 | ![MarioMeetsMenuBar](https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/master/Screenshots/app_preview.gif "MarioMeetsMenuBar") 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 | ![MarioMeetsMenuBar](https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/master/Screenshots/mario_system_settings.png "MarioMeetsMenuBar settings") 40 | 41 | ![MarioMeetsMenuBar](https://raw.githubusercontent.com/SwiftBlogDe/MarioMeetsMenuBar/master/Screenshots/mario_preferences.png "MarioMeetsMenuBar settings pref") 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.xml02mariomenubarpref.xml03launch.xmlproperties.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 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | Default 512 | 513 | 514 | 515 | 516 | 517 | 518 | Left to Right 519 | 520 | 521 | 522 | 523 | 524 | 525 | Right to Left 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | Default 537 | 538 | 539 | 540 | 541 | 542 | 543 | Left to Right 544 | 545 | 546 | 547 | 548 | 549 | 550 | Right to Left 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | --------------------------------------------------------------------------------